y-socket.io-provider
Version:
Socket IO Provider for Yjs (Inspired by y-websocket and y-socket.io)
1 lines • 29 kB
Source Map (JSON)
{"version":3,"file":"y-socket.io-provider.cjs","sources":["../src/y-socket.io-provider.js"],"sourcesContent":["// From https://github.com/ivan-topp/y-socket.io/blob/4484c4fa063060d011ae2d9abf572402e3b26e9d/src/client/provider.ts\n\nimport * as Y from \"yjs\";\nimport * as bc from \"lib0/broadcastchannel\";\nimport * as AwarenessProtocol from \"y-protocols/awareness\";\nimport { Observable } from \"lib0/observable\";\nimport { io, Socket } from \"socket.io-client\";\n\n// export interface AwarenessChange {\n// /**\n// * The clients added\n// */\n// added: number[];\n// /**\n// * The clients updated\n// */\n// updated: number[];\n// /**\n// * The clients removed\n// */\n// removed: number[];\n// }\n\n/**\n * SocketIOProvider instance configuration. Here you can configure:\n * - autoConnect: (Optional) Will try to connect to the server when the instance is created if true; otherwise you have to call `provider.connect()` manually\n * - awareness: (Optional) Give an existing awareness\n * - resyncInterval: (Optional) Specify the number of milliseconds to set an interval to synchronize the document,\n * if it is greater than 0 enable the synchronization interval (by default is -1)\n * - disableBc: (Optional) This boolean disable the broadcast channel functionality, by default is false (broadcast channel enabled)\n * - onConnect: (Optional) Set a callback that will triggered immediately when the socket is connected\n * - onDisconnect: (Optional) Set a callback that will triggered immediately when the socket is disconnected\n * - onConnectError: (Optional) Set a callback that will triggered immediately when the occurs a socket connection error\n */\n// export interface ProviderConfiguration {\n// /**\n// * (Optional) This boolean specify if the provider should connect when the instance is created, by default is true\n// */\n// autoConnect?: boolean;\n// /**\n// * (Optional) An existent awareness, by default is a new AwarenessProtocol.Awareness instance\n// */\n// awareness?: AwarenessProtocol.Awareness;\n// /**\n// * (optional) Specify the number of milliseconds to synchronize, by default is -1 (this disable resync interval)\n// */\n// resyncInterval?: number;\n// /**\n// * (Optional) This boolean disable the broadcast channel functionality, by default is false (broadcast channel enabled)\n// */\n// disableBc?: boolean;\n// /**\n// * (Optional) Add the authentication data\n// */\n// auth?: { [key: string]: any };\n// }\n\n/**\n * The socket io provider class to sync a document\n */\nexport class SocketIOProvider extends Observable {\n /**\n * The connection url to server. Example: `ws://localhost:3001`\n * @type {string}\n */\n _url;\n /**\n * The name of the document room\n * @type {string}\n */\n roomName;\n /**\n * The broadcast channel room\n * @type {string}\n * @private\n */\n _broadcastChannel;\n /**\n * The socket connection\n * @type {Socket}\n */\n socket;\n /**\n * The yjs document\n * @type {Y.Doc}\n */\n doc;\n /**\n * The awareness\n * @type {AwarenessProtocol.Awareness}\n */\n awareness;\n /**\n * Disable broadcast channel, by default is false\n * @type {boolean}\n */\n disableBc;\n /**\n * The broadcast channel connection status indicator\n * @type {boolean}\n */\n bcconnected;\n /**\n * The document's sync status indicator\n * @type {boolean}\n * @private\n */\n _synced;\n /**\n * Interval to emit `sync-step-1` to sync changes\n * @type {NodeJS.Timer | null}\n * @private\n */\n resyncInterval = null;\n\n /**\n * SocketIOProvider constructor\n * @constructor\n * @param {string} url The connection url from server\n * @param {string} roomName The document's room name\n * @param {Y.Doc} doc The yjs document\n * @param options Configuration options to the SocketIOProvider\n */\n constructor(\n url,\n roomName,\n doc,\n {\n autoConnect = true,\n awareness = new AwarenessProtocol.Awareness(doc),\n resyncInterval = -1,\n disableBc = false,\n auth = {},\n }\n ) {\n super();\n while (url[url.length - 1] === \"/\") {\n url = url.slice(0, url.length - 1);\n }\n this._url = url;\n this.roomName = roomName;\n this.doc = doc;\n this.awareness = awareness;\n\n this._broadcastChannel = `${url}/${roomName}`;\n this.disableBc = disableBc;\n\n this.socket = io(`${this.url}/yjs|${roomName}`, {\n autoConnect: false,\n transports: [\"websocket\"],\n forceNew: true,\n auth: auth,\n });\n\n this.doc.on(\"update\", this.onUpdateDoc);\n\n this.socket.on(\"connect\", () => this.onSocketConnection(resyncInterval));\n\n this.socket.on(\"disconnect\", (event) => this.onSocketDisconnection(event));\n\n this.socket.on(\"connect_error\", (error) =>\n this.onSocketConnectionError(error)\n );\n\n this.initSyncListeners();\n\n this.initAwarenessListeners();\n\n this.initSystemListeners();\n\n awareness.on(\"update\", this.awarenessUpdate);\n\n if (autoConnect) this.connect();\n }\n\n /**\n * Broadcast channel room getter\n * @type {string}\n */\n get broadcastChannel() {\n return this._broadcastChannel;\n }\n\n /**\n * URL getter\n * @type {string}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Synchronized state flag getter\n * @type {boolean}\n */\n get synced() {\n return this._synced;\n }\n\n /**\n * Synchronized state flag setter\n */\n set synced(state) {\n if (this._synced !== state) {\n this._synced = state;\n this.emit(\"synced\", [state]);\n this.emit(\"sync\", [state]);\n }\n }\n\n /**\n * This function initializes the socket event listeners to synchronize document changes.\n *\n * The synchronization protocol is as follows:\n * - A server emits the sync step one event (`sync-step-1`) which sends the document as a state vector\n * and the sync step two callback as an acknowledgment according to the socket io acknowledgments.\n * - When the client receives the `sync-step-1` event, it executes the `syncStep2` acknowledgment callback and sends\n * the difference between the received state vector and the local document (this difference is called an update).\n * - The second step of the sync is to apply the update sent in the `syncStep2` callback parameters from the client\n * to the document on the server side.\n * - There is another event (`sync-update`) that is emitted from the server, which sends an update for the document,\n * and when the client receives this event, it applies the received update to the local document.\n * - When an update is applied to a document, it will fire the document's \"update\" event, which\n * sends the update to the server.\n * @type {() => void}\n * @private\n */\n initSyncListeners = () => {\n this.socket.on(\"sync-step-1\", (stateVector, syncStep2) => {\n syncStep2(Y.encodeStateAsUpdate(this.doc, new Uint8Array(stateVector)));\n this.synced = true;\n });\n\n this.socket.on(\"sync-update\", this.onSocketSyncUpdate);\n };\n\n /**\n * This function initializes socket event listeners to synchronize awareness changes.\n *\n * The awareness protocol is as follows:\n * - The server emits the `awareness-update` event by sending the awareness update.\n * - The client receives that event and applies the received update to the local awareness.\n * - When an update is applied to awareness, the awareness \"update\" event will fire, which\n * sends the update to the server.\n * @type {() => void}\n * @private\n */\n initAwarenessListeners = () => {\n this.socket.on(\"awareness-update\", (update) => {\n AwarenessProtocol.applyAwarenessUpdate(\n this.awareness,\n new Uint8Array(update),\n this\n );\n });\n };\n\n /**\n * This function initialize the window or process events listener. Specifically set ups the\n * window `beforeunload` and process `exit` events to remove the client from the awareness.\n * @type {() => void}\n */\n initSystemListeners = () => {\n if (typeof window !== \"undefined\")\n window.addEventListener(\"beforeunload\", this.beforeUnloadHandler);\n else if (typeof process !== \"undefined\")\n process.on(\"exit\", this.beforeUnloadHandler);\n };\n\n /**\n * Connect provider's socket\n * @type {() => void}\n */\n connect() {\n if (!this.socket.connected) {\n this.emit(\"status\", [{ status: \"connecting\" }]);\n this.socket.connect();\n if (!this.disableBc) this.connectBc();\n this.synced = false;\n }\n }\n\n /**\n * This function runs when the socket connects and reconnects and emits the `sync-step-1`\n * and `awareness-update` socket events to start synchronization.\n *\n * Also starts the resync interval if is enabled.\n * @private\n * @param onConnect (Optional) A callback that will be triggered every time that socket is connected or reconnected\n * @param resyncInterval (Optional) A number of milliseconds for interval of synchronize\n */\n onSocketConnection = (resyncInterval = -1) => {\n this.emit(\"status\", [{ status: \"connected\" }]);\n this.socket.emit(\"sync-step-1\", Y.encodeStateVector(this.doc), (update) => {\n Y.applyUpdate(this.doc, new Uint8Array(update), this);\n });\n if (this.awareness.getLocalState() !== null)\n this.socket.emit(\n \"awareness-update\",\n AwarenessProtocol.encodeAwarenessUpdate(this.awareness, [\n this.doc.clientID,\n ])\n );\n if (resyncInterval > 0) {\n this.resyncInterval = setInterval(() => {\n if (this.socket.disconnected) return;\n this.socket.emit(\n \"sync-step-1\",\n Y.encodeStateVector(this.doc),\n (update) => {\n Y.applyUpdate(this.doc, new Uint8Array(update), this);\n }\n );\n }, resyncInterval);\n }\n };\n\n /**\n * Disconnect provider's socket\n * @type {() => void}\n */\n disconnect() {\n if (this.socket.connected) {\n this.disconnectBc();\n this.socket.disconnect();\n }\n }\n\n /**\n * This function runs when the socket is disconnected and emits the socket event `awareness-update`\n * which removes this client from awareness.\n */\n onSocketDisconnection = (event) => {\n this.emit(\"connection-close\", [event, this]);\n this.synced = false;\n AwarenessProtocol.removeAwarenessStates(\n this.awareness,\n Array.from(this.awareness.getStates().keys()).filter(\n (client) => client !== this.doc.clientID\n ),\n this\n );\n this.emit(\"status\", [{ status: \"disconnected\" }]);\n };\n\n /**\n * This function is executed when the socket connection fails.\n */\n onSocketConnectionError = (error) => {\n this.emit(\"connection-error\", [error, this]);\n };\n\n /**\n * Destroy the provider. This method clears the document, awareness, and window/process listeners and disconnects the socket.\n * @type {() => void}\n */\n destroy() {\n if (this.resyncInterval != null) clearInterval(this.resyncInterval);\n this.disconnect();\n if (typeof window !== \"undefined\")\n window.removeEventListener(\"beforeunload\", this.beforeUnloadHandler);\n else if (typeof process !== \"undefined\")\n process.off(\"exit\", this.beforeUnloadHandler);\n this.awareness.off(\"update\", this.awarenessUpdate);\n this.doc.off(\"update\", this.onUpdateDoc);\n super.destroy();\n }\n\n /**\n * This function is executed when the document is updated, if the instance that\n * emit the change is not this, it emit the changes by socket and broadcast channel.\n * @private\n * @param {Uint8Array} update Document update\n * @param {SocketIOProvider} origin The SocketIOProvider instance that emits the change.\n * @type {(update: Uint8Array, origin: SocketIOProvider) => void}\n */\n onUpdateDoc = (update, origin) => {\n if (origin !== this) {\n this.socket.emit(\"sync-update\", update);\n if (this.bcconnected) {\n bc.publish(\n this._broadcastChannel,\n {\n type: \"sync-update\",\n data: update,\n },\n this\n );\n }\n }\n };\n\n /**\n * This function is called when the server emits the `sync-update` event and applies the received update to the local document.\n * @private\n * @param {Uint8Array}update A document update received by the `sync-update` socket event\n * @type {(update: Uint8Array) => void}\n */\n onSocketSyncUpdate = (update) => {\n Y.applyUpdate(this.doc, new Uint8Array(update), this);\n };\n\n /**\n * This function is executed when the local awareness changes and this broadcasts the changes per socket and broadcast channel.\n * @private\n * @param {{ added: number[], updated: number[], removed: number[] }} awarenessChanges The clients added, updated and removed\n * @param {SocketIOProvider | null} origin The SocketIOProvider instance that emits the change.\n * @type {({ added, updated, removed }: { added: number[], updated: number[], removed: number[] }, origin: SocketIOProvider | null) => void}\n */\n awarenessUpdate = ({ added, updated, removed }, origin) => {\n const changedClients = added.concat(updated).concat(removed);\n this.socket.emit(\n \"awareness-update\",\n AwarenessProtocol.encodeAwarenessUpdate(this.awareness, changedClients)\n );\n if (this.bcconnected) {\n bc.publish(\n this._broadcastChannel,\n {\n type: \"awareness-update\",\n data: AwarenessProtocol.encodeAwarenessUpdate(\n this.awareness,\n changedClients\n ),\n },\n this\n );\n }\n };\n\n /**\n * This function is executed when the windows will be unloaded or the process will be closed and this\n * will remove the local client from awareness.\n * @private\n * @type {() => void}\n */\n beforeUnloadHandler = () => {\n AwarenessProtocol.removeAwarenessStates(\n this.awareness,\n [this.doc.clientID],\n \"window unload\"\n );\n };\n\n /**\n * This function subscribes the provider to the broadcast channel and initiates synchronization by broadcast channel.\n * @type {() => void}\n */\n connectBc = () => {\n if (!this.bcconnected) {\n bc.subscribe(this._broadcastChannel, this.onBroadcastChannelMessage);\n this.bcconnected = true;\n }\n bc.publish(\n this._broadcastChannel,\n { type: \"sync-step-1\", data: Y.encodeStateVector(this.doc) },\n this\n );\n bc.publish(\n this._broadcastChannel,\n { type: \"sync-step-2\", data: Y.encodeStateAsUpdate(this.doc) },\n this\n );\n bc.publish(\n this._broadcastChannel,\n { type: \"query-awareness\", data: null },\n this\n );\n bc.publish(\n this._broadcastChannel,\n {\n type: \"awareness-update\",\n data: AwarenessProtocol.encodeAwarenessUpdate(this.awareness, [\n this.doc.clientID,\n ]),\n },\n this\n );\n };\n\n /**\n * This function unsubscribes the provider from the broadcast channel and before unsubscribing, updates the awareness.\n * @type {() => void}\n */\n disconnectBc = () => {\n bc.publish(\n this._broadcastChannel,\n {\n type: \"awareness-update\",\n data: AwarenessProtocol.encodeAwarenessUpdate(\n this.awareness,\n [this.doc.clientID],\n new Map()\n ),\n },\n this\n );\n if (this.bcconnected) {\n bc.unsubscribe(this._broadcastChannel, this.onBroadcastChannelMessage);\n this.bcconnected = false;\n }\n };\n\n /**\n * This method handles messages received by the broadcast channel and responds to them.\n * @param {{ type: string, data: any }} message The object message received by broadcast channel\n * @param {SocketIOProvider} origin The SocketIOProvider instance that emits the change\n * @type {(message: { type: string, data: any }, origin: SocketIOProvider) => void}\n */\n onBroadcastChannelMessage = (message, origin) => {\n if (origin !== this && message.type.length > 0) {\n switch (message.type) {\n case \"sync-step-1\":\n bc.publish(\n this._broadcastChannel,\n {\n type: \"sync-step-2\",\n data: Y.encodeStateAsUpdate(this.doc, message.data),\n },\n this\n );\n break;\n\n case \"sync-step-2\":\n Y.applyUpdate(this.doc, new Uint8Array(message.data), this);\n break;\n\n case \"sync-update\":\n Y.applyUpdate(this.doc, new Uint8Array(message.data), this);\n break;\n\n case \"query-awareness\":\n bc.publish(\n this._broadcastChannel,\n {\n type: \"awareness-update\",\n data: AwarenessProtocol.encodeAwarenessUpdate(\n this.awareness,\n Array.from(this.awareness.getStates().keys())\n ),\n },\n this\n );\n break;\n\n case \"awareness-update\":\n AwarenessProtocol.applyAwarenessUpdate(\n this.awareness,\n new Uint8Array(message.data),\n this\n );\n break;\n\n default:\n break;\n }\n }\n };\n}\n"],"names":["Observable","AwarenessProtocol","io","Y","bc"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAM,gBAAgB,SAASA,qBAAU,CAAC;AACjD;AACA;AACA;AACA;AACA,EAAE,IAAI,CAAC;AACP;AACA;AACA;AACA;AACA,EAAE,QAAQ,CAAC;AACX;AACA;AACA;AACA;AACA;AACA,EAAE,iBAAiB,CAAC;AACpB;AACA;AACA;AACA;AACA,EAAE,MAAM,CAAC;AACT;AACA;AACA;AACA;AACA,EAAE,GAAG,CAAC;AACN;AACA;AACA;AACA;AACA,EAAE,SAAS,CAAC;AACZ;AACA;AACA;AACA;AACA,EAAE,SAAS,CAAC;AACZ;AACA;AACA;AACA;AACA,EAAE,WAAW,CAAC;AACd;AACA;AACA;AACA;AACA;AACA,EAAE,OAAO,CAAC;AACV;AACA;AACA;AACA;AACA;AACA,EAAE,cAAc,GAAG,IAAI,CAAC;AACxB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE,WAAW;AACb,IAAI,GAAG;AACP,IAAI,QAAQ;AACZ,IAAI,GAAG;AACP,IAAI;AACJ,MAAM,WAAW,GAAG,IAAI;AACxB,MAAM,SAAS,GAAG,IAAIC,4BAAiB,CAAC,SAAS,CAAC,GAAG,CAAC;AACtD,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,SAAS,GAAG,KAAK;AACvB,MAAM,IAAI,GAAG,EAAE;AACf,KAAK;AACL,IAAI;AACJ,IAAI,KAAK,EAAE,CAAC;AACZ,IAAI,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE;AACxC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,C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"}