@agentshouse/mdruntime 0.1.0-cd26b960b7262 → 0.1.0-cd30853a1b15e

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 (257) hide show
  1. package/README.md +21 -19
  2. package/dist/acceptance.d.ts +0 -3
  3. package/dist/acceptance.d.ts.map +1 -1
  4. package/dist/acceptance.js +72 -158
  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 +8 -2
  9. package/dist/actions.d.ts.map +1 -1
  10. package/dist/actions.js +118 -67
  11. package/dist/adapter.d.ts +81 -56
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/attached-model.d.ts +0 -1
  14. package/dist/attached-model.d.ts.map +1 -1
  15. package/dist/attached-model.js +0 -5
  16. package/dist/authored.d.ts +88 -0
  17. package/dist/authored.d.ts.map +1 -0
  18. package/dist/authored.js +345 -0
  19. package/dist/bootstrap.d.ts +1 -1
  20. package/dist/bootstrap.d.ts.map +1 -1
  21. package/dist/bootstrap.js +6 -19
  22. package/dist/change-set.d.ts +4 -0
  23. package/dist/change-set.d.ts.map +1 -1
  24. package/dist/change-set.js +6 -0
  25. package/dist/change.d.ts +4 -0
  26. package/dist/change.d.ts.map +1 -1
  27. package/dist/change.js +3 -0
  28. package/dist/chat-types.d.ts +0 -2
  29. package/dist/chat-types.d.ts.map +1 -1
  30. package/dist/chat-types.js +0 -2
  31. package/dist/client.d.ts +10 -19
  32. package/dist/client.d.ts.map +1 -1
  33. package/dist/client.js +30 -18
  34. package/dist/collection.d.ts +25 -4
  35. package/dist/collection.d.ts.map +1 -1
  36. package/dist/collection.js +19 -2
  37. package/dist/column.d.ts +5 -0
  38. package/dist/column.d.ts.map +1 -0
  39. package/dist/column.js +9 -0
  40. package/dist/compile.d.ts +2 -0
  41. package/dist/compile.d.ts.map +1 -1
  42. package/dist/compile.js +17 -5
  43. package/dist/connection.d.ts.map +1 -1
  44. package/dist/connection.js +31 -24
  45. package/dist/context.d.ts.map +1 -1
  46. package/dist/context.js +1 -1
  47. package/dist/conversation-live.d.ts +26 -12
  48. package/dist/conversation-live.d.ts.map +1 -1
  49. package/dist/conversation-live.js +23 -12
  50. package/dist/conversation-row.d.ts +8 -1
  51. package/dist/conversation-row.d.ts.map +1 -1
  52. package/dist/conversation-row.js +20 -7
  53. package/dist/conversation.d.ts +32 -10
  54. package/dist/conversation.d.ts.map +1 -1
  55. package/dist/conversation.js +317 -232
  56. package/dist/declaration.d.ts +10 -0
  57. package/dist/declaration.d.ts.map +1 -0
  58. package/dist/declaration.js +24 -0
  59. package/dist/discovery.d.ts.map +1 -1
  60. package/dist/discovery.js +19 -44
  61. package/dist/durability.d.ts +4 -0
  62. package/dist/durability.d.ts.map +1 -1
  63. package/dist/durability.js +4 -0
  64. package/dist/entry.js +1 -1
  65. package/dist/expectation.d.ts +25 -14
  66. package/dist/expectation.d.ts.map +1 -1
  67. package/dist/expectation.js +51 -20
  68. package/dist/failure.d.ts +3 -0
  69. package/dist/failure.d.ts.map +1 -1
  70. package/dist/failure.js +6 -0
  71. package/dist/figures.d.ts.map +1 -1
  72. package/dist/figures.js +4 -2
  73. package/dist/file.d.ts.map +1 -1
  74. package/dist/file.js +2 -1
  75. package/dist/host.d.ts +18 -2
  76. package/dist/host.d.ts.map +1 -1
  77. package/dist/host.js +55 -15
  78. package/dist/index.d.ts +15 -10
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +12 -7
  81. package/dist/install.d.ts +10 -6
  82. package/dist/install.d.ts.map +1 -1
  83. package/dist/install.js +92 -109
  84. package/dist/lifecycle.d.ts +1 -1
  85. package/dist/lifecycle.d.ts.map +1 -1
  86. package/dist/lifecycle.js +54 -40
  87. package/dist/listing.d.ts +11 -12
  88. package/dist/listing.d.ts.map +1 -1
  89. package/dist/listing.js +48 -72
  90. package/dist/live.d.ts +5 -3
  91. package/dist/live.d.ts.map +1 -1
  92. package/dist/live.js +74 -31
  93. package/dist/loaded.d.ts +5 -0
  94. package/dist/loaded.d.ts.map +1 -0
  95. package/dist/loaded.js +40 -0
  96. package/dist/locks.d.ts +2 -4
  97. package/dist/locks.d.ts.map +1 -1
  98. package/dist/locks.js +10 -39
  99. package/dist/lost.d.ts.map +1 -1
  100. package/dist/lost.js +11 -23
  101. package/dist/media.d.ts +5 -0
  102. package/dist/media.d.ts.map +1 -1
  103. package/dist/media.js +65 -14
  104. package/dist/memory.d.ts +7 -3
  105. package/dist/memory.d.ts.map +1 -1
  106. package/dist/memory.js +56 -26
  107. package/dist/messages.d.ts +12 -6
  108. package/dist/messages.d.ts.map +1 -1
  109. package/dist/messages.js +25 -27
  110. package/dist/model.d.ts +0 -1
  111. package/dist/model.d.ts.map +1 -1
  112. package/dist/model.js +0 -5
  113. package/dist/models.d.ts +4 -8
  114. package/dist/models.d.ts.map +1 -1
  115. package/dist/models.js +97 -139
  116. package/dist/observation.d.ts +27 -12
  117. package/dist/observation.d.ts.map +1 -1
  118. package/dist/observation.js +173 -69
  119. package/dist/opened.d.ts +1 -1
  120. package/dist/opened.d.ts.map +1 -1
  121. package/dist/opened.js +2 -2
  122. package/dist/opening.d.ts.map +1 -1
  123. package/dist/opening.js +5 -9
  124. package/dist/outcome.d.ts +7 -0
  125. package/dist/outcome.d.ts.map +1 -1
  126. package/dist/outcome.js +23 -2
  127. package/dist/overlay.d.ts +6 -2
  128. package/dist/overlay.d.ts.map +1 -1
  129. package/dist/overlay.js +37 -24
  130. package/dist/page-metadata.d.ts +8 -0
  131. package/dist/page-metadata.d.ts.map +1 -0
  132. package/dist/page-metadata.js +19 -0
  133. package/dist/parts.d.ts +3 -59
  134. package/dist/parts.d.ts.map +1 -1
  135. package/dist/parts.js +10 -123
  136. package/dist/preparation.d.ts +27 -6
  137. package/dist/preparation.d.ts.map +1 -1
  138. package/dist/preparation.js +154 -66
  139. package/dist/presence.d.ts +58 -0
  140. package/dist/presence.d.ts.map +1 -0
  141. package/dist/presence.js +231 -0
  142. package/dist/queries.d.ts +2 -2
  143. package/dist/queries.d.ts.map +1 -1
  144. package/dist/queries.js +66 -30
  145. package/dist/questions.d.ts +1 -5
  146. package/dist/questions.d.ts.map +1 -1
  147. package/dist/questions.js +1 -7
  148. package/dist/queue.d.ts +40 -0
  149. package/dist/queue.d.ts.map +1 -0
  150. package/dist/queue.js +480 -0
  151. package/dist/reach.d.ts +2 -3
  152. package/dist/reach.d.ts.map +1 -1
  153. package/dist/reach.js +83 -25
  154. package/dist/react.d.ts +8 -5
  155. package/dist/react.d.ts.map +1 -1
  156. package/dist/react.js +28 -5
  157. package/dist/readiness.d.ts +9 -3
  158. package/dist/readiness.d.ts.map +1 -1
  159. package/dist/readiness.js +3 -5
  160. package/dist/reads.d.ts +4 -2
  161. package/dist/reads.d.ts.map +1 -1
  162. package/dist/reads.js +11 -4
  163. package/dist/recovery.d.ts +3 -1
  164. package/dist/recovery.d.ts.map +1 -1
  165. package/dist/recovery.js +29 -7
  166. package/dist/refresh.js +2 -2
  167. package/dist/refusal.d.ts.map +1 -1
  168. package/dist/refusal.js +5 -5
  169. package/dist/replica.d.ts +5 -11
  170. package/dist/replica.d.ts.map +1 -1
  171. package/dist/replica.js +14 -16
  172. package/dist/retried.d.ts +30 -0
  173. package/dist/retried.d.ts.map +1 -0
  174. package/dist/retried.js +72 -0
  175. package/dist/room-draft.d.ts +30 -5
  176. package/dist/room-draft.d.ts.map +1 -1
  177. package/dist/room-draft.js +270 -63
  178. package/dist/room-drafts.d.ts.map +1 -1
  179. package/dist/room-drafts.js +8 -5
  180. package/dist/room-list.d.ts +10 -0
  181. package/dist/room-list.d.ts.map +1 -0
  182. package/dist/room-list.js +45 -0
  183. package/dist/rows.d.ts +2 -1
  184. package/dist/rows.d.ts.map +1 -1
  185. package/dist/rows.js +9 -10
  186. package/dist/runtime.d.ts +9 -18
  187. package/dist/runtime.d.ts.map +1 -1
  188. package/dist/save.d.ts +42 -90
  189. package/dist/save.d.ts.map +1 -1
  190. package/dist/save.js +314 -223
  191. package/dist/saves.d.ts +2 -40
  192. package/dist/saves.d.ts.map +1 -1
  193. package/dist/saves.js +124 -703
  194. package/dist/seed.d.ts.map +1 -1
  195. package/dist/seed.js +4 -4
  196. package/dist/shown.d.ts +7 -5
  197. package/dist/shown.d.ts.map +1 -1
  198. package/dist/shown.js +75 -58
  199. package/dist/socket/lanes.d.ts +12 -4
  200. package/dist/socket/lanes.d.ts.map +1 -1
  201. package/dist/socket/lanes.js +34 -8
  202. package/dist/socket.d.ts +3 -6
  203. package/dist/socket.d.ts.map +1 -1
  204. package/dist/socket.js +3 -14
  205. package/dist/source.d.ts +5 -7
  206. package/dist/source.d.ts.map +1 -1
  207. package/dist/source.js +13 -2
  208. package/dist/store/installs.d.ts +2 -2
  209. package/dist/store/installs.d.ts.map +1 -1
  210. package/dist/store/installs.js +10 -4
  211. package/dist/store/readiness.d.ts +5 -4
  212. package/dist/store/readiness.d.ts.map +1 -1
  213. package/dist/store/readiness.js +28 -12
  214. package/dist/store/records.d.ts +17 -6
  215. package/dist/store/records.d.ts.map +1 -1
  216. package/dist/store/records.js +56 -22
  217. package/dist/store/rooms-shown.d.ts +8 -0
  218. package/dist/store/rooms-shown.d.ts.map +1 -0
  219. package/dist/store/rooms-shown.js +13 -0
  220. package/dist/store.d.ts +23 -14
  221. package/dist/store.d.ts.map +1 -1
  222. package/dist/store.js +46 -17
  223. package/dist/stored.d.ts +24 -13
  224. package/dist/stored.d.ts.map +1 -1
  225. package/dist/stored.js +80 -29
  226. package/dist/surface.d.ts +5 -3
  227. package/dist/surface.d.ts.map +1 -1
  228. package/dist/surface.js +23 -21
  229. package/dist/sync.d.ts +1 -1
  230. package/dist/sync.d.ts.map +1 -1
  231. package/dist/sync.js +89 -85
  232. package/dist/tables.d.ts +16 -56
  233. package/dist/tables.d.ts.map +1 -1
  234. package/dist/tables.js +86 -327
  235. package/dist/tallies.d.ts.map +1 -1
  236. package/dist/tallies.js +1 -2
  237. package/dist/validation.d.ts.map +1 -1
  238. package/dist/validation.js +4 -10
  239. package/dist/wire.d.ts +45 -7
  240. package/dist/wire.d.ts.map +1 -1
  241. package/dist/wire.js +15 -4
  242. package/package.json +3 -2
  243. package/dist/attempt.d.ts +0 -16
  244. package/dist/attempt.d.ts.map +0 -1
  245. package/dist/attempt.js +0 -70
  246. package/dist/job.d.ts +0 -33
  247. package/dist/job.d.ts.map +0 -1
  248. package/dist/job.js +0 -54
  249. package/dist/log.d.ts +0 -6
  250. package/dist/log.d.ts.map +0 -1
  251. package/dist/log.js +0 -14
  252. package/dist/socket/rooms.d.ts +0 -44
  253. package/dist/socket/rooms.d.ts.map +0 -1
  254. package/dist/socket/rooms.js +0 -90
  255. package/dist/store/fences.d.ts +0 -16
  256. package/dist/store/fences.d.ts.map +0 -1
  257. package/dist/store/fences.js +0 -26
