@agentshouse/mdruntime 0.1.0-c4ca57eefb98a → 0.1.0-c4d7cf2ec26a6

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 (289) hide show
  1. package/README.md +2 -2
  2. package/dist/acceptance.d.ts +6 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +386 -0
  5. package/dist/actions.d.ts +20 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +251 -0
  8. package/dist/adapter.d.ts +86 -67
  9. package/dist/adapter.d.ts.map +1 -1
  10. package/dist/attached-model.d.ts +3 -10
  11. package/dist/attached-model.d.ts.map +1 -1
  12. package/dist/attached-model.js +21 -56
  13. package/dist/bootstrap.d.ts +11 -10
  14. package/dist/bootstrap.d.ts.map +1 -1
  15. package/dist/bootstrap.js +219 -82
  16. package/dist/cell.d.ts +6 -0
  17. package/dist/cell.d.ts.map +1 -0
  18. package/dist/cell.js +9 -0
  19. package/dist/chain.d.ts +2 -1
  20. package/dist/chain.d.ts.map +1 -1
  21. package/dist/chain.js +3 -7
  22. package/dist/change.d.ts +1 -0
  23. package/dist/change.d.ts.map +1 -1
  24. package/dist/change.js +4 -2
  25. package/dist/chat-types.d.ts +5 -0
  26. package/dist/chat-types.d.ts.map +1 -0
  27. package/dist/chat-types.js +13 -0
  28. package/dist/client.d.ts +21 -6
  29. package/dist/client.d.ts.map +1 -1
  30. package/dist/client.js +3 -1
  31. package/dist/collection.d.ts +2 -4
  32. package/dist/collection.d.ts.map +1 -1
  33. package/dist/collection.js +1 -17
  34. package/dist/compile.d.ts +6 -6
  35. package/dist/compile.d.ts.map +1 -1
  36. package/dist/compile.js +267 -323
  37. package/dist/connection.d.ts +5 -143
  38. package/dist/connection.d.ts.map +1 -1
  39. package/dist/connection.js +102 -5311
  40. package/dist/context.d.ts +2 -0
  41. package/dist/context.d.ts.map +1 -0
  42. package/dist/context.js +7 -0
  43. package/dist/conversation-live.d.ts +136 -0
  44. package/dist/conversation-live.d.ts.map +1 -0
  45. package/dist/conversation-live.js +248 -0
  46. package/dist/conversation-row.d.ts +33 -0
  47. package/dist/conversation-row.d.ts.map +1 -0
  48. package/dist/conversation-row.js +53 -0
  49. package/dist/conversation.d.ts +41 -45
  50. package/dist/conversation.d.ts.map +1 -1
  51. package/dist/conversation.js +860 -869
  52. package/dist/discovery.d.ts +10 -0
  53. package/dist/discovery.d.ts.map +1 -0
  54. package/dist/discovery.js +175 -0
  55. package/dist/durability.d.ts +15 -1
  56. package/dist/durability.d.ts.map +1 -1
  57. package/dist/entry.d.ts +2 -2
  58. package/dist/entry.d.ts.map +1 -1
  59. package/dist/entry.js +17 -7
  60. package/dist/figures.d.ts +49 -0
  61. package/dist/figures.d.ts.map +1 -0
  62. package/dist/figures.js +197 -0
  63. package/dist/holdings.d.ts +29 -0
  64. package/dist/holdings.d.ts.map +1 -0
  65. package/dist/holdings.js +95 -0
  66. package/dist/host.d.ts +4 -7
  67. package/dist/host.d.ts.map +1 -1
  68. package/dist/host.js +29 -31
  69. package/dist/identity.d.ts +0 -1
  70. package/dist/identity.d.ts.map +1 -1
  71. package/dist/identity.js +0 -3
  72. package/dist/index.d.ts +26 -8
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +8 -1
  75. package/dist/install.d.ts +56 -0
  76. package/dist/install.d.ts.map +1 -0
  77. package/dist/install.js +554 -0
  78. package/dist/job.d.ts +33 -0
  79. package/dist/job.d.ts.map +1 -0
  80. package/dist/job.js +54 -0
  81. package/dist/lifecycle.d.ts +7 -0
  82. package/dist/lifecycle.d.ts.map +1 -0
  83. package/dist/lifecycle.js +268 -0
  84. package/dist/listing.d.ts +53 -0
  85. package/dist/listing.d.ts.map +1 -0
  86. package/dist/listing.js +176 -0
  87. package/dist/live.d.ts +5 -4
  88. package/dist/live.d.ts.map +1 -1
  89. package/dist/live.js +62 -23
  90. package/dist/locks.d.ts +9 -0
  91. package/dist/locks.d.ts.map +1 -0
  92. package/dist/locks.js +61 -0
  93. package/dist/log.d.ts +1 -0
  94. package/dist/log.d.ts.map +1 -1
  95. package/dist/lost.d.ts +5 -0
  96. package/dist/lost.d.ts.map +1 -0
  97. package/dist/lost.js +61 -0
  98. package/dist/media.d.ts +1 -1
  99. package/dist/media.d.ts.map +1 -1
  100. package/dist/media.js +19 -9
  101. package/dist/memory.d.ts +11 -4
  102. package/dist/memory.d.ts.map +1 -1
  103. package/dist/memory.js +172 -82
  104. package/dist/messages.d.ts +27 -3
  105. package/dist/messages.d.ts.map +1 -1
  106. package/dist/messages.js +97 -19
  107. package/dist/model.d.ts +2 -10
  108. package/dist/model.d.ts.map +1 -1
  109. package/dist/model.js +0 -18
  110. package/dist/models.d.ts +14 -0
  111. package/dist/models.d.ts.map +1 -0
  112. package/dist/models.js +195 -0
  113. package/dist/observation.d.ts +2 -2
  114. package/dist/observation.d.ts.map +1 -1
  115. package/dist/observation.js +14 -14
  116. package/dist/opened.js +3 -3
  117. package/dist/opening.d.ts +4 -0
  118. package/dist/opening.d.ts.map +1 -0
  119. package/dist/opening.js +57 -0
  120. package/dist/outcome.d.ts +4 -4
  121. package/dist/outcome.d.ts.map +1 -1
  122. package/dist/outcome.js +3 -0
  123. package/dist/overlay.d.ts +1 -0
  124. package/dist/overlay.d.ts.map +1 -1
  125. package/dist/overlay.js +11 -0
  126. package/dist/parts.d.ts +60 -0
  127. package/dist/parts.d.ts.map +1 -0
  128. package/dist/parts.js +126 -0
  129. package/dist/paths.d.ts +1 -0
  130. package/dist/paths.d.ts.map +1 -1
  131. package/dist/paths.js +22 -0
  132. package/dist/preparation.d.ts +20 -0
  133. package/dist/preparation.d.ts.map +1 -0
  134. package/dist/preparation.js +226 -0
  135. package/dist/queries.d.ts +16 -0
  136. package/dist/queries.d.ts.map +1 -0
  137. package/dist/queries.js +272 -0
  138. package/dist/query.d.ts +14 -209
  139. package/dist/query.d.ts.map +1 -1
  140. package/dist/query.js +3 -505
  141. package/dist/questions.d.ts +34 -0
  142. package/dist/questions.d.ts.map +1 -0
  143. package/dist/questions.js +122 -0
  144. package/dist/reach.d.ts +15 -13
  145. package/dist/reach.d.ts.map +1 -1
  146. package/dist/reach.js +183 -137
  147. package/dist/react.d.ts +10 -2
  148. package/dist/react.d.ts.map +1 -1
  149. package/dist/read.d.ts +7 -0
  150. package/dist/read.d.ts.map +1 -0
  151. package/dist/read.js +17 -0
  152. package/dist/readiness.d.ts +2 -16
  153. package/dist/readiness.d.ts.map +1 -1
  154. package/dist/readiness.js +4 -10
  155. package/dist/reads.d.ts +36 -10
  156. package/dist/reads.d.ts.map +1 -1
  157. package/dist/reads.js +158 -78
  158. package/dist/recovery.d.ts +1 -0
  159. package/dist/recovery.d.ts.map +1 -1
  160. package/dist/recovery.js +35 -1
  161. package/dist/refresh.d.ts +7 -5
  162. package/dist/refresh.d.ts.map +1 -1
  163. package/dist/refresh.js +33 -5
  164. package/dist/refusal.d.ts +5 -0
  165. package/dist/refusal.d.ts.map +1 -0
  166. package/dist/refusal.js +56 -0
  167. package/dist/replica.d.ts +9 -9
  168. package/dist/replica.d.ts.map +1 -1
  169. package/dist/replica.js +53 -21
  170. package/dist/room-draft.d.ts +4 -3
  171. package/dist/room-draft.d.ts.map +1 -1
  172. package/dist/room-draft.js +67 -54
  173. package/dist/room-drafts.d.ts +24 -0
  174. package/dist/room-drafts.d.ts.map +1 -0
  175. package/dist/room-drafts.js +217 -0
  176. package/dist/rows.d.ts +14 -21
  177. package/dist/rows.d.ts.map +1 -1
  178. package/dist/rows.js +48 -184
  179. package/dist/runtime.d.ts +43 -0
  180. package/dist/runtime.d.ts.map +1 -0
  181. package/dist/runtime.js +1 -0
  182. package/dist/save.d.ts +5 -1
  183. package/dist/save.d.ts.map +1 -1
  184. package/dist/save.js +21 -20
  185. package/dist/saves.d.ts +70 -0
  186. package/dist/saves.d.ts.map +1 -0
  187. package/dist/saves.js +1005 -0
  188. package/dist/search.d.ts +12 -63
  189. package/dist/search.d.ts.map +1 -1
  190. package/dist/search.js +9 -52
  191. package/dist/seed.d.ts +11 -2
  192. package/dist/seed.d.ts.map +1 -1
  193. package/dist/seed.js +71 -0
  194. package/dist/shared.d.ts +1 -7
  195. package/dist/shared.d.ts.map +1 -1
  196. package/dist/shared.js +13 -105
  197. package/dist/shown.d.ts +31 -0
  198. package/dist/shown.d.ts.map +1 -0
  199. package/dist/shown.js +292 -0
  200. package/dist/socket/admission.d.ts +7 -0
  201. package/dist/socket/admission.d.ts.map +1 -0
  202. package/dist/socket/admission.js +39 -0
  203. package/dist/socket/answers.d.ts +6 -0
  204. package/dist/socket/answers.d.ts.map +1 -0
  205. package/dist/socket/answers.js +20 -0
  206. package/dist/socket/lanes.d.ts +20 -0
  207. package/dist/socket/lanes.d.ts.map +1 -0
  208. package/dist/socket/lanes.js +77 -0
  209. package/dist/socket/reads.d.ts +10 -0
  210. package/dist/socket/reads.d.ts.map +1 -0
  211. package/dist/socket/reads.js +31 -0
  212. package/dist/socket/rooms.d.ts +44 -0
  213. package/dist/socket/rooms.d.ts.map +1 -0
  214. package/dist/socket/rooms.js +90 -0
  215. package/dist/socket/session.d.ts +39 -0
  216. package/dist/socket/session.d.ts.map +1 -0
  217. package/dist/socket/session.js +23 -0
  218. package/dist/socket.d.ts +70 -0
  219. package/dist/socket.d.ts.map +1 -0
  220. package/dist/socket.js +175 -0
  221. package/dist/source.d.ts +61 -0
  222. package/dist/source.d.ts.map +1 -0
  223. package/dist/source.js +82 -0
  224. package/dist/status.d.ts +0 -6
  225. package/dist/status.d.ts.map +1 -1
  226. package/dist/status.js +0 -6
  227. package/dist/store/fences.d.ts +16 -0
  228. package/dist/store/fences.d.ts.map +1 -0
  229. package/dist/store/fences.js +26 -0
  230. package/dist/store/installs.d.ts +30 -0
  231. package/dist/store/installs.d.ts.map +1 -0
  232. package/dist/store/installs.js +34 -0
  233. package/dist/store/readiness.d.ts +10 -0
  234. package/dist/store/readiness.d.ts.map +1 -0
  235. package/dist/store/readiness.js +52 -0
  236. package/dist/store/records.d.ts +212 -0
  237. package/dist/store/records.d.ts.map +1 -0
  238. package/dist/store/records.js +431 -0
  239. package/dist/store/room-held.d.ts +8 -0
  240. package/dist/store/room-held.d.ts.map +1 -0
  241. package/dist/store/room-held.js +17 -0
  242. package/dist/store/space.d.ts +11 -0
  243. package/dist/store/space.d.ts.map +1 -0
  244. package/dist/store/space.js +41 -0
  245. package/dist/store/watchers.d.ts +17 -0
  246. package/dist/store/watchers.d.ts.map +1 -0
  247. package/dist/store/watchers.js +56 -0
  248. package/dist/store/writes.d.ts +24 -0
  249. package/dist/store/writes.d.ts.map +1 -0
  250. package/dist/store/writes.js +125 -0
  251. package/dist/store.d.ts +107 -157
  252. package/dist/store.d.ts.map +1 -1
  253. package/dist/store.js +143 -395
  254. package/dist/stored.d.ts +59 -38
  255. package/dist/stored.d.ts.map +1 -1
  256. package/dist/stored.js +285 -205
  257. package/dist/surface.d.ts +88 -0
  258. package/dist/surface.d.ts.map +1 -0
  259. package/dist/surface.js +223 -0
  260. package/dist/sync.d.ts +19 -0
  261. package/dist/sync.d.ts.map +1 -0
  262. package/dist/sync.js +532 -0
  263. package/dist/tables.d.ts +120 -56
  264. package/dist/tables.d.ts.map +1 -1
  265. package/dist/tables.js +217 -98
  266. package/dist/tallies.d.ts +18 -0
  267. package/dist/tallies.d.ts.map +1 -0
  268. package/dist/tallies.js +129 -0
  269. package/dist/transfer.d.ts +0 -5
  270. package/dist/transfer.d.ts.map +1 -1
  271. package/dist/validation.d.ts +3 -4
  272. package/dist/validation.d.ts.map +1 -1
  273. package/dist/validation.js +42 -100
  274. package/dist/windows.d.ts +1 -12
  275. package/dist/windows.d.ts.map +1 -1
  276. package/dist/windows.js +2 -75
  277. package/dist/wire.d.ts +17 -5
  278. package/dist/wire.d.ts.map +1 -1
  279. package/dist/wire.js +7 -1
  280. package/package.json +2 -2
  281. package/dist/fence.d.ts +0 -6
  282. package/dist/fence.d.ts.map +0 -1
  283. package/dist/fence.js +0 -10
  284. package/dist/fulltext.d.ts +0 -27
  285. package/dist/fulltext.d.ts.map +0 -1
  286. package/dist/fulltext.js +0 -370
  287. package/dist/words.d.ts +0 -19
  288. package/dist/words.d.ts.map +0 -1
  289. package/dist/words.js +0 -156
