@agentshouse/mdruntime 0.1.0-cd507e16e5fc0 → 0.1.0-cd71aba4d0215

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 (211) hide show
  1. package/README.md +8 -8
  2. package/dist/acceptance.d.ts +0 -3
  3. package/dist/acceptance.d.ts.map +1 -1
  4. package/dist/acceptance.js +74 -145
  5. package/dist/act-lanes.d.ts +33 -0
  6. package/dist/act-lanes.d.ts.map +1 -0
  7. package/dist/act-lanes.js +177 -0
  8. package/dist/actions.d.ts +7 -2
  9. package/dist/actions.d.ts.map +1 -1
  10. package/dist/actions.js +40 -30
  11. package/dist/adapter.d.ts +27 -45
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/bootstrap.d.ts +1 -1
  14. package/dist/bootstrap.d.ts.map +1 -1
  15. package/dist/bootstrap.js +6 -19
  16. package/dist/change-set.d.ts +4 -0
  17. package/dist/change-set.d.ts.map +1 -1
  18. package/dist/change-set.js +6 -0
  19. package/dist/change.d.ts.map +1 -1
  20. package/dist/change.js +4 -2
  21. package/dist/client.d.ts +7 -12
  22. package/dist/client.d.ts.map +1 -1
  23. package/dist/client.js +29 -14
  24. package/dist/collection.d.ts +22 -4
  25. package/dist/collection.d.ts.map +1 -1
  26. package/dist/collection.js +12 -2
  27. package/dist/compile.d.ts.map +1 -1
  28. package/dist/compile.js +15 -21
  29. package/dist/connection.d.ts.map +1 -1
  30. package/dist/connection.js +26 -16
  31. package/dist/conversation-live.d.ts +8 -6
  32. package/dist/conversation-live.d.ts.map +1 -1
  33. package/dist/conversation-live.js +7 -6
  34. package/dist/conversation.d.ts +23 -10
  35. package/dist/conversation.d.ts.map +1 -1
  36. package/dist/conversation.js +127 -102
  37. package/dist/declaration.d.ts +10 -0
  38. package/dist/declaration.d.ts.map +1 -0
  39. package/dist/declaration.js +24 -0
  40. package/dist/discovery.d.ts.map +1 -1
  41. package/dist/discovery.js +18 -40
  42. package/dist/durability.d.ts +3 -0
  43. package/dist/durability.d.ts.map +1 -1
  44. package/dist/expectation.d.ts +4 -2
  45. package/dist/expectation.d.ts.map +1 -1
  46. package/dist/expectation.js +33 -11
  47. package/dist/failure.d.ts +3 -0
  48. package/dist/failure.d.ts.map +1 -1
  49. package/dist/failure.js +6 -0
  50. package/dist/host.d.ts +17 -2
  51. package/dist/host.d.ts.map +1 -1
  52. package/dist/host.js +39 -9
  53. package/dist/index.d.ts +9 -5
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +7 -3
  56. package/dist/install.d.ts +1 -3
  57. package/dist/install.d.ts.map +1 -1
  58. package/dist/install.js +48 -65
  59. package/dist/lifecycle.d.ts +1 -1
  60. package/dist/lifecycle.d.ts.map +1 -1
  61. package/dist/lifecycle.js +38 -27
  62. package/dist/listing.d.ts +6 -11
  63. package/dist/listing.d.ts.map +1 -1
  64. package/dist/listing.js +25 -62
  65. package/dist/live.d.ts.map +1 -1
  66. package/dist/live.js +3 -3
  67. package/dist/locks.d.ts +2 -4
  68. package/dist/locks.d.ts.map +1 -1
  69. package/dist/locks.js +10 -38
  70. package/dist/lost.d.ts.map +1 -1
  71. package/dist/lost.js +10 -21
  72. package/dist/media.d.ts +1 -1
  73. package/dist/media.d.ts.map +1 -1
  74. package/dist/media.js +4 -4
  75. package/dist/memory.d.ts +4 -2
  76. package/dist/memory.d.ts.map +1 -1
  77. package/dist/memory.js +38 -21
  78. package/dist/messages.d.ts +0 -3
  79. package/dist/messages.d.ts.map +1 -1
  80. package/dist/messages.js +13 -31
  81. package/dist/model.d.ts +0 -1
  82. package/dist/model.d.ts.map +1 -1
  83. package/dist/model.js +0 -5
  84. package/dist/models.d.ts +4 -8
  85. package/dist/models.d.ts.map +1 -1
  86. package/dist/models.js +97 -136
  87. package/dist/observation.d.ts.map +1 -1
  88. package/dist/observation.js +12 -17
  89. package/dist/opened.d.ts +1 -1
  90. package/dist/opened.d.ts.map +1 -1
  91. package/dist/opened.js +5 -5
  92. package/dist/opening.d.ts.map +1 -1
  93. package/dist/opening.js +6 -4
  94. package/dist/outcome.d.ts +3 -0
  95. package/dist/outcome.d.ts.map +1 -1
  96. package/dist/outcome.js +15 -0
  97. package/dist/overlay.d.ts +2 -1
  98. package/dist/overlay.d.ts.map +1 -1
  99. package/dist/overlay.js +32 -21
  100. package/dist/page-metadata.d.ts +8 -0
  101. package/dist/page-metadata.d.ts.map +1 -0
  102. package/dist/page-metadata.js +19 -0
  103. package/dist/parts.d.ts +3 -51
  104. package/dist/parts.d.ts.map +1 -1
  105. package/dist/parts.js +14 -111
  106. package/dist/preparation.d.ts.map +1 -1
  107. package/dist/preparation.js +22 -15
  108. package/dist/presence.d.ts +52 -0
  109. package/dist/presence.d.ts.map +1 -0
  110. package/dist/presence.js +220 -0
  111. package/dist/queries.d.ts +1 -1
  112. package/dist/queries.d.ts.map +1 -1
  113. package/dist/queries.js +5 -7
  114. package/dist/query.d.ts +0 -1
  115. package/dist/query.d.ts.map +1 -1
  116. package/dist/questions.js +1 -1
  117. package/dist/queue.d.ts +40 -0
  118. package/dist/queue.d.ts.map +1 -0
  119. package/dist/queue.js +455 -0
  120. package/dist/reach.d.ts.map +1 -1
  121. package/dist/reach.js +27 -8
  122. package/dist/react.d.ts +11 -0
  123. package/dist/react.d.ts.map +1 -1
  124. package/dist/react.js +15 -1
  125. package/dist/reads.d.ts +3 -1
  126. package/dist/reads.d.ts.map +1 -1
  127. package/dist/reads.js +9 -2
  128. package/dist/recovery.d.ts +3 -1
  129. package/dist/recovery.d.ts.map +1 -1
  130. package/dist/recovery.js +29 -7
  131. package/dist/refresh.js +2 -2
  132. package/dist/refusal.d.ts.map +1 -1
  133. package/dist/refusal.js +5 -4
  134. package/dist/replica.d.ts +5 -11
  135. package/dist/replica.d.ts.map +1 -1
  136. package/dist/replica.js +13 -15
  137. package/dist/retried.d.ts +30 -0
  138. package/dist/retried.d.ts.map +1 -0
  139. package/dist/retried.js +72 -0
  140. package/dist/room-draft.d.ts +4 -6
  141. package/dist/room-draft.d.ts.map +1 -1
  142. package/dist/room-draft.js +36 -52
  143. package/dist/room-drafts.d.ts.map +1 -1
  144. package/dist/room-drafts.js +17 -16
  145. package/dist/rows.d.ts.map +1 -1
  146. package/dist/rows.js +3 -4
  147. package/dist/runtime.d.ts +9 -16
  148. package/dist/runtime.d.ts.map +1 -1
  149. package/dist/save.d.ts +41 -90
  150. package/dist/save.d.ts.map +1 -1
  151. package/dist/save.js +233 -116
  152. package/dist/saves.d.ts +2 -40
  153. package/dist/saves.d.ts.map +1 -1
  154. package/dist/saves.js +107 -702
  155. package/dist/seed.d.ts.map +1 -1
  156. package/dist/seed.js +2 -3
  157. package/dist/shared.d.ts +0 -5
  158. package/dist/shared.d.ts.map +1 -1
  159. package/dist/shared.js +4 -90
  160. package/dist/shown.d.ts +4 -3
  161. package/dist/shown.d.ts.map +1 -1
  162. package/dist/shown.js +26 -31
  163. package/dist/socket/lanes.d.ts +2 -1
  164. package/dist/socket/lanes.d.ts.map +1 -1
  165. package/dist/socket/lanes.js +5 -2
  166. package/dist/socket/session.d.ts +0 -1
  167. package/dist/socket/session.d.ts.map +1 -1
  168. package/dist/socket.d.ts +2 -4
  169. package/dist/socket.d.ts.map +1 -1
  170. package/dist/socket.js +4 -8
  171. package/dist/source.d.ts.map +1 -1
  172. package/dist/source.js +5 -4
  173. package/dist/store/records.d.ts +3 -3
  174. package/dist/store/records.d.ts.map +1 -1
  175. package/dist/store/records.js +4 -5
  176. package/dist/store/space.d.ts +1 -1
  177. package/dist/store/space.d.ts.map +1 -1
  178. package/dist/store/space.js +0 -2
  179. package/dist/store/watchers.js +1 -2
  180. package/dist/store.d.ts +10 -5
  181. package/dist/store.d.ts.map +1 -1
  182. package/dist/store.js +38 -13
  183. package/dist/stored.d.ts +1 -1
  184. package/dist/stored.d.ts.map +1 -1
  185. package/dist/stored.js +6 -6
  186. package/dist/surface.d.ts.map +1 -1
  187. package/dist/surface.js +8 -8
  188. package/dist/sync.d.ts.map +1 -1
  189. package/dist/sync.js +86 -78
  190. package/dist/tables.d.ts +0 -5
  191. package/dist/tables.d.ts.map +1 -1
  192. package/dist/tables.js +8 -11
  193. package/dist/tallies.js +5 -5
  194. package/dist/validation.d.ts.map +1 -1
  195. package/dist/validation.js +2 -2
  196. package/dist/wire.d.ts +40 -4
  197. package/dist/wire.d.ts.map +1 -1
  198. package/dist/wire.js +12 -3
  199. package/package.json +3 -2
  200. package/dist/attempt.d.ts +0 -16
  201. package/dist/attempt.d.ts.map +0 -1
  202. package/dist/attempt.js +0 -70
  203. package/dist/job.d.ts +0 -33
  204. package/dist/job.d.ts.map +0 -1
  205. package/dist/job.js +0 -54
  206. package/dist/socket/rooms.d.ts +0 -44
  207. package/dist/socket/rooms.d.ts.map +0 -1
  208. package/dist/socket/rooms.js +0 -90
  209. package/dist/store/fences.d.ts +0 -16
  210. package/dist/store/fences.d.ts.map +0 -1
  211. package/dist/store/fences.js +0 -26
