Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 590edcf00f |
@@ -0,0 +1,8 @@
|
||||
// Indexdb abstraction that stores (and updates) objects in a pool and allows for live retrieval for the view layer.
|
||||
|
||||
|
||||
/* We should have different databases for different entities.
|
||||
* Then the view layer can use live queries
|
||||
* The sync layer will keep this pool up to date
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
export type OperationType = 'insert' | 'delete' | 'update';
|
||||
export type EntityType = 'particle' | 'network' | 'member';
|
||||
export type Operation = {
|
||||
id: string; // Unique identifier for the operation
|
||||
type: OperationType;
|
||||
entityId: string;
|
||||
entityType: EntityType;
|
||||
data?: Record<string, any>; // Optional data for the operation (e.g., new values for an update)
|
||||
timestamp: number; // Unix timestamp in milliseconds
|
||||
};
|
||||
@@ -0,0 +1,63 @@
|
||||
import { Operation } from "./operation";
|
||||
|
||||
// This is a simple wrapper for managing websocket connection to the sync server
|
||||
// It allows different parts of the app to listen for incoming operations and send messages
|
||||
class SyncClient {
|
||||
private socket: WebSocket | null = null;
|
||||
private listeners: ((operation: Operation) => void)[] = [];
|
||||
|
||||
connect(url: string) {
|
||||
if (this.socket) {
|
||||
this.socket.close();
|
||||
}
|
||||
this.socket = new WebSocket(url);
|
||||
|
||||
this.socket.onopen = () => {
|
||||
console.log("WebSocket connected");
|
||||
};
|
||||
|
||||
this.socket.onmessage = (event) => {
|
||||
const message = JSON.parse(event.data);
|
||||
console.log("Received message:", message);
|
||||
|
||||
if (message.type === "operation") {
|
||||
const operation: Operation = message.operation;
|
||||
this.listeners.forEach((listener) => listener(operation));
|
||||
}
|
||||
}
|
||||
|
||||
this.socket.onclose = () => {
|
||||
console.log("WebSocket disconnected");
|
||||
this.socket = null;
|
||||
};
|
||||
|
||||
this.socket.onerror = (error) => {
|
||||
console.error("WebSocket error:", error);
|
||||
};
|
||||
}
|
||||
|
||||
addListener(listener: (operation: Operation) => void) {
|
||||
this.listeners.push(listener);
|
||||
}
|
||||
|
||||
removeListener(listener: (operation: Operation) => void) {
|
||||
this.listeners = this.listeners.filter((l) => l !== listener);
|
||||
}
|
||||
|
||||
sendMessage(message: any) {
|
||||
if (this.socket && this.socket.readyState === WebSocket.OPEN) {
|
||||
this.socket.send(JSON.stringify(message));
|
||||
} else {
|
||||
console.warn("WebSocket is not connected. Cannot send message:", message);
|
||||
}
|
||||
}
|
||||
|
||||
disconnect() {
|
||||
if (this.socket) {
|
||||
this.socket.close();
|
||||
}
|
||||
this.socket = null;
|
||||
}
|
||||
}
|
||||
|
||||
export const syncClient = new SyncClient();
|
||||
Reference in New Issue
Block a user