@agentshouse/mdruntime 0.1.0-c0136de3edfbe → 0.1.0-c014edb0e9d9b
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.
- package/README.md +8 -8
- package/dist/acceptance.d.ts +0 -3
- package/dist/acceptance.d.ts.map +1 -1
- package/dist/acceptance.js +74 -145
- package/dist/act-lanes.d.ts +33 -0
- package/dist/act-lanes.d.ts.map +1 -0
- package/dist/act-lanes.js +177 -0
- package/dist/actions.d.ts +7 -2
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +44 -31
- package/dist/adapter.d.ts +30 -44
- package/dist/adapter.d.ts.map +1 -1
- package/dist/bootstrap.d.ts +1 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +6 -18
- package/dist/change-set.d.ts +4 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +6 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +4 -2
- package/dist/chat-types.d.ts +2 -0
- package/dist/chat-types.d.ts.map +1 -1
- package/dist/chat-types.js +11 -0
- package/dist/client.d.ts +9 -12
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +29 -14
- package/dist/collection.d.ts +22 -4
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +12 -2
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +15 -21
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +30 -17
- package/dist/conversation-live.d.ts +138 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +249 -0
- package/dist/conversation-row.d.ts.map +1 -1
- package/dist/conversation-row.js +7 -1
- package/dist/conversation.d.ts +44 -44
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +904 -1024
- package/dist/declaration.d.ts +10 -0
- package/dist/declaration.d.ts.map +1 -0
- package/dist/declaration.js +24 -0
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +18 -40
- package/dist/durability.d.ts +12 -0
- package/dist/durability.d.ts.map +1 -1
- package/dist/expectation.d.ts +4 -2
- package/dist/expectation.d.ts.map +1 -1
- package/dist/expectation.js +33 -11
- package/dist/failure.d.ts +3 -0
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +6 -0
- package/dist/figures.d.ts +1 -0
- package/dist/figures.d.ts.map +1 -1
- package/dist/figures.js +2 -2
- package/dist/holdings.d.ts +29 -0
- package/dist/holdings.d.ts.map +1 -0
- package/dist/holdings.js +95 -0
- package/dist/host.d.ts +17 -2
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +38 -8
- package/dist/index.d.ts +13 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -3
- package/dist/install.d.ts +1 -3
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +49 -70
- package/dist/lifecycle.d.ts +1 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +42 -30
- package/dist/listing.d.ts +6 -11
- package/dist/listing.d.ts.map +1 -1
- package/dist/listing.js +25 -61
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +3 -3
- package/dist/locks.d.ts +2 -4
- package/dist/locks.d.ts.map +1 -1
- package/dist/locks.js +10 -38
- package/dist/lost.d.ts.map +1 -1
- package/dist/lost.js +10 -21
- package/dist/media.d.ts +1 -1
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +4 -4
- package/dist/memory.d.ts +4 -2
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +38 -20
- package/dist/messages.d.ts +1 -4
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +14 -32
- package/dist/model.d.ts +0 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -5
- package/dist/models.d.ts +4 -8
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +97 -134
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +12 -17
- package/dist/opened.d.ts +1 -1
- package/dist/opened.d.ts.map +1 -1
- package/dist/opened.js +5 -5
- package/dist/opening.d.ts.map +1 -1
- package/dist/opening.js +8 -5
- package/dist/outcome.d.ts +6 -1
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +15 -0
- package/dist/overlay.d.ts +2 -1
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +32 -21
- package/dist/page-metadata.d.ts +8 -0
- package/dist/page-metadata.d.ts.map +1 -0
- package/dist/page-metadata.js +19 -0
- package/dist/parts.d.ts +3 -51
- package/dist/parts.d.ts.map +1 -1
- package/dist/parts.js +14 -111
- package/dist/paths.d.ts +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +22 -0
- package/dist/preparation.d.ts.map +1 -1
- package/dist/preparation.js +22 -15
- package/dist/presence.d.ts +52 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +220 -0
- package/dist/queries.d.ts +1 -1
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +5 -7
- package/dist/query.d.ts +0 -1
- package/dist/query.d.ts.map +1 -1
- package/dist/questions.d.ts +2 -0
- package/dist/questions.d.ts.map +1 -1
- package/dist/questions.js +5 -1
- package/dist/queue.d.ts +40 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +455 -0
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +28 -9
- package/dist/react.d.ts +15 -0
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +15 -1
- package/dist/readiness.d.ts +0 -1
- package/dist/readiness.d.ts.map +1 -1
- package/dist/reads.d.ts +4 -1
- package/dist/reads.d.ts.map +1 -1
- package/dist/reads.js +47 -5
- package/dist/refresh.js +2 -2
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +5 -4
- package/dist/replica.d.ts +5 -10
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +15 -16
- package/dist/retried.d.ts +30 -0
- package/dist/retried.d.ts.map +1 -0
- package/dist/retried.js +72 -0
- package/dist/room-draft.d.ts +4 -6
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +36 -52
- package/dist/room-drafts.d.ts.map +1 -1
- package/dist/room-drafts.js +17 -16
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +3 -4
- package/dist/runtime.d.ts +11 -17
- package/dist/runtime.d.ts.map +1 -1
- package/dist/save.d.ts +41 -86
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +232 -112
- package/dist/saves.d.ts +2 -40
- package/dist/saves.d.ts.map +1 -1
- package/dist/saves.js +107 -698
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +2 -3
- package/dist/shared.d.ts +1 -6
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +13 -95
- package/dist/shown.d.ts +4 -3
- package/dist/shown.d.ts.map +1 -1
- package/dist/shown.js +29 -33
- package/dist/socket/lanes.d.ts +2 -1
- package/dist/socket/lanes.d.ts.map +1 -1
- package/dist/socket/lanes.js +5 -2
- package/dist/socket/session.d.ts +0 -1
- package/dist/socket/session.d.ts.map +1 -1
- package/dist/socket.d.ts +2 -4
- package/dist/socket.d.ts.map +1 -1
- package/dist/socket.js +4 -8
- package/dist/source.d.ts.map +1 -1
- package/dist/source.js +5 -4
- package/dist/store/records.d.ts +4 -4
- package/dist/store/records.d.ts.map +1 -1
- package/dist/store/records.js +33 -11
- package/dist/store/space.d.ts +1 -1
- package/dist/store/space.d.ts.map +1 -1
- package/dist/store/space.js +0 -2
- package/dist/store/watchers.js +1 -2
- package/dist/store.d.ts +11 -6
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +38 -13
- package/dist/stored.d.ts +1 -1
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +22 -10
- package/dist/surface.d.ts +4 -2
- package/dist/surface.d.ts.map +1 -1
- package/dist/surface.js +20 -14
- package/dist/sync.d.ts +0 -1
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +91 -82
- package/dist/tables.d.ts +13 -8
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +25 -12
- package/dist/tallies.js +5 -5
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +2 -2
- package/dist/wire.d.ts +41 -4
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +13 -3
- package/package.json +3 -2
- package/dist/attempt.d.ts +0 -16
- package/dist/attempt.d.ts.map +0 -1
- package/dist/attempt.js +0 -70
- package/dist/job.d.ts +0 -33
- package/dist/job.d.ts.map +0 -1
- package/dist/job.js +0 -54
- package/dist/socket/rooms.d.ts +0 -43
- package/dist/socket/rooms.d.ts.map +0 -1
- package/dist/socket/rooms.js +0 -90
- package/dist/store/fences.d.ts +0 -16
- package/dist/store/fences.d.ts.map +0 -1
- package/dist/store/fences.js +0 -26
package/dist/lifecycle.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { catchUpConversations, receiveConversationEvent, reconcileConversations, } from './conversation.js';
|
|
2
|
+
import { declared } from './declaration.js';
|
|
3
|
+
import { uncaught } from './failure.js';
|
|
2
4
|
import { catching, replaced } from './install.js';
|
|
3
5
|
import { connectionLost } from './locks.js';
|
|
4
6
|
import { fenceLive } from './lost.js';
|
|
5
7
|
import { cachedModels, revoked, settleModels } from './models.js';
|
|
6
8
|
import { refuse } from './refusal.js';
|
|
7
|
-
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';
|
|
8
10
|
import { applyRoom, changeAuthority, countAuthorityChange, finishOpening, loadRoom, OPENING_LANE, reload, resynchronize, sync, } from './sync.js';
|
|
9
11
|
const CONVERSATION_LANE = 'conversations';
|
|
12
|
+
const RELOADING = 'reloading';
|
|
10
13
|
function closing(runtime, opened) {
|
|
11
14
|
const { store, socket } = runtime;
|
|
12
15
|
return socket.lanes.task(OPENING_LANE, async (live) => {
|
|
@@ -19,10 +22,10 @@ function closing(runtime, opened) {
|
|
|
19
22
|
});
|
|
20
23
|
}
|
|
21
24
|
function closedSocket(runtime, lapsed, lost, opened) {
|
|
22
|
-
const { socket, conversations } = runtime;
|
|
25
|
+
const { socket, presence, conversations } = runtime;
|
|
23
26
|
const { session } = socket;
|
|
24
27
|
socket.notifyReady();
|
|
25
|
-
|
|
28
|
+
presence.stopAsking();
|
|
26
29
|
connectionLost(runtime);
|
|
27
30
|
if (lost)
|
|
28
31
|
conversations.lost();
|
|
@@ -42,9 +45,9 @@ function closedSocket(runtime, lapsed, lost, opened) {
|
|
|
42
45
|
void closing(runtime, opened);
|
|
43
46
|
}
|
|
44
47
|
function owedReloads(runtime, expired, held) {
|
|
45
|
-
const { store,
|
|
46
|
-
const reloading =
|
|
47
|
-
.
|
|
48
|
+
const { store, presence } = runtime;
|
|
49
|
+
const reloading = presence
|
|
50
|
+
.rooms()
|
|
48
51
|
.filter((room) => !expired.includes(room.locator) && revoked(held.get(room.locator)?.record.model))
|
|
49
52
|
.map((room) => room.locator);
|
|
50
53
|
for (const locator of reloading)
|
|
@@ -53,15 +56,15 @@ function owedReloads(runtime, expired, held) {
|
|
|
53
56
|
return reloading;
|
|
54
57
|
}
|
|
55
58
|
async function reloadNow(runtime, replacing, progress, held, installing) {
|
|
56
|
-
const { store, socket } = runtime;
|
|
57
|
-
const {
|
|
58
|
-
const discovered = rooms
|
|
59
|
+
const { store, socket, presence } = runtime;
|
|
60
|
+
const { lanes } = socket;
|
|
61
|
+
const discovered = presence.rooms();
|
|
59
62
|
const reloaded = discovered.filter((room) => held.has(room.locator) && !installing.has(room.locator) && replacing(room));
|
|
60
63
|
const acquired = discovered.filter((room) => (!held.has(room.locator) || installing.has(room.locator)) &&
|
|
61
64
|
room.replica.admission === 'admitted' &&
|
|
62
65
|
replacing(room));
|
|
63
66
|
for (const room of reloaded)
|
|
64
|
-
|
|
67
|
+
presence.reload(room.locator, true);
|
|
65
68
|
try {
|
|
66
69
|
const local = await store.open();
|
|
67
70
|
const kept = acquired.length === 0 ? new Set() : (await local.held()).staged;
|
|
@@ -76,15 +79,17 @@ async function reloadNow(runtime, replacing, progress, held, installing) {
|
|
|
76
79
|
.roomTask(room.locator, (live) => loadRoom(runtime, room, local, progress, live, unheld))
|
|
77
80
|
.then(() => rest(runtime, progress));
|
|
78
81
|
}
|
|
82
|
+
runtime.retries.succeeded('download', RELOADING);
|
|
79
83
|
}
|
|
80
|
-
catch {
|
|
84
|
+
catch (error) {
|
|
85
|
+
runtime.retries.failed('download', RELOADING, error);
|
|
81
86
|
for (const room of reloaded)
|
|
82
|
-
|
|
87
|
+
presence.reload(room.locator, false);
|
|
83
88
|
progress.reachable = false;
|
|
84
89
|
}
|
|
85
90
|
}
|
|
86
91
|
function caughtUpRooms(runtime, expired) {
|
|
87
|
-
const { store, socket } = runtime;
|
|
92
|
+
const { store, socket, presence } = runtime;
|
|
88
93
|
const { session } = socket;
|
|
89
94
|
const progress = session.now().underway;
|
|
90
95
|
session.set({ underway: null });
|
|
@@ -111,14 +116,17 @@ function caughtUpRooms(runtime, expired) {
|
|
|
111
116
|
if (progress.reachable) {
|
|
112
117
|
const stored = await held;
|
|
113
118
|
const owed = await reloading;
|
|
114
|
-
await settleModels(runtime,
|
|
115
|
-
.
|
|
119
|
+
await settleModels(runtime, new Map(presence
|
|
120
|
+
.rooms()
|
|
116
121
|
.filter((room) => stored.has(room.locator) &&
|
|
117
122
|
!expired.includes(room.locator) &&
|
|
118
|
-
!owed.includes(room.locator))
|
|
123
|
+
!owed.includes(room.locator))
|
|
124
|
+
.map((room) => [room.locator, declared(room)])), 'current', local);
|
|
119
125
|
}
|
|
126
|
+
runtime.retries.succeeded('download', OPENING_LANE);
|
|
120
127
|
}
|
|
121
|
-
catch {
|
|
128
|
+
catch (error) {
|
|
129
|
+
runtime.retries.failed('download', OPENING_LANE, error);
|
|
122
130
|
progress.complete = false;
|
|
123
131
|
progress.reachable = false;
|
|
124
132
|
}
|
|
@@ -144,7 +152,7 @@ function signalled(runtime, mode) {
|
|
|
144
152
|
store.tell(SERVICE_MODE_TOPIC, mode);
|
|
145
153
|
}
|
|
146
154
|
if (releasing)
|
|
147
|
-
|
|
155
|
+
void submissionDue(runtime);
|
|
148
156
|
}
|
|
149
157
|
async function runCurrency(runtime, live) {
|
|
150
158
|
const { socket, conversations } = runtime;
|
|
@@ -153,7 +161,7 @@ async function runCurrency(runtime, live) {
|
|
|
153
161
|
session.set({ currencyQueued: null });
|
|
154
162
|
if (!live())
|
|
155
163
|
return;
|
|
156
|
-
await conversations
|
|
164
|
+
await reconcileConversations(conversations);
|
|
157
165
|
if (conversations.current()) {
|
|
158
166
|
show(runtime);
|
|
159
167
|
return;
|
|
@@ -164,9 +172,11 @@ async function runCurrency(runtime, live) {
|
|
|
164
172
|
};
|
|
165
173
|
moveTo(runtime, transferring(runtime));
|
|
166
174
|
try {
|
|
167
|
-
await conversations
|
|
175
|
+
await catchUpConversations(conversations, progress);
|
|
176
|
+
runtime.retries.succeeded('conversations', CONVERSATION_LANE);
|
|
168
177
|
}
|
|
169
|
-
catch {
|
|
178
|
+
catch (error) {
|
|
179
|
+
runtime.retries.failed('conversations', CONVERSATION_LANE, error);
|
|
170
180
|
progress.reachable = false;
|
|
171
181
|
}
|
|
172
182
|
await rest(runtime, progress, live);
|
|
@@ -181,7 +191,7 @@ export function scheduleCurrency(runtime) {
|
|
|
181
191
|
}
|
|
182
192
|
export function spaceFreed(runtime) {
|
|
183
193
|
const { store, socket, journal } = runtime;
|
|
184
|
-
|
|
194
|
+
store.prepareAgain();
|
|
185
195
|
journal.record('space freed');
|
|
186
196
|
store.readiness.queue();
|
|
187
197
|
const { closed, authorization } = socket.session.now();
|
|
@@ -192,10 +202,11 @@ export function spaceFreed(runtime) {
|
|
|
192
202
|
else
|
|
193
203
|
void resynchronize(runtime);
|
|
194
204
|
}
|
|
195
|
-
export function close({ store, socket, conversations, recovery, liveQueries, figures }) {
|
|
205
|
+
export function close({ store, socket, presence, conversations, recovery, liveQueries, figures, }) {
|
|
196
206
|
if (socket.closed())
|
|
197
207
|
return;
|
|
198
208
|
socket.close();
|
|
209
|
+
presence.close();
|
|
199
210
|
conversations.close();
|
|
200
211
|
void recovery.retire();
|
|
201
212
|
liveQueries.close();
|
|
@@ -203,9 +214,9 @@ export function close({ store, socket, conversations, recovery, liveQueries, fig
|
|
|
203
214
|
store.close();
|
|
204
215
|
}
|
|
205
216
|
export async function stop(runtime) {
|
|
206
|
-
const { store, socket, recovery } = runtime;
|
|
217
|
+
const { store, socket, presence, recovery } = runtime;
|
|
207
218
|
socket.session.set({ stopping: true });
|
|
208
|
-
|
|
219
|
+
presence.stopAsking();
|
|
209
220
|
socket.stopReads();
|
|
210
221
|
await recovery.retire();
|
|
211
222
|
await socket.lanes.finished();
|
|
@@ -213,13 +224,13 @@ export async function stop(runtime) {
|
|
|
213
224
|
close(runtime);
|
|
214
225
|
}
|
|
215
226
|
export function start(runtime, signal) {
|
|
216
|
-
const { store, socket, conversations, lastAnswers, recovery } = runtime;
|
|
227
|
+
const { store, socket, presence, conversations, lastAnswers, recovery } = runtime;
|
|
217
228
|
const closeRuntime = () => close(runtime);
|
|
218
229
|
socket.observeServiceMode((mode) => signalled(runtime, mode));
|
|
219
230
|
socket.observeConversations((event) => {
|
|
220
231
|
if (event.kind === 'list' || event.kind === 'listed' || event.kind === 'unlisted')
|
|
221
232
|
store.readiness.queue();
|
|
222
|
-
conversations
|
|
233
|
+
receiveConversationEvent(conversations, event);
|
|
223
234
|
if (event.kind !== 'gap' || conversations.current())
|
|
224
235
|
return;
|
|
225
236
|
show(runtime);
|
|
@@ -230,7 +241,7 @@ export function start(runtime, signal) {
|
|
|
230
241
|
closeRuntime();
|
|
231
242
|
socket.observe((event) => {
|
|
232
243
|
if (event.kind === 'opened') {
|
|
233
|
-
|
|
244
|
+
presence.connectionLive();
|
|
234
245
|
conversations.reopened();
|
|
235
246
|
lastAnswers.reopened();
|
|
236
247
|
recovery.resume();
|
|
@@ -259,8 +270,9 @@ export function start(runtime, signal) {
|
|
|
259
270
|
if ((await local.facts()).capabilities.length > 0)
|
|
260
271
|
socket.readyFromStore();
|
|
261
272
|
})
|
|
262
|
-
.catch(() => {
|
|
273
|
+
.catch((error) => {
|
|
263
274
|
socket.readyFromStore();
|
|
275
|
+
uncaught(error);
|
|
264
276
|
});
|
|
265
277
|
if (!socket.streamed)
|
|
266
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({
|
|
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({
|
|
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(
|
|
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 {};
|
package/dist/listing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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 ??
|
|
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({
|
|
15
|
-
const
|
|
16
|
-
const room = stored?.record ??
|
|
17
|
-
|
|
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({
|
|
20
|
-
const
|
|
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
|
|
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.
|
|
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 =
|
|
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
|
|
84
|
-
|
|
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,42 +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
|
-
},
|
|
129
|
-
available: synchronizationAvailable,
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
export function listHeld({ store, socket }, locator) {
|
|
133
|
-
if (store.fences.has(locator))
|
|
134
|
-
return;
|
|
135
|
-
socket.rooms.declare(locator, { room: null, available: false });
|
|
136
|
-
}
|
|
137
|
-
export function admitted({ socket }, room) {
|
|
138
|
-
return room.replica.admission === 'admitted' && !socket.rooms.standing(room.locator).unreadable;
|
|
139
|
-
}
|
|
140
|
-
export function readable(runtime, room) {
|
|
141
|
-
runtime.socket.rooms.stand(room.locator, { unreadable: false });
|
|
142
|
-
list(runtime, room, true);
|
|
143
|
-
}
|
|
144
|
-
export function usable(runtime, room) {
|
|
145
|
-
const { rooms } = runtime.socket;
|
|
146
|
-
rooms.stand(room.locator, { stale: false, unpreparable: false });
|
|
147
|
-
if (rooms.standing(room.locator).unreadable) {
|
|
148
|
-
rooms.stand(room.locator, { unreadable: false, refusal: null });
|
|
149
|
-
}
|
|
150
|
-
list(runtime, room, true);
|
|
151
|
-
}
|
|
152
116
|
export async function heldRooms({ store }, listed) {
|
|
153
117
|
const stored = await store.rooms(listed.map((room) => room.locator));
|
|
154
118
|
return listed.flatMap((room) => {
|
|
@@ -158,14 +122,14 @@ export async function heldRooms({ store }, listed) {
|
|
|
158
122
|
? [{ locator: room.locator, roomVersion: null }]
|
|
159
123
|
: [];
|
|
160
124
|
}
|
|
161
|
-
if (record.replica.selection !== room.replica.selection)
|
|
125
|
+
if (record.declaration.replica.selection !== room.replica.selection)
|
|
162
126
|
return [];
|
|
163
127
|
return [{ locator: room.locator, roomVersion: record.roomVersion }];
|
|
164
128
|
});
|
|
165
129
|
}
|
|
166
130
|
export async function name(runtime, locator) {
|
|
167
|
-
const { socket } = runtime;
|
|
168
|
-
const room =
|
|
131
|
+
const { socket, presence } = runtime;
|
|
132
|
+
const room = presence.room(locator);
|
|
169
133
|
if (!socket.streamed || room === undefined || !socket.isOpen() || !socket.isHanded())
|
|
170
134
|
return;
|
|
171
135
|
const [held] = await heldRooms(runtime, [room]);
|
package/dist/live.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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,
|
|
4
|
-
export declare function lockedRooms(
|
|
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
|
package/dist/locks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../src/locks.ts"],"names":[],"mappings":"
|
|
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,CAK1F;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,iBAMzE;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,30 +1,11 @@
|
|
|
1
|
+
import { uncaught } from './failure.js';
|
|
1
2
|
import { emitRooms, LOCKS_TOPIC } from './shown.js';
|
|
2
|
-
async function
|
|
3
|
-
|
|
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
|
|
14
|
-
|
|
15
|
-
|
|
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 held = (await store.covering()).rooms;
|
|
8
|
+
return presence.lockedAmong(new Map([...held].map(([locator, { offline }]) => [locator, offline])));
|
|
28
9
|
}
|
|
29
10
|
export async function relocked(runtime, before) {
|
|
30
11
|
const after = await lockedRooms(runtime);
|
|
@@ -34,26 +15,17 @@ export async function relocked(runtime, before) {
|
|
|
34
15
|
emitRooms(runtime);
|
|
35
16
|
runtime.store.tell(LOCKS_TOPIC, undefined);
|
|
36
17
|
}
|
|
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
18
|
export function connectionLost(runtime) {
|
|
47
|
-
const { socket } = runtime;
|
|
19
|
+
const { socket, presence } = runtime;
|
|
48
20
|
if (socket.closed())
|
|
49
21
|
return;
|
|
50
|
-
|
|
22
|
+
presence.connectionLost(() => {
|
|
51
23
|
if (socket.isOpen() || socket.closed())
|
|
52
24
|
return;
|
|
53
25
|
void lockedRooms(runtime).then((before) => {
|
|
54
|
-
|
|
26
|
+
presence.lapse();
|
|
55
27
|
return relocked(runtime, before);
|
|
56
|
-
},
|
|
28
|
+
}, uncaught);
|
|
57
29
|
});
|
|
58
30
|
}
|
|
59
31
|
export function watchLocks({ store }, notify) {
|
package/dist/lost.d.ts.map
CHANGED
|
@@ -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;
|
|
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,QAOtE;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,iBA+B5E"}
|
package/dist/lost.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import { changeSet, mergeChangeSets } from './change-set.js';
|
|
2
|
-
import { ERASE_BATCH
|
|
3
|
-
import {
|
|
2
|
+
import { ERASE_BATCH } from './install.js';
|
|
3
|
+
import { unpair } from './queue.js';
|
|
4
|
+
import { recoverReads } from './shown.js';
|
|
4
5
|
import { yielded } from './turn.js';
|
|
5
|
-
function forget({ store, socket }, locator) {
|
|
6
|
-
forgetInstall(store, locator);
|
|
7
|
-
socket.rooms.forget(locator);
|
|
8
|
-
store.forget(locator);
|
|
9
|
-
}
|
|
10
6
|
export async function eraseFenced({ store }, locators) {
|
|
11
7
|
for (const locator of locators) {
|
|
12
8
|
while (await store.durably((local) => local.erase(locator, ERASE_BATCH)))
|
|
@@ -14,24 +10,18 @@ export async function eraseFenced({ store }, locators) {
|
|
|
14
10
|
}
|
|
15
11
|
}
|
|
16
12
|
export function fenceLive(runtime, locators) {
|
|
17
|
-
const { store, socket, journal } = runtime;
|
|
13
|
+
const { store, socket, presence, journal } = runtime;
|
|
18
14
|
for (const locator of new Set(locators)) {
|
|
19
|
-
if (!
|
|
15
|
+
if (!presence.lose(locator, socket.session.now().discoveries))
|
|
20
16
|
continue;
|
|
21
|
-
forget(
|
|
17
|
+
store.forget(locator);
|
|
22
18
|
journal.record(`room lost ${locator}`);
|
|
23
19
|
}
|
|
24
20
|
}
|
|
25
21
|
export async function loseRooms(runtime, locators) {
|
|
26
|
-
const { store } = runtime;
|
|
22
|
+
const { store, presence } = runtime;
|
|
27
23
|
fenceLive(runtime, locators);
|
|
28
|
-
const fresh = [...new Set(locators)].filter((locator) =>
|
|
29
|
-
const fence = store.fences.of(locator);
|
|
30
|
-
if (fence === undefined || fence.written)
|
|
31
|
-
return false;
|
|
32
|
-
store.fences.mark(locator, true);
|
|
33
|
-
return true;
|
|
34
|
-
});
|
|
24
|
+
const fresh = [...new Set(locators)].filter((locator) => presence.writing(locator));
|
|
35
25
|
if (fresh.length === 0)
|
|
36
26
|
return;
|
|
37
27
|
let held = [];
|
|
@@ -43,7 +33,7 @@ export async function loseRooms(runtime, locators) {
|
|
|
43
33
|
}
|
|
44
34
|
catch (error) {
|
|
45
35
|
for (const locator of fresh)
|
|
46
|
-
|
|
36
|
+
presence.unwritten(locator);
|
|
47
37
|
throw error;
|
|
48
38
|
}
|
|
49
39
|
finally {
|
|
@@ -54,8 +44,7 @@ export async function loseRooms(runtime, locators) {
|
|
|
54
44
|
drafts: held.filter((draft) => draft.locator === locator).map(({ path }) => path),
|
|
55
45
|
}))));
|
|
56
46
|
recoverReads(runtime);
|
|
57
|
-
statusShown(runtime);
|
|
58
47
|
}
|
|
59
|
-
await
|
|
48
|
+
await unpair(runtime);
|
|
60
49
|
await eraseFenced(runtime, fresh);
|
|
61
50
|
}
|
package/dist/media.d.ts
CHANGED
|
@@ -3,6 +3,6 @@ import { type ShownAnswer } from './outcome.js';
|
|
|
3
3
|
export declare const ROOM_MEDIA = "room-media";
|
|
4
4
|
type Show = (room: string, path: string, revision?: string) => Promise<ShownAnswer>;
|
|
5
5
|
export declare function shownBy(show: Show, client: MdRuntimeClient): MdRuntimeClient;
|
|
6
|
-
export declare function defineRoomMedia(client: Promise<MdRuntimeClient> | MdRuntimeClient
|
|
6
|
+
export declare function defineRoomMedia(client: Promise<MdRuntimeClient> | MdRuntimeClient): void;
|
|
7
7
|
export {};
|
|
8
8
|
//# sourceMappingURL=media.d.ts.map
|
package/dist/media.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3D,eAAO,MAAM,UAAU,eAAe,CAAC;AAwBvC,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAIpF,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,GAAG,eAAe,CAG5E;AAsBD,wBAAgB,eAAe,
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3D,eAAO,MAAM,UAAU,eAAe,CAAC;AAwBvC,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAIpF,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,GAAG,eAAe,CAG5E;AAsBD,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,GAAG,IAAI,CA0LxF"}
|
package/dist/media.js
CHANGED
|
@@ -37,8 +37,8 @@ function drawnFor(mediaType) {
|
|
|
37
37
|
return 'audio';
|
|
38
38
|
return null;
|
|
39
39
|
}
|
|
40
|
-
export function defineRoomMedia(client
|
|
41
|
-
if (
|
|
40
|
+
export function defineRoomMedia(client) {
|
|
41
|
+
if (customElements.get(ROOM_MEDIA) !== undefined)
|
|
42
42
|
return;
|
|
43
43
|
const connected = Promise.resolve(client);
|
|
44
44
|
class RoomMedia extends HTMLElement {
|
|
@@ -179,7 +179,7 @@ export function defineRoomMedia(client, registry = customElements) {
|
|
|
179
179
|
if (drawn instanceof HTMLMediaElement) {
|
|
180
180
|
drawn.controls = true;
|
|
181
181
|
drawn.preload = 'metadata';
|
|
182
|
-
if (drawn instanceof HTMLVideoElement)
|
|
182
|
+
if (drawn instanceof HTMLVideoElement && 'playsInline' in drawn)
|
|
183
183
|
drawn.playsInline = true;
|
|
184
184
|
}
|
|
185
185
|
drawn.addEventListener(drawn instanceof HTMLImageElement ? 'load' : 'loadedmetadata', () => {
|
|
@@ -214,5 +214,5 @@ export function defineRoomMedia(client, registry = customElements) {
|
|
|
214
214
|
void this.#load();
|
|
215
215
|
}
|
|
216
216
|
}
|
|
217
|
-
|
|
217
|
+
customElements.define(ROOM_MEDIA, RoomMedia);
|
|
218
218
|
}
|