package/dist/read.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export type Fields = Readonly<Record<string, unknown>>;
2
+ export declare const EXCERPT = 512;
3
+ export declare function excerpt(said: string): string;
4
+ export declare function record(entry: unknown): Fields;
5
+ export declare function text(fields: Fields, name: string): string | null;
6
+ export declare function list(fields: Fields, name: string): readonly unknown[];
7
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEvD,eAAO,MAAM,OAAO,MAAM,CAAC;AAE3B,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAI7C;AAED,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGhE;AAED,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE,CAGrE"}
package/dist/read.js ADDED
@@ -0,0 +1,17 @@
1
+ export const EXCERPT = 512;
2
+ export function excerpt(said) {
3
+ return [...said.slice(0, EXCERPT * 2)].slice(0, EXCERPT).join('');
4
+ }
5
+ export function record(entry) {
6
+ return typeof entry === 'object' && entry !== null && !Array.isArray(entry)
7
+ ? entry
8
+ : {};
9
+ }
10
+ export function text(fields, name) {
11
+ const value = fields[name];
12
+ return typeof value === 'string' && value !== '' ? value : null;
13
+ }
14
+ export function list(fields, name) {
15
+ const value = fields[name];
16
+ return Array.isArray(value) ? value : [];
17
+ }
@@ -1,45 +1,32 @@
1
1
  import type { Open } from './open.js';
