brainy/examples/conduitAugmentationExample.js

237 lines
7.4 KiB
JavaScript
Raw Normal View History

/**
* Conduit Augmentation Example
*
* This example demonstrates how to use the conduit augmentations to sync Brainy instances:
*
* - WebSocket Conduit: For syncing between browsers and servers, or between servers.
* WebSockets cannot be used for direct browser-to-browser communication without a server in the middle.
*
* - WebRTC Conduit: For direct peer-to-peer syncing between browsers.
* This is the recommended approach for browser-to-browser communication.
*/
import {
BrainyData,
augmentationPipeline,
createConduitAugmentation,
NounType,
VerbType
} from '@soulcraft/brainy';
/**
* Example of using WebSocket conduit augmentation to sync Brainy instances
*/
async function webSocketSyncExample() {
console.log('Starting WebSocket sync example...');
// Create and initialize the database
const db = new BrainyData();
await db.init();
// Create a WebSocket conduit augmentation
const wsConduit = await createConduitAugmentation('websocket', 'websocket-sync-example');
// Register the augmentation with the pipeline
augmentationPipeline.register(wsConduit);
// Add some data to the local database
const catId = await db.add("Cats are independent pets", {
noun: NounType.Thing,
category: 'animal'
});
const dogId = await db.add("Dogs are loyal companions", {
noun: NounType.Thing,
category: 'animal'
});
// Add a relationship between items
await db.addVerb(catId, dogId, undefined, {
type: VerbType.RelatedTo,
metadata: {
description: 'Both are common household pets'
}
});
console.log('Added sample data to local database');
try {
// Connect to another Brainy instance (server or browser)
// Note: You need to have a WebSocket server running at this URL
const connectionResult = await augmentationPipeline.executeConduitPipeline(
'establishConnection',
['wss://your-websocket-server.com/brainy-sync', { protocols: 'brainy-sync' }]
);
if (connectionResult[0] && (await connectionResult[0]).success) {
const connection = (await connectionResult[0]).data;
console.log('Connected to remote Brainy instance:', connection.url);
// Read data from the remote instance
const readResult = await augmentationPipeline.executeConduitPipeline(
'readData',
[{ connectionId: connection.connectionId, query: { type: 'getAllNouns' } }]
);
// Process and add the received data to the local instance
if (readResult[0] && (await readResult[0]).success) {
const remoteNouns = (await readResult[0]).data;
console.log(`Received ${remoteNouns.length} nouns from remote instance`);
for (const noun of remoteNouns) {
await db.add(noun.vector, noun.metadata);
}
console.log('Added remote nouns to local database');
}
// Set up real-time sync by monitoring the stream
await wsConduit.monitorStream(connection.connectionId, async (data) => {
console.log('Received data from stream:', data.type);
// Handle incoming data (e.g., new nouns, verbs, updates)
if (data.type === 'newNoun') {
await db.add(data.vector, data.metadata);
console.log('Added new noun from remote instance:', data.id);
} else if (data.type === 'newVerb') {
await db.addVerb(data.sourceId, data.targetId, data.vector, data.options);
console.log('Added new verb from remote instance:', data.id);
}
});
// Add a new noun and send it to the remote instance
const birdId = await db.add("Birds are fascinating creatures", {
noun: NounType.Thing,
category: 'animal'
});
const birdData = await db.get(birdId);
// Send the new noun to the remote instance
await augmentationPipeline.executeConduitPipeline(
'writeData',
[
{
connectionId: connection.connectionId,
data: {
type: 'newNoun',
id: birdId,
vector: birdData.vector,
metadata: birdData.metadata
}
}
]
);
console.log('Sent new noun to remote instance:', birdId);
// Close the connection when done
await wsConduit.closeWebSocket(connection.connectionId);
console.log('Closed connection to remote instance');
} else {
console.error('Failed to connect to remote instance');
}
} catch (error) {
console.error('Error in WebSocket sync example:', error);
}
}
/**
* Example of using WebRTC conduit augmentation for peer-to-peer sync
*/
async function webRTCSyncExample() {
console.log('Starting WebRTC sync example...');
// Create and initialize the database
const db = new BrainyData();
await db.init();
// Create a WebRTC conduit augmentation
const webrtcConduit = await createConduitAugmentation('webrtc', 'webrtc-sync-example');
// Register the augmentation with the pipeline
augmentationPipeline.register(webrtcConduit);
try {
// Connect to a peer using a signaling server
// Note: You need to have a signaling server running and another peer to connect to
const connectionResult = await augmentationPipeline.executeConduitPipeline(
'establishConnection',
[
'peer-id-to-connect-to',
{
signalServerUrl: 'wss://your-signal-server.com',
localPeerId: 'my-peer-id',
iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]
}
]
);
if (connectionResult[0] && (await connectionResult[0]).success) {
const connection = (await connectionResult[0]).data;
console.log('Connected to peer:', connection.url);
// Set up real-time sync by monitoring the stream
await webrtcConduit.monitorStream(connection.connectionId, async (data) => {
console.log('Received data from peer:', data.type);
// Handle incoming data (e.g., new nouns, verbs, updates)
if (data.type === 'newNoun') {
await db.add(data.vector, data.metadata);
console.log('Added new noun from peer:', data.id);
} else if (data.type === 'newVerb') {
await db.addVerb(data.sourceId, data.targetId, data.vector, data.options);
console.log('Added new verb from peer:', data.id);
}
});
// Add a new noun and send it to the peer
const fishId = await db.add("Fish are aquatic animals", {
noun: NounType.Thing,
category: 'animal'
});
const fishData = await db.get(fishId);
// Send the new noun to the peer
await augmentationPipeline.executeConduitPipeline(
'writeData',
[
{
connectionId: connection.connectionId,
data: {
type: 'newNoun',
id: fishId,
vector: fishData.vector,
metadata: fishData.metadata
}
}
]
);
console.log('Sent new noun to peer:', fishId);
// Close the connection when done
await webrtcConduit.closeWebSocket(connection.connectionId);
console.log('Closed connection to peer');
} else {
console.error('Failed to connect to peer');
}
} catch (error) {
console.error('Error in WebRTC sync example:', error);
}
}
// Run the examples
async function runExamples() {
try {
await webSocketSyncExample();
console.log('\n-----------------------------------\n');
await webRTCSyncExample();
} catch (error) {
console.error('Error running examples:', error);
}
}
runExamples();