@agentshouse/mdruntime 0.1.0-cefbc8bb8a1c0 → 0.1.0-cf08ada271a7f

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 (303) hide show
  1. package/README.md +10 -10
  2. package/dist/acceptance.d.ts +3 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +309 -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 +95 -104
  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 +205 -88
  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/change-set.d.ts +4 -0
  22. package/dist/change-set.d.ts.map +1 -1
  23. package/dist/change-set.js +6 -0
  24. package/dist/change.d.ts +1 -0
  25. package/dist/change.d.ts.map +1 -1
  26. package/dist/change.js +4 -2
  27. package/dist/chat-types.d.ts +5 -0
  28. package/dist/chat-types.d.ts.map +1 -0
  29. package/dist/chat-types.js +13 -0
  30. package/dist/client.d.ts +24 -7
  31. package/dist/client.d.ts.map +1 -1
  32. package/dist/client.js +9 -5
  33. package/dist/collection.d.ts +23 -7
  34. package/dist/collection.d.ts.map +1 -1
  35. package/dist/collection.js +13 -19
  36. package/dist/compile.d.ts +6 -6
  37. package/dist/compile.d.ts.map +1 -1
  38. package/dist/compile.js +272 -334
  39. package/dist/connection.d.ts +5 -143
  40. package/dist/connection.d.ts.map +1 -1
  41. package/dist/connection.js +101 -5310
  42. package/dist/context.d.ts +2 -0
  43. package/dist/context.d.ts.map +1 -0
  44. package/dist/context.js +7 -0
  45. package/dist/conversation-live.d.ts +135 -0
  46. package/dist/conversation-live.d.ts.map +1 -0
  47. package/dist/conversation-live.js +247 -0
  48. package/dist/conversation-row.d.ts +33 -0
  49. package/dist/conversation-row.d.ts.map +1 -0
  50. package/dist/conversation-row.js +53 -0
  51. package/dist/conversation.d.ts +41 -47
  52. package/dist/conversation.d.ts.map +1 -1
  53. package/dist/conversation.js +873 -912
  54. package/dist/declaration.d.ts +10 -0
  55. package/dist/declaration.d.ts.map +1 -0
  56. package/dist/declaration.js +24 -0
  57. package/dist/discovery.d.ts +10 -0
  58. package/dist/discovery.d.ts.map +1 -0
  59. package/dist/discovery.js +177 -0
  60. package/dist/durability.d.ts +15 -1
  61. package/dist/durability.d.ts.map +1 -1
  62. package/dist/entry.d.ts +2 -2
  63. package/dist/entry.d.ts.map +1 -1
  64. package/dist/entry.js +17 -7
  65. package/dist/expectation.d.ts +4 -2
  66. package/dist/expectation.d.ts.map +1 -1
  67. package/dist/expectation.js +33 -11
  68. package/dist/failure.d.ts +1 -0
  69. package/dist/failure.d.ts.map +1 -1
  70. package/dist/failure.js +3 -0
  71. package/dist/figures.d.ts +49 -0
  72. package/dist/figures.d.ts.map +1 -0
  73. package/dist/figures.js +197 -0
  74. package/dist/holdings.d.ts +29 -0
  75. package/dist/holdings.d.ts.map +1 -0
  76. package/dist/holdings.js +95 -0
  77. package/dist/host.d.ts +20 -8
  78. package/dist/host.d.ts.map +1 -1
  79. package/dist/host.js +38 -33
  80. package/dist/identity.d.ts +0 -1
  81. package/dist/identity.d.ts.map +1 -1
  82. package/dist/identity.js +0 -3
  83. package/dist/index.d.ts +27 -8
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +9 -1
  86. package/dist/install.d.ts +55 -0
  87. package/dist/install.d.ts.map +1 -0
  88. package/dist/install.js +543 -0
  89. package/dist/job.d.ts +5 -0
  90. package/dist/job.d.ts.map +1 -0
  91. package/dist/job.js +7 -0
  92. package/dist/lifecycle.d.ts +7 -0
  93. package/dist/lifecycle.d.ts.map +1 -0
  94. package/dist/lifecycle.js +271 -0
  95. package/dist/listing.d.ts +53 -0
  96. package/dist/listing.d.ts.map +1 -0
  97. package/dist/listing.js +169 -0
  98. package/dist/live.d.ts +5 -4
  99. package/dist/live.d.ts.map +1 -1
  100. package/dist/live.js +64 -23
  101. package/dist/locks.d.ts +9 -0
  102. package/dist/locks.d.ts.map +1 -0
  103. package/dist/locks.js +62 -0
  104. package/dist/log.d.ts +1 -0
  105. package/dist/log.d.ts.map +1 -1
  106. package/dist/lost.d.ts +5 -0
  107. package/dist/lost.d.ts.map +1 -0
  108. package/dist/lost.js +61 -0
  109. package/dist/media.d.ts +1 -1
  110. package/dist/media.d.ts.map +1 -1
  111. package/dist/media.js +3 -3
  112. package/dist/memory.d.ts +14 -5
  113. package/dist/memory.d.ts.map +1 -1
  114. package/dist/memory.js +177 -85
  115. package/dist/messages.d.ts +24 -3
  116. package/dist/messages.d.ts.map +1 -1
  117. package/dist/messages.js +89 -31
  118. package/dist/model.d.ts +2 -11
  119. package/dist/model.d.ts.map +1 -1
  120. package/dist/model.js +0 -23
  121. package/dist/models.d.ts +10 -0
  122. package/dist/models.d.ts.map +1 -0
  123. package/dist/models.js +170 -0
  124. package/dist/observation.d.ts +2 -2
  125. package/dist/observation.d.ts.map +1 -1
  126. package/dist/observation.js +14 -14
  127. package/dist/opened.js +3 -3
  128. package/dist/opening.d.ts +4 -0
  129. package/dist/opening.d.ts.map +1 -0
  130. package/dist/opening.js +59 -0
  131. package/dist/outcome.d.ts +4 -4
  132. package/dist/outcome.d.ts.map +1 -1
  133. package/dist/outcome.js +3 -0
  134. package/dist/overlay.d.ts +3 -1
  135. package/dist/overlay.d.ts.map +1 -1
  136. package/dist/overlay.js +43 -21
  137. package/dist/parts.d.ts +11 -0
  138. package/dist/parts.d.ts.map +1 -0
  139. package/dist/parts.js +21 -0
  140. package/dist/paths.d.ts +1 -0
  141. package/dist/paths.d.ts.map +1 -1
  142. package/dist/paths.js +22 -0
  143. package/dist/preparation.d.ts +20 -0
  144. package/dist/preparation.d.ts.map +1 -0
  145. package/dist/preparation.js +233 -0
  146. package/dist/queries.d.ts +16 -0
  147. package/dist/queries.d.ts.map +1 -0
  148. package/dist/queries.js +272 -0
  149. package/dist/query.d.ts +14 -210
  150. package/dist/query.d.ts.map +1 -1
  151. package/dist/query.js +3 -505
  152. package/dist/questions.d.ts +34 -0
  153. package/dist/questions.d.ts.map +1 -0
  154. package/dist/questions.js +122 -0
  155. package/dist/queue.d.ts +39 -0
  156. package/dist/queue.d.ts.map +1 -0
  157. package/dist/queue.js +455 -0
  158. package/dist/reach.d.ts +15 -13
  159. package/dist/reach.d.ts.map +1 -1
  160. package/dist/reach.js +187 -140
  161. package/dist/react.d.ts +14 -2
  162. package/dist/react.d.ts.map +1 -1
  163. package/dist/react.js +10 -1
  164. package/dist/read.d.ts +7 -0
  165. package/dist/read.d.ts.map +1 -0
  166. package/dist/read.js +17 -0
  167. package/dist/readiness.d.ts +2 -16
  168. package/dist/readiness.d.ts.map +1 -1
  169. package/dist/readiness.js +4 -10
  170. package/dist/reads.d.ts +36 -10
  171. package/dist/reads.d.ts.map +1 -1
  172. package/dist/reads.js +160 -77
  173. package/dist/recovery.d.ts.map +1 -1
  174. package/dist/recovery.js +9 -1
  175. package/dist/refresh.d.ts +7 -5
  176. package/dist/refresh.d.ts.map +1 -1
  177. package/dist/refresh.js +35 -7
  178. package/dist/refusal.d.ts +5 -0
  179. package/dist/refusal.d.ts.map +1 -0
  180. package/dist/refusal.js +57 -0
  181. package/dist/replica.d.ts +11 -17
  182. package/dist/replica.d.ts.map +1 -1
  183. package/dist/replica.js +64 -34
  184. package/dist/room-draft.d.ts +7 -8
  185. package/dist/room-draft.d.ts.map +1 -1
  186. package/dist/room-draft.js +100 -103
  187. package/dist/room-drafts.d.ts +24 -0
  188. package/dist/room-drafts.d.ts.map +1 -0
  189. package/dist/room-drafts.js +217 -0
  190. package/dist/rows.d.ts +14 -21
  191. package/dist/rows.d.ts.map +1 -1
  192. package/dist/rows.js +49 -186
  193. package/dist/runtime.d.ts +32 -0
  194. package/dist/runtime.d.ts.map +1 -0
  195. package/dist/runtime.js +1 -0
  196. package/dist/save.d.ts +41 -86
  197. package/dist/save.d.ts.map +1 -1
  198. package/dist/save.js +239 -116
  199. package/dist/saves.d.ts +32 -0
  200. package/dist/saves.d.ts.map +1 -0
  201. package/dist/saves.js +413 -0
  202. package/dist/search.d.ts +12 -63
  203. package/dist/search.d.ts.map +1 -1
  204. package/dist/search.js +9 -52
  205. package/dist/seed.d.ts +11 -2
  206. package/dist/seed.d.ts.map +1 -1
  207. package/dist/seed.js +71 -1
  208. package/dist/shared.d.ts +1 -7
  209. package/dist/shared.d.ts.map +1 -1
  210. package/dist/shared.js +13 -105
  211. package/dist/shown.d.ts +32 -0
  212. package/dist/shown.d.ts.map +1 -0
  213. package/dist/shown.js +299 -0
  214. package/dist/socket/admission.d.ts +7 -0
  215. package/dist/socket/admission.d.ts.map +1 -0
  216. package/dist/socket/admission.js +39 -0
  217. package/dist/socket/answers.d.ts +6 -0
  218. package/dist/socket/answers.d.ts.map +1 -0
  219. package/dist/socket/answers.js +20 -0
  220. package/dist/socket/lanes.d.ts +20 -0
  221. package/dist/socket/lanes.d.ts.map +1 -0
  222. package/dist/socket/lanes.js +77 -0
  223. package/dist/socket/reads.d.ts +10 -0
  224. package/dist/socket/reads.d.ts.map +1 -0
  225. package/dist/socket/reads.js +31 -0
  226. package/dist/socket/rooms.d.ts +41 -0
  227. package/dist/socket/rooms.d.ts.map +1 -0
  228. package/dist/socket/rooms.js +90 -0
  229. package/dist/socket/session.d.ts +38 -0
  230. package/dist/socket/session.d.ts.map +1 -0
  231. package/dist/socket/session.js +23 -0
  232. package/dist/socket.d.ts +69 -0
  233. package/dist/socket.d.ts.map +1 -0
  234. package/dist/socket.js +175 -0
  235. package/dist/source.d.ts +61 -0
  236. package/dist/source.d.ts.map +1 -0
  237. package/dist/source.js +82 -0
  238. package/dist/status.d.ts +0 -6
  239. package/dist/status.d.ts.map +1 -1
  240. package/dist/status.js +0 -6
  241. package/dist/store/fences.d.ts +16 -0
  242. package/dist/store/fences.d.ts.map +1 -0
  243. package/dist/store/fences.js +26 -0
  244. package/dist/store/installs.d.ts +30 -0
  245. package/dist/store/installs.d.ts.map +1 -0
  246. package/dist/store/installs.js +34 -0
  247. package/dist/store/readiness.d.ts +10 -0
  248. package/dist/store/readiness.d.ts.map +1 -0
  249. package/dist/store/readiness.js +52 -0
  250. package/dist/store/records.d.ts +210 -0
  251. package/dist/store/records.d.ts.map +1 -0
  252. package/dist/store/records.js +428 -0
  253. package/dist/store/room-held.d.ts +8 -0
  254. package/dist/store/room-held.d.ts.map +1 -0
  255. package/dist/store/room-held.js +17 -0
  256. package/dist/store/space.d.ts +11 -0
  257. package/dist/store/space.d.ts.map +1 -0
  258. package/dist/store/space.js +41 -0
  259. package/dist/store/watchers.d.ts +17 -0
  260. package/dist/store/watchers.d.ts.map +1 -0
  261. package/dist/store/watchers.js +56 -0
  262. package/dist/store/writes.d.ts +24 -0
  263. package/dist/store/writes.d.ts.map +1 -0
  264. package/dist/store/writes.js +125 -0
  265. package/dist/store.d.ts +107 -157
  266. package/dist/store.d.ts.map +1 -1
  267. package/dist/store.js +143 -395
  268. package/dist/stored.d.ts +59 -38
  269. package/dist/stored.d.ts.map +1 -1
  270. package/dist/stored.js +279 -210
  271. package/dist/surface.d.ts +88 -0
  272. package/dist/surface.d.ts.map +1 -0
  273. package/dist/surface.js +224 -0
  274. package/dist/sync.d.ts +19 -0
  275. package/dist/sync.d.ts.map +1 -0
  276. package/dist/sync.js +530 -0
  277. package/dist/tables.d.ts +116 -56
  278. package/dist/tables.d.ts.map +1 -1
  279. package/dist/tables.js +214 -98
  280. package/dist/tallies.d.ts +18 -0
  281. package/dist/tallies.d.ts.map +1 -0
  282. package/dist/tallies.js +129 -0
  283. package/dist/transfer.d.ts +0 -5
  284. package/dist/transfer.d.ts.map +1 -1
  285. package/dist/validation.d.ts +3 -4
  286. package/dist/validation.d.ts.map +1 -1
  287. package/dist/validation.js +42 -100
  288. package/dist/windows.d.ts +1 -12
  289. package/dist/windows.d.ts.map +1 -1
  290. package/dist/windows.js +2 -75
  291. package/dist/wire.d.ts +21 -9
  292. package/dist/wire.d.ts.map +1 -1
  293. package/dist/wire.js +10 -4
  294. package/package.json +3 -2
  295. package/dist/fence.d.ts +0 -6
  296. package/dist/fence.d.ts.map +0 -1
  297. package/dist/fence.js +0 -10
  298. package/dist/fulltext.d.ts +0 -27
  299. package/dist/fulltext.d.ts.map +0 -1
  300. package/dist/fulltext.js +0 -370
  301. package/dist/words.d.ts +0 -19
  302. package/dist/words.d.ts.map +0 -1
  303. package/dist/words.js +0 -156