2
2
  export type CodeAvailability = Open<'stored' | 'absent'>;
3
- export type RoomPreparation = Open<'complete' | 'acquiring' | 'preparing' | 'refused' | 'unadmitted'>;
3
+ export type RoomPreparation = Open<'complete' | 'acquiring' | 'preparing' | 'unadmitted'>;
4
4
  export type RoomCoverage = {
5
5
  readonly room: string;
6
6
  readonly state: RoomPreparation;
7
7
  };
8
8
  export type ConversationCoverage = Open<'complete' | 'acquiring' | 'undeclared'>;
9
- export type SearchObligation = Open<'required' | 'unused'>;
10
9
  export type TargetCoverage = {
11
10
  readonly complete: boolean;
12
11
  readonly listed: boolean;
13
12
  readonly rooms: readonly RoomCoverage[];
14
13
  readonly conversations: ConversationCoverage;
15
- readonly search: SearchObligation;
16
14
  };
17
15
  export type Persistence = Open<'granted' | 'denied' | 'unavailable'>;
18
16
  export type Durability = Open<'persistent' | 'best-effort'>;
19
17
  export type ConnectionAvailability = Open<'connected' | 'connecting' | 'unreachable'>;
20
18
  export type HouseOutcome = Open<'open' | 'write-halted' | 'refused'>;
