@agentshouse/mdruntime 0.1.0-alpha.9 → 0.1.0-c037654ea7e04

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 (133) hide show
  1. package/AGENTS.md +232 -0
  2. package/README.md +44 -0
  3. package/dist/adapter.d.ts +207 -36
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js +1 -10
  6. package/dist/attached-model.d.ts +11 -0
  7. package/dist/attached-model.d.ts.map +1 -0
  8. package/dist/attached-model.js +34 -0
  9. package/dist/attachment.d.ts +3 -0
  10. package/dist/attachment.d.ts.map +1 -0
  11. package/dist/attachment.js +8 -0
  12. package/dist/bootstrap.d.ts +7 -9
  13. package/dist/bootstrap.d.ts.map +1 -1
  14. package/dist/bootstrap.js +30 -28
  15. package/dist/change-set.d.ts +33 -0
  16. package/dist/change-set.d.ts.map +1 -0
  17. package/dist/change-set.js +83 -0
  18. package/dist/change.d.ts +9 -0
  19. package/dist/change.d.ts.map +1 -1
  20. package/dist/change.js +6 -5
  21. package/dist/client.d.ts +39 -32
  22. package/dist/client.d.ts.map +1 -1
  23. package/dist/client.js +114 -183
  24. package/dist/collection.d.ts +13 -16
  25. package/dist/collection.d.ts.map +1 -1
  26. package/dist/collection.js +45 -88
  27. package/dist/connection.d.ts +51 -46
  28. package/dist/connection.d.ts.map +1 -1
  29. package/dist/connection.js +1551 -1161
  30. package/dist/conversation.d.ts +57 -24
  31. package/dist/conversation.d.ts.map +1 -1
  32. package/dist/conversation.js +631 -330
  33. package/dist/durability.js +6 -6
  34. package/dist/file.d.ts +2 -2
  35. package/dist/file.d.ts.map +1 -1
  36. package/dist/file.js +48 -71
  37. package/dist/host.d.ts +12 -2
  38. package/dist/host.d.ts.map +1 -1
  39. package/dist/host.js +97 -119
  40. package/dist/identity.d.ts +1 -0
  41. package/dist/identity.d.ts.map +1 -1
  42. package/dist/identity.js +10 -9
  43. package/dist/index.d.ts +12 -11
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +1 -3
  46. package/dist/log.js +5 -6
  47. package/dist/memory.d.ts +16 -7
  48. package/dist/memory.d.ts.map +1 -1
  49. package/dist/memory.js +267 -220
  50. package/dist/model.d.ts +7 -29
  51. package/dist/model.d.ts.map +1 -1
  52. package/dist/model.js +19 -21
  53. package/dist/observation.d.ts +27 -0
  54. package/dist/observation.d.ts.map +1 -0
  55. package/dist/observation.js +95 -0
  56. package/dist/outcome.d.ts +10 -29
  57. package/dist/outcome.d.ts.map +1 -1
  58. package/dist/outcome.js +1 -23
  59. package/dist/overlay.d.ts +9 -2
  60. package/dist/overlay.d.ts.map +1 -1
  61. package/dist/overlay.js +187 -43
  62. package/dist/paths.d.ts +0 -2
  63. package/dist/paths.d.ts.map +1 -1
  64. package/dist/paths.js +6 -29
  65. package/dist/query.d.ts +215 -10
  66. package/dist/query.d.ts.map +1 -1
  67. package/dist/query.js +429 -15
  68. package/dist/reach.d.ts +40 -0
  69. package/dist/reach.d.ts.map +1 -0
  70. package/dist/reach.js +270 -0
  71. package/dist/react.d.ts +31 -0
  72. package/dist/react.d.ts.map +1 -0
  73. package/dist/react.js +62 -0
  74. package/dist/read-side.d.ts +18 -0
  75. package/dist/read-side.d.ts.map +1 -0
  76. package/dist/read-side.js +377 -0
  77. package/dist/refresh.d.ts +5 -5
  78. package/dist/refresh.d.ts.map +1 -1
  79. package/dist/refresh.js +49 -30
  80. package/dist/replica.d.ts +25 -5
  81. package/dist/replica.d.ts.map +1 -1
  82. package/dist/replica.js +227 -38
  83. package/dist/room-draft.d.ts +127 -0
  84. package/dist/room-draft.d.ts.map +1 -0
  85. package/dist/room-draft.js +329 -0
  86. package/dist/rows.d.ts +41 -0
  87. package/dist/rows.d.ts.map +1 -0
  88. package/dist/rows.js +97 -0
  89. package/dist/save.d.ts +7 -4
  90. package/dist/save.d.ts.map +1 -1
  91. package/dist/save.js +314 -356
  92. package/dist/search.d.ts +61 -0
  93. package/dist/search.d.ts.map +1 -0
  94. package/dist/search.js +125 -0
  95. package/dist/status.d.ts +4 -6
  96. package/dist/status.d.ts.map +1 -1
  97. package/dist/status.js +9 -13
  98. package/dist/store.d.ts +60 -32
  99. package/dist/store.d.ts.map +1 -1
  100. package/dist/store.js +338 -134
  101. package/dist/transfer.d.ts +5 -0
  102. package/dist/transfer.d.ts.map +1 -1
  103. package/dist/transfer.js +1 -5
  104. package/dist/wire.d.ts +52 -16
  105. package/dist/wire.d.ts.map +1 -1
  106. package/dist/wire.js +78 -108
  107. package/package.json +17 -11
  108. package/dist/adapter.js.map +0 -1
  109. package/dist/bootstrap.js.map +0 -1
  110. package/dist/change.js.map +0 -1
  111. package/dist/client.js.map +0 -1
  112. package/dist/collection.js.map +0 -1
  113. package/dist/connection.js.map +0 -1
  114. package/dist/conversation.js.map +0 -1
  115. package/dist/durability.js.map +0 -1
  116. package/dist/file.js.map +0 -1
  117. package/dist/host.js.map +0 -1
  118. package/dist/identity.js.map +0 -1
  119. package/dist/index.js.map +0 -1
  120. package/dist/log.js.map +0 -1
  121. package/dist/memory.js.map +0 -1
  122. package/dist/model.js.map +0 -1
  123. package/dist/outcome.js.map +0 -1
  124. package/dist/overlay.js.map +0 -1
  125. package/dist/paths.js.map +0 -1
  126. package/dist/query.js.map +0 -1
  127. package/dist/refresh.js.map +0 -1
  128. package/dist/replica.js.map +0 -1
  129. package/dist/save.js.map +0 -1
  130. package/dist/status.js.map +0 -1
  131. package/dist/store.js.map +0 -1
  132. package/dist/transfer.js.map +0 -1
  133. package/dist/wire.js.map +0 -1
