{"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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"}