@earendil-works/chord 0.87.1 → 0.99.1

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.
Files changed (99) hide show
  1. package/README.md +80 -27
  2. package/dist/api.d.ts +6 -1
  3. package/dist/api.d.ts.map +1 -1
  4. package/dist/api.js +8 -3
  5. package/dist/api.js.map +1 -1
  6. package/dist/bundler.d.ts.map +1 -1
  7. package/dist/context/index.d.ts.map +1 -1
  8. package/dist/context/index.js.map +1 -1
  9. package/dist/delta/apply-immutable-trusted.d.ts +4 -0
  10. package/dist/delta/apply-immutable-trusted.d.ts.map +1 -0
  11. package/dist/delta/apply-immutable-trusted.js +127 -0
  12. package/dist/delta/apply-immutable-trusted.js.map +1 -0
  13. package/dist/{state → delta}/diff.d.ts +1 -1
  14. package/dist/delta/diff.d.ts.map +1 -0
  15. package/dist/delta/diff.js +433 -0
  16. package/dist/delta/diff.js.map +1 -0
  17. package/dist/delta/draft.d.ts +5 -0
  18. package/dist/delta/draft.d.ts.map +1 -0
  19. package/dist/delta/draft.js +2 -0
  20. package/dist/delta/draft.js.map +1 -0
  21. package/dist/delta/index.d.ts +11 -21
  22. package/dist/delta/index.d.ts.map +1 -1
  23. package/dist/delta/index.js +43 -1341
  24. package/dist/delta/index.js.map +1 -1
  25. package/dist/delta/revision-validator.d.ts +7 -0
  26. package/dist/delta/revision-validator.d.ts.map +1 -0
  27. package/dist/delta/revision-validator.js +71 -0
  28. package/dist/delta/revision-validator.js.map +1 -0
  29. package/dist/delta/tracker.d.ts +26 -0
  30. package/dist/delta/tracker.d.ts.map +1 -0
  31. package/dist/delta/tracker.js +2069 -0
  32. package/dist/delta/tracker.js.map +1 -0
  33. package/dist/facets/host.d.ts.map +1 -1
  34. package/dist/facets/host.js.map +1 -1
  35. package/dist/facets/loader.d.ts.map +1 -1
  36. package/dist/facets/loader.js.map +1 -1
  37. package/dist/index.d.ts +3 -3
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1 -1
  40. package/dist/index.js.map +1 -1
  41. package/dist/json.d.ts +6 -0
  42. package/dist/json.d.ts.map +1 -1
  43. package/dist/json.js +73 -6
  44. package/dist/json.js.map +1 -1
  45. package/dist/node/bundle-loader.d.ts.map +1 -1
  46. package/dist/node/bundle-loader.js.map +1 -1
  47. package/dist/node/bundle.d.ts.map +1 -1
  48. package/dist/node/bundle.js.map +1 -1
  49. package/dist/node/manifest.d.ts.map +1 -1
  50. package/dist/node/package.d.ts.map +1 -1
  51. package/dist/node/package.js.map +1 -1
  52. package/dist/node.d.ts.map +1 -1
  53. package/dist/services/consumer.d.ts.map +1 -1
  54. package/dist/services/consumer.js +49 -1
  55. package/dist/services/consumer.js.map +1 -1
  56. package/dist/services/errors.d.ts.map +1 -1
  57. package/dist/services/errors.js.map +1 -1
  58. package/dist/services/handle.d.ts.map +1 -1
  59. package/dist/services/handle.js +3 -1
  60. package/dist/services/handle.js.map +1 -1
  61. package/dist/services/instances.d.ts +1 -0
  62. package/dist/services/instances.d.ts.map +1 -1
  63. package/dist/services/instances.js +3 -0
  64. package/dist/services/instances.js.map +1 -1
  65. package/dist/services/loopback.d.ts.map +1 -1
  66. package/dist/services/loopback.js.map +1 -1
  67. package/dist/services/provider.d.ts.map +1 -1
  68. package/dist/services/provider.js +48 -29
  69. package/dist/services/provider.js.map +1 -1
  70. package/dist/services/state-codec.d.ts.map +1 -1
  71. package/dist/services/state-codec.js +18 -0
  72. package/dist/services/state-codec.js.map +1 -1
  73. package/dist/services/state-internals.d.ts +5 -2
  74. package/dist/services/state-internals.d.ts.map +1 -1
  75. package/dist/services/state-internals.js.map +1 -1
  76. package/dist/services/state.d.ts +8 -3
  77. package/dist/services/state.d.ts.map +1 -1
  78. package/dist/services/state.js +288 -88
  79. package/dist/services/state.js.map +1 -1
  80. package/dist/services/wire.d.ts +3 -0
  81. package/dist/services/wire.d.ts.map +1 -1
  82. package/dist/services/wire.js +13 -0
  83. package/dist/services/wire.js.map +1 -1
  84. package/dist/types.d.ts +74 -8
  85. package/dist/types.d.ts.map +1 -1
  86. package/dist/types.js.map +1 -1
  87. package/package.json +3 -3
  88. package/src/delta/README.md +143 -360
  89. package/dist/state/diff.d.ts.map +0 -1
  90. package/dist/state/diff.js +0 -259
  91. package/dist/state/diff.js.map +0 -1
  92. package/dist/state/draft.d.ts +0 -13
  93. package/dist/state/draft.d.ts.map +0 -1
  94. package/dist/state/draft.js +0 -540
  95. package/dist/state/draft.js.map +0 -1
  96. package/dist/state/value.d.ts +0 -9
  97. package/dist/state/value.d.ts.map +0 -1
  98. package/dist/state/value.js +0 -175
  99. package/dist/state/value.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../src/delta/tracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { copyJson } from \"../json.ts\";\nimport type { JsonValue } from \"../types.ts\";\nimport { applyImmutableTrusted } from \"./apply-immutable-trusted.ts\";\nimport type { Draft } from \"./draft.ts\";\nimport { applyImmutable, type NonEmptyPath, type Op, overlap, type Path, RESERVED_SEGMENTS } from \"./index.ts\";\n\nexport type { Draft, JsonValue, Op };\n\ntype Primitive = null | boolean | number | string;\ntype Container = JsonValue[] | Record<string, JsonValue>;\ntype Stored = JsonValue;\ntype StoredRef = Primitive | { index: number };\ntype Status = \"open\" | \"prepared\" | \"consumed\" | \"aborted\" | \"stale\";\ntype StatusCell = { value: Status };\n\ntype InsertSource = { refs: StoredRef[] };\ntype ParentKind = 0 | 1 | 2; // object, base-array entry, inserted-array entry\n\ntype BasePiece = { kind: \"base\"; start: number; length: number; step: 1 | -1 };\ntype InsertPiece = { kind: \"insert\"; source: InsertSource; start: number; length: number; step: 1 | -1 };\ntype Piece = BasePiece | InsertPiece;\n\ntype PieceNode = {\n\tpiece: Piece;\n\tleft: PieceNode | undefined;\n\tright: PieceNode | undefined;\n\tpriority: number;\n\telements: number;\n};\n\ntype PieceLocation = { piece: Piece; logicalStart: number; minimum: number; maximum: number };\n\ntype DenseRegion = { start: number; length: number };\ntype DenseCandidates = { indices: number[]; bits: Uint8Array | undefined; length: number };\n\ntype ArrayPlan = {\n\tremoveRuns: number[];\n\tpermutation: number[] | undefined;\n\tinsertRuns: number[];\n};\n\ntype ArrayOverlay = {\n\troot: PieceNode | undefined;\n\tpieces: Piece[] | undefined;\n\tbaseOverrides: Map<number, StoredRef> | undefined;\n\tinsertOverrides: Map<InsertSource, Map<number, StoredRef>> | undefined;\n\tstructural: boolean;\n\tgeneration: number;\n\tplan: ArrayPlan | undefined;\n\tseed: number;\n\tlocatedOffset: number;\n\tbaseLocations: PieceLocation[] | undefined;\n\tinsertLocations: Map<InsertSource, PieceLocation[]> | undefined;\n};\n\ntype OverlayNode = {\n\tcontext: OverlayContext;\n\tbaseIndex: number;\n\tparentIndex: number;\n\tparentKind: ParentKind;\n\tparentKey: string | number;\n\tparentSource?: InsertSource;\n\tparentPlacement: boolean;\n\ttarget: object;\n\tproxy: object;\n\twriteKey?: string;\n\twriteValue?: StoredRef;\n\twrites?: Map<string, StoredRef>;\n\tdeleteKey?: string;\n\tdeletes?: Set<string>;\n\treadded?: Set<string>;\n\tarray?: ArrayOverlay;\n\tdirty?: boolean;\n\tsubtreeDirty?: boolean;\n\tpreparedPath?: Path;\n};\n\ntype OverlayContext = {\n\towner: object;\n\ttracker: WeakRef<TrackerImpl<object>>;\n\tbaseRevision: number;\n\tstatus: StatusCell;\n\troot: OverlayNode | undefined;\n\tbases: Container[] | undefined;\n\tstored: Container[] | undefined;\n\tdirty: OverlayNode[];\n\tnodes: OverlayNode[];\n\trawNodes: WeakMap<object, OverlayNode> | undefined;\n\tops: Op[] | undefined;\n\treplacement: boolean;\n\treplacementNoop: boolean;\n\tbaseValue: object | undefined;\n\toverlayReleased: boolean;\n\tsimpleObjectMaterialization: boolean;\n\tregistryRef: WeakRef<OverlayContext> | undefined;\n};\n\nconst NODE = Symbol(\"chord.delta.overlay.node\");\nconst PREPARED = new WeakMap<object, OverlayContext>();\nconst RELEASED: Record<string, JsonValue> = {};\nconst ARRAY_MUTATORS = new Set<PropertyKey>([\n\t\"push\",\n\t\"pop\",\n\t\"shift\",\n\t\"unshift\",\n\t\"splice\",\n\t\"reverse\",\n\t\"sort\",\n\t\"fill\",\n\t\"copyWithin\",\n]);\nconst MAX_DELTA_OPERATIONS = 4_096;\nconst MAX_SIMPLE_OBJECT_NODES = 128;\nconst DATA_DESCRIPTOR: PropertyDescriptor = {\n\tvalue: undefined,\n\twritable: true,\n\tenumerable: true,\n\tconfigurable: true,\n};\n\nexport interface Prepared<T extends object> {\n\treadonly base: T;\n\treadonly value: T;\n\treadonly ops: readonly Op[];\n\treadonly baseRevision: number;\n\tabort(): void;\n}\n\nexport interface Change<T extends object> {\n\treadonly state: Draft<T>;\n\tprepare(): Prepared<T>;\n\tabort(): void;\n}\n\nexport interface Tracker<T extends object> {\n\treadonly value: T;\n\treadonly revision: number;\n\tbeginChange(): Change<T>;\n\tprepareReplace(value: T): Prepared<T>;\n\tadopt(prepared: Prepared<T>): void;\n}\n\nclass PreparedImpl<T extends object> implements Prepared<T> {\n\treadonly #context: OverlayContext;\n\treadonly value: T;\n\treadonly base: T;\n\treadonly ops: readonly Op[];\n\n\tconstructor(context: OverlayContext, value: T, operations: readonly Op[]) {\n\t\tthis.#context = context;\n\t\tthis.value = value;\n\t\tthis.base = context.baseValue as T;\n\t\tthis.ops = operations;\n\t\tPREPARED.set(this, context);\n\t}\n\n\tget baseRevision(): number {\n\t\treturn this.#context.baseRevision;\n\t}\n\n\tabort(): void {\n\t\tabortContext(this.#context);\n\t}\n}\n\nclass ChangeImpl<T extends object> implements Change<T> {\n\t#context: OverlayContext | undefined;\n\t#preparedStatus: StatusCell | undefined;\n\t#settled = false;\n\n\tconstructor(context: OverlayContext) {\n\t\tthis.#context = context;\n\t}\n\n\tget state(): Draft<T> {\n\t\tconst state = this.#context?.root?.proxy;\n\t\tif (state === undefined) throw new TypeError(\"Cannot use a settled overlay\");\n\t\treturn state as Draft<T>;\n\t}\n\n\tprepare(): Prepared<T> {\n\t\tif (this.#settled) throw new Error(\"Change has already been settled\");\n\t\tconst context = this.#context!;\n\t\tassertWritable(context);\n\t\tcontext.status.value = \"prepared\";\n\t\ttry {\n\t\t\tif (!context.replacement) context.ops = context.dirty.length === 0 ? [] : emitOperations(context);\n\t\t\tconst prepared = materializePrepared<T>(context);\n\t\t\tthis.#preparedStatus = context.status;\n\t\t\tthis.#settled = true;\n\t\t\treturn prepared;\n\t\t} catch (error) {\n\t\t\tcontext.status.value = \"aborted\";\n\t\t\tclearContext(context);\n\t\t\tthis.#settled = true;\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tthis.#context = undefined;\n\t\t}\n\t}\n\n\tabort(): void {\n\t\tif (this.#settled) {\n\t\t\tif (this.#preparedStatus?.value === \"prepared\") this.#preparedStatus.value = \"aborted\";\n\t\t\tthis.#preparedStatus = undefined;\n\t\t\treturn;\n\t\t}\n\t\tthis.#settled = true;\n\t\tabortContext(this.#context!);\n\t\tthis.#context = undefined;\n\t}\n}\n\nclass TrackerImpl<T extends object> implements Tracker<T> {\n\treadonly #owner = {};\n\treadonly #contexts = new Set<WeakRef<OverlayContext>>();\n\treadonly #selfRef: WeakRef<TrackerImpl<object>>;\n\t#value: T;\n\t#revision = 0;\n\t#pruneBudget = 256;\n\n\tconstructor(initial: T) {\n\t\tthis.#value = initial;\n\t\tthis.#selfRef = new WeakRef(this as unknown as TrackerImpl<object>);\n\t}\n\n\tget value(): T {\n\t\treturn this.#value;\n\t}\n\n\tget revision(): number {\n\t\treturn this.#revision;\n\t}\n\n\tbeginChange(): Change<T> {\n\t\tconst context = createContext(this.#selfRef, this.#owner, this.#revision, this.#value, false, this.#value);\n\t\tthis.#register(context);\n\t\treturn new ChangeImpl(context);\n\t}\n\n\tprepareReplace(value: T): Prepared<T> {\n\t\tconst context = createContext(this.#selfRef, this.#owner, this.#revision, value, true, this.#value);\n\t\tcontext.status.value = \"prepared\";\n\t\tthis.#register(context);\n\t\ttry {\n\t\t\treturn materializePrepared<T>(context);\n\t\t} catch (error) {\n\t\t\tcontext.status.value = \"aborted\";\n\t\t\tclearContext(context);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tadopt(prepared: Prepared<T>): void {\n\t\tconst context = PREPARED.get(prepared as object);\n\t\tif (context?.owner !== this.#owner) throw new Error(\"Prepared change belongs to a different tracker\");\n\t\tif (context.status.value === \"consumed\") throw new Error(\"Prepared change has already been used\");\n\t\tif (context.status.value === \"aborted\") throw new Error(\"Prepared change has been aborted\");\n\t\tif (context.status.value === \"stale\") throw new Error(\"Prepared change is stale\");\n\t\tif (context.status.value !== \"prepared\") throw new Error(\"Prepared change is not ready\");\n\t\tif (context.baseRevision !== this.#revision) {\n\t\t\tcontext.status.value = \"stale\";\n\t\t\tclearContext(context);\n\t\t\tthrow new Error(\"Prepared change is stale\");\n\t\t}\n\n\t\tif (this.#value !== prepared.base) {\n\t\t\tcontext.status.value = \"stale\";\n\t\t\tthrow new Error(\"Prepared change is stale\");\n\t\t}\n\t\t// Materialization happened during prepare. Adoption is an infallible pointer\n\t\t// swap so storage failure can discard the candidate without touching authority.\n\t\tthis.#value = prepared.value;\n\t\tcontext.status.value = \"consumed\";\n\t\tthis.#revision += 1;\n\t\tthis.#invalidate(context);\n\t}\n\n\treleaseContext(context: OverlayContext): void {\n\t\tif (context.registryRef !== undefined) this.#contexts.delete(context.registryRef);\n\t\tcontext.registryRef = undefined;\n\t}\n\n\t#register(context: OverlayContext): void {\n\t\tconst reference = new WeakRef(context);\n\t\tcontext.registryRef = reference;\n\t\tthis.#contexts.add(reference);\n\t\tthis.#pruneBudget -= 1;\n\t\tif (this.#pruneBudget === 0) {\n\t\t\tthis.#prune();\n\t\t\tthis.#pruneBudget = Math.max(256, this.#contexts.size);\n\t\t}\n\t}\n\n\t#prune(): void {\n\t\tfor (const reference of this.#contexts) {\n\t\t\tif (reference.deref() === undefined) this.#contexts.delete(reference);\n\t\t}\n\t}\n\n\t#invalidate(winner: OverlayContext): void {\n\t\tfor (const reference of this.#contexts) {\n\t\t\tconst context = reference.deref();\n\t\t\tif (context === undefined || context === winner) continue;\n\t\t\tif (context.status.value === \"open\" || context.status.value === \"prepared\") context.status.value = \"stale\";\n\t\t\t// Adoption must not walk every node touched by a competing draft. Drop the\n\t\t\t// context's strong overlay references in O(1); externally retained proxies\n\t\t\t// still see the stale status and are reclaimed with their holders.\n\t\t\treleaseOverlayReferences(context);\n\t\t}\n\t\tthis.#contexts.clear();\n\t\tthis.#pruneBudget = 256;\n\t}\n\n\treplacementBase(context: OverlayContext): T | undefined {\n\t\treturn context.baseRevision === this.#revision ? this.#value : undefined;\n\t}\n}\n\n/** Take immutable ownership of an alias-free strict-JSON root in O(1). */\nexport function track<T extends object>(initial: T): Tracker<T> {\n\treturn new TrackerImpl(initial);\n}\n\nfunction materializePrepared<T extends object>(context: OverlayContext): PreparedImpl<T> {\n\tconst operations = ensureOperations(context);\n\tconst base = context.baseValue as T;\n\t// Operation payloads are already detached from the mutable overlay. The\n\t// resulting revision and public batch intentionally share those payloads under\n\t// the trusted immutable-transfer contract.\n\tconst value =\n\t\toperations.length === 0\n\t\t\t? base\n\t\t\t: context.simpleObjectMaterialization\n\t\t\t\t? (cloneNode(context.root!) as T)\n\t\t\t\t: materializeOperations(base, operations);\n\tconst prepared = new PreparedImpl(context, value, operations);\n\tif (context.nodes.length > 4_096) releaseOverlayReferences(context);\n\telse clearContext(context);\n\treturn prepared;\n}\n\nfunction materializeOperations<T extends object>(base: T, operations: readonly Op[]): T {\n\tfor (const operation of operations) {\n\t\t// Native splice/permutation remains faster for large structural batches.\n\t\tif (operation[0] === \"p\" || operation[0] === \"m\") return applyImmutable(base, operations);\n\t}\n\treturn applyImmutableTrusted(base, operations);\n}\n\nfunction createContext<T extends object>(\n\ttracker: WeakRef<TrackerImpl<object>>,\n\towner: object,\n\tbaseRevision: number,\n\troot: T,\n\treplacement: boolean,\n\tbase: T,\n): OverlayContext {\n\tconst context: OverlayContext = {\n\t\towner,\n\t\ttracker,\n\t\tbaseRevision,\n\t\tstatus: { value: \"open\" },\n\t\troot: undefined,\n\t\tbases: [],\n\t\tstored: [],\n\t\tdirty: [],\n\t\tnodes: [],\n\t\trawNodes: new WeakMap(),\n\t\tops: undefined,\n\t\treplacement,\n\t\treplacementNoop: false,\n\t\tbaseValue: base,\n\t\toverlayReleased: false,\n\t\tsimpleObjectMaterialization: false,\n\t\tregistryRef: undefined,\n\t};\n\tcontext.root = createNode(context, root as Container, undefined);\n\treturn context;\n}\n\nconst sharedObjectHandler: ProxyHandler<object> = {\n\tdeleteProperty(target, property) {\n\t\treturn deleteProperty(nodeForTarget(target), property);\n\t},\n\tdefineProperty(target) {\n\t\tassertWritable(nodeForTarget(target).context);\n\t\tthrow new TypeError(\"Defining overlay properties is not supported\");\n\t},\n\tget(target, property) {\n\t\tif (property === \"then\") {\n\t\t\tconst node = (target as Record<PropertyKey, unknown>)[NODE] as OverlayNode | undefined;\n\t\t\tif (node === undefined || isSettledContext(node.context)) return undefined;\n\t\t}\n\t\tconst node = nodeForTarget(target);\n\t\tif (property === NODE) return node;\n\t\treturn getProperty(node, property);\n\t},\n\tgetOwnPropertyDescriptor(target, property) {\n\t\treturn getDescriptor(nodeForTarget(target), property);\n\t},\n\tgetPrototypeOf(target) {\n\t\tconst node = nodeForTarget(target);\n\t\tassertReadable(node.context);\n\t\treturn Object.getPrototypeOf(nodeBase(node));\n\t},\n\thas(target, property) {\n\t\treturn hasProperty(nodeForTarget(target), property);\n\t},\n\tisExtensible(target) {\n\t\tassertReadable(nodeForTarget(target).context);\n\t\treturn true;\n\t},\n\townKeys(target) {\n\t\treturn ownKeys(nodeForTarget(target));\n\t},\n\tpreventExtensions(target) {\n\t\tassertWritable(nodeForTarget(target).context);\n\t\tthrow new TypeError(\"Overlays cannot be made non-extensible\");\n\t},\n\tset(target, property, value) {\n\t\treturn setProperty(nodeForTarget(target), property, value);\n\t},\n\tsetPrototypeOf(target) {\n\t\tassertWritable(nodeForTarget(target).context);\n\t\tthrow new TypeError(\"Changing an overlay prototype is not supported\");\n\t},\n};\n\nconst sharedArrayHandler: ProxyHandler<object> = sharedObjectHandler;\n\nfunction createNode(\n\tcontext: OverlayContext,\n\tbase: Container,\n\tparent: OverlayNode | undefined,\n\tparentKind: ParentKind = 0,\n\tparentKey: string | number = \"\",\n\tparentSource: InsertSource | undefined = undefined,\n\tparentPlacement = false,\n): OverlayNode {\n\tconst existing = context.rawNodes!.get(base);\n\tif (existing !== undefined) return existing;\n\tconst target: object = Array.isArray(base) ? [] : {};\n\tconst baseIndex = context.bases!.length;\n\tconst parentIndex = parent?.baseIndex ?? -1;\n\tcontext.bases!.push(base);\n\tconst node: OverlayNode = {\n\t\tcontext,\n\t\tbaseIndex,\n\t\tparentIndex,\n\t\tparentKind,\n\t\tparentKey,\n\t\tparentPlacement,\n\t\ttarget,\n\t\tproxy: target,\n\t};\n\tif (parentSource !== undefined) node.parentSource = parentSource;\n\t(target as Record<PropertyKey, unknown>)[NODE] = node;\n\tnode.proxy = new Proxy(target, Array.isArray(base) ? sharedArrayHandler : sharedObjectHandler);\n\tcontext.rawNodes!.set(base, node);\n\tcontext.nodes.push(node);\n\treturn node;\n}\n\nfunction nodeBase(node: OverlayNode): Container {\n\treturn node.context.bases![node.baseIndex]!;\n}\n\nfunction nodeParent(node: OverlayNode): OverlayNode | undefined {\n\treturn node.parentIndex < 0 ? undefined : node.context.nodes[node.parentIndex];\n}\n\nfunction storeValue(context: OverlayContext, value: Stored): StoredRef {\n\tif (!isContainer(value)) return value;\n\tconst index = context.stored!.length;\n\tcontext.stored!.push(value);\n\treturn { index };\n}\n\nfunction storedValue(context: OverlayContext, reference: StoredRef): Stored {\n\treturn typeof reference === \"object\" && reference !== null ? context.stored![reference.index]! : reference;\n}\n\nfunction replaceStoredValue(context: OverlayContext, reference: StoredRef, value: Stored): StoredRef {\n\tif (isContainer(value)) {\n\t\tif (typeof reference === \"object\" && reference !== null) {\n\t\t\tcontext.stored![reference.index] = value;\n\t\t\treturn reference;\n\t\t}\n\t\treturn storeValue(context, value);\n\t}\n\tif (typeof reference === \"object\" && reference !== null) context.stored![reference.index] = RELEASED;\n\treturn value;\n}\n\nfunction releaseStoredValue(context: OverlayContext, reference: StoredRef): void {\n\tif (typeof reference === \"object\" && reference !== null) context.stored![reference.index] = RELEASED;\n}\n\nfunction nodeForTarget(target: object): OverlayNode {\n\tconst node = (target as Record<PropertyKey, unknown>)[NODE] as OverlayNode | undefined;\n\tif (node === undefined) throw new TypeError(\"Cannot use a settled overlay\");\n\treturn node;\n}\n\nfunction isSettledContext(context: OverlayContext): boolean {\n\treturn (\n\t\tcontext.overlayReleased ||\n\t\tcontext.status.value === \"consumed\" ||\n\t\tcontext.status.value === \"aborted\" ||\n\t\tcontext.status.value === \"stale\"\n\t);\n}\n\nfunction assertReadable(context: OverlayContext): void {\n\tif (isSettledContext(context)) throw new TypeError(\"Cannot use a settled overlay\");\n}\n\nfunction assertWritable(context: OverlayContext): void {\n\tassertReadable(context);\n\tif (context.status.value !== \"open\") throw new TypeError(\"Prepared overlays are read-only\");\n}\n\nfunction getProperty(node: OverlayNode, property: PropertyKey): unknown {\n\tassertReadable(node.context);\n\tif (Array.isArray(nodeBase(node))) {\n\t\tconst overlay = arrayOverlay(node);\n\t\tif (property === \"length\") return arrayLength(overlay);\n\t\tif (ARRAY_MUTATORS.has(property)) return arrayMutators[property as keyof typeof arrayMutators];\n\t\tconst index = arrayIndex(property);\n\t\tif (index !== undefined) return getArrayIndex(node, index);\n\t\treturn Reflect.get(Array.prototype, property, node.proxy);\n\t}\n\tif (typeof property === \"symbol\") return Reflect.get(nodeBase(node), property, node.proxy);\n\tconst key = String(property);\n\tif (!objectHas(node, key)) {\n\t\tif (isObjectDeleted(node, key) || Object.hasOwn(nodeBase(node), key)) return undefined;\n\t\treturn Reflect.get(nodeBase(node), property, node.proxy);\n\t}\n\tconst value = objectValue(node, key);\n\tif (!isContainer(value)) return value;\n\treturn createNode(node.context, value, node, 0, key, undefined, hasObjectWrite(node, key)).proxy;\n}\n\nfunction getArrayIndex(node: OverlayNode, index: number): unknown {\n\tconst overlay = arrayOverlay(node);\n\tif (index >= arrayLength(overlay)) return undefined;\n\tconst piece = locatePiece(overlay, index);\n\tconst sourceIndex = piece.start + piece.step * overlay.locatedOffset;\n\tconst value = entryValueAt(node, piece, sourceIndex);\n\tif (!isContainer(value)) return value;\n\treturn createNode(\n\t\tnode.context,\n\t\tvalue,\n\t\tnode,\n\t\tpiece.kind === \"base\" ? 1 : 2,\n\t\tsourceIndex,\n\t\tpiece.kind === \"insert\" ? piece.source : undefined,\n\t\tpiece.kind === \"insert\" || hasEntryOverrideAt(overlay, piece, sourceIndex),\n\t).proxy;\n}\n\nfunction setProperty(node: OverlayNode, property: PropertyKey, supplied: unknown): boolean {\n\tassertWritable(node.context);\n\tif (typeof property === \"symbol\") throw new TypeError(\"Symbol writes are not supported\");\n\tif (Array.isArray(nodeBase(node))) {\n\t\tif (property === \"length\") {\n\t\t\tsetArrayLength(node, toArrayLength(supplied));\n\t\t\treturn true;\n\t\t}\n\t\tconst index = arrayIndex(property);\n\t\tif (index === undefined) throw new TypeError(\"Only array indices and length can be written\");\n\t\tif (index > arrayLength(arrayOverlay(node))) throw new TypeError(\"Overlay arrays cannot contain holes\");\n\t\tsetArrayIndex(node, index, clonePlacement(supplied));\n\t\treturn true;\n\t}\n\tconst key = String(property);\n\tif (supplied === undefined) return deleteProperty(node, key);\n\tconst stored = clonePlacement(supplied);\n\tconst current = objectValue(node, key);\n\tconst wasDeleted = isObjectDeleted(node, key);\n\tif (!wasDeleted && !isContainer(stored) && current === stored) return true;\n\tsetObjectWrite(node, key, stored);\n\tif (wasDeleted && Object.hasOwn(nodeBase(node), key)) {\n\t\tif (node.readded === undefined) node.readded = new Set();\n\t\tnode.readded.add(key);\n\t}\n\tdeleteObjectDeletion(node, key);\n\tmarkDirty(node);\n\treturn true;\n}\n\nfunction deleteProperty(node: OverlayNode, property: PropertyKey): boolean {\n\tassertWritable(node.context);\n\tif (typeof property === \"symbol\") throw new TypeError(\"Symbol writes are not supported\");\n\tif (Array.isArray(nodeBase(node))) throw new TypeError(\"Overlay arrays cannot contain holes\");\n\tconst key = String(property);\n\tif (!objectHas(node, key)) return true;\n\tdeleteObjectWrite(node, key);\n\tnode.readded?.delete(key);\n\tsetObjectDeletion(node, key);\n\tmarkDirty(node);\n\treturn true;\n}\n\nfunction hasProperty(node: OverlayNode, property: PropertyKey): boolean {\n\tassertReadable(node.context);\n\tif (Array.isArray(nodeBase(node))) {\n\t\tif (property === \"length\") return true;\n\t\tconst index = arrayIndex(property);\n\t\tif (index !== undefined) return index < arrayLength(arrayOverlay(node));\n\t\treturn property in Array.prototype;\n\t}\n\treturn typeof property === \"symbol\" ? property in nodeBase(node) : objectHas(node, String(property));\n}\n\nfunction ownKeys(node: OverlayNode): ArrayLike<string | symbol> {\n\tassertReadable(node.context);\n\tif (Array.isArray(nodeBase(node))) {\n\t\tconst length = arrayLength(arrayOverlay(node));\n\t\tconst keys = new Array<string>(length + 1);\n\t\tfor (let index = 0; index < length; index++) keys[index] = String(index);\n\t\tkeys[length] = \"length\";\n\t\treturn keys;\n\t}\n\tlet existingKeysOnly =\n\t\tnode.deleteKey === undefined &&\n\t\tnode.deletes === undefined &&\n\t\tnode.readded === undefined &&\n\t\t(node.writeKey === undefined || Object.hasOwn(nodeBase(node), node.writeKey));\n\tif (existingKeysOnly && node.writes !== undefined) {\n\t\tfor (const key of node.writes.keys()) {\n\t\t\tif (!Object.hasOwn(nodeBase(node), key)) {\n\t\t\t\texistingKeysOnly = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (existingKeysOnly) return Object.keys(nodeBase(node));\n\tconst keys = Object.keys(nodeBase(node)).filter((key) => !isObjectDeleted(node, key) && !node.readded?.has(key));\n\tconst seen = new Set(keys);\n\tif (node.writeKey !== undefined && !seen.has(node.writeKey)) {\n\t\tkeys.push(node.writeKey);\n\t\tseen.add(node.writeKey);\n\t}\n\tif (node.writes !== undefined) {\n\t\tfor (const key of node.writes.keys()) {\n\t\t\tif (seen.has(key)) continue;\n\t\t\tkeys.push(key);\n\t\t\tseen.add(key);\n\t\t}\n\t}\n\tconst indices: number[] = [];\n\tconst strings: string[] = [];\n\tfor (const key of keys) {\n\t\tconst index = arrayIndex(key);\n\t\tif (index === undefined) strings.push(key);\n\t\telse indices.push(index);\n\t}\n\tindices.sort((left, right) => left - right);\n\treturn [...indices.map(String), ...strings];\n}\n\nfunction getDescriptor(node: OverlayNode, property: PropertyKey): PropertyDescriptor | undefined {\n\tassertReadable(node.context);\n\tif (Array.isArray(nodeBase(node))) {\n\t\tif (property === \"length\") {\n\t\t\tconst length = arrayLength(arrayOverlay(node));\n\t\t\t(node.target as unknown[]).length = length;\n\t\t\treturn Reflect.getOwnPropertyDescriptor(node.target, \"length\");\n\t\t}\n\t\tconst index = arrayIndex(property);\n\t\tif (index === undefined || index >= arrayLength(arrayOverlay(node))) return undefined;\n\t} else {\n\t\tif (typeof property === \"symbol\" || !objectHas(node, String(property))) return undefined;\n\t}\n\treturn {\n\t\tconfigurable: true,\n\t\tenumerable: true,\n\t\twritable: node.context.status.value === \"open\",\n\t\tvalue: getProperty(node, property),\n\t};\n}\n\nfunction hasObjectWrite(node: OverlayNode, key: string): boolean {\n\treturn node.writeKey === key || (node.writes?.has(key) ?? false);\n}\n\nfunction setObjectWrite(node: OverlayNode, key: string, value: Stored): void {\n\tif (node.writes !== undefined) {\n\t\tconst reference = node.writes.get(key);\n\t\tnode.writes.set(\n\t\t\tkey,\n\t\t\treference === undefined ? storeValue(node.context, value) : replaceStoredValue(node.context, reference, value),\n\t\t);\n\t\treturn;\n\t}\n\tif (node.writeKey === undefined || node.writeKey === key) {\n\t\tnode.writeKey = key;\n\t\tnode.writeValue =\n\t\t\tnode.writeValue === undefined\n\t\t\t\t? storeValue(node.context, value)\n\t\t\t\t: replaceStoredValue(node.context, node.writeValue, value);\n\t\treturn;\n\t}\n\tnode.writes = new Map();\n\tnode.writes.set(node.writeKey, node.writeValue!);\n\tnode.writes.set(key, storeValue(node.context, value));\n\tnode.writeKey = undefined;\n\tnode.writeValue = undefined;\n}\n\nfunction deleteObjectWrite(node: OverlayNode, key: string): void {\n\tif (node.writeKey === key) {\n\t\tnode.writeKey = undefined;\n\t\treleaseStoredValue(node.context, node.writeValue!);\n\t\tnode.writeValue = undefined;\n\t} else {\n\t\tconst reference = node.writes?.get(key);\n\t\tif (reference !== undefined) releaseStoredValue(node.context, reference);\n\t\tnode.writes?.delete(key);\n\t}\n}\n\nfunction isObjectDeleted(node: OverlayNode, key: string): boolean {\n\treturn node.deleteKey === key || (node.deletes?.has(key) ?? false);\n}\n\nfunction setObjectDeletion(node: OverlayNode, key: string): void {\n\tif (node.deletes !== undefined) {\n\t\tnode.deletes.add(key);\n\t\treturn;\n\t}\n\tif (node.deleteKey === undefined || node.deleteKey === key) {\n\t\tnode.deleteKey = key;\n\t\treturn;\n\t}\n\tnode.deletes = new Set();\n\tnode.deletes.add(node.deleteKey);\n\tnode.deletes.add(key);\n\tnode.deleteKey = undefined;\n}\n\nfunction deleteObjectDeletion(node: OverlayNode, key: string): void {\n\tif (node.deleteKey === key) node.deleteKey = undefined;\n\telse node.deletes?.delete(key);\n}\n\nfunction objectHas(node: OverlayNode, key: string): boolean {\n\tif (isObjectDeleted(node, key)) return false;\n\treturn hasObjectWrite(node, key) || Object.hasOwn(nodeBase(node), key);\n}\n\nfunction objectValue(node: OverlayNode, key: string): Stored {\n\tif (node.writeKey === key) return storedValue(node.context, node.writeValue!);\n\tconst reference = node.writes?.get(key);\n\tif (reference !== undefined) return storedValue(node.context, reference);\n\treturn (nodeBase(node) as Record<string, JsonValue>)[key]!;\n}\n\nfunction markDirty(node: OverlayNode): void {\n\tif (node.dirty) return;\n\tnode.dirty = true;\n\tnode.context.dirty.push(node);\n\tfor (let parent = nodeParent(node); parent !== undefined; parent = nodeParent(parent)) parent.subtreeDirty = true;\n}\n\nfunction arrayOverlay(node: OverlayNode): ArrayOverlay {\n\tif (node.array !== undefined) return node.array;\n\tconst base = nodeBase(node) as JsonValue[];\n\tconst overlay: ArrayOverlay = {\n\t\troot: undefined,\n\t\tpieces: undefined,\n\t\tbaseOverrides: undefined,\n\t\tinsertOverrides: undefined,\n\t\tstructural: false,\n\t\tgeneration: 0,\n\t\tplan: undefined,\n\t\tseed: 0x9e3779b9,\n\t\tlocatedOffset: 0,\n\t\tbaseLocations: undefined,\n\t\tinsertLocations: undefined,\n\t};\n\tif (base.length > 0)\n\t\toverlay.root = createPieceNode(overlay, { kind: \"base\", start: 0, length: base.length, step: 1 });\n\tnode.array = overlay;\n\treturn overlay;\n}\n\nfunction baseOverridesForWrite(overlay: ArrayOverlay): Map<number, StoredRef> {\n\tif (overlay.baseOverrides === undefined) overlay.baseOverrides = new Map();\n\treturn overlay.baseOverrides;\n}\n\nfunction insertOverridesForWrite(overlay: ArrayOverlay): Map<InsertSource, Map<number, StoredRef>> {\n\tif (overlay.insertOverrides === undefined) overlay.insertOverrides = new Map();\n\treturn overlay.insertOverrides;\n}\n\nfunction nextPiecePriority(overlay: ArrayOverlay): number {\n\tlet value = overlay.seed;\n\tvalue ^= value << 13;\n\tvalue ^= value >>> 17;\n\tvalue ^= value << 5;\n\toverlay.seed = value >>> 0;\n\treturn overlay.seed;\n}\n\nfunction treeElements(node: PieceNode | undefined): number {\n\treturn node?.elements ?? 0;\n}\n\nfunction updatePieceNode(node: PieceNode): void {\n\tnode.elements = treeElements(node.left) + node.piece.length + treeElements(node.right);\n}\n\nfunction createPieceNode(overlay: ArrayOverlay, piece: Piece): PieceNode {\n\treturn { piece, left: undefined, right: undefined, priority: nextPiecePriority(overlay), elements: piece.length };\n}\n\nfunction mergePieceTrees(left: PieceNode | undefined, right: PieceNode | undefined): PieceNode | undefined {\n\tif (left === undefined) return right;\n\tif (right === undefined) return left;\n\tif (left.priority >= right.priority) {\n\t\tleft.right = mergePieceTrees(left.right, right);\n\t\tupdatePieceNode(left);\n\t\treturn left;\n\t}\n\tright.left = mergePieceTrees(left, right.left);\n\tupdatePieceNode(right);\n\treturn right;\n}\n\nfunction splitPieceTree(\n\toverlay: ArrayOverlay,\n\troot: PieceNode | undefined,\n\tindex: number,\n): [PieceNode | undefined, PieceNode | undefined] {\n\tif (root === undefined) return [undefined, undefined];\n\tconst leftLength = treeElements(root.left);\n\tif (index < leftLength) {\n\t\tconst [left, right] = splitPieceTree(overlay, root.left, index);\n\t\troot.left = right;\n\t\tupdatePieceNode(root);\n\t\treturn [left, root];\n\t}\n\tconst pieceEnd = leftLength + root.piece.length;\n\tif (index > pieceEnd) {\n\t\tconst [left, right] = splitPieceTree(overlay, root.right, index - pieceEnd);\n\t\troot.right = left;\n\t\tupdatePieceNode(root);\n\t\treturn [root, right];\n\t}\n\tif (index === leftLength) {\n\t\tconst left = root.left;\n\t\troot.left = undefined;\n\t\tupdatePieceNode(root);\n\t\treturn [left, root];\n\t}\n\tif (index === pieceEnd) {\n\t\tconst right = root.right;\n\t\troot.right = undefined;\n\t\tupdatePieceNode(root);\n\t\treturn [root, right];\n\t}\n\tconst offset = index - leftLength;\n\tconst first = { ...root.piece, length: offset };\n\tconst second = {\n\t\t...root.piece,\n\t\tstart: root.piece.start + root.piece.step * offset,\n\t\tlength: root.piece.length - offset,\n\t};\n\treturn [\n\t\tmergePieceTrees(root.left, createPieceNode(overlay, first)),\n\t\tmergePieceTrees(createPieceNode(overlay, second), root.right),\n\t];\n}\n\nfunction leftmostPieceNode(node: PieceNode): PieceNode {\n\twhile (node.left !== undefined) node = node.left;\n\treturn node;\n}\n\nfunction rightmostPieceNode(node: PieceNode): PieceNode {\n\twhile (node.right !== undefined) node = node.right;\n\treturn node;\n}\n\nfunction mergeablePieces(left: Piece, right: Piece): boolean {\n\tif (left.kind !== right.kind) return false;\n\tif (left.kind === \"insert\" && left.source !== (right as InsertPiece).source) return false;\n\tif (left.length === 1 && right.length === 1) return Math.abs(right.start - left.start) === 1;\n\treturn left.step === right.step && left.start + left.step * left.length === right.start;\n}\n\nfunction joinNormalized(\n\toverlay: ArrayOverlay,\n\tleft: PieceNode | undefined,\n\tright: PieceNode | undefined,\n): PieceNode | undefined {\n\tif (left === undefined) return right;\n\tif (right === undefined) return left;\n\tconst leftPiece = rightmostPieceNode(left).piece;\n\tconst rightPiece = leftmostPieceNode(right).piece;\n\tif (!mergeablePieces(leftPiece, rightPiece)) return mergePieceTrees(left, right);\n\tconst [leftRest] = splitPieceTree(overlay, left, treeElements(left) - leftPiece.length);\n\tconst [, rightRest] = splitPieceTree(overlay, right, rightPiece.length);\n\tconst step = leftPiece.length === 1 ? ((rightPiece.start - leftPiece.start) as 1 | -1) : leftPiece.step;\n\tconst combined: Piece =\n\t\tleftPiece.kind === \"base\"\n\t\t\t? { kind: \"base\", start: leftPiece.start, length: leftPiece.length + rightPiece.length, step }\n\t\t\t: {\n\t\t\t\t\tkind: \"insert\",\n\t\t\t\t\tsource: leftPiece.source,\n\t\t\t\t\tstart: leftPiece.start,\n\t\t\t\t\tlength: leftPiece.length + rightPiece.length,\n\t\t\t\t\tstep,\n\t\t\t\t};\n\treturn joinNormalized(overlay, joinNormalized(overlay, leftRest, createPieceNode(overlay, combined)), rightRest);\n}\n\nfunction flattenPieceTree(node: PieceNode | undefined, output: Piece[]): void {\n\tif (node === undefined) return;\n\tflattenPieceTree(node.left, output);\n\toutput.push(node.piece);\n\tflattenPieceTree(node.right, output);\n}\n\nfunction piecesOf(overlay: ArrayOverlay): readonly Piece[] {\n\tif (overlay.pieces === undefined) {\n\t\toverlay.pieces = [];\n\t\tflattenPieceTree(overlay.root, overlay.pieces);\n\t}\n\treturn overlay.pieces;\n}\n\nfunction treeFromPieces(overlay: ArrayOverlay, pieces: Piece[]): PieceNode | undefined {\n\tmergePieces(pieces);\n\tlet root: PieceNode | undefined;\n\tfor (const piece of pieces) root = mergePieceTrees(root, createPieceNode(overlay, piece));\n\treturn root;\n}\n\nfunction replaceAllPieces(overlay: ArrayOverlay, pieces: Piece[]): void {\n\toverlay.root = treeFromPieces(overlay, pieces);\n\toverlay.pieces = undefined;\n\toverlay.baseLocations = undefined;\n\toverlay.insertLocations = undefined;\n}\n\nfunction arrayLength(overlay: ArrayOverlay): number {\n\treturn treeElements(overlay.root);\n}\n\nfunction locatePiece(overlay: ArrayOverlay, index: number): Piece {\n\tlet node = overlay.root;\n\twhile (node !== undefined) {\n\t\tconst leftLength = treeElements(node.left);\n\t\tif (index < leftLength) node = node.left;\n\t\telse if (index >= leftLength + node.piece.length) {\n\t\t\tindex -= leftLength + node.piece.length;\n\t\t\tnode = node.right;\n\t\t} else {\n\t\t\toverlay.locatedOffset = index - leftLength;\n\t\t\treturn node.piece;\n\t\t}\n\t}\n\tthrow new RangeError(\"Array overlay index is out of range\");\n}\n\nfunction arrayIndex(property: PropertyKey): number | undefined {\n\tif (typeof property !== \"string\" || property.length === 0 || property.length > 10) return undefined;\n\tif (property === \"0\") return 0;\n\tconst first = property.charCodeAt(0);\n\tif (first < 49 || first > 57) return undefined;\n\tlet index = first - 48;\n\tfor (let offset = 1; offset < property.length; offset++) {\n\t\tconst digit = property.charCodeAt(offset) - 48;\n\t\tif (digit < 0 || digit > 9) return undefined;\n\t\tindex = index * 10 + digit;\n\t\tif (index >= 4_294_967_295) return undefined;\n\t}\n\treturn index;\n}\n\nfunction entryValueAt(node: OverlayNode, piece: Piece, sourceIndex: number): Stored {\n\tconst overlay = arrayOverlay(node);\n\tif (piece.kind === \"base\") {\n\t\tconst valueIndex = overlay.baseOverrides?.get(sourceIndex);\n\t\treturn valueIndex === undefined\n\t\t\t? (nodeBase(node) as JsonValue[])[sourceIndex]!\n\t\t\t: storedValue(node.context, valueIndex);\n\t}\n\tconst overrides = overlay.insertOverrides?.get(piece.source);\n\tconst reference = overrides?.has(sourceIndex) ? overrides.get(sourceIndex)! : piece.source.refs[sourceIndex]!;\n\treturn storedValue(node.context, reference);\n}\n\nfunction hasEntryOverrideAt(overlay: ArrayOverlay, piece: Piece, sourceIndex: number): boolean {\n\treturn piece.kind === \"base\"\n\t\t? (overlay.baseOverrides?.has(sourceIndex) ?? false)\n\t\t: (overlay.insertOverrides?.get(piece.source)?.has(sourceIndex) ?? false);\n}\n\nfunction extendRightmostPiece(node: PieceNode, amount: number): void {\n\tif (node.right !== undefined) extendRightmostPiece(node.right, amount);\n\telse node.piece.length += amount;\n\tupdatePieceNode(node);\n}\n\nfunction invalidatePieceCaches(overlay: ArrayOverlay): void {\n\toverlay.pieces = undefined;\n\toverlay.baseLocations = undefined;\n\toverlay.insertLocations = undefined;\n\toverlay.plan = undefined;\n}\n\nfunction replacePieceRange(node: OverlayNode, index: number, remove: number, inserted: Piece[]): void {\n\tif (remove === 0 && inserted.length === 0) return;\n\tconst overlay = arrayOverlay(node);\n\tif (remove === 0 && index === arrayLength(overlay) && inserted.length === 1 && overlay.root !== undefined) {\n\t\tconst addition = inserted[0]!;\n\t\tconst tail = rightmostPieceNode(overlay.root).piece;\n\t\tif (\n\t\t\taddition.kind === \"insert\" &&\n\t\t\ttail.kind === \"insert\" &&\n\t\t\ttail.step === 1 &&\n\t\t\ttail.start + tail.length === tail.source.refs.length\n\t\t) {\n\t\t\tfor (let offset = 0; offset < addition.length; offset++) {\n\t\t\t\ttail.source.refs.push(addition.source.refs[addition.start + offset]!);\n\t\t\t}\n\t\t\textendRightmostPiece(overlay.root, addition.length);\n\t\t\tinvalidatePieceCaches(overlay);\n\t\t\toverlay.structural = true;\n\t\t\toverlay.generation += 1;\n\t\t\tmarkDirty(node);\n\t\t\treturn;\n\t\t}\n\t}\n\tconst [left, rest] = splitPieceTree(overlay, overlay.root, index);\n\tconst [, right] = splitPieceTree(overlay, rest, remove);\n\tconst middle = treeFromPieces(overlay, inserted);\n\toverlay.root = joinNormalized(overlay, joinNormalized(overlay, left, middle), right);\n\tinvalidatePieceCaches(overlay);\n\toverlay.structural = true;\n\toverlay.generation += 1;\n\tmarkDirty(node);\n}\n\nfunction mergePieces(pieces: Piece[]): void {\n\tfor (let index = 1; index < pieces.length; ) {\n\t\tconst left = pieces[index - 1]!;\n\t\tconst right = pieces[index]!;\n\t\tconst sameSource =\n\t\t\tleft.kind === right.kind && (left.kind === \"base\" || left.source === (right as InsertPiece).source);\n\t\tif (sameSource && left.length === 1 && right.length === 1 && Math.abs(right.start - left.start) === 1) {\n\t\t\tleft.step = (right.start - left.start) as 1 | -1;\n\t\t\tleft.length = 2;\n\t\t\tpieces.splice(index, 1);\n\t\t} else if (sameSource && left.step === right.step && left.start + left.step * left.length === right.start) {\n\t\t\tleft.length += right.length;\n\t\t\tpieces.splice(index, 1);\n\t\t} else index += 1;\n\t}\n}\n\nfunction insertPiece(node: OverlayNode, items: Stored[], start = 0): InsertPiece[] {\n\tif (items.length === start) return [];\n\tconst refs: StoredRef[] = [];\n\tfor (let index = start; index < items.length; index++) refs.push(storeValue(node.context, items[index]!));\n\treturn [{ kind: \"insert\", source: { refs }, start: 0, length: refs.length, step: 1 }];\n}\n\nfunction insertPlacementPiece(node: OverlayNode, values: unknown[], start = 0): InsertPiece[] {\n\tif (values.length === start) return [];\n\tconst storedLength = node.context.stored!.length;\n\ttry {\n\t\tfor (let index = start; index < values.length; index++)\n\t\t\tvalues[index] = storeValue(node.context, clonePlacement(values[index]));\n\t} catch (error) {\n\t\tnode.context.stored!.length = storedLength;\n\t\tthrow error;\n\t}\n\treturn [\n\t\t{\n\t\t\tkind: \"insert\",\n\t\t\tsource: { refs: values as StoredRef[] },\n\t\t\tstart,\n\t\t\tlength: values.length - start,\n\t\t\tstep: 1,\n\t\t},\n\t];\n}\n\nfunction setArrayIndex(node: OverlayNode, index: number, stored: Stored): void {\n\tconst overlay = arrayOverlay(node);\n\tconst length = arrayLength(overlay);\n\tif (index === length) {\n\t\treplacePieceRange(node, length, 0, insertPiece(node, [stored]));\n\t\treturn;\n\t}\n\tconst piece = locatePiece(overlay, index);\n\tconst sourceIndex = piece.start + piece.step * overlay.locatedOffset;\n\tconst current = entryValueAt(node, piece, sourceIndex);\n\tif (!isContainer(stored) && current === stored) return;\n\tif (piece.kind === \"base\") {\n\t\tconst existingIndex = overlay.baseOverrides?.get(sourceIndex);\n\t\tif (!isContainer(stored) && stored === (nodeBase(node) as JsonValue[])[sourceIndex]) {\n\t\t\tif (existingIndex !== undefined) releaseStoredValue(node.context, existingIndex);\n\t\t\toverlay.baseOverrides?.delete(sourceIndex);\n\t\t} else if (existingIndex === undefined) {\n\t\t\tbaseOverridesForWrite(overlay).set(sourceIndex, storeValue(node.context, stored));\n\t\t} else overlay.baseOverrides!.set(sourceIndex, replaceStoredValue(node.context, existingIndex, stored));\n\t} else {\n\t\tlet overrides = overlay.insertOverrides?.get(piece.source);\n\t\tconst existingIndex = overrides?.get(sourceIndex);\n\t\tif (!isContainer(stored) && stored === storedValue(node.context, piece.source.refs[sourceIndex]!)) {\n\t\t\tif (existingIndex !== undefined) releaseStoredValue(node.context, existingIndex);\n\t\t\toverrides?.delete(sourceIndex);\n\t\t\tif (overrides?.size === 0) overlay.insertOverrides?.delete(piece.source);\n\t\t} else {\n\t\t\tif (overrides === undefined) {\n\t\t\t\toverrides = new Map();\n\t\t\t\tinsertOverridesForWrite(overlay).set(piece.source, overrides);\n\t\t\t}\n\t\t\tif (existingIndex === undefined) overrides.set(sourceIndex, storeValue(node.context, stored));\n\t\t\telse overrides.set(sourceIndex, replaceStoredValue(node.context, existingIndex, stored));\n\t\t}\n\t}\n\tmarkDirty(node);\n}\n\nfunction setArrayLength(node: OverlayNode, next: number): void {\n\tconst current = arrayLength(arrayOverlay(node));\n\tif (next === current) return;\n\tif (next < current) replacePieceRange(node, next, current - next, []);\n\telse\n\t\treplacePieceRange(\n\t\t\tnode,\n\t\t\tcurrent,\n\t\t\t0,\n\t\t\tinsertPiece(\n\t\t\t\tnode,\n\t\t\t\tArray.from({ length: next - current }, () => null),\n\t\t\t),\n\t\t);\n}\n\nfunction toArrayLength(value: unknown): number {\n\tconst number = Number(value);\n\tif (!Number.isInteger(number) || number < 0 || number >= 4_294_967_296) throw new RangeError(\"Invalid array length\");\n\treturn number;\n}\n\nfunction toIntegerOrInfinity(value: unknown): number {\n\tconst number = Number(value);\n\tif (Number.isNaN(number) || number === 0) return 0;\n\treturn Number.isFinite(number) ? Math.trunc(number) : number;\n}\n\nfunction clampIndex(value: number, length: number): number {\n\tif (value === Number.NEGATIVE_INFINITY) return 0;\n\tif (value < 0) return Math.max(length + value, 0);\n\treturn Math.min(value, length);\n}\n\nfunction mutatorNode(receiver: unknown): OverlayNode | undefined {\n\tif (!isContainer(receiver)) return undefined;\n\tconst node = Reflect.get(receiver, NODE) as OverlayNode | undefined;\n\tif (node === undefined) return undefined;\n\tif (!Array.isArray(nodeBase(node))) throw new TypeError(\"Array mutator called on incompatible receiver\");\n\tassertWritable(node.context);\n\treturn node;\n}\n\nconst arrayMutators = {\n\tpush(this: unknown, ...items: unknown[]): number {\n\t\tconst node = mutatorNode(this);\n\t\tif (node === undefined) return Reflect.apply(Array.prototype.push, this, items) as number;\n\t\tconst length = arrayLength(arrayOverlay(node));\n\t\treplacePieceRange(node, length, 0, insertPlacementPiece(node, items));\n\t\treturn length + items.length;\n\t},\n\tpop(this: unknown): unknown {\n\t\tconst node = mutatorNode(this);\n\t\tif (node === undefined) return Reflect.apply(Array.prototype.pop, this, []);\n\t\tconst length = arrayLength(arrayOverlay(node));\n\t\tif (length === 0) return undefined;\n\t\tconst value = getArrayIndex(node, length - 1);\n\t\treplacePieceRange(node, length - 1, 1, []);\n\t\treturn value;\n\t},\n\tshift(this: unknown): unknown {\n\t\tconst node = mutatorNode(this);\n\t\tif (node === undefined) return Reflect.apply(Array.prototype.shift, this, []);\n\t\tconst length = arrayLength(arrayOverlay(node));\n\t\tif (length === 0) return undefined;\n\t\tconst value = getArrayIndex(node, 0);\n\t\treplacePieceRange(node, 0, 1, []);\n\t\treturn value;\n\t},\n\tunshift(this: unknown, ...items: unknown[]): number {\n\t\tconst node = mutatorNode(this);\n\t\tif (node === undefined) return Reflect.apply(Array.prototype.unshift, this, items) as number;\n\t\treplacePieceRange(node, 0, 0, insertPlacementPiece(node, items));\n\t\treturn arrayLength(arrayOverlay(node));\n\t},\n\tsplice(this: unknown, ...args: unknown[]): unknown[] {\n\t\tconst node = mutatorNode(this);\n\t\tif (node === undefined) return Reflect.apply(Array.prototype.splice, this, args) as unknown[];\n\t\tconst length = arrayLength(arrayOverlay(node));\n\t\tconst start = args.length === 0 ? 0 : clampIndex(toIntegerOrInfinity(args[0]), length);\n\t\tconst remove =\n\t\t\targs.length === 0\n\t\t\t\t? 0\n\t\t\t\t: args.length === 1\n\t\t\t\t\t? length - start\n\t\t\t\t\t: Math.min(Math.max(toIntegerOrInfinity(args[1]), 0), length - start);\n\t\tconst removed = Array.from({ length: remove }, (_, offset) => getArrayIndex(node, start + offset));\n\t\tconst itemStart = Math.min(2, args.length);\n\t\tconst itemCount = Math.max(args.length - 2, 0);\n\t\treplacePieceRange(node, start, remove, insertPlacementPiece(node, args, itemStart));\n\t\tsetArrayLength(node, length - remove + itemCount);\n\t\treturn removed;\n\t},\n\treverse(this: unknown): unknown {\n\t\tconst node = mutatorNode(this);\n\t\tif (node === undefined) return Reflect.apply(Array.prototype.reverse, this, []);\n\t\tconst overlay = arrayOverlay(node);\n\t\tif (arrayLength(overlay) < 2) return node.proxy;\n\t\tconst pieces = [...piecesOf(overlay)].reverse();\n\t\tfor (const piece of pieces) {\n\t\t\tpiece.start += piece.step * (piece.length - 1);\n\t\t\tpiece.step = piece.step === 1 ? -1 : 1;\n\t\t}\n\t\treplaceAllPieces(overlay, pieces);\n\t\toverlay.structural = true;\n\t\toverlay.generation += 1;\n\t\toverlay.plan = undefined;\n\t\tmarkDirty(node);\n\t\treturn node.proxy;\n\t},\n\tsort(this: unknown, comparator?: unknown): unknown {\n\t\tconst node = mutatorNode(this);\n\t\tif (node === undefined) return Reflect.apply(Array.prototype.sort, this, [comparator]);\n\t\tif (comparator !== undefined && typeof comparator !== \"function\")\n\t\t\tthrow new TypeError(\"Comparator must be a function\");\n\t\tconst overlay = arrayOverlay(node);\n\t\tconst insertedSources: InsertSource[] = [];\n\t\tconst insertedIndices: number[] = [];\n\t\tconst insertedValues: unknown[] = [];\n\t\tconst baseValues: unknown[] = new Array((nodeBase(node) as JsonValue[]).length);\n\t\tconst order: number[] = [];\n\t\tfor (const piece of piecesOf(overlay)) {\n\t\t\tfor (let offset = 0; offset < piece.length; offset++) {\n\t\t\t\tconst sourceIndex = piece.start + piece.step * offset;\n\t\t\t\tif (piece.kind === \"base\") {\n\t\t\t\t\torder.push(sourceIndex);\n\t\t\t\t\tbaseValues[sourceIndex] = publicSortValue(node, sourceIndex, insertedSources, insertedIndices);\n\t\t\t\t} else {\n\t\t\t\t\tinsertedSources.push(piece.source);\n\t\t\t\t\tinsertedIndices.push(sourceIndex);\n\t\t\t\t\tconst token = -insertedSources.length;\n\t\t\t\t\torder.push(token);\n\t\t\t\t\tinsertedValues.push(publicSortValue(node, token, insertedSources, insertedIndices));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst baseSnapshot = new Map<number, Stored>();\n\t\tfor (const [index, valueIndex] of overlay.baseOverrides ?? [])\n\t\t\tbaseSnapshot.set(index, storedValue(node.context, valueIndex));\n\t\tconst insertSnapshots = new Map<InsertSource, Map<number, Stored>>();\n\t\tfor (const [source, overrides] of overlay.insertOverrides ?? []) {\n\t\t\tconst snapshot = new Map<number, Stored>();\n\t\t\tfor (const [index, valueIndex] of overrides) snapshot.set(index, storedValue(node.context, valueIndex));\n\t\t\tinsertSnapshots.set(source, snapshot);\n\t\t}\n\t\tconst generation = overlay.generation;\n\t\torder.sort((left, right) => {\n\t\t\tconst leftValue = left < 0 ? insertedValues[-left - 1] : baseValues[left];\n\t\t\tconst rightValue = right < 0 ? insertedValues[-right - 1] : baseValues[right];\n\t\t\tif (typeof comparator === \"function\") return Number(comparator(leftValue, rightValue));\n\t\t\tconst a = String(leftValue);\n\t\t\tconst b = String(rightValue);\n\t\t\treturn a < b ? -1 : a > b ? 1 : 0;\n\t\t});\n\t\tif (\n\t\t\tbaseSnapshot.size > 0 ||\n\t\t\tinsertSnapshots.size > 0 ||\n\t\t\t(overlay.baseOverrides?.size ?? 0) > 0 ||\n\t\t\t(overlay.insertOverrides?.size ?? 0) > 0\n\t\t) {\n\t\t\tfor (const token of order) {\n\t\t\t\trestoreSortOverride(node, token, insertedSources, insertedIndices, baseSnapshot, insertSnapshots);\n\t\t\t}\n\t\t}\n\t\tconst comparatorWasStructural = overlay.generation !== generation;\n\t\tconst currentLength = arrayLength(overlay);\n\t\tconst samePrefix =\n\t\t\tcurrentLength >= order.length &&\n\t\t\torder.every((token, index) => sameSortTokenAt(overlay, index, token, insertedSources, insertedIndices));\n\t\tif (!samePrefix) {\n\t\t\treplacePieceRange(\n\t\t\t\tnode,\n\t\t\t\t0,\n\t\t\t\tMath.min(order.length, currentLength),\n\t\t\t\tpiecesFromSortOrder(order, insertedSources, insertedIndices),\n\t\t\t);\n\t\t}\n\t\tif (comparatorWasStructural) deduplicateArrayEntries(node);\n\t\treturn node.proxy;\n\t},\n\tfill(this: unknown, supplied: unknown, startArg?: unknown, endArg?: unknown): unknown {\n\t\tconst node = mutatorNode(this);\n\t\tif (node === undefined) return Reflect.apply(Array.prototype.fill, this, [supplied, startArg, endArg]);\n\t\tconst length = arrayLength(arrayOverlay(node));\n\t\tconst start = startArg === undefined ? 0 : clampIndex(toIntegerOrInfinity(startArg), length);\n\t\tconst end = endArg === undefined ? length : clampIndex(toIntegerOrInfinity(endArg), length);\n\t\tif (end <= start) return node.proxy;\n\t\tconst items = Array.from({ length: end - start }, () => clonePlacement(supplied));\n\t\treplacePieceRange(node, start, end - start, insertPiece(node, items));\n\t\treturn node.proxy;\n\t},\n\tcopyWithin(this: unknown, targetArg: unknown, startArg: unknown, endArg?: unknown): unknown {\n\t\tconst node = mutatorNode(this);\n\t\tif (node === undefined) return Reflect.apply(Array.prototype.copyWithin, this, [targetArg, startArg, endArg]);\n\t\tconst length = arrayLength(arrayOverlay(node));\n\t\tconst target = clampIndex(toIntegerOrInfinity(targetArg), length);\n\t\tconst start = clampIndex(toIntegerOrInfinity(startArg), length);\n\t\tconst end = endArg === undefined ? length : clampIndex(toIntegerOrInfinity(endArg), length);\n\t\tconst count = Math.min(Math.max(end - start, 0), length - target);\n\t\tconst values = Array.from({ length: count }, (_, offset) => clonePlacement(getArrayIndex(node, start + offset)));\n\t\treplacePieceRange(node, target, count, insertPiece(node, values));\n\t\treturn node.proxy;\n\t},\n};\n\nfunction sortTokenSource(token: number, sources: readonly InsertSource[]): InsertSource | undefined {\n\treturn token < 0 ? sources[-token - 1] : undefined;\n}\n\nfunction sortTokenIndex(token: number, indices: readonly number[]): number {\n\treturn token < 0 ? indices[-token - 1]! : token;\n}\n\nfunction publicSortValue(\n\tnode: OverlayNode,\n\ttoken: number,\n\tsources: readonly InsertSource[],\n\tindices: readonly number[],\n): unknown {\n\tconst overlay = arrayOverlay(node);\n\tconst source = sortTokenSource(token, sources);\n\tconst sourceIndex = sortTokenIndex(token, indices);\n\tconst overrideIndex =\n\t\tsource === undefined\n\t\t\t? overlay.baseOverrides?.get(sourceIndex)\n\t\t\t: overlay.insertOverrides?.get(source)?.get(sourceIndex);\n\tconst value =\n\t\toverrideIndex !== undefined\n\t\t\t? storedValue(node.context, overrideIndex)\n\t\t\t: source === undefined\n\t\t\t\t? (nodeBase(node) as JsonValue[])[sourceIndex]!\n\t\t\t\t: storedValue(node.context, source.refs[sourceIndex]!);\n\tif (!isContainer(value)) return value;\n\treturn createNode(\n\t\tnode.context,\n\t\tvalue,\n\t\tnode,\n\t\tsource === undefined ? 1 : 2,\n\t\tsourceIndex,\n\t\tsource,\n\t\tsource !== undefined || (overlay.baseOverrides?.has(sourceIndex) ?? false),\n\t).proxy;\n}\n\nfunction restoreSortOverride(\n\tnode: OverlayNode,\n\ttoken: number,\n\tsources: readonly InsertSource[],\n\tindices: readonly number[],\n\tbaseSnapshot: ReadonlyMap<number, Stored>,\n\tinsertSnapshots: ReadonlyMap<InsertSource, ReadonlyMap<number, Stored>>,\n): void {\n\tconst overlay = arrayOverlay(node);\n\tconst source = sortTokenSource(token, sources);\n\tconst sourceIndex = sortTokenIndex(token, indices);\n\tif (source === undefined) {\n\t\tconst existingIndex = overlay.baseOverrides?.get(sourceIndex);\n\t\tconst snapshotValue = baseSnapshot.get(sourceIndex);\n\t\tif (snapshotValue !== undefined) {\n\t\t\tif (existingIndex === undefined)\n\t\t\t\tbaseOverridesForWrite(overlay).set(sourceIndex, storeValue(node.context, snapshotValue));\n\t\t\telse overlay.baseOverrides!.set(sourceIndex, replaceStoredValue(node.context, existingIndex, snapshotValue));\n\t\t} else {\n\t\t\tif (existingIndex !== undefined) releaseStoredValue(node.context, existingIndex);\n\t\t\toverlay.baseOverrides?.delete(sourceIndex);\n\t\t}\n\t\treturn;\n\t}\n\tlet overrides = overlay.insertOverrides?.get(source);\n\tconst existingIndex = overrides?.get(sourceIndex);\n\tconst snapshotValue = insertSnapshots.get(source)?.get(sourceIndex);\n\tif (snapshotValue !== undefined) {\n\t\tif (overrides === undefined) {\n\t\t\toverrides = new Map();\n\t\t\tinsertOverridesForWrite(overlay).set(source, overrides);\n\t\t}\n\t\tif (existingIndex === undefined) overrides.set(sourceIndex, storeValue(node.context, snapshotValue));\n\t\telse overrides.set(sourceIndex, replaceStoredValue(node.context, existingIndex, snapshotValue));\n\t} else {\n\t\tif (existingIndex !== undefined) releaseStoredValue(node.context, existingIndex);\n\t\toverrides?.delete(sourceIndex);\n\t\tif (overrides?.size === 0) overlay.insertOverrides?.delete(source);\n\t}\n}\n\nfunction sameSortTokenAt(\n\toverlay: ArrayOverlay,\n\tlogicalIndex: number,\n\ttoken: number,\n\tsources: readonly InsertSource[],\n\tindices: readonly number[],\n): boolean {\n\tconst piece = locatePiece(overlay, logicalIndex);\n\tconst sourceIndex = piece.start + piece.step * overlay.locatedOffset;\n\tconst tokenSource = sortTokenSource(token, sources);\n\treturn (\n\t\tsourceIndex === sortTokenIndex(token, indices) &&\n\t\t((piece.kind === \"base\" && tokenSource === undefined) ||\n\t\t\t(piece.kind === \"insert\" && piece.source === tokenSource))\n\t);\n}\n\nfunction deduplicateArrayEntries(node: OverlayNode): void {\n\tconst overlay = arrayOverlay(node);\n\tconst seenBase = new Set<number>();\n\tconst seenInsert = new Map<InsertSource, Set<number>>();\n\tconst next: Piece[] = [];\n\tlet duplicated = false;\n\tfor (const piece of piecesOf(overlay)) {\n\t\tfor (let offset = 0; offset < piece.length; offset++) {\n\t\t\tconst sourceIndex = piece.start + piece.step * offset;\n\t\t\tlet seen: boolean;\n\t\t\tif (piece.kind === \"base\") {\n\t\t\t\tseen = seenBase.has(sourceIndex);\n\t\t\t\tseenBase.add(sourceIndex);\n\t\t\t} else {\n\t\t\t\tlet indices = seenInsert.get(piece.source);\n\t\t\t\tif (indices === undefined) {\n\t\t\t\t\tindices = new Set();\n\t\t\t\t\tseenInsert.set(piece.source, indices);\n\t\t\t\t}\n\t\t\t\tseen = indices.has(sourceIndex);\n\t\t\t\tindices.add(sourceIndex);\n\t\t\t}\n\t\t\tif (seen) {\n\t\t\t\tduplicated = true;\n\t\t\t\tappendMergedPiece(\n\t\t\t\t\tnext,\n\t\t\t\t\tinsertPiece(node, [clonePlacementStored(entryValueAt(node, piece, sourceIndex), node.context)])[0]!,\n\t\t\t\t);\n\t\t\t} else appendMergedPiece(next, singletonPiece(piece, sourceIndex));\n\t\t}\n\t}\n\tif (!duplicated) return;\n\treplaceAllPieces(overlay, next);\n\toverlay.structural = true;\n\toverlay.generation += 1;\n\toverlay.plan = undefined;\n\tmarkDirty(node);\n}\n\nfunction piecesFromSortOrder(\n\torder: readonly number[],\n\tsources: readonly InsertSource[],\n\tindices: readonly number[],\n): Piece[] {\n\tconst pieces: Piece[] = [];\n\tfor (const token of order) {\n\t\tconst source = token < 0 ? sources[-token - 1] : undefined;\n\t\tconst sourceIndex = token < 0 ? indices[-token - 1]! : token;\n\t\tconst previous = pieces.at(-1);\n\t\tconst sameSource =\n\t\t\tprevious !== undefined &&\n\t\t\t((source === undefined && previous.kind === \"base\") ||\n\t\t\t\t(source !== undefined && previous.kind === \"insert\" && previous.source === source));\n\t\tif (previous !== undefined && sameSource) {\n\t\t\tif (previous.length === 1) {\n\t\t\t\tconst step = sourceIndex - previous.start;\n\t\t\t\tif (step === 1 || step === -1) {\n\t\t\t\t\tprevious.step = step;\n\t\t\t\t\tprevious.length = 2;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t} else if (previous.start + previous.step * previous.length === sourceIndex) {\n\t\t\t\tprevious.length += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tpieces.push(\n\t\t\tsource === undefined\n\t\t\t\t? { kind: \"base\", start: sourceIndex, length: 1, step: 1 }\n\t\t\t\t: { kind: \"insert\", source, start: sourceIndex, length: 1, step: 1 },\n\t\t);\n\t}\n\treturn pieces;\n}\n\nfunction appendMergedPiece(pieces: Piece[], piece: Piece): void {\n\tconst previous = pieces.at(-1);\n\tconst sameSource =\n\t\tprevious !== undefined &&\n\t\tprevious.kind === piece.kind &&\n\t\t(previous.kind === \"base\" || previous.source === (piece as InsertPiece).source);\n\tif (previous !== undefined && sameSource && previous.length === 1 && piece.length === 1) {\n\t\tconst step = piece.start - previous.start;\n\t\tif (step === 1 || step === -1) {\n\t\t\tprevious.step = step;\n\t\t\tprevious.length = 2;\n\t\t\treturn;\n\t\t}\n\t}\n\tif (\n\t\tprevious !== undefined &&\n\t\tsameSource &&\n\t\tprevious.step === piece.step &&\n\t\tprevious.start + previous.step * previous.length === piece.start\n\t) {\n\t\tprevious.length += piece.length;\n\t} else pieces.push(piece);\n}\n\nfunction singletonPiece(piece: Piece, sourceIndex: number): Piece {\n\treturn piece.kind === \"base\"\n\t\t? { kind: \"base\", start: sourceIndex, length: 1, step: 1 }\n\t\t: { kind: \"insert\", source: piece.source, start: sourceIndex, length: 1, step: 1 };\n}\n\nfunction clonePlacement(value: unknown): Stored {\n\tconst proxyNode = isContainer(value) ? (Reflect.get(value, NODE) as OverlayNode | undefined) : undefined;\n\treturn proxyNode === undefined ? copyJson(value) : clonePlacementNode(proxyNode);\n}\n\nfunction cloneNode(node: OverlayNode): Container {\n\tassertReadable(node.context);\n\tif (Array.isArray(nodeBase(node))) {\n\t\tconst overlay = arrayOverlay(node);\n\t\tconst result: JsonValue[] = [];\n\t\tfor (const piece of piecesOf(overlay)) {\n\t\t\tfor (let offset = 0; offset < piece.length; offset++) {\n\t\t\t\tconst sourceIndex = piece.start + piece.step * offset;\n\t\t\t\tresult.push(cloneStored(entryValueAt(node, piece, sourceIndex), node.context));\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\tconst result = Object.create(Object.getPrototypeOf(nodeBase(node))) as Record<string, JsonValue>;\n\tfor (const key of ownKeys(node) as string[])\n\t\tdefineData(result, key, cloneStored(objectValue(node, key), node.context));\n\treturn result;\n}\n\nfunction cloneStored(value: Stored, context: OverlayContext): Stored {\n\tif (!isContainer(value)) return value;\n\tconst node = context.rawNodes!.get(value);\n\treturn node === undefined || (!node.dirty && !node.subtreeDirty) ? value : cloneNode(node);\n}\n\nfunction clonePlacementNode(node: OverlayNode): Container {\n\tassertReadable(node.context);\n\tif (Array.isArray(nodeBase(node))) {\n\t\tconst overlay = arrayOverlay(node);\n\t\tconst result: JsonValue[] = [];\n\t\tfor (const piece of piecesOf(overlay)) {\n\t\t\tfor (let offset = 0; offset < piece.length; offset++) {\n\t\t\t\tconst sourceIndex = piece.start + piece.step * offset;\n\t\t\t\tresult.push(clonePlacementStored(entryValueAt(node, piece, sourceIndex), node.context));\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\tconst result = Object.create(Object.getPrototypeOf(nodeBase(node))) as Record<string, JsonValue>;\n\tfor (const key of ownKeys(node) as string[])\n\t\tdefineData(result, key, clonePlacementStored(objectValue(node, key), node.context));\n\treturn result;\n}\n\nfunction clonePlacementStored(value: Stored, context: OverlayContext): Stored {\n\tif (!isContainer(value)) return copyJson(value);\n\tconst node = context.rawNodes!.get(value);\n\treturn node === undefined ? copyJson(value) : clonePlacementNode(node);\n}\n\nfunction defineData(target: object, key: PropertyKey, value: JsonValue): void {\n\tDATA_DESCRIPTOR.value = value;\n\tObject.defineProperty(target, key, DATA_DESCRIPTOR);\n\tDATA_DESCRIPTOR.value = undefined;\n}\n\nfunction emitOperations(context: OverlayContext): Op[] {\n\tconst simple = emitSimpleObjectOperations(context);\n\tif (simple !== undefined) return simple;\n\tconst operations: Op[] = [];\n\tconst forcedFolds = new Map<OverlayNode, Path>();\n\tconst emissionPaths = new Map<OverlayNode, Path>();\n\tconst denseIndices = new Map<OverlayNode, DenseCandidates>();\n\tfor (const node of context.dirty) {\n\t\trecordDenseArrayPosition(node, denseIndices);\n\t\tif (Array.isArray(nodeBase(node))) {\n\t\t\tconst overlay = arrayOverlay(node);\n\t\t\tif (!overlay.structural && (overlay.baseOverrides?.size ?? 0) > 0) {\n\t\t\t\tlet candidates = denseIndices.get(node);\n\t\t\t\tif (candidates === undefined) {\n\t\t\t\t\tcandidates = { indices: [], bits: undefined, length: (nodeBase(node) as JsonValue[]).length };\n\t\t\t\t\tdenseIndices.set(node, candidates);\n\t\t\t\t}\n\t\t\t\tfor (const index of overlay.baseOverrides!.keys()) addDenseCandidate(candidates, index);\n\t\t\t}\n\t\t}\n\t}\n\tconst denseRegions = new Map<OverlayNode, DenseRegion[]>();\n\tfor (const [array, candidates] of denseIndices) {\n\t\tconst path = resolvePath(array);\n\t\tif (path === undefined || path.some((segment) => typeof segment === \"string\" && RESERVED_SEGMENTS.has(segment))) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst regions = buildDenseRegions(candidates);\n\t\tif (regions.length > 0) denseRegions.set(array, regions);\n\t}\n\tfor (const node of context.dirty) {\n\t\tconst path = resolvePath(node);\n\t\tif (path === undefined) continue;\n\t\tif (hasCoveringDenseRegion(node, path, denseRegions)) continue;\n\t\temissionPaths.set(node, path);\n\t\tif (!Array.isArray(nodeBase(node)) && hasReservedMutation(node)) forcedFolds.set(node, path);\n\t\tconst reservedAt = path.findIndex((segment) => typeof segment === \"string\" && RESERVED_SEGMENTS.has(segment));\n\t\tif (reservedAt >= 0) {\n\t\t\tlet ancestor = node;\n\t\t\tfor (let depth = path.length; depth > reservedAt; depth--) ancestor = nodeParent(ancestor)!;\n\t\t\tforcedFolds.set(ancestor, path.slice(0, reservedAt));\n\t\t}\n\t}\n\tfor (const [node, path] of forcedFolds) emissionPaths.set(node, path);\n\tfor (const node of denseRegions.keys()) {\n\t\tconst path = resolvePath(node);\n\t\tif (path !== undefined && !hasCoveringDenseRegion(node, path, denseRegions)) emissionPaths.set(node, path);\n\t}\n\tlet maxDepth = 0;\n\tfor (const path of emissionPaths.values()) maxDepth = Math.max(maxDepth, path.length);\n\tconst buckets: OverlayNode[][] = Array.from({ length: maxDepth + 1 }, () => []);\n\tfor (const [node, path] of emissionPaths) buckets[path.length]!.push(node);\n\tconst folded = new Set<OverlayNode>();\n\tfor (const bucket of buckets) {\n\t\tfor (const node of bucket) {\n\t\t\tconst path = emissionPaths.get(node)!;\n\t\t\tif (hasPlacementAncestor(node) || hasFoldedAncestor(node, folded)) continue;\n\t\t\tif (forcedFolds.has(node)) {\n\t\t\t\temitSet(operations, path, cloneNode(node));\n\t\t\t\tfolded.add(node);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (Array.isArray(nodeBase(node))) emitArrayOperations(node, path, operations, denseRegions.get(node));\n\t\t\telse emitObjectOperations(node, path, operations);\n\t\t\tif (operations.length > MAX_DELTA_OPERATIONS) {\n\t\t\t\tlocatedDenseArray = undefined;\n\t\t\t\treturn [[\"r\", cloneNode(context.root!)]];\n\t\t\t}\n\t\t}\n\t}\n\tlocatedDenseArray = undefined;\n\treturn operations;\n}\n\nfunction emitSimpleObjectOperations(context: OverlayContext): Op[] | undefined {\n\tconst nodes: OverlayNode[] = [];\n\tfor (const node of context.dirty) {\n\t\tif (Array.isArray(nodeBase(node)) || hasReservedMutation(node) || hasPlacementAncestor(node)) return undefined;\n\t\tfor (let parent = nodeParent(node); parent !== undefined; parent = nodeParent(parent)) {\n\t\t\tif (Array.isArray(nodeBase(parent))) return undefined;\n\t\t}\n\t\tconst path = resolvePath(node);\n\t\tif (path === undefined) continue;\n\t\tfor (const segment of path) {\n\t\t\tif (typeof segment === \"string\" && RESERVED_SEGMENTS.has(segment)) return undefined;\n\t\t}\n\t\tnodes.push(node);\n\t\tif (nodes.length > MAX_SIMPLE_OBJECT_NODES) return undefined;\n\t}\n\t// Stable insertion sort avoids comparator/bucket allocations for the usual\n\t// handful of dirty object nodes.\n\tfor (let index = 1; index < nodes.length; index++) {\n\t\tconst node = nodes[index]!;\n\t\tconst depth = node.preparedPath!.length;\n\t\tlet at = index;\n\t\twhile (at > 0 && nodes[at - 1]!.preparedPath!.length > depth) {\n\t\t\tnodes[at] = nodes[at - 1]!;\n\t\t\tat -= 1;\n\t\t}\n\t\tnodes[at] = node;\n\t}\n\tconst operations: Op[] = [];\n\tlet canMaterializeDirectly = true;\n\tfor (const node of nodes) {\n\t\tif (emitObjectOperations(node, node.preparedPath!, operations)) canMaterializeDirectly = false;\n\t\tif (operations.length > MAX_DELTA_OPERATIONS) return [[\"r\", cloneNode(context.root!)]];\n\t}\n\tcontext.simpleObjectMaterialization = canMaterializeDirectly;\n\treturn operations;\n}\n\nlet locatedDenseArray: OverlayNode | undefined;\nlet locatedDenseIndex = 0;\n\nfunction locateDenseArrayPosition(node: OverlayNode): boolean {\n\tlet child = node;\n\tfor (let parent = nodeParent(child); parent !== undefined; parent = nodeParent(child)) {\n\t\tif (Array.isArray(nodeBase(parent))) {\n\t\t\tconst overlay = arrayOverlay(parent);\n\t\t\tif (child.parentKind !== 1 || overlay.structural) return false;\n\t\t\tconst sourceIndex = child.parentKey as number;\n\t\t\tconst valueIndex = overlay.baseOverrides?.get(sourceIndex);\n\t\t\tconst current =\n\t\t\t\tvalueIndex === undefined\n\t\t\t\t\t? (nodeBase(parent) as JsonValue[])[sourceIndex]\n\t\t\t\t\t: storedValue(parent.context, valueIndex);\n\t\t\tif (current !== nodeBase(child)) return false;\n\t\t\tlocatedDenseArray = parent;\n\t\t\tlocatedDenseIndex = sourceIndex;\n\t\t\treturn true;\n\t\t}\n\t\tchild = parent;\n\t}\n\treturn false;\n}\n\nfunction hasCoveringDenseRegion(\n\tnode: OverlayNode,\n\tpath: Path,\n\tdenseRegions: ReadonlyMap<OverlayNode, readonly DenseRegion[]>,\n): boolean {\n\tfor (let parent = nodeParent(node); parent !== undefined; parent = nodeParent(parent)) {\n\t\tconst regions = denseRegions.get(parent);\n\t\tif (regions === undefined) continue;\n\t\tconst parentPath = resolvePath(parent);\n\t\tif (parentPath === undefined || path.length <= parentPath.length) continue;\n\t\tlet matches = true;\n\t\tfor (let index = 0; index < parentPath.length; index++) {\n\t\t\tif (path[index] !== parentPath[index]) {\n\t\t\t\tmatches = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!matches) continue;\n\t\tconst index = path[parentPath.length];\n\t\tif (typeof index === \"number\" && regionContaining(regions, index)) return true;\n\t}\n\treturn false;\n}\n\nfunction addDenseCandidate(candidates: DenseCandidates, index: number): void {\n\tif (candidates.bits !== undefined) {\n\t\tcandidates.bits[index] = 1;\n\t\treturn;\n\t}\n\tcandidates.indices.push(index);\n\tif (candidates.indices.length < 256) return;\n\tcandidates.bits = new Uint8Array(candidates.length);\n\tfor (const existing of candidates.indices) candidates.bits[existing] = 1;\n\tcandidates.indices.length = 0;\n}\n\nfunction recordDenseArrayPosition(node: OverlayNode, groups: Map<OverlayNode, DenseCandidates>): void {\n\tif (!locateDenseArrayPosition(node)) return;\n\tlet candidates = groups.get(locatedDenseArray!);\n\tif (candidates === undefined) {\n\t\tcandidates = { indices: [], bits: undefined, length: (nodeBase(locatedDenseArray!) as JsonValue[]).length };\n\t\tgroups.set(locatedDenseArray!, candidates);\n\t}\n\taddDenseCandidate(candidates, locatedDenseIndex);\n}\n\nfunction buildDenseRegions(candidates: DenseCandidates): DenseRegion[] {\n\tif (candidates.bits === undefined) return [];\n\tconst regions: DenseRegion[] = [];\n\tconst bits = candidates.bits;\n\tfor (let at = 0; at < bits.length; ) {\n\t\twhile (at < bits.length && bits[at] === 0) at += 1;\n\t\tif (at === bits.length) break;\n\t\tconst start = at;\n\t\tlet end = at;\n\t\tlet count = 0;\n\t\tlet gap = 0;\n\t\twhile (at < bits.length) {\n\t\t\tif (bits[at] !== 0) {\n\t\t\t\tcount += 1;\n\t\t\t\tend = at;\n\t\t\t\tgap = 0;\n\t\t\t} else if (++gap > 1) break;\n\t\t\tat += 1;\n\t\t}\n\t\tconst length = end - start + 1;\n\t\tif (count >= 256 && count * 2 >= length) regions.push({ start, length });\n\t}\n\treturn regions;\n}\n\nfunction regionContaining(regions: readonly DenseRegion[], index: number): boolean {\n\tfor (const region of regions) if (index >= region.start && index < region.start + region.length) return true;\n\treturn false;\n}\n\nfunction hasReservedMutation(node: OverlayNode): boolean {\n\tif (node.writeKey !== undefined && RESERVED_SEGMENTS.has(node.writeKey)) return true;\n\tif (node.deleteKey !== undefined && RESERVED_SEGMENTS.has(node.deleteKey)) return true;\n\tif (node.writes !== undefined) {\n\t\tfor (const key of node.writes.keys()) if (RESERVED_SEGMENTS.has(key)) return true;\n\t}\n\tif (node.deletes !== undefined) {\n\t\tfor (const key of node.deletes) if (RESERVED_SEGMENTS.has(key)) return true;\n\t}\n\treturn false;\n}\n\nfunction hasFoldedAncestor(node: OverlayNode, folded: ReadonlySet<OverlayNode>): boolean {\n\tfor (let parent = nodeParent(node); parent !== undefined; parent = nodeParent(parent))\n\t\tif (folded.has(parent)) return true;\n\treturn false;\n}\n\nfunction hasPlacementAncestor(node: OverlayNode): boolean {\n\tfor (let current: OverlayNode | undefined = node; current !== undefined; current = nodeParent(current)) {\n\t\tif (nodeParent(current) !== undefined && current.parentPlacement) return true;\n\t}\n\treturn false;\n}\n\nfunction emitObjectWrite(node: OverlayNode, path: Path, operations: Op[], key: string, value: Stored): boolean {\n\tconst nextPath = [...path, key] as unknown as NonEmptyPath;\n\tconst before =\n\t\tnode.readded?.has(key) || !Object.hasOwn(nodeBase(node), key)\n\t\t\t? undefined\n\t\t\t: (nodeBase(node) as Record<string, JsonValue>)[key];\n\tconst after = cloneStored(value, node.context);\n\tconst emitted = emitChangedValue(operations, nextPath, before, after);\n\treturn isContainer(before) && isContainer(after) && !emitted;\n}\n\nfunction emitObjectOperations(node: OverlayNode, path: Path, operations: Op[]): boolean {\n\t// Immutable replay must encode delete-and-readd explicitly so string-key\n\t// insertion order matches the draft.\n\tif (node.readded !== undefined) {\n\t\tfor (const key of node.readded) {\n\t\t\tif (Object.hasOwn(nodeBase(node), key)) operations.push([\"d\", [...path, key] as unknown as NonEmptyPath]);\n\t\t}\n\t}\n\tlet normalizedContainerWrite = false;\n\tif (node.writeKey !== undefined)\n\t\tnormalizedContainerWrite = emitObjectWrite(\n\t\t\tnode,\n\t\t\tpath,\n\t\t\toperations,\n\t\t\tnode.writeKey,\n\t\t\tobjectValue(node, node.writeKey),\n\t\t);\n\tif (node.writes !== undefined) {\n\t\tfor (const [key, valueIndex] of node.writes) {\n\t\t\tif (operations.length > MAX_DELTA_OPERATIONS) return normalizedContainerWrite;\n\t\t\tif (emitObjectWrite(node, path, operations, key, storedValue(node.context, valueIndex)))\n\t\t\t\tnormalizedContainerWrite = true;\n\t\t}\n\t}\n\tif (node.deleteKey !== undefined && Object.hasOwn(nodeBase(node), node.deleteKey)) {\n\t\toperations.push([\"d\", [...path, node.deleteKey] as unknown as NonEmptyPath]);\n\t}\n\tif (node.deletes !== undefined) {\n\t\tfor (const key of node.deletes) {\n\t\t\tif (operations.length > MAX_DELTA_OPERATIONS) return normalizedContainerWrite;\n\t\t\tif (Object.hasOwn(nodeBase(node), key)) operations.push([\"d\", [...path, key] as unknown as NonEmptyPath]);\n\t\t}\n\t}\n\treturn normalizedContainerWrite;\n}\n\nfunction buildArrayPlan(node: OverlayNode): ArrayPlan {\n\tconst overlay = arrayOverlay(node);\n\tif (overlay.plan !== undefined) return overlay.plan;\n\tconst base = nodeBase(node) as JsonValue[];\n\tconst pieces = piecesOf(overlay);\n\tconst retained = new Uint8Array(base.length);\n\tconst targetBase: number[] = [];\n\tfor (const piece of pieces) {\n\t\tif (piece.kind !== \"base\") continue;\n\t\tfor (let offset = 0; offset < piece.length; offset++) {\n\t\t\tconst index = piece.start + piece.step * offset;\n\t\t\tretained[index] = 1;\n\t\t\ttargetBase.push(index);\n\t\t}\n\t}\n\tconst removeRuns: number[] = [];\n\tfor (let end = base.length; end > 0; ) {\n\t\tif (retained[end - 1] !== 0) {\n\t\t\tend -= 1;\n\t\t\tcontinue;\n\t\t}\n\t\tlet start = end - 1;\n\t\twhile (start > 0 && retained[start - 1] === 0) start -= 1;\n\t\tremoveRuns.push(start, end - start);\n\t\tend = start;\n\t}\n\tconst retainedBase: number[] = [];\n\tfor (let index = 0; index < retained.length; index++) if (retained[index] !== 0) retainedBase.push(index);\n\tlet permutation: number[] | undefined;\n\tif (targetBase.some((value, index) => value !== retainedBase[index])) {\n\t\tconst positions = new Map(retainedBase.map((value, index) => [value, index]));\n\t\tpermutation = targetBase.map((value) => positions.get(value)!);\n\t}\n\tconst insertRuns: number[] = [];\n\tlet logicalIndex = 0;\n\tfor (let pieceIndex = 0; pieceIndex < pieces.length; ) {\n\t\tconst piece = pieces[pieceIndex]!;\n\t\tif (piece.kind === \"base\") {\n\t\t\tlogicalIndex += piece.length;\n\t\t\tpieceIndex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tconst startPiece = pieceIndex;\n\t\twhile (pieceIndex < pieces.length && pieces[pieceIndex]!.kind === \"insert\") {\n\t\t\tlogicalIndex += pieces[pieceIndex]!.length;\n\t\t\tpieceIndex += 1;\n\t\t}\n\t\tinsertRuns.push(logicalIndex - rangeLength(pieces, startPiece, pieceIndex), startPiece, pieceIndex);\n\t}\n\toverlay.plan = { removeRuns, permutation, insertRuns };\n\treturn overlay.plan;\n}\n\nfunction rangeLength(pieces: readonly Piece[], start: number, end: number): number {\n\tlet length = 0;\n\tfor (let index = start; index < end; index++) length += pieces[index]!.length;\n\treturn length;\n}\n\nfunction emitArrayOperations(\n\tnode: OverlayNode,\n\tpath: Path,\n\toperations: Op[],\n\tdenseRegions: readonly DenseRegion[] | undefined,\n): void {\n\tconst overlay = arrayOverlay(node);\n\tconst base = nodeBase(node) as JsonValue[];\n\tif (denseRegions !== undefined) {\n\t\tfor (const region of denseRegions) {\n\t\t\tif (operations.length > MAX_DELTA_OPERATIONS) return;\n\t\t\toperations.push([\"p\", path, region.start, region.length, cloneArrayRegion(node, region)]);\n\t\t}\n\t}\n\tif (overlay.structural) {\n\t\tconst plan = buildArrayPlan(node);\n\t\tfor (let index = 0; index < plan.removeRuns.length; index += 2) {\n\t\t\tif (operations.length > MAX_DELTA_OPERATIONS) return;\n\t\t\toperations.push([\"p\", path, plan.removeRuns[index]!, plan.removeRuns[index + 1]!, []]);\n\t\t}\n\t\tif (plan.permutation !== undefined) operations.push([\"m\", path, plan.permutation]);\n\t\tconst pieces = piecesOf(overlay);\n\t\tfor (let run = 0; run < plan.insertRuns.length; run += 3) {\n\t\t\tif (operations.length > MAX_DELTA_OPERATIONS) return;\n\t\t\tconst logicalIndex = plan.insertRuns[run]!;\n\t\t\tconst items: JsonValue[] = [];\n\t\t\tfor (let pieceIndex = plan.insertRuns[run + 1]!; pieceIndex < plan.insertRuns[run + 2]!; pieceIndex++) {\n\t\t\t\tconst piece = pieces[pieceIndex]! as InsertPiece;\n\t\t\t\tfor (let offset = 0; offset < piece.length; offset++) {\n\t\t\t\t\tconst sourceIndex = piece.start + piece.step * offset;\n\t\t\t\t\titems.push(cloneStored(entryValueAt(node, piece, sourceIndex), node.context));\n\t\t\t\t}\n\t\t\t}\n\t\t\toperations.push([\"p\", path, logicalIndex, 0, items]);\n\t\t}\n\t}\n\tfor (const [baseIndex, valueIndex] of overlay.baseOverrides ?? []) {\n\t\tif (operations.length > MAX_DELTA_OPERATIONS) return;\n\t\tconst index = findEntryIndex(overlay, 1, baseIndex, undefined);\n\t\tif (index === undefined || (denseRegions !== undefined && regionContaining(denseRegions, index))) continue;\n\t\temitChangedValue(\n\t\t\toperations,\n\t\t\t[...path, index] as unknown as NonEmptyPath,\n\t\t\tbase[baseIndex],\n\t\t\tcloneStored(storedValue(node.context, valueIndex), node.context),\n\t\t);\n\t}\n}\n\nfunction cloneArrayRegion(node: OverlayNode, region: DenseRegion): JsonValue[] {\n\tconst overlay = arrayOverlay(node);\n\tconst result: JsonValue[] = [];\n\tfor (let index = region.start; index < region.start + region.length; index++) {\n\t\tconst piece = locatePiece(overlay, index);\n\t\tconst sourceIndex = piece.start + piece.step * overlay.locatedOffset;\n\t\tresult.push(cloneStored(entryValueAt(node, piece, sourceIndex), node.context));\n\t}\n\treturn result;\n}\n\nfunction emitChangedValue(\n\toperations: Op[],\n\tpath: NonEmptyPath,\n\tbefore: JsonValue | undefined,\n\tafter: JsonValue,\n): boolean {\n\tif (!isContainer(after) && before === after) return false;\n\tif (isContainer(before) && isContainer(after) && equalTrustedJson(before, after)) return false;\n\tif (typeof before === \"string\" && typeof after === \"string\") {\n\t\t// Slice/equality stays on V8's rope fast path; startsWith scans the entire\n\t\t// accumulated prefix on every append.\n\t\tif (after.length > before.length && after.slice(0, before.length) === before) {\n\t\t\toperations.push([\"a\", path, after.slice(before.length)]);\n\t\t\treturn true;\n\t\t}\n\t\tconst shared = overlap(before, after, 65_536);\n\t\tif (shared > 0) {\n\t\t\toperations.push([\"t\", path, before.length - shared]);\n\t\t\tif (after.length > shared) operations.push([\"a\", path, after.slice(shared)]);\n\t\t\treturn true;\n\t\t}\n\t}\n\toperations.push([\"s\", path, after]);\n\treturn true;\n}\n\nfunction emitSet(operations: Op[], path: Path, value: JsonValue): void {\n\tif (path.length === 0) operations.push([\"r\", value]);\n\telse operations.push([\"s\", path as NonEmptyPath, value]);\n}\n\nfunction resolvePath(node: OverlayNode): Path | undefined {\n\tif (node.preparedPath !== undefined) return node.preparedPath;\n\tconst parent = nodeParent(node);\n\tif (parent === undefined) {\n\t\tnode.preparedPath = [];\n\t\treturn node.preparedPath;\n\t}\n\tconst parentPath = resolvePath(parent);\n\tif (parentPath === undefined) return undefined;\n\tif (node.parentKind === 0) {\n\t\tconst key = node.parentKey as string;\n\t\tif (!objectHas(parent, key) || objectValue(parent, key) !== nodeBase(node)) return undefined;\n\t\tnode.preparedPath = [...parentPath, key];\n\t\treturn node.preparedPath;\n\t}\n\tconst overlay = arrayOverlay(parent);\n\tconst index = findEntryIndex(overlay, node.parentKind, node.parentKey as number, node.parentSource);\n\tif (index === undefined) return undefined;\n\tconst piece = locatePiece(overlay, index);\n\tif (entryValueAt(parent, piece, node.parentKey as number) !== nodeBase(node)) return undefined;\n\tnode.preparedPath = [...parentPath, index];\n\treturn node.preparedPath;\n}\n\nfunction ensurePieceLocations(overlay: ArrayOverlay): void {\n\tif (overlay.baseLocations !== undefined) return;\n\toverlay.baseLocations = [];\n\toverlay.insertLocations = new Map();\n\tlet logicalStart = 0;\n\tfor (const piece of piecesOf(overlay)) {\n\t\tconst last = piece.start + piece.step * (piece.length - 1);\n\t\tconst location = {\n\t\t\tpiece,\n\t\t\tlogicalStart,\n\t\t\tminimum: Math.min(piece.start, last),\n\t\t\tmaximum: Math.max(piece.start, last),\n\t\t};\n\t\tif (piece.kind === \"base\") overlay.baseLocations.push(location);\n\t\telse {\n\t\t\tlet locations = overlay.insertLocations.get(piece.source);\n\t\t\tif (locations === undefined) {\n\t\t\t\tlocations = [];\n\t\t\t\toverlay.insertLocations.set(piece.source, locations);\n\t\t\t}\n\t\t\tlocations.push(location);\n\t\t}\n\t\tlogicalStart += piece.length;\n\t}\n\tconst byMinimum = (left: PieceLocation, right: PieceLocation): number => left.minimum - right.minimum;\n\toverlay.baseLocations.sort(byMinimum);\n\tfor (const locations of overlay.insertLocations.values()) locations.sort(byMinimum);\n}\n\nfunction findEntryIndex(\n\toverlay: ArrayOverlay,\n\tkind: ParentKind,\n\tsourceIndex: number,\n\tsource: InsertSource | undefined,\n): number | undefined {\n\tif (kind === 1 && !overlay.structural) return sourceIndex;\n\tensurePieceLocations(overlay);\n\tconst locations = kind === 1 ? overlay.baseLocations! : overlay.insertLocations!.get(source!);\n\tif (locations === undefined) return undefined;\n\tlet low = 0;\n\tlet high = locations.length;\n\twhile (low < high) {\n\t\tconst middle = (low + high) >>> 1;\n\t\tif (locations[middle]!.minimum <= sourceIndex) low = middle + 1;\n\t\telse high = middle;\n\t}\n\tconst location = locations[low - 1];\n\tif (location === undefined || sourceIndex > location.maximum) return undefined;\n\tconst offset = (sourceIndex - location.piece.start) / location.piece.step;\n\treturn offset >= 0 && offset < location.piece.length ? location.logicalStart + offset : undefined;\n}\n\nfunction ensureOperations(context: OverlayContext): Op[] {\n\tif (context.ops !== undefined) return context.ops;\n\tassertReadable(context);\n\tif (context.replacement) {\n\t\tconst base = context.tracker.deref()?.replacementBase(context);\n\t\tcontext.replacementNoop =\n\t\t\tbase !== undefined && equalTrustedJson(base as unknown as JsonValue, nodeBase(context.root!) as JsonValue);\n\t\tcontext.ops = context.replacementNoop ? [] : [[\"r\", nodeBase(context.root!)]];\n\t} else context.ops = emitOperations(context);\n\treturn context.ops;\n}\n\nfunction equalTrustedJson(left: JsonValue, right: JsonValue): boolean {\n\tif (left === right) return true;\n\tif (!isContainer(left) || !isContainer(right) || Array.isArray(left) !== Array.isArray(right)) return false;\n\tif (Array.isArray(left)) {\n\t\tconst other = right as JsonValue[];\n\t\tif (left.length !== other.length) return false;\n\t\tfor (let index = 0; index < left.length; index++)\n\t\t\tif (!equalTrustedJson(left[index]!, other[index]!)) return false;\n\t\treturn true;\n\t}\n\tconst other = right as Record<string, JsonValue>;\n\tconst keys = Object.keys(left);\n\tif (keys.length !== Object.keys(other).length) return false;\n\tfor (const key of keys) if (!Object.hasOwn(other, key) || !equalTrustedJson(left[key]!, other[key]!)) return false;\n\treturn true;\n}\n\nfunction abortContext(context: OverlayContext): void {\n\tif (context.status.value === \"aborted\" || context.status.value === \"consumed\" || context.status.value === \"stale\")\n\t\treturn;\n\tcontext.status.value = \"aborted\";\n\tclearContext(context);\n}\n\nfunction releaseOverlayReferences(context: OverlayContext): void {\n\tcontext.tracker.deref()?.releaseContext(context);\n\tif (locatedDenseArray?.context === context) locatedDenseArray = undefined;\n\tcontext.overlayReleased = true;\n\tcontext.dirty.length = 0;\n\tcontext.nodes.length = 0;\n\tcontext.rawNodes = undefined;\n\tcontext.ops = undefined;\n\tcontext.root = undefined;\n\tcontext.bases = undefined;\n\tcontext.stored = undefined;\n\tcontext.baseValue = undefined;\n}\n\nfunction clearContext(context: OverlayContext): void {\n\tcontext.tracker.deref()?.releaseContext(context);\n\tif (locatedDenseArray?.context === context) locatedDenseArray = undefined;\n\tfor (const node of context.nodes) {\n\t\tif (Array.isArray(node.target)) node.target.length = 0;\n\t\tReflect.deleteProperty(node.target, NODE);\n\t\tnode.writes?.clear();\n\t\tnode.deletes?.clear();\n\t\tnode.readded?.clear();\n\t\tif (node.array?.pieces !== undefined) node.array.pieces.length = 0;\n\t\tif (node.array !== undefined) {\n\t\t\tnode.array.root = undefined;\n\t\t\tnode.array.baseLocations = undefined;\n\t\t\tnode.array.insertLocations = undefined;\n\t\t}\n\t\tnode.array?.baseOverrides?.clear();\n\t\tnode.array?.insertOverrides?.clear();\n\t\tnode.parentSource = undefined;\n\t\tnode.target = RELEASED;\n\t\tnode.proxy = RELEASED;\n\t\tnode.writeKey = undefined;\n\t\tnode.writeValue = undefined;\n\t\tnode.writes = undefined;\n\t\tnode.deleteKey = undefined;\n\t\tnode.deletes = undefined;\n\t\tnode.readded = undefined;\n\t\tnode.array = undefined;\n\t\tnode.subtreeDirty = undefined;\n\t\tnode.preparedPath = undefined;\n\t}\n\tcontext.dirty.length = 0;\n\tcontext.nodes.length = 0;\n\tcontext.rawNodes = undefined;\n\tcontext.ops = undefined;\n\tcontext.root = undefined;\n\tcontext.bases = undefined;\n\tcontext.stored = undefined;\n\tcontext.baseValue = undefined;\n\tcontext.overlayReleased = true;\n}\n\nfunction isContainer(value: unknown): value is Container {\n\treturn value !== null && typeof value === \"object\";\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/facets/host.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAuC,MAAM,yBAAyB,CAAC;AAErG,OAAO,KAAK,EAEX,KAAK,EAEL,YAAY,EAOZ,MAAM,aAAa,CAAC;AAgUrB,kFAAkF;AAClF,qBAAa,WAAW;;IAavB,YAAY,OAAO,EAAE,YAAY,EAQhC;IAED,IAAI,QAAQ,IAAI,qBAAqB,CAGpC;IAsBK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAiC9B;IAEK,MAAM,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFpD;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAM7B;CAmRD","sourcesContent":["import { BACKGROUND_CONTEXT } from \"../context/index.ts\";\nimport { RemoteServiceBindingImpl } from \"../services/consumer.ts\";\nimport { ServiceSlot } from \"../services/handle.ts\";\nimport { InstanceDirectory, type InstanceDirectoryEntry } from \"../services/instances.ts\";\nimport { createLoopbackServiceTransport } from \"../services/loopback.ts\";\nimport { RemoteServiceProvider, validateRemoteServiceImplementation } from \"../services/provider.ts\";\nimport { MutableReplicatedStateImpl } from \"../services/state.ts\";\nimport type {\n\tContext,\n\tFacet,\n\tFacetEnvironment,\n\tFacetOptions,\n\tRemoteServiceContract,\n\tRemoteServiceSource,\n\tRemoteServices,\n\tService,\n\tServiceMode,\n\tServiceSpawner,\n} from \"../types.ts\";\n\ninterface FacetServiceReference {\n\treadonly serviceId: string;\n\treadonly service: Service<unknown>;\n\treadonly mode: ServiceMode;\n}\n\ninterface ExternalService {\n\treadonly service: Service<unknown>;\n\treadonly mode: ServiceMode;\n\treadonly source: RemoteServiceSource;\n}\n\ninterface FacetShape {\n\tfacetId: string;\n\trequires: readonly FacetServiceReference[];\n\tprovides: readonly FacetServiceReference[];\n}\n\ninterface FacetRuntime extends FacetShape {\n\trequires: FacetServiceReference[];\n\tprovides: FacetServiceReference[];\n\treadonly lifecycle: FacetLifecycle;\n\treadonly provisions: FacetProvision[];\n\treadonly singletonViews: Map<string, unknown>;\n}\n\ntype LifecycleState = \"setting_up\" | \"prepared\" | \"active\" | \"disposing\" | \"dead\";\ntype GenerationPhase =\n\t| \"setup\"\n\t| \"assembling\"\n\t| \"connecting\"\n\t| \"activating\"\n\t| \"active\"\n\t| \"reloading\"\n\t| \"disposing\"\n\t| \"dead\";\ntype Disposal = () => void | Promise<void>;\n\nclass FacetLifecycle {\n\treadonly id: string;\n\treadonly #effects: Disposal[] = [];\n\treadonly #observations: Array<() => Disposal> = [];\n\treadonly #activate: Array<() => void | Promise<void>> = [];\n\t#state: LifecycleState = \"setting_up\";\n\t#serviceAccess = false;\n\n\tconstructor(id: string) {\n\t\tthis.id = id;\n\t}\n\n\tassertSettingUp(operation: string): void {\n\t\tif (this.#state !== \"setting_up\") {\n\t\t\tthrow new Error(`Facet ${this.id} can ${operation} only during setup`);\n\t\t}\n\t}\n\n\tassertRunning(operation: string): void {\n\t\tif (this.#state !== \"setting_up\" && this.#state !== \"active\") {\n\t\t\tthrow new Error(`Facet ${this.id} cannot ${operation} while ${this.#state}`);\n\t\t}\n\t}\n\n\tassertActive(operation: string): void {\n\t\tif (this.#state !== \"active\") throw new Error(`Facet ${this.id} can ${operation} only while active`);\n\t}\n\n\tassertServiceAccess(): void {\n\t\tif (!this.#serviceAccess) {\n\t\t\tthrow new Error(`Facet ${this.id} service handles cannot be used while ${this.#state}`);\n\t\t}\n\t}\n\n\trevoke(): void {\n\t\tthis.#serviceAccess = false;\n\t}\n\n\town(disposal: Disposal): void {\n\t\tthis.assertRunning(\"own resources\");\n\t\tthis.#effects.push(disposal);\n\t}\n\n\tobserve(start: () => Disposal): void {\n\t\tthis.assertSettingUp(\"observe services\");\n\t\tthis.#observations.push(start);\n\t}\n\n\tonActivate(callback: () => void | Promise<void>): void {\n\t\tthis.assertSettingUp(\"register activation callbacks\");\n\t\tthis.#activate.push(callback);\n\t}\n\n\tprepared(): void {\n\t\tthis.assertSettingUp(\"finish setup\");\n\t\tthis.#state = \"prepared\";\n\t}\n\n\tasync activate(): Promise<void> {\n\t\tif (this.#state !== \"prepared\") throw new Error(`Facet ${this.id} is not prepared`);\n\t\tthis.#state = \"active\";\n\t\tthis.#serviceAccess = true;\n\t\tfor (const start of this.#observations) this.#effects.push(start());\n\t\tfor (const callback of this.#activate) await callback();\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (this.#state === \"dead\") return;\n\t\tthis.#state = \"disposing\";\n\t\tconst errors: unknown[] = [];\n\t\tfor (const effect of this.#effects.splice(0).reverse()) {\n\t\t\ttry {\n\t\t\t\tawait effect();\n\t\t\t} catch (error) {\n\t\t\t\terrors.push(error);\n\t\t\t}\n\t\t}\n\t\tthis.#observations.length = 0;\n\t\tthis.#activate.length = 0;\n\t\tthis.#serviceAccess = false;\n\t\tthis.#state = \"dead\";\n\t\tif (errors.length === 1) throw errors[0];\n\t\tif (errors.length > 1) throw new AggregateError(errors, `Failed to dispose facet ${this.id}`);\n\t}\n}\n\ninterface KeyedServiceSource {\n\tobserve<T>(service: Service<T>, handler: (service: T, context: Context) => void | Promise<void>): () => void;\n}\n\ninterface LocalKeyedRegistration {\n\treadonly generations: Map<string, number>;\n\treadonly directory: InstanceDirectory<InstanceDirectoryEntry>;\n}\n\nclass LocalKeyedServiceRegistry implements KeyedServiceSource {\n\treadonly #registrations = new Map<string, LocalKeyedRegistration>();\n\t#disposed = false;\n\n\tconstructor(services: readonly { readonly id: string }[], onError: (error: Error) => void) {\n\t\tconst ids = services.map(({ id }) => id);\n\t\tif (new Set(ids).size !== ids.length) throw new TypeError(\"Local keyed service registry has duplicate IDs\");\n\t\tfor (const serviceId of ids) {\n\t\t\tthis.#registrations.set(serviceId, {\n\t\t\t\tgenerations: new Map(),\n\t\t\t\tdirectory: new InstanceDirectory({ ready: true, onError }),\n\t\t\t});\n\t\t}\n\t}\n\n\tspawn<T>(service: Service<T>, key: string, implementation: T): () => void {\n\t\tthis.#assertActive();\n\t\tif (key.length === 0) throw new TypeError(\"Local service instance key must not be empty\");\n\t\tif (typeof implementation !== \"object\" || implementation === null || Array.isArray(implementation)) {\n\t\t\tthrow new TypeError(`Local service ${service.id} implementation must be an object`);\n\t\t}\n\t\tconst registration = this.#registration(service.id);\n\t\tif (registration.directory.get(key) !== undefined) {\n\t\t\tthrow new Error(`Local service ${service.id} already has a live instance with key ${key}`);\n\t\t}\n\t\tconst generation = (registration.generations.get(key) ?? 0) + 1;\n\t\tregistration.generations.set(key, generation);\n\t\tconst instance: InstanceDirectoryEntry = {\n\t\t\tkey,\n\t\t\tgeneration,\n\t\t\tservice: implementation as object,\n\t\t\tdeactivate() {},\n\t\t};\n\t\tregistration.directory.insert(instance);\n\t\tlet closed = false;\n\t\treturn () => {\n\t\t\tif (closed) return;\n\t\t\tclosed = true;\n\t\t\tregistration.directory.remove(instance);\n\t\t};\n\t}\n\n\tobserve<T>(service: Service<T>, handler: (service: T, context: Context) => void | Promise<void>): () => void {\n\t\tthis.#assertActive();\n\t\treturn this.#registration(service.id).directory.observe(handler);\n\t}\n\n\tdispose(): void {\n\t\tif (this.#disposed) return;\n\t\tthis.#disposed = true;\n\t\tfor (const registration of this.#registrations.values()) registration.directory.dispose();\n\t\tthis.#registrations.clear();\n\t}\n\n\t#registration(serviceId: string): LocalKeyedRegistration {\n\t\tconst registration = this.#registrations.get(serviceId);\n\t\tif (registration === undefined) throw new Error(`Local keyed service ${serviceId} is not registered`);\n\t\treturn registration;\n\t}\n\n\t#assertActive(): void {\n\t\tif (this.#disposed) throw new Error(\"Local keyed service registry is disposed\");\n\t}\n}\n\nclass HostServiceSlots {\n\treadonly #singletons = new Map<string, ServiceSlot>();\n\treadonly #keyedSources = new Map<string, KeyedServiceSource>();\n\n\tgetSingleton<T>(service: Service<T>, assertAccess: () => void): T {\n\t\tlet slot = this.#singletons.get(service.id);\n\t\tif (slot === undefined) {\n\t\t\tslot = new ServiceSlot(service.id, !service.local);\n\t\t\tthis.#singletons.set(service.id, slot);\n\t\t}\n\t\treturn slot.view<T>(assertAccess);\n\t}\n\n\thasSingleton(serviceId: string): boolean {\n\t\treturn this.#singletons.has(serviceId);\n\t}\n\n\tobserve<T>(\n\t\tservice: Service<T>,\n\t\tassertAccess: () => void,\n\t\thandler: (service: T, context: Context) => void | Promise<void>,\n\t): Disposal {\n\t\tconst source = this.#keyedSources.get(service.id);\n\t\tif (source === undefined) throw new Error(`Service ${service.id} is disconnected`);\n\t\tlet stopped = false;\n\t\tconst stop = source.observe(service, (target, context) => {\n\t\t\tconst slot = new ServiceSlot(service.id, !service.local);\n\t\t\tslot.bind(target as object);\n\t\t\treturn handler(\n\t\t\t\tslot.view<T>(() => {\n\t\t\t\t\tassertAccess();\n\t\t\t\t\tif (stopped || context.abortSignal?.aborted) {\n\t\t\t\t\t\tthrow new Error(`Keyed service ${service.id} observation is closed`);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tcontext,\n\t\t\t);\n\t\t});\n\t\treturn () => {\n\t\t\tif (stopped) return;\n\t\t\tstopped = true;\n\t\t\tstop();\n\t\t};\n\t}\n\n\tbindSingleton(serviceId: string, target: object): void {\n\t\tthis.#singletons.get(serviceId)?.bind(target);\n\t}\n\n\tbindKeyed(serviceId: string, services: KeyedServiceSource): void {\n\t\tthis.#keyedSources.set(serviceId, services);\n\t}\n\n\tdispose(): void {\n\t\tfor (const slot of this.#singletons.values()) slot.unbind();\n\t\tthis.#singletons.clear();\n\t\tthis.#keyedSources.clear();\n\t}\n}\n\ntype ServiceInstanceInstaller<T> = (key: string, implementation: T) => () => void;\n\ninterface StagedServiceInstance<T> {\n\treadonly key: string;\n\treadonly implementation: T;\n\trelease?: () => void;\n}\n\nclass StagedServiceSpawner<T> implements ServiceSpawner<T> {\n\treadonly #lifecycle: FacetLifecycle;\n\treadonly #validate: (key: string, implementation: T) => void;\n\treadonly #instances = new Map<string, StagedServiceInstance<T>>();\n\t#installer: ServiceInstanceInstaller<T> | undefined;\n\n\tconstructor(lifecycle: FacetLifecycle, validate: (key: string, implementation: T) => void) {\n\t\tthis.#lifecycle = lifecycle;\n\t\tthis.#validate = validate;\n\t}\n\n\tconnect(installer: ServiceInstanceInstaller<T>): void {\n\t\tif (this.#installer !== undefined) throw new Error(\"Facet service provider is already connected\");\n\t\tthis.#installer = installer;\n\t\tfor (const instance of this.#instances.values()) {\n\t\t\tinstance.release = installer(instance.key, instance.implementation);\n\t\t}\n\t}\n\n\tspawn(key: string, implementation: T): () => void {\n\t\tthis.#lifecycle.assertActive(\"spawn service instances\");\n\t\tthis.#validate(key, implementation);\n\t\tif (this.#instances.has(key)) throw new Error(`Facet service already has a live instance with key ${key}`);\n\t\tconst instance: StagedServiceInstance<T> = { key, implementation };\n\t\tthis.#instances.set(key, instance);\n\t\tif (this.#installer !== undefined) instance.release = this.#installer(key, implementation);\n\t\tconst close = (): void => {\n\t\t\tif (this.#instances.get(key) !== instance) return;\n\t\t\tthis.#instances.delete(key);\n\t\t\tinstance.release?.();\n\t\t};\n\t\tthis.#lifecycle.own(close);\n\t\treturn close;\n\t}\n}\n\ntype FacetProvision =\n\t| {\n\t\t\treadonly kind: \"singleton\";\n\t\t\treadonly service: { readonly id: string; readonly local: boolean };\n\t\t\treadonly implementation: object;\n\t\t\tinstall(provider: RemoteServiceProvider): void;\n\t\t\tvalidateReplacement(provider: RemoteServiceProvider): void;\n\t\t\treplace(provider: RemoteServiceProvider): void;\n\t }\n\t| {\n\t\t\treadonly kind: \"keyed\";\n\t\t\treadonly service: { readonly id: string; readonly local: boolean };\n\t\t\tconnectLocal(registry: LocalKeyedServiceRegistry): void;\n\t\t\tconnectRemote(provider: RemoteServiceProvider): void;\n\t };\n\n/** Private lifecycle and dependency kernel behind the atomic host entry point. */\nexport class FacetKernel {\n\treadonly #initialFacets: readonly Facet[];\n\treadonly #serviceSources: readonly RemoteServiceSource[];\n\treadonly #onError: (error: Error) => void;\n\treadonly #facets = new Map<string, FacetRuntime>();\n\treadonly #serviceSlots: HostServiceSlots;\n\treadonly #sourceBindings = new Map<RemoteServiceSource, RemoteServices>();\n\t#activationOrder: readonly string[] = [];\n\t#provider: RemoteServiceProvider | undefined;\n\t#internalServices: RemoteServices | undefined;\n\t#localKeyedServices: LocalKeyedServiceRegistry | undefined;\n\t#phase: GenerationPhase = \"setup\";\n\n\tconstructor(options: FacetOptions) {\n\t\tconst ids = options.facets.map((facet) => facet.id);\n\t\tif (ids.some((id) => id.length === 0)) throw new Error(\"Facet ID must not be empty\");\n\t\tif (new Set(ids).size !== ids.length) throw new Error(\"Facet IDs must be unique within a generation\");\n\t\tthis.#initialFacets = options.facets;\n\t\tthis.#serviceSources = options.serviceSources ?? [];\n\t\tthis.#onError = options.onError ?? (() => {});\n\t\tthis.#serviceSlots = new HostServiceSlots();\n\t}\n\n\tget provider(): RemoteServiceProvider {\n\t\tif (this.#provider === undefined) throw new Error(\"Facet service provider is not assembled\");\n\t\treturn this.#provider;\n\t}\n\n\t#createFacetRuntime(facetId: string): FacetRuntime {\n\t\treturn {\n\t\t\tfacetId,\n\t\t\trequires: [],\n\t\t\tprovides: [],\n\t\t\tlifecycle: new FacetLifecycle(facetId),\n\t\t\tprovisions: [],\n\t\t\tsingletonViews: new Map(),\n\t\t};\n\t}\n\n\t#setupFacet(facet: Facet, record: FacetRuntime): void {\n\t\tconst result: unknown = facet.setup(this.#environment(record));\n\t\tif (isPromiseLike(result)) {\n\t\t\tvoid Promise.resolve(result).catch(() => {});\n\t\t\tthrow new Error(`Facet ${facet.id} setup must be synchronous`);\n\t\t}\n\t\trecord.lifecycle.prepared();\n\t}\n\n\tasync activate(): Promise<void> {\n\t\tconst records: FacetRuntime[] = [];\n\t\ttry {\n\t\t\tfor (const facet of this.#initialFacets) {\n\t\t\t\tconst record = this.#createFacetRuntime(facet.id);\n\t\t\t\tthis.#facets.set(facet.id, record);\n\t\t\t\tthis.#setupFacet(facet, record);\n\t\t\t\trecords.push(record);\n\t\t\t}\n\n\t\t\tthis.#phase = \"assembling\";\n\t\t\tconst externalServices = await this.#resolveExternalServices(records);\n\t\t\tthis.#activationOrder = validateFacets(records, externalServices);\n\t\t\tthis.#assembleProviders();\n\t\t\tthis.#bindServices(externalServices);\n\n\t\t\tthis.#phase = \"connecting\";\n\t\t\tawait Promise.all(\n\t\t\t\t[...this.#sourceBindings.values(), this.#internalServiceBinding].map((services) =>\n\t\t\t\t\tservices.ready(BACKGROUND_CONTEXT),\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tthis.#phase = \"activating\";\n\t\t\tfor (const id of this.#activationOrder) await this.#facets.get(id)!.lifecycle.activate();\n\t\t\tthis.#phase = \"active\";\n\t\t} catch (error) {\n\t\t\tconst cleanupErrors = await this.#terminate();\n\t\t\tif (cleanupErrors.length > 0) {\n\t\t\t\tthrow new AggregateError([error, ...cleanupErrors], \"Facet generation startup and cleanup failed\");\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync reload(facets: readonly Facet[]): Promise<void> {\n\t\tif (this.#phase !== \"active\") throw new Error(`Facet host cannot reload while ${this.#phase}`);\n\t\tconst ids = facets.map(({ id }) => id);\n\t\tif (ids.some((id) => id.length === 0)) throw new Error(\"Facet ID must not be empty\");\n\t\tif (new Set(ids).size !== ids.length) throw new Error(\"Reloaded facet IDs must be unique\");\n\t\tfor (const id of ids) {\n\t\t\tif (!this.#facets.has(id)) throw new Error(`Facet ${id} is not active`);\n\t\t}\n\t\tthis.#phase = \"reloading\";\n\n\t\tconst staged: FacetRuntime[] = [];\n\t\tconst candidates: FacetRuntime[] = [];\n\t\ttry {\n\t\t\tfor (const facet of facets) {\n\t\t\t\tconst record = this.#createFacetRuntime(facet.id);\n\t\t\t\tstaged.push(record);\n\t\t\t\tthis.#setupFacet(facet, record);\n\t\t\t\tconst previous = this.#facets.get(facet.id)!;\n\t\t\t\tif (!sameFacetShape(previous, record)) {\n\t\t\t\t\tthrow new Error(`Reloaded facet ${facet.id} must preserve its service requirements and provisions`);\n\t\t\t\t}\n\t\t\t\tthis.#validateReplacementProvisions(record.provisions);\n\t\t\t\tcandidates.push(record);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst cleanupErrors = await disposeFacetRecords(staged.reverse());\n\t\t\tif (cleanupErrors.length > 0) {\n\t\t\t\tconst abortErrors = await this.#abort();\n\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t[error, ...cleanupErrors, ...abortErrors],\n\t\t\t\t\t\"Facet reload setup and cleanup failed\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.#phase = \"active\";\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst replacements = new Map(candidates.map((record) => [record.facetId, record]));\n\t\tconst candidateOrder = this.#activationOrder.flatMap((id) => {\n\t\t\tconst candidate = replacements.get(id);\n\t\t\treturn candidate === undefined ? [] : [candidate];\n\t\t});\n\t\ttry {\n\t\t\tfor (const candidate of candidateOrder) await candidate.lifecycle.activate();\n\t\t\tfor (const candidate of candidateOrder) this.#validateReplacementProvisions(candidate.provisions);\n\t\t} catch (error) {\n\t\t\tconst cleanupErrors = await disposeFacetRecords([...candidateOrder].reverse());\n\t\t\tif (cleanupErrors.length > 0) {\n\t\t\t\tconst abortErrors = await this.#abort();\n\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t[error, ...cleanupErrors, ...abortErrors],\n\t\t\t\t\t\"Facet reload activation and cleanup failed\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.#phase = \"active\";\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst previous = candidateOrder.map(({ facetId }) => this.#facets.get(facetId)!);\n\t\tfor (const candidate of candidateOrder) this.#facets.set(candidate.facetId, candidate);\n\t\ttry {\n\t\t\tfor (const candidate of candidateOrder) {\n\t\t\t\tfor (const provision of candidate.provisions) {\n\t\t\t\t\tif (provision.kind !== \"singleton\") continue;\n\t\t\t\t\tif (provision.service.local) {\n\t\t\t\t\t\tthis.#serviceSlots.bindSingleton(provision.service.id, provision.implementation);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprovision.replace(this.provider);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst retirementErrors = await disposeFacetRecords(previous.reverse());\n\t\t\tif (retirementErrors.length === 1) throw retirementErrors[0];\n\t\t\tif (retirementErrors.length > 1) {\n\t\t\t\tthrow new AggregateError(retirementErrors, \"Failed to retire replaced facets\");\n\t\t\t}\n\t\t\tfor (const candidate of candidateOrder) {\n\t\t\t\tfor (const provision of candidate.provisions) {\n\t\t\t\t\tif (provision.kind !== \"keyed\") continue;\n\t\t\t\t\tif (provision.service.local) provision.connectLocal(this.#localKeyedRegistry);\n\t\t\t\t\telse provision.connectRemote(this.provider);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst abortErrors = await this.#abort(previous);\n\t\t\tthrow new AggregateError([error, ...abortErrors], \"Facet reload failed after cutover\");\n\t\t}\n\t\tthis.#phase = \"active\";\n\t}\n\n\tasync dispose(): Promise<void> {\n\t\tif (this.#phase === \"dead\") return;\n\t\tif (this.#phase !== \"active\") throw new Error(`Facet host cannot be disposed while ${this.#phase}`);\n\t\tconst errors = await this.#terminate();\n\t\tif (errors.length === 1) throw errors[0];\n\t\tif (errors.length > 1) throw new AggregateError(errors, \"Failed to dispose facet generation\");\n\t}\n\n\t#validateReplacementProvisions(provisions: readonly FacetProvision[]): void {\n\t\tfor (const provision of provisions) {\n\t\t\tif (provision.kind !== \"singleton\" || provision.service.local) continue;\n\t\t\tprovision.validateReplacement(this.provider);\n\t\t}\n\t}\n\n\t#environment(runtime: FacetRuntime): FacetEnvironment {\n\t\tconst { lifecycle, provisions } = runtime;\n\t\treturn {\n\t\t\tprovide: <T>(service: Service<T>, implementation: NoInfer<T>): void => {\n\t\t\t\tlifecycle.assertSettingUp(\"provide services\");\n\t\t\t\tif (typeof implementation !== \"object\" || implementation === null || Array.isArray(implementation)) {\n\t\t\t\t\tthrow new TypeError(`Service ${service.id} implementation must be an object`);\n\t\t\t\t}\n\t\t\t\trecordServiceReference(runtime.provides, service, \"singleton\");\n\t\t\t\tprovisions.push({\n\t\t\t\t\tkind: \"singleton\",\n\t\t\t\t\tservice,\n\t\t\t\t\timplementation,\n\t\t\t\t\tinstall: (provider) => provider.provide(service, implementation as NoInfer<RemoteServiceContract<T>>),\n\t\t\t\t\tvalidateReplacement: (provider) =>\n\t\t\t\t\t\tprovider.validateReplacement(service, implementation as NoInfer<RemoteServiceContract<T>>),\n\t\t\t\t\treplace: (provider) => provider.replace(service, implementation as NoInfer<RemoteServiceContract<T>>),\n\t\t\t\t});\n\t\t\t},\n\t\t\tprovideMany: <T>(service: Service<T>): ServiceSpawner<T> => {\n\t\t\t\tlifecycle.assertSettingUp(\"provide service instances\");\n\t\t\t\trecordServiceReference(runtime.provides, service, \"keyed\");\n\t\t\t\tconst instances = new StagedServiceSpawner<T>(lifecycle, (key, implementation) => {\n\t\t\t\t\tif (key.length === 0) throw new TypeError(\"Facet service instance key must not be empty\");\n\t\t\t\t\tif (typeof implementation !== \"object\" || implementation === null || Array.isArray(implementation)) {\n\t\t\t\t\t\tthrow new TypeError(`Facet service ${service.id} implementation must be an object`);\n\t\t\t\t\t}\n\t\t\t\t\tif (!service.local) validateRemoteServiceImplementation(service.id, implementation);\n\t\t\t\t});\n\t\t\t\tprovisions.push({\n\t\t\t\t\tkind: \"keyed\",\n\t\t\t\t\tservice,\n\t\t\t\t\tconnectLocal: (registry) =>\n\t\t\t\t\t\tinstances.connect((key, implementation) => registry.spawn(service, key, implementation)),\n\t\t\t\t\tconnectRemote: (provider) =>\n\t\t\t\t\t\tinstances.connect((key, implementation) =>\n\t\t\t\t\t\t\tprovider.spawn(service, key, implementation as NoInfer<RemoteServiceContract<T>>),\n\t\t\t\t\t\t),\n\t\t\t\t});\n\t\t\t\treturn instances;\n\t\t\t},\n\t\t\tuse: <T>(service: Service<T>): T => {\n\t\t\t\tlifecycle.assertSettingUp(\"acquire services\");\n\t\t\t\trecordServiceReference(runtime.requires, service, \"singleton\");\n\t\t\t\tlet view = runtime.singletonViews.get(service.id);\n\t\t\t\tif (view === undefined) {\n\t\t\t\t\tview = this.#serviceSlots.getSingleton<T>(service, () => lifecycle.assertServiceAccess());\n\t\t\t\t\truntime.singletonViews.set(service.id, view);\n\t\t\t\t}\n\t\t\t\treturn view as T;\n\t\t\t},\n\t\t\tobserve: <T>(service: Service<T>, handler: (service: T, context: Context) => void | Promise<void>): void => {\n\t\t\t\tlifecycle.assertSettingUp(\"observe services\");\n\t\t\t\trecordServiceReference(runtime.requires, service, \"keyed\");\n\t\t\t\tlifecycle.observe(() =>\n\t\t\t\t\tthis.#serviceSlots.observe(service, () => lifecycle.assertServiceAccess(), handler),\n\t\t\t\t);\n\t\t\t},\n\t\t\treplicatedState: <T extends object>(initial: T) => {\n\t\t\t\tlifecycle.assertRunning(\"create replicated state\");\n\t\t\t\treturn new MutableReplicatedStateImpl(initial);\n\t\t\t},\n\t\t\town: (disposal) => lifecycle.own(disposal),\n\t\t\tonActivate: (callback) => lifecycle.onActivate(callback),\n\t\t\tonDeactivate: (callback) => lifecycle.own(callback),\n\t\t};\n\t}\n\n\tasync #resolveExternalServices(records: readonly FacetShape[]): Promise<ReadonlyMap<string, ExternalService>> {\n\t\tconst catalogues = await Promise.all(\n\t\t\tthis.#serviceSources.map(async (source) => ({\n\t\t\t\tsource,\n\t\t\t\tentries: await source.catalogue(BACKGROUND_CONTEXT),\n\t\t\t})),\n\t\t);\n\t\tconst offered = new Map<string, { readonly mode: ServiceMode; readonly source: RemoteServiceSource }>();\n\t\tfor (const { source, entries } of catalogues) {\n\t\t\tfor (const { serviceId, mode } of entries) {\n\t\t\t\tif (offered.has(serviceId)) {\n\t\t\t\t\tthrow new Error(`Facet host service ${serviceId} is offered by more than one source`);\n\t\t\t\t}\n\t\t\t\toffered.set(serviceId, { mode, source });\n\t\t\t}\n\t\t}\n\n\t\tconst local = new Set(records.flatMap(({ provides }) => provides.map(({ serviceId }) => serviceId)));\n\t\tconst external = new Map<string, ExternalService>();\n\t\tfor (const { requires } of records) {\n\t\t\tfor (const requirement of requires) {\n\t\t\t\tif (local.has(requirement.serviceId) || external.has(requirement.serviceId)) continue;\n\t\t\t\tlet source = offered.get(requirement.serviceId);\n\t\t\t\tif (source === undefined) {\n\t\t\t\t\tconst deferred = this.#serviceSources.filter(\n\t\t\t\t\t\t({ acceptsUnavailableServices }) => acceptsUnavailableServices,\n\t\t\t\t\t);\n\t\t\t\t\tif (deferred.length > 1) {\n\t\t\t\t\t\tthrow new Error(`Facet host service ${requirement.serviceId} has more than one deferred source`);\n\t\t\t\t\t}\n\t\t\t\t\tif (deferred.length === 1) source = { mode: requirement.mode, source: deferred[0]! };\n\t\t\t\t}\n\t\t\t\tif (source !== undefined) {\n\t\t\t\t\texternal.set(requirement.serviceId, { ...source, service: requirement.service });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst serviceIdsBySource = new Map<RemoteServiceSource, string[]>();\n\t\tfor (const [serviceId, { source }] of external) {\n\t\t\tlet serviceIds = serviceIdsBySource.get(source);\n\t\t\tif (serviceIds === undefined) {\n\t\t\t\tserviceIds = [];\n\t\t\t\tserviceIdsBySource.set(source, serviceIds);\n\t\t\t}\n\t\t\tserviceIds.push(serviceId);\n\t\t}\n\t\tfor (const [source, serviceIds] of serviceIdsBySource) {\n\t\t\tthis.#sourceBindings.set(\n\t\t\t\tsource,\n\t\t\t\tsource.open({\n\t\t\t\t\tservices: serviceIds.map((id) => ({ id })),\n\t\t\t\t\tassertAccess: () => this.#assertServiceTargetAccess(),\n\t\t\t\t\tonError: this.#onError,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\treturn external;\n\t}\n\n\t#assembleProviders(): void {\n\t\tconst provisions = this.#provisions();\n\t\tconst remoteProvisions = provisions.filter(({ service }) => !service.local);\n\t\tconst provider = new RemoteServiceProvider(\n\t\t\tremoteProvisions.map(({ service, kind }) => ({ service, mode: kind })),\n\t\t);\n\t\tconst internalServices = new RemoteServiceBindingImpl({\n\t\t\tservices: remoteProvisions.map(({ service }) => service),\n\t\t\ttransport: createLoopbackServiceTransport(provider),\n\t\t\tassertAccess: () => this.#assertServiceTargetAccess(),\n\t\t\tonError: this.#onError,\n\t\t});\n\t\tconst localKeyedServices = new LocalKeyedServiceRegistry(\n\t\t\tprovisions.flatMap((provision) =>\n\t\t\t\tprovision.kind === \"keyed\" && provision.service.local ? [provision.service] : [],\n\t\t\t),\n\t\t\tthis.#onError,\n\t\t);\n\t\tthis.#provider = provider;\n\t\tthis.#internalServices = internalServices;\n\t\tthis.#localKeyedServices = localKeyedServices;\n\t\tfor (const provision of provisions) {\n\t\t\tif (provision.kind === \"singleton\") {\n\t\t\t\tif (!provision.service.local) provision.install(provider);\n\t\t\t} else if (provision.service.local) {\n\t\t\t\tprovision.connectLocal(localKeyedServices);\n\t\t\t} else {\n\t\t\t\tprovision.connectRemote(provider);\n\t\t\t}\n\t\t}\n\t}\n\n\t#bindServices(externalServices: ReadonlyMap<string, ExternalService>): void {\n\t\tfor (const provision of this.#provisions()) {\n\t\t\tif (provision.kind === \"singleton\") {\n\t\t\t\tif (!this.#serviceSlots.hasSingleton(provision.service.id)) continue;\n\t\t\t\tconst target = provision.service.local\n\t\t\t\t\t? provision.implementation\n\t\t\t\t\t: (this.#internalServiceBinding.use(provision.service) as object);\n\t\t\t\tthis.#serviceSlots.bindSingleton(provision.service.id, target);\n\t\t\t} else {\n\t\t\t\tthis.#serviceSlots.bindKeyed(\n\t\t\t\t\tprovision.service.id,\n\t\t\t\t\tprovision.service.local ? this.#localKeyedRegistry : this.#internalServiceBinding,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tfor (const [serviceId, { service, mode, source }] of externalServices) {\n\t\t\tconst services = this.#sourceBindings.get(source);\n\t\t\tif (services === undefined) throw new Error(`Service source for ${serviceId} is not open`);\n\t\t\tif (mode === \"singleton\") {\n\t\t\t\tthis.#serviceSlots.bindSingleton(serviceId, services.use(service) as object);\n\t\t\t} else {\n\t\t\t\tthis.#serviceSlots.bindKeyed(serviceId, services);\n\t\t\t}\n\t\t}\n\t}\n\n\t#provisions(): FacetProvision[] {\n\t\treturn [...this.#facets.values()].flatMap(({ provisions }) => provisions);\n\t}\n\n\tget #localKeyedRegistry(): LocalKeyedServiceRegistry {\n\t\tif (this.#localKeyedServices === undefined) throw new Error(\"Facet keyed services are not assembled\");\n\t\treturn this.#localKeyedServices;\n\t}\n\n\tget #internalServiceBinding(): RemoteServices {\n\t\tif (this.#internalServices === undefined) throw new Error(\"Facet remote services are not assembled\");\n\t\treturn this.#internalServices;\n\t}\n\n\tasync #disposeServiceBindings(): Promise<unknown[]> {\n\t\tconst bindings = [...this.#sourceBindings.values()];\n\t\tthis.#sourceBindings.clear();\n\t\tif (this.#internalServices !== undefined) bindings.push(this.#internalServices);\n\t\tthis.#internalServices = undefined;\n\t\tconst results = await Promise.allSettled(bindings.map((services) => services.dispose(BACKGROUND_CONTEXT)));\n\t\treturn results.flatMap((result) => (result.status === \"rejected\" ? [result.reason] : []));\n\t}\n\n\t#assertServiceTargetAccess(): void {\n\t\tif (\n\t\t\tthis.#phase !== \"activating\" &&\n\t\t\tthis.#phase !== \"active\" &&\n\t\t\tthis.#phase !== \"reloading\" &&\n\t\t\tthis.#phase !== \"disposing\"\n\t\t) {\n\t\t\tthrow new Error(`Facet service targets cannot be used during ${this.#phase}`);\n\t\t}\n\t}\n\n\tasync #abort(extraRecords: readonly FacetRuntime[] = []): Promise<unknown[]> {\n\t\tfor (const record of this.#facets.values()) record.lifecycle.revoke();\n\t\tfor (const record of extraRecords) record.lifecycle.revoke();\n\t\treturn this.#terminate(extraRecords);\n\t}\n\n\tasync #terminate(extraRecords: readonly FacetRuntime[] = []): Promise<unknown[]> {\n\t\tthis.#phase = \"disposing\";\n\t\tconst errors = await this.#disposeLifecycles();\n\t\terrors.push(...(await disposeFacetRecords([...extraRecords].reverse())));\n\t\ttry {\n\t\t\tthis.#localKeyedServices?.dispose();\n\t\t} catch (error) {\n\t\t\terrors.push(error);\n\t\t}\n\t\tthis.#localKeyedServices = undefined;\n\t\terrors.push(...(await this.#disposeServiceBindings()));\n\t\ttry {\n\t\t\tthis.#serviceSlots.dispose();\n\t\t} catch (error) {\n\t\t\terrors.push(error);\n\t\t}\n\t\ttry {\n\t\t\tthis.#provider?.dispose();\n\t\t} catch (error) {\n\t\t\terrors.push(error);\n\t\t}\n\t\tthis.#phase = \"dead\";\n\t\treturn errors;\n\t}\n\n\tasync #disposeLifecycles(): Promise<unknown[]> {\n\t\tconst errors: unknown[] = [];\n\t\tconst order =\n\t\t\tthis.#activationOrder.length > 0 ? [...this.#activationOrder].reverse() : [...this.#facets.keys()].reverse();\n\t\tfor (const id of order) {\n\t\t\tconst record = this.#facets.get(id);\n\t\t\tif (record === undefined) continue;\n\t\t\tthis.#facets.delete(id);\n\t\t\ttry {\n\t\t\t\tawait record.lifecycle.dispose();\n\t\t\t} catch (error) {\n\t\t\t\terrors.push(error);\n\t\t\t}\n\t\t}\n\t\treturn errors;\n\t}\n}\n\nasync function disposeFacetRecords(records: readonly FacetRuntime[]): Promise<unknown[]> {\n\tconst errors: unknown[] = [];\n\tfor (const record of records) {\n\t\ttry {\n\t\t\tawait record.lifecycle.dispose();\n\t\t} catch (error) {\n\t\t\terrors.push(error);\n\t\t}\n\t}\n\treturn errors;\n}\n\nfunction validateFacets(\n\trecords: readonly FacetShape[],\n\texternalServices: ReadonlyMap<string, { readonly mode: ServiceMode }>,\n): string[] {\n\tconst providers = new Map<\n\t\tstring,\n\t\t{ readonly facetId: string | undefined; readonly mode: ServiceMode | undefined }\n\t>();\n\tfor (const [serviceId, { mode }] of externalServices) providers.set(serviceId, { facetId: undefined, mode });\n\tfor (const record of records) {\n\t\tfor (const provision of record.provides) {\n\t\t\tconst existing = providers.get(provision.serviceId);\n\t\t\tif (existing !== undefined) {\n\t\t\t\tif (existing.mode !== undefined && existing.mode !== provision.mode) {\n\t\t\t\t\tthrow new Error(`Service ${provision.serviceId} is provided as both singleton and keyed`);\n\t\t\t\t}\n\t\t\t\tif (existing.facetId === undefined) {\n\t\t\t\t\tthrow new Error(`Service ${provision.serviceId} is provided by both the host and ${record.facetId}`);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Service ${provision.serviceId} is provided by both ${existing.facetId} and ${record.facetId}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tproviders.set(provision.serviceId, { facetId: record.facetId, mode: provision.mode });\n\t\t}\n\t}\n\n\tconst dependencies = new Map(records.map((record) => [record.facetId, new Set<string>()]));\n\tconst dependents = new Map(records.map((record) => [record.facetId, new Set<string>()]));\n\tfor (const record of records) {\n\t\tfor (const requirement of record.requires) {\n\t\t\tconst provider = providers.get(requirement.serviceId);\n\t\t\tif (provider === undefined) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Facet ${record.facetId} requires local/${requirement.serviceId}/${requirement.mode}, but no facet provides it`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (provider.mode !== undefined && provider.mode !== requirement.mode) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Facet ${record.facetId} requires ${requirement.serviceId} as ${requirement.mode}, but ${provider.facetId ?? \"the host\"} provides it as ${provider.mode}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (provider.facetId === undefined || provider.facetId === record.facetId) continue;\n\t\t\tdependencies.get(record.facetId)!.add(provider.facetId);\n\t\t\tdependents.get(provider.facetId)!.add(record.facetId);\n\t\t}\n\t}\n\treturn topologicalOrder(records, dependencies, dependents);\n}\n\nfunction topologicalOrder(\n\trecords: readonly FacetShape[],\n\tdependencies: ReadonlyMap<string, ReadonlySet<string>>,\n\tdependents: ReadonlyMap<string, ReadonlySet<string>>,\n): string[] {\n\tconst remaining = new Map([...dependencies].map(([id, values]) => [id, values.size]));\n\tconst ready = records.map((record) => record.facetId).filter((id) => remaining.get(id) === 0);\n\tconst order: string[] = [];\n\twhile (ready.length > 0) {\n\t\tconst id = ready.shift()!;\n\t\torder.push(id);\n\t\tfor (const dependent of dependents.get(id) ?? []) {\n\t\t\tconst count = remaining.get(dependent)! - 1;\n\t\t\tremaining.set(dependent, count);\n\t\t\tif (count === 0) ready.push(dependent);\n\t\t}\n\t}\n\tif (order.length !== records.length) {\n\t\tconst cycle = records.map((record) => record.facetId).filter((id) => remaining.get(id)! > 0);\n\t\tthrow new Error(`Facet dependency cycle: ${cycle.join(\", \")}`);\n\t}\n\treturn order;\n}\n\nfunction recordServiceReference(\n\ttarget: FacetServiceReference[],\n\tservice: { readonly id: string },\n\tmode: ServiceMode,\n): void {\n\tif (target.some((reference) => reference.serviceId === service.id && reference.mode === mode)) return;\n\ttarget.push({ serviceId: service.id, service: service as Service<unknown>, mode });\n}\n\nfunction sameFacetShape(left: FacetShape, right: FacetShape): boolean {\n\treturn sameReferences(left.requires, right.requires) && sameReferences(left.provides, right.provides);\n}\n\nfunction sameReferences(left: readonly FacetServiceReference[], right: readonly FacetServiceReference[]): boolean {\n\treturn (\n\t\tleft.length === right.length &&\n\t\tleft.every((reference) =>\n\t\t\tright.some((other) => other.serviceId === reference.serviceId && other.mode === reference.mode),\n\t\t)\n\t);\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n\treturn typeof value === \"object\" && value !== null && \"then\" in value && typeof value.then === \"function\";\n}\n"]}
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/facets/host.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAuC,MAAM,yBAAyB,CAAC;AAErG,OAAO,KAAK,EAEX,KAAK,EAEL,YAAY,EAOZ,MAAM,aAAa,CAAC;AAgUrB,kFAAkF;AAClF,qBAAa,WAAW;;IAavB,YAAY,OAAO,EAAE,YAAY,EAQhC;IAED,IAAI,QAAQ,IAAI,qBAAqB,CAGpC;IAsBK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAiC9B;IAEK,MAAM,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwFpD;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAM7B;CAmRD"}