@agentshouse/mdruntime 0.1.0-c4478f1a5ac2a → 0.1.0-c44d5cc00aee5

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 (386) hide show
  1. package/README.md +23 -19
  2. package/dist/acceptance.d.ts +3 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +299 -0
  5. package/dist/act-lanes.d.ts +30 -0
  6. package/dist/act-lanes.d.ts.map +1 -0
  7. package/dist/act-lanes.js +225 -0
  8. package/dist/actions.d.ts +26 -0
  9. package/dist/actions.d.ts.map +1 -0
  10. package/dist/actions.js +302 -0
  11. package/dist/adapter.d.ts +174 -119
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/attached-model.d.ts +6 -10
  14. package/dist/attached-model.d.ts.map +1 -1
  15. package/dist/attached-model.js +35 -41
  16. package/dist/binary.d.ts +0 -5
  17. package/dist/binary.d.ts.map +1 -1
  18. package/dist/binary.js +1 -1
  19. package/dist/bootstrap.d.ts +31 -11
  20. package/dist/bootstrap.d.ts.map +1 -1
  21. package/dist/bootstrap.js +309 -109
  22. package/dist/cell.d.ts +6 -0
  23. package/dist/cell.d.ts.map +1 -0
  24. package/dist/cell.js +9 -0
  25. package/dist/chain.d.ts +12 -0
  26. package/dist/chain.d.ts.map +1 -0
  27. package/dist/chain.js +64 -0
  28. package/dist/change-set.d.ts +13 -16
  29. package/dist/change-set.d.ts.map +1 -1
  30. package/dist/change-set.js +17 -88
  31. package/dist/change.d.ts +32 -1
  32. package/dist/change.d.ts.map +1 -1
  33. package/dist/change.js +14 -3
  34. package/dist/chat-types.d.ts +3 -0
  35. package/dist/chat-types.d.ts.map +1 -0
  36. package/dist/chat-types.js +11 -0
  37. package/dist/client.d.ts +42 -24
  38. package/dist/client.d.ts.map +1 -1
  39. package/dist/client.js +133 -27
  40. package/dist/collection.d.ts +29 -21
  41. package/dist/collection.d.ts.map +1 -1
  42. package/dist/collection.js +48 -290
  43. package/dist/compile.d.ts +18 -0
  44. package/dist/compile.d.ts.map +1 -0
  45. package/dist/compile.js +724 -0
  46. package/dist/connection.d.ts +7 -118
  47. package/dist/connection.d.ts.map +1 -1
  48. package/dist/connection.js +109 -2967
  49. package/dist/context.d.ts +2 -0
  50. package/dist/context.d.ts.map +1 -0
  51. package/dist/{chat/context.js → context.js} +1 -4
  52. package/dist/conversation-live.d.ts +143 -0
  53. package/dist/conversation-live.d.ts.map +1 -0
  54. package/dist/conversation-live.js +254 -0
  55. package/dist/conversation-row.d.ts +33 -0
  56. package/dist/conversation-row.d.ts.map +1 -0
  57. package/dist/conversation-row.js +53 -0
  58. package/dist/conversation.d.ts +78 -47
  59. package/dist/conversation.d.ts.map +1 -1
  60. package/dist/conversation.js +1069 -690
  61. package/dist/declaration.d.ts +10 -0
  62. package/dist/declaration.d.ts.map +1 -0
  63. package/dist/declaration.js +24 -0
  64. package/dist/digest.d.ts +7 -0
  65. package/dist/digest.d.ts.map +1 -0
  66. package/dist/digest.js +113 -0
  67. package/dist/discovery.d.ts +10 -0
  68. package/dist/discovery.d.ts.map +1 -0
  69. package/dist/discovery.js +150 -0
  70. package/dist/durability.d.ts +23 -1
  71. package/dist/durability.d.ts.map +1 -1
  72. package/dist/durability.js +9 -0
  73. package/dist/entry.d.ts +5 -2
  74. package/dist/entry.d.ts.map +1 -1
  75. package/dist/entry.js +33 -28
  76. package/dist/expectation.d.ts +26 -13
  77. package/dist/expectation.d.ts.map +1 -1
  78. package/dist/expectation.js +72 -19
  79. package/dist/failure.d.ts +3 -0
  80. package/dist/failure.d.ts.map +1 -1
  81. package/dist/failure.js +6 -0
  82. package/dist/figures.d.ts +49 -0
  83. package/dist/figures.d.ts.map +1 -0
  84. package/dist/figures.js +197 -0
  85. package/dist/file.d.ts +2 -19
  86. package/dist/file.d.ts.map +1 -1
  87. package/dist/file.js +7 -122
  88. package/dist/holdings.d.ts +29 -0
  89. package/dist/holdings.d.ts.map +1 -0
  90. package/dist/holdings.js +95 -0
  91. package/dist/host.d.ts +27 -4
  92. package/dist/host.d.ts.map +1 -1
  93. package/dist/host.js +168 -27
  94. package/dist/identity.d.ts +0 -2
  95. package/dist/identity.d.ts.map +1 -1
  96. package/dist/identity.js +0 -6
  97. package/dist/index.d.ts +40 -14
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +18 -3
  100. package/dist/install.d.ts +54 -0
  101. package/dist/install.d.ts.map +1 -0
  102. package/dist/install.js +530 -0
  103. package/dist/lifecycle.d.ts +7 -0
  104. package/dist/lifecycle.d.ts.map +1 -0
  105. package/dist/lifecycle.js +277 -0
  106. package/dist/listing.d.ts +48 -0
  107. package/dist/listing.d.ts.map +1 -0
  108. package/dist/listing.js +139 -0
  109. package/dist/live.d.ts +23 -0
  110. package/dist/live.d.ts.map +1 -0
  111. package/dist/live.js +165 -0
  112. package/dist/locks.d.ts +7 -0
  113. package/dist/locks.d.ts.map +1 -0
  114. package/dist/locks.js +32 -0
  115. package/dist/lost.d.ts +5 -0
  116. package/dist/lost.d.ts.map +1 -0
  117. package/dist/lost.js +49 -0
  118. package/dist/media.d.ts +8 -0
  119. package/dist/media.d.ts.map +1 -0
  120. package/dist/media.js +218 -0
  121. package/dist/memory.d.ts +23 -7
  122. package/dist/memory.d.ts.map +1 -1
  123. package/dist/memory.js +282 -110
  124. package/dist/messages.d.ts +56 -0
  125. package/dist/messages.d.ts.map +1 -0
  126. package/dist/messages.js +158 -0
  127. package/dist/model.d.ts +11 -13
  128. package/dist/model.d.ts.map +1 -1
  129. package/dist/model.js +7 -24
  130. package/dist/models.d.ts +10 -0
  131. package/dist/models.d.ts.map +1 -0
  132. package/dist/models.js +153 -0
  133. package/dist/name.d.ts +4 -0
  134. package/dist/name.d.ts.map +1 -0
  135. package/dist/name.js +122 -0
  136. package/dist/observation.d.ts +19 -3
  137. package/dist/observation.d.ts.map +1 -1
  138. package/dist/observation.js +116 -20
  139. package/dist/opened.d.ts +22 -0
  140. package/dist/opened.d.ts.map +1 -0
  141. package/dist/opened.js +107 -0
  142. package/dist/opening.d.ts +4 -0
  143. package/dist/opening.d.ts.map +1 -0
  144. package/dist/opening.js +53 -0
  145. package/dist/outcome.d.ts +52 -8
  146. package/dist/outcome.d.ts.map +1 -1
  147. package/dist/outcome.js +57 -0
  148. package/dist/overlay.d.ts +8 -5
  149. package/dist/overlay.d.ts.map +1 -1
  150. package/dist/overlay.js +131 -166
  151. package/dist/page-metadata.d.ts +8 -0
  152. package/dist/page-metadata.d.ts.map +1 -0
  153. package/dist/page-metadata.js +19 -0
  154. package/dist/parts.d.ts +4 -0
  155. package/dist/parts.d.ts.map +1 -0
  156. package/dist/parts.js +13 -0
  157. package/dist/paths.d.ts +2 -0
  158. package/dist/paths.d.ts.map +1 -1
  159. package/dist/paths.js +26 -0
  160. package/dist/preparation.d.ts +20 -0
  161. package/dist/preparation.d.ts.map +1 -0
  162. package/dist/preparation.js +227 -0
  163. package/dist/presence.d.ts +52 -0
  164. package/dist/presence.d.ts.map +1 -0
  165. package/dist/presence.js +220 -0
  166. package/dist/queries.d.ts +16 -0
  167. package/dist/queries.d.ts.map +1 -0
  168. package/dist/queries.js +282 -0
  169. package/dist/query.d.ts +27 -186
  170. package/dist/query.d.ts.map +1 -1
  171. package/dist/query.js +3 -464
  172. package/dist/{chat/questions.d.ts → questions.d.ts} +5 -7
  173. package/dist/questions.d.ts.map +1 -0
  174. package/dist/{chat/questions.js → questions.js} +11 -7
  175. package/dist/queue.d.ts +40 -0
  176. package/dist/queue.d.ts.map +1 -0
  177. package/dist/queue.js +450 -0
  178. package/dist/reach.d.ts +21 -7
  179. package/dist/reach.d.ts.map +1 -1
  180. package/dist/reach.js +342 -97
  181. package/dist/react.d.ts +19 -4
  182. package/dist/react.d.ts.map +1 -1
  183. package/dist/react.js +40 -18
  184. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  185. package/dist/read.d.ts.map +1 -0
  186. package/dist/{chat/read.js → read.js} +4 -0
  187. package/dist/readiness.d.ts +49 -0
  188. package/dist/readiness.d.ts.map +1 -0
  189. package/dist/readiness.js +27 -0
  190. package/dist/reads.d.ts +39 -0
  191. package/dist/reads.d.ts.map +1 -0
  192. package/dist/reads.js +178 -0
  193. package/dist/recovery.d.ts +5 -2
  194. package/dist/recovery.d.ts.map +1 -1
  195. package/dist/recovery.js +65 -8
  196. package/dist/refresh.d.ts +17 -14
  197. package/dist/refresh.d.ts.map +1 -1
  198. package/dist/refresh.js +145 -54
  199. package/dist/refusal.d.ts +5 -0
  200. package/dist/refusal.d.ts.map +1 -0
  201. package/dist/refusal.js +55 -0
  202. package/dist/replica.d.ts +50 -33
  203. package/dist/replica.d.ts.map +1 -1
  204. package/dist/replica.js +338 -189
  205. package/dist/retried.d.ts +30 -0
  206. package/dist/retried.d.ts.map +1 -0
  207. package/dist/retried.js +72 -0
  208. package/dist/room-draft.d.ts +39 -10
  209. package/dist/room-draft.d.ts.map +1 -1
  210. package/dist/room-draft.js +194 -118
  211. package/dist/room-drafts.d.ts +24 -0
  212. package/dist/room-drafts.d.ts.map +1 -0
  213. package/dist/room-drafts.js +217 -0
  214. package/dist/rows.d.ts +31 -29
  215. package/dist/rows.d.ts.map +1 -1
  216. package/dist/rows.js +60 -118
  217. package/dist/runtime.d.ts +34 -0
  218. package/dist/runtime.d.ts.map +1 -0
  219. package/dist/runtime.js +1 -0
  220. package/dist/save.d.ts +43 -48
  221. package/dist/save.d.ts.map +1 -1
  222. package/dist/save.js +791 -274
  223. package/dist/saves.d.ts +32 -0
  224. package/dist/saves.d.ts.map +1 -0
  225. package/dist/saves.js +410 -0
  226. package/dist/search.d.ts +15 -77
  227. package/dist/search.d.ts.map +1 -1
  228. package/dist/search.js +10 -186
  229. package/dist/seed.d.ts +25 -0
  230. package/dist/seed.d.ts.map +1 -0
  231. package/dist/seed.js +145 -0
  232. package/dist/shared.d.ts +6 -7
  233. package/dist/shared.d.ts.map +1 -1
  234. package/dist/shared.js +75 -104
  235. package/dist/shown.d.ts +33 -0
  236. package/dist/shown.d.ts.map +1 -0
  237. package/dist/shown.js +302 -0
  238. package/dist/socket/admission.d.ts +7 -0
  239. package/dist/socket/admission.d.ts.map +1 -0
  240. package/dist/socket/admission.js +39 -0
  241. package/dist/socket/answers.d.ts +6 -0
  242. package/dist/socket/answers.d.ts.map +1 -0
  243. package/dist/socket/answers.js +20 -0
  244. package/dist/socket/lanes.d.ts +28 -0
  245. package/dist/socket/lanes.d.ts.map +1 -0
  246. package/dist/socket/lanes.js +103 -0
  247. package/dist/socket/reads.d.ts +10 -0
  248. package/dist/socket/reads.d.ts.map +1 -0
  249. package/dist/socket/reads.js +31 -0
  250. package/dist/socket/session.d.ts +38 -0
  251. package/dist/socket/session.d.ts.map +1 -0
  252. package/dist/socket/session.js +23 -0
  253. package/dist/socket.d.ts +67 -0
  254. package/dist/socket.d.ts.map +1 -0
  255. package/dist/socket.js +164 -0
  256. package/dist/source.d.ts +54 -0
  257. package/dist/source.d.ts.map +1 -0
  258. package/dist/source.js +82 -0
  259. package/dist/status.d.ts +5 -2
  260. package/dist/status.d.ts.map +1 -1
  261. package/dist/status.js +3 -7
  262. package/dist/store/installs.d.ts +30 -0
  263. package/dist/store/installs.d.ts.map +1 -0
  264. package/dist/store/installs.js +34 -0
  265. package/dist/store/readiness.d.ts +10 -0
  266. package/dist/store/readiness.d.ts.map +1 -0
  267. package/dist/store/readiness.js +52 -0
  268. package/dist/store/records.d.ts +214 -0
  269. package/dist/store/records.d.ts.map +1 -0
  270. package/dist/store/records.js +438 -0
  271. package/dist/store/room-held.d.ts +8 -0
  272. package/dist/store/room-held.d.ts.map +1 -0
  273. package/dist/store/room-held.js +17 -0
  274. package/dist/store/space.d.ts +11 -0
  275. package/dist/store/space.d.ts.map +1 -0
  276. package/dist/store/space.js +41 -0
  277. package/dist/store/watchers.d.ts +17 -0
  278. package/dist/store/watchers.d.ts.map +1 -0
  279. package/dist/store/watchers.js +56 -0
  280. package/dist/store/writes.d.ts +24 -0
  281. package/dist/store/writes.d.ts.map +1 -0
  282. package/dist/store/writes.js +125 -0
  283. package/dist/store.d.ts +111 -142
  284. package/dist/store.d.ts.map +1 -1
  285. package/dist/store.js +159 -687
  286. package/dist/stored.d.ts +157 -0
  287. package/dist/stored.d.ts.map +1 -0
  288. package/dist/stored.js +649 -0
  289. package/dist/surface.d.ts +88 -0
  290. package/dist/surface.d.ts.map +1 -0
  291. package/dist/surface.js +220 -0
  292. package/dist/sync.d.ts +19 -0
  293. package/dist/sync.d.ts.map +1 -0
  294. package/dist/sync.js +535 -0
  295. package/dist/tables.d.ts +415 -0
  296. package/dist/tables.d.ts.map +1 -0
  297. package/dist/tables.js +761 -0
  298. package/dist/tallies.d.ts +18 -0
  299. package/dist/tallies.d.ts.map +1 -0
  300. package/dist/tallies.js +128 -0
  301. package/dist/transfer.d.ts +0 -5
  302. package/dist/transfer.d.ts.map +1 -1
  303. package/dist/turn.d.ts +5 -3
  304. package/dist/turn.d.ts.map +1 -1
  305. package/dist/turn.js +51 -21
  306. package/dist/validation.d.ts +29 -0
  307. package/dist/validation.d.ts.map +1 -0
  308. package/dist/validation.js +104 -0
  309. package/dist/windows.d.ts +11 -0
  310. package/dist/windows.d.ts.map +1 -0
  311. package/dist/windows.js +16 -0
  312. package/dist/wire.d.ts +228 -36
  313. package/dist/wire.d.ts.map +1 -1
  314. package/dist/wire.js +75 -33
  315. package/package.json +19 -19
  316. package/AGENTS.md +0 -309
  317. package/dist/attempt.d.ts +0 -16
  318. package/dist/attempt.d.ts.map +0 -1
  319. package/dist/attempt.js +0 -70
  320. package/dist/chat/acts.d.ts +0 -33
  321. package/dist/chat/acts.d.ts.map +0 -1
  322. package/dist/chat/acts.js +0 -36
  323. package/dist/chat/context.d.ts +0 -3
  324. package/dist/chat/context.d.ts.map +0 -1
  325. package/dist/chat/input.d.ts +0 -9
  326. package/dist/chat/input.d.ts.map +0 -1
  327. package/dist/chat/input.js +0 -99
  328. package/dist/chat/kit.d.ts +0 -60
  329. package/dist/chat/kit.d.ts.map +0 -1
  330. package/dist/chat/kit.js +0 -123
  331. package/dist/chat/lasting.d.ts +0 -6
  332. package/dist/chat/lasting.d.ts.map +0 -1
  333. package/dist/chat/lasting.js +0 -19
  334. package/dist/chat/list.d.ts +0 -26
  335. package/dist/chat/list.d.ts.map +0 -1
  336. package/dist/chat/list.js +0 -62
  337. package/dist/chat/markdown.d.ts +0 -20
  338. package/dist/chat/markdown.d.ts.map +0 -1
  339. package/dist/chat/markdown.js +0 -188
  340. package/dist/chat/message.d.ts +0 -6
  341. package/dist/chat/message.d.ts.map +0 -1
  342. package/dist/chat/message.js +0 -192
  343. package/dist/chat/messages.d.ts +0 -21
  344. package/dist/chat/messages.d.ts.map +0 -1
  345. package/dist/chat/messages.js +0 -151
  346. package/dist/chat/name.d.ts +0 -6
  347. package/dist/chat/name.d.ts.map +0 -1
  348. package/dist/chat/name.js +0 -37
  349. package/dist/chat/opened.d.ts +0 -11
  350. package/dist/chat/opened.d.ts.map +0 -1
  351. package/dist/chat/opened.js +0 -17
  352. package/dist/chat/overlay.d.ts +0 -31
  353. package/dist/chat/overlay.d.ts.map +0 -1
  354. package/dist/chat/overlay.js +0 -97
  355. package/dist/chat/parts.d.ts +0 -57
  356. package/dist/chat/parts.d.ts.map +0 -1
  357. package/dist/chat/parts.js +0 -119
  358. package/dist/chat/process.d.ts +0 -20
  359. package/dist/chat/process.d.ts.map +0 -1
  360. package/dist/chat/process.js +0 -32
  361. package/dist/chat/provider.d.ts +0 -63
  362. package/dist/chat/provider.d.ts.map +0 -1
  363. package/dist/chat/provider.js +0 -620
  364. package/dist/chat/question.d.ts +0 -9
  365. package/dist/chat/question.d.ts.map +0 -1
  366. package/dist/chat/question.js +0 -80
  367. package/dist/chat/questions.d.ts.map +0 -1
  368. package/dist/chat/read.d.ts.map +0 -1
  369. package/dist/chat/ready.d.ts +0 -33
  370. package/dist/chat/ready.d.ts.map +0 -1
  371. package/dist/chat/ready.js +0 -91
  372. package/dist/chat/style.d.ts +0 -4
  373. package/dist/chat/style.d.ts.map +0 -1
  374. package/dist/chat/style.js +0 -302
  375. package/dist/chat.d.ts +0 -14
  376. package/dist/chat.d.ts.map +0 -1
  377. package/dist/chat.js +0 -8
  378. package/dist/fence.d.ts +0 -6
  379. package/dist/fence.d.ts.map +0 -1
  380. package/dist/fence.js +0 -10
  381. package/dist/log.d.ts +0 -5
  382. package/dist/log.d.ts.map +0 -1
  383. package/dist/log.js +0 -14
  384. package/dist/read-side.d.ts +0 -25
  385. package/dist/read-side.d.ts.map +0 -1
  386. package/dist/read-side.js +0 -639