package/dist/listing.d.ts CHANGED
@@ -1,11 +1,11 @@
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
+ import type { KeyedChange } from './observation.js';
4
5
  import { type ModelState, type TypesResult } from './model.js';
5
6
  import { type PortReach } from './reach.js';
6
7
  import type { ReplicaRecord } from './replica.js';
7
8
  import type { Runtime } from './runtime.js';
8
- import type { RoomDeclaration } from './socket.js';
9
9
  import type { Stored } from './store.js';
10
10
  export type AppTypedSelection = {
11
11
  roots: readonly string[];
@@ -20,6 +20,7 @@ export type AppRoom = {
20
20
  model: TypesResult;
21
21
  typedSelection: AppTypedSelection | null;
22
22
  providerOwnedPaths: readonly string[];
23
+ authoredPaths: readonly string[];
23
24
  roomVersion: string | null;
24
25
  documents: number;
25
26
  synchronizationAvailable: boolean;
@@ -27,26 +28,24 @@ export type AppRoom = {
27
28
  locked: boolean;
28
29
  };
29
30
  type ListedRoom = Omit<AppRoom, 'documents' | 'locked'>;
30
- type ListedEntry = ListedRoom & {
31
+ export type ListedEntry = ListedRoom & {
31
32
  readonly documents: number;
32
33
  };
33
34
  export type Listing = ReadonlyMap<string, ListedEntry>;
34
- export declare function modelIn({ socket }: Runtime, locator: string, stored: Stored | undefined): ModelState;
35
+ export type RoomsChange = KeyedChange<string, AppRoom>;
36
+ export declare function modelIn({ socket, presence }: Runtime, locator: string, stored: Stored | undefined): ModelState;
35
37
  export declare function compositionFor(runtime: Runtime, record: ReplicaRecord): Composition;
36
- export declare function declarationOf({ socket }: Runtime, locator: string, stored: Stored | undefined): {
38
+ export declare function declarationOf({ presence }: Runtime, locator: string, stored: Stored | undefined): {
37
39
  readonly room: RoomDeclaration;
38
40
  readonly available: boolean;
39
41
  } | undefined;
40
- export declare function listedLocators({ store, socket }: Runtime, held: ReadonlyMap<string, unknown>): string[];
41
- export declare function patchedListing(runtime: Runtime, changed: ReadonlySet<string>): Promise<Listing | null>;
42
+ export declare function listedLocators({ presence }: Runtime, held: ReadonlyMap<string, unknown>): string[];
43
+ export declare function listedOrHeld({ presence }: Runtime, held: ReadonlyMap<string, unknown>, locator: string): boolean;
44
+ export declare function listedEntries(runtime: Runtime, touched: readonly string[]): Promise<readonly ListedEntry[] | null>;
42
45
  export declare function listingNow(runtime: Runtime): Promise<Listing>;
43
46
  export declare function shownRooms(runtime: Runtime, listing: Listing): readonly AppRoom[];
47
+ export declare function shownChange(runtime: Runtime, entries: readonly ListedEntry[]): RoomsChange;
44
48
  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
49
  export declare function heldRooms({ store }: Runtime, listed: readonly DiscoveredRoom[]): Promise<HeldRoom[]>;
51
50
  export declare function name(runtime: Runtime, locator: string): Promise<void>;
52
51
  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":"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"}
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,22 @@ 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()])];
28
+ }
29
+ export function listedOrHeld({ presence }, held, locator) {
30
+ return presence.room(locator) !== undefined || held.has(locator);
25
31
  }
