{"version":3,"sources":["jsdelivr-header.js","/npm/@udecode/plate-yjs@49.0.0/src/index.ts","/npm/@udecode/plate-yjs@49.0.0/src/lib/BaseYjsPlugin.ts","/npm/node_modules/y-protocols/node_modules/lib0/math.js","/npm/node_modules/y-protocols/node_modules/lib0/set.js","/npm/node_modules/y-protocols/node_modules/lib0/array.js","/npm/node_modules/y-protocols/node_modules/lib0/time.js","/npm/node_modules/y-protocols/node_modules/lib0/map.js","/npm/node_modules/y-protocols/node_modules/lib0/observable.js","/npm/node_modules/y-protocols/node_modules/lib0/object.js","/npm/node_modules/y-protocols/node_modules/lib0/function.js","/npm/node_modules/y-protocols/awareness.js","/npm/@udecode/plate-yjs@49.0.0/src/utils/slateToDeterministicYjsState.ts","/npm/@udecode/plate-yjs@49.0.0/src/lib/providers/hocuspocus-provider.ts","/npm/@udecode/plate-yjs@49.0.0/src/lib/providers/webrtc-provider.ts","/npm/@udecode/plate-yjs@49.0.0/src/lib/providers/registry.ts","/npm/@udecode/plate-yjs@49.0.0/src/lib/withPlateYjs.ts","/npm/@udecode/plate-yjs@49.0.0/src/lib/withTCursors.ts","/npm/@udecode/plate-yjs@49.0.0/src/lib/withTYHistory.ts","/npm/@udecode/plate-yjs@49.0.0/src/lib/withTYjs.ts"],"names":[],"mappings":"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","file":"/npm/@udecode/plate-yjs@49.0.0/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@udecode/plate-yjs@49.0.0/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from './lib/index';\nexport * from './utils/index';\n","import { YjsEditor } from '@slate-yjs/core';\nimport {\n  type InitOptions,\n  type Value,\n  createTSlatePlugin,\n  KEYS,\n} from '@udecode/plate';\nimport { Awareness } from 'y-protocols/awareness';\nimport * as Y from 'yjs';\n\nimport { slateToDeterministicYjsState } from '../utils/slateToDeterministicYjsState';\nimport {\n  type UnifiedProvider,\n  type YjsConfig,\n  type YjsProviderConfig,\n  type YjsProviderType,\n  createProvider,\n} from './providers';\nimport { withPlateYjs } from './withPlateYjs';\n\n// Helper to check if an object is a provider config\nconst isProviderConfig = (\n  item: UnifiedProvider | YjsProviderConfig\n): item is YjsProviderConfig => {\n  return (\n    typeof item === 'object' &&\n    item !== null &&\n    'type' in item &&\n    'options' in item\n  );\n};\n\nexport const BaseYjsPlugin = createTSlatePlugin<YjsConfig>({\n  key: KEYS.yjs,\n  extendEditor: withPlateYjs,\n  options: {\n    _isConnected: false,\n    _isSynced: false,\n    _providers: [],\n    awareness: null!,\n    cursors: {},\n    localOrigin: null,\n    positionStorageOrigin: null,\n    providers: [],\n    ydoc: null!,\n    onConnect: () => {},\n    onDisconnect: () => {},\n    onError: () => {},\n    onSyncChange: () => {},\n  },\n})\n  .extend(({ getOptions }) => {\n    const { localOrigin, positionStorageOrigin, ...options } = getOptions();\n    let { awareness, ydoc } = options;\n\n    if (!ydoc) {\n      ydoc = new Y.Doc();\n    }\n\n    if (!awareness) {\n      awareness = new Awareness(ydoc);\n    }\n\n    return {\n      options: {\n        awareness,\n        localOrigin: localOrigin ?? undefined,\n        positionStorageOrigin: positionStorageOrigin ?? undefined,\n        ydoc,\n      },\n    };\n  })\n  .extendApi((ctx) => ({\n    /**\n     * Connect to all providers or specific provider types.\n     *\n     * @param type Optional provider type(s) to connect to. If not specified,\n     *   connects to all providers.\n     */\n    connect: (type?: YjsProviderType | YjsProviderType[]) => {\n      const { getOptions } = ctx;\n      const { _providers } = getOptions();\n      const typesToConnect = type\n        ? Array.isArray(type)\n          ? type\n          : [type]\n        : null;\n\n      _providers.forEach((provider) => {\n        if (!typesToConnect || typesToConnect.includes(provider.type)) {\n          try {\n            provider.connect();\n          } catch (error) {\n            getOptions().onError?.({\n              error: error instanceof Error ? error : new Error(String(error)),\n              type: provider.type,\n            });\n          }\n        }\n      });\n    },\n\n    /**\n     * Disconnect from all providers or specific provider types. For WebRTC\n     * providers, we should NOT disconnect on cleanup as it will clear the\n     * awareness state. Instead, we'll let the providers handle their own\n     * cleanup via their internal mechanisms.\n     *\n     * @param providerType Optional provider type(s) to disconnect from. If not\n     *   specified, disconnects from all providers.\n     */\n    destroy: () => {\n      const { editor, getOptions } = ctx;\n      const { _providers } = getOptions();\n\n      for (const provider of [..._providers].reverse()) {\n        try {\n          if (provider.isConnected) {\n            provider.destroy();\n          }\n        } catch (error) {\n          console.warn(\n            `[yjs] Error disconnecting provider (${provider.type}):`,\n            error\n          );\n        }\n      }\n\n      try {\n        YjsEditor.disconnect(editor as any);\n      } catch (error) {}\n    },\n    /**\n     * Disconnect from all providers or specific provider types. For WebRTC\n     * providers, we should NOT disconnect on cleanup as it will clear the\n     * awareness state. Instead, we'll let the providers handle their own\n     * cleanup via their internal mechanisms.\n     *\n     * @param providerType Optional provider type(s) to disconnect from. If not\n     *   specified, disconnects from all providers.\n     */\n    disconnect: (type?: YjsProviderType | YjsProviderType[]) => {\n      const { editor, getOptions } = ctx;\n      const { _providers } = getOptions();\n\n      const typesToDisconnect = type\n        ? Array.isArray(type)\n          ? type\n          : [type]\n        : null;\n\n      for (const provider of [..._providers].reverse()) {\n        try {\n          if (\n            provider.isConnected &&\n            (typesToDisconnect === null ||\n              typesToDisconnect.includes(provider.type))\n          ) {\n            provider.disconnect();\n          }\n        } catch (error) {\n          console.warn(\n            `[yjs] Error disconnecting provider (${provider.type}):`,\n            error\n          );\n        }\n      }\n    },\n\n    /** Initialize yjs, providers connection and editor state. */\n    init: async ({\n      id,\n      autoConnect = true,\n      autoSelect,\n      selection,\n      value,\n    }: {\n      /**\n       * Id of the document.\n       *\n       * @default editor.id\n       */\n      id?: string;\n      /**\n       * Whether to automatically connect to providers.\n       *\n       * @default true\n       */\n      autoConnect?: boolean;\n    } & Omit<InitOptions, 'shouldNormalizeEditor'> = {}) => {\n      const { editor, getOptions, setOption } = ctx;\n\n      const options = getOptions();\n      const {\n        _providers,\n        awareness,\n        providers: providerConfigsOrInstances = [],\n        ydoc,\n      } = options;\n\n      // Validate configuration\n      if (providerConfigsOrInstances.length === 0) {\n        throw new Error(\n          'No providers specified. Please provide provider configurations or instances in the `providers` array.'\n        );\n      }\n\n      if (value !== null) {\n        let initialNodes = value as Value;\n        if (typeof value === 'string') {\n          initialNodes = editor.api.html.deserialize({\n            element: value,\n          }) as Value;\n        } else if (typeof value === 'function') {\n          initialNodes = await value(editor);\n        } else if (value) {\n          initialNodes = value;\n        }\n        if (!initialNodes || initialNodes?.length === 0) {\n          initialNodes = editor.api.create.value();\n        }\n\n        const initialDelta = await slateToDeterministicYjsState(\n          id ?? editor.id,\n          initialNodes\n        );\n        ydoc.transact(() => {\n          Y.applyUpdate(ydoc, initialDelta);\n        });\n      }\n\n      // Final providers array that will contain both configured and custom providers\n      const finalProviders: UnifiedProvider[] = [];\n\n      // Connect the YjsEditor first to set up slate-yjs bindings.\n      YjsEditor.connect(editor as any);\n\n      editor.tf.init({\n        autoSelect,\n        selection,\n        // Skipped since YjsEditor.connect already normalizes the editor\n        shouldNormalizeEditor: false,\n        value: null,\n      });\n\n      // Then process and create providers\n      for (const item of providerConfigsOrInstances) {\n        if (isProviderConfig(item)) {\n          // It's a configuration object, create the provider\n          const { options, type } = item;\n\n          if (!options) {\n            console.warn(\n              `[yjs] No options provided for provider type: ${type}`\n            );\n            continue;\n          }\n\n          try {\n            // Create provider with shared handlers, Y.Doc, and Awareness\n            const provider = createProvider({\n              awareness,\n              doc: ydoc,\n              options,\n              type,\n              onConnect: () => {\n                getOptions().onConnect?.({ type });\n                // At least one provider is connected\n                setOption('_isConnected', true);\n              },\n              onDisconnect: () => {\n                getOptions().onDisconnect?.({ type });\n\n                // Check for any connected providers\n                const { _providers } = getOptions();\n                const hasConnectedProvider = _providers.some(\n                  (provider) => provider.isConnected\n                );\n                if (!hasConnectedProvider) {\n                  setOption('_isConnected', false);\n                }\n              },\n              onError: (error) => {\n                getOptions().onError?.({ error, type });\n              },\n              onSyncChange: (isSynced) => {\n                getOptions().onSyncChange?.({ isSynced, type });\n                setOption('_isSynced', isSynced);\n              },\n            });\n            finalProviders.push(provider);\n          } catch (error) {\n            console.warn(\n              `[yjs] Error creating provider of type ${type}:`,\n              error\n            );\n          }\n        } else {\n          // It's a pre-instantiated UnifiedProvider instance\n          const customProvider = item;\n\n          // Check if the provider's document matches our shared document\n          if (customProvider.document !== ydoc) {\n            console.warn(\n              `[yjs] Custom provider instance (${customProvider.type}) has a different Y.Doc. ` +\n                'This may cause synchronization issues. Ensure custom providers use the shared Y.Doc.'\n            );\n          }\n          // Check if the provider's awareness matches our shared awareness\n          if (customProvider.awareness !== awareness) {\n            console.warn(\n              `[yjs] Custom provider instance (${customProvider.type}) has a different Awareness instance. ` +\n                'Ensure custom providers use the shared Awareness instance for cursor consistency.'\n            );\n          }\n\n          // Add the custom provider to our providers array\n          finalProviders.push(customProvider);\n        }\n      }\n\n      if (finalProviders.length === 0) {\n        console.warn(\n          '[yjs] No providers were successfully created or provided.'\n        );\n      }\n\n      // Update provider counts after creation\n      setOption('_providers', finalProviders);\n\n      // Finally, connect providers if autoConnect is true\n      if (autoConnect) {\n        _providers.forEach((provider) => {\n          try {\n            provider.connect();\n          } catch (error) {\n            getOptions().onError?.({\n              error: error instanceof Error ? error : new Error(String(error)),\n              type: provider.type,\n            });\n          }\n        });\n      }\n    },\n  }));\n","/**\n * Common Math expressions.\n *\n * @module math\n */\n\nexport const floor = Math.floor\nexport const ceil = Math.ceil\nexport const abs = Math.abs\nexport const imul = Math.imul\nexport const round = Math.round\nexport const log10 = Math.log10\nexport const log2 = Math.log2\nexport const log = Math.log\nexport const sqrt = Math.sqrt\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The sum of a and b\n */\nexport const add = (a, b) => a + b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The smaller element of a and b\n */\nexport const min = (a, b) => a < b ? a : b\n\n/**\n * @function\n * @param {number} a\n * @param {number} b\n * @return {number} The bigger element of a and b\n */\nexport const max = (a, b) => a > b ? a : b\n\nexport const isNaN = Number.isNaN\n\nexport const pow = Math.pow\n/**\n * Base 10 exponential function. Returns the value of 10 raised to the power of pow.\n *\n * @param {number} exp\n * @return {number}\n */\nexport const exp10 = exp => Math.pow(10, exp)\n\nexport const sign = Math.sign\n\n/**\n * @param {number} n\n * @return {boolean} Wether n is negative. This function also differentiates between -0 and +0\n */\nexport const isNegativeZero = n => n !== 0 ? n < 0 : 1 / n < 0\n","/**\n * Utility module to work with sets.\n *\n * @module set\n */\n\nexport const create = () => new Set()\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {Array<T>}\n */\nexport const toArray = set => Array.from(set)\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {T}\n */\nexport const first = set =>\n  set.values().next().value ?? undefined\n\n/**\n * @template T\n * @param {Iterable<T>} entries\n * @return {Set<T>}\n */\nexport const from = entries => new Set(entries)\n","/**\n * Utility module to work with Arrays.\n *\n * @module array\n */\n\nimport * as set from './set.js'\n\n/**\n * Return the last element of an array. The element must exist\n *\n * @template L\n * @param {ArrayLike<L>} arr\n * @return {L}\n */\nexport const last = arr => arr[arr.length - 1]\n\n/**\n * @template C\n * @return {Array<C>}\n */\nexport const create = () => /** @type {Array<C>} */ ([])\n\n/**\n * @template D\n * @param {Array<D>} a\n * @return {Array<D>}\n */\nexport const copy = a => /** @type {Array<D>} */ (a.slice())\n\n/**\n * Append elements from src to dest\n *\n * @template M\n * @param {Array<M>} dest\n * @param {Array<M>} src\n */\nexport const appendTo = (dest, src) => {\n  for (let i = 0; i < src.length; i++) {\n    dest.push(src[i])\n  }\n}\n\n/**\n * Transforms something array-like to an actual Array.\n *\n * @function\n * @template T\n * @param {ArrayLike<T>|Iterable<T>} arraylike\n * @return {T}\n */\nexport const from = Array.from\n\n/**\n * True iff condition holds on every element in the Array.\n *\n * @function\n * @template ITEM\n * @template {ArrayLike<ITEM>} ARR\n *\n * @param {ARR} arr\n * @param {function(ITEM, number, ARR):boolean} f\n * @return {boolean}\n */\nexport const every = (arr, f) => {\n  for (let i = 0; i < arr.length; i++) {\n    if (!f(arr[i], i, arr)) {\n      return false\n    }\n  }\n  return true\n}\n\n/**\n * True iff condition holds on some element in the Array.\n *\n * @function\n * @template S\n * @template {ArrayLike<S>} ARR\n * @param {ARR} arr\n * @param {function(S, number, ARR):boolean} f\n * @return {boolean}\n */\nexport const some = (arr, f) => {\n  for (let i = 0; i < arr.length; i++) {\n    if (f(arr[i], i, arr)) {\n      return true\n    }\n  }\n  return false\n}\n\n/**\n * @template ELEM\n *\n * @param {ArrayLike<ELEM>} a\n * @param {ArrayLike<ELEM>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a.length === b.length && every(a, (item, index) => item === b[index])\n\n/**\n * @template ELEM\n * @param {Array<Array<ELEM>>} arr\n * @return {Array<ELEM>}\n */\nexport const flatten = arr => fold(arr, /** @type {Array<ELEM>} */ ([]), (acc, val) => acc.concat(val))\n\n/**\n * @template T\n * @param {number} len\n * @param {function(number, Array<T>):T} f\n * @return {Array<T>}\n */\nexport const unfold = (len, f) => {\n  const array = new Array(len)\n  for (let i = 0; i < len; i++) {\n    array[i] = f(i, array)\n  }\n  return array\n}\n\n/**\n * @template T\n * @template RESULT\n * @param {Array<T>} arr\n * @param {RESULT} seed\n * @param {function(RESULT, T, number):RESULT} folder\n */\nexport const fold = (arr, seed, folder) => arr.reduce(folder, seed)\n\nexport const isArray = Array.isArray\n\n/**\n * @template T\n * @param {Array<T>} arr\n * @return {Array<T>}\n */\nexport const unique = arr => from(set.from(arr))\n\n/**\n * @template T\n * @template M\n * @param {ArrayLike<T>} arr\n * @param {function(T):M} mapper\n * @return {Array<T>}\n */\nexport const uniqueBy = (arr, mapper) => {\n  /**\n   * @type {Set<M>}\n   */\n  const happened = set.create()\n  /**\n   * @type {Array<T>}\n   */\n  const result = []\n  for (let i = 0; i < arr.length; i++) {\n    const el = arr[i]\n    const mapped = mapper(el)\n    if (!happened.has(mapped)) {\n      happened.add(mapped)\n      result.push(el)\n    }\n  }\n  return result\n}\n\n/**\n * @template {ArrayLike<any>} ARR\n * @template {function(ARR extends ArrayLike<infer T> ? T : never, number, ARR):any} MAPPER\n * @param {ARR} arr\n * @param {MAPPER} mapper\n * @return {Array<MAPPER extends function(...any): infer M ? M : never>}\n */\nexport const map = (arr, mapper) => {\n  /**\n   * @type {Array<any>}\n   */\n  const res = Array(arr.length)\n  for (let i = 0; i < arr.length; i++) {\n    res[i] = mapper(/** @type {any} */ (arr[i]), i, /** @type {any} */ (arr))\n  }\n  return /** @type {any} */ (res)\n}\n","/**\n * Utility module to work with time.\n *\n * @module time\n */\n\nimport * as metric from './metric.js'\nimport * as math from './math.js'\n\n/**\n * Return current time.\n *\n * @return {Date}\n */\nexport const getDate = () => new Date()\n\n/**\n * Return current unix time.\n *\n * @return {number}\n */\nexport const getUnixTime = Date.now\n\n/**\n * Transform time (in ms) to a human readable format. E.g. 1100 => 1.1s. 60s => 1min. .001 => 10μs.\n *\n * @param {number} d duration in milliseconds\n * @return {string} humanized approximation of time\n */\nexport const humanizeDuration = d => {\n  if (d < 60000) {\n    const p = metric.prefix(d, -1)\n    return math.round(p.n * 100) / 100 + p.prefix + 's'\n  }\n  d = math.floor(d / 1000)\n  const seconds = d % 60\n  const minutes = math.floor(d / 60) % 60\n  const hours = math.floor(d / 3600) % 24\n  const days = math.floor(d / 86400)\n  if (days > 0) {\n    return days + 'd' + ((hours > 0 || minutes > 30) ? ' ' + (minutes > 30 ? hours + 1 : hours) + 'h' : '')\n  }\n  if (hours > 0) {\n    /* c8 ignore next */\n    return hours + 'h' + ((minutes > 0 || seconds > 30) ? ' ' + (seconds > 30 ? minutes + 1 : minutes) + 'min' : '')\n  }\n  return minutes + 'min' + (seconds > 0 ? ' ' + seconds + 's' : '')\n}\n","/**\n * Utility module to work with key-value stores.\n *\n * @module map\n */\n\n/**\n * Creates a new Map instance.\n *\n * @function\n * @return {Map<any, any>}\n *\n * @function\n */\nexport const create = () => new Map()\n\n/**\n * Copy a Map object into a fresh Map object.\n *\n * @function\n * @template K,V\n * @param {Map<K,V>} m\n * @return {Map<K,V>}\n */\nexport const copy = m => {\n  const r = create()\n  m.forEach((v, k) => { r.set(k, v) })\n  return r\n}\n\n/**\n * Get map property. Create T if property is undefined and set T on map.\n *\n * ```js\n * const listeners = map.setIfUndefined(events, 'eventName', set.create)\n * listeners.add(listener)\n * ```\n *\n * @function\n * @template {Map<any, any>} MAP\n * @template {MAP extends Map<any,infer V> ? function():V : unknown} CF\n * @param {MAP} map\n * @param {MAP extends Map<infer K,any> ? K : unknown} key\n * @param {CF} createT\n * @return {ReturnType<CF>}\n */\nexport const setIfUndefined = (map, key, createT) => {\n  let set = map.get(key)\n  if (set === undefined) {\n    map.set(key, set = createT())\n  }\n  return set\n}\n\n/**\n * Creates an Array and populates it with the content of all key-value pairs using the `f(value, key)` function.\n *\n * @function\n * @template K\n * @template V\n * @template R\n * @param {Map<K,V>} m\n * @param {function(V,K):R} f\n * @return {Array<R>}\n */\nexport const map = (m, f) => {\n  const res = []\n  for (const [key, value] of m) {\n    res.push(f(value, key))\n  }\n  return res\n}\n\n/**\n * Tests whether any key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @todo should rename to some - similarly to Array.some\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const any = (m, f) => {\n  for (const [key, value] of m) {\n    if (f(value, key)) {\n      return true\n    }\n  }\n  return false\n}\n\n/**\n * Tests whether all key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const all = (m, f) => {\n  for (const [key, value] of m) {\n    if (!f(value, key)) {\n      return false\n    }\n  }\n  return true\n}\n","/**\n * Observable class prototype.\n *\n * @module observable\n */\n\nimport * as map from './map.js'\nimport * as set from './set.js'\nimport * as array from './array.js'\n\n/**\n * Handles named events.\n * @experimental\n *\n * This is basically a (better typed) duplicate of Observable, which will replace Observable in the\n * next release.\n *\n * @template {{[key in keyof EVENTS]: function(...any):void}} EVENTS\n */\nexport class ObservableV2 {\n  constructor () {\n    /**\n     * Some desc.\n     * @type {Map<string, Set<any>>}\n     */\n    this._observers = map.create()\n  }\n\n  /**\n   * @template {keyof EVENTS & string} NAME\n   * @param {NAME} name\n   * @param {EVENTS[NAME]} f\n   */\n  on (name, f) {\n    map.setIfUndefined(this._observers, /** @type {string} */ (name), set.create).add(f)\n    return f\n  }\n\n  /**\n   * @template {keyof EVENTS & string} NAME\n   * @param {NAME} name\n   * @param {EVENTS[NAME]} f\n   */\n  once (name, f) {\n    /**\n     * @param  {...any} args\n     */\n    const _f = (...args) => {\n      this.off(name, /** @type {any} */ (_f))\n      f(...args)\n    }\n    this.on(name, /** @type {any} */ (_f))\n  }\n\n  /**\n   * @template {keyof EVENTS & string} NAME\n   * @param {NAME} name\n   * @param {EVENTS[NAME]} f\n   */\n  off (name, f) {\n    const observers = this._observers.get(name)\n    if (observers !== undefined) {\n      observers.delete(f)\n      if (observers.size === 0) {\n        this._observers.delete(name)\n      }\n    }\n  }\n\n  /**\n   * Emit a named event. All registered event listeners that listen to the\n   * specified name will receive the event.\n   *\n   * @todo This should catch exceptions\n   *\n   * @template {keyof EVENTS & string} NAME\n   * @param {NAME} name The event name.\n   * @param {Parameters<EVENTS[NAME]>} args The arguments that are applied to the event listener.\n   */\n  emit (name, args) {\n    // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n    return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n  }\n\n  destroy () {\n    this._observers = map.create()\n  }\n}\n\n/* c8 ignore start */\n/**\n * Handles named events.\n *\n * @deprecated\n * @template N\n */\nexport class Observable {\n  constructor () {\n    /**\n     * Some desc.\n     * @type {Map<N, any>}\n     */\n    this._observers = map.create()\n  }\n\n  /**\n   * @param {N} name\n   * @param {function} f\n   */\n  on (name, f) {\n    map.setIfUndefined(this._observers, name, set.create).add(f)\n  }\n\n  /**\n   * @param {N} name\n   * @param {function} f\n   */\n  once (name, f) {\n    /**\n     * @param  {...any} args\n     */\n    const _f = (...args) => {\n      this.off(name, _f)\n      f(...args)\n    }\n    this.on(name, _f)\n  }\n\n  /**\n   * @param {N} name\n   * @param {function} f\n   */\n  off (name, f) {\n    const observers = this._observers.get(name)\n    if (observers !== undefined) {\n      observers.delete(f)\n      if (observers.size === 0) {\n        this._observers.delete(name)\n      }\n    }\n  }\n\n  /**\n   * Emit a named event. All registered event listeners that listen to the\n   * specified name will receive the event.\n   *\n   * @todo This should catch exceptions\n   *\n   * @param {N} name The event name.\n   * @param {Array<any>} args The arguments that are applied to the event listener.\n   */\n  emit (name, args) {\n    // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n    return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n  }\n\n  destroy () {\n    this._observers = map.create()\n  }\n}\n/* c8 ignore end */\n","/**\n * Utility functions for working with EcmaScript objects.\n *\n * @module object\n */\n\n/**\n * @return {Object<string,any>} obj\n */\nexport const create = () => Object.create(null)\n\n/**\n * Object.assign\n */\nexport const assign = Object.assign\n\n/**\n * @param {Object<string,any>} obj\n */\nexport const keys = Object.keys\n\n/**\n * @template V\n * @param {{[k:string]:V}} obj\n * @param {function(V,string):any} f\n */\nexport const forEach = (obj, f) => {\n  for (const key in obj) {\n    f(obj[key], key)\n  }\n}\n\n/**\n * @todo implement mapToArray & map\n *\n * @template R\n * @param {Object<string,any>} obj\n * @param {function(any,string):R} f\n * @return {Array<R>}\n */\nexport const map = (obj, f) => {\n  const results = []\n  for (const key in obj) {\n    results.push(f(obj[key], key))\n  }\n  return results\n}\n\n/**\n * @deprecated use object.size instead\n * @param {Object<string,any>} obj\n * @return {number}\n */\nexport const length = obj => keys(obj).length\n\n/**\n * @param {Object<string,any>} obj\n * @return {number}\n */\nexport const size = obj => keys(obj).length\n\n/**\n * @param {Object<string,any>} obj\n * @param {function(any,string):boolean} f\n * @return {boolean}\n */\nexport const some = (obj, f) => {\n  for (const key in obj) {\n    if (f(obj[key], key)) {\n      return true\n    }\n  }\n  return false\n}\n\n/**\n * @param {Object|undefined} obj\n */\nexport const isEmpty = obj => {\n  // eslint-disable-next-line\n  for (const _k in obj) {\n    return false\n  }\n  return true\n}\n\n/**\n * @param {Object<string,any>} obj\n * @param {function(any,string):boolean} f\n * @return {boolean}\n */\nexport const every = (obj, f) => {\n  for (const key in obj) {\n    if (!f(obj[key], key)) {\n      return false\n    }\n  }\n  return true\n}\n\n/**\n * Calls `Object.prototype.hasOwnProperty`.\n *\n * @param {any} obj\n * @param {string|symbol} key\n * @return {boolean}\n */\nexport const hasProperty = (obj, key) => Object.prototype.hasOwnProperty.call(obj, key)\n\n/**\n * @param {Object<string,any>} a\n * @param {Object<string,any>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a === b || (size(a) === size(b) && every(a, (val, key) => (val !== undefined || hasProperty(b, key)) && b[key] === val))\n\n/**\n * Make an object immutable. This hurts performance and is usually not needed if you perform good\n * coding practices.\n */\nexport const freeze = Object.freeze\n\n/**\n * Make an object and all its children immutable.\n * This *really* hurts performance and is usually not needed if you perform good coding practices.\n *\n * @template {any} T\n * @param {T} o\n * @return {Readonly<T>}\n */\nexport const deepFreeze = (o) => {\n  for (const key in o) {\n    const c = o[key]\n    if (typeof c === 'object' || typeof c === 'function') {\n      deepFreeze(o[key])\n    }\n  }\n  return freeze(o)\n}\n","/**\n * Common functions and function call helpers.\n *\n * @module function\n */\n\nimport * as array from './array.js'\nimport * as object from './object.js'\n\n/**\n * Calls all functions in `fs` with args. Only throws after all functions were called.\n *\n * @param {Array<function>} fs\n * @param {Array<any>} args\n */\nexport const callAll = (fs, args, i = 0) => {\n  try {\n    for (; i < fs.length; i++) {\n      fs[i](...args)\n    }\n  } finally {\n    if (i < fs.length) {\n      callAll(fs, args, i + 1)\n    }\n  }\n}\n\nexport const nop = () => {}\n\n/**\n * @template T\n * @param {function():T} f\n * @return {T}\n */\nexport const apply = f => f()\n\n/**\n * @template A\n *\n * @param {A} a\n * @return {A}\n */\nexport const id = a => a\n\n/**\n * @template T\n *\n * @param {T} a\n * @param {T} b\n * @return {boolean}\n */\nexport const equalityStrict = (a, b) => a === b\n\n/**\n * @template T\n *\n * @param {Array<T>|object} a\n * @param {Array<T>|object} b\n * @return {boolean}\n */\nexport const equalityFlat = (a, b) => a === b || (a != null && b != null && a.constructor === b.constructor && ((array.isArray(a) && array.equalFlat(a, /** @type {Array<T>} */ (b))) || (typeof a === 'object' && object.equalFlat(a, b))))\n\n/* c8 ignore start */\n\n/**\n * @param {any} a\n * @param {any} b\n * @return {boolean}\n */\nexport const equalityDeep = (a, b) => {\n  if (a == null || b == null) {\n    return equalityStrict(a, b)\n  }\n  if (a.constructor !== b.constructor) {\n    return false\n  }\n  if (a === b) {\n    return true\n  }\n  switch (a.constructor) {\n    case ArrayBuffer:\n      a = new Uint8Array(a)\n      b = new Uint8Array(b)\n    // eslint-disable-next-line no-fallthrough\n    case Uint8Array: {\n      if (a.byteLength !== b.byteLength) {\n        return false\n      }\n      for (let i = 0; i < a.length; i++) {\n        if (a[i] !== b[i]) {\n          return false\n        }\n      }\n      break\n    }\n    case Set: {\n      if (a.size !== b.size) {\n        return false\n      }\n      for (const value of a) {\n        if (!b.has(value)) {\n          return false\n        }\n      }\n      break\n    }\n    case Map: {\n      if (a.size !== b.size) {\n        return false\n      }\n      for (const key of a.keys()) {\n        if (!b.has(key) || !equalityDeep(a.get(key), b.get(key))) {\n          return false\n        }\n      }\n      break\n    }\n    case Object:\n      if (object.length(a) !== object.length(b)) {\n        return false\n      }\n      for (const key in a) {\n        if (!object.hasProperty(a, key) || !equalityDeep(a[key], b[key])) {\n          return false\n        }\n      }\n      break\n    case Array:\n      if (a.length !== b.length) {\n        return false\n      }\n      for (let i = 0; i < a.length; i++) {\n        if (!equalityDeep(a[i], b[i])) {\n          return false\n        }\n      }\n      break\n    default:\n      return false\n  }\n  return true\n}\n\n/**\n * @template V\n * @template {V} OPTS\n *\n * @param {V} value\n * @param {Array<OPTS>} options\n */\n// @ts-ignore\nexport const isOneOf = (value, options) => options.includes(value)\n/* c8 ignore stop */\n\nexport const isArray = array.isArray\n\n/**\n * @param {any} s\n * @return {s is String}\n */\nexport const isString = (s) => s && s.constructor === String\n\n/**\n * @param {any} n\n * @return {n is Number}\n */\nexport const isNumber = n => n != null && n.constructor === Number\n\n/**\n * @template {abstract new (...args: any) => any} TYPE\n * @param {any} n\n * @param {TYPE} T\n * @return {n is InstanceType<TYPE>}\n */\nexport const is = (n, T) => n && n.constructor === T\n\n/**\n * @template {abstract new (...args: any) => any} TYPE\n * @param {TYPE} T\n */\nexport const isTemplate = (T) =>\n  /**\n   * @param {any} n\n   * @return {n is InstanceType<TYPE>}\n   **/\n  n => n && n.constructor === T\n","/**\n * @module awareness-protocol\n */\n\nimport * as encoding from 'lib0/encoding'\nimport * as decoding from 'lib0/decoding'\nimport * as time from 'lib0/time'\nimport * as math from 'lib0/math'\nimport { Observable } from 'lib0/observable'\nimport * as f from 'lib0/function'\nimport * as Y from 'yjs' // eslint-disable-line\n\nexport const outdatedTimeout = 30000\n\n/**\n * @typedef {Object} MetaClientState\n * @property {number} MetaClientState.clock\n * @property {number} MetaClientState.lastUpdated unix timestamp\n */\n\n/**\n * The Awareness class implements a simple shared state protocol that can be used for non-persistent data like awareness information\n * (cursor, username, status, ..). Each client can update its own local state and listen to state changes of\n * remote clients. Every client may set a state of a remote peer to `null` to mark the client as offline.\n *\n * Each client is identified by a unique client id (something we borrow from `doc.clientID`). A client can override\n * its own state by propagating a message with an increasing timestamp (`clock`). If such a message is received, it is\n * applied if the known state of that client is older than the new state (`clock < newClock`). If a client thinks that\n * a remote client is offline, it may propagate a message with\n * `{ clock: currentClientClock, state: null, client: remoteClient }`. If such a\n * message is received, and the known clock of that client equals the received clock, it will override the state with `null`.\n *\n * Before a client disconnects, it should propagate a `null` state with an updated clock.\n *\n * Awareness states must be updated every 30 seconds. Otherwise the Awareness instance will delete the client state.\n *\n * @extends {Observable<string>}\n */\nexport class Awareness extends Observable {\n  /**\n   * @param {Y.Doc} doc\n   */\n  constructor (doc) {\n    super()\n    this.doc = doc\n    /**\n     * @type {number}\n     */\n    this.clientID = doc.clientID\n    /**\n     * Maps from client id to client state\n     * @type {Map<number, Object<string, any>>}\n     */\n    this.states = new Map()\n    /**\n     * @type {Map<number, MetaClientState>}\n     */\n    this.meta = new Map()\n    this._checkInterval = /** @type {any} */ (setInterval(() => {\n      const now = time.getUnixTime()\n      if (this.getLocalState() !== null && (outdatedTimeout / 2 <= now - /** @type {{lastUpdated:number}} */ (this.meta.get(this.clientID)).lastUpdated)) {\n        // renew local clock\n        this.setLocalState(this.getLocalState())\n      }\n      /**\n       * @type {Array<number>}\n       */\n      const remove = []\n      this.meta.forEach((meta, clientid) => {\n        if (clientid !== this.clientID && outdatedTimeout <= now - meta.lastUpdated && this.states.has(clientid)) {\n          remove.push(clientid)\n        }\n      })\n      if (remove.length > 0) {\n        removeAwarenessStates(this, remove, 'timeout')\n      }\n    }, math.floor(outdatedTimeout / 10)))\n    doc.on('destroy', () => {\n      this.destroy()\n    })\n    this.setLocalState({})\n  }\n\n  destroy () {\n    this.emit('destroy', [this])\n    this.setLocalState(null)\n    super.destroy()\n    clearInterval(this._checkInterval)\n  }\n\n  /**\n   * @return {Object<string,any>|null}\n   */\n  getLocalState () {\n    return this.states.get(this.clientID) || null\n  }\n\n  /**\n   * @param {Object<string,any>|null} state\n   */\n  setLocalState (state) {\n    const clientID = this.clientID\n    const currLocalMeta = this.meta.get(clientID)\n    const clock = currLocalMeta === undefined ? 0 : currLocalMeta.clock + 1\n    const prevState = this.states.get(clientID)\n    if (state === null) {\n      this.states.delete(clientID)\n    } else {\n      this.states.set(clientID, state)\n    }\n    this.meta.set(clientID, {\n      clock,\n      lastUpdated: time.getUnixTime()\n    })\n    const added = []\n    const updated = []\n    const filteredUpdated = []\n    const removed = []\n    if (state === null) {\n      removed.push(clientID)\n    } else if (prevState == null) {\n      if (state != null) {\n        added.push(clientID)\n      }\n    } else {\n      updated.push(clientID)\n      if (!f.equalityDeep(prevState, state)) {\n        filteredUpdated.push(clientID)\n      }\n    }\n    if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) {\n      this.emit('change', [{ added, updated: filteredUpdated, removed }, 'local'])\n    }\n    this.emit('update', [{ added, updated, removed }, 'local'])\n  }\n\n  /**\n   * @param {string} field\n   * @param {any} value\n   */\n  setLocalStateField (field, value) {\n    const state = this.getLocalState()\n    if (state !== null) {\n      this.setLocalState({\n        ...state,\n        [field]: value\n      })\n    }\n  }\n\n  /**\n   * @return {Map<number,Object<string,any>>}\n   */\n  getStates () {\n    return this.states\n  }\n}\n\n/**\n * Mark (remote) clients as inactive and remove them from the list of active peers.\n * This change will be propagated to remote clients.\n *\n * @param {Awareness} awareness\n * @param {Array<number>} clients\n * @param {any} origin\n */\nexport const removeAwarenessStates = (awareness, clients, origin) => {\n  const removed = []\n  for (let i = 0; i < clients.length; i++) {\n    const clientID = clients[i]\n    if (awareness.states.has(clientID)) {\n      awareness.states.delete(clientID)\n      if (clientID === awareness.clientID) {\n        const curMeta = /** @type {MetaClientState} */ (awareness.meta.get(clientID))\n        awareness.meta.set(clientID, {\n          clock: curMeta.clock + 1,\n          lastUpdated: time.getUnixTime()\n        })\n      }\n      removed.push(clientID)\n    }\n  }\n  if (removed.length > 0) {\n    awareness.emit('change', [{ added: [], updated: [], removed }, origin])\n    awareness.emit('update', [{ added: [], updated: [], removed }, origin])\n  }\n}\n\n/**\n * @param {Awareness} awareness\n * @param {Array<number>} clients\n * @return {Uint8Array}\n */\nexport const encodeAwarenessUpdate = (awareness, clients, states = awareness.states) => {\n  const len = clients.length\n  const encoder = encoding.createEncoder()\n  encoding.writeVarUint(encoder, len)\n  for (let i = 0; i < len; i++) {\n    const clientID = clients[i]\n    const state = states.get(clientID) || null\n    const clock = /** @type {MetaClientState} */ (awareness.meta.get(clientID)).clock\n    encoding.writeVarUint(encoder, clientID)\n    encoding.writeVarUint(encoder, clock)\n    encoding.writeVarString(encoder, JSON.stringify(state))\n  }\n  return encoding.toUint8Array(encoder)\n}\n\n/**\n * Modify the content of an awareness update before re-encoding it to an awareness update.\n *\n * This might be useful when you have a central server that wants to ensure that clients\n * cant hijack somebody elses identity.\n *\n * @param {Uint8Array} update\n * @param {function(any):any} modify\n * @return {Uint8Array}\n */\nexport const modifyAwarenessUpdate = (update, modify) => {\n  const decoder = decoding.createDecoder(update)\n  const encoder = encoding.createEncoder()\n  const len = decoding.readVarUint(decoder)\n  encoding.writeVarUint(encoder, len)\n  for (let i = 0; i < len; i++) {\n    const clientID = decoding.readVarUint(decoder)\n    const clock = decoding.readVarUint(decoder)\n    const state = JSON.parse(decoding.readVarString(decoder))\n    const modifiedState = modify(state)\n    encoding.writeVarUint(encoder, clientID)\n    encoding.writeVarUint(encoder, clock)\n    encoding.writeVarString(encoder, JSON.stringify(modifiedState))\n  }\n  return encoding.toUint8Array(encoder)\n}\n\n/**\n * @param {Awareness} awareness\n * @param {Uint8Array} update\n * @param {any} origin This will be added to the emitted change event\n */\nexport const applyAwarenessUpdate = (awareness, update, origin) => {\n  const decoder = decoding.createDecoder(update)\n  const timestamp = time.getUnixTime()\n  const added = []\n  const updated = []\n  const filteredUpdated = []\n  const removed = []\n  const len = decoding.readVarUint(decoder)\n  for (let i = 0; i < len; i++) {\n    const clientID = decoding.readVarUint(decoder)\n    let clock = decoding.readVarUint(decoder)\n    const state = JSON.parse(decoding.readVarString(decoder))\n    const clientMeta = awareness.meta.get(clientID)\n    const prevState = awareness.states.get(clientID)\n    const currClock = clientMeta === undefined ? 0 : clientMeta.clock\n    if (currClock < clock || (currClock === clock && state === null && awareness.states.has(clientID))) {\n      if (state === null) {\n        // never let a remote client remove this local state\n        if (clientID === awareness.clientID && awareness.getLocalState() != null) {\n          // remote client removed the local state. Do not remote state. Broadcast a message indicating\n          // that this client still exists by increasing the clock\n          clock++\n        } else {\n          awareness.states.delete(clientID)\n        }\n      } else {\n        awareness.states.set(clientID, state)\n      }\n      awareness.meta.set(clientID, {\n        clock,\n        lastUpdated: timestamp\n      })\n      if (clientMeta === undefined && state !== null) {\n        added.push(clientID)\n      } else if (clientMeta !== undefined && state === null) {\n        removed.push(clientID)\n      } else if (state !== null) {\n        if (!f.equalityDeep(state, prevState)) {\n          filteredUpdated.push(clientID)\n        }\n        updated.push(clientID)\n      }\n    }\n  }\n  if (added.length > 0 || filteredUpdated.length > 0 || removed.length > 0) {\n    awareness.emit('change', [{\n      added, updated: filteredUpdated, removed\n    }, origin])\n  }\n  if (added.length > 0 || updated.length > 0 || removed.length > 0) {\n    awareness.emit('update', [{\n      added, updated, removed\n    }, origin])\n  }\n}\n","import type { Value } from '@udecode/plate';\n\nimport { slateNodesToInsertDelta } from '@slate-yjs/core';\nimport * as Y from 'yjs';\n\n/**\n * Produce the canonical \"initial update\" from a Slate node array using a\n * deterministically generated clientID based on guid and initialNodes.\n *\n * Every peer can call this _locally_ and get **bit‑identical** bytes, provided\n * `guid` and `initialNodes` are the same.\n */\nexport async function slateToDeterministicYjsState(\n  guid: string, // use doc/room id\n  initialNodes: Value // your template\n): Promise<Uint8Array> {\n  //  Generate clientID deterministically\n  const deterministicClientId = await generateDeterministicClientId(\n    guid,\n    initialNodes\n  );\n\n  // 2Build the update in a temp doc with the deterministic clientID\n  const tmp = new Y.Doc({ guid });\n  tmp.clientID = deterministicClientId;\n\n  const delta = slateNodesToInsertDelta(initialNodes);\n  const content = tmp.get('content', Y.XmlText) as Y.XmlText;\n  content.applyDelta(delta);\n  const initialUpdate = Y.encodeStateAsUpdate(tmp);\n  tmp.destroy();\n  return initialUpdate;\n}\n\n// Helper to convert ArrayBuffer to a non-negative 31-bit integer + 1\nfunction arrayBufferToClientId(buffer: ArrayBuffer): number {\n  const dataView = new DataView(buffer);\n  // Use the first 4 bytes (32 bits)\n  const int32 = dataView.getInt32(0, false); // false for big-endian\n  // Take absolute value, modulo 2^31 - 1 to fit in signed 31 bits, and add 1 to ensure non-zero.\n  // (2**31 - 1 is 0x7FFFFFFF)\n  // eslint-disable-next-line unicorn/number-literal-case\n  return (Math.abs(int32) % 0x7f_ff_ff_ff) + 1;\n}\n\n/**\n * Generates a deterministic Yjs clientID based on a GUID and initial Slate\n * nodes using the Web Crypto API (SHA-256).\n */\nasync function generateDeterministicClientId(\n  guid: string,\n  initialNodes: Value\n): Promise<number> {\n  const nodesString = JSON.stringify(initialNodes);\n  const combinedString = `${guid}-${nodesString}`;\n  const encoder = new TextEncoder();\n  const data = encoder.encode(combinedString);\n  const hashBuffer = await window.crypto.subtle.digest('SHA-256', data);\n\n  return arrayBufferToClientId(hashBuffer);\n}\n","import type {\n  HocuspocusProviderConfiguration,\n  onDisconnectParameters,\n  onSyncedParameters,\n} from '@hocuspocus/provider';\nimport type { Awareness } from 'y-protocols/awareness';\nimport type * as Y from 'yjs';\n\nimport { HocuspocusProvider } from '@hocuspocus/provider';\n\nimport type {\n  ProviderEventHandlers,\n  UnifiedProvider,\n  YjsProviderType,\n} from './types';\n\nexport class HocuspocusProviderWrapper implements UnifiedProvider {\n  private _isConnected = false;\n  private _isSynced = false;\n  private onConnect?: () => void;\n  private onDisconnect?: () => void;\n  private onError?: (error: Error) => void;\n  private onSyncChange?: (isSynced: boolean) => void;\n  private provider: HocuspocusProvider;\n\n  destroy = () => {\n    if (this._isConnected) {\n      this.provider.disconnect();\n    }\n  };\n  disconnect = () => {\n    if (this._isConnected) {\n      this.provider.disconnect();\n      this._isConnected = false;\n\n      // If we were synced, notify about sync state change\n      if (this._isSynced) {\n        this._isSynced = false;\n        this?.onSyncChange?.(false);\n      }\n    }\n  };\n\n  type: YjsProviderType = 'hocuspocus';\n\n  constructor({\n    awareness,\n    doc,\n    options,\n    onConnect,\n    onDisconnect,\n    onError,\n    onSyncChange,\n  }: {\n    options: HocuspocusProviderConfiguration;\n    awareness?: Awareness;\n    doc?: Y.Doc;\n  } & ProviderEventHandlers) {\n    this.onConnect = onConnect;\n    this.onDisconnect = onDisconnect;\n    this.onSyncChange = onSyncChange;\n    this.onError = onError;\n\n    // If an existing Y.Doc is provided, ensure it's passed to the HocuspocusProvider\n    const providerOptions: HocuspocusProviderConfiguration = {\n      ...options,\n      ...(doc && { document: doc }),\n      ...(awareness && { awareness }),\n      // Disable broadcast channel here - we'll manually handle connections\n      broadcast: options.broadcast || false,\n      onAwarenessChange: options.onAwarenessChange || (() => {}),\n      onConnect: () => {\n        this._isConnected = true;\n        this.onConnect?.();\n        options.onConnect?.();\n      },\n      onDisconnect: (data: onDisconnectParameters) => {\n        this._isConnected = false;\n\n        // If we were synced, notify about sync state change\n        if (this._isSynced) {\n          this._isSynced = false;\n          this.onSyncChange?.(false);\n        }\n\n        this.onDisconnect?.();\n        options.onDisconnect?.(data);\n      },\n      onSynced: (data: onSyncedParameters) => {\n        const wasSynced = this._isSynced;\n        this._isSynced = true;\n\n        // Call onSyncChange only when sync state changes\n        if (!wasSynced) {\n          this.onSyncChange?.(true);\n        }\n\n        options.onSynced?.(data);\n      },\n    };\n\n    try {\n      this.provider = new HocuspocusProvider(providerOptions);\n    } catch (error) {\n      // Create a minimal provider that won't try to connect\n      this.provider = new HocuspocusProvider({\n        ...providerOptions,\n        connect: false,\n      });\n      this.onError?.(error instanceof Error ? error : new Error(String(error)));\n    }\n  }\n\n  connect() {\n    try {\n      void this.provider.connect();\n    } catch (error) {\n      this._isConnected = false;\n    }\n  }\n\n  get awareness() {\n    return this.provider.awareness!;\n  }\n\n  get document() {\n    return this.provider.document;\n  }\n\n  get isConnected() {\n    return this._isConnected;\n  }\n\n  get isSynced() {\n    return this._isSynced;\n  }\n}\n","import type { Awareness } from 'y-protocols/awareness';\n\nimport { WebrtcProvider as YWebrtcProvider } from 'y-webrtc';\nimport * as Y from 'yjs';\n\nimport type {\n  ProviderEventHandlers,\n  UnifiedProvider,\n  WebRTCProviderOptions,\n  YjsProviderType,\n} from './types';\n\nexport class WebRTCProviderWrapper implements UnifiedProvider {\n  // Track connection and sync state\n  private _isConnected = false;\n  private _isSynced = false;\n  private doc: Y.Doc;\n\n  private onConnect?: () => void;\n  private onDisconnect?: () => void;\n  private onError?: (error: Error) => void;\n  private onSyncChange?: (isSynced: boolean) => void;\n  // Create a fallback awareness instance for when provider is null\n  private provider: YWebrtcProvider | null = null;\n\n  connect = () => {\n    if (this.provider) {\n      try {\n        this.provider.connect();\n      } catch (error) {\n        console.warn('[yjs] Error connecting WebRTC provider:', error);\n      }\n    }\n  };\n\n  destroy = () => {\n    if (this.provider) {\n      try {\n        this.provider.destroy();\n      } catch (error) {\n        console.warn('[yjs] Error destroying WebRTC provider:', error);\n      }\n    }\n  };\n\n  disconnect = () => {\n    if (this.provider) {\n      try {\n        this.provider.disconnect();\n        const wasSynced = this._isSynced;\n\n        this._isConnected = false;\n        this._isSynced = false;\n\n        // If we were synced, notify about sync state change\n        if (wasSynced) {\n          this.onSyncChange?.(false);\n        }\n      } catch (error) {\n        console.warn('[yjs] Error disconnecting WebRTC provider:', error);\n      }\n    }\n  };\n\n  type: YjsProviderType = 'webrtc';\n\n  // Autoconnects when created\n  constructor({\n    awareness,\n    doc,\n    options,\n    onConnect,\n    onDisconnect,\n    onError,\n    onSyncChange,\n  }: {\n    options: WebRTCProviderOptions;\n    awareness?: Awareness;\n    doc?: Y.Doc;\n  } & ProviderEventHandlers) {\n    this.onConnect = onConnect;\n    this.onDisconnect = onDisconnect;\n    this.onError = onError;\n    this.onSyncChange = onSyncChange;\n\n    this.doc = doc || new Y.Doc();\n    try {\n      this.provider = new YWebrtcProvider(options.roomName, this.doc, {\n        awareness: awareness,\n        filterBcConns: options.filterBcConns,\n        maxConns: options.maxConns,\n        password: options.password,\n        peerOpts: options.peerOpts,\n        signaling: options.signaling,\n      });\n\n      // Set connection status\n      this.provider.on('status', (status: { connected: boolean }) => {\n        const wasConnected = this._isConnected;\n        this._isConnected = status.connected;\n\n        if (status.connected) {\n          // Notify about connection only if it wasn't connected before\n          if (!wasConnected) {\n            onConnect?.();\n          }\n          // Treat first connection as sync for P2P, trigger sync change if not already synced\n          if (!this._isSynced) {\n            this._isSynced = true;\n            onSyncChange?.(true);\n          }\n        } else {\n          // Handle disconnection only if it was connected before\n          if (wasConnected) {\n            onDisconnect?.();\n\n            // Explicitly set synced to false on disconnect if it was true\n            // This ensures onSyncChange(false) is called reliably\n            if (this._isSynced) {\n              this._isSynced = false;\n              onSyncChange?.(false);\n            }\n          }\n        }\n      });\n    } catch (error) {\n      console.warn('[yjs] Error creating WebRTC provider:', error);\n      onError?.(error instanceof Error ? error : new Error(String(error)));\n      // Don't throw, just log the error - the provider will be null\n    }\n  }\n\n  get awareness(): Awareness {\n    return this.provider!.awareness;\n  }\n\n  get document() {\n    return this.doc;\n  }\n\n  get isConnected() {\n    return this._isConnected;\n  }\n\n  get isSynced() {\n    return this._isSynced;\n  }\n}\n","import type {\n  ProviderConstructor,\n  ProviderConstructorProps,\n  ProviderRegistry,\n  YjsProviderType,\n} from './types';\n\nimport { HocuspocusProviderWrapper } from './hocuspocus-provider';\nimport { WebRTCProviderWrapper } from './webrtc-provider';\n\n// Provider registry for extensibility\nconst providerRegistry: ProviderRegistry = {\n  hocuspocus: HocuspocusProviderWrapper,\n  webrtc: WebRTCProviderWrapper,\n};\n\n// Register a new provider type\nexport const registerProviderType = <T>(\n  type: string,\n  providerClass: ProviderConstructor<T>\n) => {\n  providerRegistry[type as YjsProviderType] =\n    providerClass as ProviderConstructor;\n};\n\n// Get a provider constructor by type\nexport const getProviderClass = (\n  type: YjsProviderType\n): ProviderConstructor | undefined => {\n  return providerRegistry[type];\n};\n\n// Create a provider instance\nexport const createProvider = ({\n  type,\n  ...props\n}: ProviderConstructorProps & {\n  type: YjsProviderType;\n}) => {\n  const ProviderClass = getProviderClass(type);\n\n  if (!ProviderClass) {\n    throw new Error(`Provider type \"${type}\" not found in registry`);\n  }\n\n  return new ProviderClass(props);\n};\n","import type { ExtendEditor, SlateEditor } from '@udecode/plate';\n\nimport * as Y from 'yjs';\n\nimport type { YjsConfig } from './providers/types';\n\nimport { type PlateYjsEditorProps, withTCursors } from './withTCursors';\nimport { withTYHistory } from './withTYHistory';\nimport { type YjsEditorProps, withTYjs } from './withTYjs';\n\nexport const withPlateYjs: ExtendEditor<YjsConfig> = ({\n  editor: e,\n  getOptions,\n}) => {\n  let editor = e as unknown as PlateYjsEditorProps &\n    SlateEditor &\n    YjsEditorProps;\n\n  const { awareness, cursors, localOrigin, positionStorageOrigin, ydoc } =\n    getOptions();\n\n  // Get the shared document type from the Y.Doc\n  const sharedType = ydoc!.get('content', Y.XmlText) as Y.XmlText;\n\n  // Apply core Yjs binding first\n  editor = withTYjs(editor, sharedType, {\n    autoConnect: false,\n    localOrigin,\n    positionStorageOrigin,\n  }) as any;\n\n  // Apply YJS transformations to the editor\n  // Conditionally apply cursor support based on cursors\n  if (cursors) {\n    // Use the shared awareness instance for cursors\n    if (awareness) {\n      let autoSend = true;\n\n      if (cursors.autoSend === false) {\n        autoSend = false;\n      }\n\n      editor = withTCursors(editor, awareness, {\n        ...cursors,\n        autoSend,\n      });\n    } else {\n      // This also shouldn't happen if BaseYjsPlugin ran correctly\n      editor.api.debug.error(\n        'Yjs plugin: Internal shared awareness (awareness) is missing but cursors are enabled.'\n      );\n    }\n  }\n\n  // Apply history last\n  return withTYHistory(editor);\n};\n","import type { SlateEditor } from '@udecode/plate';\nimport type { Awareness } from 'y-protocols/awareness';\n\nimport {\n  type CursorEditor,\n  type WithCursorsOptions,\n  withCursors,\n} from '@slate-yjs/core';\n\nimport type { YjsEditorProps } from './withTYjs';\n\nexport type PlateYjsEditorProps = Pick<\n  CursorEditor,\n  | 'awareness'\n  | 'cursorDataField'\n  | 'selectionStateField'\n  | 'sendCursorData'\n  | 'sendCursorPosition'\n> &\n  YjsEditorProps;\n\nexport const withTCursors = <TCursorData extends Record<string, unknown>>(\n  editor: SlateEditor,\n  awareness: Awareness,\n  options?: WithCursorsOptions<TCursorData>\n) =>\n  withCursors(editor as any, awareness, options) as PlateYjsEditorProps &\n    SlateEditor &\n    YjsEditorProps;\n","import type { SlateEditor } from '@udecode/plate';\nimport type * as Y from 'yjs';\n\nimport {\n  type WithYHistoryOptions,\n  type YjsEditor,\n  withYHistory,\n} from '@slate-yjs/core';\n\nimport type { YjsEditorProps } from './withTYjs';\n\nexport type YHistoryEditor = {\n  undoManager: Y.UndoManager;\n  withoutSavingOrigin: unknown;\n  redo: () => void;\n  undo: () => void;\n} & YjsEditor;\n\nexport type YHistoryEditorProps = Pick<\n  YHistoryEditor,\n  'redo' | 'undo' | 'undoManager' | 'withoutSavingOrigin'\n> &\n  YjsEditorProps;\n\nexport const withTYHistory = (\n  editor: SlateEditor,\n  options?: WithYHistoryOptions\n) =>\n  withYHistory(editor as any, options) as SlateEditor &\n    YHistoryEditorProps &\n    YjsEditorProps;\n","import type { Operation, SlateEditor } from '@udecode/plate';\nimport type * as Y from 'yjs';\n\nimport { type YjsEditor, withYjs } from '@slate-yjs/core';\n\nexport type WithYjsOptions = {\n  /**\n   * Whether to automatically connect to providers.\n   *\n   * @default false\n   */\n  autoConnect?: boolean;\n  /** Origin used when applying local slate operations to yjs. */\n  localOrigin?: unknown;\n  /** Origin used when storing positions. */\n  positionStorageOrigin?: unknown;\n};\n\nexport type YjsEditorProps = {\n  storeLocalChange: (op: Operation) => void;\n} & Pick<\n  YjsEditor,\n  | 'applyRemoteEvents'\n  | 'connect'\n  | 'disconnect'\n  | 'flushLocalChanges'\n  | 'isLocalOrigin'\n  | 'localOrigin'\n  | 'positionStorageOrigin'\n  | 'sharedRoot'\n>;\n\nexport const withTYjs = (\n  editor: SlateEditor,\n  sharedRoot: Y.XmlText,\n  options?: WithYjsOptions\n) =>\n  withYjs(editor as any, sharedRoot, options) as SlateEditor & YjsEditorProps;\n"]}