@p10node/office-engine 0.2.2 → 0.2.3
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/README.md +11 -3
- package/dist/{DocViewer-Co7q5D2H.js → DocViewer-CT8VAa1L.js} +52 -6
- package/dist/DocViewer-CT8VAa1L.js.map +1 -0
- package/dist/{collab-BvjXvfJ9.js → collab-Dx00zqXR.js} +215 -175
- package/dist/collab-Dx00zqXR.js.map +1 -0
- package/dist/collab.js +1 -1
- package/dist/embed.js +1 -1
- package/dist/index.js +2 -2
- package/dist/office-engine.embed.js +26 -26
- package/dist/types/react/docx/DocxEditor.d.ts +6 -1
- package/dist/types/react/edit/input.d.ts +12 -0
- package/package.json +2 -1
- package/dist/DocViewer-Co7q5D2H.js.map +0 -1
- package/dist/collab-BvjXvfJ9.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collab-Dx00zqXR.js","names":["CAPTURED","transformX","conflictsX","isStructural","hosts","waiters","registerHost","m","client","kind","host","fn","getHost","watchHost","w","set","cur","channels","channel","c","NO_PEERS","setPeers","peers","getPeers","subscribePeers","publishLocal","data","onLocal","rlen","r","plen","runs","n","collapsed","s","shiftPa","pa","d","runsText","shallowEq","a","b","ka","k","sameText","normalize","out","last","splitRuns","left","right","pos","o","cut","runAt","l","i","x","insertText","text","base","run","fallback","style","deleteRange","formatRange","rest","mid","fmt","prevBoundary","Segmenter","nextBoundary","ordered","caret","p","sameSel","planDelete","e","sel","list","at","first","opDelete","plan","opts","planAt","opInsertRuns","fill","lines","ins","props","isLast","body","b0","opInsert","opEnter","opBackspace","from","word","prev","pp","merged","opDeleteForward","to","next","np","runSpan","stop","spanEnd","posFromDom","pel","node","root","offset","sp","span","walker","t","domFromPos","spans","pick","end","parent","idx","rem","getSel","rn","selPoints","RichInput","f","all","paras","ro","el","dom","active","focus","target","h","mod","ov","READS","bkey","matches","uniq","xs","pidsOf","blocks","atomKey","_t","diffRuns","units","y","pre","suf","spliceRuns","del","mapPos","mapByDiff","before","after","sameProps","DocxCollab","resolve","site","ed","method","bytes","args","pid","bi","cell","pi","ri","ci","want","pids","loc","pas","ck","op","lk","call","prior","pins","mine","pending","remote","ops","result","styles","locs","nextPids","steps","inRegion","nb","step","region","count","u","undo","focused","map","was","now","touched","key","pages","fd","ad","notNull","CollabSession","transport","adapter","reject","res","wait","event","limit","message","max","items","it","applied","rebase","hole","tail","id","B64","toB64","u8","fromB64","bin","encode","value","v","decode","WebSocketTransport","url","protocols","ws","delay","msg","MemoryTransport","hub","latency","ms","conn","wire","CAPTURED$1","XlsxCollab","sheet","which","keep","rec","transformP","conflictsP","CAPTURED","PptxCollab","slide","rid","PEER_COLORS","CollabHub","createRoom","loaded","snap","seqs","room","closed","queued","broadcast","except","join","used","color","info","ctx","reset","send","receive","rl","log","seq","start","nextSite","ReplayTransport","welcome","compact","batches","collab","startCollab","check","MemoryBlobStore","prefix","pad","enc","dec","json","parse","RoomStore","blobs","epoch","buf","old","head","file","meta","keys","segs","upTo","seen","line","batch","rooms","snapshot","time","drop","ext","oldest","floor","docx","session","offs","peer"],"sources":["../src/collab/hosts.ts","../src/react/edit/rich.ts","../src/react/edit/input.ts","../src/collab/docx.ts","../src/collab/session.ts","../src/collab/codec.ts","../src/collab/transport.ts","../src/collab/xlsx.ts","../src/collab/pptx-ops.ts","../src/collab/pptx.ts","../src/collab/protocol.ts","../src/collab/hub.ts","../src/collab/compact.ts","../src/collab/store.ts","../src/collab/index.ts"],"sourcesContent":["/**\n * Views register their live editing objects here so a collaboration session\n * (created independently, e.g. by DocViewer) can reach them. Tiny on purpose:\n * views import only this file.\n */\n\ntype Fn = (host: unknown) => void\n\nconst hosts = new WeakMap<object, Map<string, unknown>>()\nconst waiters = new WeakMap<object, Map<string, Set<Fn>>>()\n\n/** registers `host` for (client, kind); returns the unregister function */\nexport function registerHost<T>(client: object, kind: string, host: T): () => void {\n let m = hosts.get(client)\n if (!m) hosts.set(client, (m = new Map()))\n m.set(kind, host)\n for (const fn of waiters.get(client)?.get(kind) ?? []) fn(host)\n return () => {\n if (m!.get(kind) === host) m!.delete(kind)\n }\n}\n\nexport function getHost<T>(client: object, kind: string): T | undefined {\n return hosts.get(client)?.get(kind) as T | undefined\n}\n\n/** calls `fn` with the current host and every host registered later */\nexport function watchHost<T>(client: object, kind: string, fn: (host: T) => void): () => void {\n let w = waiters.get(client)\n if (!w) waiters.set(client, (w = new Map()))\n let set = w.get(kind)\n if (!set) w.set(kind, (set = new Set()))\n set.add(fn as Fn)\n const cur = getHost<T>(client, kind)\n if (cur) fn(cur)\n return () => set!.delete(fn as Fn)\n}\n\n// ---------------------------------------------------------------- presence channel (views ↔ session)\n\nexport interface PeerView {\n site: number\n name: string\n color: string\n presence?: unknown\n}\n\ninterface Channel {\n peers: PeerView[]\n peerFns: Set<() => void>\n localFns: Set<(data: unknown) => void>\n}\n\nconst channels = new WeakMap<object, Channel>()\n\nfunction channel(client: object): Channel {\n let c = channels.get(client)\n if (!c) channels.set(client, (c = { peers: NO_PEERS, peerFns: new Set(), localFns: new Set() }))\n return c\n}\n\n/** session → views: collaborators and where they are */\nexport function setPeers(client: object, peers: PeerView[]) {\n const c = channel(client)\n c.peers = peers\n for (const fn of c.peerFns) fn()\n}\n\nconst NO_PEERS: PeerView[] = []\n\n/** stable between changes (usable as a useSyncExternalStore snapshot) */\nexport function getPeers(client: object): PeerView[] {\n return channels.get(client)?.peers ?? NO_PEERS\n}\n\nexport function subscribePeers(client: object, fn: () => void): () => void {\n const c = channel(client)\n c.peerFns.add(fn)\n return () => c.peerFns.delete(fn)\n}\n\n/** views → session: the local user's position (selection, active slide…) */\nexport function publishLocal(client: object, data: unknown) {\n for (const fn of channels.get(client)?.localFns ?? []) fn(data)\n}\n\nexport function onLocal(client: object, fn: (data: unknown) => void): () => void {\n const c = channel(client)\n c.localFns.add(fn)\n return () => c.localFns.delete(fn)\n}\n","/**\n * Pure run-level text operations shared by the DOCX and PPTX editors.\n * A run is either text ({ t: 'text', text }) or an atomic object counting as one character.\n */\nexport interface RRun {\n t: string\n text?: string\n s?: object\n d?: object\n src?: unknown\n href?: string\n lk?: string\n}\n\nexport interface Pos {\n /** paragraph address (container path; last segment = index in container) */\n pa: string\n o: number\n}\n\nexport interface Sel {\n a: Pos\n f: Pos\n}\n\nexport const rlen = (r: RRun) => (r.t === 'text' ? r.text!.length : 1)\nexport const plen = (runs: RRun[]) => runs.reduce((n, r) => n + rlen(r), 0)\nexport const collapsed = (s: Sel) => s.a.pa === s.f.pa && s.a.o === s.f.o\nexport const shiftPa = (pa: string, d: number) => pa.replace(/(\\d+)$/, (n) => String(Number(n) + d))\n\nexport function runsText(runs: RRun[]): string {\n return runs.map((r) => (r.t === 'text' ? r.text : '\\uFFFC')).join('')\n}\n\nfunction shallowEq(a: object | undefined, b: object | undefined): boolean {\n if (a === b) return true\n if (!a || !b) return !a && !b\n const ka = Object.keys(a)\n if (ka.length !== Object.keys(b).length) return false\n for (const k of ka) if ((a as Record<string, unknown>)[k] !== (b as Record<string, unknown>)[k]) return false\n return true\n}\n\nconst sameText = (a: RRun, b: RRun) => a.t === 'text' && b.t === 'text' && a.href === b.href && a.lk === b.lk && shallowEq(a.s, b.s) && shallowEq(a.d, b.d)\n\n/** Merges adjacent identical text runs and drops empty ones. */\nexport function normalize<R extends RRun>(runs: R[]): R[] {\n const out: R[] = []\n for (const r of runs) {\n if (r.t === 'text' && !r.text) continue\n const last = out[out.length - 1]\n if (last && sameText(last, r)) out[out.length - 1] = { ...last, text: last.text! + r.text! }\n else out.push(r)\n }\n return out\n}\n\n/** Splits runs at offset o (text runs are cut). */\nexport function splitRuns<R extends RRun>(runs: R[], o: number): [R[], R[]] {\n const left: R[] = []\n const right: R[] = []\n let pos = 0\n for (const r of runs) {\n const n = rlen(r)\n if (pos + n <= o) left.push(r)\n else if (pos >= o) right.push(r)\n else {\n const cut = o - pos\n left.push({ ...r, text: r.text!.slice(0, cut) })\n right.push({ ...r, text: r.text!.slice(cut) })\n }\n pos += n\n }\n return [left, right]\n}\n\nexport function sliceRuns<R extends RRun>(runs: R[], a: number, b: number): R[] {\n return splitRuns(splitRuns(runs, b)[0], a)[1]\n}\n\n/** Text run whose style applies at offset o (left affinity). */\nexport function runAt<R extends RRun>(runs: R[], o: number): R | undefined {\n const [l, r] = splitRuns(runs, o)\n for (let i = l.length - 1; i >= 0; i--) if (l[i].t === 'text') return l[i]\n return r.find((x) => x.t === 'text')\n}\n\nexport function insertText<R extends RRun>(runs: R[], o: number, text: string, style?: Partial<R>, fallback?: Partial<R>): R[] {\n if (!text) return runs\n const [l, r] = splitRuns(runs, o)\n const base = runAt(runs, o)\n const run = { t: 'text', ...(base ?? fallback ?? {}), ...(style ?? {}), text } as R\n if (style?.s && base?.s) run.s = { ...base.s, ...style.s }\n if (style?.d || base?.d) run.d = { ...(base?.d ?? {}), ...(style?.d ?? {}) }\n if (run.d && !Object.keys(run.d).length) delete run.d\n return normalize([...l, run, ...r])\n}\n\nexport function deleteRange<R extends RRun>(runs: R[], a: number, b: number): R[] {\n if (b <= a) return runs\n return normalize([...splitRuns(runs, a)[0], ...splitRuns(runs, b)[1]])\n}\n\nexport function formatRange<R extends RRun>(runs: R[], a: number, b: number, s: object, d: object): R[] {\n const [l, rest] = splitRuns(runs, a)\n const [mid, r] = splitRuns(rest, b - a)\n const fmt = mid.map((x) => (x.t === 'text' ? { ...x, s: { ...(x.s ?? {}), ...s }, d: { ...(x.d ?? {}), ...d } } : x))\n return normalize([...l, ...fmt, ...r])\n}\n\n/** Previous grapheme boundary (surrogate pairs + combining marks). */\nexport function prevBoundary(text: string, o: number): number {\n if (o <= 0) return 0\n type Seg = { segment(s: string): Iterable<{ index: number }> }\n const Segmenter = (Intl as unknown as { Segmenter?: new (l?: string, o?: object) => Seg }).Segmenter\n if (Segmenter) {\n let last = 0\n for (const s of new Segmenter(undefined, { granularity: 'grapheme' }).segment(text.slice(0, o))) last = s.index\n return last\n }\n const c = text.charCodeAt(o - 1)\n return c >= 0xdc00 && c <= 0xdfff && o >= 2 ? o - 2 : o - 1\n}\n\nexport function nextBoundary(text: string, o: number): number {\n if (o >= text.length) return text.length\n type Seg = { segment(s: string): Iterable<{ index: number; segment: string }> }\n const Segmenter = (Intl as unknown as { Segmenter?: new (l?: string, o?: object) => Seg }).Segmenter\n if (Segmenter) {\n for (const s of new Segmenter(undefined, { granularity: 'grapheme' }).segment(text.slice(o))) return o + s.segment.length\n }\n const c = text.charCodeAt(o)\n return c >= 0xd800 && c <= 0xdbff ? o + 2 : o + 1\n}\n","/**\n * Controlled contentEditable: the DOM is only a view. Every mutation is taken from\n * `beforeinput` (cancelled) and applied to the model through a RichHost; IME\n * composition (Vietnamese Telex/VNI, CJK…) is committed on `compositionend`.\n */\nimport {\n collapsed, deleteRange, insertText, nextBoundary, normalize, plen, prevBoundary, runAt, runsText, shiftPa, splitRuns,\n type Pos, type RRun, type Sel,\n} from './rich'\n\nexport interface RichPara {\n runs: RRun[]\n}\n\nexport interface ReplaceOpts {\n label?: string\n /** rebuild paragraph DOM (after IME composition mutated it) */\n remount?: boolean\n}\n\nexport interface RichHost<P extends RichPara = RichPara> {\n para(pa: string): P | undefined\n /** inclusive list of paragraph addresses from a to b in one container, or null */\n span(a: string, b: string): string[] | null\n prev(pa: string): string | undefined\n next(pa: string): string | undefined\n cmp(a: string, b: string): number\n /** replace contiguous paragraphs; `sel` is the selection afterwards */\n replace(pas: string[], next: P[], sel: Sel, opts?: ReplaceOpts): void\n withRuns(p: P, runs: RRun[]): P\n split(p: P, left: RRun[], right: RRun[], atEnd: boolean): [P, P]\n join(a: P, b: P, runs: RRun[]): P\n /** Backspace at offset 0 (e.g. leave a list); true when handled */\n backspaceAtStart?(pa: string, p: P): boolean\n /** Tab inside a paragraph (e.g. indent list); true when handled */\n tab?(sel: Sel, shift: boolean): boolean\n undo(): void\n redo(): void\n toggle?(key: 'b' | 'i' | 'u'): void\n shortcut?(e: KeyboardEvent): boolean\n /** style for text typed into an empty paragraph */\n defaultRun?(p: P): Partial<RRun> | undefined\n /** paste with formatting / files; true when handled */\n pasteRich?(sel: Sel, data: DataTransfer): boolean\n /** caret style for the next typed text (set after formatting a collapsed selection) */\n pendingStyle?(): Partial<RRun> | undefined\n clearPending?(): void\n onSelection?(sel: Sel | null): void\n /** the whole document (select all); null when there is nothing to select */\n all?(): Sel | null\n /** deletes a range that spans other blocks (tables): applies the change and returns the caret, or null when unsupported */\n deleteAcross?(s: Pos, e: Pos): Pos | null\n}\n\nexport function ordered(host: RichHost, s: Sel): [Pos, Pos] {\n const c = host.cmp(s.a.pa, s.f.pa)\n if (c < 0 || (c === 0 && s.a.o <= s.f.o)) return [s.a, s.f]\n return [s.f, s.a]\n}\n\nconst caret = (p: Pos): Sel => ({ a: p, f: p })\nconst sameSel = (a: Sel, b: Sel) => a.a.pa === b.a.pa && a.a.o === b.a.o && a.f.pa === b.f.pa && a.f.o === b.f.o\n\n// ---------------------------------------------------------------- model operations\n\ninterface Plan<P extends RichPara> {\n pas: string[]\n paras: P[]\n at: Pos\n /** the deletion is already applied (block-level, see RichHost.deleteAcross) */\n applied?: boolean\n}\n\n/** Removes the selected content (in memory); null when the selection spans containers. */\nfunction planDelete<P extends RichPara>(host: RichHost<P>, sel: Sel): Plan<P> | null {\n const [s, e] = ordered(host, sel)\n if (s.pa === e.pa) {\n const p = host.para(s.pa)\n if (!p) return null\n return { pas: [s.pa], paras: [host.withRuns(p, deleteRange(p.runs, s.o, e.o))], at: s }\n }\n const list = host.span(s.pa, e.pa)\n if (!list) {\n const at = host.deleteAcross?.(s, e)\n const p = at && host.para(at.pa)\n return at && p ? { pas: [at.pa], paras: [p], at, applied: true } : null\n }\n const first = host.para(list[0])!\n const last = host.para(list[list.length - 1])!\n const runs = normalize([...splitRuns(first.runs, s.o)[0], ...splitRuns(last.runs, e.o)[1]])\n return { pas: list, paras: [host.join(first, last, runs)], at: s }\n}\n\nexport function opDelete(host: RichHost, sel: Sel, opts?: ReplaceOpts) {\n const plan = planDelete(host, sel)\n if (!plan || plan.applied) return\n host.replace(plan.pas, plan.paras, caret(plan.at), opts)\n}\n\nfunction planAt(host: RichHost, sel: Sel): Plan<RichPara> | null {\n if (!collapsed(sel)) return planDelete(host, sel)\n const p = host.para(sel.a.pa)\n return p ? { pas: [sel.a.pa], paras: [p], at: sel.a } : null\n}\n\n/**\n * Inserts runs at the selection; `lines[i]` (i > 0) start new paragraphs.\n * `props[i]` can adjust the paragraph created for line i (e.g. heading style from pasted HTML).\n */\nexport function opInsertRuns(host: RichHost, sel: Sel, lines: RRun[][], opts: ReplaceOpts = {}, props?: ((p: RichPara) => RichPara)[]) {\n const plan = planAt(host, sel)\n if (!plan) return\n const p = plan.paras[0]\n const o = plan.at.o\n const [left, right] = splitRuns(p.runs, o)\n const fallback = runAt(p.runs, o) ?? (host.defaultRun?.(p) as RRun | undefined)\n const fill = (runs: RRun[]) => runs.map((r) => (r.t === 'text' && !r.s && fallback ? { ...fallback, ...r, s: fallback.s, src: fallback.src } : r))\n if (lines.length === 1) {\n const ins = fill(lines[0])\n const runs = normalize([...left, ...ins, ...right])\n host.replace(plan.pas, [host.withRuns(p, runs)], caret({ pa: plan.at.pa, o: o + plen(ins) }), { label: 'paste', ...opts })\n return\n }\n const out: RichPara[] = []\n let cur = host.withRuns(p, normalize([...left, ...fill(lines[0])]))\n if (props?.[0]) cur = props[0](cur)\n for (let i = 1; i < lines.length; i++) {\n const isLast = i === lines.length - 1\n const body = fill(lines[i])\n const [a, b0] = host.split(cur, cur.runs, normalize([...body, ...(isLast ? right : [])]), !isLast)\n out.push(a)\n cur = props?.[i] ? props[i](b0) : b0\n }\n out.push(cur)\n host.replace(plan.pas, out, caret({ pa: shiftPa(plan.at.pa, out.length - 1), o: plen(fill(lines[lines.length - 1])) }), { label: 'paste', ...opts })\n}\n\nexport function opInsert(host: RichHost, sel: Sel, text: string, opts?: ReplaceOpts) {\n const plan = planAt(host, sel)\n if (!plan) return\n const style = host.pendingStyle?.()\n host.clearPending?.()\n const p = plan.paras[0]\n const o = plan.at.o\n const lines = text.replace(/\\r\\n?/g, '\\n').split('\\n')\n if (lines.length === 1 || opts?.label === 'linebreak') {\n const runs = insertText(p.runs, o, text, style, host.defaultRun?.(p))\n host.replace(plan.pas, [host.withRuns(p, runs)], caret({ pa: plan.at.pa, o: o + text.length }), { label: 'type', ...opts })\n return\n }\n const base = (style ? { ...(runAt(p.runs, o) ?? host.defaultRun?.(p) ?? {}), ...style } : undefined) as RRun | undefined\n opInsertRuns(host, sel, lines.map((l) => (l ? [{ ...(base ?? {}), t: 'text', text: l } as RRun] : [])), opts)\n}\n\nexport function opEnter(host: RichHost, sel: Sel) {\n const plan = collapsed(sel) ? (() => {\n const p = host.para(sel.a.pa)\n return p ? { pas: [sel.a.pa], paras: [p], at: sel.a } : null\n })() : planDelete(host, sel)\n if (!plan) return\n const p = plan.paras[0]\n const [l, r] = splitRuns(p.runs, plan.at.o)\n const [a, b] = host.split(p, l, r, plan.at.o >= plen(p.runs))\n host.replace(plan.pas, [a, b], caret({ pa: shiftPa(plan.at.pa, 1), o: 0 }), { label: 'enter' })\n}\n\nexport function opBackspace(host: RichHost, sel: Sel, word = false) {\n if (!collapsed(sel)) return opDelete(host, sel)\n const { pa, o } = sel.a\n const p = host.para(pa)\n if (!p) return\n if (o > 0) {\n const text = runsText(p.runs)\n let from = prevBoundary(text, o)\n if (word) {\n const m = /(\\S+\\s*|\\s+)$/.exec(text.slice(0, o))\n if (m) from = o - m[0].length\n }\n host.replace([pa], [host.withRuns(p, deleteRange(p.runs, from, o))], caret({ pa, o: from }), { label: 'delete' })\n return\n }\n if (host.backspaceAtStart?.(pa, p)) return\n const prev = host.prev(pa)\n const pp = prev ? host.para(prev) : undefined\n if (!prev || !pp) return\n const merged = host.join(pp, p, normalize([...pp.runs, ...p.runs]))\n host.replace([prev, pa], [merged], caret({ pa: prev, o: plen(pp.runs) }), { label: 'merge' })\n}\n\nexport function opDeleteForward(host: RichHost, sel: Sel, word = false) {\n if (!collapsed(sel)) return opDelete(host, sel)\n const { pa, o } = sel.a\n const p = host.para(pa)\n if (!p) return\n const len = plen(p.runs)\n if (o < len) {\n const text = runsText(p.runs)\n let to = nextBoundary(text, o)\n if (word) {\n const m = /^(\\s*\\S+|\\s+)/.exec(text.slice(o))\n if (m) to = o + m[0].length\n }\n host.replace([pa], [host.withRuns(p, deleteRange(p.runs, o, to))], caret({ pa, o }), { label: 'delete' })\n return\n }\n const next = host.next(pa)\n const np = next ? host.para(next) : undefined\n if (!next || !np) return\n const merged = host.join(p, np, normalize([...p.runs, ...np.runs]))\n host.replace([pa, next], [merged], caret({ pa, o }), { label: 'merge' })\n}\n\n// ---------------------------------------------------------------- DOM mapping\n\nfunction runSpan(n: Node | null, stop: Element): HTMLElement | null {\n const el = n && (n.nodeType === 1 ? (n as Element) : n.parentElement)\n const s = el?.closest('[data-o]') as HTMLElement | null\n return s && stop.contains(s) ? s : null\n}\n\nfunction spanEnd(s: HTMLElement): number {\n const o = Number(s.dataset.o)\n if (s.hasAttribute('data-obj')) return o + 1\n if (s.hasAttribute('data-empty')) return o\n return o + (s.textContent?.length ?? 0)\n}\n\nexport function posFromDom(root: HTMLElement, node: Node, offset: number): Pos | null {\n const start = node.nodeType === 1 ? (node as Element) : node.parentElement\n const pel = start?.closest('[data-pa]') as HTMLElement | null\n if (!pel || !root.contains(pel)) return null\n const pa = pel.dataset.pa!\n if (!runSpan(node, pel)) {\n // boundary between runs: end of the last run span before the point\n const r = document.createRange()\n r.setStart(node, offset)\n r.collapse(true)\n let o = 0\n for (const sp of Array.from(pel.querySelectorAll<HTMLElement>('[data-o]'))) {\n if (r.comparePoint(sp, sp.childNodes.length) < 0) o = spanEnd(sp)\n else break\n }\n return { pa, o }\n }\n const span = runSpan(node, pel)!\n const base = Number(span.dataset.o)\n if (span.hasAttribute('data-empty')) return { pa, o: base }\n if (span.hasAttribute('data-obj')) return { pa, o: offset > 0 || node !== span ? base + 1 : base }\n if (node.nodeType === 3) {\n let o = 0\n const walker = document.createTreeWalker(span, NodeFilter.SHOW_TEXT)\n for (let t = walker.nextNode(); t; t = walker.nextNode()) {\n if (t === node) return { pa, o: base + o + Math.min(offset, (t.textContent ?? '').length) }\n o += t.textContent?.length ?? 0\n }\n return { pa, o: base + o }\n }\n // offset is a child index inside the span\n let o = 0\n for (let i = 0; i < Math.min(offset, span.childNodes.length); i++) o += span.childNodes[i].textContent?.length ?? 0\n return { pa, o: base + o }\n}\n\nexport function domFromPos(root: HTMLElement, pos: Pos): [Node, number] | null {\n const pel = root.querySelector<HTMLElement>(`[data-pa=\"${pos.pa}\"]`)\n if (!pel) return null\n const spans = Array.from(pel.querySelectorAll<HTMLElement>('[data-o]'))\n if (!spans.length) return [pel, pel.childNodes.length]\n let pick: HTMLElement | undefined\n for (const s of spans) {\n const o = Number(s.dataset.o)\n const end = spanEnd(s)\n if (pos.o >= o && pos.o <= end) {\n pick = s\n // prefer the left run at boundaries unless it is an object\n if (pos.o < end || !s.hasAttribute('data-obj')) break\n }\n }\n pick ??= spans[spans.length - 1]\n const o = Number(pick.dataset.o)\n if (pick.hasAttribute('data-obj') || pick.hasAttribute('data-empty')) {\n const parent = pick.parentNode!\n const idx = Array.prototype.indexOf.call(parent.childNodes, pick)\n if (pick.hasAttribute('data-empty')) {\n const t = pick.firstChild\n return t ? [t, 0] : [parent, idx]\n }\n return [parent, pos.o > o ? idx + 1 : idx]\n }\n let rem = Math.max(0, pos.o - o)\n const walker = document.createTreeWalker(pick, NodeFilter.SHOW_TEXT)\n let last: Node | null = null\n for (let t = walker.nextNode(); t; t = walker.nextNode()) {\n const n = t.textContent?.length ?? 0\n if (rem <= n) return [t, rem]\n rem -= n\n last = t\n }\n return last ? [last, last.textContent?.length ?? 0] : [pick, 0]\n}\n\n/** Selection object that can see into the shadow root containing `node` (web component embeds). */\nexport function getSel(node: Node): Selection | null {\n const rn = node.getRootNode() as (ShadowRoot & { getSelection?: () => Selection | null }) | Document\n if (typeof ShadowRoot !== 'undefined' && rn instanceof ShadowRoot && typeof rn.getSelection === 'function') return rn.getSelection()\n return (node.ownerDocument ?? document).getSelection()\n}\n\ninterface SelPoints {\n anchorNode: Node | null\n anchorOffset: number\n focusNode: Node | null\n focusOffset: number\n}\n\nfunction selPoints(root: HTMLElement): SelPoints | null {\n const rn = root.getRootNode()\n const s = getSel(root)\n if (!s) return null\n if (typeof ShadowRoot !== 'undefined' && rn instanceof ShadowRoot && s.anchorNode && !root.contains(s.anchorNode)) {\n // standard path for shadow trees (Safari / Firefox / new Chrome)\n const gc = (s as Selection & { getComposedRanges?: (o: { shadowRoots: ShadowRoot[] }) => StaticRange[] }).getComposedRanges\n const r = gc?.call(s, { shadowRoots: [rn] })[0]\n if (r) return { anchorNode: r.startContainer, anchorOffset: r.startOffset, focusNode: r.endContainer, focusOffset: r.endOffset }\n }\n return s\n}\n\n// ---------------------------------------------------------------- controller\n\nexport class RichInput {\n private root: HTMLElement | null = null\n private composing: Sel | null = null\n private justComposed = ''\n private raf = 0\n lastSel: Sel | null = null\n /** select all: the model selection covers every paragraph, the DOM one only what is rendered */\n private override: { model: Sel; dom: Sel } | null = null\n\n constructor(private host: RichHost) {}\n\n attach(root: HTMLElement) {\n if (this.root === root) return\n this.detach()\n this.root = root\n root.addEventListener('beforeinput', this.onBeforeInput)\n root.addEventListener('compositionstart', this.onCompStart)\n root.addEventListener('compositionend', this.onCompEnd)\n root.addEventListener('keydown', this.onKeyDown)\n document.addEventListener('selectionchange', this.onSelChange)\n }\n\n detach() {\n const r = this.root\n if (!r) return\n r.removeEventListener('beforeinput', this.onBeforeInput)\n r.removeEventListener('compositionstart', this.onCompStart)\n r.removeEventListener('compositionend', this.onCompEnd)\n r.removeEventListener('keydown', this.onKeyDown)\n document.removeEventListener('selectionchange', this.onSelChange)\n cancelAnimationFrame(this.raf)\n this.root = null\n this.override = null\n }\n\n get isComposing() {\n return !!this.composing\n }\n\n readSel(): Sel | null {\n const root = this.root\n const s = root ? selPoints(root) : null\n if (!root || !s || !s.anchorNode || !s.focusNode) return null\n if (!root.contains(s.anchorNode) || !root.contains(s.focusNode)) return null\n const a = posFromDom(root, s.anchorNode, s.anchorOffset)\n const f = posFromDom(root, s.focusNode, s.focusOffset)\n return a && f ? { a, f } : null\n }\n\n /** current selection, falling back to the last known one (e.g. after focusing a toolbar control) */\n sel(): Sel | null {\n return this.override?.model ?? this.readSel() ?? this.lastSel\n }\n\n /**\n * Selects the whole document. The browser's own select-all is useless here: the editing host holds\n * non-editable parts (headers, read-only paragraphs) and Chromium empties a selection that crosses them;\n * pages are also virtualized, so the DOM only ever holds a part of the document.\n */\n selectAll(): boolean {\n const root = this.root\n const all = this.host.all?.()\n if (!root || !all) return false\n const paras = Array.from(root.querySelectorAll<HTMLElement>('[data-pa]')).filter((el) => {\n const ro = el.closest('[contenteditable=\"false\"]')\n return this.host.para(el.dataset.pa!) && !(ro && root.contains(ro))\n })\n const first = paras[0]\n const last = paras[paras.length - 1]\n const dom: Sel = first && last ? { a: { pa: first.dataset.pa!, o: 0 }, f: { pa: last.dataset.pa!, o: plen(this.host.para(last.dataset.pa!)!.runs) } } : all\n this.restore(dom)\n this.override = { model: all, dom: this.readSel() ?? dom }\n this.host.onSelection?.(all)\n return true\n }\n\n /** Applies a model selection to the DOM; false when its paragraph isn't rendered. */\n restore(sel: Sel | null, focus = true): boolean {\n const root = this.root\n if (!root || !sel) return false\n this.override = null\n const a = domFromPos(root, sel.a)\n const f = domFromPos(root, sel.f)\n if (!a || !f) {\n this.lastSel = sel\n return false\n }\n const active = (root.getRootNode() as Document | ShadowRoot).activeElement\n if (focus && active !== root && !root.contains(active)) root.focus({ preventScroll: true })\n const s = getSel(root)\n try {\n s?.setBaseAndExtent(a[0], a[1], f[0], f[1])\n } catch {\n /* node vanished */\n }\n this.lastSel = sel\n return true\n }\n\n private rangeSel(r: StaticRange | Range | undefined): Sel | null {\n if (!r || !this.root) return null\n const a = posFromDom(this.root, r.startContainer, r.startOffset)\n const f = posFromDom(this.root, r.endContainer, r.endOffset)\n return a && f ? { a, f } : null\n }\n\n private onBeforeInput = (e: InputEvent) => {\n const t = e.inputType\n if (this.composing || t === 'insertCompositionText') return\n if (t === 'deleteCompositionText' || t === 'insertFromComposition') {\n if (e.cancelable) e.preventDefault()\n if (t === 'insertFromComposition' && e.data && e.data !== this.justComposed) {\n const sel = this.sel()\n if (sel) opInsert(this.host, sel, e.data, { remount: true })\n }\n this.justComposed = ''\n return\n }\n e.preventDefault()\n const target = this.rangeSel(e.getTargetRanges?.()[0])\n const sel = this.sel()\n if (!sel) return\n const h = this.host\n switch (t) {\n case 'insertText':\n case 'insertReplacementText': {\n const text = e.data ?? e.dataTransfer?.getData('text/plain') ?? ''\n opInsert(h, t === 'insertReplacementText' && target ? target : sel, text)\n break\n }\n case 'insertParagraph':\n opEnter(h, sel)\n break\n case 'insertLineBreak':\n opInsert(h, sel, '\\n', { label: 'linebreak' })\n break\n case 'insertFromPaste':\n case 'insertFromDrop':\n case 'insertFromYank': {\n if (e.dataTransfer && h.pasteRich?.(t === 'insertFromDrop' && target ? target : sel, e.dataTransfer)) break\n const text = e.dataTransfer?.getData('text/plain') ?? e.data ?? ''\n if (text) opInsert(h, sel, text)\n break\n }\n case 'deleteContentBackward':\n opBackspace(h, sel)\n break\n case 'deleteWordBackward':\n opBackspace(h, sel, true)\n break\n case 'deleteContentForward':\n opDeleteForward(h, sel)\n break\n case 'deleteWordForward':\n opDeleteForward(h, sel, true)\n break\n case 'deleteSoftLineBackward':\n case 'deleteHardLineBackward':\n case 'deleteSoftLineForward':\n case 'deleteHardLineForward':\n case 'deleteByCut':\n case 'deleteByDrag':\n case 'deleteContent':\n case 'deleteEntireSoftLine':\n if (!collapsed(sel)) opDelete(h, sel)\n else if (target && !collapsed(target)) opDelete(h, target)\n break\n case 'historyUndo':\n h.undo()\n break\n case 'historyRedo':\n h.redo()\n break\n case 'formatBold':\n h.toggle?.('b')\n break\n case 'formatItalic':\n h.toggle?.('i')\n break\n case 'formatUnderline':\n h.toggle?.('u')\n break\n }\n }\n\n private onCompStart = () => {\n this.composing = this.sel()\n }\n\n private onCompEnd = (e: CompositionEvent) => {\n const sel = this.composing\n this.composing = null\n if (!sel) return\n this.justComposed = e.data ?? ''\n // always rebuild the paragraph: the IME mutated its DOM\n if (e.data) opInsert(this.host, sel, e.data, { remount: true })\n else opInsert(this.host, sel, '', { remount: true })\n setTimeout(() => (this.justComposed = ''), 0)\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n if (e.isComposing || this.composing) return\n const mod = e.metaKey || e.ctrlKey\n const k = e.key.toLowerCase()\n if (this.host.shortcut?.(e)) {\n e.preventDefault()\n return\n }\n if (mod && !e.altKey) {\n if (k === 'z') {\n e.preventDefault()\n if (e.shiftKey) this.host.redo()\n else this.host.undo()\n return\n }\n if (k === 'y') {\n e.preventDefault()\n this.host.redo()\n return\n }\n if (k === 'a' && !e.shiftKey) {\n if (this.selectAll()) e.preventDefault()\n return\n }\n if (k === 'b' || k === 'i' || k === 'u') {\n e.preventDefault()\n this.host.toggle?.(k)\n return\n }\n }\n if (e.key === 'Tab' && !mod) {\n e.preventDefault()\n const sel = this.sel()\n if (!sel) return\n if (!this.host.tab?.(sel, e.shiftKey) && !e.shiftKey) opInsert(this.host, sel, '\\t')\n }\n }\n\n private onSelChange = () => {\n if (this.raf) return\n this.raf = requestAnimationFrame(() => {\n this.raf = 0\n const s = this.readSel()\n const ov = this.override\n // select all stays until the selection moves somewhere else (losing it to a re-render keeps it, like lastSel)\n if (ov && s && !sameSel(s, ov.dom)) this.override = null\n else if (ov) {\n this.host.onSelection?.(ov.model)\n return\n }\n if (s) this.lastSel = s\n this.host.onSelection?.(s)\n })\n }\n}\n","/**\n * DOCX collaboration: operations on the main-thread paragraph model (DocxEditor),\n * which mirrors every change to the worker itself.\n *\n * - `text` splice inside one paragraph (typing, deleting, inline formatting) — merges\n * character-wise with concurrent edits of the same paragraph\n * - `paras` contiguous paragraphs replaced (Enter, join, paste, paragraph formatting…) — last writer wins\n * - `blocks` top-level blocks replaced (tables)\n * - `image` / `link` package resources, shared by key (relationship ids differ per client)\n * - `call` other document-level worker calls (e.g. adding a built-in style), run in hub order\n */\nimport type { Block, Inline, Paragraph, StyleInfo } from '../core/docx/types'\nimport type { DocumentClient } from '../core/worker/client'\nimport type { Methods } from '../core/worker/protocol'\nimport type { DocState, DocxCommit, DocxEditor } from '../react/docx/DocxEditor'\nimport { domFromPos } from '../react/edit/input'\nimport { plen, runsText, splitRuns, type Pos, type RRun, type Sel } from '../react/edit/rich'\nimport { watchHost } from './hosts'\nimport type { Adapter, ApplyResult } from './session'\n\nexport interface DocxHost {\n editor: DocxEditor\n st: DocState\n}\n\n/** top-level block identity: paragraph id, or table (regenerated id / original body item) */\nexport type BKey = { p: number } | { tid?: number; item?: number }\n\nexport type DocxOp =\n | { t: 'text'; pid: number; at: number; del: number; ins: Inline[] }\n | { t: 'paras'; before: number[]; next: Paragraph[] }\n | { t: 'blocks'; before: BKey[]; prev: BKey | null; next: Block[] }\n | { t: 'image'; key: string; bytes: Uint8Array; ext: string }\n | { t: 'link'; key: string; url: string }\n | { t: 'call'; method: string; args: unknown[] }\n\n/** a point in the document that survives structural edits: paragraph id, page-break part, offset */\nexport interface DPos {\n pid: number\n k: number\n o: number\n}\n\nexport interface DocxPresence {\n k: 'docx'\n a: DPos\n f: DPos\n}\n\n/** how to undo one model change; `paras` with an empty `next` re-inserts `before` next to a neighbour */\ntype Step =\n | { t: 'paras'; before: Paragraph[]; next: Paragraph[]; prev?: { pid: number; k: number }; after?: { pid: number; k: number } }\n | { t: 'blocks'; before: Block[]; next: Block[]; prev: BKey | null }\n/** the steps of an op, undone in reverse order */\ntype Undo = Step[] | null\n\n/** worker methods that only read */\nconst READS = new Set<keyof Methods>(['open', 'part', 'docx.start', 'save', 'dirty'])\n\nconst bkey = (b: Block): BKey | null => (b.t === 'p' ? (b.pid !== undefined ? { p: b.pid } : null) : b.t === 'tbl' ? { tid: b.tid, item: b.item } : null)\n\nfunction matches(b: Block | undefined, k: BKey): boolean {\n if (!b) return false\n if ('p' in k) return b.t === 'p' && b.pid === k.p\n return b.t === 'tbl' && ((k.tid !== undefined && b.tid === k.tid) || (k.item !== undefined && b.item === k.item))\n}\n\nconst uniq = (xs: number[]) => [...new Set(xs)]\n\n/** paragraph ids inside blocks (table cells included) */\nfunction pidsOf(blocks: Block[], out: number[] = []): number[] {\n for (const b of blocks) {\n if (b.t === 'p' && b.pid !== undefined) out.push(b.pid)\n else if (b.t === 'tbl') for (const r of b.rows) for (const c of r.cells) pidsOf(c.blocks, out)\n }\n return out\n}\n\n// ---------------------------------------------------------------- run diff / splice\n\nfunction atomKey(r: Inline): string {\n if (r.t !== 'text') return JSON.stringify(r)\n const { text: _t, ...rest } = r\n return JSON.stringify(rest)\n}\n\n/** single replaced range between two run lists (common prefix / suffix, formatting included) */\nexport function diffRuns(a: Inline[], b: Inline[]): { at: number; del: number; ins: Inline[] } | null {\n // one entry per UTF-16 unit (what offsets count), formatting included\n const units = (runs: Inline[]) => {\n const out: string[] = []\n for (const r of runs) {\n const k = atomKey(r)\n if (r.t === 'text') for (let i = 0; i < r.text.length; i++) out.push(k + '\\u0000' + r.text[i])\n else out.push(k)\n }\n return out\n }\n const x = units(a)\n const y = units(b)\n let pre = 0\n while (pre < x.length && pre < y.length && x[pre] === y[pre]) pre++\n let suf = 0\n while (suf < x.length - pre && suf < y.length - pre && x[x.length - 1 - suf] === y[y.length - 1 - suf]) suf++\n if (pre === x.length && pre === y.length) return null\n const [, rest] = splitRuns(b as RRun[], pre)\n const [mid] = splitRuns(rest, y.length - pre - suf)\n return { at: pre, del: x.length - pre - suf, ins: mid as Inline[] }\n}\n\nexport function spliceRuns(runs: Inline[], at: number, del: number, ins: Inline[]): Inline[] {\n const n = plen(runs as RRun[])\n const a = Math.max(0, Math.min(at, n))\n const d = Math.max(0, Math.min(del, n - a))\n const [left, rest] = splitRuns(runs as RRun[], a)\n const [, right] = splitRuns(rest, d)\n return [...(left as Inline[]), ...ins, ...(right as Inline[])]\n}\n\n/** `x` (a position in the text before `prior` replaced [at, at+del) by `ins` chars) after it */\nfunction mapPos(x: number, at: number, del: number, ins: number, end: boolean): number {\n if (x < at || (x === at && (del > 0 || end))) return x\n if (x >= at + del) return x - del + ins\n return at + ins\n}\n\n/** maps an offset through an edit of the text, using the common prefix / suffix */\nfunction mapByDiff(o: number, before: string, after: string): number {\n if (before === after) return o\n let pre = 0\n while (pre < before.length && pre < after.length && before[pre] === after[pre]) pre++\n let suf = 0\n while (suf < before.length - pre && suf < after.length - pre && before[before.length - 1 - suf] === after[after.length - 1 - suf]) suf++\n if (o <= pre) return o\n if (o >= before.length - suf) return after.length - (before.length - o)\n return after.length - suf\n}\n\nconst sameProps = (a: Paragraph, b: Paragraph) =>\n a.pid === b.pid &&\n a.from === b.from &&\n a.sid === b.sid &&\n !!a.pb === !!b.pb &&\n a.keepSect === b.keepSect &&\n JSON.stringify(a.pd ?? null) === JSON.stringify(b.pd ?? null) &&\n JSON.stringify(a.ps) === JSON.stringify(b.ps) &&\n JSON.stringify(a.orig ?? null) === JSON.stringify(b.orig ?? null)\n\n// ---------------------------------------------------------------- adapter\n\nexport class DocxCollab implements Adapter<DocxOp> {\n private host?: DocxHost\n /** > 0 while this adapter drives the editor (its commits are not local ops) */\n private suppress = 0\n /** resource key → this client's value ({ rid, path } for images, link key for links) */\n private res = new Map<string, { rid: string; path: string } | string>()\n /** this client's rid / link key → resource key */\n private resKey = new Map<string, string>()\n private results = new WeakMap<DocxOp, unknown>()\n private snap: { a: DPos; f: DPos; text: Map<string, string>; focused: boolean } | null = null\n /** the model was changed since the last `settled` */\n private touchedModel = false\n private site = 0\n private counter = 0\n private offHost?: () => void\n /** sends presence (set by the session owner) */\n onPresence?: (p: DocxPresence) => void\n private lastPresence = ''\n private raf = 0\n\n /** registers a local op the editor already applied */\n push?: (op: DocxOp, undo: Undo) => void\n /** shares a local op through the session (applied by `apply`) */\n submit?: (op: DocxOp) => Promise<unknown>\n\n constructor(private client: DocumentClient) {}\n\n // ---------------------------------------------------------------- wiring\n\n ready(): Promise<void> {\n return new Promise((resolve) => {\n this.offHost = watchHost<DocxHost>(this.client, 'docx', (h) => {\n if (this.host?.editor === h.editor) return\n if (this.host) this.host.editor.onCommit = undefined\n this.host = h\n h.editor.onCommit = (c) => this.onCommit(c)\n this.allocPids()\n resolve()\n })\n if (typeof document !== 'undefined') document.addEventListener('selectionchange', this.onSel)\n })\n }\n\n /** gives this client its own range of paragraph / table ids */\n setSite(site: number) {\n this.site = site\n this.allocPids()\n }\n\n private allocPids() {\n const ed = this.host?.editor\n if (!ed || !this.site) return\n const base = 2_000_000_000 + this.site * 10_000_000\n if (ed.nextPid < base || ed.nextPid >= base + 10_000_000) ed.nextPid = base\n }\n\n dispose() {\n this.offHost?.()\n if (this.host) this.host.editor.onCommit = undefined\n if (typeof document !== 'undefined') document.removeEventListener('selectionchange', this.onSel)\n if (this.raf) cancelAnimationFrame(this.raf)\n }\n\n captures(method: keyof Methods): boolean {\n // paragraph / table writes mirror model changes (captured by DocxEditor.onCommit)\n return !this.suppress && !READS.has(method) && method !== 'docx.edit' && method !== 'docx.table' && method.startsWith('docx.')\n }\n\n /** client.call interceptor: package resources and document-level calls become ops */\n intercept(method: keyof Methods, args: unknown[]): Promise<unknown> | undefined {\n if (!this.submit || !this.captures(method)) return undefined\n switch (method) {\n case 'docx.image': {\n const bytes = new Uint8Array((args[0] as ArrayBuffer).slice(0))\n return this.submit({ t: 'image', key: this.key(), bytes, ext: args[1] as string })\n }\n case 'docx.link':\n return this.submit({ t: 'link', key: this.key(), url: args[0] as string })\n }\n return this.submit({ t: 'call', method, args })\n }\n\n private key() {\n return `${this.site}:${++this.counter}:${Math.random().toString(36).slice(2, 7)}`\n }\n\n // ---------------------------------------------------------------- model helpers\n\n private get st() {\n return this.host!.st\n }\n\n private get ed() {\n return this.host!.editor\n }\n\n /** every block of paragraph `pid` (page-break parts) with its address */\n private locate(pid: number): { list: Block[]; index: number; pa: string; p: Paragraph }[] {\n const out: { list: Block[]; index: number; pa: string; p: Paragraph }[] = []\n this.st.blocks.forEach((b, bi) => {\n if (b.t === 'p') {\n if (b.pid === pid) out.push({ list: this.st.blocks, index: bi, pa: String(bi), p: b })\n } else if (b.t === 'tbl')\n b.rows.forEach((r, ri) =>\n r.cells.forEach((cell, ci) =>\n cell.blocks.forEach((x, pi) => {\n if (x.t === 'p' && x.pid === pid) out.push({ list: cell.blocks, index: pi, pa: `${bi}.${ri}.${ci}.${pi}`, p: x })\n }),\n ),\n )\n })\n return out\n }\n\n private topIndex(k: BKey): number {\n return this.st.blocks.findIndex((b) => matches(b, k))\n }\n\n /** contiguous paragraph addresses from the first block of pids[0], following `pids` */\n private region(pids: number[]): string[] | null {\n const want = new Set(pids)\n for (const pid of pids) {\n const loc = this.locate(pid)[0]\n if (!loc) continue\n const pas: string[] = []\n for (let i = loc.index; i < loc.list.length; i++) {\n const b = loc.list[i]\n if (b.t !== 'p' || b.pid === undefined || !want.has(b.pid)) break\n pas.push(loc.pa.replace(/\\d+$/, String(i)))\n }\n return pas\n }\n return null\n }\n\n // ---------------------------------------------------------------- resources (ids differ per client)\n\n private remap<T extends Block | Inline>(x: T): T {\n if (x.t === 'img') {\n const ck = (x as { ck?: string }).ck\n const r = ck ? this.res.get(ck) : undefined\n return r && typeof r === 'object' ? { ...x, rid: r.rid, target: r.path } : x\n }\n if (x.t === 'text') {\n const ck = (x as { lck?: string }).lck\n const r = ck ? this.res.get(ck) : undefined\n return typeof r === 'string' ? { ...x, lk: r } : x\n }\n if (x.t === 'p') return { ...x, runs: x.runs.map((r) => this.remap(r)) }\n if (x.t === 'tbl') return { ...x, rows: x.rows.map((r) => ({ ...r, cells: r.cells.map((c) => ({ ...c, blocks: c.blocks.map((b) => this.remap(b)) })) })) }\n return x\n }\n\n /** tags runs referring to resources this client created, so others can map them */\n private tag<T extends Block | Inline>(x: T): T {\n if (x.t === 'img' && x.rid && this.resKey.has(x.rid) && !(x as { ck?: string }).ck) return { ...x, ck: this.resKey.get(x.rid) }\n if (x.t === 'text' && x.lk && this.resKey.has(x.lk) && !(x as { lck?: string }).lck) return { ...x, lck: this.resKey.get(x.lk) }\n if (x.t === 'p') return { ...x, runs: x.runs.map((r) => this.tag(r)), caret: undefined }\n if (x.t === 'tbl') return { ...x, rows: x.rows.map((r) => ({ ...r, cells: r.cells.map((c) => ({ ...c, blocks: c.blocks.map((b) => this.tag(b)) })) })) }\n return x\n }\n\n private async fetchRes(op: DocxOp) {\n if (op.t === 'image' && !this.res.has(op.key)) {\n const r = await this.client.direct('docx.image', op.bytes.slice().buffer as ArrayBuffer, op.ext)\n this.res.set(op.key, r)\n this.resKey.set(r.rid, op.key)\n } else if (op.t === 'link' && !this.res.has(op.key)) {\n const lk = await this.client.direct('docx.link', op.url)\n this.res.set(op.key, lk)\n this.resKey.set(lk, op.key)\n } else if (op.t === 'call' && !this.results.has(op)) {\n const call = this.client.direct as (m: string, ...a: unknown[]) => Promise<unknown>\n this.results.set(op, await call(op.method, ...op.args))\n }\n }\n\n // ---------------------------------------------------------------- local capture\n\n private onCommit(c: DocxCommit) {\n if (this.suppress || !this.push) return\n if (c.kind === 'paras') {\n const b = c.before\n const n = c.next\n if (b.length === 1 && n.length === 1 && b[0].pid !== undefined && sameProps(b[0], n[0]) && this.locate(b[0].pid).length === 1) {\n const d = diffRuns(b[0].runs, n[0].runs)\n if (!d) return\n this.push({ t: 'text', pid: b[0].pid, at: d.at, del: d.del, ins: d.ins.map((r) => this.tag(r)) }, [{ t: 'paras', before: b, next: n }])\n return\n }\n this.push({ t: 'paras', before: b.map((p) => p.pid!), next: n.map((p) => this.tag(p)) }, [{ t: 'paras', before: b, next: n }])\n return\n }\n const prev = c.bi > 0 ? bkey(this.st.blocks[c.bi - 1]) : null\n this.push(\n { t: 'blocks', before: c.before.map(bkey).filter((k): k is BKey => !!k), prev, next: c.next.map((b) => this.tag(b)) },\n [{ t: 'blocks', before: c.before, next: c.next, prev }],\n )\n }\n\n // ---------------------------------------------------------------- adapter\n\n transform(op: DocxOp, prior: DocxOp): DocxOp | null {\n if (op.t !== 'text') return op\n if (prior.t === 'text' && prior.pid === op.pid) {\n const pins = plen(prior.ins as RRun[])\n const at = mapPos(op.at, prior.at, prior.del, pins, false)\n const end = op.del ? Math.max(at, mapPos(op.at + op.del, prior.at, prior.del, pins, true)) : at\n return at === op.at && end - at === op.del ? op : { ...op, at, del: end - at }\n }\n if (prior.t === 'paras' && (prior.before.includes(op.pid) || prior.next.some((p) => p.pid === op.pid))) {\n // the paragraph was rewritten: keep the splice (clamped) while it still exists\n return prior.next.some((p) => p.pid === op.pid) ? op : null\n }\n if (prior.t === 'blocks' && prior.before.some((k) => 'p' in k && k.p === op.pid) && !pidsOf(prior.next).includes(op.pid)) return null\n return op\n }\n\n private touched(op: DocxOp): string[] {\n switch (op.t) {\n case 'text':\n return ['p' + op.pid]\n case 'paras':\n return [...op.before, ...op.next.map((p) => p.pid!)].map((p) => 'p' + p)\n case 'blocks': {\n const keys = [...op.before, ...(op.prev ? [op.prev] : []), ...op.next.map(bkey).filter((k): k is BKey => !!k)]\n const out = keys.map((k) => ('p' in k ? 'p' + k.p : 't' + (k.item ?? 'n' + k.tid)))\n for (const pid of pidsOf(op.next)) out.push('p' + pid)\n return out\n }\n default:\n return []\n }\n }\n\n conflicts(pending: DocxOp[], remote: DocxOp[]): boolean {\n const mine = new Set(pending.flatMap((o) => this.touched(o)))\n return remote.some((o) => this.touched(o).some((k) => mine.has(k)))\n }\n\n pessimistic(op: DocxOp): boolean {\n return op.t === 'call'\n }\n\n async prepare(ops: DocxOp[]) {\n // never rebuild paragraphs under an active IME composition\n while (this.host?.editor.input.isComposing) await new Promise((r) => setTimeout(r, 50))\n for (const op of ops) await this.fetchRes(op)\n this.capture()\n }\n\n async apply(op: DocxOp, kind: 'local' | 'replay' | 'remote'): Promise<ApplyResult> {\n switch (op.t) {\n case 'image':\n case 'link':\n await this.fetchRes(op)\n return { result: this.res.get(op.key) }\n case 'call': {\n await this.fetchRes(op)\n const result = this.results.get(op)\n if (op.method === 'docx.style' && result && typeof result === 'object' && this.host) {\n const styles = (result as { styles: StyleInfo[] }).styles\n this.ed.styles = styles\n this.ed.onStyles?.(styles)\n }\n return { result }\n }\n }\n if (!this.host) throw new Error('Document editor not ready')\n if (kind === 'remote' || kind === 'replay') this.capture()\n this.touchedModel = true\n this.suppress++\n try {\n return { undo: this.run(op) }\n } finally {\n this.suppress--\n }\n }\n\n /** applies a model op through the editor; returns how to revert it */\n private run(op: DocxOp): Undo {\n const ed = this.ed\n if (op.t === 'text') {\n const locs = this.locate(op.pid)\n if (locs.length !== 1 || !ed.para(locs[0].pa)) return null\n const p = locs[0].p\n const next: Paragraph = { ...p, runs: spliceRuns(p.runs, op.at, op.del, op.ins.map((r) => this.remap(r))), edited: true }\n ed.replace([locs[0].pa], [next], this.sel(), { history: false, label: 'collab' })\n return [{ t: 'paras', before: [p], next: [next] }]\n }\n if (op.t === 'paras') {\n const next = op.next.map((p) => this.remap(p))\n const nextPids = new Set(next.map((p) => p.pid!))\n const pas = this.region(op.before)\n if (!pas || !pas.length) return null\n const steps: Step[] = []\n // the same paragraphs elsewhere (moved by a concurrent edit) go away first\n const inRegion = new Set(pas.map((pa) => (ed.para(pa)?.pid ?? -1)))\n for (const pid of uniq([...op.before, ...nextPids])) {\n if (inRegion.has(pid)) continue\n for (const loc of this.locate(pid).reverse()) {\n if (!ed.para(loc.pa)) continue\n const nb = (i: number) => {\n const b = loc.list[i]\n return b?.t === 'p' && b.pid !== undefined ? { pid: b.pid, k: this.locate(b.pid).findIndex((x) => x.list === loc.list && x.index === i) } : undefined\n }\n const step: Step = { t: 'paras', before: [loc.p], next: [], prev: nb(loc.index - 1), after: nb(loc.index + 1) }\n ed.replace([loc.pa], [], this.sel(), { history: false, label: 'collab' })\n steps.push(step)\n }\n }\n const region = this.region(op.before)\n if (!region?.length) return steps\n const before = region.map((pa) => ed.para(pa)!).filter(Boolean)\n if (before.length !== region.length) return steps\n ed.replace(region, next, this.sel(), { history: false, label: 'collab' })\n steps.push({ t: 'paras', before, next })\n return steps\n }\n if (op.t === 'blocks') {\n let next = op.next.map((b) => this.remap(b))\n let bi: number\n let count = 0\n if (op.before.length) {\n bi = this.topIndex(op.before[0])\n if (bi < 0) {\n // first block gone: try the others\n const k = op.before.find((x) => this.topIndex(x) >= 0)\n if (!k) return null\n bi = this.topIndex(k)\n }\n while (bi + count < this.st.blocks.length && op.before.some((k) => matches(this.st.blocks[bi + count], k))) count++\n } else {\n bi = op.prev ? this.topIndex(op.prev) + 1 : 0\n if (op.prev && bi === 0) return null\n }\n const before = this.st.blocks.slice(bi, bi + count)\n // paragraphs around a table keep their current text: the op is about the blocks, not their content\n const cur = new Map(before.flatMap((b) => (b.t === 'p' && b.pid !== undefined ? [[b.pid, b] as const] : [])))\n next = next.map((b) => (b.t === 'p' && b.pid !== undefined && cur.has(b.pid) ? cur.get(b.pid)! : b))\n ed.replaceBlocks(bi, count, next, null, false)\n return [{ t: 'blocks', before, next, prev: bi > 0 ? bkey(this.st.blocks[bi - 1]) : null }]\n }\n return null\n }\n\n revert(undo: unknown) {\n const u = undo as Undo\n if (!u || !this.host) return\n this.capture()\n this.touchedModel = true\n this.suppress++\n try {\n for (let i = u.length - 1; i >= 0; i--) this.undoStep(u[i])\n } finally {\n this.suppress--\n }\n }\n\n private undoStep(u: Step) {\n const ed = this.ed\n if (u.t === 'paras') {\n if (!u.next.length) {\n // re-insert next to the neighbour it had\n const at = (n: { pid: number; k: number } | undefined) => (n ? this.locate(n.pid)[n.k] : undefined)\n const prev = at(u.prev)\n if (prev && ed.para(prev.pa)) return ed.replace([prev.pa], [prev.p, ...u.before], this.sel(), { history: false, label: 'collab' })\n const after = at(u.after)\n if (after && ed.para(after.pa)) ed.replace([after.pa], [...u.before, after.p], this.sel(), { history: false, label: 'collab' })\n return\n }\n const first = this.locate(u.next[0].pid!)[0]\n if (!first) return\n const pas = u.next.map((_, i) => first.pa.replace(/\\d+$/, String(first.index + i)))\n if (pas.some((pa, i) => ed.para(pa)?.pid !== u.next[i].pid)) return\n ed.replace(pas, u.before, this.sel(), { history: false, label: 'collab' })\n return\n }\n const k = u.next.length ? bkey(u.next[0]) : null\n const bi = k ? this.topIndex(k) : u.prev ? this.topIndex(u.prev) + 1 : 0\n if (bi < 0) return\n const cur = new Map(this.st.blocks.slice(bi, bi + u.next.length).flatMap((b) => (b.t === 'p' && b.pid !== undefined ? [[b.pid, b] as const] : [])))\n ed.replaceBlocks(bi, u.next.length, u.before.map((b) => (b.t === 'p' && b.pid !== undefined && cur.has(b.pid) ? cur.get(b.pid)! : b)), null, false)\n }\n\n // ---------------------------------------------------------------- selection across remote edits\n\n private toD(pos: Pos): DPos | null {\n const p = this.ed.para(pos.pa)\n if (!p || p.pid === undefined) return null\n const locs = this.locate(p.pid)\n return { pid: p.pid, k: Math.max(0, locs.findIndex((l) => l.pa === pos.pa)), o: pos.o }\n }\n\n private fromD(d: DPos): Pos | null {\n const locs = this.locate(d.pid)\n const l = locs[Math.min(d.k, locs.length - 1)]\n return l ? { pa: l.pa, o: Math.min(d.o, plen(l.p.runs as RRun[])) } : null\n }\n\n /** remembers the selection (by paragraph id + text) before the model changes */\n private capture() {\n if (this.snap || !this.host) return\n const focused = !!this.ed.input.readSel()\n const sel = this.ed.input.sel()\n const a = sel && this.toD(sel.a)\n const f = sel && this.toD(sel.f)\n if (!a || !f) return\n const text = new Map<string, string>()\n for (const d of [a, f]) {\n const l = this.locate(d.pid)[d.k]\n if (l) text.set(`${d.pid}:${d.k}`, runsText(l.p.runs as RRun[]))\n }\n this.snap = { a, f, text, focused }\n }\n\n /** the remembered selection in the current model */\n private sel(): Sel {\n const s = this.snap\n const fallback = { pa: '0', o: 0 }\n if (!s) return this.ed.input.lastSel ?? { a: fallback, f: fallback }\n const map = (d: DPos): Pos => {\n const l = this.locate(d.pid)[d.k] ?? this.locate(d.pid)[0]\n if (!l) return this.ed.input.lastSel?.f ?? fallback\n const was = s.text.get(`${d.pid}:${d.k}`)\n const now = runsText(l.p.runs as RRun[])\n return { pa: l.pa, o: was === undefined ? Math.min(d.o, now.length) : mapByDiff(d.o, was, now) }\n }\n return { a: map(s.a), f: map(s.f) }\n }\n\n settled() {\n const s = this.snap\n const touched = this.touchedModel\n this.touchedModel = false\n if (!this.host) return\n if (!s) {\n // nobody was editing: don't let the collaborators' edits focus the document\n if (touched) this.ed.pendingSel = null\n return\n }\n const sel = this.sel()\n this.snap = null\n // keep the caret where the user was; never steal focus from other controls\n this.ed.pendingSel = s.focused ? sel : null\n if (!s.focused) this.ed.input.lastSel = sel\n }\n\n // ---------------------------------------------------------------- presence\n\n private onSel = () => {\n if (this.raf || !this.host) return\n this.raf = requestAnimationFrame(() => {\n this.raf = 0\n const sel = this.host && this.ed.input.readSel()\n if (!sel) return\n const a = this.toD(sel.a)\n const f = this.toD(sel.f)\n if (!a || !f) return\n const p: DocxPresence = { k: 'docx', a, f }\n const key = JSON.stringify(p)\n if (key === this.lastPresence) return\n this.lastPresence = key\n this.onPresence?.(p)\n })\n }\n\n /** screen rectangles of a collaborator's selection (caret = last rect) inside `root` */\n rects(root: HTMLElement, p: DocxPresence): { caret: DOMRect | null; sel: DOMRect[] } {\n if (!this.host) return { caret: null, sel: [] }\n const pages = root.querySelector<HTMLElement>('.de-pages')\n const a = this.fromD(p.a)\n const f = this.fromD(p.f)\n if (!pages || !a || !f) return { caret: null, sel: [] }\n const fd = domFromPos(pages, f)\n let caret: DOMRect | null = null\n if (fd) {\n const r = document.createRange()\n try {\n r.setStart(fd[0], fd[1])\n r.collapse(true)\n caret = r.getClientRects()[0] ?? (fd[0].nodeType === 1 ? (fd[0] as Element).getBoundingClientRect() : r.getBoundingClientRect())\n } catch {\n caret = null\n }\n }\n const sel: DOMRect[] = []\n const ad = domFromPos(pages, a)\n if (ad && fd && (a.pa !== f.pa || a.o !== f.o)) {\n const r = document.createRange()\n try {\n const forward = this.ed.cmp(a.pa, f.pa) < 0 || (a.pa === f.pa && a.o < f.o)\n if (forward) {\n r.setStart(ad[0], ad[1])\n r.setEnd(fd[0], fd[1])\n } else {\n r.setStart(fd[0], fd[1])\n r.setEnd(ad[0], ad[1])\n }\n for (const x of Array.from(r.getClientRects())) if (x.width > 0.5) sel.push(x)\n } catch {\n /* nodes detached */\n }\n }\n return { caret, sel }\n }\n}\n","/**\n * Client side of the collaboration protocol (format-agnostic).\n *\n * Model: the hub totally orders batches of operations. Every client applies\n * the log in that order, each batch first transformed (deterministically)\n * against the concurrent batches sequenced before it — so all clients reach\n * the same state. Local operations are applied optimistically; when a remote\n * batch arrives while local ones are still unconfirmed, the client rebases:\n * reverts its pending ops, applies the remote batch, then replays the pending\n * ops transformed against it. Convergence therefore only needs `transform` and\n * `apply` to be deterministic (not the classic OT TP1/TP2 properties).\n *\n * Operations an adapter flags as `pessimistic` (structural ones that are hard\n * to rebase, like deleting a sheet) are not applied locally until the hub has\n * sequenced them.\n */\nimport type { Batch, Entry, HubMsg, PeerInfo, UserInfo } from './protocol'\nimport type { Transport } from './transport'\n\nexport interface ApplyResult {\n /** whatever `revert` needs to undo the op exactly (local ops only) */\n undo?: unknown\n /** returned to the caller of `submit` */\n result?: unknown\n}\n\nexport type ApplyKind = 'local' | 'replay' | 'remote'\n\nexport interface Adapter<Op> {\n /** resolves when the document can take operations (e.g. fully loaded) */\n ready?(): Promise<void>\n /**\n * `op` adjusted to apply after `prior`, a concurrent op of another site that was sequenced first.\n * Must be deterministic; return `op` itself when unaffected, null to drop it.\n */\n transform(op: Op, prior: Op): Op | null\n /**\n * Async work before ops get applied (fetching resources, waiting for IME composition to end…),\n * so that `revert` / `apply` during a rebase can run without yielding to user input.\n */\n prepare?(ops: Op[]): Promise<void> | void\n /** applies `op` to the local document */\n apply(op: Op, kind: ApplyKind): Promise<ApplyResult> | ApplyResult\n /** exactly undoes a pending local op (given its `undo` token) */\n revert(undo: unknown): Promise<void> | void\n /** op must be sequenced by the hub before it is applied */\n pessimistic?(op: Op): boolean\n /** whether remote ops interact with pending local ones (default: true → rebase) */\n conflicts?(pending: Op[], remote: Op[]): boolean\n /** after a remote batch / rebase was applied (views refresh here) */\n settled?(): void\n}\n\nexport type CollabStatus = 'connecting' | 'syncing' | 'live' | 'offline' | 'error'\n\ninterface Item<Op> {\n op: Op | null\n applied: boolean\n undo?: unknown\n /** pending `submit` of a pessimistic op */\n done?: (v: unknown) => void\n}\n\nexport interface SessionEvents {\n status: CollabStatus\n peers: PeerInfo[]\n /** remote changes were applied */\n change: void\n error: Error\n}\n\nexport interface SessionOptions {\n room: string\n user: UserInfo\n /** canonical batches kept to transform late batches (default 5000) */\n logWindow?: number\n /** sequence number the opened file already contains: a snapshot (default 0, the original upload) */\n base?: number\n}\n\nconst notNull = <T>(x: T | null): x is T => x !== null\n\nexport class CollabSession<Op = unknown> {\n site = 0\n /** last applied sequence number */\n rev = 0\n status: CollabStatus = 'connecting'\n error?: string\n readonly peers = new Map<number, PeerInfo>()\n private log: Entry<Op>[] = []\n private inflight: { id: string; base: number; items: Item<Op>[] } | null = null\n private buffer: Item<Op>[] = []\n private queue: Promise<void>\n private joined = false\n private online = false\n private counter = 0\n private listeners = new Map<keyof SessionEvents, Set<(d: never) => void>>()\n private presence: unknown\n private presenceTimer?: ReturnType<typeof setTimeout>\n private presenceAt = 0\n private closed = false\n\n constructor(\n private transport: Transport,\n private adapter: Adapter<Op>,\n private opts: SessionOptions,\n ) {\n this.rev = opts.base ?? 0\n this.queue = Promise.resolve(adapter.ready?.()).catch((e) => this.fail((e as Error).message))\n transport.onMessage = (m) => this.enqueue(() => this.onMessage(m))\n transport.onStatus = (s) => {\n if (s === 'open') {\n this.online = true\n transport.send(\n this.joined\n ? { t: 'hello', room: opts.room, user: opts.user, have: this.rev, site: this.site }\n : { t: 'hello', room: opts.room, user: opts.user, base: opts.base || undefined },\n )\n } else if (s === 'closed') {\n this.online = false\n this.peers.clear()\n this.emit('peers', [])\n if (this.status !== 'error') this.setStatus(this.joined ? 'offline' : 'connecting')\n }\n }\n transport.connect()\n }\n\n // ---------------------------------------------------------------- public API\n\n /** local ops not yet confirmed by the hub */\n get pending(): number {\n return (this.inflight?.items.length ?? 0) + this.buffer.length\n }\n\n /** a unique id for ops created by this client */\n nextId(): string {\n return `${this.site}.${++this.counter}.${Math.random().toString(36).slice(2, 6)}`\n }\n\n /** applies a local op (through the adapter) and shares it; resolves with the adapter's result */\n submit(op: Op): Promise<unknown> {\n return new Promise((resolve, reject) =>\n this.enqueue(async () => {\n if (this.status === 'error') return reject(new Error(this.error ?? 'Collaboration stopped'))\n if (this.adapter.pessimistic?.(op)) {\n this.buffer.push({ op, applied: false, done: resolve })\n } else {\n let res: ApplyResult\n try {\n res = await this.adapter.apply(op, 'local')\n } catch (e) {\n return reject(e)\n }\n this.buffer.push({ op, applied: true, undo: res.undo })\n resolve(res.result)\n }\n this.flush()\n }),\n )\n }\n\n /** registers a local op the caller already applied (synchronously); `undo` reverts it */\n push(op: Op, undo: unknown) {\n this.buffer.push({ op, applied: true, undo })\n this.enqueue(async () => this.flush())\n }\n\n setPresence(data: unknown) {\n this.presence = data\n if (this.presenceTimer) return\n const wait = Math.max(0, 80 - (Date.now() - this.presenceAt))\n this.presenceTimer = setTimeout(() => {\n this.presenceTimer = undefined\n this.presenceAt = Date.now()\n if (this.online && this.joined) this.transport.send({ t: 'presence', data: this.presence })\n }, wait)\n }\n\n on<K extends keyof SessionEvents>(event: K, fn: (d: SessionEvents[K]) => void): () => void {\n let set = this.listeners.get(event)\n if (!set) this.listeners.set(event, (set = new Set()))\n set.add(fn as (d: never) => void)\n return () => set!.delete(fn as (d: never) => void)\n }\n\n /** the last `limit` batches as applied here (the context of a snapshot taken at `rev`) */\n context(limit = this.opts.logWindow ?? 5000): Entry<Op>[] {\n return limit > 0 ? this.log.slice(-limit) : []\n }\n\n /** resolves once everything queued so far was processed */\n idle(): Promise<void> {\n return this.queue\n }\n\n close() {\n this.closed = true\n clearTimeout(this.presenceTimer)\n this.transport.close()\n this.listeners.clear()\n }\n\n // ---------------------------------------------------------------- internals\n\n private emit<K extends keyof SessionEvents>(event: K, data: SessionEvents[K]) {\n for (const fn of this.listeners.get(event) ?? []) (fn as (d: SessionEvents[K]) => void)(data)\n }\n\n private setStatus(s: CollabStatus) {\n if (this.status === s) return\n this.status = s\n this.emit('status', s)\n }\n\n private fail(message: string) {\n this.error = message\n this.setStatus('error')\n this.emit('error', new Error(message))\n }\n\n private enqueue(fn: () => Promise<void> | void) {\n this.queue = this.queue.then(fn).catch((e) => {\n console.error('[office-engine collab]', e)\n this.emit('error', e as Error)\n })\n }\n\n private async onMessage(m: HubMsg) {\n if (this.closed || this.status === 'error') return\n switch (m.t) {\n case 'welcome': {\n if (m.reset) return this.fail('The shared document history was reset; reopen the document')\n const first = !this.joined\n this.site = m.site\n this.joined = true\n if (first) {\n this.log = (m.ctx ?? []) as Entry<Op>[]\n this.setStatus('syncing')\n }\n this.peers.clear()\n for (const p of m.peers) this.peers.set(p.site, p)\n this.emit('peers', [...this.peers.values()])\n for (const b of m.log) await this.onBatch(b)\n if (this.inflight) {\n // not sequenced before the connection dropped: its ops were rebased onto everything up to\n // `rev` meanwhile, so that is their base now (the hub ignores it if the first send arrived)\n this.inflight.base = this.rev\n this.transport.send({ t: 'ops', id: this.inflight.id, base: this.rev, ops: this.inflight.items.map((i) => i.op).filter(notNull) })\n }\n this.flush()\n if (this.presence !== undefined) this.transport.send({ t: 'presence', data: this.presence })\n this.setStatus('live')\n return\n }\n case 'batch':\n return this.onBatch(m.b)\n case 'presence': {\n const p = this.peers.get(m.site)\n if (p) {\n this.peers.set(m.site, { ...p, presence: m.data })\n this.emit('peers', [...this.peers.values()])\n }\n return\n }\n case 'join':\n this.peers.set(m.peer.site, m.peer)\n this.emit('peers', [...this.peers.values()])\n return\n case 'leave':\n this.peers.delete(m.site)\n this.emit('peers', [...this.peers.values()])\n return\n case 'error':\n return this.fail(m.message)\n }\n }\n\n private async onBatch(b: Batch) {\n if (b.seq <= this.rev) return\n if (b.seq !== this.rev + 1) return this.fail(`Missed operations (${this.rev + 1}…${b.seq - 1})`)\n if (this.inflight && b.id === this.inflight.id) await this.ack(b)\n else {\n const ops = this.canonical(b)\n if (ops === null) return\n await this.remote(ops)\n this.log.push({ seq: b.seq, site: b.site, ops })\n }\n this.rev = b.seq\n const max = this.opts.logWindow ?? 5000\n if (this.log.length > max) this.log.splice(0, this.log.length - max)\n this.flush()\n this.adapter.settled?.()\n this.emit('change', undefined)\n }\n\n /** batch ops transformed against the concurrent batches sequenced before it */\n private canonical(b: Batch): Op[] | null {\n let ops = (b.ops as Op[]).map((o) => o as Op | null)\n if (b.base < b.seq - 1 && (this.log[0]?.seq ?? Infinity) > b.base + 1 && this.rev > b.base) {\n this.fail('Operation is too old to merge; reopen the document')\n return null\n }\n for (const e of this.log) {\n if (e.seq <= b.base || e.site === b.site) continue\n for (const p of e.ops) ops = ops.map((o) => (o === null ? null : this.adapter.transform(o, p)))\n }\n return ops.filter(notNull)\n }\n\n private async revertAll(items: Item<Op>[]) {\n for (let i = items.length - 1; i >= 0; i--) {\n const it = items[i]\n if (!it.applied) continue\n try {\n await this.adapter.revert(it.undo)\n } catch (e) {\n console.error('[office-engine collab] revert failed', e)\n }\n it.applied = false\n it.undo = undefined\n }\n }\n\n private async replay(it: Item<Op>, kind: ApplyKind) {\n if (!it.op) return\n try {\n const res = await this.adapter.apply(it.op, kind)\n it.undo = res.undo\n it.applied = true\n if (it.done) {\n it.done(res.result)\n it.done = undefined\n }\n } catch (e) {\n // keep the op in the batch: other clients run it too and fail the same way\n console.error('[office-engine collab] replay failed', e)\n }\n }\n\n private async remote(ops: Op[]) {\n await this.adapter.prepare?.(ops)\n const pending = [...(this.inflight?.items ?? []), ...this.buffer]\n if (!pending.length) {\n for (const op of ops) await this.applyRemote(op)\n return\n }\n const next = pending.map((it) => {\n let o = it.op\n for (const r of ops) if (o !== null) o = this.adapter.transform(o, r)\n return o\n })\n const applied = pending.filter((it) => it.applied && it.op).map((it) => it.op as Op)\n const rebase = next.some((o, i) => o !== pending[i].op) || (applied.length > 0 && (this.adapter.conflicts?.(applied, ops) ?? true))\n if (rebase) await this.revertAll(pending)\n for (const op of ops) await this.applyRemote(op)\n pending.forEach((it, i) => (it.op = next[i]))\n if (!rebase) return\n for (const it of pending) {\n if (!it.op || (this.adapter.pessimistic?.(it.op) && !it.applied && it.done)) continue\n await this.replay(it, 'replay')\n }\n }\n\n private async applyRemote(op: Op) {\n try {\n await this.adapter.apply(op, 'remote')\n } catch (e) {\n console.error('[office-engine collab] remote op failed', e, op)\n this.emit('error', e as Error)\n }\n }\n\n /** our in-flight batch was sequenced */\n private async ack(b: Batch) {\n const items = this.inflight!.items\n this.inflight = null\n const hole = items.findIndex((it) => it.op && !it.applied)\n if (hole >= 0) {\n // pessimistic ops run now, in order: later local ops are replayed after them\n const tail = [...items.slice(hole), ...this.buffer]\n await this.adapter.prepare?.(items.slice(hole).filter((it) => it.op && !it.applied).map((it) => it.op as Op))\n await this.revertAll(tail)\n for (const it of tail) {\n const waiting = !items.includes(it) && it.op && this.adapter.pessimistic?.(it.op) && it.done\n if (!waiting) await this.replay(it, it.done ? 'local' : 'replay')\n }\n }\n for (const it of items) if (it.done) it.done(null)\n this.log.push({ seq: b.seq, site: b.site, ops: items.map((i) => i.op).filter(notNull) })\n }\n\n private flush() {\n if (this.inflight || !this.buffer.length || !this.online || !this.joined || this.status === 'error') return\n const items = this.buffer\n this.buffer = []\n const id = `${this.site}-${Date.now().toString(36)}-${++this.counter}`\n this.inflight = { id, base: this.rev, items }\n this.transport.send({ t: 'ops', id, base: this.rev, ops: items.map((i) => i.op).filter(notNull) })\n }\n}\n","/** JSON encoding that survives binary payloads (images inserted while collaborating). */\n\nconst B64 = '$b64'\n\nfunction toB64(u8: Uint8Array): string {\n let s = ''\n for (let i = 0; i < u8.length; i += 0x8000) s += String.fromCharCode(...u8.subarray(i, i + 0x8000))\n return btoa(s)\n}\n\nfunction fromB64(s: string): Uint8Array {\n const bin = atob(s)\n const out = new Uint8Array(bin.length)\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i)\n return out\n}\n\nexport function encode(value: unknown): string {\n return JSON.stringify(value, (_k, v) => {\n if (v instanceof Uint8Array) return { [B64]: toB64(v) }\n if (v instanceof ArrayBuffer) return { [B64]: toB64(new Uint8Array(v)) }\n return v\n })\n}\n\nexport function decode<T = unknown>(text: string): T {\n return JSON.parse(text, (_k, v) => (v && typeof v === 'object' && typeof v[B64] === 'string' && Object.keys(v).length === 1 ? fromB64(v[B64]) : v)) as T\n}\n","import { decode, encode } from './codec'\nimport type { CollabHub, HubConnection } from './hub'\nimport type { ClientMsg, HubMsg } from './protocol'\n\nexport type TransportStatus = 'connecting' | 'open' | 'closed'\n\n/** Message pipe to a hub. Implement it to plug collaboration into your own backend. */\nexport interface Transport {\n connect(): void\n send(msg: ClientMsg): void\n close(): void\n onMessage?: (msg: HubMsg) => void\n onStatus?: (s: TransportStatus) => void\n}\n\n/** WebSocket transport with automatic reconnection (exponential backoff). */\nexport class WebSocketTransport implements Transport {\n onMessage?: (msg: HubMsg) => void\n onStatus?: (s: TransportStatus) => void\n private ws?: WebSocket\n private closed = false\n private retry = 0\n private timer?: ReturnType<typeof setTimeout>\n\n constructor(\n private url: string,\n private protocols?: string | string[],\n ) {}\n\n connect() {\n this.closed = false\n this.open()\n }\n\n private open() {\n if (this.closed) return\n this.onStatus?.('connecting')\n const ws = (this.ws = new WebSocket(this.url, this.protocols))\n ws.onopen = () => {\n this.retry = 0\n this.onStatus?.('open')\n }\n ws.onmessage = (e) => {\n if (typeof e.data === 'string') this.onMessage?.(decode<HubMsg>(e.data))\n }\n ws.onclose = () => {\n if (this.ws !== ws) return\n this.ws = undefined\n this.onStatus?.('closed')\n if (this.closed) return\n const delay = Math.min(10_000, 300 * 2 ** this.retry++) * (0.75 + Math.random() * 0.5)\n this.timer = setTimeout(() => this.open(), delay)\n }\n ws.onerror = () => ws.close()\n }\n\n send(msg: ClientMsg) {\n if (this.ws?.readyState === WebSocket.OPEN) this.ws.send(encode(msg))\n }\n\n close() {\n this.closed = true\n clearTimeout(this.timer)\n const ws = this.ws\n this.ws = undefined\n ws?.close()\n this.onStatus?.('closed')\n }\n}\n\n/**\n * In-process transport to a `CollabHub` (tests, demos with several viewers on one page).\n * Messages go through the JSON codec and are delivered asynchronously, optionally with latency.\n */\nexport class MemoryTransport implements Transport {\n onMessage?: (msg: HubMsg) => void\n onStatus?: (s: TransportStatus) => void\n private conn?: HubConnection\n private up = Promise.resolve()\n private down = Promise.resolve()\n\n constructor(\n private hub: CollabHub,\n private latency: number | (() => number) = 0,\n ) {}\n\n private delay() {\n const ms = typeof this.latency === 'function' ? this.latency() : this.latency\n return new Promise<void>((r) => (ms > 0 ? setTimeout(r, ms) : queueMicrotask(r)))\n }\n\n connect() {\n if (this.conn) return\n this.onStatus?.('connecting')\n const conn = (this.conn = this.hub.connect((m) => {\n const wire = encode(m)\n // FIFO delivery, even with random latency\n this.down = this.down\n .then(() => this.delay())\n .then(() => {\n if (this.conn === conn) this.onMessage?.(decode<HubMsg>(wire))\n })\n }))\n queueMicrotask(() => this.onStatus?.('open'))\n }\n\n send(msg: ClientMsg) {\n const conn = this.conn\n if (!conn) return\n const wire = encode(msg)\n this.up = this.up\n .then(() => this.delay())\n .then(() => {\n if (this.conn === conn) conn.receive(decode<ClientMsg>(wire))\n })\n }\n\n /** simulates a dropped connection (messages in flight are lost) */\n drop() {\n const c = this.conn\n this.conn = undefined\n c?.close()\n this.onStatus?.('closed')\n }\n\n close() {\n this.drop()\n }\n}\n","/**\n * XLSX collaboration (main thread): turns the view's worker calls into shared operations.\n * Cell edits, formatting, layout, fill / sort / replace are applied optimistically; inserting /\n * deleting rows or columns and sheet-list changes wait for the hub's order. Undo / redo only\n * touch the local user's own operations (shared as `revert` operations).\n */\nimport type { DocumentClient } from '../core/worker/client'\nimport type { Methods } from '../core/worker/protocol'\nimport type { BookOp, Range, SheetOp, WorkbookMeta } from '../core/xlsx/types'\nimport { onLocal } from './hosts'\nimport type { Adapter, ApplyResult } from './session'\nimport { conflictsX, isStructural, transformX, type PBookOp, type XOp } from './xlsx-ops'\n\nconst CAPTURED = new Set<keyof Methods>(['xlsx.set', 'xlsx.format', 'xlsx.sheetOp', 'xlsx.replace', 'xlsx.bookOp', 'xlsx.undo', 'xlsx.redo'])\n\ntype UndoEntry = { kind: 'op'; id: string } | { kind: 'inverse'; sheet: string; undo: SheetOp; redo: SheetOp }\n\nexport interface XlsxPresence {\n k: 'xlsx'\n /** sheet part path */\n sheet: string\n /** selected range and active cell */\n range: Range\n ar: number\n ac: number\n}\n\n/** what XlsxView publishes about the local selection */\nexport interface XlsxLocalSel {\n sheet: number\n range: Range\n ar: number\n ac: number\n}\n\nexport class XlsxCollab implements Adapter<XOp> {\n submit?: (op: XOp) => Promise<unknown>\n nextId?: () => string\n onPresence?: (p: XlsxPresence) => void\n private undoStack: UndoEntry[] = []\n private redoStack: UndoEntry[] = []\n private offLocal: () => void\n\n constructor(private client: DocumentClient) {\n this.offLocal = onLocal(client, (d) => {\n const s = d as XlsxLocalSel\n const sheet = this.path(s.sheet)\n if (sheet) this.onPresence?.({ k: 'xlsx', sheet, range: s.range, ar: s.ar, ac: s.ac })\n })\n }\n\n dispose() {\n this.offLocal()\n }\n\n private get meta() {\n return this.client.info.xlsx as WorkbookMeta\n }\n\n private path(i: number): string {\n return this.meta.sheets[i]?.path ?? ''\n }\n\n private id() {\n return this.nextId!()\n }\n\n captures(method: keyof Methods): boolean {\n return CAPTURED.has(method)\n }\n\n intercept(method: keyof Methods, args: unknown[]): Promise<unknown> | undefined {\n if (!this.submit) return undefined\n const a = args as never[]\n switch (method) {\n case 'xlsx.set':\n return this.local({ t: 'set', id: this.id(), sheet: this.path(a[0]), cells: a[1] })\n case 'xlsx.format':\n return this.local({ t: 'fmt', id: this.id(), sheet: this.path(a[0]), range: a[1], patch: a[2] })\n case 'xlsx.sheetOp':\n return this.local({ t: 'sheet', id: this.id(), sheet: this.path(a[0]), op: a[1] })\n case 'xlsx.replace':\n return this.local({ t: 'replace', id: this.id(), sheet: this.path(a[0]), query: a[1], by: a[2], opts: a[3], at: a[4] })\n case 'xlsx.bookOp':\n return this.local({ t: 'book', id: this.id(), op: this.pbook(a[0]) })\n case 'xlsx.undo':\n return this.history(this.undoStack, this.redoStack, 'prev')\n case 'xlsx.redo':\n return this.history(this.redoStack, this.undoStack, 'next')\n }\n return undefined\n }\n\n private pbook(b: BookOp): PBookOp {\n switch (b.op) {\n case 'add':\n return { op: 'add', name: b.name, after: b.after !== undefined ? this.path(b.after) : undefined }\n case 'rename':\n return { op: 'rename', path: this.path(b.index), name: b.name }\n case 'delete':\n return { op: 'delete', path: this.path(b.index) }\n case 'move':\n return { op: 'move', path: this.path(b.from), to: b.to }\n }\n }\n\n private local(op: XOp): Promise<unknown> {\n if (op.t === 'sheet' && (op.op.op === 'insertRows' || op.op.op === 'insertCols')) {\n const del: SheetOp = { op: op.op.op === 'insertRows' ? 'deleteRows' : 'deleteCols', at: op.op.at, n: op.op.n }\n this.undoStack.push({ kind: 'inverse', sheet: op.sheet, undo: del, redo: op.op })\n } else if (!isStructural(op)) this.undoStack.push({ kind: 'op', id: op.id })\n if (this.undoStack.length > 200) this.undoStack.shift()\n this.redoStack = []\n return this.submit!(op)\n }\n\n private history(from: UndoEntry[], to: UndoEntry[], which: 'prev' | 'next'): Promise<unknown> {\n const e = from.pop()\n if (!e) return Promise.resolve(null)\n to.push(e)\n if (e.kind === 'op') return this.submit!({ t: 'revert', id: this.id(), target: e.id, which })\n return this.submit!({ t: 'sheet', id: this.id(), sheet: e.sheet, op: which === 'prev' ? e.undo : e.redo })\n }\n\n // ---------------------------------------------------------------- adapter\n\n transform(op: XOp, prior: XOp): XOp | null {\n return transformX(op, prior)\n }\n\n conflicts(pending: XOp[], remote: XOp[]): boolean {\n return conflictsX(pending, remote)\n }\n\n pessimistic(op: XOp): boolean {\n return isStructural(op)\n }\n\n async apply(op: XOp, kind: 'local' | 'replay' | 'remote'): Promise<ApplyResult> {\n const { res, rec } = await this.client.direct('collab.xlsx.apply', op)\n if (isStructural(op)) {\n // the worker dropped its records: older entries can't be reverted any more\n const keep = (e: UndoEntry) => e.kind === 'inverse' && kind === 'local'\n this.undoStack = this.undoStack.filter(keep)\n this.redoStack = this.redoStack.filter(keep)\n }\n if (kind !== 'local' && res) this.client.notify('collab:xlsx', res)\n return { result: res, undo: rec }\n }\n\n async revert(undo: unknown) {\n if (typeof undo !== 'number') return\n const res = await this.client.direct('collab.xlsx.revert', undo)\n if (res) this.client.notify('collab:xlsx', res)\n }\n}\n\n","/** PPTX collaboration operations. Slides are addressed by part path (indexes move), shapes by element id. */\nimport type { PParaSpec, ShapeOp } from '../core/pptx/types'\n\nexport type PSlideOp =\n | { op: 'add'; after: string | null; layout?: 'title' | 'content' | 'blank' }\n | { op: 'duplicate'; path: string }\n | { op: 'delete'; path: string }\n | { op: 'move'; path: string; to: number }\n | { op: 'hide'; path: string; hidden: boolean }\n\nexport type POp =\n /** whole text of shape `sid` (last writer wins per shape) */\n | { t: 'text'; id: string; slide: string; sid: number; paras: PParaSpec[] }\n /** shape edits; an inserted picture refers to its image by `key` */\n | { t: 'shapes'; id: string; slide: string; ops: (ShapeOp & { key?: string })[] }\n | { t: 'image'; id: string; key: string; slide: string; bytes: Uint8Array; ext: string }\n | { t: 'slides'; id: string; op: PSlideOp }\n /** puts the slide touched by op `target` back to its state before (`prev`) / after (`next`) it */\n | { t: 'revert'; id: string; target: string; which: 'prev' | 'next' }\n\nexport function transformP(op: POp, prior: POp): POp | null {\n if (prior.t === 'slides' && prior.op.op === 'delete' && 'slide' in op && op.slide === prior.op.path) return null\n return op\n}\n\n/** whether remote ops interact with pending local ones (→ rebase) */\nexport function conflictsP(pending: POp[], remote: POp[]): boolean {\n if (remote.some((o) => o.t === 'slides' || o.t === 'revert') || pending.some((o) => o.t === 'revert')) return true\n const mine = new Set(pending.flatMap((o) => ('slide' in o && o.t !== 'image' ? [o.slide] : [])))\n return remote.some((o) => 'slide' in o && o.t !== 'image' && mine.has(o.slide))\n}\n","/**\n * PPTX collaboration (main thread). Text and shape edits are applied optimistically (last writer\n * wins per shape); slide list changes wait for the hub's order. Undo / redo restore the slide\n * touched by the local user's own operation.\n */\nimport type { PresentationMeta, ShapeOp, SlideOp } from '../core/pptx/types'\nimport type { DocumentClient } from '../core/worker/client'\nimport type { Methods } from '../core/worker/protocol'\nimport { getHost, onLocal } from './hosts'\nimport { conflictsP, transformP, type POp, type PSlideOp } from './pptx-ops'\nimport type { PptxCollabResult } from './pptx-worker'\nimport type { Adapter, ApplyResult } from './session'\n\nconst CAPTURED = new Set<keyof Methods>(['pptx.setText', 'pptx.shapes', 'pptx.slides', 'pptx.image', 'pptx.undo'])\n\nexport interface PptxPresence {\n k: 'pptx'\n /** slide part path */\n slide: string\n /** selected element id */\n top?: number\n}\n\n/** what PptxView publishes about the local selection */\nexport interface PptxLocalSel {\n slide: number\n top?: number\n}\n\n/** PptxView registers this so remote slide-list changes can close its text editing first */\nexport interface PptxHost {\n endEditing(): void\n}\n\nexport class PptxCollab implements Adapter<POp> {\n submit?: (op: POp) => Promise<unknown>\n nextId?: () => string\n onPresence?: (p: PptxPresence) => void\n private undoStack: string[] = []\n private redoStack: string[] = []\n /** this client's image relationship id → image key */\n private ridKey = new Map<string, string>()\n private offLocal: () => void\n\n constructor(private client: DocumentClient) {\n this.offLocal = onLocal(client, (d) => {\n const s = d as PptxLocalSel\n const slide = this.path(s.slide)\n if (slide) this.onPresence?.({ k: 'pptx', slide, top: s.top })\n })\n }\n\n dispose() {\n this.offLocal()\n }\n\n private get meta() {\n return this.client.info.pptx as PresentationMeta\n }\n\n private path(i: number): string {\n return this.meta.slides[i]?.path ?? ''\n }\n\n private id() {\n return this.nextId!()\n }\n\n captures(method: keyof Methods): boolean {\n return CAPTURED.has(method)\n }\n\n intercept(method: keyof Methods, args: unknown[]): Promise<unknown> | undefined {\n if (!this.submit) return undefined\n const a = args as never[]\n switch (method) {\n case 'pptx.setText':\n return this.local({ t: 'text', id: this.id(), slide: this.path(a[0]), sid: a[1], paras: a[2] }).then((r) => (r as PptxCollabResult).model)\n case 'pptx.shapes': {\n const ops = (a[1] as ShapeOp[]).map((o) => (o.op === 'insert' && o.rid && this.ridKey.has(o.rid) ? { ...o, rid: undefined, key: this.ridKey.get(o.rid) } : o))\n return this.local({ t: 'shapes', id: this.id(), slide: this.path(a[0]), ops }).then((r) => (r as PptxCollabResult).model)\n }\n case 'pptx.image': {\n const key = `${this.id()}`\n const bytes = new Uint8Array((a[1] as ArrayBuffer).slice(0))\n return this.submit({ t: 'image', id: key, key, slide: this.path(a[0]), bytes, ext: a[2] }).then((r) => {\n const rid = (r as PptxCollabResult).rid\n if (rid) this.ridKey.set(rid, key)\n return rid\n })\n }\n case 'pptx.slides':\n return this.submit({ t: 'slides', id: this.id(), op: this.pslide(a[0]) }).then((r) => (r as PptxCollabResult | null)?.meta ?? this.meta)\n case 'pptx.undo':\n return this.history(a[0] ? this.redoStack : this.undoStack, a[0] ? this.undoStack : this.redoStack, a[0] ? 'next' : 'prev')\n }\n return undefined\n }\n\n private pslide(o: SlideOp): PSlideOp {\n switch (o.op) {\n case 'add':\n return { op: 'add', after: o.after >= 0 ? this.path(o.after) || null : null, layout: o.layout }\n case 'duplicate':\n return { op: 'duplicate', path: this.path(o.index) }\n case 'delete':\n return { op: 'delete', path: this.path(o.index) }\n case 'move':\n return { op: 'move', path: this.path(o.from), to: o.to }\n case 'hide':\n return { op: 'hide', path: this.path(o.index), hidden: o.hidden }\n }\n }\n\n private local(op: POp): Promise<unknown> {\n this.undoStack.push(op.id)\n if (this.undoStack.length > 200) this.undoStack.shift()\n this.redoStack = []\n return this.submit!(op)\n }\n\n private async history(from: string[], to: string[], which: 'prev' | 'next') {\n const target = from.pop()\n if (!target) return null\n to.push(target)\n const r = (await this.submit!({ t: 'revert', id: this.id(), target, which })) as PptxCollabResult\n return r.model && r.slide !== undefined ? { index: r.slide, model: r.model } : null\n }\n\n // ---------------------------------------------------------------- adapter\n\n transform(op: POp, prior: POp): POp | null {\n return transformP(op, prior)\n }\n\n conflicts(pending: POp[], remote: POp[]): boolean {\n return conflictsP(pending, remote)\n }\n\n pessimistic(op: POp): boolean {\n return op.t === 'slides'\n }\n\n prepare(ops: POp[]) {\n // slide indexes are about to move: let the text editor commit with the current ones first\n if (ops.some((o) => o.t === 'slides')) getHost<PptxHost>(this.client, 'pptx')?.endEditing()\n }\n\n async apply(op: POp, kind: 'local' | 'replay' | 'remote'): Promise<ApplyResult> {\n const { res, rec } = await this.client.direct('collab.pptx.apply', op)\n if (op.t === 'slides') {\n this.undoStack = []\n this.redoStack = []\n if (res.meta) Object.assign(this.meta, res.meta)\n }\n if (kind !== 'local') this.client.notify('collab:pptx', res)\n return { result: res, undo: rec }\n }\n\n async revert(undo: unknown) {\n if (typeof undo !== 'number') return\n this.client.notify('collab:pptx', await this.client.direct('collab.pptx.revert', undo))\n }\n}\n","/**\n * Wire protocol between collaboration clients and a hub (sequencer).\n *\n * The hub is format-agnostic: it assigns a global sequence number to every\n * batch of operations, stores the log and relays presence. All transformation\n * and conflict handling happens in the clients, deterministically, so every\n * client that applies the log ends up with the same document.\n */\n\nexport interface UserInfo {\n /** stable user id (optional, for the host app) */\n id?: string\n name: string\n /** CSS color; the hub assigns one when missing */\n color?: string\n}\n\nexport interface PeerInfo extends UserInfo {\n /** per-room connection id, assigned by the hub */\n site: number\n color: string\n presence?: unknown\n}\n\n/** A batch of operations as stored in the hub log. */\nexport interface Batch<Op = unknown> {\n seq: number\n site: number\n /** last seq the author had applied when creating the batch */\n base: number\n /** client generated id (dedupes resends after reconnects) */\n id: string\n ops: Op[]\n /** when the hub sequenced it (ms since epoch) */\n time?: number\n /** author: user id, else name */\n user?: string\n}\n\n/** A batch the way every client applies it: its ops transformed against the concurrent batches sequenced before it. */\nexport interface Entry<Op = unknown> {\n seq: number\n site: number\n ops: Op[]\n}\n\n/**\n * The document materialized at `seq` (see `compact`): a file containing every batch up to `seq`,\n * plus the canonical batches right before it (`ctx`) that clients joining from that file need to\n * merge batches still based on older states.\n */\nexport interface Snapshot<Op = unknown> {\n seq: number\n ctx: Entry<Op>[]\n}\n\nexport type ClientMsg =\n /**\n * join a room; `have`/`site` on reconnect. `base`: on the first join, the snapshot the client\n * opened (default 0, the original upload)\n */\n | { t: 'hello'; room: string; user: UserInfo; have?: number; site?: number; base?: number }\n | { t: 'ops'; id: string; base: number; ops: unknown[] }\n | { t: 'presence'; data: unknown }\n\nexport type HubMsg =\n /**\n * `log` holds every batch with seq > `from`; `ctx` the joined snapshot's context (first join from a\n * snapshot); `reset` when the hub can't continue from the client's state (history lost or dropped)\n */\n | { t: 'welcome'; site: number; seq: number; from: number; log: Batch[]; peers: PeerInfo[]; reset?: boolean; ctx?: Entry[] }\n | { t: 'batch'; b: Batch }\n | { t: 'presence'; site: number; data: unknown }\n | { t: 'join'; peer: PeerInfo }\n | { t: 'leave'; site: number }\n | { t: 'error'; message: string }\n\nexport const PEER_COLORS = ['#1a73e8', '#e8710a', '#188038', '#d93025', '#9334e6', '#c5221f', '#007b83', '#b06000', '#3f51b5', '#e52592']\n","/**\n * Runtime-agnostic collaboration hub: one sequencer + op log per room.\n * Wire it to any socket server (see scripts/collab-server.ts for Bun):\n *\n * const conn = hub.connect((msg) => socket.send(encode(msg)))\n * socket.onmessage = (e) => conn.receive(decode(e.data))\n * socket.onclose = () => conn.close()\n *\n * Snapshots (see `compact`) bound the history: register one with `hub.snapshot()` and new clients\n * open its file and only replay the batches after it, while the hub drops older batches.\n */\nimport { PEER_COLORS, type Batch, type ClientMsg, type Entry, type HubMsg, type PeerInfo, type Snapshot } from './protocol'\n\nexport interface RoomState {\n id: string\n seq: number\n /** every batch with seq > `start`, in order */\n log: Batch[]\n /** batches older than this were dropped (after a snapshot) */\n start: number\n ids: Set<string>\n peers: Map<number, { info: PeerInfo; send: (m: HubMsg) => void }>\n nextSite: number\n /** snapshots clients can join from: seq → context */\n snaps: Map<number, Entry[]>\n}\n\n/** A persisted room: its latest snapshot and the batches after it (and possibly some before). */\nexport interface RoomLog {\n log: Batch[]\n snapshot?: Snapshot & { sites?: number }\n}\n\ntype Loaded = Batch[] | RoomLog | undefined\n\nexport interface HubOptions {\n /** called for every sequenced batch (persist it to rebuild rooms after a restart) */\n onBatch?: (room: string, batch: Batch) => void\n /** rebuilds a room (e.g. from storage) the first time it is used */\n loadLog?: (room: string) => Loaded | Promise<Loaded>\n /** called when the last peer left a room */\n onIdle?: (room: string) => void\n /** batches kept below the latest snapshot for clients reconnecting from older states (default 1000) */\n retain?: number\n /** most recent snapshots clients can still join from (default 3) */\n keep?: number\n}\n\nexport interface HubConnection {\n receive(msg: ClientMsg): void\n close(): void\n}\n\nexport class CollabHub {\n readonly rooms = new Map<string, RoomState>()\n private loading = new Map<string, Promise<RoomState>>()\n\n constructor(private opts: HubOptions = {}) {}\n\n /** the room, loaded through `loadLog` the first time */\n room(id: string): Promise<RoomState> {\n const r = this.rooms.get(id)\n if (r) return Promise.resolve(r)\n let p = this.loading.get(id)\n if (!p) {\n p = Promise.resolve(this.opts.loadLog?.(id)).then((loaded): RoomState | Promise<RoomState> => {\n // reset while loading: the loaded state is stale, load again\n if (this.loading.get(id) !== p) return this.room(id)\n const r = this.rooms.get(id) ?? createRoom(id, loaded)\n this.rooms.set(id, r)\n return r\n })\n p.finally(() => this.loading.get(id) === p && this.loading.delete(id)).catch(() => {})\n this.loading.set(id, p)\n }\n return p\n }\n\n /** forgets a room (its log and peers) — e.g. when a new base file is uploaded */\n reset(id: string) {\n const r = this.rooms.get(id)\n if (r) for (const p of r.peers.values()) p.send({ t: 'error', message: 'Room was reset' })\n this.rooms.delete(id)\n this.loading.delete(id)\n }\n\n /** drops an idle room from memory (it is loaded again on the next join); false while peers are connected */\n unload(id: string): boolean {\n const r = this.rooms.get(id)\n if (r?.peers.size) return false\n this.rooms.delete(id)\n return true\n }\n\n /**\n * Registers a snapshot of a loaded room (`compact` output, its file stored where clients can open\n * it): clients may join from it, and batches older than `retain` below it are dropped.\n * Returns false when the snapshot doesn't fit the room (e.g. it was reset meanwhile).\n */\n snapshot(id: string, snap: Snapshot): boolean {\n const r = this.rooms.get(id)\n if (!r || snap.seq > r.seq || snap.seq < r.start) return false\n r.snaps.set(snap.seq, snap.ctx)\n const seqs = [...r.snaps.keys()].sort((a, b) => a - b)\n for (const s of seqs.splice(0, Math.max(0, seqs.length - (this.opts.keep ?? 3)))) r.snaps.delete(s)\n const cut = Math.min(seqs[0], seqs[seqs.length - 1] - (this.opts.retain ?? 1000))\n if (cut > r.start) {\n let n = 0\n while (n < r.log.length && r.log[n].seq <= cut) r.ids.delete(r.log[n++].id)\n r.log.splice(0, n)\n r.start = cut\n }\n return true\n }\n\n connect(send: (m: HubMsg) => void): HubConnection {\n let room: RoomState | undefined\n let site = 0\n let closed = false\n /** messages received while the room loads */\n let queued: ClientMsg[] | null = null\n const broadcast = (m: HubMsg, except?: number) => {\n if (!room) return\n for (const [s, p] of room.peers) if (s !== except) p.send(m)\n }\n const join = (r: RoomState, msg: Extract<ClientMsg, { t: 'hello' }>) => {\n room = r\n site = msg.site && msg.site < r.nextSite && !r.peers.has(msg.site) ? msg.site : r.nextSite++\n const used = new Set([...r.peers.values()].map((p) => p.info.color))\n const color = msg.user.color || PEER_COLORS.find((c) => !used.has(c)) || PEER_COLORS[site % PEER_COLORS.length]\n const info: PeerInfo = { ...msg.user, site, color }\n let from: number\n let ctx: Entry[] | undefined\n let reset: boolean\n if (msg.have !== undefined) {\n // reconnect: everything after `have` is needed\n from = msg.have\n reset = from > r.seq || from < r.start\n } else {\n // first join from the original upload (0) or a snapshot\n from = msg.base ?? 0\n ctx = from === 0 ? undefined : r.snaps.get(from)\n reset = from > r.seq || from < r.start || (from > 0 && !ctx)\n }\n send({\n t: 'welcome', site, seq: r.seq, from, reset,\n log: reset ? [] : r.log.filter((b) => b.seq > from),\n peers: [...r.peers.values()].map((p) => p.info),\n ...(ctx && !reset ? { ctx } : {}),\n })\n r.peers.set(site, { info, send })\n broadcast({ t: 'join', peer: info }, site)\n }\n const receive = (msg: ClientMsg) => {\n if (closed) return\n if (queued) return void queued.push(msg)\n if (msg.t === 'hello') {\n if (room) return\n queued = []\n this.room(msg.room).then(\n (r) => {\n const rest = queued!\n queued = null\n if (closed) return\n join(r, msg)\n rest.forEach(receive)\n },\n (e) => {\n queued = null\n send({ t: 'error', message: `Room failed to load: ${(e as Error).message}` })\n },\n )\n return\n }\n if (!room) return send({ t: 'error', message: 'Not joined' })\n if (msg.t === 'ops') {\n if (room.ids.has(msg.id)) return\n const p = room.peers.get(site)\n const b: Batch = {\n seq: ++room.seq, site, base: Math.min(msg.base, room.seq - 1), id: msg.id, ops: msg.ops,\n time: Date.now(), user: p?.info.id ?? p?.info.name,\n }\n room.log.push(b)\n room.ids.add(b.id)\n this.opts.onBatch?.(room.id, b)\n broadcast({ t: 'batch', b })\n } else if (msg.t === 'presence') {\n const p = room.peers.get(site)\n if (p) p.info.presence = msg.data\n broadcast({ t: 'presence', site, data: msg.data }, site)\n }\n }\n return {\n receive,\n close: () => {\n closed = true\n if (!room || !room.peers.has(site)) return\n room.peers.delete(site)\n broadcast({ t: 'leave', site })\n if (!room.peers.size) this.opts.onIdle?.(room.id)\n },\n }\n }\n}\n\nfunction createRoom(id: string, loaded: Loaded): RoomState {\n const rl: RoomLog = Array.isArray(loaded) ? { log: loaded } : loaded ?? { log: [] }\n const snap = rl.snapshot\n let log = [...rl.log].sort((a, b) => a.seq - b.seq)\n // keep the consecutive run that reaches the end\n for (let i = log.length - 1; i > 0; i--) {\n if (log[i - 1].seq !== log[i].seq - 1) {\n log = log.slice(i)\n break\n }\n }\n let seq = log.length ? log[log.length - 1].seq : 0\n let start = log.length ? log[0].seq - 1 : 0\n if (snap && (snap.seq > seq || snap.seq < start)) {\n // batches after the snapshot were lost (or don't connect to it): continue from the snapshot\n seq = start = snap.seq\n log = []\n }\n let nextSite = Math.max(1, snap?.sites ?? 1)\n for (const b of log) nextSite = Math.max(nextSite, b.site + 1)\n for (const e of snap?.ctx ?? []) nextSite = Math.max(nextSite, e.site + 1)\n return {\n id, seq, log, start, nextSite,\n ids: new Set(log.map((b) => b.id)),\n peers: new Map(),\n snaps: new Map(snap ? [[snap.seq, snap.ctx]] : []),\n }\n}\n","/**\n * Server-side snapshots: replays shared history onto a document headlessly, exactly the way a\n * collaborator applies it, so the result can be saved as the room's new base file.\n *\n * const client = await DocumentClient.open(snapshotFile, { worker: false })\n * const snap = await compact(client, { from: snapshotMeta, batches })\n * const file = await client.call('save') // store it, then hub.snapshot(room, snap)\n */\nimport type { DocumentClient } from '../core/worker/client'\nimport { getHost } from './hosts'\nimport { startCollab } from './index'\nimport type { Batch, ClientMsg, HubMsg, Snapshot } from './protocol'\nimport type { Transport, TransportStatus } from './transport'\n\nexport interface CompactOptions {\n /** the snapshot `client` was opened from (default: the original upload, seq 0) */\n from?: Snapshot\n /** batches to apply: every batch after `from.seq`, in order (older ones are ignored) */\n batches: Batch[]\n /** canonical batches kept as the new snapshot's context (default 1000) */\n window?: number\n}\n\n/** feeds a stored log to a session as if a hub had sent it */\nclass ReplayTransport implements Transport {\n onMessage?: (msg: HubMsg) => void\n onStatus?: (s: TransportStatus) => void\n\n constructor(private welcome: HubMsg) {}\n\n connect() {\n queueMicrotask(() => this.onStatus?.('open'))\n }\n\n send(msg: ClientMsg) {\n if (msg.t === 'hello') queueMicrotask(() => this.onMessage?.(this.welcome))\n }\n\n close() {}\n}\n\n/**\n * Applies `batches` to `client` (opened on the file of snapshot `from`) and returns the snapshot it\n * now holds. Save the document afterwards with `client.call('save')`.\n */\nexport async function compact(client: DocumentClient, opts: CompactOptions): Promise<Snapshot> {\n if (client.kind === 'docx' && !getHost(client, 'docx')) throw new Error('compact: DOCX needs its editor host registered (registerHost)')\n const from = opts.from ?? { seq: 0, ctx: [] }\n const batches = opts.batches.filter((b) => b.seq > from.seq).sort((a, b) => a.seq - b.seq)\n batches.forEach((b, i) => {\n if (b.seq !== from.seq + i + 1) throw new Error(`compact: batch ${from.seq + i + 1} is missing`)\n })\n const seq = from.seq + batches.length\n // site 0 is never assigned by a hub: every batch is someone else's\n const transport = new ReplayTransport({ t: 'welcome', site: 0, seq, from: from.seq, log: batches, peers: [], ctx: from.ctx })\n const collab = startCollab(client, { transport, room: '', user: { name: 'compact' }, base: from.seq })\n try {\n await new Promise<void>((resolve, reject) => {\n const check = () => {\n if (collab.status === 'live') resolve()\n else if (collab.status === 'error') reject(new Error(collab.session.error ?? 'compact failed'))\n }\n collab.on('status', check)\n check()\n })\n await collab.session.idle()\n if (collab.session.rev !== seq) throw new Error(`compact: stopped at ${collab.session.rev} of ${seq}`)\n return { seq, ctx: collab.session.context(opts.window ?? 1000) }\n } finally {\n collab.close()\n }\n}\n","/**\n * Durable rooms on any key → bytes storage (S3, GCS, a directory, memory):\n *\n * {room}/head.json latest snapshot: { epoch, seq, size, name, type, time }\n * {room}/{epoch}/snap/{seq}.bin the document at `seq` (seq 0: the uploaded file)\n * {room}/{epoch}/snap/{seq}.json / .ctx its metadata / merge context\n * {room}/{epoch}/ops/{first}-{last}.jsonl sequenced batches, one segment per flush\n *\n * Saving an edit appends a small segment; the document itself is rewritten only when a snapshot\n * is taken (`compact`). Snapshots and segments together are the version history: any `seq` is\n * a snapshot plus the batches after it. Uploading a new file starts a new epoch.\n */\nimport { decode, encode } from './codec'\nimport type { RoomLog } from './hub'\nimport type { Batch, Entry, Snapshot } from './protocol'\n\n/** Minimal object storage. Keys use `/` separators. */\nexport interface BlobStore {\n /** null when missing */\n get(key: string): Promise<Uint8Array | null>\n put(key: string, data: Uint8Array): Promise<void>\n /** every key starting with `prefix` (any order) */\n list(prefix: string): Promise<string[]>\n delete(key: string): Promise<void>\n}\n\nexport class MemoryBlobStore implements BlobStore {\n readonly data = new Map<string, Uint8Array>()\n async get(key: string) {\n return this.data.get(key) ?? null\n }\n async put(key: string, data: Uint8Array) {\n this.data.set(key, data.slice())\n }\n async list(prefix: string) {\n return [...this.data.keys()].filter((k) => k.startsWith(prefix))\n }\n async delete(key: string) {\n this.data.delete(key)\n }\n}\n\nexport interface RoomHead {\n /** changes with every upload: stale writes of an older upload are ignored */\n epoch: string\n /** latest snapshot */\n seq: number\n size: number\n name: string\n type: string\n time: number\n}\n\n/** a stored snapshot */\nexport interface Version {\n seq: number\n size: number\n time: number\n}\n\nexport interface RoomStoreOptions {\n /** key prefix, e.g. `collab/` */\n prefix?: string\n /** batches are buffered and written as one segment at most this often (ms, default 250) */\n flushMs?: number\n /** snapshots kept per room (default: all — the version history); older ones and their batches are deleted */\n keep?: number\n /** batches below the latest snapshot loaded for clients reconnecting from older states (default 1000) */\n retain?: number\n /** a write failed (it is retried) */\n onError?: (error: Error, room: string) => void\n}\n\ntype SnapMeta = Version & { sites?: number }\n\nconst pad = (n: number) => String(n).padStart(12, '0')\nconst enc = new TextEncoder()\nconst dec = new TextDecoder()\nconst json = (v: unknown) => enc.encode(JSON.stringify(v))\nconst parse = <T>(b: Uint8Array | null): T | null => (b ? (JSON.parse(dec.decode(b)) as T) : null)\n\nexport class RoomStore {\n private heads = new Map<string, RoomHead | null>()\n private buffers = new Map<string, { batches: Batch[]; timer?: ReturnType<typeof setTimeout>; retry: number }>()\n private queues = new Map<string, Promise<unknown>>()\n\n constructor(\n readonly blobs: BlobStore,\n private opts: RoomStoreOptions = {},\n ) {}\n\n private dir(room: string) {\n // dots escaped too: no `..` segments in keys used as file paths\n return `${this.opts.prefix ?? ''}${encodeURIComponent(room).replace(/\\./g, '%2E')}/`\n }\n\n private epochDir(room: string, epoch: string) {\n return `${this.dir(room)}${epoch}/`\n }\n\n /** runs `fn` after every earlier operation on `room` */\n private run<T>(room: string, fn: () => Promise<T>): Promise<T> {\n const p = (this.queues.get(room) ?? Promise.resolve()).then(fn, fn)\n const tail = p.catch(() => {})\n this.queues.set(room, tail)\n void tail.then(() => this.queues.get(room) === tail && this.queues.delete(room))\n return p\n }\n\n private async readHead(room: string): Promise<RoomHead | null> {\n if (this.heads.has(room)) return this.heads.get(room)!\n const h = parse<RoomHead>(await this.blobs.get(this.dir(room) + 'head.json'))\n this.heads.set(room, h)\n return h\n }\n\n /** sets a room's document (snapshot 0 of a new epoch) and forgets its history */\n create(room: string, file: Uint8Array, info: { name: string; type: string }): Promise<RoomHead> {\n const buf = this.buffers.get(room)\n if (buf) {\n clearTimeout(buf.timer)\n this.buffers.delete(room)\n }\n return this.run(room, async () => {\n const old = await this.readHead(room)\n const head: RoomHead = { epoch: Date.now().toString(36) + Math.random().toString(36).slice(2, 6), seq: 0, size: file.length, time: Date.now(), ...info }\n const d = this.epochDir(room, head.epoch)\n await this.blobs.put(`${d}snap/${pad(0)}.bin`, file)\n await this.blobs.put(`${d}snap/${pad(0)}.json`, json({ seq: 0, size: file.length, time: head.time } satisfies SnapMeta))\n await this.blobs.put(this.dir(room) + 'head.json', json(head))\n this.heads.set(room, head)\n if (old) for (const k of await this.blobs.list(this.epochDir(room, old.epoch))) await this.blobs.delete(k)\n return head\n })\n }\n\n /** latest snapshot of the room (null: no such room) */\n head(room: string): Promise<RoomHead | null> {\n return this.run(room, () => this.readHead(room))\n }\n\n /** the document of snapshot `seq` */\n async file(room: string, seq: number, epoch?: string): Promise<Uint8Array | null> {\n epoch ??= (await this.head(room))?.epoch\n return epoch ? this.blobs.get(`${this.epochDir(room, epoch)}snap/${pad(seq)}.bin`) : null\n }\n\n /** snapshot `seq` with its merge context */\n async snapshot(room: string, seq: number, epoch?: string): Promise<(Snapshot & SnapMeta) | null> {\n epoch ??= (await this.head(room))?.epoch\n if (!epoch) return null\n const d = `${this.epochDir(room, epoch)}snap/${pad(seq)}`\n const meta = parse<SnapMeta>(await this.blobs.get(d + '.json'))\n if (!meta) return null\n const ctx = await this.blobs.get(d + '.ctx')\n return { ...meta, ctx: ctx ? decode<Entry[]>(dec.decode(ctx)) : [] }\n }\n\n /** stored snapshots, oldest first */\n async versions(room: string, epoch?: string): Promise<Version[]> {\n epoch ??= (await this.head(room))?.epoch\n if (!epoch) return []\n const d = `${this.epochDir(room, epoch)}snap/`\n const keys = (await this.blobs.list(d)).filter((k) => k.endsWith('.json')).sort()\n const out: Version[] = []\n for (const k of keys) {\n const m = parse<SnapMeta>(await this.blobs.get(k))\n if (m) out.push({ seq: m.seq, size: m.size, time: m.time })\n }\n return out\n }\n\n /** stored batches with `after` < seq ≤ `upTo` (flushed ones only), in order */\n async batches(room: string, after: number, upTo = Infinity, epoch?: string): Promise<Batch[]> {\n epoch ??= (await this.head(room))?.epoch\n if (!epoch) return []\n const segs = (await this.blobs.list(`${this.epochDir(room, epoch)}ops/`))\n .map((k) => {\n const m = /(\\d+)-(\\d+)\\.jsonl$/.exec(k)\n return m ? { k, first: Number(m[1]), last: Number(m[2]) } : null\n })\n .filter((s) => s !== null && s.last > after && s.first <= upTo)\n .sort((a, b) => a!.first - b!.first)\n const seen = new Set<number>()\n const out: Batch[] = []\n for (const s of segs) {\n const text = dec.decode((await this.blobs.get(s!.k)) ?? new Uint8Array())\n for (const line of text.split('\\n')) {\n if (!line) continue\n const b = decode<Batch>(line)\n if (b.seq > after && b.seq <= upTo && !seen.has(b.seq)) {\n seen.add(b.seq)\n out.push(b)\n }\n }\n }\n return out.sort((a, b) => a.seq - b.seq)\n }\n\n // ---------------------------------------------------------------- hub hooks\n\n /** hub `onBatch`: buffers the batch, written with the next segment */\n append(room: string, batch: Batch) {\n let buf = this.buffers.get(room)\n if (!buf) this.buffers.set(room, (buf = { batches: [], retry: 0 }))\n buf.batches.push(batch)\n if (!buf.timer) buf.timer = setTimeout(() => void this.flushRoom(room), this.opts.flushMs ?? 250)\n }\n\n /** writes buffered batches now (all rooms when `room` is omitted) */\n async flush(room?: string): Promise<void> {\n const rooms = room !== undefined ? [room] : [...this.buffers.keys()]\n await Promise.all(rooms.map((r) => this.flushRoom(r)))\n }\n\n private flushRoom(room: string): Promise<void> {\n const buf = this.buffers.get(room)\n if (buf) {\n clearTimeout(buf.timer)\n buf.timer = undefined\n }\n return this.run(room, async () => {\n const b = this.buffers.get(room)\n if (!b?.batches.length) return\n const batches = b.batches\n b.batches = []\n const head = await this.readHead(room)\n if (!head) return\n const key = `${this.epochDir(room, head.epoch)}ops/${pad(batches[0].seq)}-${pad(batches[batches.length - 1].seq)}.jsonl`\n try {\n await this.blobs.put(key, enc.encode(batches.map((x) => encode(x)).join('\\n') + '\\n'))\n b.retry = 0\n } catch (e) {\n this.opts.onError?.(e as Error, room)\n if (this.buffers.get(room) !== b) return\n b.batches.unshift(...batches)\n if (!b.timer) b.timer = setTimeout(() => void this.flushRoom(room), Math.min(30_000, 500 * 2 ** b.retry++))\n }\n })\n }\n\n /** hub `loadLog`: the latest snapshot and the batches after it (plus `retain` before it) */\n load(room: string): Promise<RoomLog | undefined> {\n return this.flushRoom(room).then(() =>\n this.run(room, async () => {\n this.heads.delete(room)\n const head = await this.readHead(room)\n if (!head) return undefined\n const snapshot = await this.snapshot(room, head.seq, head.epoch)\n const log = await this.batches(room, Math.max(0, head.seq - (this.opts.retain ?? 1000)), Infinity, head.epoch)\n return { log, snapshot: snapshot ?? { seq: head.seq, ctx: [] } }\n }),\n )\n }\n\n /**\n * Stores a snapshot taken from `base` (the head it was compacted from) and makes it the latest.\n * Returns the new head, or null when the room changed meanwhile (new upload, newer snapshot).\n */\n save(room: string, base: RoomHead, snap: Snapshot & { sites?: number }, file: Uint8Array): Promise<RoomHead | null> {\n return this.run(room, async () => {\n const head = await this.readHead(room)\n if (!head || head.epoch !== base.epoch || snap.seq <= head.seq) return null\n const d = this.epochDir(room, head.epoch)\n const time = Date.now()\n // head moves only once the snapshot is complete\n await Promise.all([\n this.blobs.put(`${d}snap/${pad(snap.seq)}.bin`, file),\n this.blobs.put(`${d}snap/${pad(snap.seq)}.ctx`, enc.encode(encode(snap.ctx))),\n this.blobs.put(`${d}snap/${pad(snap.seq)}.json`, json({ seq: snap.seq, size: file.length, time, sites: snap.sites } satisfies SnapMeta)),\n ])\n const next: RoomHead = { ...head, seq: snap.seq, size: file.length, time }\n await this.blobs.put(this.dir(room) + 'head.json', json(next))\n this.heads.set(room, next)\n if (this.opts.keep) await this.prune(room, next)\n return next\n })\n }\n\n /** drops snapshots beyond `keep` and the segments no remaining snapshot needs */\n private async prune(room: string, head: RoomHead) {\n const d = `${this.epochDir(room, head.epoch)}snap/`\n const seqs = [...new Set((await this.blobs.list(d)).map((k) => Number(/(\\d+)\\.\\w+$/.exec(k)?.[1])).filter((n) => !Number.isNaN(n)))].sort((a, b) => a - b)\n const drop = seqs.slice(0, Math.max(0, seqs.length - this.opts.keep!))\n for (const s of drop) for (const ext of ['bin', 'json', 'ctx']) await this.blobs.delete(`${d}${pad(s)}.${ext}`)\n const oldest = seqs[drop.length]\n const floor = Math.min(oldest, head.seq - (this.opts.retain ?? 1000))\n for (const k of await this.blobs.list(`${this.epochDir(room, head.epoch)}ops/`)) {\n const last = Number(/-(\\d+)\\.jsonl$/.exec(k)?.[1])\n if (last <= floor) await this.blobs.delete(k)\n }\n }\n}\n","/**\n * Real-time collaboration for office-engine documents.\n *\n * const collab = startCollab(client, { transport: 'wss://host/collab', room: 'doc-42', user: { name: 'Ann' } })\n * collab.on('status', console.log)\n * collab.close()\n *\n * Every participant must open the same base file; the hub keeps the operation log on top of it.\n * DocViewer does all of this through its `collab` prop.\n */\nimport type { DocumentClient } from '../core/worker/client'\nimport type { Methods } from '../core/worker/protocol'\nimport { DocxCollab, type DocxPresence } from './docx'\nimport { setPeers, type PeerView } from './hosts'\nimport type { PeerInfo, UserInfo } from './protocol'\nimport { CollabSession, type Adapter, type CollabStatus, type SessionEvents } from './session'\nimport { WebSocketTransport, type Transport } from './transport'\nimport { XlsxCollab } from './xlsx'\nimport { PptxCollab } from './pptx'\n\nexport interface CollabOptions {\n /** hub connection: a WebSocket URL or any Transport */\n transport: Transport | string\n /** shared document id */\n room: string\n user: UserInfo\n /**\n * Sequence number of the snapshot `src` was opened from (see `compact`); default 0, the original\n * upload. The hub then only sends the batches after it.\n */\n base?: number\n}\n\nexport interface Collab {\n readonly session: CollabSession<unknown>\n readonly status: CollabStatus\n /** collaborators currently connected (without the local user) */\n readonly peers: PeerInfo[]\n /** local operations not yet confirmed by the hub */\n readonly pending: number\n on<K extends keyof SessionEvents>(event: K, fn: (d: SessionEvents[K]) => void): () => void\n /** screen rectangles of a collaborator's DOCX selection (for custom overlays) */\n rects(root: HTMLElement, peer: PeerView): { caret: DOMRect | null; sel: DOMRect[] } | null\n close(): void\n}\n\ninterface AnyAdapter extends Adapter<unknown> {\n /** whether `method` changes the document (and becomes a shared operation) */\n captures(method: keyof Methods): boolean\n intercept(method: keyof Methods, args: unknown[]): Promise<unknown> | undefined\n submit?: (op: never) => Promise<unknown>\n push?: (op: never, undo: never) => void\n nextId?: () => string\n onPresence?: (p: never) => void\n setSite?(site: number): void\n dispose?(): void\n}\n\nexport function startCollab(client: DocumentClient, opts: CollabOptions): Collab {\n const transport = typeof opts.transport === 'string' ? new WebSocketTransport(opts.transport) : opts.transport\n const docx = client.kind === 'docx' ? new DocxCollab(client) : undefined\n const adapter = (docx ?? (client.kind === 'xlsx' ? new XlsxCollab(client) : new PptxCollab(client))) as unknown as AnyAdapter\n const session = new CollabSession<unknown>(transport, adapter, { room: opts.room, user: opts.user, base: opts.base })\n adapter.submit = (op) => session.submit(op)\n adapter.push = (op, undo) => session.push(op, undo)\n adapter.nextId = () => session.nextId()\n adapter.onPresence = (p) => session.setPresence(p)\n client.interceptor = (method, args) => {\n if (!adapter.captures(method)) return undefined\n // editing before the shared history was replayed would fork the document\n if (session.status === 'connecting' || session.status === 'syncing' || session.status === 'error') {\n return Promise.reject(new Error(session.status === 'error' ? session.error ?? 'Collaboration stopped' : 'Document is still syncing'))\n }\n return adapter.intercept(method, args)\n }\n const offs = [\n session.on('peers', (peers) => setPeers(client, peers)),\n session.on('status', (s) => {\n if (s === 'live') adapter.setSite?.(session.site)\n }),\n ]\n return {\n session,\n get status() {\n return session.status\n },\n get peers() {\n return [...session.peers.values()]\n },\n get pending() {\n return session.pending\n },\n on: (event, fn) => session.on(event, fn),\n rects: (root, peer) => {\n const p = peer.presence as DocxPresence | undefined\n return docx && p?.k === 'docx' ? docx.rects(root, p) : null\n },\n close() {\n offs.forEach((f) => f())\n session.close()\n if (client.interceptor) client.interceptor = undefined\n adapter.dispose?.()\n setPeers(client, [])\n },\n }\n}\n\nexport { CollabHub, type HubOptions, type HubConnection, type RoomLog, type RoomState } from './hub'\nexport { compact, type CompactOptions } from './compact'\nexport { RoomStore, MemoryBlobStore, type BlobStore, type RoomHead, type RoomStoreOptions, type Version } from './store'\nexport { CollabSession, type Adapter, type CollabStatus } from './session'\nexport { MemoryTransport, WebSocketTransport, type Transport, type TransportStatus } from './transport'\nexport type { Batch, ClientMsg, Entry, HubMsg, PeerInfo, Snapshot, UserInfo } from './protocol'\nexport { encode, decode } from './codec'\n"],"mappings":"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"}
|
package/dist/collab.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
|
|
2
|
-
export { a as CollabHub, u as CollabSession, n as MemoryBlobStore, o as MemoryTransport, r as RoomStore, s as WebSocketTransport, i as compact, c as decode, l as encode, t as startCollab } from "./collab-
|
|
2
|
+
export { a as CollabHub, u as CollabSession, n as MemoryBlobStore, o as MemoryTransport, r as RoomStore, s as WebSocketTransport, i as compact, c as decode, l as encode, t as startCollab } from "./collab-Dx00zqXR.js";
|
package/dist/embed.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
2
|
import { n as e, t } from "./default-worker-BDj6MNRA.js";
|
|
3
|
-
import { a as n, c as r, d as i, i as a, l as o, n as s, o as c, r as l, s as u, t as d, u as f } from "./DocViewer-
|
|
4
|
-
import { a as p, o as m, s as h, t as g, u as _ } from "./collab-
|
|
3
|
+
import { a as n, c as r, d as i, i as a, l as o, n as s, o as c, r as l, s as u, t as d, u as f } from "./DocViewer-CT8VAa1L.js";
|
|
4
|
+
import { a as p, o as m, s as h, t as g, u as _ } from "./collab-Dx00zqXR.js";
|
|
5
5
|
export { s as CollabBar, p as CollabHub, _ as CollabSession, d as DocViewer, t as DocumentClient, i as DocxView, m as MemoryTransport, l as PeerOverlay, u as PptxView, r as SlideView, h as WebSocketTransport, n as XlsxView, o as injectStyles, e as setDefaultWorker, g as startCollab, f as stylesText, a as useCollab, c as useDocument };
|