26
32
  function selectionModel({ socket, builtIn }) {
27
33
  return socket.session.now().refusal?.code === 'revoked-authorization'
@@ -33,7 +39,7 @@ function listedRoom(runtime, locator, stored) {
33
39
  if (declaration === undefined)
34
40
  return undefined;
35
41
  const { room, available } = declaration;
36
- const selection = room.typedSelection ?? null;
42
+ const selection = room.typedSelection;
37
43
  return {
38
44
  name: room.name,
39
45
  locator,
@@ -45,9 +51,10 @@ function listedRoom(runtime, locator, stored) {
45
51
  ? null
46
52
  : { roots: selection.roots, model: modelTypes(selectionModel(runtime)) },
47
53
  providerOwnedPaths: room.providerOwnedPaths,
54
+ authoredPaths: room.authoredPaths,
48
55
  roomVersion: stored?.record.roomVersion ?? null,
49
56
  synchronizationAvailable: available,
50
- refusal: runtime.socket.rooms.standing(locator).refusal,
57
+ refusal: runtime.presence.refusal(locator),
51
58
  documents: stored?.documents ?? 0,
52
59
  };
53
60
  }
@@ -60,31 +67,27 @@ function listingOf(runtime, held) {
60
67
  }
61
68
  return listing;
62
69
  }
63
- export async function patchedListing(runtime, changed) {
70
+ export async function listedEntries(runtime, touched) {
64
71
  const { store } = runtime;
65
- const { roomsShown } = store.device.now();
66
- if (roomsShown === null)
72
+ if (store.roomsShown.now() === null)
67
73
  return null;
68
- const held = await store.rooms([...changed]);
69
- const listing = new Map(roomsShown);
70
- for (const locator of changed) {
71
- const room = store.fences.has(locator)
72
- ? undefined
73
- : listedRoom(runtime, locator, held.get(locator));
74
- if (room === undefined || !listing.has(locator))
74
+ if (touched.length === 0)
75
+ return [];
76
+ const held = await store.rooms(touched);
77
+ const entries = [];
78
+ for (const locator of touched) {
79
+ const room = listedRoom(runtime, locator, held.get(locator));
80
+ if (room === undefined || store.roomsShown.now()?.has(locator) !== true)
75
81
  return null;
76
- listing.set(locator, room);
82
+ entries.push(room);
77
83
  }
78
- return listing;
84
+ return entries;
79
85
  }
80
86
  export async function listingNow(runtime) {
81
87
  return listingOf(runtime, await runtime.store.rooms());
82
88
  }
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)
89
+ function shownRoom({ presence }, { documents, ...room }) {
90
+ return presence.lockedAs(room.locator, room.replica.offline)
88
91
  ? {
89
92
  ...room,
90
93
  model: modelTypes(NO_MODEL),
@@ -92,7 +95,17 @@ export function shownRooms(runtime, listing) {
92
95
  documents: 0,
93
96
  locked: true,
94
97
  }
95
- : { ...room, documents, locked: false }));
98
+ : { ...room, documents, locked: false };
99
+ }
100
+ export function shownRooms(runtime, listing) {
101
+ return structuredClone([...listing.values()].map((entry) => shownRoom(runtime, entry)));
102
+ }
103
+ export function shownChange(runtime, entries) {
104
+ return {
105
+ changed: structuredClone(entries.map((entry) => [entry.locator, shownRoom(runtime, entry)])),
106
+ removed: [],
107
+ order: null,
108
+ };
96
109
  }
97
110
  export async function roomFacts(runtime, reach = null) {
98
111
  const { store, socket, builtIn } = runtime;
@@ -113,43 +126,6 @@ export async function roomFacts(runtime, reach = null) {
113
126
  });
114
127
  return { listed: socket.session.now().roomsListed, rooms };
115
128
  }
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
129
  export async function heldRooms({ store }, listed) {
154
130
  const stored = await store.rooms(listed.map((room) => room.locator));
155
131
  return listed.flatMap((room) => {
@@ -159,14 +135,14 @@ export async function heldRooms({ store }, listed) {
159
135
  ? [{ locator: room.locator, roomVersion: null }]
160
136
  : [];
161
137
  }
162
- if (record.replica.selection !== room.replica.selection)
138
+ if (record.declaration.replica.selection !== room.replica.selection)
163
139
  return [];
164
140
  return [{ locator: room.locator, roomVersion: record.roomVersion }];
165
141
  });
166
142
  }