package/dist/install.js CHANGED
@@ -1,11 +1,12 @@
1
1
  import { attachedModel } from './attached-model.js';
2
2
  import { bootstrapRoom } from './bootstrap.js';
3
3
  import { refusedForSpace } from './durability.js';
4
- import { name, usable } from './listing.js';
4
+ import { uncaught } from './failure.js';
5
+ import { name } from './listing.js';
5
6
  import { NO_MODEL } from './model.js';
7
+ import { settle } from './queue.js';
6
8
  import { advancement } from './refresh.js';
7
- import { recoverReads, statusShown } from './shown.js';
8
- import { NO_INSTALL, } from './store.js';
9
+ import { recoverReads } from './shown.js';
9
10
  import { unconfirmed } from './transfer.js';
10
11
  import { ROW_WEIGHT, yielded } from './turn.js';
11
12
  // Bytes still arriving are reported at most this often, so readiness is not rebuilt for every chunk the network hands over while a slow link still moves the figure.
@@ -130,17 +131,15 @@ export function sweep({ store, socket, journal }) {
130
131
  await yielded();
131
132
  }
132
133
  }
133
- catch {
134
+ catch (error) {
134
135
  journal.record('erasure failed');
136
+ uncaught(error);
135
137
  }
136
138
  finally {
137
139
  store.device.set({ sweeping: false });
138
140
  }
139
141
  })();
