@agentshouse/mdruntime 0.1.0-cd50a4607cb7d → 0.1.0-cd71aba4d0215
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -16
- package/dist/acceptance.d.ts +3 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +318 -0
- 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 +25 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +261 -0
- package/dist/adapter.d.ts +175 -116
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +7 -10
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +40 -41
- 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 +31 -11
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +309 -109
- 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 -88
- package/dist/change.d.ts +32 -1
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +14 -3
- package/dist/chat-types.d.ts +5 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +13 -0
- package/dist/client.d.ts +41 -19
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +129 -25
- package/dist/collection.d.ts +29 -21
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +48 -290
- package/dist/compile.d.ts +16 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +711 -0
- package/dist/connection.d.ts +7 -118
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +111 -2972
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/{chat/context.js → context.js} +1 -4
- 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 +33 -0
- package/dist/conversation-row.d.ts.map +1 -0
- package/dist/conversation-row.js +53 -0
- package/dist/conversation.d.ts +72 -47
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +1036 -690
- 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 +153 -0
- package/dist/durability.d.ts +22 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -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 +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 +49 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +197 -0
- package/dist/file.d.ts +2 -19
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +7 -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 +26 -4
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +161 -25
- 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 +39 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -2
- package/dist/install.d.ts +54 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +539 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +279 -0
- package/dist/listing.d.ts +48 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +139 -0
- package/dist/live.d.ts +23 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +165 -0
- package/dist/locks.d.ts +7 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +33 -0
- package/dist/log.d.ts +1 -0
- package/dist/log.d.ts.map +1 -1
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +50 -0
- package/dist/media.d.ts +8 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +218 -0
- package/dist/memory.d.ts +22 -7
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +278 -110
- package/dist/messages.d.ts +49 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +150 -0
- package/dist/model.d.ts +11 -13
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +7 -24
- package/dist/models.d.ts +10 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +156 -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 +17 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +107 -17
- 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 +59 -0
- package/dist/outcome.d.ts +52 -8
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +57 -0
- package/dist/overlay.d.ts +5 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +127 -166
- 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 +11 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +21 -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 +20 -0
- package/dist/preparation.d.ts.map +1 -0
- package/dist/preparation.js +233 -0
- 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 +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +270 -0
- package/dist/query.d.ts +27 -186
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -464
- package/dist/{chat/questions.d.ts → questions.d.ts} +5 -2
- package/dist/questions.d.ts.map +1 -0
- package/dist/{chat/questions.js → questions.js} +13 -2
- 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 +21 -7
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +315 -96
- package/dist/react.d.ts +25 -4
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +22 -18
- 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 +49 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +27 -0
- package/dist/reads.d.ts +39 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +178 -0
- 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 +17 -14
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +145 -54
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +57 -0
- package/dist/replica.d.ts +50 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +338 -189
- 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 +39 -10
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +186 -115
- package/dist/room-drafts.d.ts +24 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +217 -0
- package/dist/rows.d.ts +31 -29
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +60 -118
- package/dist/runtime.d.ts +36 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +42 -48
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +715 -248
- package/dist/saves.d.ts +32 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +413 -0
- package/dist/search.d.ts +15 -77
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +10 -186
- package/dist/seed.d.ts +25 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +145 -0
- 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 +32 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +290 -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 +21 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +80 -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 +68 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +171 -0
- package/dist/source.d.ts +61 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +82 -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 +34 -0
- package/dist/store/readiness.d.ts +10 -0
- package/dist/store/readiness.d.ts.map +1 -0
- package/dist/store/readiness.js +52 -0
- package/dist/store/records.d.ts +212 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +430 -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/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 +111 -142
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +159 -687
- package/dist/stored.d.ts +156 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +649 -0
- package/dist/surface.d.ts +88 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +223 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +540 -0
- package/dist/tables.d.ts +412 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +737 -0
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +129 -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 +104 -0
- package/dist/windows.d.ts +11 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +16 -0
- package/dist/wire.d.ts +220 -36
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +73 -33
- package/package.json +19 -19
- package/AGENTS.md +0 -296
- 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/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 -60
- 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 -26
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -62
- 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 -21
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -151
- 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 -620
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -80
- 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 -33
- 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/read-side.d.ts +0 -25
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -639
package/dist/observation.js
CHANGED
|
@@ -19,12 +19,18 @@ export function applied(keyed, message) {
|
|
|
19
19
|
for (const [key, row] of message.changed)
|
|
20
20
|
byKey.set(key, row);
|
|
21
21
|
const keys = message.order ?? keyed.keys.filter((key) => byKey.has(key));
|
|
22
|
-
const
|
|
22
|
+
const kept = keys.map((key) => byKey.get(key));
|
|
23
23
|
const coverage = message.coverage ?? result.coverage;
|
|
24
|
+
const next = message.next === undefined ? result.next : (message.next ?? undefined);
|
|
25
|
+
const total = message.total ?? result.total;
|
|
26
|
+
const window = {
|
|
27
|
+
...(next === undefined ? {} : { next }),
|
|
28
|
+
...(total === undefined ? {} : { total }),
|
|
29
|
+
};
|
|
24
30
|
return {
|
|
25
31
|
result: 'groups' in result
|
|
26
|
-
? { groups:
|
|
27
|
-
: { documents:
|
|
32
|
+
? { groups: kept, coverage, ...window }
|
|
33
|
+
: { documents: kept, coverage, ...window },
|
|
28
34
|
keys,
|
|
29
35
|
};
|
|
30
36
|
}
|
|
@@ -84,23 +90,107 @@ export function opened(watch, keyed) {
|
|
|
84
90
|
return new Promise((resolve, reject) => {
|
|
85
91
|
let handle;
|
|
86
92
|
let stop = () => { };
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
93
|
+
stop = watch((message) => {
|
|
94
|
+
if (handle !== undefined) {
|
|
95
|
+
handle.receive(message);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
handle = observed(message, () => stop(), keyed);
|
|
99
|
+
resolve(handle.observation);
|
|
100
|
+
}, (error) => {
|
|
101
|
+
if (handle !== undefined)
|
|
102
|
+
return;
|
|
103
|
+
stop();
|
|
98
104
|
reject(error);
|
|
99
|
-
}
|
|
105
|
+
});
|
|
100
106
|
});
|
|
101
107
|
}
|
|
102
108
|
export function observing(watch) {
|
|
103
|
-
return (topic, ...input) => opened((deliver) => watch(topic, input, (message) => {
|
|
109
|
+
return (topic, ...input) => opened((deliver, fail) => watch(topic, input, (message) => {
|
|
104
110
|
deliver(structuredClone(message));
|
|
105
|
-
}), topic === 'query');
|
|
111
|
+
}, fail), topic === 'query');
|
|
112
|
+
}
|
|
113
|
+
export function hashed(text) {
|
|
114
|
+
let first = 0xdeadbeef;
|
|
115
|
+
let second = 0x41c6ce57;
|
|
116
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
117
|
+
const code = text.charCodeAt(index);
|
|
118
|
+
first = Math.imul(first ^ code, 2654435761);
|
|
119
|
+
second = Math.imul(second ^ code, 1597334677);
|
|
120
|
+
}
|
|
121
|
+
first =
|
|
122
|
+
Math.imul(first ^ (first >>> 16), 2246822507) ^ Math.imul(second ^ (second >>> 13), 3266489909);
|
|
123
|
+
second =
|
|
124
|
+
Math.imul(second ^ (second >>> 16), 2246822507) ^ Math.imul(first ^ (first >>> 13), 3266489909);
|
|
125
|
+
return 4294967296 * (2097151 & second) + (first >>> 0);
|
|
126
|
+
}
|
|
127
|
+
function rowDigest(row) {
|
|
128
|
+
return hashed(JSON.stringify(row));
|
|
129
|
+
}
|
|
130
|
+
export function digestOf({ result, keys }) {
|
|
131
|
+
if ('pending' in result)
|
|
132
|
+
return { pending: JSON.stringify(result) };
|
|
133
|
+
const rows = rowsOf(result);
|
|
134
|
+
return {
|
|
135
|
+
keys,
|
|
136
|
+
rows: new Map(keys.map((key, index) => [key, rowDigest(rows[index])])),
|
|
137
|
+
coverage: JSON.stringify(result.coverage),
|
|
138
|
+
next: result.next,
|
|
139
|
+
total: result.total,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
export function digestApplied(digest, message) {
|
|
143
|
+
if (whole(message) || 'pending' in digest)
|
|
144
|
+
return whole(message) ? digestOf(message) : digest;
|
|
145
|
+
const rows = new Map(digest.rows);
|
|
146
|
+
for (const key of message.removed)
|
|
147
|
+
rows.delete(key);
|
|
148
|
+
for (const [key, row] of message.changed)
|
|
149
|
+
rows.set(key, rowDigest(row));
|
|
150
|
+
return {
|
|
151
|
+
keys: message.order ?? digest.keys.filter((key) => rows.has(key)),
|
|
152
|
+
rows,
|
|
153
|
+
coverage: message.coverage === undefined ? digest.coverage : JSON.stringify(message.coverage),
|
|
154
|
+
next: message.next === undefined ? digest.next : (message.next ?? undefined),
|
|
155
|
+
total: message.total ?? digest.total,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
export function changeOf(previous, next) {
|
|
159
|
+
const after = next.result;
|
|
160
|
+
if ('pending' in previous || 'pending' in after) {
|
|
161
|
+
return 'pending' in previous && 'pending' in after && previous.pending === JSON.stringify(after)
|
|
162
|
+
? null
|
|
163
|
+
: next;
|
|
164
|
+
}
|
|
165
|
+
const later = rowsOf(after);
|
|
166
|
+
const present = new Set(next.keys);
|
|
167
|
+
const changed = [];
|
|
168
|
+
next.keys.forEach((key, index) => {
|
|
169
|
+
const row = later[index];
|
|
170
|
+
if (previous.rows.get(key) !== rowDigest(row))
|
|
171
|
+
changed.push([key, row]);
|
|
172
|
+
});
|
|
173
|
+
const removed = previous.keys.filter((key) => !present.has(key));
|
|
174
|
+
const kept = previous.keys.filter((key) => present.has(key));
|
|
175
|
+
const moved = kept.length !== next.keys.length || kept.some((key, index) => next.keys[index] !== key);
|
|
176
|
+
const coverage = JSON.stringify(after.coverage);
|
|
177
|
+
const covered = previous.coverage !== coverage;
|
|
178
|
+
const framing = reframed(previous, after);
|
|
179
|
+
if (changed.length === 0 && removed.length === 0 && !moved && !covered && framing === null) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
changed,
|
|
184
|
+
removed,
|
|
185
|
+
order: moved ? next.keys : null,
|
|
186
|
+
...(covered ? { coverage: after.coverage } : {}),
|
|
187
|
+
...framing,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function reframed(before, after) {
|
|
191
|
+
const next = before.next === after.next ? {} : { next: after.next ?? null };
|
|
192
|
+
const total = before.total === after.total || after.total === undefined ? {} : { total: after.total };
|
|
193
|
+
return Object.keys(next).length === 0 && Object.keys(total).length === 0
|
|
194
|
+
? null
|
|
195
|
+
: { ...next, ...total };
|
|
106
196
|
}
|
package/dist/opened.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { BinaryResult } from './adapter.js';
|
|
2
|
+
import { type RuntimeDatabase } from './tables.js';
|
|
3
|
+
export type OpenedName = {
|
|
4
|
+
readonly locator: string;
|
|
5
|
+
readonly path: string;
|
|
6
|
+
readonly revision: string;
|
|
7
|
+
};
|
|
8
|
+
export type KeptBinary = {
|
|
9
|
+
readonly kind: 'binary';
|
|
10
|
+
readonly file: string;
|
|
11
|
+
readonly byteLength: number;
|
|
12
|
+
readonly mediaType: string;
|
|
13
|
+
};
|
|
14
|
+
export type KeptResult = KeptBinary | Exclude<BinaryResult, {
|
|
15
|
+
kind: 'binary';
|
|
16
|
+
}>;
|
|
17
|
+
export type OpenedFiles = {
|
|
18
|
+
find(name: OpenedName): Promise<KeptBinary | null>;
|
|
19
|
+
fetch(name: OpenedName, read: () => Promise<BinaryResult>): Promise<KeptResult>;
|
|
20
|
+
};
|
|
21
|
+
export declare function openedFiles(database: RuntimeDatabase, lost: (locator: string) => boolean): OpenedFiles;
|
|
22
|
+
//# sourceMappingURL=opened.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opened.d.ts","sourceRoot":"","sources":["../src/opened.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAoC,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAC;AAEhF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACjF,CAAC;AAsBF,wBAAgB,WAAW,CACzB,QAAQ,EAAE,eAAe,EACzB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GACjC,WAAW,CAsFb"}
|
package/dist/opened.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { digest } from './digest.js';
|
|
2
|
+
import { binaryLocalId } from './identity.js';
|
|
3
|
+
import { FILE_PART_BYTES } from './tables.js';
|
|
4
|
+
const UNCERTAIN = { kind: 'transport-uncertainty' };
|
|
5
|
+
function kept({ key, byteLength, mediaType }) {
|
|
6
|
+
return { kind: 'binary', file: key, byteLength, mediaType };
|
|
7
|
+
}
|
|
8
|
+
function taken(chunks, size) {
|
|
9
|
+
const part = new Uint8Array(size);
|
|
10
|
+
let at = 0;
|
|
11
|
+
while (at < size) {
|
|
12
|
+
const chunk = chunks[0];
|
|
13
|
+
const wanted = Math.min(chunk.length, size - at);
|
|
14
|
+
part.set(chunk.subarray(0, wanted), at);
|
|
15
|
+
at += wanted;
|
|
16
|
+
if (wanted === chunk.length)
|
|
17
|
+
chunks.shift();
|
|
18
|
+
else
|
|
19
|
+
chunks[0] = chunk.subarray(wanted);
|
|
20
|
+
}
|
|
21
|
+
return part;
|
|
22
|
+
}
|
|
23
|
+
export function openedFiles(database, lost) {
|
|
24
|
+
const fetching = new Map();
|
|
25
|
+
async function find(name) {
|
|
26
|
+
const held = await database.ask({ kind: 'opened.find', ...name });
|
|
27
|
+
return held === null ? null : kept(held);
|
|
28
|
+
}
|
|
29
|
+
async function written(name, { body, mediaType, sha256 }) {
|
|
30
|
+
const key = binaryLocalId();
|
|
31
|
+
const reader = body.getReader();
|
|
32
|
+
const hashed = digest();
|
|
33
|
+
const chunks = [];
|
|
34
|
+
let held = 0;
|
|
35
|
+
let size = 0;
|
|
36
|
+
let part = 0;
|
|
37
|
+
const write = async (bytes) => {
|
|
38
|
+
if (!(await database.ask({ kind: 'opened.part', key, part, bytes }))) {
|
|
39
|
+
throw new Error();
|
|
40
|
+
}
|
|
41
|
+
part += 1;
|
|
42
|
+
};
|
|
43
|
+
try {
|
|
44
|
+
if (lost(name.locator) ||
|
|
45
|
+
!(await database.ask({ kind: 'opened.begin', key, ...name, mediaType }))) {
|
|
46
|
+
throw new Error();
|
|
47
|
+
}
|
|
48
|
+
for (;;) {
|
|
49
|
+
const read = await reader.read();
|
|
50
|
+
if (read.done)
|
|
51
|
+
break;
|
|
52
|
+
hashed.update(read.value);
|
|
53
|
+
size += read.value.length;
|
|
54
|
+
chunks.push(read.value);
|
|
55
|
+
held += read.value.length;
|
|
56
|
+
for (; held >= FILE_PART_BYTES; held -= FILE_PART_BYTES) {
|
|
57
|
+
await write(taken(chunks, FILE_PART_BYTES));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (held > 0)
|
|
61
|
+
await write(taken(chunks, held));
|
|
62
|
+
const received = hashed.hex();
|
|
63
|
+
if (sha256 !== undefined && sha256 !== received) {
|
|
64
|
+
throw new Error();
|
|
65
|
+
}
|
|
66
|
+
const whole = await database.ask({
|
|
67
|
+
kind: 'opened.keep',
|
|
68
|
+
key,
|
|
69
|
+
sha256: received,
|
|
70
|
+
byteLength: size,
|
|
71
|
+
parts: part,
|
|
72
|
+
});
|
|
73
|
+
return whole ? { kind: 'binary', file: key, byteLength: size, mediaType } : null;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
await reader.cancel().catch(() => { });
|
|
77
|
+
await database.ask({ kind: 'opened.drop', key }).catch(() => null);
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function fetched(name, read) {
|
|
82
|
+
const held = await find(name);
|
|
83
|
+
if (held !== null)
|
|
84
|
+
return held;
|
|
85
|
+
const result = await read();
|
|
86
|
+
if (result.kind !== 'binary')
|
|
87
|
+
return result;
|
|
88
|
+
return (await written(name, result)) ?? UNCERTAIN;
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
find,
|
|
92
|
+
fetch(name, read) {
|
|
93
|
+
const identity = `${name.locator}\u0000${name.path}\u0000${name.revision}`;
|
|
94
|
+
const held = fetching.get(identity);
|
|
95
|
+
if (held !== undefined)
|
|
96
|
+
return held;
|
|
97
|
+
const work = fetched(name, read);
|
|
98
|
+
fetching.set(identity, work);
|
|
99
|
+
const done = () => {
|
|
100
|
+
if (fetching.get(identity) === work)
|
|
101
|
+
fetching.delete(identity);
|
|
102
|
+
};
|
|
103
|
+
work.then(done, done);
|
|
104
|
+
return work;
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opening.d.ts","sourceRoot":"","sources":["../src/opening.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CA2CxF"}
|
package/dist/opening.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { conversationsOpened } from './conversation.js';
|
|
2
|
+
import { detectStorageLoss, nextGeneration, refusedForSpace } from './durability.js';
|
|
3
|
+
import { uncaught } from './failure.js';
|
|
4
|
+
import { sweep } from './install.js';
|
|
5
|
+
import { eraseFenced } from './lost.js';
|
|
6
|
+
import { prepare } from './preparation.js';
|
|
7
|
+
import { unpair } from './queue.js';
|
|
8
|
+
import { emitRooms, emitStorageLoss, statusShown } from './shown.js';
|
|
9
|
+
export async function open(runtime, opened) {
|
|
10
|
+
const { store, socket, journal, shell, conversations, build, usableWhenHeld } = runtime;
|
|
11
|
+
if (socket.closed())
|
|
12
|
+
throw new Error('runtime closed');
|
|
13
|
+
const interrupted = await opened.fences();
|
|
14
|
+
const kept = shell.generation;
|
|
15
|
+
const storedGeneration = await opened.generation();
|
|
16
|
+
const loss = detectStorageLoss(storedGeneration, kept);
|
|
17
|
+
const generation = nextGeneration(storedGeneration, kept);
|
|
18
|
+
if (generation !== storedGeneration)
|
|
19
|
+
await opened.rememberGeneration(generation);
|
|
20
|
+
if (generation !== kept)
|
|
21
|
+
await shell.keepGeneration(generation);
|
|
22
|
+
if (loss !== null) {
|
|
23
|
+
store.device.set({ storageLoss: loss });
|
|
24
|
+
emitStorageLoss(runtime);
|
|
25
|
+
}
|
|
26
|
+
const held = await opened.opened();
|
|
27
|
+
store.device.set({
|
|
28
|
+
heldWhenOpened: usableWhenHeld.length > 0 && (await opened.covering()).rooms.size > 0,
|
|
29
|
+
});
|
|
30
|
+
try {
|
|
31
|
+
await opened.demote();
|
|
32
|
+
await store.ask({ kind: 'read.builds', build });
|
|
33
|
+
for (const key of held.orphans)
|
|
34
|
+
await opened.release(key);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (!refusedForSpace(error))
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
if (held.erasing || held.orphans.length > 0)
|
|
41
|
+
queueMicrotask(() => sweep(runtime));
|
|
42
|
+
await conversationsOpened(conversations, opened);
|
|
43
|
+
if (interrupted.length > 0) {
|
|
44
|
+
queueMicrotask(() => {
|
|
45
|
+
void eraseFenced(runtime, interrupted).catch((error) => {
|
|
46
|
+
journal.record('erasure failed');
|
|
47
|
+
uncaught(error);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
statusShown(runtime);
|
|
52
|
+
prepare(runtime);
|
|
53
|
+
emitRooms(runtime);
|
|
54
|
+
void unpair(runtime).catch((error) => {
|
|
55
|
+
journal.record('unpair failed');
|
|
56
|
+
uncaught(error);
|
|
57
|
+
});
|
|
58
|
+
return opened;
|
|
59
|
+
}
|
package/dist/outcome.d.ts
CHANGED
|
@@ -1,29 +1,74 @@
|
|
|
1
|
-
import type { ActionResult, AdapterFailure,
|
|
1
|
+
import type { ActionResult, AdapterFailure, AttachResult, BinaryLinkResult, HistoryResult, HistoryRevision, ProviderRefusal, RoomVersionAt, ScopedRefusal } from './adapter.js';
|
|
2
2
|
import type { ChangeBatch } from './change.js';
|
|
3
|
+
import type { Attempt, Retries } from './retried.js';
|
|
4
|
+
import type { KeptBinary, KeptResult } from './opened.js';
|
|
3
5
|
type Refused<Kind extends string> = ProviderRefusal & {
|
|
4
6
|
kind: Kind;
|
|
5
7
|
};
|
|
6
8
|
export type Failure = Refused<'transport-uncertainty'> | Refused<'revoked-authorization'> | (Refused<'room-not-readable'> & {
|
|
7
9
|
locator: string;
|
|
10
|
+
}) | (Refused<'room-locked'> & {
|
|
11
|
+
locator: string;
|
|
8
12
|
}) | ScopedRefusal;
|
|
9
13
|
export type CallResult = {
|
|
10
14
|
kind: 'action';
|
|
11
15
|
result: unknown;
|
|
12
16
|
at?: RoomVersionAt;
|
|
13
|
-
} | Refused<'rejected'>
|
|
17
|
+
} | (Refused<'rejected'> & {
|
|
18
|
+
reset?: string;
|
|
19
|
+
}) | Refused<'undeclared'> | Failure;
|
|
14
20
|
export type HistoryAnswer = Exclude<HistoryResult, {
|
|
15
21
|
kind: Failure['kind'];
|
|
16
22
|
}> | Failure;
|
|
23
|
+
type BinaryRefusal = Refused<'rejected'> | Refused<'absent'> | Failure;
|
|
17
24
|
export type BinaryAnswer = {
|
|
18
25
|
kind: 'binary';
|
|
19
|
-
|
|
26
|
+
stream: ReadableStream<Uint8Array>;
|
|
27
|
+
byteLength: number;
|
|
28
|
+
mediaType: string;
|
|
29
|
+
} | BinaryRefusal;
|
|
30
|
+
export type HeldBinaryAnswer = KeptBinary | BinaryRefusal;
|
|
31
|
+
export type BinaryLinkAnswer = {
|
|
32
|
+
kind: 'link';
|
|
33
|
+
url: string;
|
|
34
|
+
name: string;
|
|
35
|
+
mediaType: string;
|
|
20
36
|
} | Refused<'rejected'> | Refused<'absent'> | Failure;
|
|
21
|
-
export
|
|
22
|
-
export
|
|
37
|
+
export type HeldShownAnswer = KeptBinary | BinaryLinkAnswer;
|
|
38
|
+
export type ShownAnswer = BinaryAnswer | BinaryLinkAnswer;
|
|
39
|
+
export type AttachAnswer = {
|
|
40
|
+
kind: 'attached';
|
|
41
|
+
path: string;
|
|
42
|
+
} | Offline | Refused<'rejected'> | Failure;
|
|
43
|
+
export type DownloadAnswer = {
|
|
44
|
+
kind: 'started';
|
|
45
|
+
} | Refused<'rejected'> | Refused<'absent'> | Refused<'blocked'> | Failure;
|
|
46
|
+
export type Resolution = {
|
|
47
|
+
readonly kind: 'document';
|
|
48
|
+
readonly room: string;
|
|
49
|
+
readonly path: string;
|
|
50
|
+
} | {
|
|
51
|
+
readonly kind: 'deleted';
|
|
52
|
+
readonly room: string;
|
|
53
|
+
readonly path: string;
|
|
54
|
+
readonly revision: HistoryRevision;
|
|
55
|
+
} | Refused<'unreadable'> | Refused<'absent'> | Failure;
|
|
56
|
+
export declare const UNREADABLE: Refused<'unreadable'>;
|
|
57
|
+
export declare const LOCKED_UNREADABLE: Refused<'unreadable'>;
|
|
58
|
+
export declare const ABSENT_TARGET: Refused<'absent'>;
|
|
59
|
+
export declare function absentBinary(path: string): Refused<'absent'>;
|
|
60
|
+
export declare function binaryAnswer(result: KeptResult): HeldBinaryAnswer;
|
|
61
|
+
export declare function binaryLinkAnswer(result: BinaryLinkResult, held?: string): BinaryLinkAnswer;
|
|
62
|
+
export declare function attachAnswer(result: AttachResult): AttachAnswer;
|
|
63
|
+
export declare const ROOM_LOCKED = "room-locked";
|
|
64
|
+
export declare function lockedRoom(locator: string): Refused<'room-locked'> & {
|
|
65
|
+
locator: string;
|
|
66
|
+
};
|
|
23
67
|
export type Offline = {
|
|
24
68
|
readonly kind: 'offline';
|
|
25
69
|
};
|
|
26
70
|
export declare const OFFLINE: Offline;
|
|
71
|
+
export declare function answeredResult(value: unknown): boolean;
|
|
27
72
|
export declare const UNCERTAIN: Failure;
|
|
28
73
|
export declare function undeclared(name: string): CallResult;
|
|
29
74
|
export declare function failure(result: AdapterFailure): Failure;
|
|
@@ -39,9 +84,8 @@ export type QueueEntry = {
|
|
|
39
84
|
readonly batch: ChangeBatch;
|
|
40
85
|
} & (Submission | {
|
|
41
86
|
readonly state: 'local';
|
|
42
|
-
} | {
|
|
43
|
-
readonly state: 'accepted';
|
|
44
|
-
readonly roomVersion: string;
|
|
45
87
|
});
|
|
88
|
+
export declare const UNANSWERED: ActionResult;
|
|
89
|
+
export declare function handedOutcome(retries: Retries, attempt: Attempt | undefined, result: ActionResult): CallResult;
|
|
46
90
|
export {};
|
|
47
91
|
//# sourceMappingURL=outcome.d.ts.map
|
package/dist/outcome.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../src/outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,aAAa,EACb,eAAe,EACf,aAAa,EACb,aAAa,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,KAAK,OAAO,CAAC,IAAI,SAAS,MAAM,IAAI,eAAe,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,OAAO,GACf,OAAO,CAAC,uBAAuB,CAAC,GAChC,OAAO,CAAC,uBAAuB,CAAC,GAChC,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACpD,aAAa,CAAC;AAElB,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,aAAa,CAAA;CAAE,GACvD,OAAO,CAAC,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../src/outcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,eAAe,EACf,aAAa,EACb,aAAa,EACd,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE1D,KAAK,OAAO,CAAC,IAAI,SAAS,MAAM,IAAI,eAAe,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC;AAErE,MAAM,MAAM,OAAO,GACf,OAAO,CAAC,uBAAuB,CAAC,GAChC,OAAO,CAAC,uBAAuB,CAAC,GAChC,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACpD,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAC9C,aAAa,CAAC;AAElB,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,aAAa,CAAA;CAAE,GACvD,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC1C,OAAO,CAAC,YAAY,CAAC,GACrB,OAAO,CAAC;AAEZ,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC,GAAG,OAAO,CAAC;AAExF,KAAK,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;AAEvE,MAAM,MAAM,YAAY,GACpB;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,GACD,aAAa,CAAC;AAElB,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,aAAa,CAAC;AAE1D,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC9D,OAAO,CAAC,UAAU,CAAC,GACnB,OAAO,CAAC,QAAQ,CAAC,GACjB,OAAO,CAAC;AAEZ,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAE5D,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,gBAAgB,CAAC;AAE1D,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC,OAAO,GACP,OAAO,CAAC,UAAU,CAAC,GACnB,OAAO,CAAC;AAEZ,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB,OAAO,CAAC,UAAU,CAAC,GACnB,OAAO,CAAC,QAAQ,CAAC,GACjB,OAAO,CAAC,SAAS,CAAC,GAClB,OAAO,CAAC;AAEZ,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC3E;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;CACpC,GACD,OAAO,CAAC,YAAY,CAAC,GACrB,OAAO,CAAC,QAAQ,CAAC,GACjB,OAAO,CAAC;AAEZ,eAAO,MAAM,UAAU,EAAE,OAAO,CAAC,YAAY,CAK5C,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,YAAY,CAKnD,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,OAAO,CAAC,QAAQ,CAK3C,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAE5D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,gBAAgB,CAEjE;AAID,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAU1F;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAG/D;AAED,eAAO,MAAM,WAAW,gBAAgB,CAAC;AAEzC,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAExF;AAED,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAEnD,eAAO,MAAM,OAAO,EAAE,OAA6B,CAAC;AAEpD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEtD;AAED,eAAO,MAAM,SAAS,EAAE,OAKvB,CAAC;AAEF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAEnD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAiBvD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,CAE7D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAIlE;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAAA;CAAE,GAC3C;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAAG,CACvD,UAAU,GACV;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAC9B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,YAAgD,CAAC;AAE1E,wBAAgB,aAAa,CAC3B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GAAG,SAAS,EAC5B,MAAM,EAAE,YAAY,GACnB,UAAU,CAUZ"}
|
package/dist/outcome.js
CHANGED
|
@@ -1,10 +1,53 @@
|
|
|
1
|
+
import { refusalError } from './failure.js';
|
|
2
|
+
export const UNREADABLE = {
|
|
3
|
+
kind: 'unreadable',
|
|
4
|
+
code: 'room-not-readable',
|
|
5
|
+
fields: {},
|
|
6
|
+
retryable: false,
|
|
7
|
+
};
|
|
8
|
+
export const LOCKED_UNREADABLE = {
|
|
9
|
+
kind: 'unreadable',
|
|
10
|
+
code: 'room-locked',
|
|
11
|
+
fields: {},
|
|
12
|
+
retryable: true,
|
|
13
|
+
};
|
|
14
|
+
export const ABSENT_TARGET = {
|
|
15
|
+
kind: 'absent',
|
|
16
|
+
code: 'reference-absent',
|
|
17
|
+
fields: {},
|
|
18
|
+
retryable: false,
|
|
19
|
+
};
|
|
1
20
|
export function absentBinary(path) {
|
|
2
21
|
return { kind: 'absent', code: 'binary-file-absent', fields: { path }, retryable: false };
|
|
3
22
|
}
|
|
4
23
|
export function binaryAnswer(result) {
|
|
5
24
|
return result.kind === 'binary' || result.kind === 'rejected' ? result : failure(result);
|
|
6
25
|
}
|
|
26
|
+
const OCTET_STREAM = 'application/octet-stream';
|
|
27
|
+
export function binaryLinkAnswer(result, held) {
|
|
28
|
+
if (result.kind === 'link') {
|
|
29
|
+
return {
|
|
30
|
+
kind: 'link',
|
|
31
|
+
url: result.url,
|
|
32
|
+
name: result.name,
|
|
33
|
+
mediaType: result.mediaType ?? held ?? OCTET_STREAM,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return result.kind === 'rejected' ? result : failure(result);
|
|
37
|
+
}
|
|
38
|
+
export function attachAnswer(result) {
|
|
39
|
+
if (result.kind === 'attached')
|
|
40
|
+
return { kind: 'attached', path: result.path };
|
|
41
|
+
return result.kind === 'rejected' ? result : failure(result);
|
|
42
|
+
}
|
|
43
|
+
export const ROOM_LOCKED = 'room-locked';
|
|
44
|
+
export function lockedRoom(locator) {
|
|
45
|
+
return { kind: ROOM_LOCKED, locator, code: ROOM_LOCKED, fields: {}, retryable: true };
|
|
46
|
+
}
|
|
7
47
|
export const OFFLINE = { kind: 'offline' };
|
|
48
|
+
export function answeredResult(value) {
|
|
49
|
+
return typeof value === 'object' && value !== null && !('pending' in value);
|
|
50
|
+
}
|
|
8
51
|
export const UNCERTAIN = {
|
|
9
52
|
kind: 'transport-uncertainty',
|
|
10
53
|
code: 'transport-uncertainty',
|
|
@@ -40,3 +83,17 @@ export function historyAnswer(result) {
|
|
|
40
83
|
? result
|
|
41
84
|
: failure(result);
|
|
42
85
|
}
|
|
86
|
+
export const UNANSWERED = { kind: 'transport-uncertainty' };
|
|
87
|
+
export function handedOutcome(retries, attempt, result) {
|
|
88
|
+
if (attempt !== undefined) {
|
|
89
|
+
const { step, instance } = attempt;
|
|
90
|
+
if (result.kind === 'action')
|
|
91
|
+
retries.succeeded(step, instance);
|
|
92
|
+
else if (result.kind === 'transport-uncertainty')
|
|
93
|
+
retries.uncertain(step, instance, result);
|
|
94
|
+
else if (result.kind === 'rejected' && result.retryable) {
|
|
95
|
+
retries.failed(step, instance, refusalError(result));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return calledResult(result);
|
|
99
|
+
}
|
package/dist/overlay.d.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { BinaryFile, HeadChange } from './adapter.js';
|
|
2
|
+
import { type Composition } from './collection.js';
|
|
2
3
|
import type { ChangeBatch } from './change.js';
|
|
3
4
|
export type Heads = {
|
|
4
5
|
revisions: Readonly<Record<string, string>>;
|
|
6
|
+
fileIds: Readonly<Record<string, string>>;
|
|
7
|
+
created: Readonly<Record<string, string>>;
|
|
5
8
|
changes: Readonly<Record<string, HeadChange>>;
|
|
6
9
|
};
|
|
7
10
|
export type HeldBinary = ({
|
|
@@ -17,11 +20,8 @@ export type Layer = Heads & {
|
|
|
17
20
|
documents: Readonly<Record<string, string>>;
|
|
18
21
|
binaries: Readonly<Record<string, HeldBinary>>;
|
|
19
22
|
};
|
|
20
|
-
export declare function acceptedBinaries(files: Readonly<Record<string, BinaryFile>>):
|
|
23
|
+
export declare function acceptedBinaries(files: Readonly<Record<string, BinaryFile>>): Generator<readonly [string, HeldBinary]>;
|
|
21
24
|
export declare function sameBinary(left: HeldBinary | undefined, right: HeldBinary | undefined): boolean;
|
|
22
25
|
export declare function sameChange(left: HeadChange | undefined, right: HeadChange | undefined): boolean;
|
|
23
|
-
export declare function
|
|
24
|
-
export declare function sameLayerText(left: Layer, right: Layer): boolean;
|
|
25
|
-
export declare function changedPaths(left: Layer, right: Layer): ReadonlySet<string>;
|
|
26
|
-
export declare function overlayChanged(base: Layer, queue: readonly ChangeBatch[], previousBase: Layer, previousQueue: readonly ChangeBatch[], previousVisible: Layer): Layer;
|
|
26
|
+
export declare function overlaying(base: Layer, queue: readonly ChangeBatch[], composition: Composition, unapplied?: () => void): Generator<number, Layer, void>;
|
|
27
27
|
//# sourceMappingURL=overlay.d.ts.map
|
package/dist/overlay.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAU,WAAW,EAAgB,MAAM,aAAa,CAAC;AAIrE,MAAM,MAAM,KAAK,GAAG;IAClB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB,CAAC;IAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAAG,UAAU,CAAC,GAC7C;IACE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEN,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG;IAC1B,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAChD,CAAC;AAEF,wBAAiB,gBAAgB,CAC/B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,GAC1C,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAE1C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAW/F;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAQ/F;AA+ND,wBAAiB,UAAU,CACzB,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,WAAW,EAAE,WAAW,EACxB,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAsChC"}
|