@ny4n/chord 0.0.0-stage → 1.0.0

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 (124) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +261 -2
  3. package/dist/api.d.ts +20 -0
  4. package/dist/api.d.ts.map +1 -0
  5. package/dist/api.js +77 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/bundler.d.ts +6 -0
  8. package/dist/bundler.d.ts.map +1 -0
  9. package/dist/bundler.js +3 -0
  10. package/dist/bundler.js.map +1 -0
  11. package/dist/context/index.d.ts +24 -0
  12. package/dist/context/index.d.ts.map +1 -0
  13. package/dist/context/index.js +97 -0
  14. package/dist/context/index.js.map +1 -0
  15. package/dist/delta/apply-immutable-trusted.d.ts +4 -0
  16. package/dist/delta/apply-immutable-trusted.d.ts.map +1 -0
  17. package/dist/delta/apply-immutable-trusted.js +127 -0
  18. package/dist/delta/apply-immutable-trusted.js.map +1 -0
  19. package/dist/delta/core.d.ts +108 -0
  20. package/dist/delta/core.d.ts.map +1 -0
  21. package/dist/delta/core.js +645 -0
  22. package/dist/delta/core.js.map +1 -0
  23. package/dist/delta/diff.d.ts +5 -0
  24. package/dist/delta/diff.d.ts.map +1 -0
  25. package/dist/delta/diff.js +433 -0
  26. package/dist/delta/diff.js.map +1 -0
  27. package/dist/delta/draft.d.ts +5 -0
  28. package/dist/delta/draft.d.ts.map +1 -0
  29. package/dist/delta/draft.js +2 -0
  30. package/dist/delta/draft.js.map +1 -0
  31. package/dist/delta/index.d.ts +5 -0
  32. package/dist/delta/index.d.ts.map +1 -0
  33. package/dist/delta/index.js +6 -0
  34. package/dist/delta/index.js.map +1 -0
  35. package/dist/delta/revision-validator.d.ts +7 -0
  36. package/dist/delta/revision-validator.d.ts.map +1 -0
  37. package/dist/delta/revision-validator.js +71 -0
  38. package/dist/delta/revision-validator.js.map +1 -0
  39. package/dist/delta/tracker.d.ts +26 -0
  40. package/dist/delta/tracker.d.ts.map +1 -0
  41. package/dist/delta/tracker.js +2069 -0
  42. package/dist/delta/tracker.js.map +1 -0
  43. package/dist/facets/host.d.ts +12 -0
  44. package/dist/facets/host.d.ts.map +1 -0
  45. package/dist/facets/host.js +763 -0
  46. package/dist/facets/host.js.map +1 -0
  47. package/dist/facets/loader.d.ts +3 -0
  48. package/dist/facets/loader.d.ts.map +1 -0
  49. package/dist/facets/loader.js +5 -0
  50. package/dist/facets/loader.js.map +1 -0
  51. package/dist/index.d.ts +12 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +10 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/json.d.ts +10 -0
  56. package/dist/json.d.ts.map +1 -0
  57. package/dist/json.js +124 -0
  58. package/dist/json.js.map +1 -0
  59. package/dist/node/bundle-loader.d.ts +30 -0
  60. package/dist/node/bundle-loader.d.ts.map +1 -0
  61. package/dist/node/bundle-loader.js +377 -0
  62. package/dist/node/bundle-loader.js.map +1 -0
  63. package/dist/node/bundle.d.ts +26 -0
  64. package/dist/node/bundle.d.ts.map +1 -0
  65. package/dist/node/bundle.js +183 -0
  66. package/dist/node/bundle.js.map +1 -0
  67. package/dist/node/manifest.d.ts +36 -0
  68. package/dist/node/manifest.d.ts.map +1 -0
  69. package/dist/node/manifest.js +6 -0
  70. package/dist/node/manifest.js.map +1 -0
  71. package/dist/node/package.d.ts +15 -0
  72. package/dist/node/package.d.ts.map +1 -0
  73. package/dist/node/package.js +199 -0
  74. package/dist/node/package.js.map +1 -0
  75. package/dist/node.d.ts +5 -0
  76. package/dist/node.d.ts.map +1 -0
  77. package/dist/node.js +3 -0
  78. package/dist/node.js.map +1 -0
  79. package/dist/services/consumer.d.ts +11 -0
  80. package/dist/services/consumer.d.ts.map +1 -0
  81. package/dist/services/consumer.js +585 -0
  82. package/dist/services/consumer.js.map +1 -0
  83. package/dist/services/errors.d.ts +8 -0
  84. package/dist/services/errors.d.ts.map +1 -0
  85. package/dist/services/errors.js +22 -0
  86. package/dist/services/errors.js.map +1 -0
  87. package/dist/services/handle.d.ts +15 -0
  88. package/dist/services/handle.d.ts.map +1 -0
  89. package/dist/services/handle.js +101 -0
  90. package/dist/services/handle.js.map +1 -0
  91. package/dist/services/instances.d.ts +26 -0
  92. package/dist/services/instances.d.ts.map +1 -0
  93. package/dist/services/instances.js +140 -0
  94. package/dist/services/instances.js.map +1 -0
  95. package/dist/services/loopback.d.ts +5 -0
  96. package/dist/services/loopback.d.ts.map +1 -0
  97. package/dist/services/loopback.js +15 -0
  98. package/dist/services/loopback.js.map +1 -0
  99. package/dist/services/provider.d.ts +37 -0
  100. package/dist/services/provider.d.ts.map +1 -0
  101. package/dist/services/provider.js +521 -0
  102. package/dist/services/provider.js.map +1 -0
  103. package/dist/services/state-codec.d.ts +15 -0
  104. package/dist/services/state-codec.d.ts.map +1 -0
  105. package/dist/services/state-codec.js +133 -0
  106. package/dist/services/state-codec.js.map +1 -0
  107. package/dist/services/state-internals.d.ts +13 -0
  108. package/dist/services/state-internals.d.ts.map +1 -0
  109. package/dist/services/state-internals.js +10 -0
  110. package/dist/services/state-internals.js.map +1 -0
  111. package/dist/services/state.d.ts +28 -0
  112. package/dist/services/state.d.ts.map +1 -0
  113. package/dist/services/state.js +397 -0
  114. package/dist/services/state.js.map +1 -0
  115. package/dist/services/wire.d.ts +63 -0
  116. package/dist/services/wire.d.ts.map +1 -0
  117. package/dist/services/wire.js +186 -0
  118. package/dist/services/wire.js.map +1 -0
  119. package/dist/types.d.ts +277 -0
  120. package/dist/types.d.ts.map +1 -0
  121. package/dist/types.js +2 -0
  122. package/dist/types.js.map +1 -0
  123. package/package.json +71 -5
  124. package/src/delta/README.md +191 -0