140
142
  }
141
- export function forgetInstall(store, locator) {
142
- store.installs.change(locator, ({ installing }) => ({ ...NO_INSTALL, installing }));
143
- }
144
143
  export function caughtUpTo(runtime, locator) {
145
144
  if (!runtime.store.installs.of(locator).catching)
146
145
  return;
@@ -150,12 +149,6 @@ export function caughtUpTo(runtime, locator) {
150
149
  export function catching(store, locator) {
151
150
  store.installs.change(locator, (held) => ({ ...held, catching: true }));
152
151
  }
153
- export function confirmedAgain(store, locator) {
154
- store.installs.change(locator, (held) => ({
155
- ...held,
156
- confirmations: held.confirmations + 1,
157
- }));
158
- }
159
152
  export function standingAt(store, locator, held) {
160
153
  return { key: held?.key ?? null, confirmed: store.installs.of(locator).confirmations };
161
154
  }
@@ -382,8 +375,6 @@ function staging(runtime, local, liveness, unheld) {
382
375
  transfer: held,
383
376
  underived: owed,
384
377
  }));
385
- if (before.transfer === null)
386
- recoverReads(runtime);
387
378
  installing(runtime, locator);
388
379
  recoverReads(runtime);
389
380
  if (owed < store.deriveBytes())
