@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
@@ -1,175 +0,0 @@
1
- const isContainer = (value) => typeof value === "object" && value !== null;
2
- /** Owns and freezes immutable JSON revisions while reusing already-owned subtrees. */
3
- export class JsonRevisionStore {
4
- #owned = new WeakSet();
5
- import(value) {
6
- return this.#clone(value, new Set());
7
- }
8
- commit(value, transactionOwned) {
9
- return this.#finish(value, transactionOwned, new Set(), new WeakSet());
10
- }
11
- adopt(value) {
12
- return this.#adopt(value, new Set(), new WeakSet());
13
- }
14
- #clone(value, ancestors) {
15
- if (!isContainer(value))
16
- return assertPrimitive(value);
17
- if (ancestors.has(value))
18
- throw new TypeError("Replicated state cannot contain cycles");
19
- ancestors.add(value);
20
- try {
21
- if (Array.isArray(value)) {
22
- assertDenseArray(value);
23
- const result = new Array(value.length);
24
- for (let index = 0; index < value.length; index++) {
25
- Object.defineProperty(result, index, {
26
- value: this.#clone(value[index], ancestors),
27
- writable: true,
28
- enumerable: true,
29
- configurable: true,
30
- });
31
- }
32
- this.#owned.add(result);
33
- return Object.freeze(result);
34
- }
35
- assertPlainObject(value);
36
- const result = Object.create(Object.getPrototypeOf(value));
37
- for (const key of Reflect.ownKeys(value)) {
38
- if (typeof key === "symbol")
39
- throw new TypeError("Replicated state cannot contain symbol properties");
40
- const descriptor = Object.getOwnPropertyDescriptor(value, key);
41
- if (descriptor === undefined || !descriptor.enumerable || !("value" in descriptor)) {
42
- throw new TypeError("Replicated state objects must contain enumerable data properties");
43
- }
44
- Object.defineProperty(result, key, {
45
- value: this.#clone(descriptor.value, ancestors),
46
- writable: true,
47
- enumerable: true,
48
- configurable: true,
49
- });
50
- }
51
- this.#owned.add(result);
52
- return Object.freeze(result);
53
- }
54
- finally {
55
- ancestors.delete(value);
56
- }
57
- }
58
- #adopt(value, ancestors, finished) {
59
- if (!isContainer(value) || this.#owned.has(value))
60
- return isContainer(value) ? value : assertPrimitive(value);
61
- if (finished.has(value))
62
- return value;
63
- if (ancestors.has(value))
64
- throw new TypeError("Replicated state cannot contain cycles");
65
- ancestors.add(value);
66
- try {
67
- if (Array.isArray(value)) {
68
- assertDenseArray(value);
69
- for (let index = 0; index < value.length; index++) {
70
- const child = this.#adopt(value[index], ancestors, finished);
71
- if (child !== value[index])
72
- defineValue(value, String(index), child);
73
- }
74
- }
75
- else {
76
- assertPlainObject(value);
77
- for (const key of Reflect.ownKeys(value)) {
78
- if (typeof key === "symbol")
79
- throw new TypeError("Replicated state cannot contain symbol properties");
80
- const descriptor = Object.getOwnPropertyDescriptor(value, key);
81
- if (descriptor === undefined || !descriptor.enumerable || !("value" in descriptor)) {
82
- throw new TypeError("Replicated state objects must contain enumerable data properties");
83
- }
84
- const child = this.#adopt(descriptor.value, ancestors, finished);
85
- if (child !== descriptor.value && isContainer(child))
86
- defineValue(value, key, child);
87
- }
88
- }
89
- finished.add(value);
90
- this.#owned.add(value);
91
- return Object.freeze(value);
92
- }
93
- finally {
94
- ancestors.delete(value);
95
- }
96
- }
97
- #finish(value, transactionOwned, ancestors, placements) {
98
- if (ancestors.has(value))
99
- throw new TypeError("Replicated state cannot contain cycles");
100
- if (placements.has(value))
101
- return this.#clone(value, new Set());
102
- placements.add(value);
103
- if (this.#owned.has(value))
104
- return value;
105
- if (!transactionOwned.has(value))
106
- return this.#clone(value, ancestors);
107
- ancestors.add(value);
108
- try {
109
- if (Array.isArray(value)) {
110
- assertDenseArray(value);
111
- for (let index = 0; index < value.length; index++) {
112
- const child = value[index];
113
- if (!isContainer(child)) {
114
- assertPrimitive(child);
115
- continue;
116
- }
117
- const next = this.#finish(child, transactionOwned, ancestors, placements);
118
- if (next !== child)
119
- defineValue(value, String(index), next);
120
- }
121
- }
122
- else {
123
- assertPlainObject(value);
124
- for (const key of Reflect.ownKeys(value)) {
125
- if (typeof key === "symbol")
126
- throw new TypeError("Replicated state cannot contain symbol properties");
127
- const descriptor = Object.getOwnPropertyDescriptor(value, key);
128
- if (descriptor === undefined || !descriptor.enumerable || !("value" in descriptor)) {
129
- throw new TypeError("Replicated state objects must contain enumerable data properties");
130
- }
131
- if (!isContainer(descriptor.value)) {
132
- assertPrimitive(descriptor.value);
133
- continue;
134
- }
135
- const next = this.#finish(descriptor.value, transactionOwned, ancestors, placements);
136
- if (next !== descriptor.value)
137
- defineValue(value, key, next);
138
- }
139
- }
140
- this.#owned.add(value);
141
- return Object.freeze(value);
142
- }
143
- finally {
144
- ancestors.delete(value);
145
- }
146
- }
147
- }
148
- function defineValue(target, key, value) {
149
- Object.defineProperty(target, key, { value, writable: true, enumerable: true, configurable: true });
150
- }
151
- function assertPrimitive(value) {
152
- if (value === null || typeof value === "string" || typeof value === "boolean")
153
- return value;
154
- if (typeof value === "number" && Number.isFinite(value))
155
- return value;
156
- throw new TypeError("Replicated state values must be strict JSON");
157
- }
158
- function assertPlainObject(value) {
159
- const prototype = Object.getPrototypeOf(value);
160
- if (prototype !== Object.prototype && prototype !== null) {
161
- throw new TypeError("Replicated state containers must be plain objects or arrays");
162
- }
163
- }
164
- function assertDenseArray(value) {
165
- const keys = Reflect.ownKeys(value);
166
- if (keys.length !== value.length + 1 || keys.some((key) => typeof key !== "string")) {
167
- throw new TypeError("Replicated state arrays must be dense and contain only indexed entries");
168
- }
169
- for (let index = 0; index < value.length; index++) {
170
- if (!Object.hasOwn(value, index) || value[index] === undefined) {
171
- throw new TypeError("Replicated state arrays cannot contain holes or undefined entries");
172
- }
173
- }
174
- }
175
- //# sourceMappingURL=value.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"value.js","sourceRoot":"","sources":["../../src/state/value.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"../types.ts\";\n\ntype JsonContainer = JsonValue[] | Record<string, JsonValue>;\n\nconst isContainer = (value: unknown): value is JsonContainer => typeof value === \"object\" && value !== null;\n\n/** Owns and freezes immutable JSON revisions while reusing already-owned subtrees. */\nexport class JsonRevisionStore {\n\treadonly #owned = new WeakSet<object>();\n\n\timport<T extends object>(value: T): T {\n\t\treturn this.#clone(value, new Set<object>()) as T;\n\t}\n\n\tcommit<T extends object>(value: T, transactionOwned: WeakSet<object>): T {\n\t\treturn this.#finish(value as JsonContainer, transactionOwned, new Set<object>(), new WeakSet<object>()) as T;\n\t}\n\n\tadopt<T extends JsonValue>(value: T): T {\n\t\treturn this.#adopt(value, new Set<object>(), new WeakSet<object>()) as T;\n\t}\n\n\t#clone(value: unknown, ancestors: Set<object>): JsonValue {\n\t\tif (!isContainer(value)) return assertPrimitive(value);\n\t\tif (ancestors.has(value)) throw new TypeError(\"Replicated state cannot contain cycles\");\n\t\tancestors.add(value);\n\t\ttry {\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tassertDenseArray(value);\n\t\t\t\tconst result = new Array<JsonValue>(value.length);\n\t\t\t\tfor (let index = 0; index < value.length; index++) {\n\t\t\t\t\tObject.defineProperty(result, index, {\n\t\t\t\t\t\tvalue: this.#clone(value[index], ancestors),\n\t\t\t\t\t\twritable: true,\n\t\t\t\t\t\tenumerable: true,\n\t\t\t\t\t\tconfigurable: true,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis.#owned.add(result);\n\t\t\t\treturn Object.freeze(result) as unknown as JsonValue;\n\t\t\t}\n\t\t\tassertPlainObject(value);\n\t\t\tconst result = Object.create(Object.getPrototypeOf(value)) as Record<string, JsonValue>;\n\t\t\tfor (const key of Reflect.ownKeys(value)) {\n\t\t\t\tif (typeof key === \"symbol\") throw new TypeError(\"Replicated state cannot contain symbol properties\");\n\t\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, key);\n\t\t\t\tif (descriptor === undefined || !descriptor.enumerable || !(\"value\" in descriptor)) {\n\t\t\t\t\tthrow new TypeError(\"Replicated state objects must contain enumerable data properties\");\n\t\t\t\t}\n\t\t\t\tObject.defineProperty(result, key, {\n\t\t\t\t\tvalue: this.#clone(descriptor.value, ancestors),\n\t\t\t\t\twritable: true,\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.#owned.add(result);\n\t\t\treturn Object.freeze(result) as unknown as JsonValue;\n\t\t} finally {\n\t\t\tancestors.delete(value);\n\t\t}\n\t}\n\n\t#adopt(value: JsonValue, ancestors: Set<object>, finished: WeakSet<object>): JsonValue {\n\t\tif (!isContainer(value) || this.#owned.has(value)) return isContainer(value) ? value : assertPrimitive(value);\n\t\tif (finished.has(value)) return value;\n\t\tif (ancestors.has(value)) throw new TypeError(\"Replicated state cannot contain cycles\");\n\t\tancestors.add(value);\n\t\ttry {\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tassertDenseArray(value);\n\t\t\t\tfor (let index = 0; index < value.length; index++) {\n\t\t\t\t\tconst child = this.#adopt(value[index]!, ancestors, finished);\n\t\t\t\t\tif (child !== value[index]) defineValue(value, String(index), child as JsonContainer);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tassertPlainObject(value);\n\t\t\t\tfor (const key of Reflect.ownKeys(value)) {\n\t\t\t\t\tif (typeof key === \"symbol\") throw new TypeError(\"Replicated state cannot contain symbol properties\");\n\t\t\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, key);\n\t\t\t\t\tif (descriptor === undefined || !descriptor.enumerable || !(\"value\" in descriptor)) {\n\t\t\t\t\t\tthrow new TypeError(\"Replicated state objects must contain enumerable data properties\");\n\t\t\t\t\t}\n\t\t\t\t\tconst child = this.#adopt(descriptor.value as JsonValue, ancestors, finished);\n\t\t\t\t\tif (child !== descriptor.value && isContainer(child)) defineValue(value, key, child);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinished.add(value);\n\t\t\tthis.#owned.add(value);\n\t\t\treturn Object.freeze(value) as unknown as JsonValue;\n\t\t} finally {\n\t\t\tancestors.delete(value);\n\t\t}\n\t}\n\n\t#finish(\n\t\tvalue: JsonContainer,\n\t\ttransactionOwned: WeakSet<object>,\n\t\tancestors: Set<object>,\n\t\tplacements: WeakSet<object>,\n\t): JsonContainer {\n\t\tif (ancestors.has(value)) throw new TypeError(\"Replicated state cannot contain cycles\");\n\t\tif (placements.has(value)) return this.#clone(value, new Set<object>()) as JsonContainer;\n\t\tplacements.add(value);\n\t\tif (this.#owned.has(value)) return value;\n\t\tif (!transactionOwned.has(value)) return this.#clone(value, ancestors) as JsonContainer;\n\t\tancestors.add(value);\n\t\ttry {\n\t\t\tif (Array.isArray(value)) {\n\t\t\t\tassertDenseArray(value);\n\t\t\t\tfor (let index = 0; index < value.length; index++) {\n\t\t\t\t\tconst child = value[index];\n\t\t\t\t\tif (!isContainer(child)) {\n\t\t\t\t\t\tassertPrimitive(child);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst next = this.#finish(child, transactionOwned, ancestors, placements);\n\t\t\t\t\tif (next !== child) defineValue(value, String(index), next);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tassertPlainObject(value);\n\t\t\t\tfor (const key of Reflect.ownKeys(value)) {\n\t\t\t\t\tif (typeof key === \"symbol\") throw new TypeError(\"Replicated state cannot contain symbol properties\");\n\t\t\t\t\tconst descriptor = Object.getOwnPropertyDescriptor(value, key);\n\t\t\t\t\tif (descriptor === undefined || !descriptor.enumerable || !(\"value\" in descriptor)) {\n\t\t\t\t\t\tthrow new TypeError(\"Replicated state objects must contain enumerable data properties\");\n\t\t\t\t\t}\n\t\t\t\t\tif (!isContainer(descriptor.value)) {\n\t\t\t\t\t\tassertPrimitive(descriptor.value);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst next = this.#finish(descriptor.value, transactionOwned, ancestors, placements);\n\t\t\t\t\tif (next !== descriptor.value) defineValue(value, key, next);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.#owned.add(value);\n\t\t\treturn Object.freeze(value) as unknown as JsonContainer;\n\t\t} finally {\n\t\t\tancestors.delete(value);\n\t\t}\n\t}\n}\n\nfunction defineValue(target: object, key: string, value: JsonContainer): void {\n\tObject.defineProperty(target, key, { value, writable: true, enumerable: true, configurable: true });\n}\n\nfunction assertPrimitive(value: unknown): null | boolean | number | string {\n\tif (value === null || typeof value === \"string\" || typeof value === \"boolean\") return value;\n\tif (typeof value === \"number\" && Number.isFinite(value)) return value;\n\tthrow new TypeError(\"Replicated state values must be strict JSON\");\n}\n\nfunction assertPlainObject(value: object): void {\n\tconst prototype = Object.getPrototypeOf(value);\n\tif (prototype !== Object.prototype && prototype !== null) {\n\t\tthrow new TypeError(\"Replicated state containers must be plain objects or arrays\");\n\t}\n}\n\nfunction assertDenseArray(value: readonly unknown[]): void {\n\tconst keys = Reflect.ownKeys(value);\n\tif (keys.length !== value.length + 1 || keys.some((key) => typeof key !== \"string\")) {\n\t\tthrow new TypeError(\"Replicated state arrays must be dense and contain only indexed entries\");\n\t}\n\tfor (let index = 0; index < value.length; index++) {\n\t\tif (!Object.hasOwn(value, index) || value[index] === undefined) {\n\t\t\tthrow new TypeError(\"Replicated state arrays cannot contain holes or undefined entries\");\n\t\t}\n\t}\n}\n"]}