21
19
  export type Space = Open<'full'>;
22
- export type RefusedRoom = {
23
- readonly room: string;
24
- readonly name: string;
25
- readonly file: string;
26
- readonly rule: string;
27
- readonly location: string | null;
28
- };
29
20
  export type InstallationStep = Open<'downloading' | 'writing' | 'replaying'>;
30
- export type InstallationPause = Open<'hidden'>;
31
21
  export type InstallationAmount = {
32
22
  readonly done: number;
33
23
  readonly total: number;
34
24
  };
35
25
  export type Installation = {
36
26
  readonly step: InstallationStep | null;
37
- readonly paused: InstallationPause | null;
38
- readonly rooms: InstallationAmount;
39
- readonly parts: InstallationAmount;
40
27
  readonly bytes: InstallationAmount;
41
28
  };
42
- export type ReadinessStatus = Open<'preparing' | 'paused' | 'refused' | 'ready' | 'lost'>;
29
+ export type ReadinessStatus = Open<'preparing' | 'paused' | 'ready' | 'lost'>;
43
30
  export type Readiness = {
44
31
  readonly status: ReadinessStatus;
45
32
  readonly ready: boolean;
@@ -52,7 +39,6 @@ export type Readiness = {
52
39
  readonly house: HouseOutcome;
53
40
  readonly space: Space | null;
54
41
  readonly installation: Installation;
55
- readonly refused: readonly RefusedRoom[];
56
42
  readonly lost: boolean;
57
43
  };
58
44
  export type ReadinessFacts = Omit<Readiness, 'status' | 'ready' | 'usable' | 'durability' | 'coverage'> & {
@@ -1 +1 @@
1
- {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"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"}
package/dist/readiness.js CHANGED
@@ -1,27 +1,21 @@
1
1
  const COMPLETE_ROOMS = new Set(['complete', 'unadmitted']);
2
- const SETTLED_ROOMS = new Set([...COMPLETE_ROOMS, 'refused']);
3
2
  export function readinessOf(facts) {
4
3
  const { established, coverage: held, ...reported } = facts;
5
4
  const settledConversations = held.conversations === 'complete' || held.conversations === 'undeclared';
6
5
  const complete = held.listed &&
7
6
  settledConversations &&
8
7
  held.rooms.every((room) => COMPLETE_ROOMS.has(room.state));
9
- const settled = held.listed &&
10
- settledConversations &&
11
- held.rooms.every((room) => SETTLED_ROOMS.has(room.state));
12
8
  const coverage = { ...held, complete };
13
9
  const stored = facts.code === 'stored';
14
10
  const ready = stored && complete;
15
11
  const usable = stored && (ready || established);
16
12
  const status = ready
17
13
  ? 'ready'
18
- : facts.space !== null || facts.installation.paused !== null
14
+ : facts.space !== null
19
15
  ? 'paused'
20
- : settled && !complete
21
- ? 'refused'
22
- : facts.lost && !established
23
- ? 'lost'
24
- : 'preparing';
16
+ : facts.lost && !established
17
+ ? 'lost'
18
+ : 'preparing';
25
19
  return {
26
20
  ...reported,
27
21
  coverage,
package/dist/reads.d.ts CHANGED
@@ -1,11 +1,37 @@
1
- import type { Adapter } from './adapter.js';
2
- import type { Reads } from './bootstrap.js';
3
- export type DoorReads = Reads & {
4
- carried(locator: string): number;
5
- finished(locator: string, turn: number): void;
6
- opened(): void;
7
- applied(): void;
8
- lost(): void;
9
- };
10
- export declare function doorReads(adapter: Adapter, declaration: (locator: string) => unknown, generation: () => number): DoorReads;
1
+ import { type CallResult } from './outcome.js';
2
+ import type { Recovery } from './recovery.js';
3
+ import type { Connection, RuntimeDatabase } from './tables.js';
4
+ export declare const READ_TABLES: readonly string[];
5
+ export type ReadAt = {
6
+ readonly name: string;
7
+ readonly input: string;
8
+ readonly build: string;
9
+ };
10
+ export type ObservedRead = {
11
+ readonly answer: unknown;
12
+ readonly failure: CallResult | null;
13
+ readonly kept: boolean;
14
+ };
15
+ export type ReadAnswers = {
16
+ watch(name: string, input: unknown, deliver: (read: ObservedRead) => void): () => void;
17
+ again(): void;
18
+ reopened(): void;
19
+ };
20
+ export type ReadAnswersOptions = {
21
+ readonly database: RuntimeDatabase;
22
+ readonly build: string;
23
+ readonly unkept: readonly string[];
24
+ readonly leading: readonly string[];
25
+ readonly recovery: Recovery;
26
+ call(name: string, input: unknown): Promise<CallResult>;
27
+ online(): boolean;
28
+ streaming(): boolean;
29
+ closed(): boolean;
30
+ full(): boolean;
31
+ filled(): void;
32
+ };
33
+ export declare function storedRead(connection: Connection, { name, input, build }: ReadAt): string | null;
34
+ export declare function keptRead(connection: Connection, { name, input, build }: ReadAt, answer: string): null;
35
+ export declare function readsOfOtherBuildsForgotten(connection: Connection, build: string): null;
36
+ export declare function readAnswers(options: ReadAnswersOptions): ReadAnswers;
11
37
  //# sourceMappingURL=reads.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reads.d.ts","sourceRoot":"","sources":["../src/reads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAgD,MAAM,cAAc,CAAC;AAC1F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG;IAC9B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,IAAI,CAAC;IAChB,IAAI,IAAI,IAAI,CAAC;CACd,CAAC;AA2BF,wBAAgB,SAAS,CACvB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,EACzC,UAAU,EAAE,MAAM,MAAM,GACvB,SAAS,CA4EX"}
1
+ {"version":3,"file":"reads.d.ts","sourceRoot":"","sources":["../src/reads.ts"],"names":[],"mappings":"AACA,OAAO,EAA6B,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE/D,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAExC,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACvF,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,IAAI,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,IAAI,OAAO,CAAC;IAClB,SAAS,IAAI,OAAO,CAAC;IACrB,MAAM,IAAI,OAAO,CAAC;IAClB,IAAI,IAAI,OAAO,CAAC;IAChB,MAAM,IAAI,IAAI,CAAC;CAChB,CAAC;AAeF,wBAAgB,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMhG;AAED,wBAAgB,QAAQ,CACtB,UAAU,EAAE,UAAU,EACtB,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAC9B,MAAM,EAAE,MAAM,GACb,IAAI,CAMN;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGvF;AAMD,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,WAAW,CAsJpE"}
package/dist/reads.js CHANGED
@@ -1,91 +1,171 @@
1
- function declaredAs(declaration) {
2
- if (declaration === null || typeof declaration !== 'object')
3
- return declaration;
4
- const { roomVersion: _version, ...declared } = declaration;
5
- return declared;
1
+ import { refusedForSpace } from './durability.js';
2
+ import { answeredResult, UNCERTAIN } from './outcome.js';
3
+ export const READ_TABLES = [
4
+ 'CREATE TABLE read_answers (name TEXT NOT NULL, input TEXT NOT NULL, build TEXT NOT NULL, answer TEXT NOT NULL, PRIMARY KEY (name, input)) WITHOUT ROWID',
5
+ ];
6
+ export function storedRead(connection, { name, input, build }) {
7
+ const [held] = connection.rows('SELECT answer FROM read_answers WHERE name = ? AND input = ? AND build = ?', [name, input, build]);
8
+ return held === undefined ? null : String(held.answer);
6
9
  }
7
- function failed(answer) {
8
- return answer.kind === 'transport-uncertainty';
10
+ export function keptRead(connection, { name, input, build }, answer) {
11
+ connection.run('INSERT OR REPLACE INTO read_answers (name, input, build, answer) VALUES (?, ?, ?, ?)', [name, input, build, answer]);
12
+ return null;
9
13
  }
10
- function continues(answer) {
11
- return answer?.kind === 'net-advancement' && answer.pageToken !== undefined;
14
+ export function readsOfOtherBuildsForgotten(connection, build) {
15
+ connection.run('DELETE FROM read_answers WHERE build <> ?', [build]);
16
+ return null;
12
17
  }
13
- export function doorReads(adapter, declaration, generation) {
14
- const reading = new Map();
15
- const taken = new Map();
16
- let carrying = false;
17
- function joined(authorization, request) {
18
- const key = `${request.locator} ${request.pageToken ?? ''}`;
19
- const asked = JSON.stringify([declaredAs(declaration(request.locator)), request]);
20
- const asking = generation();
21
- const current = reading.get(key);
22
- if (current !== undefined &&
23
- current.authorization === authorization &&
24
- current.asked === asked &&
25
- (!current.settled || current.holder < asking)) {
26
- if (current.settled && !current.continued)
27
- reading.delete(key);
28
- else
29
- current.holder = Math.max(current.holder, asking);
30
- if (current.from === asking)
31
- return current.answer;
32
- const again = () => joined(authorization, request);
33
- return current.answer.then((answer) => {
34
- if (failed(answer))
35
- return again();
36
- taken.set(request.locator, (taken.get(request.locator) ?? 0) + 1);
37
- return answer;
38
- }, again);
18
+ function answered(result) {
19
+ return result.kind === 'action' && answeredResult(result.result);
20
+ }
21
+ export function readAnswers(options) {
22
+ const { database, build, recovery } = options;
23
+ const unkept = new Set(options.unkept);
24
+ const leading = new Set(options.leading);
25
+ const reads = new Map();
26
+ function leads(read) {
27
+ return leading.has(read.at.name);
28
+ }
29
+ function show(read, shown) {
30
+ read.shown = shown;
31
+ for (const deliver of read.observers)
32
+ deliver(shown);
33
+ }
34
+ async function kept(read, answer) {
35
+ if (!read.shown.kept || options.full())
36
+ return;
37
+ await database.ask({ kind: 'read.keep', ...read.at, answer }).catch((error) => {
38
+ if (refusedForSpace(error))
39
+ options.filled();
40
+ });
41
+ }
42
+ async function asked(read, led) {
43
+ if (!options.online()) {
44
+ read.owed = true;
45
+ return;
39
46
  }
40
- const answer = adapter.refresh(authorization, request);
41
- const sent = {
42
- locator: request.locator,
43
- authorization,
44
- asked,
45
- answer,
46
- from: asking,
47
- holder: asking,
48
- settled: false,
49
- continued: false,
50
- };
51
- reading.set(key, sent);
52
- const settled = (result, kept) => {
53
- sent.settled = true;
54
- sent.continued = kept && continues(result);
55
- if (reading.get(key) !== sent)
56
- return;
57
- const live = sent.holder === generation();
58
- if (!kept || (live ? !sent.continued : !carrying))
59
- reading.delete(key);
47
+ const result = await options.call(read.at.name, read.asked).catch(() => UNCERTAIN);
48
+ if (options.closed())
49
+ return;
50
+ read.owed = !answered(result);
51
+ if (read.owed) {
52
+ show(read, { ...read.shown, failure: result });
53
+ return;
54
+ }
55
+ const answer = result.result;
56
+ const text = JSON.stringify(answer);
57
+ if (text === read.text && read.shown.failure === null)
58
+ return;
59
+ read.text = text;
60
+ await kept(read, text);
61
+ await led;
62
+ if (!options.closed())
63
+ show(read, { ...read.shown, answer, failure: null });
64
+ }
65
+ function lost(read) {
66
+ return read.owed && read.shown.failure?.kind === 'transport-uncertainty' && options.streaming();
67
+ }
68
+ function retrying(read) {
69
+ return `${read.key} again`;
70
+ }
71
+ function askedLater(read) {
72
+ void recovery.attempt(retrying(read), async () => {
73
+ if (options.closed() || read.observers.size === 0 || !lost(read))
74
+ return 'done';
75
+ await attempted(read);
76
+ return lost(read) ? 'again' : 'done';
77
+ }, { again: true });
78
+ }
79
+ function forgotten(read) {
80
+ read.text = null;
81
+ read.shown = { ...read.shown, answer: null, failure: null };
82
+ }
83
+ function attempted(read, led) {
84
+ read.asking = true;
85
+ return recovery
86
+ .attempt(read.key, async () => {
87
+ await asked(read, led);
88
+ return 'done';
89
+ })
90
+ .finally(() => {
91
+ const unanswered = read.joined && read.owed;
92
+ read.asking = false;
93
+ read.joined = false;
94
+ if (unanswered)
95
+ void ask(read);
96
+ });
97
+ }
98
+ function ask(read, led) {
99
+ return attempted(read, led).finally(() => {
100
+ if (lost(read))
101
+ askedLater(read);
102
+ });
103
+ }
104
+ function opened(name, input, key) {
105
+ const held = !unkept.has(name);
106
+ const read = {
107
+ key,
108
+ at: { name, input: JSON.stringify(input ?? null), build },
109
+ asked: input,
110
+ observers: new Set(),
111
+ stored: Promise.resolve(),
112
+ text: null,
113
+ shown: { answer: null, failure: null, kept: held },
114
+ owed: false,
115
+ asking: false,
116
+ joined: false,
60
117
  };
61
- answer.then((result) => settled(result, !failed(result)), () => settled(null, false));
62
- return answer;
118
+ if (held) {
119
+ read.stored = database.ask({ kind: 'read.stored', ...read.at }).then((text) => {
120
+ if (text === null || read.text !== null)
121
+ return;
122
+ read.text = text;
123
+ read.shown = { ...read.shown, answer: JSON.parse(text) };
124
+ }, () => { });
125
+ }
126
+ reads.set(key, read);
127
+ return read;
63
128
  }
64
129
  return {
65
- bootstrap: (authorization, request) => adapter.bootstrap(authorization, request),
66
- refresh: joined,
67
- reached: (locator, roomVersion, target) => adapter.reached(locator, roomVersion, target),
68
- carried: (locator) => taken.get(locator) ?? 0,
69
- finished(locator, turn) {
70
- for (const [key, held] of reading) {
71
- if (held.locator !== locator || !held.settled || held.holder !== turn)
72
- continue;
73
- if (turn === generation() || !carrying)
74
- reading.delete(key);
75
- }
130
+ watch(name, input, deliver) {
131
+ const key = JSON.stringify([name, input ?? null]);
132
+ const read = reads.get(key) ?? opened(name, input, key);
133
+ read.observers.add(deliver);
134
+ void read.stored.then(() => {
135
+ if (!read.observers.has(deliver))
136
+ return;
137
+ if (!read.shown.kept)
138
+ forgotten(read);
139
+ deliver(read.shown);
140
+ if (read.asking)
141
+ read.joined = true;
142
+ else
143
+ void ask(read);
144
+ });
145
+ return () => {
146
+ read.observers.delete(deliver);
147
+ if (read.observers.size === 0 && reads.get(key) === read)
148
+ reads.delete(key);
149
+ };
76
150
  },
77
- opened() {
78
- carrying = true;
151
+ again() {
152
+ const all = [...reads.values()];
153
+ const led = Promise.all(all.filter(leads).map((read) => ask(read)));
154
+ for (const read of all)
155
+ if (!leads(read))
156
+ void ask(read, led);
79
157
  },
80
- applied() {
81
- carrying = false;
82
- for (const [key, held] of reading) {
83
- if (held.settled && held.holder !== generation())
84
- reading.delete(key);
158
+ reopened() {
159
+ for (const read of reads.values()) {
160
+ recovery.cancel(retrying(read));
161
+ if (read.text === null) {
162
+ if (read.owed)
163
+ void ask(read);
164
+ }
165
+ else if (read.shown.failure?.kind === 'transport-uncertainty') {
166
+ show(read, { ...read.shown, failure: null });
167
+ }
85
168
  }
86
169
  },
87
- lost() {
88
- reading.clear();
89
- },
90
170
  };
91
171
  }
@@ -21,5 +21,6 @@ export type Recovery = {
21
21
  retire(): Promise<void>;
22
22
  };
23
23
  export declare function retryDelay(tries: number, firstMs?: number, maxMs?: number): number;
24
+ export declare function untilAnswered<T>(ask: () => Promise<T>, signal: AbortSignal, answered?: (answer: T) => boolean): Promise<T>;
24
25
  export declare function createRecovery(options?: RecoveryOptions): Recovery;
25
26
  //# sourceMappingURL=recovery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACnC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB,CAAC;AAsBF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAW,EAAE,KAAK,SAAS,GAAG,MAAM,CAGpF;AAwKD,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAStE"}
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACnC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB,CAAC;AAsBF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAW,EAAE,KAAK,SAAS,GAAG,MAAM,CAGpF;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACrB,MAAM,EAAE,WAAW,EACnB,QAAQ,GAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAoB,GAC5C,OAAO,CAAC,CAAC,CAAC,CAsBZ;AA8KD,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAStE"}
package/dist/recovery.js CHANGED
@@ -7,6 +7,32 @@ export function retryDelay(tries, firstMs = FIRST_MS, maxMs = MAX_MS) {
7
7
  const longest = Math.min(maxMs, firstMs * 2 ** tries);
8
8
  return longest / 2 + (Math.random() * longest) / 2;
9
9
  }
10
+ export async function untilAnswered(ask, signal, answered = () => true) {
11
+ for (let tries = 0;; tries += 1) {
12
+ try {
13
+ const answer = await ask();
14
+ if (answered(answer) || signal.aborted)
15
+ return answer;
16
+ }
17
+ catch (error) {
18
+ if (signal.aborted)
19
+ throw error;
20
+ }
21
+ await new Promise((resume) => {
22
+ const stop = () => {
23
+ clearTimeout(again);
24
+ resume();
25
+ };
26
+ // A read that failed is asked again on the doubling backoff, so its asker is answered once the failure clears.
27
+ const again = setTimeout(() => {
28
+ signal.removeEventListener('abort', stop);
29
+ resume();
30
+ }, retryDelay(tries));
31
+ signal.addEventListener('abort', stop, { once: true });
32
+ });
33
+ signal.throwIfAborted();
34
+ }
35
+ }
10
36
  function owner(backoff, inFlight, release = () => { }) {
11
37
  const intents = new Map();
12
38
  const children = new Set();
@@ -80,7 +106,15 @@ function owner(backoff, inFlight, release = () => { }) {
80
106
  }
81
107
  intent.tries += 1;
82
108
  if (intent.tries >= backoff.attempts) {
83
- finish(key, intent, false);
109
+ if (again === null) {
110
+ finish(key, intent, false);
111
+ return;
112
+ }
113
+ intent.tries = 0;
114
+ if (again === 'now')
115
+ launch(key, intent);
116
+ else
117
+ wait(key, intent, again, true);
84
118
  return;
85
119
  }
86
120
  if (result === 'again') {
package/dist/refresh.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { AdapterFailure, Authorization, RefreshPage, RetryableRefusal } from './adapter.js';
2
- import type { Reads, Remodel } from './bootstrap.js';
1
+ import type { AdapterFailure, Authorization, RefreshPage, RefreshRequest, RefreshResult, RetryableRefusal } from './adapter.js';
2
+ import type { Remodel } from './bootstrap.js';
3
3
  import type { ReplicaRecord } from './replica.js';
4
4
  import type { RefreshedPage } from './store.js';
5
5
  import type { HeldEntry, StoredEntry } from './tables.js';
@@ -13,13 +13,15 @@ export type Advancement = {
13
13
  } | {
14
14
  kind: 'beyond-horizon';
15
15
  } | RetryableRefusal | Unconfirmed | AdapterFailure;
16
+ export type Refresher = (authorization: Authorization, request: RefreshRequest) => Promise<RefreshResult>;
16
17
  export type Refreshing = {
17
- turn(): Promise<void>;
18
+ turn(): void;
18
19
  prior(paths: readonly string[]): Promise<ReadonlyMap<string, HeldEntry>>;
20
+ later(paths: readonly string[], roomVersion: string): Promise<ReadonlySet<string>>;
19
21
  stage(page: RefreshedPage): Promise<boolean>;
20
22
  };
21
- type PageContent = Pick<RefreshPage, 'documents' | 'revisions' | 'fileIds' | 'changes' | 'binaryFiles'>;
23
+ type PageContent = Pick<RefreshPage, 'documents' | 'facts' | 'revisions' | 'fileIds' | 'created' | 'changes' | 'binaryFiles'>;
22
24
  export declare function pageEntries(page: PageContent, removals: readonly string[], roomVersion: string, prior: (paths: readonly string[]) => Promise<ReadonlyMap<string, HeldEntry>>): Promise<StoredEntry[]>;
23
- export declare function advancement(adapter: Reads, authorization: Authorization, held: ReplicaRecord, remodel: Remodel, continuing: () => boolean, staging: Refreshing): Promise<Advancement>;
25
+ export declare function advancement(refresh: Refresher, authorization: Authorization, held: ReplicaRecord, remodel: Remodel, continuing: () => boolean, staging: Refreshing): Promise<Advancement>;
24
26
  export {};
25
27
  //# sourceMappingURL=refresh.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAG9D,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,cAAc,CAAC;AAEnB,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACzE,KAAK,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C,CAAC;AASF,KAAK,WAAW,GAAG,IAAI,CACrB,WAAW,EACX,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAClE,CAAC;AAmFF,wBAAsB,WAAW,CAC/B,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,GAC3E,OAAO,CAAC,WAAW,EAAE,CAAC,CAKxB;AAeD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,KAAK,EACd,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,EACzB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,WAAW,CAAC,CA8CtB"}
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,WAAW,EACX,cAAc,EACd,aAAa,EACb,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAG9D,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,cAAc,CAAC;AAEnB,MAAM,MAAM,SAAS,GAAG,CACtB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACzE,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IACnF,KAAK,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C,CAAC;AASF,KAAK,WAAW,GAAG,IAAI,CACrB,WAAW,EACX,WAAW,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CACxF,CAAC;AAwFF,wBAAsB,WAAW,CAC/B,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,GAC3E,OAAO,CAAC,WAAW,EAAE,CAAC,CAKxB;AAgDD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,EACzB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,WAAW,CAAC,CA8CtB"}
package/dist/refresh.js CHANGED
@@ -45,9 +45,11 @@ function* entering(page, roomVersion, listed, prior) {
45
45
  entries.push({
46
46
  path,
47
47
  content: page.documents[path],
48
+ facts: page.facts[path] ?? null,
48
49
  binary: null,
49
50
  revision: page.revisions[path] ?? prior.get(path)?.revision ?? null,
50
51
  fileId: page.fileIds?.[path] ?? null,
52
+ created: page.created?.[path] ?? null,
51
53
  change: page.changes[path] ?? null,
52
54
  written: roomVersion,
53
55
  });
@@ -57,9 +59,11 @@ function* entering(page, roomVersion, listed, prior) {
57
59
  entries.push({
58
60
  path,
59
61
  content: null,
62
+ facts: null,
60
63
  binary: { state: 'accepted', ...page.binaryFiles[path] },
61
64
  revision: page.revisions[path] ?? prior.get(path)?.revision ?? null,
62
65
  fileId: page.fileIds?.[path] ?? null,
66
+ created: page.created?.[path] ?? null,
63
67
  change: page.changes[path] ?? null,
64
68
  written: null,
65
69
  });
@@ -74,6 +78,7 @@ function* entering(page, roomVersion, listed, prior) {
74
78
  ...kept,
75
79
  revision: page.revisions[path] ?? held.revision,
76
80
  fileId: page.fileIds?.[path] ?? held.fileId,
81
+ created: page.created?.[path] ?? held.created,
77
82
  change: page.changes[path] ?? held.change,
78
83
  });
79
84
  }
@@ -85,7 +90,30 @@ export async function pageEntries(page, removals, roomVersion, prior) {
85
90
  const held = listed.asked.length === 0 ? new Map() : await prior(listed.asked);
86
91
  return stepped(entering(page, roomVersion, listed, held));
87
92
  }
88
- async function pageOf(page, roomVersion, staging) {
93
+ function without(named, kept) {
94
+ return Object.fromEntries(Object.entries(named).filter(([path]) => !kept.has(path)));
95
+ }
96
+ function unwritten(page, kept) {
97
+ if (kept.size === 0)
98
+ return page;
99
+ return {
100
+ ...page,
101
+ documents: without(page.documents, kept),
102
+ facts: without(page.facts, kept),
103
+ revisions: without(page.revisions, kept),
104
+ ...(page.fileIds === undefined ? {} : { fileIds: without(page.fileIds, kept) }),
105
+ ...(page.created === undefined ? {} : { created: without(page.created, kept) }),
106
+ changes: without(page.changes, kept),
107
+ binaryFiles: without(page.binaryFiles, kept),
108
+ removals: page.removals.filter((path) => !kept.has(path)),
109
+ };
110
+ }
111
+ async function pageOf(answered, roomVersion, staging) {
112
+ const page = unwritten(answered, await staging.later([
113
+ ...Object.keys(answered.documents),
114
+ ...Object.keys(answered.binaryFiles),
115
+ ...answered.removals,
116
+ ], roomVersion));
89
117
  return {
90
118
  entries: await pageEntries(page, page.removals, roomVersion, (paths) => staging.prior(paths)),
91
119
  removals: page.removals,
@@ -93,13 +121,13 @@ async function pageOf(page, roomVersion, staging) {
93
121
  folderRemovals: page.folderRemovals ?? [],
94
122
  };
95
123
  }
96
- export async function advancement(adapter, authorization, held, remodel, continuing, staging) {
124
+ export async function advancement(refresh, authorization, held, remodel, continuing, staging) {
97
125
  const locator = held.locator;
98
126
  const fromRoomVersion = held.roomVersion;
99
- await staging.turn();
127
+ staging.turn();
100
128
  if (!continuing())
101
129
  return unconfirmed;
102
- const first = await adapter.refresh(authorization, {
130
+ const first = await refresh(authorization, {
103
131
  locator,
104
132
  selection: held.replica.selection,
105
133
  fromRoomVersion,
@@ -124,7 +152,7 @@ export async function advancement(adapter, authorization, held, remodel, continu
124
152
  await staging.turn();
125
153
  if (!continuing())
126
154
  return unconfirmed;
127
- const page = await adapter.refresh(authorization, {
155
+ const page = await refresh(authorization, {
128
156
  locator,
129
157
  selection: held.replica.selection,
130
158
  fromRoomVersion,