@@ -396,7 +387,9 @@ function staging(runtime, local, liveness, unheld) {
396
387
  if (!liveness())
397
388
  return null;
398
389
  const prior = unheld === undefined ? await store.record(locator) : undefined;
399
- const published = prior !== undefined && prior.replica.selection === record.selection ? prior.key : null;
390
+ const published = prior !== undefined && prior.declaration.replica.selection === record.selection
391
+ ? prior.key
392
+ : null;
400
393
  const kept = unheld?.staged ?? (await local.held()).staged.has(locator);
401
394
  if (published === null && !kept)
402
395
  return { record: null, staged: new Set() };
@@ -452,7 +445,7 @@ export async function pullBootstrap(runtime, authorized, room, local, liveness,
452
445
  }
453
446
  try {
454
447
  const result = await bootstrapRoom(from, authorized, room, {
455
- collection: prior?.model ?? runtime.socket.rooms.standing(room.locator).unheldModel ?? NO_MODEL,
448
+ collection: prior?.model ?? runtime.presence.unheldModel(room.locator) ?? NO_MODEL,
456
449
  }, runtime.builtIn, runtime.typedPaths, (models, held) => (liveness() ? remodel(runtime, models, held) : held), liveness, staging(runtime, local, liveness, unheld));
457
450
  const detail = result.kind === 'staged' ? result.record.roomVersion : result.kind;
458
451
  journal.record(`transfer bootstrap ${room.locator} ${detail}`);
@@ -481,21 +474,22 @@ export async function pullBootstrap(runtime, authorized, room, local, liveness,
481
474
  }
482
475
  export function publish(runtime, local, room, reached, landing, live) {
483
476
  const { store } = runtime;
484
- const landed = store.exclusive(async () => {
477
+ let published = true;
478
+ const landed = settle(runtime, [room.locator], async (held) => {
485
479
  if (!live()) {
486
480
  caughtUpTo(runtime, room.locator);
487
- return true;
481
+ return [];
488
482
  }
489
- const work = await store.work(room.locator);
490
- const prior = work.replica;
483
+ const prior = held.get(room.locator)?.replica;
491
484
  if (!standsAt(store, room.locator, prior?.record, landing.from)) {
485
+ published = false;
492
486
  if (landing.kind === 'refreshed') {
493
487
  await local.unrefresh(reached.key);
494
- return false;
488
+ return [];
495
489
  }
496
490
  caughtUpTo(runtime, room.locator);
497
491
  await abandoned(runtime, local, room.locator);
498
- return false;
492
+ return [];
499
493
  }
500
494
  const record = landing.kind === 'refreshed' && prior !== undefined
501
495
  ? {
@@ -504,51 +498,40 @@ export function publish(runtime, local, room, reached, landing, live) {
504
498
  ...(landing.remodelled ? { model: reached.model } : {}),
505
499
  }
506
500
  : reached;
507
- let set;
508
- try {
509
- set = await runtime.settle(local, room.locator, work, record, work.queue, landing.kind === 'refreshed'
510
- ? {
511
- room: true,
512
- view: 'refreshed',
513
- commit: { refreshed: true },
514
- }
515
- : {
516
- room: true,
517
- view: landing.refreshed ? 'refreshed' : 'confirmed',
518
- commit: {
501
+ return [
502
+ {
503
+ locator: room.locator,
504
+ record,
505
+ installed: landing.kind === 'refreshed'
506
+ ? { refreshed: true }
507
+ : {
519
508
  published: { from: prior?.record.key ?? null },
520
509
  ...(landing.refreshed ? { refreshed: true } : {}),
521
510
  },
522
- });
523
- }
524
- catch (error) {
525
- if (!refusedForSpace(error))
526
- throw error;
527
- caughtUpTo(runtime, room.locator);
528
- return true;
529
- }
530
- if (landing.kind === 'bootstrapped') {
531
- runtime.socket.rooms.readied(room.locator);
532
- store.installs.change(room.locator, (held) => ({
533
- ...transferGone(held),
534
- highest: null,
535
- beyondHorizon: false,
536
- startedOver: null,
537
- catching: false,
538
- }));
539
- runtime.socket.rooms.stand(room.locator, { unheldModel: null });
540
- if (prior !== undefined && prior.record.key !== record.key)
541
- sweep(runtime);
542
- void name(runtime, room.locator);
543
- }
544
- usable(runtime, room);
545
- void runtime.store.changed(set);
546
- await runtime.unpair(local);
547
- void statusShown(runtime);
548
- if (landing.kind === 'bootstrapped' && work.queue.length > 0) {
549
- runtime.submitLater(room.locator);
550
- }
551
- return true;
511
+ after() {
512
+ runtime.presence.installed(room.locator, landing.kind === 'bootstrapped');
513
+ runtime.retries.succeeded('download', room.locator);
514
+ store.prepareAgain(room.locator);
515
+ if (landing.kind === 'bootstrapped') {
516
+ store.installs.change(room.locator, (held) => ({
517
+ ...transferGone(held),
518
+ highest: null,
519
+ beyondHorizon: false,
520
+ startedOver: null,
521
+ catching: false,
522
+ }));
523
+ if (prior !== undefined && prior.record.key !== record.key)
524
+ sweep(runtime);
525
+ void name(runtime, room.locator);
526
+ }
527
+ },
528
+ },
529
+ ];
530
+ }).then(() => published, (error) => {
531
+ if (!refusedForSpace(error))
532
+ throw error;
533
+ caughtUpTo(runtime, room.locator);
534
+ return published;
552
535
  });
553
536
  return landing.kind === 'refreshed'
554
537
  ? landed
@@ -1,7 +1,7 @@
1
1
  import type { Runtime } from './runtime.js';
2
2
  export declare function scheduleCurrency(runtime: Runtime): void;
3
3
  export declare function spaceFreed(runtime: Runtime): void;
4
- export declare function close({ store, socket, conversations, recovery, liveQueries, figures }: Runtime): void;
4
+ export declare function close({ store, socket, presence, conversations, recovery, liveQueries, figures, }: Runtime): void;
5
5
  export declare function stop(runtime: Runtime): Promise<void>;
6
6
  export declare function start(runtime: Runtime, signal: AbortSignal | undefined): void;
7
7
  //# sourceMappingURL=lifecycle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AA8M5C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,QAOhD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,QAS1C;AAED,wBAAgB,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,OAAO,QAQ9F;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,iBAS1C;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,QAwCtE"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAiO5C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,QAOhD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,QAS1C;AAED,wBAAgB,KAAK,CAAC,EACpB,KAAK,EACL,MAAM,EACN,QAAQ,EACR,aAAa,EACb,QAAQ,EACR,WAAW,EACX,OAAO,GACR,EAAE,OAAO,QAST;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,iBAS1C;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,QAyCtE"}
package/dist/lifecycle.js CHANGED
@@ -1,13 +1,15 @@
1
- import { submitAll } from './acceptance.js';
2
1
  import { catchUpConversations, receiveConversationEvent, reconcileConversations, } from './conversation.js';
2
+ import { declared } from './declaration.js';
3
+ import { uncaught } from './failure.js';
3
4
  import { catching, replaced } from './install.js';
4
5
  import { connectionLost } from './locks.js';
5
6
  import { fenceLive } from './lost.js';
6
7
  import { cachedModels, revoked, settleModels } from './models.js';
7
8
  import { refuse } from './refusal.js';
8
- import { moveTo, recoverReads, rest, SERVICE_MODE_TOPIC, show, transferring } from './shown.js';
9
+ import { moveTo, recoverReads, rest, SERVICE_MODE_TOPIC, show, submissionDue, transferring, } from './shown.js';
9
10
  import { applyRoom, changeAuthority, countAuthorityChange, finishOpening, loadRoom, OPENING_LANE, reload, resynchronize, sync, } from './sync.js';
10
11
  const CONVERSATION_LANE = 'conversations';
12
+ const RELOADING = 'reloading';
11
13
  function closing(runtime, opened) {
12
14
  const { store, socket } = runtime;
13
15
  return socket.lanes.task(OPENING_LANE, async (live) => {
@@ -20,10 +22,10 @@ function closing(runtime, opened) {
20
22
  });
21
23
  }
22
24
  function closedSocket(runtime, lapsed, lost, opened) {
23
- const { socket, conversations } = runtime;
25
+ const { socket, presence, conversations } = runtime;
24
26
  const { session } = socket;
25
27
  socket.notifyReady();
26
- socket.rooms.unreadied();
28
+ presence.stopAsking();
27
29
  connectionLost(runtime);
28
30
  if (lost)
29
31
  conversations.lost();
@@ -43,9 +45,9 @@ function closedSocket(runtime, lapsed, lost, opened) {
43
45
  void closing(runtime, opened);
44
46
  }
45
47
  function owedReloads(runtime, expired, held) {
46
- const { store, socket } = runtime;
47
- const reloading = socket.rooms
48
- .discoveredRooms()
48
+ const { store, presence } = runtime;
49
+ const reloading = presence
50
+ .rooms()
49
51
  .filter((room) => !expired.includes(room.locator) && revoked(held.get(room.locator)?.record.model))
50
52
  .map((room) => room.locator);
51
53
  for (const locator of reloading)
@@ -54,15 +56,15 @@ function owedReloads(runtime, expired, held) {
54
56
  return reloading;
55
57
  }
56
58
  async function reloadNow(runtime, replacing, progress, held, installing) {
57
- const { store, socket } = runtime;
58
- const { rooms, lanes } = socket;
59
- const discovered = rooms.discoveredRooms();
59
+ const { store, socket, presence } = runtime;
60
+ const { lanes } = socket;
61
+ const discovered = presence.rooms();
60
62
  const reloaded = discovered.filter((room) => held.has(room.locator) && !installing.has(room.locator) && replacing(room));
61
63
  const acquired = discovered.filter((room) => (!held.has(room.locator) || installing.has(room.locator)) &&
62
64
  room.replica.admission === 'admitted' &&
63
65
  replacing(room));
64
66
  for (const room of reloaded)
65
- rooms.stand(room.locator, { reloadDue: true });
67
+ presence.reload(room.locator, true);
66
68
  try {
67
69
  const local = await store.open();
68
70
  const kept = acquired.length === 0 ? new Set() : (await local.held()).staged;
@@ -77,15 +79,17 @@ async function reloadNow(runtime, replacing, progress, held, installing) {
77
79
  .roomTask(room.locator, (live) => loadRoom(runtime, room, local, progress, live, unheld))
78
80
  .then(() => rest(runtime, progress));
79
81
  }
82
+ runtime.retries.succeeded('download', RELOADING);
80
83
  }
81
- catch {
84
+ catch (error) {
85
+ runtime.retries.failed('download', RELOADING, error);
82
86
  for (const room of reloaded)
83
- rooms.stand(room.locator, { reloadDue: false });
87
+ presence.reload(room.locator, false);
84
88
  progress.reachable = false;
85
89
  }
86
90
  }
87
91
  function caughtUpRooms(runtime, expired) {
88
- const { store, socket } = runtime;
92
+ const { store, socket, presence } = runtime;
89
93
  const { session } = socket;
90
94
  const progress = session.now().underway;
91
95
  session.set({ underway: null });
@@ -112,14 +116,17 @@ function caughtUpRooms(runtime, expired) {
112
116
  if (progress.reachable) {
113
117
  const stored = await held;
114
118
  const owed = await reloading;
115
- await settleModels(runtime, socket.rooms
116
- .discoveredRooms()
119
+ await settleModels(runtime, new Map(presence
120
+ .rooms()
117
121
  .filter((room) => stored.has(room.locator) &&
118
122
  !expired.includes(room.locator) &&
119
- !owed.includes(room.locator)), 'current', local);
123
+ !owed.includes(room.locator))
124
+ .map((room) => [room.locator, declared(room)])), 'current', local);
120
125
  }
126
+ runtime.retries.succeeded('download', OPENING_LANE);
121
127
  }
122
- catch {
128
+ catch (error) {
129
+ runtime.retries.failed('download', OPENING_LANE, error);
123
130
  progress.complete = false;
124
131
  progress.reachable = false;
125
132
  }
@@ -145,7 +152,7 @@ function signalled(runtime, mode) {
145
152
  store.tell(SERVICE_MODE_TOPIC, mode);
146
153
  }
147
154
  if (releasing)
148
- submitAll(runtime);
155
+ void submissionDue(runtime);
149
156
  }
150
157
  async function runCurrency(runtime, live) {
151
158
  const { socket, conversations } = runtime;
@@ -166,8 +173,10 @@ async function runCurrency(runtime, live) {
166
173
  moveTo(runtime, transferring(runtime));
167
174
  try {
168
175
  await catchUpConversations(conversations, progress);
176
+ runtime.retries.succeeded('conversations', CONVERSATION_LANE);
169
177
  }
170
- catch {
178
+ catch (error) {
179
+ runtime.retries.failed('conversations', CONVERSATION_LANE, error);
171
180
  progress.reachable = false;
172
181
  }
173
182
  await rest(runtime, progress, live);
@@ -182,7 +191,7 @@ export function scheduleCurrency(runtime) {
182
191
  }
183
192
  export function spaceFreed(runtime) {
184
193
  const { store, socket, journal } = runtime;
185
- socket.rooms.standAll({ unpreparable: false });
194
+ store.prepareAgain();
186
195
  journal.record('space freed');
187
196
  store.readiness.queue();
188
197
  const { closed, authorization } = socket.session.now();
@@ -193,10 +202,11 @@ export function spaceFreed(runtime) {
193
202
  else
194
203
  void resynchronize(runtime);
195
204
  }
196
- export function close({ store, socket, conversations, recovery, liveQueries, figures }) {
205
+ export function close({ store, socket, presence, conversations, recovery, liveQueries, figures, }) {
197
206
  if (socket.closed())
198
207
  return;
199
208
  socket.close();
209
+ presence.close();
200
210
  conversations.close();
201
211
  void recovery.retire();
202
212
  liveQueries.close();
@@ -204,9 +214,9 @@ export function close({ store, socket, conversations, recovery, liveQueries, fig
204
214
  store.close();
205
215
  }
206
216
  export async function stop(runtime) {
207
- const { store, socket, recovery } = runtime;
217
+ const { store, socket, presence, recovery } = runtime;
208
218
  socket.session.set({ stopping: true });
209
- socket.rooms.unreadied();
219
+ presence.stopAsking();
210
220
  socket.stopReads();
211
221
  await recovery.retire();
212
222
  await socket.lanes.finished();
@@ -214,7 +224,7 @@ export async function stop(runtime) {
214
224
  close(runtime);
215
225
  }
216
226
  export function start(runtime, signal) {
217
- const { store, socket, conversations, lastAnswers, recovery } = runtime;
227
+ const { store, socket, presence, conversations, lastAnswers, recovery } = runtime;
218
228
  const closeRuntime = () => close(runtime);
219
229
  socket.observeServiceMode((mode) => signalled(runtime, mode));
220
230
  socket.observeConversations((event) => {
@@ -231,7 +241,7 @@ export function start(runtime, signal) {
231
241
  closeRuntime();
232
242
  socket.observe((event) => {
233
243
  if (event.kind === 'opened') {
234
- socket.rooms.connectionLive();
244
+ presence.connectionLive();
235
245
  conversations.reopened();
236
246
  lastAnswers.reopened();
237
247
  recovery.resume();
@@ -260,8 +270,9 @@ export function start(runtime, signal) {
260
270
  if ((await local.facts()).capabilities.length > 0)
261
271
  socket.readyFromStore();
262
272
  })
263
- .catch(() => {
273
+ .catch((error) => {
264
274
  socket.readyFromStore();
275
+ uncaught(error);
265
276
  });
266
277
  if (!socket.streamed)
267
278
  void sync(runtime, 'unstreamed', null);
package/dist/listing.d.ts CHANGED
@@ -1,11 +1,10 @@
1
1
  import type { HeldRooms } from '@agentshouse/mdmodel';
2
- import type { DiscoveredRoom, HeldRoom, OperationScopes, ProviderRefusal, ReplicaAdmission } from './adapter.js';
2
+ import type { DiscoveredRoom, HeldRoom, OperationScopes, ProviderRefusal, ReplicaAdmission, RoomDeclaration } from './adapter.js';
3
3
  import type { Composition } from './collection.js';
4
4
  import { type ModelState, type TypesResult } from './model.js';
5
5
  import { type PortReach } from './reach.js';
6
6
  import type { ReplicaRecord } from './replica.js';
7
7
  import type { Runtime } from './runtime.js';
8
- import type { RoomDeclaration } from './socket.js';
9
8
  import type { Stored } from './store.js';
10
9
  export type AppTypedSelection = {
11
10
  roots: readonly string[];
@@ -20,6 +19,7 @@ export type AppRoom = {
20
19
  model: TypesResult;
21
20
  typedSelection: AppTypedSelection | null;
22
21
  providerOwnedPaths: readonly string[];
22
+ authoredPaths: readonly string[];
23
23
  roomVersion: string | null;
24
24
  documents: number;
25
25
  synchronizationAvailable: boolean;
@@ -31,22 +31,17 @@ type ListedEntry = ListedRoom & {
31
31
  readonly documents: number;
32
32
  };
33
33
  export type Listing = ReadonlyMap<string, ListedEntry>;
34
- export declare function modelIn({ socket }: Runtime, locator: string, stored: Stored | undefined): ModelState;
34
+ export declare function modelIn({ socket, presence }: Runtime, locator: string, stored: Stored | undefined): ModelState;
35
35
  export declare function compositionFor(runtime: Runtime, record: ReplicaRecord): Composition;
36
- export declare function declarationOf({ socket }: Runtime, locator: string, stored: Stored | undefined): {
36
+ export declare function declarationOf({ presence }: Runtime, locator: string, stored: Stored | undefined): {
37
37
  readonly room: RoomDeclaration;
38
38
  readonly available: boolean;
39
39
  } | undefined;
40
- export declare function listedLocators({ store, socket }: Runtime, held: ReadonlyMap<string, unknown>): string[];
40
+ export declare function listedLocators({ presence }: Runtime, held: ReadonlyMap<string, unknown>): string[];
41
41
  export declare function patchedListing(runtime: Runtime, changed: ReadonlySet<string>): Promise<Listing | null>;
42
42
  export declare function listingNow(runtime: Runtime): Promise<Listing>;
43
- export declare function shownRooms(runtime: Runtime, listing: Listing): readonly AppRoom[];
43
+ export declare function shownRooms({ presence }: Runtime, listing: Listing): readonly AppRoom[];
44
44
  export declare function roomFacts(runtime: Runtime, reach?: PortReach | null): Promise<HeldRooms>;
45
- export declare function list({ store, socket }: Runtime, room: RoomDeclaration, synchronizationAvailable: boolean): void;
46
- export declare function listHeld({ store, socket }: Runtime, locator: string): void;
47
- export declare function admitted({ socket }: Runtime, room: RoomDeclaration): boolean;
48
- export declare function readable(runtime: Runtime, room: DiscoveredRoom): void;
49
- export declare function usable(runtime: Runtime, room: DiscoveredRoom): void;
50
45
  export declare function heldRooms({ store }: Runtime, listed: readonly DiscoveredRoom[]): Promise<HeldRoom[]>;
51
46
  export declare function name(runtime: Runtime, locator: string): Promise<void>;
52
47
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"listing.d.ts","sourceRoot":"","sources":["../src/listing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"listing.d.ts","sourceRoot":"","sources":["../src/listing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EACV,cAAc,EACd,QAAQ,EACR,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EAChB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAwB,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,KAAK,EAAE,WAAW,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,eAAe,CAAC;IAC5B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,WAAW,CAAC;IACnB,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACzC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB,EAAE,OAAO,CAAC;IAClC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,KAAK,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,QAAQ,CAAC,CAAC;AAExD,KAAK,WAAW,GAAG,UAAU,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEvD,wBAAgB,OAAO,CACrB,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,OAAO,EAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,UAAU,CAIZ;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,WAAW,CAKnF;AAED,wBAAgB,aAAa,CAC3B,EAAE,QAAQ,EAAE,EAAE,OAAO,EACrB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAQ7E;AAED,wBAAgB,cAAc,CAC5B,EAAE,QAAQ,EAAE,EAAE,OAAO,EACrB,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,MAAM,EAAE,CAGV;AA8CD,wBAAsB,cAAc,CAClC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAC3B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAYzB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnE;AAED,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,SAAS,OAAO,EAAE,CAmBtF;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,OAAO,EAChB,KAAK,GAAE,SAAS,GAAG,IAAW,GAC7B,OAAO,CAAC,SAAS,CAAC,CAoBpB;AAED,wBAAsB,SAAS,CAC7B,EAAE,KAAK,EAAE,EAAE,OAAO,EAClB,MAAM,EAAE,SAAS,cAAc,EAAE,GAChC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAYrB;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAO3D"}
package/dist/listing.js CHANGED
@@ -1,9 +1,10 @@
1
+ import { declared } from './declaration.js';
1
2
  import { modelTypes, NO_MODEL } from './model.js';
2
3
  import { governs, holds } from './reach.js';
3
- export function modelIn({ socket }, locator, stored) {
4
+ export function modelIn({ socket, presence }, locator, stored) {
4
5
  if (socket.session.now().refusal?.code === 'revoked-authorization')
5
6
  return { status: 'unavailable', reason: 'revoked' };
6
- return stored?.record.model ?? socket.rooms.standing(locator).unheldModel ?? NO_MODEL;
7
+ return stored?.record.model ?? presence.unheldModel(locator) ?? NO_MODEL;
7
8
  }
8
9
  export function compositionFor(runtime, record) {
9
10
  return runtime.store.composed({
@@ -11,17 +12,19 @@ export function compositionFor(runtime, record) {
11
12
  model: modelIn(runtime, record.locator, { record, indexed: true, documents: 0 }),
12
13
  });
13
14
  }
14
- export function declarationOf({ socket }, locator, stored) {
15
- const held = socket.rooms.declared(locator);
16
- const room = stored?.record ?? held?.room ?? socket.rooms.discovered(locator);
17
- return room === undefined ? undefined : { room, available: held?.available ?? true };
15
+ export function declarationOf({ presence }, locator, stored) {
16
+ const listed = presence.room(locator);
17
+ const room = stored?.record.declaration ?? (listed === undefined ? undefined : declared(listed));
18
+ if (room === undefined)
19
+ return undefined;
20
+ return {
21
+ room,
22
+ available: presence.available(locator, stored?.record.declaration.replica.selection),
23
+ };
18
24
  }
19
- export function listedLocators({ store, socket }, held) {
20
- const declared = socket.rooms.declarations();
21
- return [
22
- ...declared.keys(),
23
- ...[...held.keys()].filter((locator) => !declared.has(locator)),
24
- ].filter((locator) => !store.fences.has(locator));
25
+ export function listedLocators({ presence }, held) {
26
+ const listed = presence.rooms().map(({ locator }) => locator);
27
+ return [...new Set([...listed, ...held.keys()])];
25
28
  }
26
29
  function selectionModel({ socket, builtIn }) {
27
30
  return socket.session.now().refusal?.code === 'revoked-authorization'
@@ -33,7 +36,7 @@ function listedRoom(runtime, locator, stored) {
33
36
  if (declaration === undefined)
34
37
  return undefined;
35
38
  const { room, available } = declaration;
36
- const selection = room.typedSelection ?? null;
39
+ const selection = room.typedSelection;
37
40
  return {
38
41
  name: room.name,
39
42
  locator,
@@ -45,9 +48,10 @@ function listedRoom(runtime, locator, stored) {
45
48
  ? null
46
49
  : { roots: selection.roots, model: modelTypes(selectionModel(runtime)) },
47
50
  providerOwnedPaths: room.providerOwnedPaths,
51
+ authoredPaths: room.authoredPaths,
48
52
  roomVersion: stored?.record.roomVersion ?? null,
49
53
  synchronizationAvailable: available,
50
- refusal: runtime.socket.rooms.standing(locator).refusal,
54
+ refusal: runtime.presence.refusal(locator),
51
55
  documents: stored?.documents ?? 0,
52
56
  };
53
57
  }
@@ -68,9 +72,7 @@ export async function patchedListing(runtime, changed) {
68
72
  const held = await store.rooms([...changed]);
69
73
  const listing = new Map(roomsShown);
70
74
  for (const locator of changed) {
71
- const room = store.fences.has(locator)
72
- ? undefined
73
- : listedRoom(runtime, locator, held.get(locator));
75
+ const room = listedRoom(runtime, locator, held.get(locator));
74
76
  if (room === undefined || !listing.has(locator))
75
77
  return null;
76
78
  listing.set(locator, room);
@@ -80,11 +82,9 @@ export async function patchedListing(runtime, changed) {
80
82
  export async function listingNow(runtime) {
81
83
  return listingOf(runtime, await runtime.store.rooms());
82
84
  }
83
- function lockedIn({ socket }, listing, locator) {
84
- return (listing.get(locator)?.replica.offline === 'locked' && !socket.rooms.standing(locator).confirmed);
85
- }
86
- export function shownRooms(runtime, listing) {
87
- return structuredClone([...listing.values()].map(({ documents, ...room }) => lockedIn(runtime, listing, room.locator)
85
+ export function shownRooms({ presence }, listing) {
86
+ const locked = new Set(presence.lockedAmong(new Map([...listing].map(([locator, room]) => [locator, room.replica.offline]))));
87
+ return structuredClone([...listing.values()].map(({ documents, ...room }) => locked.has(room.locator)
88
88
  ? {
89
89
  ...room,
90
90
  model: modelTypes(NO_MODEL),
@@ -113,43 +113,6 @@ export async function roomFacts(runtime, reach = null) {
113
113
  });
114
114
  return { listed: socket.session.now().roomsListed, rooms };
115
115
  }
116
- export function list({ store, socket }, room, synchronizationAvailable) {
117
- if (store.fences.has(room.locator))
118
- return;
119
- socket.rooms.declare(room.locator, {
120
- room: {
121
- name: room.name,
122
- locator: room.locator,
123
- handle: room.handle,
124
- operations: room.operations,
125
- replica: room.replica,
126
- typedSelection: room.typedSelection ?? null,
127
- providerOwnedPaths: room.providerOwnedPaths,
128
- authoredPaths: room.authoredPaths,
129
- },
130
- available: synchronizationAvailable,
131
- });
132
- }
133
- export function listHeld({ store, socket }, locator) {
134
- if (store.fences.has(locator))
135
- return;
136
- socket.rooms.declare(locator, { room: null, available: false });
137
- }
138
- export function admitted({ socket }, room) {
139
- return room.replica.admission === 'admitted' && !socket.rooms.standing(room.locator).unreadable;
140
- }
141
- export function readable(runtime, room) {
142
- runtime.socket.rooms.stand(room.locator, { unreadable: false });
143
- list(runtime, room, true);
144
- }
145
- export function usable(runtime, room) {
146
- const { rooms } = runtime.socket;
147
- rooms.stand(room.locator, { stale: false, unpreparable: false });
148
- if (rooms.standing(room.locator).unreadable) {
149
- rooms.stand(room.locator, { unreadable: false, refusal: null });
150
- }
151
- list(runtime, room, true);
152
- }
153
116
  export async function heldRooms({ store }, listed) {
154
117
  const stored = await store.rooms(listed.map((room) => room.locator));
155
118
  return listed.flatMap((room) => {
@@ -159,14 +122,14 @@ export async function heldRooms({ store }, listed) {
159
122
  ? [{ locator: room.locator, roomVersion: null }]
160
123
  : [];
161
124
  }
162
- if (record.replica.selection !== room.replica.selection)
125
+ if (record.declaration.replica.selection !== room.replica.selection)
163
126
  return [];
164
127
  return [{ locator: room.locator, roomVersion: record.roomVersion }];
165
128
  });
166
129
  }
167
130
  export async function name(runtime, locator) {
168
- const { socket } = runtime;
169
- const room = socket.rooms.discovered(locator);
131
+ const { socket, presence } = runtime;
132
+ const room = presence.room(locator);
170
133
  if (!socket.streamed || room === undefined || !socket.isOpen() || !socket.isHanded())
171
134
  return;
172
135
  const [held] = await heldRooms(runtime, [room]);
@@ -1 +1 @@
1
- {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,KAAK,GAAG;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,GAAG,aAAa,CAAC;AAE7F,MAAM,MAAM,GAAG,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAE5E,KAAK,QAAQ,GAAG,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;AAchD,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,CACH,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,EACzB,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,IAAI,GACX,MAAM,IAAI,CAAC;IACd,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAmCF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CA4HxF"}
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,KAAK,GAAG;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,GAAG,aAAa,CAAC;AAE7F,MAAM,MAAM,GAAG,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAE5E,KAAK,QAAQ,GAAG,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;AAchD,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,CACH,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,EACzB,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,IAAI,GACX,MAAM,IAAI,CAAC;IACd,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAmCF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CA2HxF"}
package/dist/live.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { changeOf, digestOf, } from './observation.js';
2
+ import { uncaught } from './failure.js';
2
3
  import { roomOfKey } from './rows.js';
3
4
  function narrowed(plan) {
4
5
  return (plan.paths !== null &&
@@ -76,7 +77,6 @@ export function createLiveQueries(run, holding) {
76
77
  }
77
78
  }
78
79
  catch (error) {
79
- entry.dirty = false;
80
80
  const unanswered = [...entry.fresh.values()];
81
81
  entry.fresh.clear();
82
82
  for (const failed of unanswered)
@@ -113,8 +113,8 @@ export function createLiveQueries(run, holding) {
113
113
  }
114
114
  } while (recoverAgain && !closed);
115
115
  }
116
- catch {
117
- recoverAgain = false;
116
+ catch (error) {
117
+ uncaught(error);
118
118
  }
119
119
  finally {
120
120
  recovering = false;
package/dist/locks.d.ts CHANGED
@@ -1,9 +1,7 @@
1
- import type { DiscoveredRoom } from './adapter.js';
2
1
  import type { Runtime } from './runtime.js';
3
- export declare function locked({ store, socket }: Runtime, locator: string): Promise<boolean>;
4
- export declare function lockedRooms(runtime: Runtime): Promise<readonly string[]>;
2
+ export declare function locked({ store, presence }: Runtime, locator: string): Promise<boolean>;
3
+ export declare function lockedRooms({ store, presence }: Runtime): Promise<readonly string[]>;
5
4
  export declare function relocked(runtime: Runtime, before: readonly string[]): Promise<void>;
6
- export declare function confirmLocks({ socket }: Runtime, listed: readonly DiscoveredRoom[]): void;
7
5
  export declare function connectionLost(runtime: Runtime): void;
8
6
  export declare function watchLocks({ store }: Runtime, notify: () => void): () => void;
9
7
  //# sourceMappingURL=locks.d.ts.map