{"version":3,"file":"y-webrtc-trystero.mjs","sources":["../src/y-webrtc-trystero.js"],"sourcesContent":["import * as bc from 'lib0/broadcastchannel'\nimport * as decoding from 'lib0/decoding'\nimport * as encoding from 'lib0/encoding'\nimport * as error from 'lib0/error'\nimport * as logging from 'lib0/logging'\nimport * as map from 'lib0/map'\nimport * as math from 'lib0/math'\nimport { createMutex } from 'lib0/mutex'\nimport { ObservableV2 as ObservableV2Base } from 'lib0/observable'\nimport * as random from 'lib0/random'\n\nimport { selfId, joinRoom as defaultJoinRoom } from 'trystero'\nimport * as awarenessProtocol from 'y-protocols/awareness'\nimport * as syncProtocol from 'y-protocols/sync'\n\n// Type definitions\n/** @typedef {import('yjs').Doc} YDoc */\n/** @typedef {import('y-protocols/awareness').Awareness} Awareness */\n/** @typedef {import('trystero').Room} TrysteroRoom */\n\n// Message types - these match y-protocols/constants\nconst messageSync = 0\nconst messageAwareness = 1\nconst messageQueryAwareness = 3\nconst messageBcPeerId = 4\n\nconst log = logging.createModuleLogger('y-webrtc-trystero')\n\n// Re-export for convenience\nexport { selfId }\n\n/**\n * @type {Map<string,TrysteroDocRoom>}\n */\nexport const rooms = new Map()\n\n/**\n * @param {string} roomId - The ID of the room to get\n * @return {TrysteroDocRoom | undefined} The room if it exists\n */\nexport const getRoom = (roomId) => rooms.get(roomId)\n\n/**\n * @param {TrysteroDocRoom} room\n */\nconst checkIsSynced = (room) => {\n  let synced = true\n  room.trysteroConns.forEach((peer) => {\n    if (!peer.synced) {\n      synced = false\n    }\n  })\n  if ((!synced && room.synced) || (synced && !room.synced)) {\n    room.synced = synced\n    room.provider.emit('synced', [{ synced }])\n    log('synced ', logging.BOLD, room.name, logging.UNBOLD, ' with all peers')\n  }\n}\n\n/**\n * @param {decoding.Decoder} decoder\n * @param {encoding.Encoder} encoder\n * @param {YDoc} doc\n * @param {any} transactionOrigin\n * @param {'view' | 'edit'} accessLevel\n * @return {number}\n */\nconst readSyncMessage = (decoder, encoder, doc, transactionOrigin, accessLevel) => {\n  const messageType = decoding.readVarUint(decoder)\n  switch (messageType) {\n    case syncProtocol.messageYjsSyncStep1:\n      syncProtocol.readSyncStep1(decoder, encoder, doc)\n      break\n    case syncProtocol.messageYjsSyncStep2:\n      if (accessLevel !== 'edit') {\n        console.warn('edit disabled', doc.guid)\n        return messageType\n      }\n      syncProtocol.readSyncStep2(decoder, doc, transactionOrigin)\n      break\n    case syncProtocol.messageYjsUpdate:\n      if (accessLevel !== 'edit') {\n        console.warn('edit disabled', doc.guid, accessLevel)\n        return messageType\n      }\n      syncProtocol.readUpdate(decoder, doc, transactionOrigin)\n      break\n    default:\n      throw new Error('Unknown message type')\n  }\n  return messageType\n}\n\n/**\n * @param {TrysteroDocRoom} room\n * @param {Uint8Array} buf\n * @param {function} syncedCallback\n * @return {encoding.Encoder?}\n */\nconst readMessage = (room, buf, syncedCallback) => {\n  const decoder = decoding.createDecoder(buf)\n  const encoder = encoding.createEncoder()\n  const messageType = decoding.readVarUint(decoder)\n  if (room === undefined) {\n    return null\n  }\n  const awareness = room.awareness\n  const doc = room.doc\n  let sendReply = false\n  switch (messageType) {\n    case messageSync: {\n      encoding.writeVarUint(encoder, messageSync)\n      const syncMessageType = readSyncMessage(\n        decoder,\n        encoder,\n        doc,\n        room,\n        room.provider.accessLevel || 'edit' // Default to 'edit' for backward compatibility\n      )\n      if (syncMessageType === syncProtocol.messageYjsSyncStep2 && !room.synced) {\n        syncedCallback()\n      }\n      if (syncMessageType === syncProtocol.messageYjsSyncStep1) {\n        sendReply = true\n      }\n      break\n    }\n    case messageQueryAwareness:\n      encoding.writeVarUint(encoder, messageAwareness)\n      encoding.writeVarUint8Array(encoder, awarenessProtocol.encodeAwarenessUpdate(awareness, Array.from(awareness.getStates().keys())))\n      sendReply = true\n      break\n    case messageAwareness:\n      awarenessProtocol.applyAwarenessUpdate(awareness, decoding.readVarUint8Array(decoder), room)\n      break\n    case messageBcPeerId: {\n      const add = decoding.readUint8(decoder) === 1\n      const peerName = decoding.readVarString(decoder)\n      if (peerName !== room.peerId && ((room.bcConns.has(peerName) && !add) || (!room.bcConns.has(peerName) && add))) {\n        const removed = []\n        const added = []\n        if (add) {\n          room.bcConns.add(peerName)\n          added.push(peerName)\n        } else {\n          room.bcConns.delete(peerName)\n          removed.push(peerName)\n        }\n        room.provider.emit('peers', [{\n          added,\n          removed,\n          trysteroPeers: Array.from(room.trysteroConns.keys()),\n          bcPeers: Array.from(room.bcConns)\n        }])\n        broadcastBcPeerId(room)\n      }\n      break\n    }\n    default:\n      console.error('Unable to compute message')\n      return encoder\n  }\n  if (!sendReply) {\n    // nothing has been written, no answer created\n    return null\n  }\n  return encoder\n}\n\n/**\n * @param {TrysteroConn} peerConn\n * @param {Uint8Array} buf\n * @return {encoding.Encoder?}\n */\nconst readPeerMessage = (peerConn, buf) => {\n  const room = peerConn.room\n  log('received message from ', logging.BOLD, peerConn.remotePeerId, logging.GREY, ' (', room.name, ')', logging.UNBOLD, logging.UNCOLOR)\n  return readMessage(room, buf, () => {\n    peerConn.synced = true\n    log('synced ', logging.BOLD, room.name, logging.UNBOLD, ' with ', logging.BOLD, peerConn.remotePeerId)\n    checkIsSynced(room)\n  })\n}\n\n/**\n * @param {TrysteroConn} trysteroConn\n * @param {encoding.Encoder} encoder\n */\nconst sendTrysteroConn = (trysteroConn, encoder) => {\n  log('send message to ', logging.BOLD, trysteroConn.remotePeerId, logging.UNBOLD, logging.GREY, ' (', trysteroConn.room.name, ')', logging.UNCOLOR)\n  try {\n    trysteroConn.room.provider.sendDocData(encoding.toUint8Array(encoder), trysteroConn.remotePeerId)\n  } catch (e) {\n    console.log('error sending', e)\n  }\n}\n\n/**\n * @param {TrysteroDocRoom} room\n * @param {Uint8Array} m\n */\nconst broadcastTrysteroConn = (room, m) => {\n  log('broadcast message in ', logging.BOLD, room.name, logging.UNBOLD)\n  room.trysteroConns.forEach((conn) => {\n    try {\n      conn.room.provider.sendDocData(m)\n    } catch (e) {\n      console.log('error broadcasting', e)\n    }\n  })\n}\n\nexport class TrysteroConn {\n  /**\n   * @param {string} remotePeerId\n   * @param {TrysteroDocRoom} room\n   */\n  constructor (remotePeerId, room) {\n    log('connected to ', logging.BOLD, remotePeerId)\n    this.room = room\n    this.remotePeerId = remotePeerId\n    this.closed = false\n    this.connected = false\n    this.synced = false\n\n    // already connected\n    this.connected = true\n    // send sync step 1\n    const provider = room.provider\n    const doc = provider.doc\n    const awareness = room.awareness\n    const encoder = encoding.createEncoder()\n    encoding.writeVarUint(encoder, messageSync)\n    syncProtocol.writeSyncStep1(encoder, doc)\n    sendTrysteroConn(this, encoder)\n    const awarenessStates = awareness.getStates()\n    if (awarenessStates.size > 0) {\n      const encoder = encoding.createEncoder()\n      encoding.writeVarUint(encoder, messageAwareness)\n      encoding.writeVarUint8Array(encoder, awarenessProtocol.encodeAwarenessUpdate(awareness, Array.from(awarenessStates.keys())))\n      sendTrysteroConn(this, encoder)\n    }\n    provider.listenDocData((data, peerId) => {\n      const arr = /** @type {Uint8Array} */ (data)\n      try {\n        const answer = readPeerMessage(this, arr)\n        if (answer !== null) {\n          sendTrysteroConn(this, answer)\n        }\n      } catch (err) {\n        console.log(err)\n      }\n    })\n  }\n\n  onClose () {\n    this.connected = false\n    this.closed = true\n    const { room, remotePeerId } = this\n    if (room.trysteroConns.has(remotePeerId)) {\n      room.trysteroConns.delete(remotePeerId)\n      room.provider.emit('peers', [\n        {\n          removed: [remotePeerId],\n          added: [],\n          trysteroPeers: Array.from(room.trysteroConns.keys()),\n          bcPeers: Array.from(room.bcConns)\n        }\n      ])\n    }\n    checkIsSynced(room)\n    log('closed connection to ', logging.BOLD, remotePeerId)\n  }\n\n  destroy () {\n    // console.log(\"todo: destroy conn(?)\");\n  }\n}\n\n/**\n * @param {TrysteroDocRoom} room\n * @param {Uint8Array} m\n */\nconst broadcastBcMessage = (room, m) => {\n  room.mux(() => {\n    bc.publish(room.name, m)\n  })\n}\n\n/**\n * @param {TrysteroDocRoom} room\n * @param {Uint8Array} m\n */\nconst broadcastRoomMessage = (room, m) => {\n  if (room.bcconnected) {\n    broadcastBcMessage(room, m)\n  }\n  broadcastTrysteroConn(room, m)\n}\n\n/**\n * @param {TrysteroDocRoom} room\n */\nconst broadcastBcPeerId = (room) => {\n  if (room.provider.filterBcConns) {\n    // broadcast peerId via broadcastchannel\n    const encoderPeerIdBc = encoding.createEncoder()\n    encoding.writeVarUint(encoderPeerIdBc, messageBcPeerId)\n    encoding.writeUint8(encoderPeerIdBc, 1)\n    encoding.writeVarString(encoderPeerIdBc, room.peerId)\n    broadcastBcMessage(room, encoding.toUint8Array(encoderPeerIdBc))\n  }\n}\n\nexport class TrysteroDocRoom {\n  /**\n   * @param {YDoc} doc\n   * @param {TrysteroProvider} provider\n   * @param {string} name\n   * @param {string|undefined} password\n   */\n  constructor (doc, provider, name, password) {\n    this.peerId = selfId\n    this.doc = doc\n    /**\n     * @type {awarenessProtocol.Awareness}\n     */\n    this.awareness = provider.awareness\n    this.provider = provider\n    this.synced = false\n    this.name = name\n    this.password = password\n    /**\n     * @type {Map<string, TrysteroConn>}\n     */\n    this.trysteroConns = new Map()\n    /**\n     * @type {Set<string>}\n     */\n    this.bcConns = new Set()\n    this.mux = createMutex()\n    this.bcconnected = false\n    /**\n     * @param {ArrayBuffer} data\n     */\n    this._bcSubscriber = data => {\n      this.mux(() => {\n        const reply = readMessage(this, new Uint8Array(data), () => {})\n        if (reply) {\n          broadcastBcMessage(this, encoding.toUint8Array(reply))\n        }\n      })\n    }\n    /**\n     * Listens to Yjs updates and sends them to remote peers\n     *\n     * @param {Uint8Array} update\n     * @param {any} _origin\n     */\n    this._docUpdateHandler = (update, _origin) => {\n      const encoder = encoding.createEncoder()\n      encoding.writeVarUint(encoder, messageSync)\n      syncProtocol.writeUpdate(encoder, update)\n      broadcastRoomMessage(this, encoding.toUint8Array(encoder))\n    }\n    /**\n     * Listens to Awareness updates and sends them to remote peers\n     *\n     * @param {any} changed\n     * @param {any} _origin\n     */\n    this._awarenessUpdateHandler = ({ added, updated, removed }, _origin) => {\n      const changedClients = added.concat(updated).concat(removed)\n      const encoderAwareness = encoding.createEncoder()\n      encoding.writeVarUint(encoderAwareness, messageAwareness)\n      encoding.writeVarUint8Array(encoderAwareness, awarenessProtocol.encodeAwarenessUpdate(this.awareness, changedClients))\n      broadcastRoomMessage(this, encoding.toUint8Array(encoderAwareness))\n    }\n\n    this._beforeUnloadHandler = () => {\n      awarenessProtocol.removeAwarenessStates(this.awareness, [doc.clientID], 'window unload')\n      rooms.forEach(room => {\n        room.disconnect()\n      })\n    }\n\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    provider.trystero.onPeerJoin((peerId) => {\n      log(`${peerId} joined`)\n      if (this.trysteroConns.size < provider.maxConns) {\n        map.setIfUndefined(this.trysteroConns, peerId, () => {\n          if (!provider.room) throw new Error('Room not initialized')\n          return new TrysteroConn(peerId, provider.room)\n        })\n      }\n    })\n    provider.trystero.onPeerLeave((peerId) => {\n      const conn = this.trysteroConns.get(peerId)\n      if (conn) conn.onClose()\n      if (this.trysteroConns.has(peerId)) {\n        this.trysteroConns.delete(peerId)\n        this.provider.emit('peers', [\n          {\n            removed: [peerId],\n            added: [],\n            trysteroPeers: provider.room ? Array.from(provider.room.trysteroConns.keys()) : [],\n            bcPeers: Array.from(this.bcConns)\n          }\n        ])\n      }\n      checkIsSynced(this)\n      log('closed connection to ', logging.BOLD, peerId)\n    })\n  }\n\n  connectToDoc () {\n    this.doc.on('update', this._docUpdateHandler)\n    this.awareness.on('update', this._awarenessUpdateHandler)\n    const roomName = this.name\n    bc.subscribe(roomName, this._bcSubscriber)\n    this.bcconnected = true\n    // broadcast peerId via broadcastchannel\n    broadcastBcPeerId(this)\n    // write sync step 1\n    const encoderSync = encoding.createEncoder()\n    encoding.writeVarUint(encoderSync, messageSync)\n    syncProtocol.writeSyncStep1(encoderSync, this.doc)\n    broadcastBcMessage(this, encoding.toUint8Array(encoderSync))\n    // broadcast local state\n    const encoderState = encoding.createEncoder()\n    encoding.writeVarUint(encoderState, messageSync)\n    syncProtocol.writeSyncStep2(encoderState, this.doc)\n    broadcastBcMessage(this, encoding.toUint8Array(encoderState))\n    // write queryAwareness\n    const encoderAwarenessQuery = encoding.createEncoder()\n    encoding.writeVarUint(encoderAwarenessQuery, messageQueryAwareness)\n    broadcastBcMessage(this, encoding.toUint8Array(encoderAwarenessQuery))\n    // broadcast local awareness state\n    const encoderAwarenessState = encoding.createEncoder()\n    encoding.writeVarUint(encoderAwarenessState, messageAwareness)\n    encoding.writeVarUint8Array(encoderAwarenessState, awarenessProtocol.encodeAwarenessUpdate(this.awareness, [this.doc.clientID]))\n    broadcastBcMessage(this, encoding.toUint8Array(encoderAwarenessState))\n  }\n\n  disconnect () {\n    awarenessProtocol.removeAwarenessStates(this.awareness, [this.doc.clientID], 'disconnect')\n    // broadcast peerId removal via broadcastchannel\n    const encoderPeerIdBc = encoding.createEncoder()\n    encoding.writeVarUint(encoderPeerIdBc, messageBcPeerId)\n    encoding.writeUint8(encoderPeerIdBc, 0) // remove peerId from other bc peers\n    encoding.writeVarString(encoderPeerIdBc, this.peerId)\n    broadcastBcMessage(this, encoding.toUint8Array(encoderPeerIdBc))\n\n    bc.unsubscribe(this.name, this._bcSubscriber)\n    this.bcconnected = false\n    this.doc.off('update', this._docUpdateHandler)\n    this.awareness.off('update', this._awarenessUpdateHandler)\n    this.trysteroConns.forEach(conn => conn.destroy())\n  }\n\n  destroy () {\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    }\n  }\n}\n\n/**\n * @param {YDoc} doc\n * @param {TrysteroProvider} provider\n * @param {string} name\n * @param {string|undefined} password\n * @return {TrysteroDocRoom}\n */\nconst openRoom = (doc, provider, name, password) => {\n  // there must only be one room\n  if (rooms.has(name)) {\n    throw error.create(`A Yjs Doc connected to room \"${name}\" already exists!`)\n  }\n  const room = new TrysteroDocRoom(doc, provider, name, password)\n  room.connectToDoc()\n  rooms.set(name, /** @type {TrysteroDocRoom} */ (room))\n  return room\n}\n\n/**\n * @typedef {Object} ProviderOptions\n * @property {string} [appId] - The Trystero app ID. Defaults to 'y-webrtc-trystero-app'.\n * @property {TrysteroRoom} [trysteroRoom] - The TrysteroRoom instance. If not provided, one will be created.\n * @property {(opts: any, roomId: string) => TrysteroRoom} [joinRoom] - Function to join a Trystero room.\n * @property {string} [password] - Optional password for encryption.\n * @property {Awareness} [awareness] - Awareness instance. If not provided, a new one will be created.\n * @property {number} [maxConns] - Maximum number of connections. Defaults to a random number between 20-34.\n * @property {boolean} [filterBcConns=true] - Whether to filter broadcast connections.\n * @property {'view' | 'edit'} [accessLevel='edit'] - Access level for the document ('view' or 'edit').\n * @property {any} [peerOpts] - Additional peer options.\n */\n\n// Export types for TypeScript consumers\nexport {}\n\n/**\n * @typedef {Object} TrysteroProviderEvents\n * @property {(event: { connected: boolean }) => void} status - Emitted when connection status changes.\n * @property {(event: { synced: boolean }) => void} synced - Emitted when sync status changes.\n * @property {() => void} destroy - Emitted when the provider is destroyed.\n * @property {(event: {\n *   added: string[],\n *   removed: string[],\n *   trysteroPeers: string[],\n *   bcPeers: string[]\n * }) => void} peers - Emitted when peer list changes.\n */\n\n/** @typedef {import('lib0/observable').ObservableV2<TrysteroProviderEvents>} ObservableV2 */\n\n/** @extends {ObservableV2Base<TrysteroProviderEvents>} */\nexport class TrysteroProvider extends ObservableV2Base {\n  /**\n   * @class\n   * @classdesc Represents a Y.Trystero instance.\n   * @param {string} roomName - The name of the room.\n   * @param {YDoc} doc - The Y.Doc instance.\n   * @param {ProviderOptions} opts\n   */\n  constructor (\n    roomName,\n    doc,\n    {\n      appId,\n      password,\n      joinRoom,\n      trysteroRoom = (joinRoom || defaultJoinRoom)({ appId: appId || 'y-webrtc-trystero-app', password }, roomName),\n      awareness = new awarenessProtocol.Awareness(doc),\n      maxConns = 20 + math.floor(random.rand() * 15), // the random factor reduces the chance that n clients form a cluster\n      filterBcConns = true,\n      accessLevel = 'edit' // Default to 'edit' for backward compatibility\n    } = {\n      appId: 'y-webrtc-trystero-app',\n      password: undefined,\n      joinRoom: defaultJoinRoom,\n      trysteroRoom: undefined,\n      awareness: new awarenessProtocol.Awareness(doc),\n      maxConns: 20 + math.floor(random.rand() * 15),\n      filterBcConns: true,\n      accessLevel: 'edit'\n    }\n  ) {\n    super()\n    this.doc = doc\n    this.maxConns = maxConns\n    this.filterBcConns = filterBcConns\n    this.accessLevel = accessLevel\n    this.password = password\n    this.trystero = trysteroRoom\n    /**\n     * @type {TrysteroDocRoom|null}\n     */\n    this.room = null\n    this.roomName = roomName\n    /**\n     * @type {awarenessProtocol.Awareness}\n     */\n    this.awareness = awareness\n\n    // Create the room with the password\n    this.room = openRoom(doc, this, roomName, password)\n    doc.on('destroy', () => this.destroy())\n\n    // Set up Trystero actions\n    const [sendDocData, listenDocData] = trysteroRoom.makeAction('docdata')\n    this.sendDocData = sendDocData\n    this.listenDocData = listenDocData\n  }\n\n  destroy () {\n    this.doc.off('destroy', this.destroy)\n    // Clean up the room immediately\n    if (this.room) {\n      this.room.destroy()\n      rooms.delete(this.roomName)\n    }\n    this.emit('destroy', [])\n    super.destroy()\n  }\n}\n"],"names":["logging.createModuleLogger","logging.BOLD","logging.UNBOLD","decoding.readVarUint","syncProtocol.messageYjsSyncStep1","syncProtocol.readSyncStep1","syncProtocol.messageYjsSyncStep2","syncProtocol.readSyncStep2","syncProtocol.messageYjsUpdate","syncProtocol.readUpdate","decoding.createDecoder","encoding.createEncoder","encoding.writeVarUint","encoding.writeVarUint8Array","awarenessProtocol.encodeAwarenessUpdate","awarenessProtocol.applyAwarenessUpdate","decoding.readVarUint8Array","decoding.readUint8","decoding.readVarString","logging.GREY","logging.UNCOLOR","encoding.toUint8Array","syncProtocol.writeSyncStep1","bc.publish","encoding.writeUint8","encoding.writeVarString","syncProtocol.writeUpdate","awarenessProtocol.removeAwarenessStates","map.setIfUndefined","bc.subscribe","syncProtocol.writeSyncStep2","bc.unsubscribe","error.create","ObservableV2Base","joinRoom","defaultJoinRoom","awarenessProtocol.Awareness","math.floor","random.rand"],"mappings":"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"}