167
143
  export async function name(runtime, locator) {
168
- const { socket } = runtime;
169
- const room = socket.rooms.discovered(locator);
144
+ const { socket, presence } = runtime;
145
+ const room = presence.room(locator);
170
146
  if (!socket.streamed || room === undefined || !socket.isOpen() || !socket.isHanded())
171
147
  return;
172
148
  const [held] = await heldRooms(runtime, [room]);
package/dist/live.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { ChangeSet } from './change-set.js';
2
2
  import { type KeyedResult, type QueryMessage } from './observation.js';
3
- import type { PendingResult, Plan, QueryCoverage } from './query.js';
3
+ import type { PendingResult, PendingRoom, Plan, QueryCoverage } from './query.js';
4
4
  import type { Fail } from './reach.js';
5
5
  import type { QueryRoom } from './tables.js';
6
6
  export type Cover = {
@@ -11,13 +11,15 @@ export type Ran = KeyedResult & {
11
11
  readonly current: () => boolean;
12
12
  };
13
13
  export type Run = (plan: Plan, cover: () => Promise<Cover>) => Promise<Ran>;
14
+ export type PendingAt<H> = (held: H, rooms: readonly string[]) => ReadonlyMap<string, PendingRoom | null> | null;
14
15
  type Listener = (message: QueryMessage) => void;
15
16
  export type LiveQueries<H> = {
16
17
  touched(set: ChangeSet): void;
17
- recover(): void;
18
- watch(plan: Plan, identity: string, cover: (held: H) => Cover, deliver: Listener, failed: Fail): () => void;
18
+ recover(locators?: readonly string[]): void;
19
+ watch(plan: Plan, identity: string, cover: (held: H) => Cover, pendingAt: PendingAt<H>, deliver: Listener, failed: Fail): () => void;
19
20
  close(): void;
20
21
  };
22
+ export declare function readerOf(plan: Plan): (locator: string) => boolean;
21
23
  export declare function createLiveQueries<H>(run: Run, holding: () => Promise<H>): LiveQueries<H>;
22
24
  export {};
23
25
  //# sourceMappingURL=live.d.ts.map
@@ -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,CA0HxF"}
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,EAQL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAClF,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,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CACzB,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,SAAS,MAAM,EAAE,KACrB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAEpD,KAAK,QAAQ,GAAG,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;AAiBhD,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC5C,KAAK,CACH,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,EACzB,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,EACvB,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,IAAI,GACX,MAAM,IAAI,CAAC;IACd,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAWF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAQjE;AAeD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CA4JxF"}
package/dist/live.js CHANGED
@@ -1,26 +1,25 @@
1
- import { changeOf, digestOf, } from './observation.js';
2
- import { roomOfKey } from './rows.js';
1
+ import { changeOf, digestOf, keyedAt, keyedInto, samePending, unchanged, } from './observation.js';
2
+ import { uncaught } from './failure.js';
3
+ import { roomsOfReach } from './rows.js';
3
4
  function narrowed(plan) {
4
5
  return (plan.paths !== null &&
5
6
  plan.hop === null &&
6
7
  plan.backlinks === null &&
7
8
  !(plan.shape.kind === 'documents' && plan.shape.backlinks));
8
9
  }
9
- function reads(plan, locator) {
10
- if (plan.locked.includes(locator))
11
- return false;
12
- if (plan.rooms !== null && !plan.rooms.includes(locator))
13
- return false;
14
- if (plan.reach === null)
15
- return true;
16
- return (plan.reach.rooms.includes(locator) ||
17
- plan.reach.documents.some((document) => roomOfKey(document) === locator));
10
+ export function readerOf(plan) {
11
+ const locked = new Set(plan.locked);
12
+ const named = plan.rooms === null ? null : new Set(plan.rooms);
13
+ const reached = plan.reach === null ? null : roomsOfReach(plan.reach);
14
+ return (locator) => !locked.has(locator) &&
15
+ (named === null || named.has(locator)) &&
16
+ (reached === null || reached.has(locator));
18
17
  }
19
- function affected(plan, set) {
20
- if (set.rooms.some((locator) => reads(plan, locator)))
18
+ function affected({ plan, reads }, set) {
19
+ if (set.rooms.some(reads))
21
20
  return true;
22
21
  const paths = narrowed(plan) ? new Set(plan.paths) : null;
23
- return set.documents.some(({ locator, path }) => reads(plan, locator) && (paths === null || path === null || paths.has(path)));
22
+ return set.documents.some(({ locator, path }) => reads(locator) && (paths === null || path === null || paths.has(path)));
24
23
  }
25
24
  function shown(entry, held) {
26
25
  const cover = entry.cover(held);
@@ -29,11 +28,13 @@ function shown(entry, held) {
29
28
  export function createLiveQueries(run, holding) {
30
29
  const entries = new Map();
31
30
  let closed = false;
32
- let recovering = false;
33
- let recoverAgain = false;
31
+ let recoveringNow = false;
32
+ let recoveringAll = false;
33
+ const recovering = new Set();
34
34
  function deliver(entry, next) {
35
35
  const previous = entry.digest;
36
36
  entry.digest = digestOf(next);
37
+ entry.pending = 'pending' in entry.digest ? entry.digest.pending : null;
37
38
  entry.covered = JSON.stringify('pending' in next.result ? next.result : next.result.coverage);
38
39
  const change = previous === undefined ? null : changeOf(previous, next);
39
40
  if (change !== null) {
@@ -86,57 +87,99 @@ export function createLiveQueries(run, holding) {
86
87
  }
87
88
  })();
88
89
  }
89
- function recovered() {
90
- if (recovering) {
91
- recoverAgain = true;
92
- return;
90
+ function pendingMoved(entry, held, rooms) {
91
+ const { pending } = entry;
92
+ if (pending === null || pending.size === 0 || entry.running || entry.fresh.size > 0) {
93
+ return false;
93
94
  }
94
- recovering = true;
95
+ const at = entry.pendingAt(held, rooms);
96
+ const change = at === null ? null : keyedAt(pending, at, samePending);
97
+ if (change === null || change.removed.length === pending.size)
98
+ return false;
99
+ keyedInto(pending, change);
100
+ entry.covered = '';
101
+ if (unchanged(change))
102
+ return true;
103
+ for (const listener of entry.ready)
104
+ listener({ pending: change });
105
+ return true;
106
+ }
107
+ function recovered(locators) {
108
+ if (locators === undefined)
109
+ recoveringAll = true;
110
+ else
111
+ for (const locator of locators)
112
+ recovering.add(locator);
113
+ if (recoveringNow)
114
+ return;
115
+ recoveringNow = true;
95
116
  void (async () => {
96
117
  try {
97
- do {
98
- recoverAgain = false;
99
- for (const entry of entries.values()) {
118
+ while ((recoveringAll || recovering.size > 0) && !closed) {
119
+ const all = recoveringAll;
120
+ const touched = [...recovering];
121
+ recoveringAll = false;
122
+ recovering.clear();
123
+ const reached = [...entries.values()].filter((entry) => all || touched.some(entry.reads));
124
+ for (const entry of reached) {
100
125
  if (entry.running)
101
126
  entry.dirty = true;
102
127
  }
103
- const waiting = [...entries.values()].filter((entry) => !entry.running);
104
- if (waiting.length === 0 || closed)
128
+ const waiting = reached.filter((entry) => !entry.running);
129
+ if (waiting.length === 0)
105
130
  continue;
106
131
  const held = await holding();
107
132
  for (const entry of waiting) {
108
133
  if (entry.running)
109
134
  continue;
135
+ const read = all ? [] : touched.filter(entry.reads);
136
+ if (read.length > 0 && pendingMoved(entry, held, read))
137
+ continue;
110
138
  if (entry.digest === undefined || shown(entry, held) !== entry.covered)
111
139
  schedule(entry);
112
140
  }
113
- } while (recoverAgain && !closed);
141
+ }
114
142
  }
115
- catch {
143
+ catch (error) {
144
+ uncaught(error);
116
145
  }
117
146
  finally {
118
- recovering = false;
147
+ recoveringNow = false;
119
148
  }
120
149
  })();
121
150
  }
122
151
  return {
123
152
  touched(set) {
153
+ const pending = new Set();
124
154
  for (const entry of entries.values()) {
125
- if (affected(entry.plan, set))
155
+ if (!affected(entry, set))
156
+ continue;
157
+ if (entry.pending === null || entry.running) {
126
158
  schedule(entry);
159
+ continue;
160
+ }
161
+ for (const locator of set.rooms)
162
+ pending.add(locator);
163
+ for (const { locator } of set.documents)
164
+ pending.add(locator);
127
165
  }
166
+ if (pending.size > 0)
167
+ recovered([...pending]);
128
168
  },
129
169
  recover: recovered,
130
- watch(plan, identity, cover, listener, failed) {
170
+ watch(plan, identity, cover, pendingAt, listener, failed) {
131
171
  let entry = entries.get(identity);
132
172
  if (entry === undefined) {
133
173
  entry = {
134
174
  plan,
175
+ reads: readerOf(plan),
135
176
  cover,
177
+ pendingAt,
136
178
  listeners: new Set(),
137
179
  fresh: new Map(),
138
180
  ready: new Set(),
139
181
  digest: undefined,
182
+ pending: null,
140
183
  covered: '',
141
184
  dirty: false,
142
185
  running: false,
@@ -0,0 +1,5 @@
1
+ import type { BuildFile } from './client.js';
2
+ export declare function parsed(file: Blob | null): Promise<unknown>;
3
+ export declare function perBuild<T>(buildFile: BuildFile, key: string, make: () => Promise<T>): Promise<T>;
4
+ export declare function loaded<T>(buildFile: BuildFile, name: string, read?: (file: Blob | null) => Promise<unknown>): Promise<T | null>;
5
+ //# sourceMappingURL=loaded.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loaded.d.ts","sourceRoot":"","sources":["../src/loaded.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAc7C,wBAAsB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAYjG;AAED,wBAAgB,MAAM,CAAC,CAAC,EACtB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,OAAO,CAAC,OAAO,CAAY,GACvD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAEnB"}
package/dist/loaded.js ADDED
@@ -0,0 +1,40 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ const holdings = new WeakMap();
10
+ async function imported(file) {
11
+ if (file === null)
12
+ return null;
13
+ const address = URL.createObjectURL(file);
14
+ try {
15
+ return await import(__rewriteRelativeImportExtension(address));
16
+ }
17
+ finally {
18
+ URL.revokeObjectURL(address);
19
+ }
20
+ }
21
+ export async function parsed(file) {
22
+ return file === null ? null : JSON.parse(await file.text());
23
+ }
24
+ export function perBuild(buildFile, key, make) {
25
+ let named = holdings.get(buildFile);
26
+ if (named === undefined) {
27
+ named = new Map();
28
+ holdings.set(buildFile, named);
29
+ }
30
+ const holding = named.get(key);
31
+ if (holding !== undefined)
32
+ return holding;
33
+ const making = make();
34
+ named.set(key, making);
35
+ making.catch(() => named.delete(key));
36
+ return making;
37
+ }
38
+ export function loaded(buildFile, name, read = imported) {
39
+ return perBuild(buildFile, name, () => buildFile(name).then(read));
40
+ }
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
@@ -1 +1 @@
1
- {"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../src/locks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAa5C,wBAAsB,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAK1F;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAW9E;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,iBAMzE;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,cAAc,EAAE,QAOlF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QAa9C;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAE7E"}
1
+ {"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../src/locks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,wBAAsB,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5F;AAED,wBAAsB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAG1F;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,iBAKzE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QAU9C;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAE7E"}
package/dist/locks.js CHANGED
@@ -1,59 +1,30 @@
1
+ import { uncaught } from './failure.js';
1
2
  import { emitRooms, LOCKS_TOPIC } from './shown.js';
2
- async function offlineModes({ store, socket }) {
3
- const modes = new Map();
4
- for (const [locator, { room }] of socket.rooms.declarations()) {
5
- const declaration = room ?? socket.rooms.discovered(locator);
6
- if (declaration !== undefined)
7
- modes.set(locator, declaration.replica.offline);
8
- }
9
- for (const [locator, { offline }] of (await store.covering()).rooms)
10
- modes.set(locator, offline);
11
- return modes;
3
+ export async function locked({ store, presence }, locator) {
4
+ return presence.locked(locator, async () => (await store.open()).offline(locator));
12
5
  }
13
- export async function locked({ store, socket }, locator) {
14
- if (store.fences.has(locator) || socket.rooms.standing(locator).confirmed)
15
- return false;
16
- const held = socket.rooms.declared(locator)?.room ?? socket.rooms.discovered(locator);
17
- const mode = (await (await store.open()).offline(locator)) ?? held?.replica.offline;
18
- return mode === 'locked';
19
- }
20
- export async function lockedRooms(runtime) {
21
- const { store, socket } = runtime;
22
- return [...(await offlineModes(runtime))]
23
- .filter(([locator, mode]) => mode === 'locked' &&
24
- !socket.rooms.standing(locator).confirmed &&
25
- !store.fences.has(locator))
26
- .map(([locator]) => locator)
27
- .sort();
6
+ export async function lockedRooms({ store, presence }) {
7
+ const { rooms, locking } = await store.covering();
8
+ return presence.lockedAmong(rooms, locking);
28
9
  }
29
10
  export async function relocked(runtime, before) {
30
11
  const after = await lockedRooms(runtime);
31
12
  if (JSON.stringify(after) === JSON.stringify(before))
32
13
  return;
33
- runtime.journal.record(`locked ${after.length}`);
34
14
  emitRooms(runtime);
35
15
  runtime.store.tell(LOCKS_TOPIC, undefined);
36
16
  }
37
- export function confirmLocks({ socket }, listed) {
38
- if (!socket.isOpen())
39
- return;
40
- for (const room of listed) {
41
- if (room.replica.admission === 'admitted') {
42
- socket.rooms.stand(room.locator, { confirmed: true });
43
- }
44
- }
45
- }
46
17
  export function connectionLost(runtime) {
47
- const { socket } = runtime;
18
+ const { socket, presence } = runtime;
48
19
  if (socket.closed())
49
20
  return;
50
- socket.rooms.connectionLost(() => {
21
+ presence.connectionLost(() => {
51
22
  if (socket.isOpen() || socket.closed())
52
23
  return;
53
24
  void lockedRooms(runtime).then((before) => {
54
- socket.rooms.standAll({ confirmed: false });
25
+ presence.lapse();
55
26
  return relocked(runtime, before);
56
- }, () => { });
27
+ }, uncaught);
57
28
  });
58
29
  }
59
30
  export function watchLocks({ store }, notify) {
@@ -1 +1 @@
1
- {"version":3,"file":"lost.d.ts","sourceRoot":"","sources":["../src/lost.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAU5C,wBAAsB,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,iBAIhF;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,QAOtE;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,iBAqC5E"}
1
+ {"version":3,"file":"lost.d.ts","sourceRoot":"","sources":["../src/lost.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAK5C,wBAAsB,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,iBAIhF;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,QAMtE;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,iBA+B5E"}