@@ -1,47 +1,41 @@
1
- import { verify } from '@agentshouse/mdmodel';
1
+ import { readTypes } from '@agentshouse/mdmodel';
2
2
  import { MD_MODEL } from './collection.js';
3
- import { sameModel } from './model.js';
4
- const EMPTY_SCHEMA = { verdict: 'accept', model: { types: {} } };
5
- export function attachedModel(answer, previous) {
6
- if (answer.kind === 'model-unavailable') {
7
- return { state: { status: 'unavailable', reason: answer.reason }, refused: null };
8
- }
9
- if (previous.status !== 'unavailable' &&
10
- sameModel(previous.snapshot, answer.snapshot) &&
11
- previous.snapshot.schema !== answer.snapshot.schema) {
12
- return {
13
- state: {
14
- status: 'unavailable',
15
- reason: 'invalid',
16
- schema: answer.snapshot.schema,
17
- revision: answer.snapshot.revision,
18
- },
19
- refused: null,
20
- };
3
+ export const NO_ROOM_TYPES = Object.freeze({ types: Object.freeze({}) });
4
+ const BUILT_IN = {
5
+ kind: 'model',
6
+ snapshot: { identity: 'built-in', version: '', schema: null, revision: null },
7
+ };
8
+ export function builtInModel(roomTypes) {
9
+ return attachedModel(BUILT_IN, roomTypes);
10
+ }
11
+ const READ_SCHEMAS = 64;
12
+ const read = new WeakMap();
13
+ function typesRead(schema, roomTypes) {
14
+ let held = read.get(roomTypes);
15
+ if (held === undefined) {
16
+ held = new Map();
17
+ read.set(roomTypes, held);
21
18
  }
22
- const verified = answer.snapshot.schema === null ? EMPTY_SCHEMA : verify(answer.snapshot.schema);
23
- if (verified.verdict === 'refuse') {
24
- return {
25
- state: {
26
- status: 'unavailable',
27
- reason: 'invalid',
28
- schema: answer.snapshot.schema,
29
- revision: answer.snapshot.revision,
30
- },
31
- refused: {
32
- identity: answer.snapshot.identity,
33
- rule: verified.rule,
34
- ...(verified.location === undefined ? {} : { location: verified.location }),
35
- },
36
- };
19
+ const known = held.get(schema);
20
+ if (known !== undefined)
21
+ return known;
22
+ const types = readTypes(schema, roomTypes);
23
+ if (held.size >= READ_SCHEMAS)
24
+ held.delete(held.keys().next().value);
25
+ held.set(schema, types);
26
+ return types;
27
+ }
28
+ export function schemaTypes(schema, roomTypes) {
29
+ return (schema === null ? roomTypes : typesRead(schema, roomTypes)).types;
30
+ }
31
+ export function attachedModel(answer, roomTypes) {
32
+ if (answer.kind === 'model-unavailable') {
33
+ return { status: 'unavailable', reason: answer.reason };
37
34
  }
38
35
  return {
39
- state: {
40
- status: 'current',
41
- snapshot: structuredClone(answer.snapshot),
42
- verifiedWith: MD_MODEL,
43
- types: verified.model.types,
44
- },
45
- refused: null,
36
+ status: 'current',
37
+ snapshot: structuredClone(answer.snapshot),
38
+ verifiedWith: MD_MODEL,
39
+ types: schemaTypes(answer.snapshot.schema, roomTypes),
46
40
  };
47
41
  }
package/dist/binary.d.ts CHANGED
@@ -3,7 +3,6 @@ export type BinaryFileRecord = {
3
3
  readonly state: 'accepted';
4
4
  readonly revision: string;
5
5
  readonly path: string;
6
- readonly fileRef: string;
7
6
  readonly byteLength: number;
8
7
  readonly mediaType: string;
9
8
  readonly sha256: string;
@@ -15,9 +14,5 @@ export type BinaryFileRecord = {
15
14
  readonly mediaType: string;
16
15
  readonly sha256: string;
17
16
  };
18
- export type BinaryReference = {
19
- readonly fileRef: string;
20
- readonly referrer: unknown;
21
- };
22
17
  export declare function binaryRecord(path: string, held: HeldBinary, revision: string | undefined): BinaryFileRecord;
23
18
  //# sourceMappingURL=binary.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../src/binary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,gBAAgB,GACxB;IACE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEN,MAAM,MAAM,eAAe,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvF,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,gBAAgB,CAKlB"}
1
+ {"version":3,"file":"binary.d.ts","sourceRoot":"","sources":["../src/binary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,gBAAgB,GACxB;IACE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IACE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEN,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,gBAAgB,CAKlB"}
package/dist/binary.js CHANGED
@@ -4,5 +4,5 @@ export function binaryRecord(path, held, revision) {
4
4
  return { state: 'pending', localId: held.localId, path, ...facts };
5
5
  if (revision === undefined)
6
6
  throw new Error(`the accepted binary file ${path} has no revision`);
7
- return { state: 'accepted', revision, path, fileRef: held.fileRef, ...facts };
7
+ return { state: 'accepted', revision, path, ...facts };
8
8
  }
@@ -1,24 +1,44 @@
1
1
  import type { ModelState } from './model.js';
2
- import type { Adapter, AdapterFailure, Authorization, DiscoveredRoom, HeldContent, RetryableRefusal, RoomModels } from './adapter.js';
3
- import { type ConfirmedLayer } from './replica.js';
4
- import type { StagedLayer, TransferRecord } from './store.js';
5
- import { type Refused, type Unconfirmed } from './transfer.js';
2
+ import type { Adapter, TypedPath, AdapterFailure, Authorization, BootstrapPart, DiscoveredRoom, NotReady, RetryableRefusal, RoomModels } from './adapter.js';
3
+ import type { Composition } from './collection.js';
4
+ import type { InstallationStep } from './readiness.js';
5
+ import { type Refreshing } from './refresh.js';
6
+ import { type ReplicaRecord } from './replica.js';
7
+ import type { StagedPage, TransferRecord } from './store.js';
8
+ import { type Unconfirmed } from './transfer.js';
6
9
  export type Bootstrapped = {
7
10
  kind: 'staged';
8
- confirmed: ConfirmedLayer;
9
- stored: StagedLayer;
11
+ record: ReplicaRecord;
12
+ refreshed: boolean;
10
13
  };
11
- export type BootstrapOutcome = Bootstrapped | Refused | Unconfirmed | RetryableRefusal | AdapterFailure;
14
+ export type BootstrapOutcome = Bootstrapped | Unconfirmed | NotReady | RetryableRefusal | AdapterFailure;
12
15
  export type HeldModels = {
13
16
  collection: ModelState;
14
- selection: ModelState;
15
17
  };
16
18
  export type Remodel = (models: RoomModels | undefined, held: HeldModels) => HeldModels;
19
+ export type Reads = Pick<Adapter, 'bootstrap' | 'refresh' | 'reached'>;
20
+ export type Arriving = {
21
+ at(bytes: number): void;
22
+ end(): void;
23
+ };
24
+ export type Resumed = {
25
+ readonly record: TransferRecord | null;
26
+ readonly staged: ReadonlySet<string>;
27
+ };
17
28
  export type Staging = {
18
29
  held(locator: string): TransferRecord | null;
19
- staged(record: TransferRecord): Promise<StagedLayer>;
20
- stage(record: TransferRecord, page: StagedLayer): Promise<boolean>;
30
+ turn(locator: string, step: InstallationStep): Promise<() => void>;
31
+ unqueued(): Promise<void>;
32
+ queued(text: number): () => void;
33
+ arriving(locator: string): Arriving;
34
+ readonly streamed: boolean;
35
+ stage(record: TransferRecord, page: StagedPage, composition: Composition): Promise<TransferRecord | null>;
36
+ resume(record: TransferRecord, parts: readonly BootstrapPart[], composition: Composition): Promise<Resumed | null>;
37
+ derive(locator: string, key: number, composition: Composition): Promise<boolean>;
38
+ refreshing(locator: string, key: number, composition: Composition): Promise<Refreshing>;
21
39
  abandon(locator: string): Promise<void>;
40
+ setAside(locator: string): Promise<void>;
41
+ release(key: number): Promise<void>;
22
42
  };
23
- export declare function bootstrapRoom(adapter: Adapter, authorization: Authorization, room: DiscoveredRoom, held: HeldModels, remodel: Remodel, continuing: () => boolean, staging: Staging, reuse: HeldContent | null): Promise<BootstrapOutcome>;
43
+ export declare function bootstrapRoom(adapter: Reads, authorization: Authorization, room: DiscoveredRoom, held: HeldModels, builtIn: ModelState, typedPaths: readonly TypedPath[], remodel: Remodel, continuing: () => boolean, staging: Staging): Promise<BootstrapOutcome>;
24
44
  //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EAEb,cAAc,EAEd,WAAW,EACX,gBAAgB,EAChB,UAAU,EACX,MAAM,cAAc,CAAC;AAItB,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,KAAK,EAAiB,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,EAAe,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,cAAc,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC;AAE9F,MAAM,MAAM,gBAAgB,GACxB,YAAY,GACZ,OAAO,GACP,WAAW,GACX,gBAAgB,GAChB,cAAc,CAAC;AAEnB,MAAM,MAAM,UAAU,GAAG;IAAE,UAAU,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,UAAU,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU,KAAK,UAAU,CAAC;AAEvF,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC;IAC7C,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrD,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC,CAAC;AAyCF,wBAAsB,aAAa,CACjC,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,EACzB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,GAAG,IAAI,GACxB,OAAO,CAAC,gBAAgB,CAAC,CA4B3B"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
package/dist/bootstrap.js CHANGED
@@ -1,129 +1,329 @@
1
+ import { declared } from './declaration.js';
1
2
  import { transferIdentity } from './identity.js';
2
- import { advancement } from './refresh.js';
3
- import { acceptedBinaries } from './overlay.js';
4
- import { readStaged } from './replica.js';
3
+ import { advancement, pageEntries } from './refresh.js';
4
+ import { entriesIn } from './shared.js';
5
+ import { compositionOf } from './replica.js';
5
6
  import { unconfirmed } from './transfer.js';
6
- const RESUMABLE = new Set([
7
- 'transport-uncertainty',
8
- 'retryable-refusal',
9
- 'unconfirmed',
10
- ]);
11
- function pageLayer(page) {
12
- return {
13
- documents: page.documents,
14
- revisions: page.revisions,
15
- changes: page.changes,
16
- written: Object.fromEntries(Object.keys(page.documents).map((path) => [path, page.roomVersion])),
17
- binaries: acceptedBinaries(page.binaryFiles),
18
- };
7
+ const NOTHING_PRIOR = () => Promise.resolve(new Map());
8
+ const PARTS_IN_FLIGHT = 6;
9
+ function textOf(page) {
10
+ let text = 0;
11
+ for (const [, content] of entriesIn(page.documents))
12
+ text += content.length;
13
+ return text;
19
14
  }
20
- async function heldTransfer(staging, room) {
21
- const record = staging.held(room.locator);
22
- if (record === null)
23
- return null;
24
- if (record.selection === room.replica.selection) {
25
- return { record, layer: await staging.staged(record) };
26
- }
27
- await staging.abandon(room.locator);
28
- return null;
29
- }
30
- function pooled(pool, layer) {
15
+ async function pageOf(page, part) {
31
16
  return {
32
- documents: { ...pool?.documents, ...layer.documents },
33
- revisions: { ...pool?.revisions, ...layer.revisions },
17
+ entries: await pageEntries(page, [], page.roomVersion, NOTHING_PRIOR),
18
+ folders: page.folders ?? [],
19
+ ...(part === undefined ? {} : { part }),
34
20
  };
35
21
  }
36
- export async function bootstrapRoom(adapter, authorization, room, held, remodel, continuing, staging, reuse) {
37
- const first = await bundle(adapter, authorization, room, held, remodel, continuing, staging, await heldTransfer(staging, room), reuse);
22
+ export async function bootstrapRoom(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging) {
23
+ if (staging.held(room.locator) !== null)
24
+ await staging.abandon(room.locator);
25
+ const begun = () => started(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging);
26
+ const first = await begun();
38
27
  if (first.kind !== 'expired')
39
28
  return first;
40
- await staging.abandon(room.locator);
41
- const replacement = await bundle(adapter, authorization, room, held, remodel, continuing, staging, null, pooled(reuse, first.held));
42
- if (replacement.kind !== 'expired')
43
- return replacement;
44
- await staging.abandon(room.locator);
45
- return unconfirmed;
29
+ await staging.setAside(room.locator);
30
+ try {
31
+ const replacement = await begun();
32
+ if (replacement.kind !== 'expired')
33
+ return replacement;
34
+ await staging.abandon(room.locator);
35
+ return unconfirmed;
36
+ }
37
+ finally {
38
+ if (first.key !== null)
39
+ await staging.release(first.key);
40
+ }
41
+ }
42
+ function dropped(ahead) {
43
+ void ahead?.fetched.then(({ next, written }) => {
44
+ written();
45
+ dropped(next);
46
+ }, () => { });
46
47
  }
47
- async function bundle(adapter, authorization, room, held, remodel, continuing, staging, kept, pool) {
48
+ async function started(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging) {
49
+ const mode = { paged: false };
50
+ let outcome;
51
+ try {
52
+ outcome = await bundle(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging, mode);
53
+ }
54
+ catch (error) {
55
+ await stopped(staging, room.locator, mode).catch(() => { });
56
+ throw error;
57
+ }
58
+ if (outcome.kind !== 'staged' && outcome.kind !== 'expired') {
59
+ await stopped(staging, room.locator, mode);
60
+ }
61
+ return outcome;
62
+ }
63
+ function stopped(staging, locator, mode) {
64
+ return mode.paged ? staging.abandon(locator) : staging.setAside(locator);
65
+ }
66
+ async function bundle(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging, mode) {
48
67
  const locator = room.locator;
49
68
  const selection = room.replica.selection;
50
- const documents = { ...kept?.layer.documents };
51
- const revisions = { ...kept?.layer.revisions };
52
- const changes = { ...kept?.layer.changes };
53
- const written = { ...kept?.layer.written };
54
- const binaries = { ...kept?.layer.binaries };
55
- let transfer = kept?.record ?? null;
56
- while (transfer === null || transfer.pageToken !== null) {
57
- if (!continuing())
58
- return unconfirmed;
59
- const page = await adapter.bootstrap(authorization, {
69
+ const ending = new AbortController();
70
+ const arriving = staging.arriving(locator);
71
+ const downloaded = await staging.turn(locator, 'downloading');
72
+ const asking = (token) => adapter.bootstrap(authorization, {
73
+ locator,
74
+ selection,
75
+ signal: ending.signal,
76
+ ...(token === null
77
+ ? { arriving: (bytes) => arriving.at(bytes) }
78
+ : { pageToken: token }),
79
+ });
80
+ const fetching = (token) => {
81
+ const fetched = (async () => {
82
+ await staging.unqueued();
83
+ const page = continuing() ? await asking(token) : unconfirmed;
84
+ if (page.kind !== 'bootstrap')
85
+ return { page, next: null, written: () => { } };
86
+ const written = staging.queued(textOf(page));
87
+ const later = page.pageToken;
88
+ if (later === undefined && page.parts === undefined) {
89
+ downloaded();
90
+ arriving.end();
91
+ }
92
+ return { page, written, next: later === undefined || !continuing() ? null : fetching(later) };
93
+ })();
94
+ fetched.catch(() => { });
95
+ return { fetched };
96
+ };
97
+ let transfer = null;
98
+ let ahead = fetching(null);
99
+ try {
100
+ while (ahead !== null) {
101
+ if (!continuing())
102
+ return unconfirmed;
103
+ const fetched = await ahead.fetched;
104
+ ahead = fetched.next;
105
+ try {
106
+ if (!continuing())
107
+ return unconfirmed;
108
+ const page = fetched.page;
109
+ if (page.kind === 'beyond-horizon')
110
+ return { kind: 'expired', key: transfer?.key ?? null };
111
+ if (page.kind !== 'bootstrap')
112
+ return page;
113
+ if (transfer === null && page.parts !== undefined) {
114
+ const parted = await parts(page, page.parts);
115
+ if (parted.kind !== 'parted')
116
+ return parted;
117
+ transfer = parted.transfer;
118
+ continue;
119
+ }
120
+ if (transfer === null)
121
+ mode.paged = true;
122
+ const models = remodel(page.models, transfer?.models ?? held);
123
+ const staged = await staging.stage({
124
+ locator,
125
+ transfer: transfer?.transfer ?? transferIdentity(),
126
+ selection,
127
+ from: transfer !== null && adapter.reached(locator, page.roomVersion, transfer.from)
128
+ ? transfer.from
129
+ : page.roomVersion,
130
+ last: transfer !== null && !adapter.reached(locator, page.roomVersion, transfer.last)
131
+ ? transfer.last
132
+ : page.roomVersion,
133
+ done: { bytes: (transfer?.done.bytes ?? 0) + (page.bytes ?? 0) },
134
+ models,
135
+ key: transfer?.key ?? null,
136
+ }, await pageOf(page), compositionOf(models.collection, room.typedSelection, builtIn, typedPaths));
137
+ if (staged === null)
138
+ return unconfirmed;
139
+ transfer = staged;
140
+ }
141
+ finally {
142
+ fetched.written();
143
+ }
144
+ }
145
+ }
146
+ finally {
147
+ ending.abort();
148
+ downloaded();
149
+ arriving.end();
150
+ dropped(ahead);
151
+ }
152
+ if (transfer === null)
153
+ return unconfirmed;
154
+ return installed(transfer);
155
+ async function parts(head, listed) {
156
+ const models = remodel(head.models, held);
157
+ const composition = compositionOf(models.collection, room.typedSelection, builtIn, typedPaths);
158
+ const resumed = await staging.resume({
60
159
  locator,
160
+ transfer: transferIdentity(),
61
161
  selection,
62
- ...(transfer?.pageToken == null ? {} : { pageToken: transfer.pageToken }),
63
- ...(pool === null ? {} : { held: pool }),
64
- });
65
- if (page.kind === 'beyond-horizon')
66
- return { kind: 'expired', held: { documents, revisions } };
67
- if (page.kind !== 'bootstrap') {
68
- if (!RESUMABLE.has(page.kind))
69
- await staging.abandon(locator);
70
- return page;
71
- }
72
- transfer = {
162
+ from: head.roomVersion,
163
+ last: head.roomVersion,
164
+ done: { bytes: 0 },
165
+ models,
166
+ key: null,
167
+ }, listed, composition);
168
+ if (resumed === null)
169
+ return unconfirmed;
170
+ let staged = resumed.record ?? {
73
171
  locator,
74
- transfer: transfer?.transfer ?? transferIdentity(),
172
+ transfer: transferIdentity(),
75
173
  selection,
76
- from: transfer !== null && adapter.reached(locator, page.roomVersion, transfer.from)
77
- ? transfer.from
78
- : page.roomVersion,
79
- last: transfer !== null && !adapter.reached(locator, page.roomVersion, transfer.last)
80
- ? transfer.last
81
- : page.roomVersion,
82
- pageToken: page.pageToken ?? null,
83
- models: remodel(page.models, transfer?.models ?? held),
174
+ from: head.roomVersion,
175
+ last: head.roomVersion,
176
+ done: { bytes: 0 },
177
+ models,
178
+ key: null,
84
179
  };
85
- const staged = pageLayer(page);
86
- if (!(await staging.stage(transfer, staged)))
87
- return unconfirmed;
88
- Object.assign(documents, staged.documents);
89
- Object.assign(revisions, staged.revisions);
90
- Object.assign(changes, staged.changes);
91
- Object.assign(written, staged.written);
92
- Object.assign(binaries, staged.binaries);
93
- }
94
- const record = {
95
- locator,
96
- name: room.name,
97
- handle: room.handle,
98
- operations: room.operations,
99
- replica: room.replica,
100
- model: transfer.models.collection,
101
- typedSelection: room.typedSelection ?? null,
102
- selectionModel: transfer.models.selection,
103
- providerOwnedPaths: room.providerOwnedPaths,
104
- roomVersion: transfer.from,
105
- transfer: transfer.transfer,
106
- documents,
107
- binaries,
108
- revisions,
109
- changes,
110
- written,
111
- };
112
- const reconciled = transfer.last === transfer.from
113
- ? { kind: 'still-current' }
114
- : await advancement(adapter, authorization, record, remodel, continuing);
115
- if (reconciled.kind === 'advanced' || reconciled.kind === 'still-current') {
116
- const read = readStaged(reconciled.kind === 'advanced' ? reconciled.record : record);
117
- if (read.kind === 'refused') {
118
- await staging.abandon(locator);
119
- return read;
180
+ const wanted = listed.filter((part) => !resumed.staged.has(part.id));
181
+ let arrived = staged.done.bytes;
182
+ const partial = new Map();
183
+ const report = () => {
184
+ let bytes = arrived;
185
+ for (const held of partial.values())
186
+ bytes += held;
187
+ arriving.at(bytes);
188
+ };
189
+ report();
190
+ const arrivals = [];
191
+ let woken = null;
192
+ let next = 0;
193
+ let flying = 0;
194
+ let halted = false;
195
+ let stopped = false;
196
+ let admitted = Promise.resolve();
197
+ const fetched = () => {
198
+ if ((next < wanted.length && !halted) || flying > 0)
199
+ return;
200
+ downloaded();
201
+ arriving.end();
202
+ };
203
+ const landed = (one) => {
204
+ flying -= 1;
205
+ if (stopped)
206
+ one.written();
207
+ else
208
+ arrivals.push(one);
209
+ woken?.();
210
+ ask();
211
+ fetched();
212
+ };
213
+ const fetch = async (part) => {
214
+ let written = () => { };
215
+ const admission = admitted.then(async () => {
216
+ await staging.unqueued();
217
+ written = staging.queued(part.bytes);
218
+ });
219
+ admitted = admission;
220
+ await admission;
221
+ const page = continuing()
222
+ ? await adapter.bootstrap(authorization, {
223
+ locator,
224
+ selection,
225
+ signal: ending.signal,
226
+ pageToken: part.id,
227
+ arriving: (bytes) => {
228
+ partial.set(part.id, Math.min(bytes, part.bytes));
229
+ report();
230
+ },
231
+ })
232
+ : unconfirmed;
233
+ landed({ part, page, written });
234
+ };
235
+ const ask = () => {
236
+ while (!stopped && !halted && flying < PARTS_IN_FLIGHT && next < wanted.length) {
237
+ const part = wanted[next];
238
+ next += 1;
239
+ flying += 1;
240
+ fetch(part).catch((error) => landed({ part, page: unconfirmed, written: () => { }, error }));
241
+ }
242
+ };
243
+ let failed = null;
244
+ ask();
245
+ fetched();
246
+ try {
247
+ for (;;) {
248
+ while (arrivals.length === 0) {
249
+ if (flying === 0 && (halted || next >= wanted.length))
250
+ break;
251
+ await new Promise((wake) => (woken = wake));
252
+ woken = null;
253
+ }
254
+ const one = arrivals.shift();
255
+ if (one === undefined)
256
+ break;
257
+ const { part, page, written, error } = one;
258
+ try {
259
+ if (error !== undefined)
260
+ throw error;
261
+ if (!continuing())
262
+ return unconfirmed;
263
+ if (page.kind !== 'bootstrap') {
264
+ halted = true;
265
+ failed ??= page.kind === 'beyond-horizon' ? unconfirmed : page;
266
+ continue;
267
+ }
268
+ partial.delete(part.id);
269
+ arrived += part.bytes;
270
+ report();
271
+ const kept = await staging.stage({ ...staged, done: { bytes: staged.done.bytes + part.bytes } }, await pageOf({ ...page, roomVersion: head.roomVersion }, part.id), composition);
272
+ if (kept === null)
273
+ return unconfirmed;
274
+ staged = kept;
275
+ }
276
+ finally {
277
+ written();
278
+ }
279
+ }
280
+ }
281
+ finally {
282
+ stopped = true;
283
+ for (const one of arrivals.splice(0))
284
+ one.written();
285
+ }
286
+ if (failed !== null)
287
+ return failed;
288
+ if (staged.key === null) {
289
+ const empty = await staging.stage(staged, { entries: [], folders: [] }, composition);
290
+ if (empty === null)
291
+ return unconfirmed;
292
+ staged = empty;
120
293
  }
121
- return { kind: 'staged', confirmed: read.confirmed, stored: record };
294
+ return { kind: 'parted', transfer: staged };
122
295
  }
123
- if (reconciled.kind === 'beyond-horizon') {
124
- return { kind: 'expired', held: { documents, revisions } };
296
+ async function installed(transfer) {
297
+ const composition = compositionOf(transfer.models.collection, room.typedSelection, builtIn, typedPaths);
298
+ if (!(await staging.derive(locator, transfer.key, composition)))
299
+ return unconfirmed;
300
+ await staging.turn(locator, 'replaying');
301
+ if (!continuing())
302
+ return unconfirmed;
303
+ const record = {
304
+ locator,
305
+ declaration: declared(room),
306
+ model: transfer.models.collection,
307
+ roomVersion: transfer.from,
308
+ transfer: transfer.transfer,
309
+ inventory: transfer.done,
310
+ key: transfer.key,
311
+ };
312
+ const last = transfer.last;
313
+ const refresh = adapter.refresh;
314
+ const reconciled = last === transfer.from &&
315
+ (staging.streamed || adapter.reached(locator, last, room.roomVersion))
316
+ ? { kind: 'still-current' }
317
+ : refresh === undefined
318
+ ? unconfirmed
319
+ : await advancement(refresh, authorization, record, remodel, continuing, await staging.refreshing(locator, record.key, composition));
320
+ if (reconciled.kind === 'advanced') {
321
+ return { kind: 'staged', record: reconciled.record, refreshed: true };
322
+ }
323
+ if (reconciled.kind === 'still-current')
324
+ return { kind: 'staged', record, refreshed: false };
325
+ if (reconciled.kind === 'beyond-horizon')
326
+ return { kind: 'expired', key: record.key };
327
+ return reconciled;
125
328
  }
126
- if (!RESUMABLE.has(reconciled.kind))
127
- await staging.abandon(locator);
128
- return reconciled;
129
329
  }
package/dist/cell.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export type Cell<T> = {
2
+ now(): T;
3
+ set(change: Partial<T>): void;
4
+ };
5
+ export declare function createCell<T extends object>(first: T): Cell<T>;
6
+ //# sourceMappingURL=cell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell.d.ts","sourceRoot":"","sources":["../src/cell.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,CAAC,CAAC,IAAI;IACpB,GAAG,IAAI,CAAC,CAAC;IACT,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAQ9D"}
package/dist/cell.js ADDED
@@ -0,0 +1,9 @@
1
+ export function createCell(first) {
2
+ let held = first;
3
+ return {
4
+ now: () => held,
5
+ set(change) {
6
+ held = { ...held, ...change };
7
+ },
8
+ };
9
+ }