@@ -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":"AAEA,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,CAoJpE"}
package/dist/reads.js CHANGED
@@ -1,91 +1,174 @@
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 { uncaught } from './failure.js';
3
+ import { answeredResult, UNCERTAIN } from './outcome.js';
4
+ export const READ_TABLES = [
5
+ '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',
6
+ ];
7
+ export function storedRead(connection, { name, input, build }) {
8
+ const [held] = connection.rows('SELECT answer FROM read_answers WHERE name = ? AND input = ? AND build = ?', [name, input, build]);
9
+ return held === undefined ? null : String(held.answer);
6
10
  }
7
- function failed(answer) {
8
- return answer.kind === 'transport-uncertainty';
11
+ export function keptRead(connection, { name, input, build }, answer) {
12
+ connection.run('INSERT OR REPLACE INTO read_answers (name, input, build, answer) VALUES (?, ?, ?, ?)', [name, input, build, answer]);
13
+ return null;
9
14
  }
10
- function continues(answer) {
11
- return answer?.kind === 'net-advancement' && answer.pageToken !== undefined;
15
+ export function readsOfOtherBuildsForgotten(connection, build) {
16
+ connection.run('DELETE FROM read_answers WHERE build <> ?', [build]);
17
+ return null;
12
18
  }
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);
19
+ function answered(result) {
20
+ return result.kind === 'action' && answeredResult(result.result);
21
+ }
22
+ export function readAnswers(options) {
23
+ const { database, build, recovery } = options;
24
+ const unkept = new Set(options.unkept);
25
+ const leading = new Set(options.leading);
26
+ const reads = new Map();
27
+ function leads(read) {
28
+ return leading.has(read.at.name);
29
+ }
30
+ function show(read, shown) {
31
+ read.shown = shown;
32
+ for (const deliver of read.observers)
33
+ deliver(shown);
34
+ }
35
+ async function kept(read, answer) {
36
+ if (!read.shown.kept || options.full())
37
+ return;
38
+ await database.ask({ kind: 'read.keep', ...read.at, answer }).catch((error) => {
39
+ if (refusedForSpace(error))
40
+ options.filled();
28
41
  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);
42
+ uncaught(error);
43
+ });
44
+ }
45
+ async function asked(read, led) {
46
+ if (!options.online()) {
47
+ read.owed = true;
48
+ return;
39
49
  }
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);
50
+ const result = await options.call(read.at.name, read.asked).catch(() => UNCERTAIN);
51
+ if (options.closed())
52
+ return;
53
+ read.owed = !answered(result);
54
+ if (read.owed) {
55
+ show(read, { ...read.shown, failure: result });
56
+ return;
57
+ }
58
+ const answer = result.result;
59
+ const text = JSON.stringify(answer);
60
+ if (text === read.text && read.shown.failure === null)
61
+ return;
62
+ read.text = text;
63
+ await kept(read, text);
64
+ await led;
65
+ if (!options.closed())
66
+ show(read, { ...read.shown, answer, failure: null });
67
+ }
68
+ function lost(read) {
69
+ return read.owed && read.shown.failure?.kind === 'transport-uncertainty' && options.streaming();
70
+ }
71
+ function retrying(read) {
72
+ return `${read.key} again`;
73
+ }
74
+ function askedLater(read) {
75
+ void recovery.attempt(retrying(read), async () => {
76
+ if (options.closed() || read.observers.size === 0 || !lost(read))
77
+ return 'done';
78
+ await attempted(read);
79
+ return lost(read) ? 'again' : 'done';
80
+ }, { again: true });
81
+ }
82
+ function forgotten(read) {
83
+ read.text = null;
84
+ read.shown = { ...read.shown, answer: null, failure: null };
85
+ }
86
+ function attempted(read, led) {
87
+ read.asking = true;
88
+ return recovery
89
+ .attempt(read.key, async () => {
90
+ await asked(read, led);
91
+ return 'done';
92
+ })
93
+ .finally(() => {
94
+ const unanswered = read.joined && read.owed;
95
+ read.asking = false;
96
+ read.joined = false;
97
+ if (unanswered)
98
+ void ask(read);
99
+ });
100
+ }
101
+ function ask(read, led) {
102
+ return attempted(read, led).finally(() => {
103
+ if (lost(read))
104
+ askedLater(read);
105
+ });
106
+ }
107
+ function opened(name, input, key) {
108
+ const held = !unkept.has(name);
109
+ const read = {
110
+ key,
111
+ at: { name, input: JSON.stringify(input ?? null), build },
112
+ asked: input,
113
+ observers: new Set(),
114
+ stored: Promise.resolve(),
115
+ text: null,
116
+ shown: { answer: null, failure: null, kept: held },
117
+ owed: false,
118
+ asking: false,
119
+ joined: false,
60
120
  };
61
- answer.then((result) => settled(result, !failed(result)), () => settled(null, false));
62
- return answer;
121
+ if (held) {
122
+ read.stored = database.ask({ kind: 'read.stored', ...read.at }).then((text) => {
123
+ if (text === null || read.text !== null)
124
+ return;
125
+ read.text = text;
126
+ read.shown = { ...read.shown, answer: JSON.parse(text) };
127
+ }, uncaught);
128
+ }
129
+ reads.set(key, read);
130
+ return read;
63
131
  }
