@arbidocs/coedit 0.0.0-stage → 0.4.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/encoding.cjs +715 -0
- package/dist/encoding.cjs.map +1 -0
- package/dist/encoding.d.cts +192 -0
- package/dist/encoding.d.ts +192 -0
- package/dist/encoding.js +680 -0
- package/dist/encoding.js.map +1 -0
- package/dist/hocuspocus.cjs +1723 -0
- package/dist/hocuspocus.cjs.map +1 -0
- package/dist/hocuspocus.d.cts +39 -0
- package/dist/hocuspocus.d.ts +39 -0
- package/dist/hocuspocus.js +1700 -0
- package/dist/hocuspocus.js.map +1 -0
- package/dist/index.cjs +1656 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +16 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +1628 -0
- package/dist/index.js.map +1 -0
- package/dist/server.cjs +1816 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +43 -0
- package/dist/server.d.ts +43 -0
- package/dist/server.js +1786 -0
- package/dist/server.js.map +1 -0
- package/dist/session-Cf9iu1Vt.d.cts +82 -0
- package/dist/session-Cf9iu1Vt.d.ts +82 -0
- package/dist/versions-DXiFQMA6.d.cts +8 -0
- package/dist/versions-DXiFQMA6.d.ts +8 -0
- package/package.json +60 -4
- package/README.md +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/rich.ts","../src/mirror.ts","../src/encoding.ts","../src/registry.ts","../src/journal.ts","../src/sync.ts","../src/session.ts","../src/versions.ts","../src/module.ts"],"names":["Y","index","Y4","text","inserted","destination","Y5","same"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Paragraph text as one rich-text string.\n *\n * Why: the OOXML tree splits a run whenever formatting or a tracked change starts in the middle of\n * it, and a tree CRDT can only express that as \"delete the suffix here, insert a copy there\". When\n * two people do it to the same run at once, both copies survive and the text is duplicated. Here a\n * paragraph's characters live in a single Y.Text and everything that used to split them (run\n * properties, tracked-change and hyperlink wrappers, the shape of a text element) is an attribute on\n * a range of it, so a split only moves a boundary and never moves a character.\n *\n * A unit is one UTF-16 code unit of text, or one embedded element (a tab, a break, a field\n * character, a drawing, a bookmark...). Its attributes say which run, which wrappers and which text\n * element it belongs to. `encodeParagraph` returns null for a paragraph this model cannot hold\n * exactly, and the caller then keeps that paragraph as a plain element tree.\n */\nimport type * as Y from 'yjs'\n\nexport const WML = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'\n\nexport interface XmlAttr {\n ns: string\n local: string\n prefix?: string\n value: string\n}\n\nexport interface XmlBinding {\n prefix: string\n ns: string\n}\n\n/** A plain element: the generic shape the mirror stores, with text nodes as strings. */\nexport interface XmlEl {\n ns: string\n local: string\n prefix?: string\n attrs: XmlAttr[]\n bindings: XmlBinding[]\n children: (XmlEl | string)[]\n /** Identity of a run or wrapper, so two neighbours with equal properties stay two elements. Not XML. */\n _id?: string\n}\n\n/** An element without its children, as carried in an attribute. */\nexport interface ElDesc {\n ns: string\n local: string\n prefix?: string\n attrs: XmlAttr[]\n bindings: XmlBinding[]\n}\n\nexport interface WrapperDesc extends ElDesc {\n /** Children that come before the inline content (an inline content control's properties). */\n head: XmlEl[]\n id: string\n}\n\nexport type UnitKind = 'text' | 'atom' | 'empty-run' | 'run-child'\n\nexport interface UnitAttrs {\n /** The run's `w:rPr`, or null when it has none. */\n r: XmlEl | null\n /** The run element itself, without children. */\n ra: ElDesc | null\n /** Which run: stays the same when the run is split, so neighbours with equal properties never merge. */\n ri: string | null\n /** Wrappers around the run, outermost first. */\n w: WrapperDesc[]\n /** The text element this character sits in (`w:t`, `w:delText`, `w:instrText`). */\n tx: ElDesc | null\n /** 'a' for an atom placed directly in the paragraph or a wrapper, 'e' for an empty run. */\n k: 'a' | 'e' | null\n}\n\nexport interface Unit {\n /** One UTF-16 code unit, or an embedded element. */\n v: string | { x: XmlEl }\n a: UnitAttrs\n}\n\nexport interface EncodedParagraph {\n /** Children that precede the inline content: the paragraph properties. */\n head: XmlEl[]\n units: Unit[]\n}\n\nconst WRAPPERS = new Set([\n 'ins',\n 'del',\n 'moveFrom',\n 'moveTo',\n 'hyperlink',\n 'smartTag',\n 'fldSimple',\n 'customXml',\n 'dir',\n 'bdo',\n 'sdtContent',\n])\nconst TEXT_ELEMENTS = new Set(['t', 'delText', 'instrText'])\n\nconst isEl = (n: XmlEl | string): n is XmlEl => typeof n !== 'string'\nconst isWml = (el: XmlEl, local: string): boolean => el.ns === WML && el.local === local\n\nexport function describe(el: XmlEl): ElDesc {\n const desc: ElDesc = { ns: el.ns, local: el.local, attrs: el.attrs, bindings: el.bindings }\n if (el.prefix !== undefined) desc.prefix = el.prefix\n return desc\n}\n\nfunction withChildren(desc: ElDesc, children: (XmlEl | string)[], id?: string): XmlEl {\n const el: XmlEl = {\n ns: desc.ns,\n local: desc.local,\n attrs: desc.attrs,\n bindings: desc.bindings,\n children,\n }\n if (desc.prefix !== undefined) el.prefix = desc.prefix\n if (id !== undefined) el._id = id\n return el\n}\n\nlet counter = 0\n/** A fresh run or wrapper identity. */\nexport function newRunId(): string {\n counter += 1\n return `${Math.random().toString(36).slice(2, 8)}${counter.toString(36)}`\n}\n\nclass Unrepresentable extends Error {}\n\nfunction fail(): never {\n throw new Unrepresentable()\n}\n\nfunction encodeRun(run: XmlEl, wrappers: WrapperDesc[], out: Unit[]): void {\n const children = run.children\n let rPr: XmlEl | null = null\n let start = 0\n const first = children[0]\n if (first !== undefined && isEl(first) && isWml(first, 'rPr')) {\n rPr = first\n start = 1\n }\n const base = { r: rPr, ra: describe(run), ri: run._id ?? newRunId(), w: wrappers }\n let produced = false\n for (let i = start; i < children.length; i++) {\n const child = children[i]\n if (!isEl(child)) fail()\n const only = child.children[0]\n if (\n child.ns === WML &&\n TEXT_ELEMENTS.has(child.local) &&\n child.children.length === 1 &&\n typeof only === 'string' &&\n only.length > 0\n ) {\n const tx = describe(child)\n for (let c = 0; c < only.length; c++) out.push({ v: only[c], a: { ...base, tx, k: null } })\n } else {\n out.push({ v: { x: child }, a: { ...base, tx: null, k: null } })\n }\n produced = true\n }\n if (!produced)\n out.push({\n v: { x: { ns: WML, local: 'e', attrs: [], bindings: [], children: [] } },\n a: { ...base, tx: null, k: 'e' },\n })\n}\n\nfunction encodeInline(children: (XmlEl | string)[], wrappers: WrapperDesc[], out: Unit[]): void {\n for (const child of children) {\n if (!isEl(child)) fail()\n if (child.ns === WML && child.local === 'r') {\n encodeRun(child, wrappers, out)\n } else if (child.ns === WML && WRAPPERS.has(child.local)) {\n const before = out.length\n const desc: WrapperDesc = { ...describe(child), head: [], id: child._id ?? newRunId() }\n let ok = true\n const inner: Unit[] = []\n try {\n encodeInline(child.children, [...wrappers, desc], inner)\n } catch (error) {\n if (!(error instanceof Unrepresentable)) throw error\n ok = false\n }\n if (ok && inner.length > 0) out.push(...inner)\n else {\n out.length = before\n out.push(atom(child, wrappers))\n }\n } else if (child.ns === WML && child.local === 'sdt') {\n const last = child.children[child.children.length - 1]\n const head = child.children.slice(0, -1)\n if (last !== undefined && isEl(last) && isWml(last, 'sdtContent') && head.every(isEl)) {\n const before = out.length\n const sdt: WrapperDesc = {\n ...describe(child),\n head: head as XmlEl[],\n id: child._id ?? newRunId(),\n }\n const content: WrapperDesc = { ...describe(last), head: [], id: last._id ?? newRunId() }\n const inner: Unit[] = []\n let ok = true\n try {\n encodeInline(last.children, [...wrappers, sdt, content], inner)\n } catch (error) {\n if (!(error instanceof Unrepresentable)) throw error\n ok = false\n }\n if (ok && inner.length > 0) out.push(...inner)\n else {\n out.length = before\n out.push(atom(child, wrappers))\n }\n } else out.push(atom(child, wrappers))\n } else {\n out.push(atom(child, wrappers))\n }\n }\n}\n\nfunction atom(el: XmlEl, wrappers: WrapperDesc[]): Unit {\n return { v: { x: el }, a: { r: null, ra: null, ri: null, w: wrappers, tx: null, k: 'a' } }\n}\n\n/** Encode a paragraph's children, or null when the paragraph cannot be held exactly. */\nexport function encodeParagraph(children: (XmlEl | string)[]): EncodedParagraph | null {\n const head: XmlEl[] = []\n let start = 0\n const first = children[0]\n if (first !== undefined && isEl(first) && isWml(first, 'pPr')) {\n head.push(first)\n start = 1\n }\n const units: Unit[] = []\n try {\n encodeInline(children.slice(start), [], units)\n } catch (error) {\n if (error instanceof Unrepresentable) return null\n throw error\n }\n return { head, units }\n}\n\nconst same = (a: unknown, b: unknown): boolean => JSON.stringify(a) === JSON.stringify(b)\n\nfunction decodeRange(units: Unit[], from: number, to: number, depth: number): XmlEl[] {\n const out: XmlEl[] = []\n let i = from\n while (i < to) {\n const unit = units[i]\n const { w } = unit.a\n if (w.length > depth) {\n const wrapper = w[depth]\n let j = i + 1\n while (j < to && units[j].a.w.length > depth && same(units[j].a.w[depth], wrapper)) j++\n out.push(\n withChildren(wrapper, [...wrapper.head, ...decodeRange(units, i, j, depth + 1)], wrapper.id)\n )\n i = j\n } else if (unit.a.k === 'a') {\n out.push((unit.v as { x: XmlEl }).x)\n i++\n } else {\n let j = i + 1\n // An empty run stands alone, so it never merges into a neighbour with the same properties.\n while (\n unit.a.k !== 'e' &&\n j < to &&\n units[j].a.w.length === depth &&\n units[j].a.k !== 'a' &&\n units[j].a.k !== 'e' &&\n units[j].a.ri === unit.a.ri &&\n same(units[j].a.r, unit.a.r) &&\n same(units[j].a.ra, unit.a.ra)\n ) {\n j++\n }\n out.push(decodeRun(units, i, j))\n i = j\n }\n }\n return out\n}\n\nfunction decodeRun(units: Unit[], from: number, to: number): XmlEl {\n const { r, ra } = units[from].a\n const children: (XmlEl | string)[] = []\n if (r) children.push(r)\n let i = from\n while (i < to) {\n const unit = units[i]\n if (unit.a.k === 'e') {\n i++\n } else if (typeof unit.v === 'string') {\n let j = i + 1\n while (j < to && typeof units[j].v === 'string' && same(units[j].a.tx, unit.a.tx)) j++\n let text = ''\n for (let c = i; c < j; c++) text += units[c].v as string\n children.push(withChildren(unit.a.tx as ElDesc, [text]))\n i = j\n } else {\n children.push(unit.v.x)\n i++\n }\n }\n return withChildren(ra as ElDesc, children, units[from].a.ri ?? undefined)\n}\n\n/** The children a paragraph's units stand for, after its properties. */\nexport function decodeInline(units: Unit[]): XmlEl[] {\n return decodeRange(units, 0, units.length, 0)\n}\n\nexport function decodeParagraph(encoded: EncodedParagraph): (XmlEl | string)[] {\n return [...encoded.head, ...decodeInline(encoded.units)]\n}\n\n// ── Y.Text input and output ────────────────────────────────────────────────\n\nconst KEYS = ['r', 'ra', 'ri', 'w', 'tx', 'k'] as const\n\nfunction toAttributes(a: UnitAttrs): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const key of KEYS) {\n const value = a[key]\n if (value !== null && !(key === 'w' && (value as unknown[]).length === 0)) out[key] = value\n }\n return out\n}\n\nfunction fromAttributes(attributes: Record<string, unknown> | undefined): UnitAttrs {\n const a = attributes ?? {}\n return {\n r: (a.r as XmlEl | undefined) ?? null,\n ra: (a.ra as ElDesc | undefined) ?? null,\n ri: (a.ri as string | undefined) ?? null,\n w: (a.w as WrapperDesc[] | undefined) ?? [],\n tx: (a.tx as ElDesc | undefined) ?? null,\n k: (a.k as UnitAttrs['k'] | undefined) ?? null,\n }\n}\n\n/** The units a Y.Text currently holds. */\nexport function readUnits(text: Y.Text): Unit[] {\n const units: Unit[] = []\n for (const op of text.toDelta() as {\n insert: string | { x: XmlEl }\n attributes?: Record<string, unknown>\n }[]) {\n const a = fromAttributes(op.attributes)\n if (typeof op.insert === 'string') {\n for (let i = 0; i < op.insert.length; i++) units.push({ v: op.insert[i], a })\n } else {\n units.push({ v: op.insert, a })\n }\n }\n return units\n}\n\nconst valueKeyOf = (u: Unit): string => (typeof u.v === 'string' ? u.v : JSON.stringify(u.v))\nconst attrsKeyOf = (u: Unit): string => JSON.stringify(u.a)\n\ntype DeltaOp = {\n retain?: number\n delete?: number\n insert?: string | object\n attributes?: Record<string, unknown>\n}\n\nfunction attributeChange(from: UnitAttrs, to: UnitAttrs): Record<string, unknown> {\n const a = toAttributes(from)\n const b = toAttributes(to)\n const change: Record<string, unknown> = {}\n for (const key of KEYS) {\n if (JSON.stringify(a[key]) !== JSON.stringify(b[key])) change[key] = b[key] ?? null\n }\n return change\n}\n\nfunction pushRetain(delta: DeltaOp[], length: number, attributes?: Record<string, unknown>): void {\n if (length === 0) return\n const last = delta[delta.length - 1]\n const empty = !attributes || Object.keys(attributes).length === 0\n if (last && last.retain !== undefined && !last.attributes && empty) {\n last.retain += length\n return\n }\n delta.push(empty ? { retain: length } : { retain: length, attributes })\n}\n\n/** Retain `length` units, reformatting where the attributes of `previous` and `next` differ. */\nfunction reformat(\n delta: DeltaOp[],\n previous: Unit[],\n from: number,\n next: Unit[],\n to: number,\n length: number\n): void {\n let i = 0\n while (i < length) {\n const change = attributeChange(previous[from + i].a, next[to + i].a)\n const key = JSON.stringify(change)\n let j = i + 1\n while (\n j < length &&\n JSON.stringify(attributeChange(previous[from + j].a, next[to + j].a)) === key\n ) {\n j++\n }\n pushRetain(delta, j - i, change)\n i = j\n }\n}\n\n/**\n * Make `text` hold `next`, changing as little as possible. Characters are matched by value from both\n * ends, so what a person typed is the only thing inserted; matched characters whose attributes\n * changed (a run split, a tracked change started) are reformatted in place and never retyped. That is\n * what lets two people's edits of one paragraph merge instead of duplicating text.\n */\nexport function applyUnits(text: Y.Text, previous: Unit[], next: Unit[]): void {\n let start = 0\n const limit = Math.min(previous.length, next.length)\n while (start < limit && valueKeyOf(previous[start]) === valueKeyOf(next[start])) start++\n let endPrev = previous.length\n let endNext = next.length\n while (\n endPrev > start &&\n endNext > start &&\n valueKeyOf(previous[endPrev - 1]) === valueKeyOf(next[endNext - 1])\n ) {\n endPrev--\n endNext--\n }\n\n const delta: DeltaOp[] = []\n reformat(delta, previous, 0, next, 0, start)\n if (endPrev > start) delta.push({ delete: endPrev - start })\n let i = start\n while (i < endNext) {\n const unit = next[i]\n if (typeof unit.v !== 'string') {\n delta.push({ insert: unit.v, attributes: toAttributes(unit.a) })\n i++\n continue\n }\n let j = i + 1\n let chunk = unit.v\n const attributes = attrsKeyOf(unit)\n while (j < endNext && typeof next[j].v === 'string' && attrsKeyOf(next[j]) === attributes) {\n chunk += next[j].v as string\n j++\n }\n delta.push({ insert: chunk, attributes: toAttributes(unit.a) })\n i = j\n }\n reformat(delta, previous, endPrev, next, endNext, previous.length - endPrev)\n if (delta.every((op) => op.retain !== undefined && !op.attributes)) return\n text.applyDelta(delta, { sanitize: false })\n}\n\n/** Write units into an empty Y.Text. */\nexport function writeUnits(text: Y.Text, units: Unit[]): void {\n applyUnits(text, [], units)\n}\n","/**\n * Elements of the mirror, in both directions: plain `XmlEl` objects to Yjs types and back, and\n * `XmlEl` to XML text.\n *\n * A paragraph is held as a rich paragraph (see rich.ts) whenever it can be represented exactly: its\n * properties stay in `children`, and its inline content is the single Y.Text `inline`. Every other\n * element is a generic map with a `children` array, as before.\n */\nimport * as Y from 'yjs'\nimport {\n decodeInline,\n encodeParagraph,\n readUnits,\n WML,\n writeUnits,\n type EncodedParagraph,\n type XmlAttr,\n type XmlBinding,\n type XmlEl,\n} from './rich'\n\nexport type LiveElement = Y.Map<unknown>\nexport type LiveChild = LiveElement | Y.Text\n\nexport function isRichParagraph(map: Y.Map<unknown>): boolean {\n return map.has('inline')\n}\n\nexport function isParagraphEl(el: { ns: string; local: string }): boolean {\n return el.ns === WML && el.local === 'p'\n}\n\nfunction fieldsOf(map: Y.Map<unknown>, xml: XmlEl): void {\n map.set('ns', xml.ns)\n map.set('local', xml.local)\n if (xml.prefix !== undefined) map.set('prefix', xml.prefix)\n const attrs = new Y.Array<XmlAttr>()\n attrs.push(xml.attrs.map((a) => ({ ...a })))\n map.set('attrs', attrs)\n const bindings = new Y.Array<XmlBinding>()\n bindings.push(xml.bindings.map((b) => ({ ...b })))\n map.set('bindings', bindings)\n}\n\nexport function newText(value: string): Y.Text {\n const text = new Y.Text()\n text.insert(0, value)\n return text\n}\n\n/** A rich paragraph: properties in `children`, inline content in `inline`. */\nexport function createRichParagraph(xml: XmlEl, encoded: EncodedParagraph): LiveElement {\n const map = new Y.Map<unknown>()\n fieldsOf(map, xml)\n const children = new Y.Array<LiveChild>()\n children.push(encoded.head.map((el) => xmlToLive(el)))\n map.set('children', children)\n const inline = new Y.Text()\n writeUnits(inline, encoded.units)\n map.set('inline', inline)\n return map\n}\n\n/** Build the Yjs form of an element. A paragraph that cannot be held as rich text is stored plainly. */\nexport function xmlToLive(xml: XmlEl): LiveElement {\n if (isParagraphEl(xml)) {\n const encoded = encodeParagraph(xml.children)\n if (encoded) return createRichParagraph(xml, encoded)\n }\n return xmlToGenericLive(xml)\n}\n\nexport function xmlToGenericLive(xml: XmlEl): LiveElement {\n const map = new Y.Map<unknown>()\n fieldsOf(map, xml)\n const children = new Y.Array<LiveChild>()\n children.push(xml.children.map((c) => (typeof c === 'string' ? newText(c) : xmlToLive(c))))\n map.set('children', children)\n return map\n}\n\n/** Read an element back as plain data. */\nexport function liveToXml(map: LiveElement): XmlEl {\n const prefix = map.get('prefix') as string | undefined\n const stored = (map.get('children') as Y.Array<LiveChild>)\n .toArray()\n .map((child) => (child instanceof Y.Text ? child.toString() : liveToXml(child)))\n const children: (XmlEl | string)[] = isRichParagraph(map)\n ? [...stored, ...decodeInline(readUnits(map.get('inline') as Y.Text))]\n : stored\n const xml: XmlEl = {\n ns: map.get('ns') as string,\n local: map.get('local') as string,\n attrs: (map.get('attrs') as Y.Array<XmlAttr>).toArray().map((a) => ({ ...a })),\n bindings: (map.get('bindings') as Y.Array<XmlBinding>).toArray().map((b) => ({ ...b })),\n children,\n }\n if (prefix !== undefined) xml.prefix = prefix\n return xml\n}\n\n// ── XML text ───────────────────────────────────────────────────────────────\n\nconst escapeText = (value: string): string =>\n value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n\nexport const escapeAttr = (value: string): string =>\n value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/\\t/g, '	')\n .replace(/\\n/g, ' ')\n .replace(/\\r/g, ' ')\n\nconst qualified = (prefix: string | undefined, local: string): string =>\n prefix ? `${prefix}:${local}` : local\n\n/** Prefixes in scope for an element; innermost binding wins. */\nexport type Scope = ReadonlyMap<string, string>\n\nexport function serializeXml(el: XmlEl, scope: Scope): string {\n const inScope = new Map(scope)\n for (const b of el.bindings) inScope.set(b.prefix, b.ns)\n\n let out = `<${qualified(el.prefix, el.local)}`\n for (const b of el.bindings) {\n out +=\n b.prefix === '' ? ` xmlns=\"${escapeAttr(b.ns)}\"` : ` xmlns:${b.prefix}=\"${escapeAttr(b.ns)}\"`\n }\n for (const a of el.attrs) {\n let p = a.prefix\n if (a.ns !== '' && !p) {\n for (const [candidate, uri] of inScope) {\n if (candidate !== '' && uri === a.ns) {\n p = candidate\n break\n }\n }\n }\n out += ` ${qualified(p, a.local)}=\"${escapeAttr(a.value)}\"`\n }\n if (el.children.length === 0) return `${out}/>`\n out += '>'\n for (const child of el.children) {\n out += typeof child === 'string' ? escapeText(child) : serializeXml(child, inScope)\n }\n return `${out}</${qualified(el.prefix, el.local)}>`\n}\n\n/** Serialise an element of the mirror. */\nexport function serializeLive(el: LiveElement, scope: Scope): string {\n if (isRichParagraph(el)) return serializeXml(liveToXml(el), scope)\n const prefix = el.get('prefix') as string | undefined\n const local = el.get('local') as string\n const bindings = (el.get('bindings') as Y.Array<XmlBinding>).toArray()\n const attrs = (el.get('attrs') as Y.Array<XmlAttr>).toArray()\n const children = (el.get('children') as Y.Array<LiveChild>).toArray()\n\n const inScope = new Map(scope)\n for (const b of bindings) inScope.set(b.prefix, b.ns)\n\n let out = `<${qualified(prefix, local)}`\n for (const b of bindings) {\n out +=\n b.prefix === '' ? ` xmlns=\"${escapeAttr(b.ns)}\"` : ` xmlns:${b.prefix}=\"${escapeAttr(b.ns)}\"`\n }\n for (const a of attrs) {\n let p = a.prefix\n if (a.ns !== '' && !p) {\n for (const [candidate, uri] of inScope) {\n if (candidate !== '' && uri === a.ns) {\n p = candidate\n break\n }\n }\n }\n out += ` ${qualified(p, a.local)}=\"${escapeAttr(a.value)}\"`\n }\n if (children.length === 0) return `${out}/>`\n out += '>'\n for (const child of children) {\n out += child instanceof Y.Text ? escapeText(child.toString()) : serializeLive(child, inScope)\n }\n return `${out}</${qualified(prefix, local)}>`\n}\n","/**\n * Yjs mirror of a canonical OOXML package.\n *\n * The mirror is deliberately generic: it stores XML (namespace, local name, prefix, attributes,\n * namespace bindings, children) and not core's typed node kinds. Materialising serialises the mirror\n * back to XML and lets core's own reader classify it, so the typed vocabulary never leaks into the\n * replicated state and a core upgrade cannot invalidate stored rooms.\n *\n * Layout of the Yjs document (all under the top level maps named below):\n *\n * meta Y.Map { format, mainDocumentPart }\n * parts Y.Map partName -> element\n * rels Y.Map ownerPart -> Y.Map(relId -> RelationshipJson), internal and external\n * alike; the `.rels` XML parts are regenerated from these, never mirrored\n * ctDefaults Y.Map extension -> mime\n * ctOverrides Y.Map case folded part name -> mime\n * binaries Y.Map partName -> Uint8Array (every non-XML part)\n *\n * element = Y.Map { ns, local, prefix?, attrs: Y.Array<AttrJson>, bindings: Y.Array<BindingJson>,\n * children: Y.Array<element | Y.Text> }\n * text = Y.Text (a text node is a Y.Text living in a children array)\n */\nimport * as Y from 'yjs'\nimport {\n readOoxmlPackage,\n readOoxmlPart,\n relsPartNameFor,\n validateExternalTarget,\n writeOoxmlPackage,\n type OoxmlPackage,\n} from '@docx-editor.dev/core/store'\nimport { escapeAttr, serializeLive, xmlToLive, newText } from './mirror'\nimport type { XmlEl } from './rich'\nimport type { NodeRegistry } from './registry'\n\nexport const COLLAB_FORMAT = 'arbi-docx/1'\n\nexport interface AttrJson {\n ns: string\n local: string\n prefix?: string\n value: string\n}\n\nexport interface BindingJson {\n prefix: string\n ns: string\n}\n\nexport interface RelationshipJson {\n ownerPart: string\n id: string\n type: string\n rawTarget: string\n targetMode: string\n order: number\n}\n\n/** Structural view of core's canonical node; only the fields the mirror carries. */\ninterface CanonicalElement {\n readonly kind: string\n readonly namespaceUri: string\n readonly localName: string\n readonly prefix?: string\n readonly namespaceBindings: readonly { prefix: string; namespaceUri: string }[]\n readonly attributes: readonly {\n namespaceUri: string\n localName: string\n prefix?: string\n value: string\n }[]\n readonly children: readonly (CanonicalElement | CanonicalText)[]\n}\n\ninterface CanonicalText {\n readonly kind: 'textValue'\n readonly value: string\n}\n\nfunction isText(node: CanonicalElement | CanonicalText): node is CanonicalText {\n return node.kind === 'textValue'\n}\n\nfunction canonicalToXml(node: CanonicalElement | CanonicalText): XmlEl | string {\n if (isText(node)) return node.value\n const xml: XmlEl = {\n ns: node.namespaceUri,\n local: node.localName,\n attrs: node.attributes.map((a) => {\n const json: AttrJson = { ns: a.namespaceUri, local: a.localName, value: a.value }\n if (a.prefix !== undefined) json.prefix = a.prefix\n return json\n }),\n bindings: node.namespaceBindings.map((b) => ({ prefix: b.prefix, ns: b.namespaceUri })),\n children: node.children.map(canonicalToXml),\n }\n if (node.prefix !== undefined) xml.prefix = node.prefix\n return xml\n}\n\nexport function encodeElement(el: CanonicalElement): Y.Map<unknown> {\n return xmlToLive(canonicalToXml(el) as XmlEl)\n}\n\nexport function encodeText(value: string): Y.Text {\n return newText(value)\n}\n\n/** Seed an empty Yjs document from a loaded package. Call once, inside a transaction. */\nexport function bootstrap(doc: Y.Doc, pkg: OoxmlPackage): void {\n doc.transact(() => {\n const meta = doc.getMap('meta')\n meta.set('format', COLLAB_FORMAT)\n meta.set('mainDocumentPart', pkg.mainDocumentPart)\n\n const parts = doc.getMap<Y.Map<unknown>>('parts')\n for (const [name, part] of pkg.parts) {\n if (isRelsPart(name)) continue\n parts.set(name, encodeElement(part.root as unknown as CanonicalElement))\n }\n\n const binaries = doc.getMap<Uint8Array>('binaries')\n for (const [name, bytes] of pkg.partBytes) {\n if (!pkg.parts.has(name)) binaries.set(name, bytes)\n }\n\n const rels = doc.getMap<Y.Map<RelationshipJson>>('rels')\n for (const [owner, records] of pkg.relationships) {\n const byId = new Y.Map<RelationshipJson>()\n for (const r of records) {\n byId.set(r.id, {\n ownerPart: r.ownerPart,\n id: r.id,\n type: r.type,\n rawTarget: r.rawTarget,\n targetMode: r.targetMode as string,\n order: r.order,\n })\n }\n rels.set(owner, byId)\n }\n\n for (const e of pkg.externalTargets) {\n let byId = rels.get(e.ownerPart)\n if (!byId) {\n byId = new Y.Map<RelationshipJson>()\n rels.set(e.ownerPart, byId)\n }\n byId.set(e.id, {\n ownerPart: e.ownerPart,\n id: e.id,\n type: e.type,\n rawTarget: e.rawTarget,\n targetMode: 'External',\n order: byId.size,\n })\n }\n\n const ctDefaults = doc.getMap<string>('ctDefaults')\n for (const [ext, mime] of pkg.contentTypes.defaults) ctDefaults.set(ext, mime)\n const ctOverrides = doc.getMap<string>('ctOverrides')\n for (const [name, mime] of pkg.contentTypes.overrides) ctOverrides.set(name, mime)\n })\n}\n\nexport function isBootstrapped(doc: Y.Doc): boolean {\n return doc.getMap('meta').get('format') !== undefined\n}\n\nexport function readFormat(doc: Y.Doc): string | undefined {\n const format = doc.getMap('meta').get('format')\n return typeof format === 'string' ? format : undefined\n}\n\n// ── XML serialisation of the mirror ────────────────────────────────────────\n\nexport function serializePart(doc: Y.Doc, partName: string): string {\n const root = doc.getMap<Y.Map<unknown>>('parts').get(partName)\n if (!root) throw new Error(`collab: part ${partName} is not in the room`)\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n${serializeLive(root, new Map())}`\n}\n\n/** Override first, then the extension default, as the package's content type index resolves it. */\nexport function contentTypeOf(doc: Y.Doc, partName: string): string | undefined {\n const override = doc.getMap<string>('ctOverrides').get(partName.toLowerCase())\n if (override !== undefined) return override\n const dot = partName.lastIndexOf('.')\n if (dot < 0) return undefined\n return doc.getMap<string>('ctDefaults').get(partName.slice(dot + 1).toLowerCase())\n}\n\n/**\n * Register mirrored nodes under their positional ids. Run after bootstrap and after a remote apply.\n * Pass `only` to refresh just the parts that changed.\n */\nexport function registerMirror(\n doc: Y.Doc,\n registry: NodeRegistry,\n only?: ReadonlySet<string>\n): void {\n const parts = doc.getMap<Y.Map<unknown>>('parts')\n if (!only) {\n registry.clear()\n for (const [name, root] of parts) registry.registerTree(name, root)\n return\n }\n for (const name of only) {\n registry.dropPart(name)\n const root = parts.get(name)\n if (root) registry.registerTree(name, root)\n }\n}\n\n/**\n * Remembers each part's last materialised tree and which parts changed since, so a remote edit\n * re-reads only the part it touched. Unchanged parts keep the identical frozen object, which also\n * lets the local store reuse everything it already derived from them.\n */\nexport class MaterializeCache {\n readonly parts = new Map<\n string,\n OoxmlPackage['parts'] extends ReadonlyMap<string, infer P> ? P : never\n >()\n private dirty = new Set<string>()\n private everything = true\n private readonly stop: (() => void)[] = []\n\n constructor(doc: Y.Doc) {\n const parts = doc.getMap<Y.Map<unknown>>('parts')\n const onParts = (events: Y.YEvent<Y.AbstractType<unknown>>[]): void => {\n for (const event of events) {\n if (event.target === parts) {\n for (const key of (event as Y.YMapEvent<unknown>).keysChanged) this.dirty.add(key)\n } else if (typeof event.path[0] === 'string') this.dirty.add(event.path[0])\n }\n }\n parts.observeDeep(onParts)\n this.stop.push(() => parts.unobserveDeep(onParts))\n // A content type change can change how every part reads.\n for (const name of ['ctOverrides', 'ctDefaults']) {\n const map = doc.getMap(name)\n const onTypes = (): void => {\n this.everything = true\n }\n map.observe(onTypes)\n this.stop.push(() => map.unobserve(onTypes))\n }\n }\n\n /** Names to re-read, or null when everything must be. Clears the pending set. */\n take(): ReadonlySet<string> | null {\n const names = this.everything ? null : this.dirty\n this.dirty = new Set()\n this.everything = false\n return names\n }\n\n /** Mark parts changed again, for a materialisation that did not complete. */\n restore(names: ReadonlySet<string> | null): void {\n if (names === null) this.everything = true\n else for (const name of names) this.dirty.add(name)\n }\n\n destroy(): void {\n for (const stop of this.stop.splice(0)) stop()\n }\n}\n\nconst RELS_CONTENT_TYPE = 'application/vnd.openxmlformats-package.relationships+xml'\nconst RELS_NAMESPACE = 'http://schemas.openxmlformats.org/package/2006/relationships'\n\ninterface ExternalTargetRecord {\n ownerPart: string\n id: string\n type: string\n rawTarget: string\n sinkSafe: boolean\n}\n\nfunction isRelsPart(partName: string): boolean {\n return partName.endsWith('.rels')\n}\n\nfunction relationshipsXml(records: readonly RelationshipJson[]): string {\n const rows = records\n .map(\n (r) =>\n `<Relationship Id=\"${escapeAttr(r.id)}\" Type=\"${escapeAttr(r.type)}\" Target=\"${escapeAttr(r.rawTarget)}\"` +\n `${r.targetMode === 'External' ? ' TargetMode=\"External\"' : ''}/>`\n )\n .join('')\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"${RELS_NAMESPACE}\">${rows}</Relationships>`\n}\n\n// ── Materialisation ────────────────────────────────────────────────────────\n\nexport class MaterializeError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MaterializeError'\n }\n}\n\n/** Build a frozen canonical package from the mirror. Throws MaterializeError on a corrupt room. */\nexport function materialize(\n doc: Y.Doc,\n cache?: MaterializeCache,\n changed: ReadonlySet<string> | null = null\n): OoxmlPackage {\n const meta = doc.getMap('meta')\n const main = meta.get('mainDocumentPart')\n if (typeof main !== 'string') throw new MaterializeError('room has no main document part')\n\n const parts = new Map<\n string,\n OoxmlPackage['parts'] extends ReadonlyMap<string, infer P> ? P : never\n >()\n for (const name of doc.getMap('parts').keys()) {\n if (isRelsPart(name)) continue\n const reusable = cache && changed && !changed.has(name) ? cache.parts.get(name) : undefined\n if (reusable) {\n parts.set(name, reusable)\n continue\n }\n const contentType = contentTypeOf(doc, name)\n if (contentType === undefined) throw new MaterializeError(`part ${name} has no content type`)\n const read = readOoxmlPart(serializePart(doc, name), { name, contentType })\n if (!read.ok) throw new MaterializeError(`part ${name} is not readable: ${read.reason}`)\n parts.set(name, read.part)\n }\n if (cache) {\n cache.parts.clear()\n for (const [name, part] of parts) if (!isRelsPart(name)) cache.parts.set(name, part)\n }\n\n const partBytes = new Map<string, Uint8Array>()\n for (const [name, bytes] of doc.getMap<Uint8Array>('binaries')) partBytes.set(name, bytes)\n\n // Relationship records are the authority; the `.rels` XML parts are rebuilt from them.\n const relationships = new Map<string, readonly RelationshipJson[]>()\n const externalTargets: ExternalTargetRecord[] = []\n for (const [owner, byId] of doc.getMap<Y.Map<RelationshipJson>>('rels')) {\n // Ties on `order` are broken by id so every peer writes the same bytes.\n const records = [...byId.values()].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id))\n if (records.length === 0) continue\n const internal = records.filter((r) => r.targetMode !== 'External')\n if (internal.length > 0) relationships.set(owner, internal)\n for (const r of records) {\n if (r.targetMode !== 'External') continue\n externalTargets.push({\n ownerPart: r.ownerPart,\n id: r.id,\n type: r.type,\n rawTarget: r.rawTarget,\n sinkSafe: validateExternalTarget(r.rawTarget).ok,\n })\n }\n const relsName = relsPartNameFor(owner)\n const read = readOoxmlPart(relationshipsXml(records), {\n name: relsName,\n contentType: RELS_CONTENT_TYPE,\n })\n if (!read.ok)\n throw new MaterializeError(`relationships of ${owner} are not valid: ${read.reason}`)\n parts.set(relsName, read.part)\n }\n\n const contentTypes = {\n defaults: new Map(doc.getMap<string>('ctDefaults')),\n overrides: new Map(doc.getMap<string>('ctOverrides')),\n }\n\n return {\n parts,\n partBytes,\n relationships,\n externalTargets,\n contentTypes,\n mainDocumentPart: main,\n } as unknown as OoxmlPackage\n}\n\n/** Serialise the room as DOCX bytes. */\nexport function materializeBytes(doc: Y.Doc): Uint8Array {\n return writeOoxmlPackage(materialize(doc))\n}\n\n/** Load DOCX bytes and seed an empty room from them. */\nexport function bootstrapFromBytes(doc: Y.Doc, bytes: Uint8Array): OoxmlPackage {\n const result = readOoxmlPackage(bytes)\n if (!result.ok) throw new MaterializeError(`not a readable DOCX: ${result.reason}`)\n bootstrap(doc, result.package)\n return result.package\n}\n","/**\n * Identity registry between core's logical node ids and the Yjs mirror.\n *\n * A journal addresses nodes by logical id: an original node keeps its positional id from the moment\n * the package was opened, a node minted later gets `#new:N`. Ids never shift when siblings are\n * inserted or removed, so the registry maps an id to a live Yjs type by reference, and a remote edit\n * that moves positions cannot invalidate it.\n *\n * A Yjs type cannot be read before it is integrated and cannot be integrated twice. Nodes that are\n * under construction, detached, or about to move are therefore held as plain objects and converted\n * to Yjs types when they are attached to a live parent. `snapshot` is the live to plain direction.\n *\n * Rich paragraphs (see rich.ts) hold their runs as attributes on one Y.Text, so their inner nodes\n * have no Yjs type of their own. The first effect that touches one opens it: it is read into a plain\n * tree, the journal's effects change that tree, and `flushRich` writes the result back as a minimal\n * edit of the text. The tree stays open, mirroring the editor's own, until a remote change re-reads it.\n */\nimport * as Y from 'yjs'\nimport type { AttrJson, BindingJson } from './encoding'\nimport { createRichParagraph, isParagraphEl, isRichParagraph, liveToXml, xmlToLive } from './mirror'\nimport { applyUnits, encodeParagraph, newRunId, readUnits, WML, type XmlEl } from './rich'\n\nexport interface PlainElement {\n type: 'element'\n id: string\n ns: string\n local: string\n prefix?: string\n attrs: AttrJson[]\n bindings: BindingJson[]\n children: PlainNode[]\n /** Identity of a run or wrapper inside a rich paragraph. */\n rid?: string\n}\n\nexport interface PlainText {\n type: 'text'\n id: string\n value: string\n}\n\nexport type PlainNode = PlainElement | PlainText\n\nexport type LiveNode = Y.Map<unknown> | Y.Text\n\nexport type RegistryEntry = { live: LiveNode } | { plain: PlainNode }\n\nexport class RegistryError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'RegistryError'\n }\n}\n\nexport function childrenOf(el: Y.Map<unknown>): Y.Array<LiveNode> {\n return el.get('children') as Y.Array<LiveNode>\n}\n\nexport function attrsOf(el: Y.Map<unknown>): Y.Array<AttrJson> {\n return el.get('attrs') as Y.Array<AttrJson>\n}\n\nexport function bindingsOf(el: Y.Map<unknown>): Y.Array<BindingJson> {\n return el.get('bindings') as Y.Array<BindingJson>\n}\n\n/** Elements that need an identity so neighbours with equal properties stay separate in a rich paragraph. */\nconst IDENTIFIED = new Set([\n 'r',\n 'ins',\n 'del',\n 'moveFrom',\n 'moveTo',\n 'hyperlink',\n 'smartTag',\n 'fldSimple',\n 'customXml',\n 'dir',\n 'bdo',\n 'sdt',\n 'sdtContent',\n])\n\nfunction plainToXml(node: PlainNode): XmlEl | string {\n if (node.type === 'text') return node.value\n const xml: XmlEl = {\n ns: node.ns,\n local: node.local,\n attrs: node.attrs.map((a) => ({ ...a })),\n bindings: node.bindings.map((b) => ({ ...b })),\n children: node.children.map(plainToXml),\n }\n if (node.prefix !== undefined) xml.prefix = node.prefix\n if (node.ns === WML && IDENTIFIED.has(node.local)) {\n node.rid ??= newRunId()\n xml._id = node.rid\n }\n return xml\n}\n\nfunction xmlToPlain(xml: XmlEl | string, id: string): PlainNode {\n if (typeof xml === 'string') return { type: 'text', id, value: xml }\n const plain: PlainElement = {\n type: 'element',\n id,\n ns: xml.ns,\n local: xml.local,\n attrs: xml.attrs.map((a) => ({ ...a })),\n bindings: xml.bindings.map((b) => ({ ...b })),\n children: xml.children.map((child, index) => xmlToPlain(child, `${id}.${index}`)),\n }\n if (xml.prefix !== undefined) plain.prefix = xml.prefix\n if (xml._id !== undefined) plain.rid = xml._id\n return plain\n}\n\ninterface OpenParagraph {\n live: Y.Map<unknown>\n root: PlainElement\n id: string\n}\n\nconst partOf = (id: string): string => id.slice(0, id.indexOf('#'))\n\nexport class NodeRegistry {\n private readonly entries = new Map<string, RegistryEntry>()\n /** Ids per part (the text before `#`), so one part can be dropped without scanning the rest. */\n private readonly byPart = new Map<string, Set<string>>()\n private readonly liveIds = new WeakMap<LiveNode, string>()\n private readonly open = new Map<Y.Map<unknown>, OpenParagraph>()\n private readonly ownerOf = new WeakMap<PlainNode, Y.Map<unknown>>()\n private readonly dirty = new Set<Y.Map<unknown>>()\n\n clear(): void {\n this.entries.clear()\n this.byPart.clear()\n this.open.clear()\n this.dirty.clear()\n }\n\n /** Forget every node of one part, live or detached. */\n dropPart(partName: string): void {\n for (const id of this.byPart.get(partName) ?? []) this.entries.delete(id)\n this.byPart.delete(partName)\n for (const [live, record] of this.open) {\n if (partOf(record.id) !== partName) continue\n this.open.delete(live)\n this.dirty.delete(live)\n }\n }\n\n private index(id: string): void {\n const part = partOf(id)\n let ids = this.byPart.get(part)\n if (!ids) this.byPart.set(part, (ids = new Set()))\n ids.add(id)\n }\n\n get(id: string): RegistryEntry | undefined {\n return this.entries.get(id)\n }\n\n require(id: string): RegistryEntry {\n let entry = this.entries.get(id) ?? this.resolveInsideParagraph(id)\n if (!entry) throw new RegistryError(`journal names unknown node ${id}`)\n if ('live' in entry && entry.live instanceof Y.Map && isRichParagraph(entry.live)) {\n this.openParagraph(entry.live)\n entry = this.entries.get(id) as RegistryEntry\n }\n if ('plain' in entry) {\n const owner = this.ownerOf.get(entry.plain)\n if (owner) this.dirty.add(owner)\n }\n return entry\n }\n\n /** An id inside a paragraph that is not open yet: open the paragraph it belongs to. */\n private resolveInsideParagraph(id: string): RegistryEntry | undefined {\n const hash = id.indexOf('#')\n if (hash < 0 || id.startsWith('new:', hash + 1)) return undefined\n const path = id.slice(hash + 1).split('.')\n for (let length = path.length - 1; length >= 1; length--) {\n const ancestor = this.entries.get(id.slice(0, hash + 1) + path.slice(0, length).join('.'))\n if (!ancestor) continue\n if ('live' in ancestor && ancestor.live instanceof Y.Map && isRichParagraph(ancestor.live)) {\n this.openParagraph(ancestor.live)\n return this.entries.get(id)\n }\n return undefined\n }\n return undefined\n }\n\n idOf(node: LiveNode): string | undefined {\n return this.liveIds.get(node)\n }\n\n isCurrentLive(id: string, node: LiveNode): boolean {\n const entry = this.entries.get(id)\n return entry !== undefined && 'live' in entry && entry.live === node\n }\n\n registerLive(id: string, node: LiveNode): void {\n this.entries.set(id, { live: node })\n this.liveIds.set(node, id)\n this.index(id)\n }\n\n registerPlain(node: PlainNode, keepNewer = false): void {\n // A journal may mint a node under the id of one that is being replaced. Opening a paragraph in the\n // middle of that journal must not put the replaced node back.\n const existing = this.entries.get(node.id)\n if (!(keepNewer && existing && 'plain' in existing)) {\n this.entries.set(node.id, { plain: node })\n this.index(node.id)\n }\n if (node.type === 'element')\n for (const child of node.children) this.registerPlain(child, keepNewer)\n }\n\n /**\n * Walk a mirror root and register every node under its positional id, `${part}#0` for the root and\n * `${parent}.${index}` below it. This is the id scheme core assigns when it reads a part. A rich\n * paragraph is registered as one node; its inner nodes appear when it is opened.\n */\n registerTree(partName: string, root: Y.Map<unknown>): void {\n const walk = (node: LiveNode, id: string): void => {\n this.registerLive(id, node)\n if (node instanceof Y.Text) return\n if (isRichParagraph(node)) return\n childrenOf(node).forEach((child, index) => walk(child, `${id}.${index}`))\n }\n walk(root, `${partName}#0`)\n }\n\n // ── Rich paragraphs ──────────────────────────────────────────────────────\n\n private own(node: PlainNode, live: Y.Map<unknown> | undefined): void {\n if (live) this.ownerOf.set(node, live)\n else this.ownerOf.delete(node)\n if (node.type === 'element') for (const child of node.children) this.own(child, live)\n }\n\n private openParagraph(live: Y.Map<unknown>): OpenParagraph {\n const existing = this.open.get(live)\n if (existing) return existing\n const id = this.liveIds.get(live)\n if (id === undefined) throw new RegistryError('paragraph has no registered id')\n const root = xmlToPlain(liveToXml(live), id) as PlainElement\n const record: OpenParagraph = { live, root, id }\n this.open.set(live, record)\n this.registerPlain(root, true)\n this.own(root, live)\n return record\n }\n\n /** The Yjs paragraph an open plain root stands for. */\n liveOfRoot(node: PlainNode): Y.Map<unknown> | undefined {\n const live = this.ownerOf.get(node)\n return live && this.open.get(live)?.root === node ? live : undefined\n }\n\n /** Parent and index of a node inside an open paragraph. */\n locatePlain(node: PlainNode): { parent: PlainElement; index: number } | undefined {\n const live = this.ownerOf.get(node)\n const record = live && this.open.get(live)\n if (!record) return undefined\n const search = (parent: PlainElement): { parent: PlainElement; index: number } | undefined => {\n const index = parent.children.indexOf(node)\n if (index >= 0) return { parent, index }\n for (const child of parent.children) {\n if (child.type === 'element') {\n const found = search(child)\n if (found) return found\n }\n }\n return undefined\n }\n return search(record.root)\n }\n\n /** Mark the paragraph a plain node belongs to as changed. */\n touch(node: PlainNode): void {\n const owner = this.ownerOf.get(node)\n if (owner) this.dirty.add(owner)\n }\n\n /** Nodes just placed under `parent` belong to the same paragraph as it, if any. */\n adopt(parent: PlainElement, children: readonly PlainNode[]): void {\n const owner = this.ownerOf.get(parent)\n for (const child of children) this.own(child, owner)\n if (owner) this.dirty.add(owner)\n }\n\n /** Write every changed open paragraph back into the mirror. Call at the end of a journal. */\n flushRich(): void {\n for (const live of [...this.dirty]) {\n this.dirty.delete(live)\n const record = this.open.get(live)\n if (record) this.writeBack(record)\n }\n }\n\n private writeBack(record: OpenParagraph): void {\n const { live, root } = record\n const xml = plainToXml(root) as XmlEl\n const encoded = encodeParagraph(xml.children)\n if (!encoded) {\n this.degrade(record)\n return\n }\n const attrs = attrsOf(live)\n if (JSON.stringify(attrs.toArray()) !== JSON.stringify(xml.attrs)) {\n attrs.delete(0, attrs.length)\n attrs.push(xml.attrs.map((a) => ({ ...a })))\n }\n const bindings = bindingsOf(live)\n if (JSON.stringify(bindings.toArray()) !== JSON.stringify(xml.bindings)) {\n bindings.delete(0, bindings.length)\n bindings.push(xml.bindings.map((b) => ({ ...b })))\n }\n const head = childrenOf(live)\n const stored = head.toArray().map((child) => liveToXml(child as Y.Map<unknown>))\n if (JSON.stringify(stored) !== JSON.stringify(encoded.head)) {\n head.delete(0, head.length)\n head.push(encoded.head.map((el) => xmlToLive(el)))\n }\n const inline = live.get('inline') as Y.Text\n applyUnits(inline, readUnits(inline), encoded.units)\n }\n\n /** The paragraph can no longer be held as rich text: store it as plain elements instead. */\n private degrade(record: OpenParagraph): void {\n const parent = record.live.parent\n if (!(parent instanceof Y.Array))\n throw new RegistryError('a paragraph outside a parent cannot change form')\n const index = (parent as Y.Array<LiveNode>).toArray().indexOf(record.live)\n const generic = this.toGenericLive(record.root)\n this.open.delete(record.live)\n ;(parent as Y.Array<LiveNode>).delete(index, 1)\n ;(parent as Y.Array<LiveNode>).insert(index, [generic])\n }\n\n // ── Snapshots and conversion ─────────────────────────────────────────────\n\n /** Deep copy of a node into plain objects carrying the same ids. */\n snapshot(id: string): PlainNode {\n const entry = this.require(id)\n if ('plain' in entry) return entry.plain\n return this.snapshotLive(entry.live)\n }\n\n private snapshotLive(node: LiveNode): PlainNode {\n const id = this.liveIds.get(node)\n if (id === undefined) throw new RegistryError('live node has no registered id')\n if (node instanceof Y.Text) return { type: 'text', id, value: node.toString() }\n if (isRichParagraph(node)) {\n return this.open.get(node)?.root ?? xmlToPlain(liveToXml(node), id)\n }\n const prefix = node.get('prefix') as string | undefined\n const plain: PlainElement = {\n type: 'element',\n id,\n ns: node.get('ns') as string,\n local: node.get('local') as string,\n attrs: attrsOf(node)\n .toArray()\n .map((a) => ({ ...a })),\n bindings: bindingsOf(node)\n .toArray()\n .map((b) => ({ ...b })),\n children: childrenOf(node).map((child) => this.snapshotLive(child)),\n }\n if (prefix !== undefined) plain.prefix = prefix\n return plain\n }\n\n /**\n * Replace the registry entries of a subtree with plain copies, if they still point at these exact\n * live nodes. A node that was already re-registered elsewhere (moved) is left alone.\n */\n detach(node: LiveNode): void {\n this.detachInto(node, this.snapshotLive(node))\n }\n\n private detachInto(node: LiveNode, plain: PlainNode): void {\n const id = this.liveIds.get(node)\n if (id !== undefined && this.isCurrentLive(id, node)) {\n this.entries.set(id, { plain })\n }\n if (node instanceof Y.Text || plain.type === 'text') return\n if (isRichParagraph(node)) {\n // The paragraph is going away; its open tree, if any, is detached with it.\n this.open.delete(node)\n this.dirty.delete(node)\n return\n }\n const liveChildren = childrenOf(node).toArray()\n liveChildren.forEach((child, index) => this.detachInto(child, plain.children[index]))\n }\n\n /** Build Yjs types for a plain subtree and register every node as live. */\n toLive(plain: PlainNode): LiveNode {\n if (plain.type === 'text') {\n const text = new Y.Text()\n text.insert(0, plain.value)\n this.registerLive(plain.id, text)\n return text\n }\n if (isParagraphEl(plain)) {\n const xml = plainToXml(plain) as XmlEl\n const encoded = encodeParagraph(xml.children)\n if (encoded) {\n const map = createRichParagraph(xml, encoded)\n this.liveIds.set(map, plain.id)\n this.registerPlain(plain)\n this.own(plain, map)\n this.open.set(map, { live: map, root: plain, id: plain.id })\n return map\n }\n }\n return this.toGenericLive(plain)\n }\n\n private toGenericLive(plain: PlainElement): Y.Map<unknown> {\n const map = xmlToGenericShell(plain)\n const children = new Y.Array<LiveNode>()\n children.push(plain.children.map((child) => this.toLive(child)))\n map.set('children', children)\n this.registerLive(plain.id, map)\n return map\n }\n\n /**\n * A live node that can be inserted into a parent. Anything not yet attached is built fresh; an\n * attached node is copied, because a Yjs type cannot have two parents.\n */\n attachable(id: string): LiveNode {\n return this.toLive(this.snapshot(id))\n }\n}\n\nfunction xmlToGenericShell(plain: PlainElement): Y.Map<unknown> {\n const map = new Y.Map<unknown>()\n map.set('ns', plain.ns)\n map.set('local', plain.local)\n if (plain.prefix !== undefined) map.set('prefix', plain.prefix)\n const attrs = new Y.Array<AttrJson>()\n attrs.push(plain.attrs.map((a) => ({ ...a })))\n map.set('attrs', attrs)\n const bindings = new Y.Array<BindingJson>()\n bindings.push(plain.bindings.map((b) => ({ ...b })))\n map.set('bindings', bindings)\n return map\n}\n","/**\n * Apply core's canonical primitive journals to the Yjs mirror.\n *\n * One journal is one `TreePackageStore` transaction; its effects are applied in order inside one Yjs\n * transaction so peers receive a transaction as a single update. Anything that cannot be applied\n * faithfully throws a `JournalError`; the session turns that into a failed state rather than letting\n * the mirror drift from the local tree.\n */\nimport * as Y from 'yjs'\nimport type {\n CanonicalAttributeName,\n CanonicalPrimitiveEffect,\n CanonicalPrimitiveJournal,\n} from '@docx-editor.dev/core/collaboration/replication'\nimport type { AttrJson, BindingJson, RelationshipJson } from './encoding'\nimport {\n attrsOf,\n bindingsOf,\n childrenOf,\n NodeRegistry,\n RegistryError,\n type LiveNode,\n type PlainElement,\n type PlainNode,\n} from './registry'\n\nexport class JournalError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'JournalError'\n }\n}\n\nexport interface JournalContext {\n /** Bytes of one binary package part, by the storage key a `putBinary` effect names. */\n binary(storageKey: string): Uint8Array | null\n}\n\nfunction sameAttr(a: AttrJson, qname: CanonicalAttributeName): boolean {\n return a.ns === qname.namespaceUri && a.local === qname.localName\n}\n\nfunction attrJson(qname: CanonicalAttributeName, value: string): AttrJson {\n const json: AttrJson = { ns: qname.namespaceUri, local: qname.localName, value }\n if (qname.prefix !== undefined) json.prefix = qname.prefix\n return json\n}\n\nfunction setAttribute(\n registry: NodeRegistry,\n id: string,\n qname: CanonicalAttributeName,\n value: string | null\n): void {\n const entry = registry.require(id)\n if ('plain' in entry) {\n const el = asPlainElement(entry.plain, id)\n const index = el.attrs.findIndex((a) => sameAttr(a, qname))\n if (value === null) {\n if (index >= 0) el.attrs.splice(index, 1)\n } else if (index >= 0) {\n el.attrs[index] = attrJson(qname, value)\n } else {\n el.attrs.push(attrJson(qname, value))\n }\n return\n }\n const attrs = attrsOf(asLiveElement(entry.live, id))\n const index = attrs.toArray().findIndex((a) => sameAttr(a, qname))\n if (index >= 0) attrs.delete(index, 1)\n if (value !== null) {\n if (index >= 0) attrs.insert(index, [attrJson(qname, value)])\n else attrs.push([attrJson(qname, value)])\n }\n}\n\nfunction setNamespaceBinding(\n registry: NodeRegistry,\n id: string,\n prefix: string,\n uri: string | null\n): void {\n const entry = registry.require(id)\n const binding: BindingJson | null = uri === null ? null : { prefix, ns: uri }\n if ('plain' in entry) {\n const el = asPlainElement(entry.plain, id)\n const index = el.bindings.findIndex((b) => b.prefix === prefix)\n if (index >= 0) el.bindings.splice(index, 1)\n if (binding) {\n if (index >= 0) el.bindings.splice(index, 0, binding)\n else el.bindings.push(binding)\n }\n return\n }\n const bindings = bindingsOf(asLiveElement(entry.live, id))\n const index = bindings.toArray().findIndex((b) => b.prefix === prefix)\n if (index >= 0) bindings.delete(index, 1)\n if (binding) {\n if (index >= 0) bindings.insert(index, [binding])\n else bindings.push([binding])\n }\n}\n\nfunction asLiveElement(node: LiveNode, id: string): Y.Map<unknown> {\n if (node instanceof Y.Text) throw new JournalError(`${id} is a text node, not an element`)\n return node\n}\n\nfunction asPlainElement(node: PlainNode, id: string): PlainElement {\n if (node.type === 'text') throw new JournalError(`${id} is a text node, not an element`)\n return node\n}\n\nfunction spliceText(\n registry: NodeRegistry,\n id: string,\n start: number,\n deleteCount: number,\n insert: string\n): void {\n const entry = registry.require(id)\n if ('plain' in entry) {\n const text = entry.plain\n if (text.type !== 'text') throw new JournalError(`${id} is not a text node`)\n text.value = text.value.slice(0, start) + insert + text.value.slice(start + deleteCount)\n return\n }\n const text = entry.live\n if (!(text instanceof Y.Text)) throw new JournalError(`${id} is not a text node`)\n if (start < 0 || start + deleteCount > text.length) {\n throw new JournalError(`text splice out of range on ${id}`)\n }\n if (deleteCount > 0) text.delete(start, deleteCount)\n if (insert.length > 0) text.insert(start, insert)\n}\n\n/** Detach the nodes a splice is about to remove, while their content can still be read. */\nfunction detachRemoved(\n registry: NodeRegistry,\n parent: Y.Array<LiveNode>,\n start: number,\n count: number\n): void {\n for (let i = start; i < start + count; i++) registry.detach(parent.get(i))\n}\n\nfunction spliceChildren(\n registry: NodeRegistry,\n parentId: string,\n start: number,\n deleteCount: number,\n childIds: readonly string[]\n): void {\n const parentEntry = registry.require(parentId)\n if ('plain' in parentEntry) {\n const parent = asPlainElement(parentEntry.plain, parentId)\n if (start < 0 || start + deleteCount > parent.children.length) {\n throw new JournalError(`child splice out of range on ${parentId}`)\n }\n const inserted = childIds.map((id) => registry.snapshot(id))\n parent.children.splice(start, deleteCount, ...inserted)\n registry.adopt(parent, inserted)\n return\n }\n const children = childrenOf(asLiveElement(parentEntry.live, parentId))\n if (start < 0 || start + deleteCount > children.length) {\n throw new JournalError(`child splice out of range on ${parentId}`)\n }\n detachRemoved(registry, children, start, deleteCount)\n const inserted = childIds.map((id) => registry.attachable(id))\n if (deleteCount > 0) children.delete(start, deleteCount)\n if (inserted.length > 0) children.insert(start, inserted)\n}\n\n/** Position of a live node inside its parent's child list. */\nfunction locate(\n registry: NodeRegistry,\n id: string,\n node: LiveNode\n): { children: Y.Array<LiveNode>; index: number } {\n const children = node.parent\n if (!(children instanceof Y.Array)) throw new JournalError(`${id} is not attached`)\n const index = (children as Y.Array<LiveNode>).toArray().indexOf(node)\n if (index < 0) throw new JournalError(`${id} is not in its parent`)\n void registry\n return { children: children as Y.Array<LiveNode>, index }\n}\n\nfunction moveNode(\n registry: NodeRegistry,\n id: string,\n destinationId: string,\n destinationIndex: number\n): void {\n const entry = registry.require(id)\n const live = 'live' in entry ? entry.live : registry.liveOfRoot(entry.plain)\n const copy = registry.snapshot(id)\n\n if (live) {\n const { children: source, index } = locate(registry, id, live)\n registry.detach(live)\n source.delete(index, 1)\n } else {\n // A node inside a rich paragraph: take it out of its parent in the open tree.\n const plain = 'plain' in entry ? entry.plain : undefined\n const where = plain && registry.locatePlain(plain)\n if (!where) throw new JournalError(`cannot move detached node ${id}`)\n where.parent.children.splice(where.index, 1)\n registry.touch(where.parent)\n }\n\n const destinationEntry = registry.require(destinationId)\n if ('plain' in destinationEntry) {\n const destination = asPlainElement(destinationEntry.plain, destinationId)\n destination.children.splice(destinationIndex, 0, copy)\n registry.adopt(destination, [copy])\n return\n }\n const destination = childrenOf(asLiveElement(destinationEntry.live, destinationId))\n destination.insert(destinationIndex, [registry.toLive(copy)])\n}\n\nfunction putNode(\n registry: NodeRegistry,\n effect: Extract<CanonicalPrimitiveEffect, { kind: 'putNode' }>\n): void {\n const d = effect.descriptor\n if (d.kind === 'textValue') {\n registry.registerPlain({ type: 'text', id: d.logicalId, value: '' })\n return\n }\n const element: PlainElement = {\n type: 'element',\n id: d.logicalId,\n ns: d.qname.namespaceUri,\n local: d.qname.localName,\n attrs: [],\n bindings: [],\n children: [],\n }\n if (d.qname.prefix !== undefined) element.prefix = d.qname.prefix\n registry.registerPlain(element)\n}\n\nfunction rootFor(registry: NodeRegistry, id: string): Y.Map<unknown> {\n const entry = registry.require(id)\n const live = 'live' in entry && entry.live.parent === null ? entry.live : registry.attachable(id)\n return asLiveElement(live, id)\n}\n\nexport function applyEffect(\n doc: Y.Doc,\n registry: NodeRegistry,\n effect: CanonicalPrimitiveEffect,\n context: JournalContext\n): void {\n switch (effect.kind) {\n case 'putNode':\n putNode(registry, effect)\n return\n case 'spliceText':\n spliceText(registry, effect.logicalId, effect.utf16Start, effect.deleteCount, effect.insert)\n return\n case 'setAttribute':\n setAttribute(registry, effect.logicalId, effect.qname, effect.value)\n return\n case 'setNamespaceBinding':\n setNamespaceBinding(registry, effect.logicalId, effect.prefix, effect.uri)\n return\n case 'spliceChildren':\n spliceChildren(\n registry,\n effect.parentLogicalId,\n effect.start,\n effect.deleteCount,\n effect.childLogicalIds\n )\n return\n case 'moveNode':\n moveNode(\n registry,\n effect.logicalId,\n effect.destinationParentLogicalId,\n effect.destinationIndex\n )\n return\n case 'putXmlPart':\n doc.getMap<Y.Map<unknown>>('parts').set(effect.name, rootFor(registry, effect.rootLogicalId))\n return\n case 'deleteXmlPart':\n doc.getMap('parts').delete(effect.name)\n return\n case 'putRelationship': {\n const rels = doc.getMap<Y.Map<RelationshipJson>>('rels')\n let byId = rels.get(effect.owner)\n if (!byId) {\n byId = new Y.Map<RelationshipJson>()\n rels.set(effect.owner, byId)\n }\n byId.set(effect.record.id, { ...effect.record })\n return\n }\n case 'deleteRelationship':\n doc.getMap<Y.Map<RelationshipJson>>('rels').get(effect.owner)?.delete(effect.relationshipId)\n return\n case 'putContentTypeOverride':\n doc.getMap<string>('ctOverrides').set(effect.partName.toLowerCase(), effect.mediaType)\n return\n case 'deleteContentTypeOverride':\n doc.getMap('ctOverrides').delete(effect.partName.toLowerCase())\n return\n case 'putBinary': {\n const bytes = context.binary(effect.descriptor.storageKey)\n if (!bytes) throw new JournalError(`binary ${effect.descriptor.storageKey} is not available`)\n doc.getMap<Uint8Array>('binaries').set(effect.descriptor.storageKey, bytes)\n return\n }\n case 'deleteBinary':\n doc.getMap('binaries').delete(effect.storageKey)\n return\n }\n}\n\n/** Apply one journal inside a single Yjs transaction carrying `origin`. */\nexport function applyJournal(\n doc: Y.Doc,\n registry: NodeRegistry,\n journal: CanonicalPrimitiveJournal,\n origin: unknown,\n context: JournalContext\n): void {\n try {\n doc.transact(() => {\n for (const effect of journal.effects) applyEffect(doc, registry, effect, context)\n registry.flushRich()\n }, origin)\n } catch (error) {\n if (error instanceof JournalError || error instanceof RegistryError) throw error\n throw new JournalError(error instanceof Error ? error.message : String(error))\n }\n}\n","/**\n * Binds one Yjs room to one local document port, in both directions, without a network.\n *\n * Local: every journal the port settles is applied to the mirror inside a Yjs transaction tagged with\n * `LOCAL_ORIGIN`, so peers receive it as one update and the undo manager can scope to it.\n *\n * Remote: any transaction that did not originate here (a provider, or the undo manager) is\n * materialised into a frozen package and published through `port.applyRemotePackage`, after which\n * the identity registry is rebuilt, because the store re-derives positional ids from that package.\n *\n * Ordering rule: local journals must reach the mirror before a remote update is integrated, since\n * their child indices are relative to the tree as it was. `beforeRemote` flushes them; a transport\n * calls it ahead of applying inbound data.\n */\nimport * as Y from 'yjs'\nimport type {\n CanonicalPrimitiveJournal,\n CollaborationDocumentPort,\n} from '@docx-editor.dev/core/collaboration/replication'\nimport { MaterializeCache, materialize, registerMirror, MaterializeError } from './encoding'\nimport { applyJournal, JournalError } from './journal'\nimport { NodeRegistry, RegistryError } from './registry'\n\nexport const LOCAL_ORIGIN = Symbol('arbi-coedit/local')\n\nexport type SyncFailure = 'journal' | 'materialize' | 'apply'\n\nexport interface MirrorSyncOptions {\n doc: Y.Doc\n port: CollaborationDocumentPort\n actorId: string\n /** Called once when the mirror and the local tree can no longer be kept identical. */\n onFailure?: (code: SyncFailure, detail: string) => void\n /** Called with each local journal just before it is applied to the mirror. */\n onLocalJournal?: (journal: CanonicalPrimitiveJournal) => void\n /**\n * How long remote changes may wait so a burst becomes one publication. 0 publishes at once.\n * Local operations flush a waiting change first (`flushRemote`), so an edit never runs on a\n * tree that is behind the room.\n */\n remoteDelayMs?: number\n}\n\nconst DEFAULT_REMOTE_DELAY_MS = 40\n\nexport class MirrorSync {\n readonly doc: Y.Doc\n readonly registry = new NodeRegistry()\n private readonly cache: MaterializeCache\n private readonly port: CollaborationDocumentPort\n private readonly actorId: string\n private readonly onFailure?: (code: SyncFailure, detail: string) => void\n private readonly onLocalJournal?: (journal: CanonicalPrimitiveJournal) => void\n private readonly disposers: (() => void)[] = []\n private readonly remoteDelayMs: number\n private operation = 0\n private applyingRemote = false\n private failed = false\n private remoteDirty = false\n private remoteOrigin: unknown\n private remoteTimer: ReturnType<typeof setTimeout> | undefined\n /** Parts whose node ids must be re-registered before the next local journal; true means all. */\n private staleParts: Set<string> | true | null = null\n\n constructor(options: MirrorSyncOptions) {\n this.doc = options.doc\n this.port = options.port\n this.actorId = options.actorId\n this.onFailure = options.onFailure\n this.onLocalJournal = options.onLocalJournal\n this.remoteDelayMs = options.remoteDelayMs ?? DEFAULT_REMOTE_DELAY_MS\n registerMirror(this.doc, this.registry)\n this.cache = new MaterializeCache(this.doc)\n this.disposers.push(() => this.cache.destroy())\n\n this.disposers.push(\n this.port.observePrimitiveJournal((journal) => {\n if (this.failed || this.applyingRemote) return\n try {\n this.refreshRegistry()\n this.onLocalJournal?.(journal)\n applyJournal(this.doc, this.registry, journal, LOCAL_ORIGIN, {\n binary: (key) => this.port.binaryPart(key),\n })\n } catch (error) {\n this.fail('journal', error)\n }\n })\n )\n\n const onAfterTransaction = (transaction: Y.Transaction): void => {\n if (transaction.origin === LOCAL_ORIGIN || this.failed) return\n if (transaction.changed.size === 0 && transaction.changedParentTypes.size === 0) return\n this.remoteDirty = true\n this.remoteOrigin = transaction.origin\n if (this.remoteDelayMs <= 0) this.flushRemote()\n else if (this.remoteTimer === undefined) {\n this.remoteTimer = setTimeout(() => this.flushRemote(), this.remoteDelayMs)\n }\n }\n this.doc.on('afterTransaction', onAfterTransaction)\n this.disposers.push(() => this.doc.off('afterTransaction', onAfterTransaction))\n this.disposers.push(() => clearTimeout(this.remoteTimer))\n }\n\n get hasFailed(): boolean {\n return this.failed\n }\n\n /** Mirror any journal still queued locally. Call before integrating inbound updates. */\n beforeRemote(): void {\n this.port.flushPendingJournals()\n }\n\n /** Publish any waiting remote change now. Call before a local operation runs. */\n flushRemote(): void {\n clearTimeout(this.remoteTimer)\n this.remoteTimer = undefined\n if (!this.remoteDirty || this.failed) return\n this.remoteDirty = false\n this.publishRemote(this.remoteOrigin)\n }\n\n /** Make the local tree equal to the room: used when the editor opened an older snapshot of it. */\n adopt(): void {\n this.remoteDirty = false\n this.publishRemote(undefined)\n }\n\n /** Re-register node ids for parts a remote publication replaced; deferred until a local edit needs them. */\n private refreshRegistry(): void {\n if (this.staleParts === null) return\n registerMirror(this.doc, this.registry, this.staleParts === true ? undefined : this.staleParts)\n this.staleParts = null\n }\n\n private publishRemote(origin: unknown): void {\n this.applyingRemote = true\n const changed = this.cache.take()\n try {\n const result = this.port.applyRemotePackage(materialize(this.doc, this.cache, changed), {\n origin: 'dev.docx-editor.collaboration.remote',\n actorId: typeof origin === 'string' ? origin : this.actorId,\n operationId: `${this.actorId}:remote:${this.operation++}`,\n })\n if (!result.ok) throw new JournalError(result.reason)\n if (changed === null || this.staleParts === true) this.staleParts = true\n else this.staleParts = new Set([...(this.staleParts ?? []), ...changed])\n } catch (error) {\n this.cache.restore(changed)\n this.fail(error instanceof MaterializeError ? 'materialize' : 'apply', error)\n } finally {\n this.applyingRemote = false\n }\n }\n\n private fail(code: SyncFailure, error: unknown): void {\n if (this.failed) return\n this.failed = true\n const detail =\n error instanceof JournalError ||\n error instanceof RegistryError ||\n error instanceof MaterializeError\n ? error.message\n : error instanceof Error\n ? error.message\n : String(error)\n this.onFailure?.(code, detail)\n }\n\n destroy(): void {\n for (const dispose of this.disposers.splice(0)) dispose()\n }\n}\n","/**\n * The collaboration session the editor attaches: status, own-edit undo, presence and selections,\n * on top of a Yjs room and the `MirrorSync` that keeps the room and the local document identical.\n *\n * It implements core's `EditorCollaborationSession` contract and nothing beyond it, so it can be\n * handed to `collaborationModule`-style hosts and to headless automation hosts alike. The transport\n * (Hocuspocus, or nothing at all in tests) tells it when the room is synced, dropped or rejected.\n */\nimport * as Y from 'yjs'\nimport type { Awareness } from 'y-protocols/awareness'\nimport {\n createCollaborationStatusTracker,\n safeParticipantColor,\n type CollaborationFailureCode,\n type CollaborationIdentity,\n type CollaborationLocalSelection,\n type CollaborationParticipant,\n type CollaborationRemoteSelection,\n type CollaborationRemoteSelectionAddress,\n type CollaborationStatus,\n type CollaborationStatusSnapshot,\n type EditorCollaborationSession,\n} from '@docx-editor.dev/core/collaboration'\nimport {\n historyGroupOfJournal,\n type CollaborationDocumentPort,\n} from '@docx-editor.dev/core/collaboration/replication'\nimport { COLLAB_FORMAT, isBootstrapped, readFormat } from './encoding'\nimport { LOCAL_ORIGIN, MirrorSync, type SyncFailure } from './sync'\n\nconst MAX_TEXT = 128\n/** Undo steps are closed by gesture boundaries, never by a clock. */\nconst NEVER = 1000 * 60 * 60 * 24 * 365\n\nexport interface DocxCollaborationSessionOptions {\n doc: Y.Doc\n awareness: Awareness\n documentId: string\n identity: CollaborationIdentity\n /** Keep accepting edits while the transport is down; they merge on reconnect. */\n offlineEditing?: boolean\n /** See `MirrorSyncOptions.remoteDelayMs`. */\n remoteDelayMs?: number\n}\n\nexport class CollaborationSessionError extends Error {\n readonly code: CollaborationFailureCode\n constructor(code: CollaborationFailureCode, message?: string) {\n super(message ?? code)\n this.name = 'CollaborationSessionError'\n this.code = code\n }\n}\n\nfunction validateIdentity(identity: CollaborationIdentity): CollaborationIdentity {\n const bad = (value: unknown): boolean =>\n typeof value !== 'string' || value.length === 0 || value.length > MAX_TEXT\n if (bad(identity.actorId) || bad(identity.name)) {\n throw new CollaborationSessionError('invalid-identity')\n }\n if (identity.color !== undefined && safeParticipantColor(identity.color) === undefined) {\n throw new CollaborationSessionError('invalid-identity-color')\n }\n return identity\n}\n\nfunction readIdentity(value: unknown): CollaborationIdentity | undefined {\n if (!value || typeof value !== 'object') return undefined\n const { actorId, name, color, role } = value as Record<string, unknown>\n if (typeof actorId !== 'string' || actorId.length === 0 || actorId.length > MAX_TEXT)\n return undefined\n if (typeof name !== 'string' || name.length === 0 || name.length > MAX_TEXT) return undefined\n return {\n actorId,\n name,\n ...(typeof color === 'string' && safeParticipantColor(color) ? { color } : {}),\n ...(role === 'human' || role === 'agent' ? { role } : {}),\n }\n}\n\ntype StatusListener = Parameters<EditorCollaborationSession['subscribeStatus']>[0]\n\nexport class DocxCollaborationSession implements EditorCollaborationSession {\n readonly documentId: string\n readonly sessionId: string\n readonly identity: CollaborationIdentity\n\n private readonly doc: Y.Doc\n private readonly awareness: Awareness\n private readonly offlineEditing: boolean\n private readonly remoteDelayMs: number | undefined\n private readonly tracker = createCollaborationStatusTracker('initializing')\n private readonly statusListeners = new Set<StatusListener>()\n private readonly participantListeners = new Set<\n (participants: readonly CollaborationParticipant[]) => void\n >()\n private readonly selectionListeners = new Set<\n (selections: readonly CollaborationRemoteSelection[]) => void\n >()\n private readonly undoManager: Y.UndoManager\n private sync: MirrorSync | undefined\n private port: CollaborationDocumentPort | undefined\n private lastGroup: symbol | undefined\n private participantsCache: readonly CollaborationParticipant[] = []\n private selectionsCache: readonly CollaborationRemoteSelection[] = []\n private selectionsKey = '[]'\n private baselineVector: string | undefined\n private readonly disposers: (() => void)[] = []\n\n constructor(options: DocxCollaborationSessionOptions) {\n this.documentId = options.documentId\n this.identity = validateIdentity(options.identity)\n this.sessionId = `${options.identity.actorId}:${randomToken()}`\n this.doc = options.doc\n this.awareness = options.awareness\n this.offlineEditing = options.offlineEditing ?? false\n this.remoteDelayMs = options.remoteDelayMs\n\n this.undoManager = new Y.UndoManager(\n [\n this.doc.getMap('parts'),\n this.doc.getMap('rels'),\n this.doc.getMap('ctOverrides'),\n this.doc.getMap('binaries'),\n ],\n { trackedOrigins: new Set([LOCAL_ORIGIN]), captureTimeout: NEVER }\n )\n\n this.awareness.setLocalStateField('user', this.identity)\n const onAwareness = (): void => {\n this.refreshParticipants()\n this.refreshSelections()\n }\n this.awareness.on('change', onAwareness)\n this.disposers.push(() => this.awareness.off('change', onAwareness))\n this.refreshParticipants()\n }\n\n // ── Status ───────────────────────────────────────────────────────────────\n\n status(): CollaborationStatus {\n return this.tracker.status()\n }\n\n statusSnapshot(): CollaborationStatusSnapshot {\n return this.tracker.snapshot()\n }\n\n subscribeStatus(listener: StatusListener): () => void {\n this.statusListeners.add(listener)\n return () => this.statusListeners.delete(listener)\n }\n\n private setStatus(\n status: CollaborationStatus,\n code?: CollaborationFailureCode,\n detail?: string\n ): void {\n if (this.tracker.status() === 'destroyed') return\n if (!this.tracker.set(status, code, detail)) return\n for (const listener of [...this.statusListeners]) listener(status, code, detail)\n }\n\n /** The room has synced and holds a document this build understands. */\n markReady(): void {\n if (!isBootstrapped(this.doc)) {\n this.setStatus('error', 'not-initialized')\n return\n }\n if (readFormat(this.doc) !== COLLAB_FORMAT) {\n this.setStatus('error', 'collaboration-format-mismatch', readFormat(this.doc))\n return\n }\n this.baselineVector = vectorKey(this.doc)\n this.setStatus('ready')\n }\n\n markDisconnected(): void {\n if (this.status() === 'ready') this.setStatus('disconnected', 'transport-disconnected')\n }\n\n markReconnected(): void {\n if (this.status() === 'disconnected') this.setStatus('ready')\n }\n\n markFailed(code: CollaborationFailureCode, detail?: string): void {\n this.setStatus('error', code, detail)\n }\n\n /** True once an editor has attached its document port. */\n get attached(): boolean {\n return this.port !== undefined\n }\n\n gateOperations(): CollaborationFailureCode | null {\n // The editor is about to write: make its tree current with the room first.\n this.sync?.flushRemote()\n switch (this.status()) {\n case 'ready':\n return this.port ? null : 'collaboration-session-not-attached'\n case 'disconnected':\n return this.offlineEditing && this.port ? null : 'collaboration-session-not-ready'\n case 'destroyed':\n return 'collaboration-session-destroyed'\n default:\n return 'collaboration-session-not-ready'\n }\n }\n\n // ── Attachment ───────────────────────────────────────────────────────────\n\n attach(port: CollaborationDocumentPort): () => void {\n if (this.port) {\n this.markFailed('port-already-attached')\n return () => {}\n }\n if (port.documentId !== this.documentId) {\n this.markFailed('document-id-mismatch')\n return () => {}\n }\n this.port = port\n const sync = new MirrorSync({\n doc: this.doc,\n port,\n actorId: this.identity.actorId,\n remoteDelayMs: this.remoteDelayMs,\n onFailure: (code: SyncFailure, detail: string) => {\n this.markFailed(code === 'journal' ? 'local-mirror-failed' : 'remote-apply-failed', detail)\n },\n onLocalJournal: (journal) => {\n const group = historyGroupOfJournal(journal)\n if (group === undefined || group !== this.lastGroup) this.undoManager.stopCapturing()\n this.lastGroup = group\n },\n })\n this.sync = sync\n // The editor opened bytes written from the room as it was. If the room moved since, adopt it.\n if (this.baselineVector !== undefined && this.baselineVector !== vectorKey(this.doc)) {\n sync.adopt()\n }\n const onPortChange = port.subscribe(() => this.refreshSelections())\n return () => {\n onPortChange()\n sync.destroy()\n if (this.sync === sync) this.sync = undefined\n if (this.port === port) this.port = undefined\n }\n }\n\n /** Transport hook: call before integrating inbound Yjs data so queued local edits are mirrored first. */\n beforeRemote(): void {\n this.sync?.beforeRemote()\n }\n\n // ── Undo ─────────────────────────────────────────────────────────────────\n\n canUndo(): boolean {\n return this.undoManager.undoStack.length > 0\n }\n\n canRedo(): boolean {\n return this.undoManager.redoStack.length > 0\n }\n\n undo(): boolean {\n this.flushPendingJournals()\n if (this.gateOperations() !== null || !this.canUndo()) return false\n this.undoManager.stopCapturing()\n this.undoManager.undo()\n this.sync?.flushRemote()\n return true\n }\n\n redo(): boolean {\n this.flushPendingJournals()\n if (this.gateOperations() !== null || !this.canRedo()) return false\n this.undoManager.stopCapturing()\n this.undoManager.redo()\n this.sync?.flushRemote()\n return true\n }\n\n // ── Presence ─────────────────────────────────────────────────────────────\n\n setLocalSelection(selection: CollaborationLocalSelection | null): void {\n this.awareness.setLocalStateField('selection', selection)\n }\n\n participants(): readonly CollaborationParticipant[] {\n return this.participantsCache\n }\n\n subscribeParticipants(\n listener: (participants: readonly CollaborationParticipant[]) => void\n ): () => void {\n this.participantListeners.add(listener)\n return () => this.participantListeners.delete(listener)\n }\n\n remoteSelections(): readonly CollaborationRemoteSelection[] {\n return this.selectionsCache\n }\n\n subscribeRemoteSelections(\n listener: (selections: readonly CollaborationRemoteSelection[]) => void\n ): () => void {\n this.selectionListeners.add(listener)\n return () => this.selectionListeners.delete(listener)\n }\n\n private refreshParticipants(): void {\n const byActor = new Map<string, CollaborationParticipant>()\n for (const [clientId, state] of this.awareness.getStates()) {\n const identity = readIdentity((state as { user?: unknown }).user)\n if (!identity) continue\n const isLocal = clientId === this.awareness.clientID\n const existing = byActor.get(identity.actorId)\n byActor.set(identity.actorId, { ...identity, isLocal: isLocal || existing?.isLocal === true })\n }\n const next = [...byActor.values()].sort((a, b) => Number(b.isLocal) - Number(a.isLocal))\n const same =\n next.length === this.participantsCache.length &&\n next.every((p, i) => {\n const previous = this.participantsCache[i]\n return (\n p.actorId === previous.actorId &&\n p.name === previous.name &&\n p.color === previous.color &&\n p.isLocal === previous.isLocal\n )\n })\n if (same) return\n this.participantsCache = next\n for (const listener of [...this.participantListeners]) listener(next)\n }\n\n private refreshSelections(): void {\n const port = this.port\n const next: CollaborationRemoteSelection[] = []\n if (port) {\n for (const [clientId, state] of this.awareness.getStates()) {\n if (clientId === this.awareness.clientID) continue\n const record = state as { user?: unknown; selection?: CollaborationLocalSelection | null }\n const identity = readIdentity(record.user)\n const selection = record.selection\n if (!identity || !selection) continue\n const anchor = resolveAddress(port, selection.anchor)\n const head = resolveAddress(port, selection.head)\n if (!anchor || !head) continue\n next.push({\n actorId: identity.actorId,\n name: identity.name,\n ...(identity.color ? { color: identity.color } : {}),\n anchor,\n head,\n ...(selection.kind ? { kind: selection.kind } : {}),\n })\n }\n }\n const key = JSON.stringify(next)\n if (key === this.selectionsKey) return\n this.selectionsKey = key\n this.selectionsCache = next\n for (const listener of [...this.selectionListeners]) listener(next)\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────────────\n\n flushPendingJournals(): void {\n this.port?.flushPendingJournals()\n }\n\n destroy(): void {\n if (this.status() === 'destroyed') return\n this.flushPendingJournals()\n this.sync?.destroy()\n this.sync = undefined\n this.port = undefined\n this.undoManager.destroy()\n this.awareness.setLocalState(null)\n for (const dispose of this.disposers.splice(0)) dispose()\n this.setStatus('destroyed')\n this.statusListeners.clear()\n this.participantListeners.clear()\n this.selectionListeners.clear()\n }\n}\n\nfunction resolveAddress(\n port: CollaborationDocumentPort,\n address: { paragraphId: string; offset: number } | undefined\n): CollaborationRemoteSelectionAddress | undefined {\n if (!address || typeof address.paragraphId !== 'string' || !Number.isInteger(address.offset)) {\n return undefined\n }\n const paragraph = port.paragraphByStableId(address.paragraphId)\n if (!paragraph) return undefined\n return {\n paragraphId: paragraph.paragraphId,\n nodeId: paragraph.nodeId,\n offset: Math.max(0, Math.min(address.offset, paragraph.text.length)),\n }\n}\n\nfunction vectorKey(doc: Y.Doc): string {\n return Array.from(Y.encodeStateVector(doc)).join(',')\n}\n\n/** Unique per attachment. `crypto.randomUUID` is absent outside secure contexts, so fall back. */\nfunction randomToken(): string {\n if (typeof crypto.randomUUID === 'function') return crypto.randomUUID()\n const bytes = crypto.getRandomValues(new Uint8Array(16))\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')\n}\n","import { COLLAB_FORMAT } from './encoding'\n\nexport const COLLAB_PROTOCOL = 1\n\n/** What a client sends with its token so the server can refuse an incompatible build. */\nexport const DOCUMENT_COLLABORATION_VERSIONS = {\n format: COLLAB_FORMAT,\n protocol: COLLAB_PROTOCOL,\n} as const\n","import type { EditorModule } from '@docx-editor.dev/core'\nimport type { EditorCollaborationSession } from '@docx-editor.dev/core/collaboration'\n\n/** The editor module that attaches a collaboration session to an editor. */\nexport function collaborationModule(options: {\n session: EditorCollaborationSession\n}): EditorModule {\n return { id: 'collaboration', collaboration: { session: options.session } }\n}\n"]}
|