package/dist/model.d.ts CHANGED
@@ -1,24 +1,20 @@
1
- import type { Validation } from '@agentshouse/mdmodel';
2
- import type { MdType } from './collection.js';
1
+ import type { Definition, ValueFacts, VerifiedModel } from '@agentshouse/mdmodel';
3
2
  export type ModelIdentity = {
4
3
  identity: string;
5
4
  version: string;
6
5
  };
7
6
  export type ModelSnapshot = ModelIdentity & {
8
- definitions: Readonly<Record<string, string>>;
7
+ schema: string | null;
9
8
  };
10
- export type ModelUnavailableReason = 'not-readable' | 'revoked' | 'not-acquired' | 'version-changed' | 'invalid' | 'binding-unavailable';
9
+ export type ModelUnavailableReason = 'not-readable' | 'revoked' | 'not-acquired' | 'invalid';
11
10
  export type ModelResult = {
12
11
  kind: 'model';
13
12
  snapshot: ModelSnapshot;
14
13
  } | {
15
14
  kind: 'model-unavailable';
16
15
  reason: ModelUnavailableReason;
17
- } | {
18
- kind: 'transport-uncertainty';
19
- } | {
20
- kind: 'revoked-authorization';
21
16
  };
17
+ export type MdType = Definition;
22
18
  export type ModelState = {
23
19
  status: 'unavailable';
24
20
  reason: ModelUnavailableReason;
@@ -26,7 +22,7 @@ export type ModelState = {
26
22
  status: 'current' | 'cached';
27
23
  snapshot: ModelSnapshot;
28
24
  verifiedWith: ModelIdentity;
29
- types: readonly MdType[];
25
+ types: VerifiedModel['types'];
30
26
  };
31
27
  export type TypesResult = {
32
28
  status: 'unavailable';
@@ -38,33 +34,15 @@ export type TypesResult = {
38
34
  verifiedWith: ModelIdentity;
39
35
  types: readonly MdType[];
40
36
  };
41
- export type ModelValidation = {
42
- verdict: 'accept';
43
- } | (Extract<Validation, {
44
- verdict: 'refuse';
45
- }> & {
46
- source: 'content' | 'model';
47
- });
48
- export type AttachedModelBinding = {
49
- verify(snapshot: ModelSnapshot): {
50
- kind: 'verified';
51
- types: readonly MdType[];
52
- } | {
53
- kind: 'invalid';
54
- };
55
- validate(input: {
56
- model: ModelSnapshot;
57
- documents: Readonly<Record<string, string>>;
58
- binaryTargets: readonly string[];
59
- }): ModelValidation;
60
- };
61
37
  export type ValidationReceipt = {
62
38
  identity: string;
63
39
  version: string;
64
40
  source: 'current' | 'cached';
65
41
  };
66
42
  export declare const NO_MODEL: ModelState;
43
+ export declare function definitionOf(state: ModelState, type: string | undefined): Definition | undefined;
67
44
  export declare function modelTypes(state: ModelState): TypesResult;
68
45
  export declare function cached(state: ModelState): ModelState;
69
46
  export declare function sameModel(left: ModelIdentity, right: ModelIdentity): boolean;
47
+ export declare function referenceField(facts: ValueFacts | undefined): boolean;
70
48
  //# sourceMappingURL=model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG;IAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAC;AAC9F,MAAM,MAAM,sBAAsB,GAC9B,cAAc,GACd,SAAS,GACT,cAAc,GACd,iBAAiB,GACjB,SAAS,GACT,qBAAqB,CAAC;AAC1B,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,uBAAuB,CAAA;CAAE,CAAC;AACtC,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GACzD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B,CAAC;AACN,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GACzD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B,CAAC;AACN,MAAM,MAAM,eAAe,GACvB;IAAE,OAAO,EAAE,QAAQ,CAAA;CAAE,GACrB,CAAC,OAAO,CAAC,UAAU,EAAE;IAAE,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC,GAAG;IAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAA;CAAE,CAAC,CAAC;AACnF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,CACJ,QAAQ,EAAE,aAAa,GACtB;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,CAAC;IACxE,QAAQ,CAAC,KAAK,EAAE;QACd,KAAK,EAAE,aAAa,CAAC;QACrB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5C,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;KAClC,GAAG,eAAe,CAAC;CACrB,CAAC;AACF,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,CAAC;AACpG,eAAO,MAAM,QAAQ,EAAE,UAA8D,CAAC;AACtF,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAUzD;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAEpD;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAE5E"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAElF,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AACtE,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC;AAC7F,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAClE,MAAM,MAAM,MAAM,GAAG,UAAU,CAAC;AAChC,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GACzD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;IACxB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAC/B,CAAC;AACN,MAAM,MAAM,WAAW,GACnB;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GACzD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,aAAa,CAAC;IAC5B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1B,CAAC;AACN,MAAM,MAAM,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAA;CAAE,CAAC;AACpG,eAAO,MAAM,QAAQ,EAAE,UAA8D,CAAC;AACtF,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAGhG;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAczD;AACD,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAEpD;AACD,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAE5E;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAErE"}
package/dist/model.js CHANGED
@@ -1,28 +1,26 @@
1
- export const NO_MODEL = {
2
- status: 'unavailable',
3
- reason: 'not-acquired'
4
- };
1
+ export const NO_MODEL = { status: 'unavailable', reason: 'not-acquired' };
2
+ export function definitionOf(state, type) {
3
+ if (state.status === 'unavailable' || type === undefined)
4
+ return undefined;
5
+ return Object.hasOwn(state.types, type) ? state.types[type] : undefined;
6
+ }
5
7
  export function modelTypes(state) {
6
- return state.status === 'unavailable' ? {
7
- ...state
8
- } : {
9
- status: state.status,
10
- identity: state.snapshot.identity,
11
- version: state.snapshot.version,
12
- verifiedWith: {
13
- ...state.verifiedWith
14
- },
15
- types: structuredClone(state.types)
16
- };
8
+ return state.status === 'unavailable'
9
+ ? { ...state }
10
+ : {
11
+ status: state.status,
12
+ identity: state.snapshot.identity,
13
+ version: state.snapshot.version,
14
+ verifiedWith: { ...state.verifiedWith },
15
+ types: structuredClone(Object.values(state.types).sort((left, right) => left.name < right.name ? -1 : left.name > right.name ? 1 : 0)),
16
+ };
17
17
  }
18
18
  export function cached(state) {
19
- return state.status === 'unavailable' ? state : {
20
- ...state,
21
- status: 'cached'
22
- };
19
+ return state.status === 'unavailable' ? state : { ...state, status: 'cached' };
23
20
  }
24
21
  export function sameModel(left, right) {
25
22
  return left.identity === right.identity && left.version === right.version;
26
23
  }
27
-
28
- //# sourceMappingURL=model.js.map
24
+ export function referenceField(facts) {
25
+ return facts?.reference !== undefined || facts?.items?.reference !== undefined;
26
+ }
@@ -0,0 +1,27 @@
1
+ import type { QueryDocument, QueryGroup, QueryResult } from './query.js';
2
+ export type Observation<T> = {
3
+ current(): T;
4
+ subscribe(listener: (value: T) => void): () => void;
5
+ close(): void;
6
+ };
7
+ export type RowKey = string | number;
8
+ export type KeyedResult = {
9
+ result: QueryResult;
10
+ keys: readonly RowKey[];
11
+ };
12
+ export type QueryChange = {
13
+ changed: readonly (readonly [RowKey, QueryDocument | QueryGroup])[];
14
+ removed: readonly RowKey[];
15
+ order: readonly RowKey[] | null;
16
+ };
17
+ export type Observed = {
18
+ observation: Observation<unknown>;
19
+ receive(message: unknown): void;
20
+ end(): void;
21
+ };
22
+ export declare function rowsOf(result: QueryResult): readonly (QueryDocument | QueryGroup)[];
23
+ export declare function applied(keyed: KeyedResult, change: QueryChange): KeyedResult;
24
+ export declare function observed(first: unknown, stop: () => void, keyed: boolean): Observed;
25
+ export declare function opened(watch: (deliver: (message: unknown) => void) => () => void, keyed: boolean): Promise<Observation<unknown>>;
26
+ export declare function observing<Topic extends string>(watch: (topic: Topic, input: readonly unknown[], deliver: (message: unknown) => void) => () => void): (topic: Topic, ...input: unknown[]) => Promise<Observation<unknown>>;
27
+ //# sourceMappingURL=observation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,IAAI,CAAC,CAAC;IACb,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACpD,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,GAAG,IAAI,IAAI,CAAC;CACb,CAAC;AAEF,wBAAgB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,aAAa,GAAG,UAAU,CAAC,EAAE,CAEnF;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,WAAW,CAc5E;AAiBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,CAkCnF;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,EAC1D,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAiB/B;AAED,wBAAgB,SAAS,CAAC,KAAK,SAAS,MAAM,EAC5C,KAAK,EAAE,CACL,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAChC,MAAM,IAAI,WAEA,KAAK,YAAY,OAAO,EAAE,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAQ1E"}
@@ -0,0 +1,95 @@
1
+ export function rowsOf(result) {
2
+ return 'groups' in result ? result.groups : result.documents;
3
+ }
4
+ export function applied(keyed, change) {
5
+ const rows = rowsOf(keyed.result);
6
+ const byKey = new Map(keyed.keys.map((key, index) => [key, rows[index]]));
7
+ for (const key of change.removed)
8
+ byKey.delete(key);
9
+ for (const [key, row] of change.changed)
10
+ byKey.set(key, row);
11
+ const keys = change.order ?? keyed.keys.filter((key) => byKey.has(key));
12
+ const next = keys.map((key) => byKey.get(key));
13
+ return {
14
+ result: 'groups' in keyed.result
15
+ ? { groups: next }
16
+ : { documents: next },
17
+ keys,
18
+ };
19
+ }
20
+ function keyedResult(first) {
21
+ let keyed = first;
22
+ return {
23
+ value: first.result,
24
+ next(message) {
25
+ keyed = applied(keyed, message);
26
+ return keyed.result;
27
+ },
28
+ };
29
+ }
30
+ function whole(first) {
31
+ return { value: first, next: (message) => message };
32
+ }
33
+ export function observed(first, stop, keyed) {
34
+ const reducer = keyed ? keyedResult(first) : whole(first);
35
+ let value = reducer.value;
36
+ let open = true;
37
+ const listeners = new Set();
38
+ const end = () => {
39
+ open = false;
40
+ listeners.clear();
41
+ };
42
+ return {
43
+ observation: {
44
+ current: () => value,
45
+ subscribe(listener) {
46
+ const entry = { hear: listener };
47
+ if (open)
48
+ listeners.add(entry);
49
+ return () => {
50
+ listeners.delete(entry);
51
+ };
52
+ },
53
+ close() {
54
+ if (!open)
55
+ return;
56
+ end();
57
+ stop();
58
+ },
59
+ },
60
+ receive(message) {
61
+ if (!open)
62
+ return;
63
+ value = reducer.next(message);
64
+ for (const entry of [...listeners]) {
65
+ if (listeners.has(entry))
66
+ entry.hear(value);
67
+ }
68
+ },
69
+ end,
70
+ };
71
+ }
72
+ export function opened(watch, keyed) {
73
+ return new Promise((resolve, reject) => {
74
+ let handle;
75
+ let stop = () => { };
76
+ try {
77
+ stop = watch((message) => {
78
+ if (handle !== undefined) {
79
+ handle.receive(message);
80
+ return;
81
+ }
82
+ handle = observed(message, () => stop(), keyed);
83
+ resolve(handle.observation);
84
+ });
85
+ }
86
+ catch (error) {
87
+ reject(error);
88
+ }
89
+ });
90
+ }
91
+ export function observing(watch) {
92
+ return (topic, ...input) => opened((deliver) => watch(topic, input, (message) => {
93
+ deliver(structuredClone(message));
94
+ }), topic === 'query');
95
+ }
package/dist/outcome.d.ts CHANGED
@@ -1,37 +1,18 @@
1
- import type { ActionResult, ProviderRefusal, RetryableRefusal } from './adapter.js';
1
+ import type { ActionResult } from './adapter.js';
2
2
  import type { ChangeBatch } from './change.js';
3
- export type AffectedState = Readonly<Record<string, string>>;
4
3
  export type CallResult = ActionResult | {
5
4
  kind: 'undeclared';
6
5
  };
7
- export type QueueOutcome = {
8
- kind: 'pending';
9
- } | (ProviderRefusal & {
10
- kind: 'conflicted';
11
- roomVersion?: string;
12
- affected: AffectedState;
13
- }) | (ProviderRefusal & {
14
- kind: 'rejected';
15
- affected: AffectedState;
16
- }) | RetryableRefusal | {
17
- kind: 'expired';
6
+ export type Submission = {
7
+ readonly state: 'waiting' | 'submitted';
8
+ } | {
9
+ readonly state: 'reset';
10
+ readonly reset: string;
18
11
  };
19
- export type AcceptedOutcome = {
20
- kind: 'accepted';
21
- roomVersion: string;
22
- author?: string;
23
- time?: string;
24
- };
25
- export type SubmissionOutcome = QueueOutcome | AcceptedOutcome;
26
12
  export type QueueEntry = {
27
13
  readonly batch: ChangeBatch;
28
- readonly outcome: QueueOutcome;
29
- };
30
- export type RefusedOutcome = Extract<QueueOutcome, {
31
- kind: 'conflicted' | 'rejected' | 'expired';
32
- }>;
33
- export declare function refused(outcome: SubmissionOutcome | undefined): outcome is RefusedOutcome;
34
- export declare function withheldUntilReset(outcome: SubmissionOutcome | undefined, at: number): boolean;
35
- export declare function refusalOf(outcome: RefusedOutcome): ProviderRefusal | null;
36
- export declare function queuedOutcome(outcome: SubmissionOutcome | undefined): QueueOutcome;
14
+ } & (Submission | {
15
+ readonly state: 'accepted';
16
+ readonly roomVersion: string;
17
+ });
37
18
  //# sourceMappingURL=outcome.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../src/outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7D,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB,CAAC,eAAe,GAAG;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;CACzB,CAAC,GACF,CAAC,eAAe,GAAG;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;CACzB,CAAC,GACF,gBAAgB,GAChB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,eAAe,CAAC;AAE/D,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS,CAAA;CAAE,CAAC,CAAC;AAEpG,wBAAgB,OAAO,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,OAAO,IAAI,cAAc,CAIzF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAM9F;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,eAAe,GAAG,IAAI,CAGzE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,GAAG,YAAY,CAKlF"}
1
+ {"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../src/outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAAA;CAAE,GAC3C;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG,CACvD,UAAU,GACV;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAC/D,CAAC"}
package/dist/outcome.js CHANGED
@@ -1,23 +1 @@
1
- export function refused(outcome) {
2
- return outcome?.kind === 'conflicted' || outcome?.kind === 'rejected' || outcome?.kind === 'expired';
3
- }
4
- export function withheldUntilReset(outcome, at) {
5
- return outcome?.kind === 'retryable-refusal' && outcome.reset !== undefined && at < Date.parse(outcome.reset);
6
- }
7
- export function refusalOf(outcome) {
8
- if (outcome.kind === 'expired') return null;
9
- return {
10
- code: outcome.code,
11
- fields: outcome.fields
12
- };
13
- }
14
- export function queuedOutcome(outcome) {
15
- if (outcome === undefined || outcome.kind === 'accepted' || outcome.kind === 'pending') {
16
- return {
17
- kind: 'pending'
18
- };
19
- }
20
- return outcome;
21
- }
22
-
23
- //# sourceMappingURL=outcome.js.map
1
+ export {};
package/dist/overlay.d.ts CHANGED
@@ -1,8 +1,15 @@
1
+ import type { HeadChange } from './adapter.js';
1
2
  import type { ChangeBatch } from './change.js';
2
- export type Layer = {
3
+ export type Heads = {
4
+ revisions: Readonly<Record<string, string>>;
5
+ changes: Readonly<Record<string, HeadChange>>;
6
+ };
7
+ export type Layer = Heads & {
3
8
  documents: Readonly<Record<string, string>>;
4
9
  binaryTargets: readonly string[];
5
- revisions: Readonly<Record<string, string>>;
6
10
  };
11
+ export declare function sameChange(left: HeadChange | undefined, right: HeadChange | undefined): boolean;
7
12
  export declare function overlay(base: Layer, queue: readonly ChangeBatch[]): Layer;
13
+ export declare function sameLayerText(left: Layer, right: Layer): boolean;
14
+ export declare function overlayChanged(base: Layer, queue: readonly ChangeBatch[], previousBase: Layer, previousQueue: readonly ChangeBatch[], previousVisible: Layer): Layer;
8
15
  //# sourceMappingURL=overlay.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAU,WAAW,EAAgB,MAAM,aAAa,CAAC;AAErE,MAAM,MAAM,KAAK,GAAG;IAClB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7C,CAAC;AAyIF,wBAAgB,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,KAAK,CAezE"}
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAU,WAAW,EAAgB,MAAM,aAAa,CAAC;AAErE,MAAM,MAAM,KAAK,GAAG;IAClB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG;IAC1B,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAQ/F;AAoJD,wBAAgB,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,KAAK,CAiBzE;AAQD,wBAAgB,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAQhE;AAmBD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,KAAK,EACnB,aAAa,EAAE,SAAS,WAAW,EAAE,EACrC,eAAe,EAAE,KAAK,GACrB,KAAK,CA4FP"}