@agentshouse/mdruntime 0.1.0-cb2e390ee7b89 → 0.1.0-cb3bb3b233fa1
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 +24 -19
- package/dist/acceptance.d.ts +3 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +299 -0
- 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 +26 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +302 -0
- package/dist/adapter.d.ts +214 -123
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +6 -10
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +35 -41
- package/dist/authored.d.ts +88 -0
- package/dist/authored.d.ts.map +1 -0
- package/dist/authored.js +345 -0
- package/dist/binary.d.ts +0 -5
- package/dist/binary.d.ts.map +1 -1
- package/dist/binary.js +1 -1
- package/dist/bootstrap.d.ts +30 -11
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +309 -113
- package/dist/cell.d.ts +6 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +9 -0
- package/dist/chain.d.ts +12 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +64 -0
- package/dist/change-set.d.ts +13 -16
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +17 -89
- package/dist/change.d.ts +36 -1
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +17 -3
- package/dist/chat-types.d.ts +3 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +11 -0
- package/dist/client.d.ts +39 -25
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +117 -23
- package/dist/collection.d.ts +32 -21
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +53 -288
- package/dist/column.d.ts +5 -0
- package/dist/column.d.ts.map +1 -0
- package/dist/column.js +9 -0
- package/dist/compile.d.ts +18 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +723 -0
- package/dist/connection.d.ts +7 -134
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +109 -3606
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/{chat/context.js → context.js} +2 -5
- package/dist/conversation-live.d.ts +150 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +259 -0
- package/dist/conversation-row.d.ts +40 -0
- package/dist/conversation-row.d.ts.map +1 -0
- package/dist/conversation-row.js +66 -0
- package/dist/conversation.d.ts +80 -50
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +1037 -793
- package/dist/declaration.d.ts +10 -0
- package/dist/declaration.d.ts.map +1 -0
- package/dist/declaration.js +24 -0
- package/dist/digest.d.ts +7 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +113 -0
- package/dist/discovery.d.ts +10 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +150 -0
- package/dist/durability.d.ts +20 -4
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +9 -0
- package/dist/entry.d.ts +5 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +33 -28
- 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/figures.d.ts +49 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +199 -0
- package/dist/file.d.ts +2 -19
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +8 -122
- 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 +21 -11
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +126 -53
- package/dist/identity.d.ts +0 -2
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -6
- package/dist/index.d.ts +41 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -4
- package/dist/install.d.ts +60 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +537 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +282 -0
- package/dist/listing.d.ts +52 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +152 -0
- package/dist/live.d.ts +25 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +206 -0
- package/dist/loaded.d.ts +5 -0
- package/dist/loaded.d.ts.map +1 -0
- package/dist/loaded.js +40 -0
- package/dist/locks.d.ts +7 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +32 -0
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +49 -0
- package/dist/media.d.ts +13 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +269 -0
- package/dist/memory.d.ts +20 -8
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +311 -121
- package/dist/messages.d.ts +58 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +160 -0
- package/dist/model.d.ts +8 -11
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +6 -23
- package/dist/models.d.ts +10 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +153 -0
- package/dist/name.d.ts +4 -0
- package/dist/name.d.ts.map +1 -0
- package/dist/name.js +122 -0
- package/dist/observation.d.ts +38 -10
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +232 -44
- package/dist/opened.d.ts +22 -0
- package/dist/opened.d.ts.map +1 -0
- package/dist/opened.js +107 -0
- package/dist/opening.d.ts +4 -0
- package/dist/opening.d.ts.map +1 -0
- package/dist/opening.js +53 -0
- package/dist/outcome.d.ts +57 -10
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +71 -2
- package/dist/overlay.d.ts +8 -6
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +121 -182
- 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 +4 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +13 -0
- package/dist/paths.d.ts +2 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +26 -0
- package/dist/preparation.d.ts +41 -0
- package/dist/preparation.d.ts.map +1 -0
- package/dist/preparation.js +314 -0
- package/dist/presence.d.ts +58 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +231 -0
- package/dist/queries.d.ts +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +308 -0
- package/dist/query.d.ts +21 -203
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -491
- package/dist/{chat/questions.d.ts → questions.d.ts} +6 -7
- package/dist/questions.d.ts.map +1 -0
- package/dist/{chat/questions.js → questions.js} +12 -7
- package/dist/queue.d.ts +40 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +480 -0
- package/dist/reach.d.ts +21 -11
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +358 -111
- package/dist/react.d.ts +19 -5
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +35 -15
- package/dist/{chat/read.d.ts → read.d.ts} +2 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/{chat/read.js → read.js} +4 -0
- package/dist/readiness.d.ts +22 -20
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +5 -13
- package/dist/reads.d.ts +38 -10
- package/dist/reads.d.ts.map +1 -1
- package/dist/reads.js +163 -83
- package/dist/recovery.d.ts +5 -2
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +65 -8
- package/dist/refresh.d.ts +18 -15
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +145 -60
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +55 -0
- package/dist/replica.d.ts +49 -36
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +322 -198
- 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 +55 -13
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +416 -122
- package/dist/room-drafts.d.ts +24 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +220 -0
- package/dist/room-list.d.ts +10 -0
- package/dist/room-list.d.ts.map +1 -0
- package/dist/room-list.js +45 -0
- package/dist/rows.d.ts +32 -30
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +60 -120
- package/dist/runtime.d.ts +34 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +43 -49
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +736 -304
- package/dist/saves.d.ts +34 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +437 -0
- package/dist/search.d.ts +12 -95
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +10 -266
- package/dist/seed.d.ts +11 -2
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +71 -1
- package/dist/shared.d.ts +6 -7
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +75 -104
- package/dist/shown.d.ts +33 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +309 -0
- package/dist/socket/admission.d.ts +7 -0
- package/dist/socket/admission.d.ts.map +1 -0
- package/dist/socket/admission.js +39 -0
- package/dist/socket/answers.d.ts +6 -0
- package/dist/socket/answers.d.ts.map +1 -0
- package/dist/socket/answers.js +20 -0
- package/dist/socket/lanes.d.ts +28 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +103 -0
- package/dist/socket/reads.d.ts +10 -0
- package/dist/socket/reads.d.ts.map +1 -0
- package/dist/socket/reads.js +31 -0
- package/dist/socket/session.d.ts +38 -0
- package/dist/socket/session.d.ts.map +1 -0
- package/dist/socket/session.js +23 -0
- package/dist/socket.d.ts +67 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +164 -0
- package/dist/source.d.ts +59 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +93 -0
- package/dist/status.d.ts +4 -5
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -7
- package/dist/store/installs.d.ts +30 -0
- package/dist/store/installs.d.ts.map +1 -0
- package/dist/store/installs.js +40 -0
- package/dist/store/readiness.d.ts +11 -0
- package/dist/store/readiness.d.ts.map +1 -0
- package/dist/store/readiness.js +68 -0
- package/dist/store/records.d.ts +223 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +465 -0
- package/dist/store/room-held.d.ts +8 -0
- package/dist/store/room-held.d.ts.map +1 -0
- package/dist/store/room-held.js +17 -0
- package/dist/store/rooms-shown.d.ts +8 -0
- package/dist/store/rooms-shown.d.ts.map +1 -0
- package/dist/store/rooms-shown.js +13 -0
- package/dist/store/space.d.ts +11 -0
- package/dist/store/space.d.ts.map +1 -0
- package/dist/store/space.js +41 -0
- package/dist/store/watchers.d.ts +17 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +56 -0
- package/dist/store/writes.d.ts +24 -0
- package/dist/store/writes.d.ts.map +1 -0
- package/dist/store/writes.js +125 -0
- package/dist/store.d.ts +114 -163
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +163 -754
- package/dist/stored.d.ts +167 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +700 -0
- package/dist/surface.d.ts +90 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +225 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +536 -0
- package/dist/tables.d.ts +376 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +499 -0
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +128 -0
- package/dist/transfer.d.ts +0 -5
- package/dist/transfer.d.ts.map +1 -1
- package/dist/turn.d.ts +5 -3
- package/dist/turn.d.ts.map +1 -1
- package/dist/turn.js +51 -21
- package/dist/validation.d.ts +29 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +98 -0
- package/dist/windows.d.ts +9 -16
- package/dist/windows.d.ts.map +1 -1
- package/dist/windows.js +11 -75
- package/dist/wire.d.ts +91 -9
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +31 -6
- package/package.json +19 -19
- package/AGENTS.md +0 -299
- package/dist/acquisition.d.ts +0 -14
- package/dist/acquisition.d.ts.map +0 -1
- package/dist/acquisition.js +0 -24
- package/dist/attempt.d.ts +0 -16
- package/dist/attempt.d.ts.map +0 -1
- package/dist/attempt.js +0 -70
- package/dist/chat/acts.d.ts +0 -33
- package/dist/chat/acts.d.ts.map +0 -1
- package/dist/chat/acts.js +0 -36
- package/dist/chat/context.d.ts +0 -3
- package/dist/chat/context.d.ts.map +0 -1
- package/dist/chat/earlier.d.ts +0 -10
- package/dist/chat/earlier.d.ts.map +0 -1
- package/dist/chat/earlier.js +0 -54
- package/dist/chat/input.d.ts +0 -9
- package/dist/chat/input.d.ts.map +0 -1
- package/dist/chat/input.js +0 -99
- package/dist/chat/kit.d.ts +0 -61
- package/dist/chat/kit.d.ts.map +0 -1
- package/dist/chat/kit.js +0 -123
- package/dist/chat/lasting.d.ts +0 -6
- package/dist/chat/lasting.d.ts.map +0 -1
- package/dist/chat/lasting.js +0 -19
- package/dist/chat/list.d.ts +0 -27
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -99
- package/dist/chat/markdown.d.ts +0 -20
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -188
- package/dist/chat/message.d.ts +0 -6
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -192
- package/dist/chat/messages.d.ts +0 -22
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -155
- package/dist/chat/name.d.ts +0 -6
- package/dist/chat/name.d.ts.map +0 -1
- package/dist/chat/name.js +0 -37
- package/dist/chat/opened.d.ts +0 -11
- package/dist/chat/opened.d.ts.map +0 -1
- package/dist/chat/opened.js +0 -17
- package/dist/chat/overlay.d.ts +0 -31
- package/dist/chat/overlay.d.ts.map +0 -1
- package/dist/chat/overlay.js +0 -97
- package/dist/chat/parts.d.ts +0 -57
- package/dist/chat/parts.d.ts.map +0 -1
- package/dist/chat/parts.js +0 -119
- package/dist/chat/process.d.ts +0 -20
- package/dist/chat/process.d.ts.map +0 -1
- package/dist/chat/process.js +0 -32
- package/dist/chat/provider.d.ts +0 -63
- package/dist/chat/provider.d.ts.map +0 -1
- package/dist/chat/provider.js +0 -635
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -69
- package/dist/chat/questions.d.ts.map +0 -1
- package/dist/chat/read.d.ts.map +0 -1
- package/dist/chat/ready.d.ts +0 -34
- package/dist/chat/ready.d.ts.map +0 -1
- package/dist/chat/ready.js +0 -91
- package/dist/chat/style.d.ts +0 -4
- package/dist/chat/style.d.ts.map +0 -1
- package/dist/chat/style.js +0 -302
- package/dist/chat.d.ts +0 -14
- package/dist/chat.d.ts.map +0 -1
- package/dist/chat.js +0 -8
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- package/dist/log.d.ts +0 -5
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js +0 -14
- package/dist/read-side.d.ts +0 -25
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -761
package/dist/shown.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Member } from './adapter.js';
|
|
2
|
+
import { type ChangeSet } from './change-set.js';
|
|
3
|
+
import type { QueueEntry } from './outcome.js';
|
|
4
|
+
import type { Runtime } from './runtime.js';
|
|
5
|
+
import type { Live, Moving } from './socket.js';
|
|
6
|
+
import { type CycleProgress } from './status.js';
|
|
7
|
+
export declare const ROOMS_TOPIC = "rooms";
|
|
8
|
+
export declare const STATUS_TOPIC = "sync-status";
|
|
9
|
+
export declare const REFUSAL_TOPIC = "connection-refusal";
|
|
10
|
+
export declare const STORAGE_LOSS_TOPIC = "storage-loss";
|
|
11
|
+
export declare const SERVICE_MODE_TOPIC = "service-mode";
|
|
12
|
+
export declare const MEMBER_TOPIC = "member";
|
|
13
|
+
export declare const AUTHORITY_TOPIC = "authority-changes";
|
|
14
|
+
export declare const LOCKS_TOPIC = "locks";
|
|
15
|
+
export declare const queueTopic: (locator: string) => string;
|
|
16
|
+
export declare function recoverReads({ liveQueries, figures }: Runtime, locators?: readonly string[]): void;
|
|
17
|
+
export declare function emitRooms(runtime: Runtime, changed?: readonly string[]): Promise<void>;
|
|
18
|
+
export declare function emitKnownRooms(runtime: Runtime): void;
|
|
19
|
+
export declare function emitRefusal(runtime: Runtime): void;
|
|
20
|
+
export declare function storageLossNow({ store }: Runtime): string | null;
|
|
21
|
+
export declare function emitStorageLoss(runtime: Runtime): void;
|
|
22
|
+
export declare function emitMember({ store }: Runtime, member: Member | null): void;
|
|
23
|
+
export declare function show(runtime: Runtime): Promise<void>;
|
|
24
|
+
export declare function moveTo(runtime: Runtime, next: Moving): Promise<void>;
|
|
25
|
+
export declare function statusShown(runtime: Runtime): Promise<void>;
|
|
26
|
+
export declare function transferring({ socket }: Runtime): Moving;
|
|
27
|
+
export declare function pendingShown(runtime: Runtime): Promise<void>;
|
|
28
|
+
export declare function entriesOf(runtime: Runtime, locator: string): Promise<readonly QueueEntry[]>;
|
|
29
|
+
export declare function publishChangeSet(runtime: Runtime, set: ChangeSet): Promise<void>;
|
|
30
|
+
export declare function submissionDue(runtime: Runtime, locators?: readonly string[]): Promise<void>;
|
|
31
|
+
export declare function roomUnreadable(runtime: Runtime, locator: string): void;
|
|
32
|
+
export declare function rest(runtime: Runtime, progress: CycleProgress | null, live?: Live): Promise<void>;
|
|
33
|
+
//# sourceMappingURL=shown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shown.d.ts","sourceRoot":"","sources":["../src/shown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAA6B,KAAK,aAAa,EAAmB,MAAM,aAAa,CAAC;AAiB7F,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,eAAO,MAAM,YAAY,gBAAgB,CAAC;AAE1C,eAAO,MAAM,aAAa,uBAAuB,CAAC;AAElD,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AAEjD,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC,eAAO,MAAM,eAAe,sBAAsB,CAAC;AAEnD,eAAO,MAAM,WAAW,UAAU,CAAC;AAEnC,eAAO,MAAM,UAAU,YAAa,MAAM,WAA4B,CAAC;AAqCvE,wBAAgB,YAAY,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,QAG3F;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QAI9C;AAiFD,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,QAK3C;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAGhE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,QAG/C;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,QAEnE;AA0BD,wBAAgB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAepD;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,GAAG,MAAM,CAExD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5D;AAYD,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,UAAU,EAAE,CAAC,CAGjG;AAcD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBhF;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAOjG;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,QAG/D;AAED,wBAAsB,IAAI,CACxB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,aAAa,GAAG,IAAI,EAC9B,IAAI,GAAE,IAAqC,iBAiC5C"}
|
package/dist/shown.js
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import { changeSet, mergeChangeSets } from './change-set.js';
|
|
2
|
+
import { conversationsChanged, conversationsLearned } from './conversation.js';
|
|
3
|
+
import { lossStated } from './durability.js';
|
|
4
|
+
import { listedEntries, listingNow, shownChange, shownRooms } from './listing.js';
|
|
5
|
+
import { emitPresentation, publishRoomDrafts } from './room-drafts.js';
|
|
6
|
+
import { same } from './status.js';
|
|
7
|
+
export const ROOMS_TOPIC = 'rooms';
|
|
8
|
+
export const STATUS_TOPIC = 'sync-status';
|
|
9
|
+
export const REFUSAL_TOPIC = 'connection-refusal';
|
|
10
|
+
export const STORAGE_LOSS_TOPIC = 'storage-loss';
|
|
11
|
+
export const SERVICE_MODE_TOPIC = 'service-mode';
|
|
12
|
+
export const MEMBER_TOPIC = 'member';
|
|
13
|
+
export const AUTHORITY_TOPIC = 'authority-changes';
|
|
14
|
+
export const LOCKS_TOPIC = 'locks';
|
|
15
|
+
export const queueTopic = (locator) => `queue\u0000${locator}`;
|
|
16
|
+
async function attended({ store, localSaves }) {
|
|
17
|
+
const held = await store.status();
|
|
18
|
+
const attentionRequired = held.returned.flatMap((record) => record.returned === null
|
|
19
|
+
? []
|
|
20
|
+
: [{ room: record.locator, path: record.path, returned: structuredClone(record.returned) }]);
|
|
21
|
+
attentionRequired.sort((left, right) => {
|
|
22
|
+
if (left.room !== right.room)
|
|
23
|
+
return left.room < right.room ? -1 : 1;
|
|
24
|
+
if (left.path !== right.path)
|
|
25
|
+
return left.path < right.path ? -1 : 1;
|
|
26
|
+
return 0;
|
|
27
|
+
});
|
|
28
|
+
const changed = new Map();
|
|
29
|
+
if (!localSaves) {
|
|
30
|
+
for (const change of held.unsent)
|
|
31
|
+
changed.set(`${change.room}\u0000${change.path}`, change);
|
|
32
|
+
}
|
|
33
|
+
const unsent = [...changed]
|
|
34
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
|
|
35
|
+
.map(([, change]) => change);
|
|
36
|
+
return {
|
|
37
|
+
queued: !localSaves && held.queued.length > 0,
|
|
38
|
+
lastCompleted: held.lastCompleted,
|
|
39
|
+
attentionRequired,
|
|
40
|
+
unsent,
|
|
41
|
+
reset: held.resets.reduce((earliest, { reset }) => (earliest !== null && earliest <= reset ? earliest : reset), null),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async function queuedWork({ store, localSaves }) {
|
|
45
|
+
return !localSaves && (await store.queued()).length > 0;
|
|
46
|
+
}
|
|
47
|
+
export function recoverReads({ liveQueries, figures }, locators) {
|
|
48
|
+
liveQueries.recover(locators);
|
|
49
|
+
figures.recover();
|
|
50
|
+
}
|
|
51
|
+
export function emitRooms(runtime, changed) {
|
|
52
|
+
recoverReads(runtime, changed);
|
|
53
|
+
runtime.store.readiness.queue(changed);
|
|
54
|
+
return changed === undefined
|
|
55
|
+
? publishRooms(runtime, 'all')
|
|
56
|
+
: publishRooms(runtime, 'changed', changed);
|
|
57
|
+
}
|
|
58
|
+
export function emitKnownRooms(runtime) {
|
|
59
|
+
conversationsLearned(runtime.conversations);
|
|
60
|
+
if (runtime.store.watching(ROOMS_TOPIC, 'waiting').length === 0)
|
|
61
|
+
return;
|
|
62
|
+
void publishRooms(runtime, 'known');
|
|
63
|
+
}
|
|
64
|
+
function roomsOwedWith(held, mode, touched) {
|
|
65
|
+
if (held === undefined) {
|
|
66
|
+
return {
|
|
67
|
+
all: mode === 'all',
|
|
68
|
+
changed: new Set(mode === 'changed' ? touched : []),
|
|
69
|
+
counted: new Set(mode === 'changed' ? [] : touched),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
held.all ||= mode === 'all';
|
|
73
|
+
for (const locator of touched) {
|
|
74
|
+
(mode === 'changed' ? held.changed : held.counted).add(locator);
|
|
75
|
+
}
|
|
76
|
+
return held;
|
|
77
|
+
}
|
|
78
|
+
async function patchedRooms(runtime, owed) {
|
|
79
|
+
const { store } = runtime;
|
|
80
|
+
const touched = [...new Set([...owed.changed, ...owed.counted])];
|
|
81
|
+
const entries = await listedEntries(runtime, touched);
|
|
82
|
+
const shown = store.roomsShown.now();
|
|
83
|
+
if (entries === null || shown === null)
|
|
84
|
+
return false;
|
|
85
|
+
if (runtime.socket.closed())
|
|
86
|
+
return true;
|
|
87
|
+
const moved = entries.filter(({ locator, documents }) => owed.changed.has(locator) || shown.get(locator)?.documents !== documents);
|
|
88
|
+
const counted = moved.flatMap(({ locator }) => (owed.changed.has(locator) ? [] : [locator]));
|
|
89
|
+
if (counted.length > 0) {
|
|
90
|
+
recoverReads(runtime, counted);
|
|
91
|
+
store.readiness.queue(counted);
|
|
92
|
+
}
|
|
93
|
+
store.roomsShown.patch(moved);
|
|
94
|
+
if (moved.length === 0)
|
|
95
|
+
return true;
|
|
96
|
+
const change = shownChange(runtime, moved);
|
|
97
|
+
for (const watcher of store.watching(ROOMS_TOPIC, 'ready'))
|
|
98
|
+
watcher.answer(change);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
async function deliverRooms(runtime, owed) {
|
|
102
|
+
const { store, socket } = runtime;
|
|
103
|
+
const waiting = () => store.watching(ROOMS_TOPIC, 'waiting');
|
|
104
|
+
if (socket.closed() || store.watching(ROOMS_TOPIC).length === 0)
|
|
105
|
+
return;
|
|
106
|
+
const touched = owed.changed.size > 0 || owed.counted.size > 0;
|
|
107
|
+
if (!owed.all && touched && waiting().length === 0 && (await patchedRooms(runtime, owed)))
|
|
108
|
+
return;
|
|
109
|
+
if (touched)
|
|
110
|
+
owed.all = true;
|
|
111
|
+
const listing = await listingNow(runtime);
|
|
112
|
+
if (socket.closed())
|
|
113
|
+
return;
|
|
114
|
+
const { roomsListed, refusal, moving } = socket.session.now();
|
|
115
|
+
const joining = waiting().length > 0 &&
|
|
116
|
+
(roomsListed || listing.size > 0 || refusal !== null || moving.providerUnreachable);
|
|
117
|
+
if (!owed.all && !joining)
|
|
118
|
+
return;
|
|
119
|
+
const value = shownRooms(runtime, listing);
|
|
120
|
+
const shown = store.roomsShown.now();
|
|
121
|
+
const moved = owed.all ||
|
|
122
|
+
(shown !== null && JSON.stringify(shownRooms(runtime, shown)) !== JSON.stringify(value));
|
|
123
|
+
if (moved)
|
|
124
|
+
for (const watcher of store.watching(ROOMS_TOPIC, 'ready'))
|
|
125
|
+
watcher.answer(value);
|
|
126
|
+
if (joining)
|
|
127
|
+
for (const watcher of waiting())
|
|
128
|
+
watcher.answer(value);
|
|
129
|
+
store.roomsShown.show(store.watching(ROOMS_TOPIC, 'ready').length === 0 ? null : listing);
|
|
130
|
+
}
|
|
131
|
+
function publishRooms(runtime, mode, touched = []) {
|
|
132
|
+
if (runtime.socket.closed())
|
|
133
|
+
return Promise.resolve();
|
|
134
|
+
return runtime.store.owing(ROOMS_TOPIC, (held) => roomsOwedWith(held, mode, touched), (owed) => deliverRooms(runtime, owed));
|
|
135
|
+
}
|
|
136
|
+
export function emitRefusal(runtime) {
|
|
137
|
+
const { store, socket } = runtime;
|
|
138
|
+
store.readiness.queue([]);
|
|
139
|
+
store.tell(REFUSAL_TOPIC, socket.session.now().refusal);
|
|
140
|
+
emitKnownRooms(runtime);
|
|
141
|
+
}
|
|
142
|
+
export function storageLossNow({ store }) {
|
|
143
|
+
const { persistence, storageLoss } = store.device.now();
|
|
144
|
+
return lossStated(persistence, storageLoss);
|
|
145
|
+
}
|
|
146
|
+
export function emitStorageLoss(runtime) {
|
|
147
|
+
runtime.store.readiness.queue([]);
|
|
148
|
+
runtime.store.tell(STORAGE_LOSS_TOPIC, storageLossNow(runtime));
|
|
149
|
+
}
|
|
150
|
+
export function emitMember({ store }, member) {
|
|
151
|
+
store.tell(MEMBER_TOPIC, member);
|
|
152
|
+
}
|
|
153
|
+
async function deliverStatus(runtime, owed) {
|
|
154
|
+
const { store, socket } = runtime;
|
|
155
|
+
const held = await attended(runtime);
|
|
156
|
+
if (socket.closed())
|
|
157
|
+
return;
|
|
158
|
+
for (const { moving, current } of owed) {
|
|
159
|
+
const state = moving.resting && held.queued ? 'pending' : moving.state;
|
|
160
|
+
const next = {
|
|
161
|
+
state: state === 'synced' && !current ? 'syncing' : state,
|
|
162
|
+
lastCompleted: held.lastCompleted,
|
|
163
|
+
providerUnreachable: moving.providerUnreachable,
|
|
164
|
+
attentionRequired: held.attentionRequired,
|
|
165
|
+
unsent: held.unsent,
|
|
166
|
+
reset: held.reset,
|
|
167
|
+
};
|
|
168
|
+
if (same(store.device.now().status, next))
|
|
169
|
+
continue;
|
|
170
|
+
store.device.set({ status: next });
|
|
171
|
+
store.tell(STATUS_TOPIC, next);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function conversationsCurrent({ conversations }) {
|
|
175
|
+
return conversations.listed() && conversations.current();
|
|
176
|
+
}
|
|
177
|
+
export function show(runtime) {
|
|
178
|
+
const { store, socket } = runtime;
|
|
179
|
+
if (socket.closed())
|
|
180
|
+
return Promise.resolve();
|
|
181
|
+
store.readiness.queue([]);
|
|
182
|
+
emitKnownRooms(runtime);
|
|
183
|
+
const moved = { moving: socket.session.now().moving, current: conversationsCurrent(runtime) };
|
|
184
|
+
return store.owing(STATUS_TOPIC, (held) => {
|
|
185
|
+
if (held === undefined)
|
|
186
|
+
return [moved];
|
|
187
|
+
held.push(moved);
|
|
188
|
+
return held;
|
|
189
|
+
}, (owed) => deliverStatus(runtime, owed));
|
|
190
|
+
}
|
|
191
|
+
export function moveTo(runtime, next) {
|
|
192
|
+
if (runtime.socket.closed())
|
|
193
|
+
return Promise.resolve();
|
|
194
|
+
runtime.socket.session.set({ moving: next });
|
|
195
|
+
return show(runtime);
|
|
196
|
+
}
|
|
197
|
+
export function statusShown(runtime) {
|
|
198
|
+
return moveTo(runtime, runtime.socket.session.now().moving);
|
|
199
|
+
}
|
|
200
|
+
export function transferring({ socket }) {
|
|
201
|
+
return { ...socket.session.now().moving, state: 'syncing', resting: false };
|
|
202
|
+
}
|
|
203
|
+
export function pendingShown(runtime) {
|
|
204
|
+
const { socket, localSaves } = runtime;
|
|
205
|
+
if (!localSaves)
|
|
206
|
+
socket.session.set({ recorded: false });
|
|
207
|
+
const { moving } = socket.session.now();
|
|
208
|
+
return moveTo(runtime, localSaves ? moving : { ...moving, state: 'pending', resting: false });
|
|
209
|
+
}
|
|
210
|
+
function entryOf({ localSaves }, states, batch) {
|
|
211
|
+
if (localSaves)
|
|
212
|
+
return Object.freeze({ batch, state: 'local' });
|
|
213
|
+
const state = states.get(batch.id);
|
|
214
|
+
return Object.freeze({ batch, ...(state?.submission ?? { state: 'waiting' }) });
|
|
215
|
+
}
|
|
216
|
+
export async function entriesOf(runtime, locator) {
|
|
217
|
+
const { queue, states } = await runtime.store.work(locator);
|
|
218
|
+
return queue.map((batch) => entryOf(runtime, states, batch));
|
|
219
|
+
}
|
|
220
|
+
function emitQueue(runtime, locator) {
|
|
221
|
+
const { store, socket } = runtime;
|
|
222
|
+
const listening = () => store.watching(queueTopic(locator));
|
|
223
|
+
if (socket.closed() || listening().length === 0)
|
|
224
|
+
return Promise.resolve();
|
|
225
|
+
return store.publication(async () => {
|
|
226
|
+
if (socket.closed() || listening().length === 0)
|
|
227
|
+
return;
|
|
228
|
+
const entries = await entriesOf(runtime, locator);
|
|
229
|
+
if (socket.closed())
|
|
230
|
+
return;
|
|
231
|
+
for (const watcher of listening())
|
|
232
|
+
watcher.answer(entries);
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
export function publishChangeSet(runtime, set) {
|
|
236
|
+
const { store, liveQueries, figures, conversations } = runtime;
|
|
237
|
+
liveQueries.touched(set);
|
|
238
|
+
figures.touched(set);
|
|
239
|
+
for (const { locator, path } of set.documents) {
|
|
240
|
+
if (path !== null)
|
|
241
|
+
store.attached.drop(locator, path);
|
|
242
|
+
}
|
|
243
|
+
const shownNow = [];
|
|
244
|
+
if (set.queues.length > 0 || set.drafts.length > 0)
|
|
245
|
+
shownNow.push(show(runtime));
|
|
246
|
+
if (set.rooms.length > 0)
|
|
247
|
+
shownNow.push(emitRooms(runtime, set.rooms));
|
|
248
|
+
else if (set.documents.length > 0) {
|
|
249
|
+
shownNow.push(publishRooms(runtime, 'counted', [...new Set(set.documents.map(({ locator }) => locator))]));
|
|
250
|
+
}
|
|
251
|
+
for (const locator of set.queues)
|
|
252
|
+
shownNow.push(emitQueue(runtime, locator));
|
|
253
|
+
if (set.drafts.length > 0)
|
|
254
|
+
shownNow.push(publishRoomDrafts(runtime, false));
|
|
255
|
+
else if (set.documents.length > 0) {
|
|
256
|
+
shownNow.push(publishRoomDrafts(runtime, false, set.documents));
|
|
257
|
+
}
|
|
258
|
+
for (const app of set.presentations)
|
|
259
|
+
shownNow.push(emitPresentation(runtime, app));
|
|
260
|
+
conversationsChanged(conversations, set);
|
|
261
|
+
return Promise.all(shownNow).then(() => undefined);
|
|
262
|
+
}
|
|
263
|
+
export async function submissionDue(runtime, locators) {
|
|
264
|
+
const { store } = runtime;
|
|
265
|
+
const due = (await store.queued()).filter((locator) => locators === undefined || locators.includes(locator));
|
|
266
|
+
if (due.length === 0)
|
|
267
|
+
return;
|
|
268
|
+
await store.changed(mergeChangeSets(due.map((locator) => changeSet(locator, { due: true }))));
|
|
269
|
+
}
|
|
270
|
+
export function roomUnreadable(runtime, locator) {
|
|
271
|
+
runtime.presence.refused(locator, null);
|
|
272
|
+
emitRooms(runtime, [locator]);
|
|
273
|
+
}
|
|
274
|
+
export async function rest(runtime, progress, live = () => !runtime.socket.closed()) {
|
|
275
|
+
const { store, socket, presence } = runtime;
|
|
276
|
+
const { session, lanes } = socket;
|
|
277
|
+
if (!live())
|
|
278
|
+
return;
|
|
279
|
+
const settled = () => session.now().complete &&
|
|
280
|
+
lanes.roomWork() === 0 &&
|
|
281
|
+
!socket.naming() &&
|
|
282
|
+
presence.settled() &&
|
|
283
|
+
conversationsCurrent(runtime);
|
|
284
|
+
let synced = settled();
|
|
285
|
+
if (synced && !session.now().recorded) {
|
|
286
|
+
const queued = await queuedWork(runtime).catch(() => true);
|
|
287
|
+
if (!live())
|
|
288
|
+
return;
|
|
289
|
+
synced = !queued && settled();
|
|
290
|
+
}
|
|
291
|
+
if (synced && !session.now().recorded) {
|
|
292
|
+
const completedAt = new Date().toISOString();
|
|
293
|
+
try {
|
|
294
|
+
await (await store.open()).fact('lastCompleted', completedAt);
|
|
295
|
+
if (!live())
|
|
296
|
+
return;
|
|
297
|
+
session.set({ recorded: true });
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
synced = false;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
const { complete, moving } = session.now();
|
|
304
|
+
moveTo(runtime, {
|
|
305
|
+
state: synced && complete && lanes.roomWork() === 0 && !socket.naming() ? 'synced' : 'syncing',
|
|
306
|
+
providerUnreachable: progress === null ? moving.providerUnreachable : !progress.reachable,
|
|
307
|
+
resting: true,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admission.d.ts","sourceRoot":"","sources":["../../src/socket/admission.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;CAClC,CAAC;AAEF,wBAAgB,eAAe,IAAI,SAAS,CAmC3C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const STREAMS_HELD = 4;
|
|
2
|
+
const QUEUED_TEXT = 1 << 23;
|
|
3
|
+
export function createAdmission() {
|
|
4
|
+
let streamsFree = STREAMS_HELD;
|
|
5
|
+
let queuedText = 0;
|
|
6
|
+
const installWaiters = [];
|
|
7
|
+
function once(release) {
|
|
8
|
+
let released = false;
|
|
9
|
+
return () => {
|
|
10
|
+
if (released)
|
|
11
|
+
return;
|
|
12
|
+
released = true;
|
|
13
|
+
release();
|
|
14
|
+
for (const admit of installWaiters.splice(0))
|
|
15
|
+
admit();
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
async heldStream() {
|
|
20
|
+
while (streamsFree === 0)
|
|
21
|
+
await new Promise((admit) => installWaiters.push(admit));
|
|
22
|
+
streamsFree -= 1;
|
|
23
|
+
return once(() => {
|
|
24
|
+
streamsFree += 1;
|
|
25
|
+
});
|
|
26
|
+
},
|
|
27
|
+
async unqueued() {
|
|
28
|
+
while (queuedText >= QUEUED_TEXT) {
|
|
29
|
+
await new Promise((admit) => installWaiters.push(admit));
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
queued(text) {
|
|
33
|
+
queuedText += text;
|
|
34
|
+
return once(() => {
|
|
35
|
+
queuedText -= text;
|
|
36
|
+
});
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answers.d.ts","sourceRoot":"","sources":["../../src/socket/answers.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,OAAO,GAAG;IACpB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;CACtD,CAAC;AAEF,wBAAgB,aAAa,IAAI,OAAO,CAkBvC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function createAnswers() {
|
|
2
|
+
const answering = new Map();
|
|
3
|
+
return {
|
|
4
|
+
awaitingAnswer(locator) {
|
|
5
|
+
answering.get(locator)?.release();
|
|
6
|
+
let release = () => { };
|
|
7
|
+
const answered = new Promise((resolve) => {
|
|
8
|
+
release = resolve;
|
|
9
|
+
});
|
|
10
|
+
const awaited = { answered, release };
|
|
11
|
+
answering.set(locator, awaited);
|
|
12
|
+
return () => {
|
|
13
|
+
if (answering.get(locator) === awaited)
|
|
14
|
+
answering.delete(locator);
|
|
15
|
+
release();
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
answered: (locator) => answering.get(locator)?.answered,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { CallResult } from '../outcome.js';
|
|
2
|
+
export type Live = () => boolean;
|
|
3
|
+
export type KeptSender = {
|
|
4
|
+
next(): Promise<CallResult>;
|
|
5
|
+
};
|
|
6
|
+
type LaneRules = {
|
|
7
|
+
generation(): number;
|
|
8
|
+
continuing(): boolean;
|
|
9
|
+
stopping(): boolean;
|
|
10
|
+
failed(locator: string, error: unknown): void;
|
|
11
|
+
};
|
|
12
|
+
export type Lanes = {
|
|
13
|
+
task(lane: string, work: (live: Live) => Promise<void>): Promise<void>;
|
|
14
|
+
inRoom<T>(locator: string, work: (live: Live) => Promise<T>): Promise<T>;
|
|
15
|
+
roomTask(locator: string, work: (live: Live) => Promise<void>): Promise<void>;
|
|
16
|
+
roomWork(): number;
|
|
17
|
+
current(): Promise<unknown>;
|
|
18
|
+
finished(): Promise<unknown>;
|
|
19
|
+
sender(operation: string): KeptSender | undefined;
|
|
20
|
+
sending(operation: string, sender: KeptSender): void;
|
|
21
|
+
sent(operation: string, sender: KeptSender): void;
|
|
22
|
+
settled(operation: string): Promise<void>;
|
|
23
|
+
settle(operation: string, lost: boolean): void;
|
|
24
|
+
unclaimed(operation: string): boolean;
|
|
25
|
+
};
|
|
26
|
+
export declare function createLanes({ generation, continuing, stopping, failed }: LaneRules): Lanes;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=lanes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lanes.d.ts","sourceRoot":"","sources":["../../src/socket/lanes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;AAEjC,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CAAA;CAAE,CAAC;AAIzD,KAAK,SAAS,GAAG;IACf,UAAU,IAAI,MAAM,CAAC;IACrB,UAAU,IAAI,OAAO,CAAC;IACtB,QAAQ,IAAI,OAAO,CAAC;IACpB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,QAAQ,IAAI,MAAM,CAAC;IACnB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5B,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAClD,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACrD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAClD,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;CACvC,CAAC;AAIF,wBAAgB,WAAW,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,SAAS,GAAG,KAAK,CAqG1F"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
const ROOM_READS = 256;
|
|
2
|
+
export function createLanes({ generation, continuing, stopping, failed }) {
|
|
3
|
+
const lanes = new Map();
|
|
4
|
+
const roomLanes = new Map();
|
|
5
|
+
const roomReads = { free: ROOM_READS, waiting: [] };
|
|
6
|
+
const working = new Set();
|
|
7
|
+
const senders = new Map();
|
|
8
|
+
const settlements = new Map();
|
|
9
|
+
const unclaimed = new Set();
|
|
10
|
+
let roomWork = 0;
|
|
11
|
+
async function admittedRead(work) {
|
|
12
|
+
while (roomReads.free === 0) {
|
|
13
|
+
await new Promise((admit) => roomReads.waiting.push(admit));
|
|
14
|
+
}
|
|
15
|
+
roomReads.free -= 1;
|
|
16
|
+
try {
|
|
17
|
+
await work();
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
roomReads.free += 1;
|
|
21
|
+
roomReads.waiting.shift()?.();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function inRoom(locator, work) {
|
|
25
|
+
roomWork += 1;
|
|
26
|
+
const ran = (roomLanes.get(locator) ?? Promise.resolve()).then(async () => {
|
|
27
|
+
try {
|
|
28
|
+
return await work(continuing);
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
roomWork -= 1;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
const chain = ran.then(() => undefined, () => undefined);
|
|
35
|
+
roomLanes.set(locator, chain);
|
|
36
|
+
working.add(chain);
|
|
37
|
+
void chain.finally(() => {
|
|
38
|
+
working.delete(chain);
|
|
39
|
+
if (roomLanes.get(locator) === chain)
|
|
40
|
+
roomLanes.delete(locator);
|
|
41
|
+
});
|
|
42
|
+
return ran;
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
task(lane, work) {
|
|
46
|
+
if (stopping())
|
|
47
|
+
return Promise.resolve();
|
|
48
|
+
const held = lanes.get(lane);
|
|
49
|
+
const opened = generation();
|
|
50
|
+
const current = held?.generation === opened ? held : { generation: opened, chain: Promise.resolve() };
|
|
51
|
+
const turn = current.generation;
|
|
52
|
+
const live = () => turn === generation() && continuing();
|
|
53
|
+
const run = current.chain.then(() => work(live)).catch(() => undefined);
|
|
54
|
+
current.chain = run;
|
|
55
|
+
lanes.set(lane, current);
|
|
56
|
+
working.add(run);
|
|
57
|
+
void run.finally(() => working.delete(run));
|
|
58
|
+
return run;
|
|
59
|
+
},
|
|
60
|
+
inRoom,
|
|
61
|
+
roomTask(locator, work) {
|
|
62
|
+
if (stopping())
|
|
63
|
+
return Promise.resolve();
|
|
64
|
+
return inRoom(locator, (live) => admittedRead(() => work(live))).catch((error) => {
|
|
65
|
+
if (!stopping())
|
|
66
|
+
failed(locator, error);
|
|
67
|
+
});
|
|
68
|
+
},
|
|
69
|
+
roomWork: () => roomWork,
|
|
70
|
+
current: () => Promise.all([...lanes.values()]
|
|
71
|
+
.filter((held) => held.generation === generation())
|
|
72
|
+
.map((held) => held.chain)),
|
|
73
|
+
finished: () => Promise.all(working),
|
|
74
|
+
sender: (operation) => senders.get(operation),
|
|
75
|
+
sending(operation, sender) {
|
|
76
|
+
senders.set(operation, sender);
|
|
77
|
+
},
|
|
78
|
+
sent(operation, sender) {
|
|
79
|
+
if (senders.get(operation) === sender)
|
|
80
|
+
senders.delete(operation);
|
|
81
|
+
},
|
|
82
|
+
settled(operation) {
|
|
83
|
+
if (unclaimed.delete(operation))
|
|
84
|
+
return Promise.resolve();
|
|
85
|
+
return new Promise((settle) => {
|
|
86
|
+
const earlier = settlements.get(operation);
|
|
87
|
+
settlements.set(operation, () => {
|
|
88
|
+
earlier?.();
|
|
89
|
+
settle();
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
settle(operation, lost) {
|
|
94
|
+
const settle = settlements.get(operation);
|
|
95
|
+
settlements.delete(operation);
|
|
96
|
+
if (settle !== undefined)
|
|
97
|
+
settle();
|
|
98
|
+
else if (lost)
|
|
99
|
+
unclaimed.add(operation);
|
|
100
|
+
},
|
|
101
|
+
unclaimed: (operation) => unclaimed.has(operation),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Adapter } from '../adapter.js';
|
|
2
|
+
import type { Reads } from '../bootstrap.js';
|
|
3
|
+
type HeldReads = {
|
|
4
|
+
readonly reads: Reads;
|
|
5
|
+
abort(): void;
|
|
6
|
+
stop(): void;
|
|
7
|
+
};
|
|
8
|
+
export declare function createReads(adapter: Adapter): HeldReads;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=reads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reads.d.ts","sourceRoot":"","sources":["../../src/socket/reads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAiD,MAAM,eAAe,CAAC;AAC5F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,KAAK,SAAS,GAAG;IACf,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;CACd,CAAC;AAWF,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAuBvD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
function readUntil(read, signal) {
|
|
2
|
+
if (signal.aborted)
|
|
3
|
+
return Promise.resolve({ kind: 'transport-uncertainty' });
|
|
4
|
+
return new Promise((resolve, reject) => {
|
|
5
|
+
const stop = () => resolve({ kind: 'transport-uncertainty' });
|
|
6
|
+
signal.addEventListener('abort', stop, { once: true });
|
|
7
|
+
read.then(resolve, reject).finally(() => signal.removeEventListener('abort', stop));
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export function createReads(adapter) {
|
|
11
|
+
let inFlight = new AbortController();
|
|
12
|
+
const refreshed = adapter.refresh?.bind(adapter);
|
|
13
|
+
return {
|
|
14
|
+
reads: {
|
|
15
|
+
bootstrap: (authorized, request) => readUntil(adapter.bootstrap(authorized, request), inFlight.signal),
|
|
16
|
+
...(refreshed === undefined
|
|
17
|
+
? {}
|
|
18
|
+
: {
|
|
19
|
+
refresh: (authorized, request) => readUntil(refreshed(authorized, request), inFlight.signal),
|
|
20
|
+
}),
|
|
21
|
+
reached: (locator, roomVersion, target) => adapter.reached(locator, roomVersion, target),
|
|
22
|
+
},
|
|
23
|
+
abort() {
|
|
24
|
+
inFlight.abort();
|
|
25
|
+
inFlight = new AbortController();
|
|
26
|
+
},
|
|
27
|
+
stop() {
|
|
28
|
+
inFlight.abort();
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Authorization, ProviderRefusal, ServiceMode } from '../adapter.js';
|
|
2
|
+
import { type Cell } from '../cell.js';
|
|
3
|
+
import type { Open } from '../open.js';
|
|
4
|
+
import type { CycleProgress, SyncStatus } from '../status.js';
|
|
5
|
+
export type RefusalReason = 'missing-required-guarantee' | 'revoked-authorization';
|
|
6
|
+
export type ConnectionRefusalCode = Open<RefusalReason>;
|
|
7
|
+
export type ConnectionRefusal = {
|
|
8
|
+
code: ConnectionRefusalCode;
|
|
9
|
+
reauthorizationOffered: boolean;
|
|
10
|
+
refusal: ProviderRefusal | null;
|
|
11
|
+
};
|
|
12
|
+
export type Moving = {
|
|
13
|
+
readonly state: SyncStatus['state'];
|
|
14
|
+
readonly providerUnreachable: boolean;
|
|
15
|
+
readonly resting: boolean;
|
|
16
|
+
};
|
|
17
|
+
export type Session = {
|
|
18
|
+
readonly closed: boolean;
|
|
19
|
+
readonly stopping: boolean;
|
|
20
|
+
readonly paused: boolean;
|
|
21
|
+
readonly authorization: Authorization | undefined;
|
|
22
|
+
readonly refusal: ConnectionRefusal | null;
|
|
23
|
+
readonly discoveries: number;
|
|
24
|
+
readonly roomsNamed: boolean;
|
|
25
|
+
readonly roomsListed: boolean;
|
|
26
|
+
readonly serviceMode: ServiceMode;
|
|
27
|
+
readonly haltedRefusal: boolean;
|
|
28
|
+
readonly openSignals: number;
|
|
29
|
+
readonly authorityChanges: number;
|
|
30
|
+
readonly currencyQueued: number | null;
|
|
31
|
+
readonly moving: Moving;
|
|
32
|
+
readonly complete: boolean;
|
|
33
|
+
readonly recorded: boolean;
|
|
34
|
+
readonly underway: CycleProgress | null;
|
|
35
|
+
readonly streamed: CycleProgress | null;
|
|
36
|
+
};
|
|
37
|
+
export declare function createSession(authorization: Authorization | undefined): Cell<Session>;
|
|
38
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/socket/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAc,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,MAAM,aAAa,GAAG,4BAA4B,GAAG,uBAAuB,CAAC;AAEnF,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;AAExD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,sBAAsB,EAAE,OAAO,CAAC;IAChC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACpC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;CACzC,CAAC;AAEF,wBAAgB,aAAa,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,CAqBrF"}
|