@@ -0,0 +1,5 @@
1
+ /** A mutable transaction-scoped view of a JSON value, preserving tuple positions. */
2
+ export type Draft<T, Depth extends readonly unknown[] = []> = Depth["length"] extends 8 ? T : T extends null | boolean | number | string ? T : T extends (...args: never[]) => unknown ? T : T extends object ? {
3
+ -readonly [Key in keyof T]: Draft<T[Key], [...Depth, unknown]>;
4
+ } : T;
5
+ //# sourceMappingURL=draft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../src/delta/draft.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,SAAS,OAAO,EAAE,GAAG,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,GACpF,CAAC,GACD,CAAC,SAAS,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GACzC,CAAC,GACD,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,GACtC,CAAC,GACD,CAAC,SAAS,MAAM,GACf;IAAE,CAAC,UAAU,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC;CAAE,GAClE,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=draft.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draft.js","sourceRoot":"","sources":["../../src/delta/draft.ts"],"names":[],"mappings":"","sourcesContent":["/** A mutable transaction-scoped view of a JSON value, preserving tuple positions. */\nexport type Draft<T, Depth extends readonly unknown[] = []> = Depth[\"length\"] extends 8\n\t? T\n\t: T extends null | boolean | number | string\n\t\t? T\n\t\t: T extends (...args: never[]) => unknown\n\t\t\t? T\n\t\t\t: T extends object\n\t\t\t\t? { -readonly [Key in keyof T]: Draft<T[Key], [...Depth, unknown]> }\n\t\t\t\t: T;\n"]}
@@ -0,0 +1,5 @@
1
+ export * from "./core.ts";
2
+ export { diffRevisions } from "./diff.ts";
3
+ export type { Draft } from "./draft.ts";
4
+ export { type Change, type Prepared, type Tracker, track } from "./tracker.ts";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/delta/index.ts"],"names":[],"mappings":"AAEA,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,6 @@
1
+ // The delta module's public surface. Definitions live in core.ts; diff.ts and tracker.ts depend on core.ts
2
+ // directly so this barrel never sits inside an import cycle.
3
+ export * from "./core.js";
4
+ export { diffRevisions } from "./diff.js";
5
+ export { track } from "./tracker.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/delta/index.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAC3G,6DAA6D;AAC7D,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAA4C,KAAK,EAAE,MAAM,cAAc,CAAC","sourcesContent":["// The delta module's public surface. Definitions live in core.ts; diff.ts and tracker.ts depend on core.ts\n// directly so this barrel never sits inside an import cycle.\nexport * from \"./core.ts\";\nexport { diffRevisions } from \"./diff.ts\";\nexport type { Draft } from \"./draft.ts\";\nexport { type Change, type Prepared, type Tracker, track } from \"./tracker.ts\";\n"]}
@@ -0,0 +1,7 @@
1
+ import type { JsonValue } from "../types.ts";
2
+ /** Validates immutable replica revisions while skipping containers validated in earlier revisions. */
3
+ export declare class JsonRevisionValidator {
4
+ #private;
5
+ validate<T extends JsonValue>(value: T): T;
6
+ }
7
+ //# sourceMappingURL=revision-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision-validator.d.ts","sourceRoot":"","sources":["../../src/delta/revision-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C,sGAAsG;AACtG,qBAAa,qBAAqB;;IAGjC,QAAQ,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAEzC;CA6BD"}
@@ -0,0 +1,71 @@
1
+ const isContainer = (value) => typeof value === "object" && value !== null;
2
+ /** Validates immutable replica revisions while skipping containers validated in earlier revisions. */
3
+ export class JsonRevisionValidator {
4
+ #validated = new WeakSet();
5
+ validate(value) {
6
+ return this.#validate(value, new Set(), new WeakSet());
7
+ }
8
+ #validate(value, ancestors, finished) {
9
+ if (!isContainer(value) || this.#validated.has(value))
10
+ return isContainer(value) ? value : assertPrimitive(value);
11
+ if (finished.has(value))
12
+ return value;
13
+ if (ancestors.has(value))
14
+ throw new TypeError("Replicated state cannot contain cycles");
15
+ ancestors.add(value);
16
+ try {
17
+ if (Array.isArray(value)) {
18
+ assertDenseArray(value);
19
+ for (let index = 0; index < value.length; index++)
20
+ this.#validate(value[index], ancestors, finished);
21
+ }
22
+ else {
23
+ assertPlainObject(value);
24
+ for (const key of Reflect.ownKeys(value)) {
25
+ if (typeof key === "symbol")
26
+ throw new TypeError("Replicated state cannot contain symbol properties");
27
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
28
+ if (descriptor === undefined || !descriptor.enumerable || !("value" in descriptor)) {
29
+ throw new TypeError("Replicated state objects must contain enumerable data properties");
30
+ }
31
+ this.#validate(descriptor.value, ancestors, finished);
32
+ }
33
+ }
34
+ finished.add(value);
35
+ this.#validated.add(value);
36
+ return value;
37
+ }
38
+ finally {
39
+ ancestors.delete(value);
40
+ }
41
+ }
42
+ }
43
+ function assertPrimitive(value) {
44
+ if (value === null || typeof value === "string" || typeof value === "boolean")
45
+ return value;
46
+ if (typeof value === "number" && Number.isFinite(value))
47
+ return value;
48
+ throw new TypeError("Replicated state values must be strict JSON");
49
+ }
50
+ function assertPlainObject(value) {
51
+ const prototype = Object.getPrototypeOf(value);
52
+ if (prototype !== Object.prototype && prototype !== null) {
53
+ throw new TypeError("Replicated state containers must be plain objects or arrays");
54
+ }
55
+ }
56
+ function assertDenseArray(value) {
57
+ const keys = Reflect.ownKeys(value);
58
+ if (keys.length !== value.length + 1 || keys.some((key) => typeof key !== "string")) {
59
+ throw new TypeError("Replicated state arrays must be dense and contain only indexed entries");
60
+ }
61
+ for (let index = 0; index < value.length; index++) {
62
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
63
+ if (descriptor === undefined ||
64
+ !descriptor.enumerable ||
65
+ !("value" in descriptor) ||
66
+ descriptor.value === undefined) {
67
+ throw new TypeError("Replicated state arrays must contain enumerable indexed data properties with defined values");
68
+ }
69
+ }
70
+ }
71
+ //# sourceMappingURL=revision-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision-validator.js","sourceRoot":"","sources":["../../src/delta/revision-validator.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: JsonValue): value is JsonContainer => typeof value === \"object\" && value !== null;\n\n/** Validates immutable replica revisions while skipping containers validated in earlier revisions. */\nexport class JsonRevisionValidator {\n\treadonly #validated = new WeakSet<object>();\n\n\tvalidate<T extends JsonValue>(value: T): T {\n\t\treturn this.#validate(value, new Set<object>(), new WeakSet<object>()) as T;\n\t}\n\n\t#validate(value: JsonValue, ancestors: Set<object>, finished: WeakSet<object>): JsonValue {\n\t\tif (!isContainer(value) || this.#validated.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++) this.#validate(value[index]!, ancestors, finished);\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\tthis.#validate(descriptor.value as JsonValue, ancestors, finished);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfinished.add(value);\n\t\t\tthis.#validated.add(value);\n\t\t\treturn value;\n\t\t} finally {\n\t\t\tancestors.delete(value);\n\t\t}\n\t}\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\tconst descriptor = Object.getOwnPropertyDescriptor(value, String(index));\n\t\tif (\n\t\t\tdescriptor === undefined ||\n\t\t\t!descriptor.enumerable ||\n\t\t\t!(\"value\" in descriptor) ||\n\t\t\tdescriptor.value === undefined\n\t\t) {\n\t\t\tthrow new TypeError(\n\t\t\t\t\"Replicated state arrays must contain enumerable indexed data properties with defined values\",\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import type { JsonValue } from "../types.ts";
2
+ import { type Op } from "./core.ts";
3
+ import type { Draft } from "./draft.ts";
4
+ export type { Draft, JsonValue, Op };
5
+ export interface Prepared<T extends object> {
6
+ readonly base: T;
7
+ readonly value: T;
8
+ readonly ops: readonly Op[];
9
+ readonly baseRevision: number;
10
+ abort(): void;
11
+ }
12
+ export interface Change<T extends object> {
13
+ readonly state: Draft<T>;
14
+ prepare(): Prepared<T>;
15
+ abort(): void;
16
+ }
17
+ export interface Tracker<T extends object> {
18
+ readonly value: T;
19
+ readonly revision: number;
20
+ beginChange(): Change<T>;
21
+ prepareReplace(value: T): Prepared<T>;
22
+ adopt(prepared: Prepared<T>): void;
23
+ }
24
+ /** Take immutable ownership of an alias-free strict-JSON root in O(1). */
25
+ export declare function track<T extends object>(initial: T): Tracker<T>;
26
+ //# sourceMappingURL=tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../../src/delta/tracker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAqC,KAAK,EAAE,EAAyC,MAAM,WAAW,CAAC;AAC9G,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAkHrC,MAAM,WAAW,QAAQ,CAAC,CAAC,SAAS,MAAM;IACzC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,KAAK,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,MAAM;IACvC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;IACvB,KAAK,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM;IACxC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,WAAW,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IACzB,cAAc,CAAC,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CACnC;AAmLD,0EAA0E;AAC1E,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAE9D"}