64
132
  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
- }
133
+ watch(name, input, deliver) {
134
+ const key = JSON.stringify([name, input ?? null]);
135
+ const read = reads.get(key) ?? opened(name, input, key);
136
+ read.observers.add(deliver);
137
+ void read.stored.then(() => {
138
+ if (!read.observers.has(deliver))
139
+ return;
140
+ if (!read.shown.kept)
141
+ forgotten(read);
142
+ deliver(read.shown);
143
+ if (read.asking)
144
+ read.joined = true;
145
+ else
146
+ void ask(read);
147
+ });
148
+ return () => {
149
+ read.observers.delete(deliver);
150
+ if (read.observers.size === 0 && reads.get(key) === read)
151
+ reads.delete(key);
152
+ };
76
153
  },
77
- opened() {
78
- carrying = true;
154
+ again() {
155
+ const all = [...reads.values()];
156
+ const led = Promise.all(all.filter(leads).map((read) => ask(read)));
157
+ for (const read of all)
158
+ if (!leads(read))
159
+ void ask(read, led);
79
160
  },
80
- applied() {
81
- carrying = false;
82
- for (const [key, held] of reading) {
83
- if (held.settled && held.holder !== generation())
84
- reading.delete(key);
161
+ reopened() {
162
+ for (const read of reads.values()) {
163
+ recovery.cancel(retrying(read));
164
+ if (read.text === null) {
165
+ if (read.owed)
166
+ void ask(read);
167
+ }
168
+ else if (read.shown.failure?.kind === 'transport-uncertainty') {
169
+ show(read, { ...read.shown, failure: null });
170
+ }
85
171
  }
86
172
  },
87
- lost() {
88
- reading.clear();
89
- },
90
173
  };
91
174
  }
@@ -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;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;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
@@ -106,7 +106,15 @@ function owner(backoff, inFlight, release = () => { }) {
106
106
  }
107
107
  intent.tries += 1;
108
108
  if (intent.tries >= backoff.attempts) {
109
- 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);
110
118
  return;
111
119
  }
