@agentshouse/mdruntime 0.1.0-cf04ede9fb796 → 0.1.0-cf0c43fc48aad
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 +12 -12
- package/dist/acceptance.d.ts +0 -3
- package/dist/acceptance.d.ts.map +1 -1
- package/dist/acceptance.js +74 -164
- package/dist/act-lanes.d.ts +30 -0
- package/dist/act-lanes.d.ts.map +1 -0
- package/dist/act-lanes.js +225 -0
- package/dist/actions.d.ts +8 -2
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +118 -67
- package/dist/adapter.d.ts +27 -48
- 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 -19
- 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/client.d.ts +9 -18
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +32 -15
- 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 +2 -0
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +31 -24
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +26 -21
- package/dist/conversation-live.d.ts +10 -6
- package/dist/conversation-live.d.ts.map +1 -1
- package/dist/conversation-live.js +8 -6
- package/dist/conversation.d.ts +28 -10
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +194 -141
- 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 +19 -44
- package/dist/durability.d.ts +3 -0
- package/dist/durability.d.ts.map +1 -1
- package/dist/entry.js +1 -1
- package/dist/expectation.d.ts +26 -13
- package/dist/expectation.d.ts.map +1 -1
- package/dist/expectation.js +72 -19
- package/dist/failure.d.ts +3 -0
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +6 -0
- package/dist/host.d.ts +17 -2
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +45 -11
- package/dist/index.d.ts +12 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -6
- package/dist/install.d.ts +2 -4
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +52 -78
- package/dist/lifecycle.d.ts +1 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +40 -31
- package/dist/listing.d.ts +6 -11
- package/dist/listing.d.ts.map +1 -1
- package/dist/listing.js +25 -62
- 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 -39
- package/dist/lost.d.ts.map +1 -1
- package/dist/lost.js +10 -22
- 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 +44 -23
- package/dist/messages.d.ts +9 -5
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +25 -35
- 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 +95 -137
- 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 +5 -9
- package/dist/outcome.d.ts +3 -0
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +15 -0
- package/dist/overlay.d.ts +5 -1
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +36 -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 -59
- package/dist/parts.d.ts.map +1 -1
- package/dist/parts.js +10 -123
- package/dist/preparation.d.ts.map +1 -1
- package/dist/preparation.js +25 -24
- 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 +24 -14
- package/dist/query.d.ts +0 -1
- package/dist/query.d.ts.map +1 -1
- package/dist/questions.d.ts +0 -5
- package/dist/questions.d.ts.map +1 -1
- package/dist/questions.js +0 -7
- package/dist/queue.d.ts +40 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +450 -0
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +67 -22
- package/dist/react.d.ts +5 -0
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +33 -1
- package/dist/reads.d.ts +3 -1
- package/dist/reads.d.ts.map +1 -1
- package/dist/reads.js +9 -2
- package/dist/recovery.d.ts +3 -1
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +29 -7
- package/dist/refresh.js +2 -2
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +5 -6
- package/dist/replica.d.ts +5 -11
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +13 -15
- 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 +46 -57
- 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 +9 -18
- package/dist/runtime.d.ts.map +1 -1
- package/dist/save.d.ts +42 -90
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +334 -167
- package/dist/saves.d.ts +2 -40
- package/dist/saves.d.ts.map +1 -1
- package/dist/saves.js +107 -705
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +2 -3
- package/dist/shared.d.ts +0 -5
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +4 -90
- package/dist/shown.d.ts +4 -3
- package/dist/shown.d.ts.map +1 -1
- package/dist/shown.js +26 -31
- package/dist/socket/lanes.d.ts +12 -4
- package/dist/socket/lanes.d.ts.map +1 -1
- package/dist/socket/lanes.js +34 -8
- package/dist/socket/session.d.ts +0 -1
- package/dist/socket/session.d.ts.map +1 -1
- package/dist/socket.d.ts +3 -6
- package/dist/socket.d.ts.map +1 -1
- package/dist/socket.js +5 -16
- package/dist/source.d.ts +0 -7
- package/dist/source.d.ts.map +1 -1
- package/dist/source.js +5 -4
- package/dist/store/records.d.ts +8 -6
- package/dist/store/records.d.ts.map +1 -1
- package/dist/store/records.js +13 -6
- 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 +2 -1
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +11 -11
- package/dist/surface.d.ts +1 -1
- package/dist/surface.d.ts.map +1 -1
- package/dist/surface.js +13 -16
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +88 -85
- package/dist/tables.d.ts +6 -8
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +41 -20
- 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 +51 -7
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +15 -4
- 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/log.d.ts +0 -6
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js +0 -14
- package/dist/socket/rooms.d.ts +0 -44
- 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/surface.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { called, located, readHistory, resolveReference } from './actions.js';
|
|
1
|
+
import { answeredCall, called, located, readHistory, resolveReference, } from './actions.js';
|
|
2
2
|
import { chatDraftSurface, conversationSurface, watchConversation, watchConversationAgents, watchConversationList, } from './conversation.js';
|
|
3
|
+
import { uncaught } from './failure.js';
|
|
3
4
|
import { CLEANED_TOPIC, watchHoldings } from './holdings.js';
|
|
4
5
|
import { reachedBy, writtenAfter } from './install.js';
|
|
5
6
|
import { declarationOf, listingNow, modelIn, shownRooms } from './listing.js';
|
|
6
7
|
import { stop } from './lifecycle.js';
|
|
7
8
|
import { locked, lockedRooms, watchLocks } from './locks.js';
|
|
8
|
-
import { modelTypes
|
|
9
|
+
import { modelTypes } from './model.js';
|
|
9
10
|
import { observing } from './observation.js';
|
|
10
11
|
import { watchReadiness } from './preparation.js';
|
|
11
12
|
import { planned, rowsQuery, searched, watchPlan, watchPlanned } from './queries.js';
|
|
@@ -38,7 +39,7 @@ function watchMember({ store }, deliver) {
|
|
|
38
39
|
.then(({ member }) => {
|
|
39
40
|
if (watcher.held())
|
|
40
41
|
deliver(member);
|
|
41
|
-
},
|
|
42
|
+
}, uncaught);
|
|
42
43
|
return watcher.stop;
|
|
43
44
|
}
|
|
44
45
|
function watchQueue(runtime, locator, deliver) {
|
|
@@ -116,19 +117,17 @@ function roomsOnce(runtime) {
|
|
|
116
117
|
async function typesOf(runtime, locator) {
|
|
117
118
|
const { store, builtIn } = runtime;
|
|
118
119
|
const held = (await store.rooms([locator])).get(locator);
|
|
119
|
-
const
|
|
120
|
-
const room = fenced ? undefined : declarationOf(runtime, locator, held)?.room;
|
|
120
|
+
const room = declarationOf(runtime, locator, held)?.room;
|
|
121
121
|
return {
|
|
122
|
-
collection: modelTypes(
|
|
122
|
+
collection: modelTypes(modelIn(runtime, locator, held)),
|
|
123
123
|
typedSelection: (room?.typedSelection ?? null) === null ? null : modelTypes(builtIn),
|
|
124
124
|
};
|
|
125
125
|
}
|
|
126
126
|
async function reauthorized(runtime) {
|
|
127
|
-
const { store, socket
|
|
127
|
+
const { store, socket } = runtime;
|
|
128
128
|
const { refusal } = socket.session.now();
|
|
129
129
|
if (refusal === null || !refusal.reauthorizationOffered)
|
|
130
130
|
return;
|
|
131
|
-
journal.record('connection reauthorize');
|
|
132
131
|
await socket.lanes.current();
|
|
133
132
|
await store.written();
|
|
134
133
|
socket.session.set({ authorization: undefined, paused: false });
|
|
@@ -138,7 +137,7 @@ async function reauthorized(runtime) {
|
|
|
138
137
|
await socket.lanes.task(OPENING_LANE, () => socket.authorize());
|
|
139
138
|
}
|
|
140
139
|
function mdRuntime(runtime, watch) {
|
|
141
|
-
const { store, socket,
|
|
140
|
+
const { store, socket, shell, conversations, lastAnswers } = runtime;
|
|
142
141
|
return {
|
|
143
142
|
loaded: () => store.open().then(() => undefined),
|
|
144
143
|
rooms: () => roomsOnce(runtime),
|
|
@@ -149,18 +148,18 @@ function mdRuntime(runtime, watch) {
|
|
|
149
148
|
conversation: conversationSurface(conversations),
|
|
150
149
|
chatDraft: chatDraftSurface(conversations),
|
|
151
150
|
presentation: presentationSurface(runtime),
|
|
152
|
-
save: (room, named, writtenBy) =>
|
|
153
|
-
saveParts: (room, parts, writtenBy) =>
|
|
151
|
+
save: (room, named, writtenBy) => saveRoomDrafts(runtime, room, named, writtenBy),
|
|
152
|
+
saveParts: (room, parts, writtenBy) => saveParts(runtime, room, parts, writtenBy),
|
|
154
153
|
history: (locator, path, query) => readHistory(runtime, locator, path, query),
|
|
155
154
|
resolve: (room, path, destination) => resolveReference(runtime, room, path, destination),
|
|
156
155
|
binaryFile: binaryFileSurface(runtime),
|
|
157
156
|
call: (name, input) => called(runtime, name, input),
|
|
157
|
+
answered: (operation) => answeredCall(runtime, operation),
|
|
158
158
|
async reached(locator, roomVersion, path) {
|
|
159
159
|
return path === undefined
|
|
160
160
|
? reachedBy(runtime, locator, roomVersion)
|
|
161
161
|
: writtenAfter(runtime, locator, roomVersion, path);
|
|
162
162
|
},
|
|
163
|
-
log: () => journal.export(),
|
|
164
163
|
async cleanUp() {
|
|
165
164
|
const freed = await store.ask({ kind: 'opened.clean' });
|
|
166
165
|
const tidied = (await shell.cleanUp?.()) ?? 0;
|
|
@@ -174,8 +173,7 @@ function mdRuntime(runtime, watch) {
|
|
|
174
173
|
},
|
|
175
174
|
persistence: () => store.device.now().persistence === 'granted',
|
|
176
175
|
async retry() {
|
|
177
|
-
|
|
178
|
-
socket.rooms.standAll({ unpreparable: false });
|
|
176
|
+
store.prepareAgain();
|
|
179
177
|
store.readiness.queue();
|
|
180
178
|
if (store.space.full())
|
|
181
179
|
await store.space.probe();
|
|
@@ -185,7 +183,7 @@ function mdRuntime(runtime, watch) {
|
|
|
185
183
|
};
|
|
186
184
|
}
|
|
187
185
|
export function composedRuntime(runtime) {
|
|
188
|
-
const { store
|
|
186
|
+
const { store } = runtime;
|
|
189
187
|
const watch = watching(runtime);
|
|
190
188
|
const md = mdRuntime(runtime, watch);
|
|
191
189
|
const reachable = {
|
|
@@ -211,7 +209,6 @@ export function composedRuntime(runtime) {
|
|
|
211
209
|
if (answer === store.device.now().persistence)
|
|
212
210
|
return;
|
|
213
211
|
store.device.set({ persistence: answer });
|
|
214
|
-
journal.record(`persistence ${answer}`);
|
|
215
212
|
store.readiness.queue();
|
|
216
213
|
},
|
|
217
214
|
within(reach, port) {
|
package/dist/sync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,cAAc,EACd,SAAS,EACT,UAAU,EACX,MAAM,cAAc,CAAC;AAUtB,OAAO,EASL,KAAK,MAAM,EACX,KAAK,QAAQ,EACd,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,cAAc,EACd,SAAS,EACT,UAAU,EACX,MAAM,cAAc,CAAC;AAUtB,OAAO,EASL,KAAK,MAAM,EACX,KAAK,QAAQ,EACd,MAAM,cAAc,CAAC;AAQtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAU5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,YAAY,CAAC;AAG5D,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,YAAY,CAAC;AAE7D,eAAO,MAAM,YAAY,YAAY,CAAC;AA2FtC,wBAAgB,QAAQ,CACtB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,aAAa,GACxB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAI1B;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AA2GD,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,MAAM,iBAmBhB;AAED,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,IAAI,iBA0BX;AAsDD,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,iBA8BxF;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC/F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB7D;AAED,wBAAgB,oBAAoB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,QAK3E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BxF;AAyDD,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA4D7E"}
|
package/dist/sync.js
CHANGED
|
@@ -1,22 +1,25 @@
|
|
|
1
|
-
import { submitAll, submitLater } from './acceptance.js';
|
|
2
1
|
import { resendCalls, resendLater } from './actions.js';
|
|
3
2
|
import { catchUpConversations, reconcileConversations, resendConversations, } from './conversation.js';
|
|
3
|
+
import { declared, sameDeclaration } from './declaration.js';
|
|
4
4
|
import { applyDiscovery, discoverRooms, malformed, signIn } from './discovery.js';
|
|
5
5
|
import { behind, caughtUpTo, publish, pullBootstrap, pullRefresh, reachedBy, replaced, standingAt, } from './install.js';
|
|
6
|
-
import { heldRooms,
|
|
7
|
-
import {
|
|
6
|
+
import { heldRooms, name } from './listing.js';
|
|
7
|
+
import { retainModel, revoked, scoped } from './models.js';
|
|
8
|
+
import { refusalError } from './failure.js';
|
|
8
9
|
import { refuse } from './refusal.js';
|
|
9
|
-
import { emitRooms, moveTo, rest, roomUnreadable, transferring, AUTHORITY_TOPIC } from './shown.js';
|
|
10
|
+
import { emitRooms, moveTo, rest, roomUnreadable, submissionDue, transferring, AUTHORITY_TOPIC, } from './shown.js';
|
|
10
11
|
import { unconfirmed } from './transfer.js';
|
|
11
12
|
export const OPENING_LANE = 'opening';
|
|
13
|
+
const FINISHING = 'finishing';
|
|
12
14
|
async function advance(runtime, room, local, authorized, running, unheld) {
|
|
13
|
-
const { store, socket } = runtime;
|
|
15
|
+
const { store, socket, presence } = runtime;
|
|
14
16
|
const live = () => running() && !store.space.full();
|
|
15
17
|
if (!live())
|
|
16
18
|
return unconfirmed;
|
|
17
19
|
const held = unheld === undefined ? await store.record(room.locator) : undefined;
|
|
18
20
|
if (socket.streamed && (held !== undefined || !store.installs.of(room.locator).beyondHorizon)) {
|
|
19
|
-
|
|
21
|
+
presence.stood(room.locator, false);
|
|
22
|
+
runtime.retries.succeeded('download', room.locator);
|
|
20
23
|
await name(runtime, room.locator);
|
|
21
24
|
return null;
|
|
22
25
|
}
|
|
@@ -27,7 +30,7 @@ async function advance(runtime, room, local, authorized, running, unheld) {
|
|
|
27
30
|
return advance(runtime, room, local, authorized, live);
|
|
28
31
|
if (refreshed !== 'beyond-horizon')
|
|
29
32
|
return refreshed;
|
|
30
|
-
if (
|
|
33
|
+
if (presence.standing(room.locator).reloadDue)
|
|
31
34
|
return unconfirmed;
|
|
32
35
|
replaced(store, [room.locator]);
|
|
33
36
|
}
|
|
@@ -45,18 +48,15 @@ async function advance(runtime, room, local, authorized, running, unheld) {
|
|
|
45
48
|
: advance(runtime, room, local, authorized, live);
|
|
46
49
|
}
|
|
47
50
|
async function refreshedRoom(runtime, room, local, authorized, held, live, hold, refresh) {
|
|
48
|
-
const { store, socket } = runtime;
|
|
49
|
-
const { rooms } = socket;
|
|
51
|
+
const { store, socket, presence } = runtime;
|
|
50
52
|
const refreshed = await pullRefresh(runtime, authorized, held, live, hold, refresh);
|
|
51
53
|
if (!live())
|
|
52
54
|
return unconfirmed;
|
|
53
55
|
if (refreshed.kind === 'still-current') {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
readable(runtime, room);
|
|
56
|
+
presence.stood(room.locator, false);
|
|
57
|
+
runtime.retries.succeeded('download', room.locator);
|
|
58
|
+
if (presence.readable(room.locator))
|
|
58
59
|
emitRooms(runtime);
|
|
59
|
-
}
|
|
60
60
|
return null;
|
|
61
61
|
}
|
|
62
62
|
if (refreshed.kind === 'advanced') {
|
|
@@ -70,7 +70,7 @@ async function refreshedRoom(runtime, room, local, authorized, held, live, hold,
|
|
|
70
70
|
const reached = now !== undefined && socket.reads.reached(room.locator, now, refreshed.record.roomVersion);
|
|
71
71
|
return reached ? null : 'behind';
|
|
72
72
|
}
|
|
73
|
-
await retainModel(runtime,
|
|
73
|
+
await retainModel(runtime, room.locator, declared(room), null);
|
|
74
74
|
return null;
|
|
75
75
|
}
|
|
76
76
|
return refreshed.kind === 'beyond-horizon' ? 'beyond-horizon' : refreshed;
|
|
@@ -79,43 +79,44 @@ export function advanced(runtime, room, local, authorized) {
|
|
|
79
79
|
return runtime.socket.lanes.inRoom(room.locator, (live) => advance(runtime, room, local, authorized, live));
|
|
80
80
|
}
|
|
81
81
|
export async function withhold(runtime, withheld, room, local, progress) {
|
|
82
|
-
const {
|
|
83
|
-
|
|
84
|
-
if (withheld.kind === 'unconfirmed' || store.fences.has(room.locator))
|
|
82
|
+
const { presence } = runtime;
|
|
83
|
+
if (withheld.kind === 'unconfirmed' || presence.lost(room.locator))
|
|
85
84
|
return;
|
|
86
85
|
if (withheld.kind === 'not-ready') {
|
|
87
86
|
progress.complete = false;
|
|
88
87
|
askAgain(runtime, room.locator);
|
|
89
88
|
return;
|
|
90
89
|
}
|
|
91
|
-
|
|
90
|
+
if (withheld.kind === 'transport-uncertainty') {
|
|
91
|
+
runtime.retries.uncertain('download', room.locator, withheld);
|
|
92
|
+
}
|
|
93
|
+
else if (withheld.kind === 'retryable-refusal') {
|
|
94
|
+
runtime.retries.failed('download', room.locator, refusalError(withheld));
|
|
95
|
+
}
|
|
92
96
|
if (withheld.kind === 'transport-uncertainty' || withheld.kind === 'retryable-refusal') {
|
|
93
97
|
const reset = withheld.kind === 'retryable-refusal' ? withheld.reset : undefined;
|
|
94
|
-
|
|
98
|
+
presence.stood(room.locator, true, { reset });
|
|
95
99
|
repairLater(runtime, room.locator, reset === undefined ? { again: true } : { at: Date.parse(reset) });
|
|
96
100
|
}
|
|
97
101
|
else
|
|
98
|
-
|
|
102
|
+
presence.stood(room.locator, true, null);
|
|
99
103
|
if (withheld.kind === 'scoped-refusal') {
|
|
100
|
-
await scoped(runtime, withheld, room,
|
|
104
|
+
await scoped(runtime, withheld, room.locator, declared(room));
|
|
101
105
|
}
|
|
102
106
|
else if (withheld.kind === 'transport-uncertainty') {
|
|
103
107
|
progress.reachable = false;
|
|
104
108
|
}
|
|
105
|
-
else if (withheld.kind === 'retryable-refusal') {
|
|
106
|
-
journal.record(`refusal ${withheld.kind} ${withheld.code}`);
|
|
107
|
-
}
|
|
108
109
|
else if (withheld.kind === 'room-not-readable') {
|
|
109
|
-
roomUnreadable(runtime, room);
|
|
110
|
+
roomUnreadable(runtime, room.locator);
|
|
110
111
|
}
|
|
111
112
|
else if (withheld.kind === 'revoked-authorization') {
|
|
112
113
|
await refuse(runtime, 'revoked-authorization');
|
|
113
114
|
}
|
|
114
115
|
}
|
|
115
116
|
function askAgain(runtime, locator) {
|
|
116
|
-
const { store, socket } = runtime;
|
|
117
|
-
|
|
118
|
-
const room =
|
|
117
|
+
const { store, socket, presence } = runtime;
|
|
118
|
+
presence.askAgain(locator, () => {
|
|
119
|
+
const room = presence.room(locator);
|
|
119
120
|
if (socket.closed() ||
|
|
120
121
|
socket.stopping() ||
|
|
121
122
|
(socket.streamed && !socket.isOpen()) ||
|
|
@@ -128,25 +129,21 @@ function askAgain(runtime, locator) {
|
|
|
128
129
|
.then(() => rest(runtime, progress), () => undefined);
|
|
129
130
|
});
|
|
130
131
|
}
|
|
131
|
-
async function prepareRoom(runtime, room,
|
|
132
|
-
const { socket
|
|
132
|
+
async function prepareRoom(runtime, room, progress, prior) {
|
|
133
|
+
const { socket } = runtime;
|
|
133
134
|
const { session } = socket;
|
|
134
135
|
if (socket.closed() || session.now().authorization === undefined) {
|
|
135
136
|
progress.complete = false;
|
|
136
137
|
return false;
|
|
137
138
|
}
|
|
138
|
-
if (prior !== undefined && prior.replica.selection !== room.replica.selection) {
|
|
139
|
-
listHeld(runtime, room.locator);
|
|
139
|
+
if (prior !== undefined && prior.declaration.replica.selection !== room.replica.selection) {
|
|
140
140
|
emitRooms(runtime);
|
|
141
|
-
journal.record(`selection changed ${room.locator}`);
|
|
142
141
|
progress.complete = false;
|
|
143
142
|
return false;
|
|
144
143
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
if (prior !== undefined && (prior.name !== room.name || prior.handle !== room.handle)) {
|
|
149
|
-
await keepNaming(runtime, local, room);
|
|
144
|
+
const declaration = declared(room);
|
|
145
|
+
if (prior !== undefined && !sameDeclaration(prior.declaration, declaration)) {
|
|
146
|
+
await retainModel(runtime, room.locator, declaration, null);
|
|
150
147
|
}
|
|
151
148
|
const { paused, authorization } = session.now();
|
|
152
149
|
if (paused || authorization === undefined)
|
|
@@ -156,22 +153,22 @@ async function prepareRoom(runtime, room, local, progress, prior) {
|
|
|
156
153
|
async function synchronize(runtime, listed, local, progress, attempt, live) {
|
|
157
154
|
const { store, socket } = runtime;
|
|
158
155
|
const heldNow = await store.rooms(listed.map(({ locator }) => locator));
|
|
159
|
-
const prepared = await Promise.allSettled(listed.map((room) => prepareRoom(runtime, room,
|
|
156
|
+
const prepared = await Promise.allSettled(listed.map((room) => prepareRoom(runtime, room, progress, heldNow.get(room.locator)?.record)));
|
|
160
157
|
if (!live())
|
|
161
158
|
return;
|
|
162
159
|
const ready = listed.filter((_, index) => {
|
|
163
160
|
const outcome = prepared[index];
|
|
164
|
-
return outcome
|
|
161
|
+
return outcome.status === 'fulfilled' && outcome.value;
|
|
165
162
|
});
|
|
166
|
-
const held = await heldRooms(runtime, ready);
|
|
167
|
-
if (!live())
|
|
168
|
-
return;
|
|
169
163
|
if (attempt === 'opened') {
|
|
164
|
+
const held = await heldRooms(runtime, ready);
|
|
165
|
+
if (!live())
|
|
166
|
+
return;
|
|
170
167
|
socket.hand(held);
|
|
171
168
|
}
|
|
172
|
-
const kept = attempt === '
|
|
173
|
-
? new Set()
|
|
174
|
-
: new Set(
|
|
169
|
+
const kept = attempt === 'authorized'
|
|
170
|
+
? new Set((await store.rooms(ready.map(({ locator }) => locator))).keys())
|
|
171
|
+
: new Set();
|
|
175
172
|
for (const room of ready) {
|
|
176
173
|
if (attempt === 'opened' || kept.has(room.locator)) {
|
|
177
174
|
if (attempt === 'authorized')
|
|
@@ -204,7 +201,7 @@ export async function loadRoom(runtime, room, local, progress, live, unheld) {
|
|
|
204
201
|
return;
|
|
205
202
|
const prior = unheld === undefined ? await store.record(room.locator) : undefined;
|
|
206
203
|
if (prior !== undefined) {
|
|
207
|
-
if (!(await prepareRoom(runtime, room,
|
|
204
|
+
if (!(await prepareRoom(runtime, room, progress, prior)))
|
|
208
205
|
return;
|
|
209
206
|
if (revoked(prior.model)) {
|
|
210
207
|
await reload(runtime, room, local, progress, live);
|
|
@@ -219,10 +216,10 @@ export async function loadRoom(runtime, room, local, progress, live, unheld) {
|
|
|
219
216
|
await caughtUp(runtime, room, local, progress, live);
|
|
220
217
|
}
|
|
221
218
|
export async function reload(runtime, room, local, progress, live) {
|
|
222
|
-
const { store, socket } = runtime;
|
|
219
|
+
const { store, socket, presence } = runtime;
|
|
223
220
|
try {
|
|
224
221
|
if (live())
|
|
225
|
-
|
|
222
|
+
presence.reload(room.locator, false);
|
|
226
223
|
const { authorization } = socket.session.now();
|
|
227
224
|
if (!live() || authorization === undefined)
|
|
228
225
|
return;
|
|
@@ -242,24 +239,23 @@ export async function reload(runtime, room, local, progress, live) {
|
|
|
242
239
|
}
|
|
243
240
|
}
|
|
244
241
|
function repairLater(runtime, locator, when) {
|
|
245
|
-
const { socket, recovery } = runtime;
|
|
246
|
-
if (!socket.isOpen() ||
|
|
242
|
+
const { socket, presence, recovery } = runtime;
|
|
243
|
+
if (!socket.isOpen() || presence.standing(locator).repairing)
|
|
247
244
|
return;
|
|
248
245
|
void recovery.attempt(`repair ${locator}`, (signal) => repairPass(runtime, locator, signal), when);
|
|
249
246
|
}
|
|
250
247
|
async function repairPass(runtime, locator, signal) {
|
|
251
|
-
const { store, socket } = runtime;
|
|
252
|
-
const
|
|
253
|
-
const room = rooms.discovered(locator);
|
|
248
|
+
const { store, socket, presence } = runtime;
|
|
249
|
+
const room = presence.room(locator);
|
|
254
250
|
if (!socket.isOpen() ||
|
|
255
251
|
!socket.continuing() ||
|
|
256
252
|
socket.stopping() ||
|
|
257
|
-
!
|
|
253
|
+
!presence.standing(locator).stale)
|
|
258
254
|
return 'done';
|
|
259
255
|
if (room === undefined || room.replica.admission !== 'admitted')
|
|
260
256
|
return 'done';
|
|
261
257
|
const progress = { complete: true, reachable: true };
|
|
262
|
-
|
|
258
|
+
presence.repairing(locator, true);
|
|
263
259
|
try {
|
|
264
260
|
const local = await store.open();
|
|
265
261
|
await socket.lanes.roomTask(locator, async (live) => {
|
|
@@ -272,36 +268,34 @@ async function repairPass(runtime, locator, signal) {
|
|
|
272
268
|
});
|
|
273
269
|
}
|
|
274
270
|
catch {
|
|
275
|
-
|
|
271
|
+
presence.stood(locator, true);
|
|
276
272
|
progress.reachable = false;
|
|
277
273
|
}
|
|
278
274
|
finally {
|
|
279
|
-
|
|
275
|
+
presence.repairing(locator, false);
|
|
280
276
|
}
|
|
281
277
|
if (signal.aborted)
|
|
282
278
|
return 'done';
|
|
283
279
|
await rest(runtime, progress);
|
|
284
|
-
if (!
|
|
285
|
-
|
|
286
|
-
submitLater(runtime, locator);
|
|
280
|
+
if (!presence.standing(locator).stale) {
|
|
281
|
+
await submissionDue(runtime, [locator]);
|
|
287
282
|
return 'done';
|
|
288
283
|
}
|
|
289
|
-
const { repairable } =
|
|
284
|
+
const { repairable } = presence.standing(locator);
|
|
290
285
|
if (repairable === null)
|
|
291
286
|
return 'done';
|
|
292
287
|
return repairable.reset === undefined ? 'again' : { at: Date.parse(repairable.reset) };
|
|
293
288
|
}
|
|
294
289
|
export async function finishOpening(runtime, progress, live) {
|
|
295
|
-
const { socket, conversations, recovery } = runtime;
|
|
290
|
+
const { socket, presence, conversations, recovery } = runtime;
|
|
296
291
|
try {
|
|
297
292
|
if (!live()) {
|
|
298
293
|
progress.complete = false;
|
|
299
294
|
return;
|
|
300
295
|
}
|
|
301
|
-
await
|
|
302
|
-
for (const locator of
|
|
296
|
+
await submissionDue(runtime);
|
|
297
|
+
for (const locator of presence.repairsOwed())
|
|
303
298
|
repairLater(runtime, locator, {});
|
|
304
|
-
}
|
|
305
299
|
await reconcileConversations(conversations);
|
|
306
300
|
const reading = { complete: true, reachable: true };
|
|
307
301
|
await catchUpConversations(conversations, reading);
|
|
@@ -314,8 +308,10 @@ export async function finishOpening(runtime, progress, live) {
|
|
|
314
308
|
progress.reachable = false;
|
|
315
309
|
resendLater(runtime);
|
|
316
310
|
}
|
|
311
|
+
runtime.retries.succeeded('conversations', FINISHING);
|
|
317
312
|
}
|
|
318
|
-
catch {
|
|
313
|
+
catch (error) {
|
|
314
|
+
runtime.retries.failed('conversations', FINISHING, error);
|
|
319
315
|
progress.complete = false;
|
|
320
316
|
}
|
|
321
317
|
finally {
|
|
@@ -351,8 +347,10 @@ export function sync(runtime, attempt, found) {
|
|
|
351
347
|
const listed = await discoverRooms(runtime, local, progress, live, found);
|
|
352
348
|
if (listed !== null)
|
|
353
349
|
await synchronize(runtime, listed, local, progress, attempt, live);
|
|
350
|
+
runtime.retries.succeeded('connection', OPENING_LANE);
|
|
354
351
|
}
|
|
355
|
-
catch {
|
|
352
|
+
catch (error) {
|
|
353
|
+
runtime.retries.failed('connection', OPENING_LANE, error);
|
|
356
354
|
progress.complete = false;
|
|
357
355
|
if (attempt === 'opened' && !socket.isHanded())
|
|
358
356
|
progress.reachable = false;
|
|
@@ -373,7 +371,7 @@ export function sync(runtime, attempt, found) {
|
|
|
373
371
|
});
|
|
374
372
|
}
|
|
375
373
|
export function resynchronize(runtime) {
|
|
376
|
-
const { store, socket } = runtime;
|
|
374
|
+
const { store, socket, presence } = runtime;
|
|
377
375
|
return socket.lanes.task(OPENING_LANE, async (live) => {
|
|
378
376
|
if (!live() || !socket.isAnnounced())
|
|
379
377
|
return;
|
|
@@ -383,9 +381,11 @@ export function resynchronize(runtime) {
|
|
|
383
381
|
const local = await store.open();
|
|
384
382
|
if (!live())
|
|
385
383
|
return;
|
|
386
|
-
await synchronize(runtime,
|
|
384
|
+
await synchronize(runtime, presence.rooms(), local, progress, 'unstreamed', live);
|
|
385
|
+
runtime.retries.succeeded('download', OPENING_LANE);
|
|
387
386
|
}
|
|
388
|
-
catch {
|
|
387
|
+
catch (error) {
|
|
388
|
+
runtime.retries.failed('download', OPENING_LANE, error);
|
|
389
389
|
progress.complete = false;
|
|
390
390
|
}
|
|
391
391
|
if (live())
|
|
@@ -399,7 +399,7 @@ export function countAuthorityChange({ store, socket, lastAnswers }) {
|
|
|
399
399
|
lastAnswers.again();
|
|
400
400
|
}
|
|
401
401
|
export function changeAuthority(runtime, change) {
|
|
402
|
-
const { store, socket
|
|
402
|
+
const { store, socket } = runtime;
|
|
403
403
|
const { session } = socket;
|
|
404
404
|
return socket.lanes.task(OPENING_LANE, async (live) => {
|
|
405
405
|
if (!live() || !socket.isAnnounced())
|
|
@@ -413,7 +413,6 @@ export function changeAuthority(runtime, change) {
|
|
|
413
413
|
return;
|
|
414
414
|
const invalid = malformed(change.rooms);
|
|
415
415
|
if (invalid !== null) {
|
|
416
|
-
journal.record(invalid);
|
|
417
416
|
await refuse(runtime, 'missing-required-guarantee');
|
|
418
417
|
return;
|
|
419
418
|
}
|
|
@@ -423,8 +422,10 @@ export function changeAuthority(runtime, change) {
|
|
|
423
422
|
session.set({ discoveries });
|
|
424
423
|
const listed = await applyDiscovery(runtime, change.rooms, discoveries, change.left);
|
|
425
424
|
await synchronize(runtime, listed, local, progress, 'authorized', live);
|
|
425
|
+
runtime.retries.succeeded('connection', OPENING_LANE);
|
|
426
426
|
}
|
|
427
|
-
catch {
|
|
427
|
+
catch (error) {
|
|
428
|
+
runtime.retries.failed('connection', OPENING_LANE, error);
|
|
428
429
|
progress.complete = false;
|
|
429
430
|
}
|
|
430
431
|
if (!live())
|
|
@@ -469,8 +470,8 @@ async function installCarried(runtime, room, local, change, live, progress) {
|
|
|
469
470
|
await publish(runtime, local, room, bootstrapped.record, { kind: 'bootstrapped', refreshed: bootstrapped.refreshed, from }, live);
|
|
470
471
|
}
|
|
471
472
|
export function applyRoom(runtime, change) {
|
|
472
|
-
const { store, socket } = runtime;
|
|
473
|
-
const {
|
|
473
|
+
const { store, socket, presence } = runtime;
|
|
474
|
+
const { session } = socket;
|
|
474
475
|
const { locator } = change;
|
|
475
476
|
if (socket.stopping())
|
|
476
477
|
return Promise.resolve();
|
|
@@ -483,7 +484,7 @@ export function applyRoom(runtime, change) {
|
|
|
483
484
|
for (;;) {
|
|
484
485
|
if (!live())
|
|
485
486
|
return null;
|
|
486
|
-
const room =
|
|
487
|
+
const room = presence.room(locator);
|
|
487
488
|
if (room === undefined || room.replica.admission !== 'admitted')
|
|
488
489
|
return null;
|
|
489
490
|
const held = await store.record(locator);
|
|
@@ -493,7 +494,7 @@ export function applyRoom(runtime, change) {
|
|
|
493
494
|
await installCarried(runtime, room, local, change, live, progress);
|
|
494
495
|
return progress;
|
|
495
496
|
}
|
|
496
|
-
if (held.replica.selection !== room.replica.selection)
|
|
497
|
+
if (held.declaration.replica.selection !== room.replica.selection)
|
|
497
498
|
return null;
|
|
498
499
|
const at = held.roomVersion;
|
|
499
500
|
if (socket.reads.reached(locator, at, change.roomVersion))
|
|
@@ -514,17 +515,19 @@ export function applyRoom(runtime, change) {
|
|
|
514
515
|
remodelled: refreshed.remodelled,
|
|
515
516
|
};
|
|
516
517
|
if (await publish(runtime, local, room, refreshed.record, landing, writing)) {
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
518
|
+
presence.stood(locator, false);
|
|
519
|
+
const declaration = declared(room);
|
|
520
|
+
if (!sameDeclaration(held.declaration, declaration))
|
|
521
|
+
await retainModel(runtime, locator, declaration, null);
|
|
520
522
|
return progress;
|
|
521
523
|
}
|
|
522
524
|
}
|
|
523
525
|
}
|
|
524
|
-
catch {
|
|
525
|
-
|
|
526
|
+
catch (error) {
|
|
527
|
+
runtime.retries.failed('download', locator, error);
|
|
528
|
+
if (!presence.standing(locator).stale)
|
|
526
529
|
void name(runtime, locator);
|
|
527
|
-
|
|
530
|
+
presence.stood(locator, true);
|
|
528
531
|
return progress;
|
|
529
532
|
}
|
|
530
533
|
})
|
package/dist/tables.d.ts
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { type QueryAnswer, type QueryRoom } from './compile.js';
|
|
2
2
|
import type { Composed } from './collection.js';
|
|
3
3
|
import type { UnsentWork } from './durability.js';
|
|
4
|
-
import type
|
|
5
|
-
import { type ConversationWrite, type HeldConversation, type HeldRow, type MessageWindow } from './messages.js';
|
|
4
|
+
import { type ConversationWrite, type HeldConversation, type HeldFact, type HeldRow, type MessageWindow } from './messages.js';
|
|
6
5
|
import type { GroupTotal, Plan } from './query.js';
|
|
7
6
|
import { type ReadAt } from './reads.js';
|
|
8
7
|
import { type ConversationTally, type RoomTally } from './tallies.js';
|
|
9
8
|
import { type Committed, type Covering, type HeldEntry, type HeldLocators, type HeldRoomRow, type HeldRoomWork, type ReplicaOpened, type Referrer, type Resumed, type RoomCommit, type StoredEntry, type TypedEntry, type View } from './stored.js';
|
|
10
9
|
export type { Committed, Covering, HeldEntry, HeldLocators, HeldRoomRow, HeldRoomWork, OverlayEntry, ReplicaOpened, Referrer, Resumed, RoomCommit, StoredEntry, TypedEntry, View, } from './stored.js';
|
|
11
10
|
export type { QueryAnswer, QueryRoom } from './compile.js';
|
|
12
|
-
export type { ConversationWrite, HeldConversation, HeldRow, MessageWindow } from './messages.js';
|
|
11
|
+
export type { ConversationFact, ConversationWrite, HeldConversation, HeldFact, HeldRow, MessageWindow, } from './messages.js';
|
|
13
12
|
export type { ConversationTally, RoomTally } from './tallies.js';
|
|
14
13
|
export type Value = string | number | bigint | Uint8Array | null;
|
|
15
14
|
export type Row = Readonly<Record<string, Value>>;
|
|
@@ -249,7 +248,6 @@ export interface RuntimeRequests {
|
|
|
249
248
|
}, readonly Referrer[]>;
|
|
250
249
|
readonly 'replica.folders': Asked<{
|
|
251
250
|
readonly key: number;
|
|
252
|
-
readonly view: View;
|
|
253
251
|
readonly paths: readonly string[];
|
|
254
252
|
}, readonly string[]>;
|
|
255
253
|
readonly 'replica.typedWithin': Asked<{
|
|
@@ -378,16 +376,16 @@ export interface RuntimeRequests {
|
|
|
378
376
|
readonly 'conversation.rows': Asked<{
|
|
379
377
|
readonly conversations: readonly string[];
|
|
380
378
|
}, readonly HeldRow[]>;
|
|
381
|
-
readonly 'conversation.jobs': Asked<{
|
|
382
|
-
readonly conversation: string;
|
|
383
|
-
}, readonly JobMarker[]>;
|
|
384
379
|
readonly 'conversation.tallies': Asked<{
|
|
385
380
|
readonly conversations: readonly string[] | null;
|
|
386
381
|
readonly since: string;
|
|
387
382
|
}, readonly ConversationTally[]>;
|
|
383
|
+
readonly 'conversation.facts': Asked<Nothing, readonly HeldFact[]>;
|
|
384
|
+
readonly 'conversation.fact': Asked<HeldFact, null>;
|
|
385
|
+
readonly 'conversation.stored': Asked<Nothing, readonly string[]>;
|
|
388
386
|
readonly 'conversation.drop': Asked<{
|
|
389
387
|
readonly conversations: readonly string[];
|
|
390
|
-
},
|
|
388
|
+
}, readonly string[]>;
|
|
391
389
|
readonly 'space.probe': Asked<Nothing, null>;
|
|
392
390
|
readonly 'read.stored': Asked<ReadAt, string | null>;
|
|
393
391
|
readonly 'read.keep': Asked<ReadAt & {
|