112
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,15 +121,15 @@ 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
- selection: held.replica.selection,
132
+ selection: held.declaration.replica.selection,
105
133
  fromRoomVersion,
106
134
  });
107
135
  if (first.kind !== 'net-advancement')
@@ -124,9 +152,9 @@ 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
- selection: held.replica.selection,
157
+ selection: held.declaration.replica.selection,
130
158
  fromRoomVersion,
131
159
  pageToken,
132
160
  });
@@ -0,0 +1,5 @@
1
+ import type { ProviderRefusal } from './adapter.js';
2
+ import type { Runtime } from './runtime.js';
3
+ import type { RefusalReason } from './socket.js';
4
+ export declare function refuse(runtime: Runtime, reason: RefusalReason, provider?: ProviderRefusal | null): Promise<void>;
5
+ //# sourceMappingURL=refusal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../src/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAQpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,EACrB,QAAQ,GAAE,eAAe,GAAG,IAAW,iBAmDxC"}
@@ -0,0 +1,57 @@
1
+ import { changeSet, mergeChangeSets } from './change-set.js';
2
+ import { composedOf } from './collection.js';
3
+ import { uncaught } from './failure.js';
4
+ import { listedLocators } from './listing.js';
5
+ import { prepare } from './preparation.js';
6
+ import { storedRecord } from './replica.js';
7
+ import { emitRefusal } from './shown.js';
8
+ export async function refuse(runtime, reason, provider = null) {
9
+ const { store, socket, journal } = runtime;
10
+ socket.session.set({ paused: true });
11
+ socket.abortReads();
12
+ try {
13
+ if (reason === 'revoked-authorization') {
14
+ await store.exclusive(async () => {
15
+ const revoked = { status: 'unavailable', reason: 'revoked' };
16
+ let held = new Map();
17
+ try {
18
+ const local = await store.open();
19
+ held = await store.rooms();
20
+ await local.commit({
21
+ rooms: [...held.values()].map(({ record: kept }) => {
22
+ const record = { ...kept, model: revoked };
23
+ return {
24
+ locator: record.locator,
25
+ key: record.key,
26
+ record: storedRecord(record),
27
+ composed: composedOf(store.composed(record)),
28
+ };
29
+ }),
30
+ });
31
+ }
32
+ catch (error) {
33
+ journal.record('model revocation persistence failed');
34
+ uncaught(error);
35
+ }
36
+ const listedNow = listedLocators(runtime, held);
37
+ for (const locator of listedNow) {
38
+ if (!held.has(locator))
39
+ socket.rooms.stand(locator, { unheldModel: revoked });
40
+ }
41
+ store.changed(mergeChangeSets(listedNow.map((locator) => changeSet(locator, { documents: null, room: true }))));
42
+ prepare(runtime);
43
+ });
44
+ }
45
+ }
46
+ finally {
47
+ socket.session.set({
48
+ refusal: {
49
+ code: reason,
50
+ reauthorizationOffered: reason === 'revoked-authorization',
51
+ refusal: provider,
52
+ },
53
+ });
54
+ journal.record(`connection refused ${reason}`);
55
+ emitRefusal(runtime);
56
+ }
57
+ }