@deepfates/lync 0.3.0
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/LICENSE +21 -0
- package/README.md +374 -0
- package/bin/lync.js +2 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +5 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/index.d.ts +11 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +404 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/sync.d.ts +42 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +232 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/client/create.d.ts +10 -0
- package/dist/client/create.d.ts.map +1 -0
- package/dist/client/create.js +50 -0
- package/dist/client/create.js.map +1 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/testing.d.ts +14 -0
- package/dist/client/testing.d.ts.map +1 -0
- package/dist/client/testing.js +19 -0
- package/dist/client/testing.js.map +1 -0
- package/dist/client/types.d.ts +49 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/errors.d.ts +16 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +39 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +119 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +686 -0
- package/dist/events.js.map +1 -0
- package/dist/file-log.d.ts +25 -0
- package/dist/file-log.d.ts.map +1 -0
- package/dist/file-log.js +97 -0
- package/dist/file-log.js.map +1 -0
- package/dist/idb-log.d.ts +21 -0
- package/dist/idb-log.d.ts.map +1 -0
- package/dist/idb-log.js +114 -0
- package/dist/idb-log.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/indexes/entries.d.ts +6 -0
- package/dist/indexes/entries.d.ts.map +1 -0
- package/dist/indexes/entries.js +7 -0
- package/dist/indexes/entries.js.map +1 -0
- package/dist/indexes/index.d.ts +3 -0
- package/dist/indexes/index.d.ts.map +1 -0
- package/dist/indexes/index.js +3 -0
- package/dist/indexes/index.js.map +1 -0
- package/dist/indexes/memory.d.ts +4 -0
- package/dist/indexes/memory.d.ts.map +1 -0
- package/dist/indexes/memory.js +193 -0
- package/dist/indexes/memory.js.map +1 -0
- package/dist/indexes/types.d.ts +70 -0
- package/dist/indexes/types.d.ts.map +1 -0
- package/dist/indexes/types.js +2 -0
- package/dist/indexes/types.js.map +1 -0
- package/dist/json.d.ts +3 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +15 -0
- package/dist/json.js.map +1 -0
- package/dist/looms.d.ts +25 -0
- package/dist/looms.d.ts.map +1 -0
- package/dist/looms.js +359 -0
- package/dist/looms.js.map +1 -0
- package/dist/memory-log.d.ts +5 -0
- package/dist/memory-log.d.ts.map +1 -0
- package/dist/memory-log.js +7 -0
- package/dist/memory-log.js.map +1 -0
- package/dist/memory.d.ts +4 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +255 -0
- package/dist/memory.js.map +1 -0
- package/dist/profiles/text-story.d.ts +26 -0
- package/dist/profiles/text-story.d.ts.map +1 -0
- package/dist/profiles/text-story.js +55 -0
- package/dist/profiles/text-story.js.map +1 -0
- package/dist/references.d.ts +14 -0
- package/dist/references.d.ts.map +1 -0
- package/dist/references.js +109 -0
- package/dist/references.js.map +1 -0
- package/dist/relay/attach.d.ts +24 -0
- package/dist/relay/attach.d.ts.map +1 -0
- package/dist/relay/attach.js +54 -0
- package/dist/relay/attach.js.map +1 -0
- package/dist/relay/index.d.ts +4 -0
- package/dist/relay/index.d.ts.map +1 -0
- package/dist/relay/index.js +4 -0
- package/dist/relay/index.js.map +1 -0
- package/dist/relay/relay.d.ts +80 -0
- package/dist/relay/relay.d.ts.map +1 -0
- package/dist/relay/relay.js +329 -0
- package/dist/relay/relay.js.map +1 -0
- package/dist/relay/serve.d.ts +18 -0
- package/dist/relay/serve.d.ts.map +1 -0
- package/dist/relay/serve.js +37 -0
- package/dist/relay/serve.js.map +1 -0
- package/dist/sha256.d.ts +2 -0
- package/dist/sha256.d.ts.map +1 -0
- package/dist/sha256.js +84 -0
- package/dist/sha256.js.map +1 -0
- package/dist/store.d.ts +97 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +250 -0
- package/dist/store.js.map +1 -0
- package/dist/sync-protocol.d.ts +80 -0
- package/dist/sync-protocol.d.ts.map +1 -0
- package/dist/sync-protocol.js +135 -0
- package/dist/sync-protocol.js.map +1 -0
- package/dist/synced-store.d.ts +68 -0
- package/dist/synced-store.d.ts.map +1 -0
- package/dist/synced-store.js +340 -0
- package/dist/synced-store.js.map +1 -0
- package/dist/types.d.ts +78 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/uuid.d.ts +9 -0
- package/dist/uuid.d.ts.map +1 -0
- package/dist/uuid.js +25 -0
- package/dist/uuid.js.map +1 -0
- package/dist/views.d.ts +78 -0
- package/dist/views.d.ts.map +1 -0
- package/dist/views.js +192 -0
- package/dist/views.js.map +1 -0
- package/package.json +183 -0
package/dist/cli/sync.js
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { appendFile, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { existsSync, watch } from "node:fs";
|
|
3
|
+
import { basename } from "node:path";
|
|
4
|
+
import { decodeFrame, encodeFrame, extractLineId, isCursor } from "../sync-protocol.js";
|
|
5
|
+
export async function syncOnce(options) {
|
|
6
|
+
const root = options.root ?? defaultRoot(options.file);
|
|
7
|
+
const cursorPath = `${options.file}.sync.json`;
|
|
8
|
+
const cursor = await readCursor(cursorPath, options.url, root);
|
|
9
|
+
let text = existsSync(options.file) ? await readFile(options.file, "utf8") : "";
|
|
10
|
+
if (text.length > 0 && !text.endsWith("\n")) {
|
|
11
|
+
options.err.write(`lync sync: ${options.file} has a truncated final line; sealing it as damaged\n`);
|
|
12
|
+
await appendFile(options.file, "\n");
|
|
13
|
+
text += "\n";
|
|
14
|
+
}
|
|
15
|
+
const localLines = text.split("\n").filter((line) => line.length > 0);
|
|
16
|
+
const localIds = new Set();
|
|
17
|
+
for (const line of localLines) {
|
|
18
|
+
const id = extractLineId(line);
|
|
19
|
+
if (id !== undefined)
|
|
20
|
+
localIds.add(id);
|
|
21
|
+
}
|
|
22
|
+
const socket = new WebSocket(options.url);
|
|
23
|
+
// Never a Blob: a binary frame arrives as an ArrayBuffer we can decode
|
|
24
|
+
// synchronously. Text frames (the relay's native tongue) arrive as strings.
|
|
25
|
+
socket.binaryType = "arraybuffer";
|
|
26
|
+
const result = { sent: 0, received: 0, duplicates: 0, surfaced: 0, conflicts: 0, seq: cursor.seq };
|
|
27
|
+
let appendChain = Promise.resolve();
|
|
28
|
+
let following = false;
|
|
29
|
+
// Byte offset of everything we've already offered the server, so follow
|
|
30
|
+
// mode can push only newly appended complete lines.
|
|
31
|
+
let localOffset = Buffer.byteLength(text, "utf8");
|
|
32
|
+
let watcher;
|
|
33
|
+
let pushChain = Promise.resolve();
|
|
34
|
+
// The generation our cursor belongs to. Adopted from the first gen-bearing
|
|
35
|
+
// frame; a later mismatch (server restarted) resets the cursor to 0 and
|
|
36
|
+
// resubscribes — duplicates are no-ops, silent skips are not.
|
|
37
|
+
let generation = cursor.generation;
|
|
38
|
+
// Every `sub` we send is answered by exactly one `live`, in order. After a
|
|
39
|
+
// generation reset re-subscribes, the earlier sub's live is stale — treating
|
|
40
|
+
// it as "live" would end a one-shot sync before the re-fetched backlog
|
|
41
|
+
// arrives. Count outstanding subs; only the last live counts.
|
|
42
|
+
let awaitedLives = 1; // the initial sub, sent on open
|
|
43
|
+
const persistCursor = () => writeFile(cursorPath, `${JSON.stringify({ url: options.url, root, seq: result.seq, ...(generation !== undefined ? { generation } : {}) }, null, 2)}\n`);
|
|
44
|
+
/**
|
|
45
|
+
* Returns true when the server's generation differs from the one our cursor
|
|
46
|
+
* was saved under — in which case the cursor has been reset to 0 and a fresh
|
|
47
|
+
* `sub` from 0 is already on the wire. Frames without gen (old server) never
|
|
48
|
+
* trigger a reset.
|
|
49
|
+
*/
|
|
50
|
+
const generationChanged = (gen) => {
|
|
51
|
+
if (gen === undefined || gen === generation)
|
|
52
|
+
return false;
|
|
53
|
+
if (generation === undefined) {
|
|
54
|
+
generation = gen; // first sighting: adopt, nothing to reset
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
options.err.write(`lync sync: server log generation changed (${generation} -> ${gen}); resyncing ${root} from 0\n`);
|
|
58
|
+
generation = gen;
|
|
59
|
+
result.seq = 0;
|
|
60
|
+
awaitedLives += 1;
|
|
61
|
+
socket.send(encodeFrame({ t: "sub", root, since: 0 }));
|
|
62
|
+
return true;
|
|
63
|
+
};
|
|
64
|
+
await new Promise((resolve, reject) => {
|
|
65
|
+
const timeout = setTimeout(() => {
|
|
66
|
+
// The rejection is the hard abort — it settles the promise no matter
|
|
67
|
+
// what the socket does next. close() then aborts the handshake (if
|
|
68
|
+
// still connecting) or starts teardown; there is no terminate() here.
|
|
69
|
+
reject(new Error(`lync sync: no 'live' from ${options.url} within ${options.timeoutMs ?? 15_000}ms`));
|
|
70
|
+
socket.close();
|
|
71
|
+
}, options.timeoutMs ?? 15_000);
|
|
72
|
+
const stop = () => {
|
|
73
|
+
watcher?.close();
|
|
74
|
+
resolve();
|
|
75
|
+
};
|
|
76
|
+
options.stopSignal?.addEventListener("abort", stop, { once: true });
|
|
77
|
+
function startFollowingLocalAppends() {
|
|
78
|
+
watcher = watch(options.file, () => {
|
|
79
|
+
pushChain = pushChain.then(async () => {
|
|
80
|
+
const current = await readFile(options.file, "utf8");
|
|
81
|
+
const fresh = current.slice(localOffset);
|
|
82
|
+
const upto = fresh.lastIndexOf("\n");
|
|
83
|
+
if (upto < 0)
|
|
84
|
+
return; // no complete new line yet
|
|
85
|
+
for (const line of fresh.slice(0, upto).split("\n")) {
|
|
86
|
+
if (line.length === 0)
|
|
87
|
+
continue;
|
|
88
|
+
const id = extractLineId(line);
|
|
89
|
+
if (id !== undefined && localIds.has(id))
|
|
90
|
+
continue; // our own echo, already appended
|
|
91
|
+
if (id !== undefined)
|
|
92
|
+
localIds.add(id);
|
|
93
|
+
socket.send(encodeFrame({ t: "ev", root, line }));
|
|
94
|
+
result.sent += 1;
|
|
95
|
+
}
|
|
96
|
+
localOffset += Buffer.byteLength(fresh.slice(0, upto + 1), "utf8");
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
socket.addEventListener("close", () => {
|
|
101
|
+
clearTimeout(timeout);
|
|
102
|
+
watcher?.close();
|
|
103
|
+
if (following)
|
|
104
|
+
resolve();
|
|
105
|
+
});
|
|
106
|
+
socket.addEventListener("error", (event) => {
|
|
107
|
+
clearTimeout(timeout);
|
|
108
|
+
watcher?.close();
|
|
109
|
+
const detail = event.message;
|
|
110
|
+
reject(new Error(`lync sync: socket error from ${options.url}${typeof detail === "string" ? `: ${detail}` : ""}`));
|
|
111
|
+
});
|
|
112
|
+
socket.addEventListener("open", () => {
|
|
113
|
+
// Push before subscribing: the server handles our frames in order, so
|
|
114
|
+
// every conflict or rejection for our own lines arrives before the
|
|
115
|
+
// backlog and `live`, and the backlog then covers our accepted lines
|
|
116
|
+
// (duplicate no-ops that settle the resume cursor in one pass).
|
|
117
|
+
for (const line of localLines) {
|
|
118
|
+
socket.send(encodeFrame({ t: "ev", root, line }));
|
|
119
|
+
result.sent += 1;
|
|
120
|
+
}
|
|
121
|
+
socket.send(encodeFrame({ t: "sub", root, since: cursor.seq }));
|
|
122
|
+
});
|
|
123
|
+
socket.addEventListener("message", (event) => {
|
|
124
|
+
const raw = event.data;
|
|
125
|
+
const frame = decodeFrame(typeof raw === "string" ? raw : new TextDecoder().decode(raw));
|
|
126
|
+
switch (frame.t) {
|
|
127
|
+
case "ev": {
|
|
128
|
+
// A generation change resets the cursor and resubscribes; this
|
|
129
|
+
// frame's line is still ingested below (it is from the live
|
|
130
|
+
// generation), and the resubscribe re-covers everything else.
|
|
131
|
+
generationChanged(frame.gen);
|
|
132
|
+
const id = extractLineId(frame.line);
|
|
133
|
+
if (id === undefined) {
|
|
134
|
+
options.err.write(`lync sync: server sent a line without an id; surfaced, not appended\n`);
|
|
135
|
+
result.surfaced += 1;
|
|
136
|
+
}
|
|
137
|
+
else if (localIds.has(id)) {
|
|
138
|
+
result.duplicates += 1;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
localIds.add(id);
|
|
142
|
+
result.received += 1;
|
|
143
|
+
const line = frame.line;
|
|
144
|
+
appendChain = appendChain.then(async () => {
|
|
145
|
+
await appendFile(options.file, `${line}\n`);
|
|
146
|
+
// Appends of our own making must not be re-pushed by the watcher.
|
|
147
|
+
localOffset += Buffer.byteLength(`${line}\n`, "utf8");
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
if (typeof frame.seq === "number")
|
|
151
|
+
result.seq = Math.max(result.seq, frame.seq);
|
|
152
|
+
if (following)
|
|
153
|
+
appendChain = appendChain.then(() => persistCursor());
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
case "live": {
|
|
157
|
+
// A stale live is not live: either its generation is dead (the
|
|
158
|
+
// resubscribe from 0 is already on the wire) or it answers a sub
|
|
159
|
+
// that a generation reset has since superseded. Wait for the real
|
|
160
|
+
// one — the backlog, then live, follows.
|
|
161
|
+
const changed = generationChanged(frame.gen);
|
|
162
|
+
awaitedLives -= 1;
|
|
163
|
+
if (changed || awaitedLives > 0)
|
|
164
|
+
return;
|
|
165
|
+
clearTimeout(timeout);
|
|
166
|
+
result.seq = Math.max(result.seq, frame.seq);
|
|
167
|
+
if (!options.follow) {
|
|
168
|
+
resolve();
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (!following) {
|
|
172
|
+
following = true;
|
|
173
|
+
options.out.write(`lync sync: live at seq ${result.seq}; following (Ctrl-C to stop)\n`);
|
|
174
|
+
void persistCursor();
|
|
175
|
+
startFollowingLocalAppends();
|
|
176
|
+
}
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
case "err": {
|
|
180
|
+
if (frame.reason === "same-id-conflict") {
|
|
181
|
+
result.conflicts += 1;
|
|
182
|
+
options.err.write(`lync sync: same-id conflict surfaced by server: ${frame.detail ?? "?"}\n`);
|
|
183
|
+
}
|
|
184
|
+
else if (frame.reason === "recovered-damaged-tail") {
|
|
185
|
+
options.err.write(`lync sync: server note: ${frame.detail ?? frame.reason}\n`);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
options.err.write(`lync sync: server error: ${frame.reason}${frame.detail ? ` (${frame.detail})` : ""}\n`);
|
|
189
|
+
}
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
default:
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}).finally(() => {
|
|
197
|
+
watcher?.close();
|
|
198
|
+
socket.close();
|
|
199
|
+
});
|
|
200
|
+
await appendChain;
|
|
201
|
+
await pushChain;
|
|
202
|
+
await persistCursor();
|
|
203
|
+
return result;
|
|
204
|
+
}
|
|
205
|
+
function defaultRoot(file) {
|
|
206
|
+
return basename(file).replace(/\.lync$/, "");
|
|
207
|
+
}
|
|
208
|
+
async function readCursor(path, url, root) {
|
|
209
|
+
if (!existsSync(path))
|
|
210
|
+
return { url, root, seq: 0 };
|
|
211
|
+
try {
|
|
212
|
+
const stored = JSON.parse(await readFile(path, "utf8"));
|
|
213
|
+
// seq must be a nonnegative INTEGER: a fractional cursor (corrupt or
|
|
214
|
+
// hand-edited file) would make the relay skip the whole backlog and then
|
|
215
|
+
// get persisted as live — a permanent silent miss. Reset to 0 instead;
|
|
216
|
+
// re-receiving the backlog is a harmless union no-op.
|
|
217
|
+
if (stored.url === url && stored.root === root && isCursor(stored.seq)) {
|
|
218
|
+
// A non-string generation is noise from a hand-edited file: drop just
|
|
219
|
+
// the generation (the first gen-bearing frame re-adopts), keep the seq.
|
|
220
|
+
if (stored.generation !== undefined && typeof stored.generation !== "string") {
|
|
221
|
+
return { url, root, seq: stored.seq };
|
|
222
|
+
}
|
|
223
|
+
return stored;
|
|
224
|
+
}
|
|
225
|
+
// Different server/root, or an unusable cursor: start from 0.
|
|
226
|
+
return { url, root, seq: 0 };
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
return { url, root, seq: 0 };
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Looms } from "../index.js";
|
|
2
|
+
import type { LoomIndexes } from "../indexes/index.js";
|
|
3
|
+
import type { LoomClient } from "./types.js";
|
|
4
|
+
export interface CreateLoomClientOptions<TPayload = unknown, TLoomMeta = unknown, TTurnMeta = unknown, TEntryMeta = unknown, TIndexMeta = unknown> {
|
|
5
|
+
looms: Looms<TPayload, TLoomMeta, TTurnMeta>;
|
|
6
|
+
indexes: LoomIndexes<TEntryMeta, TIndexMeta>;
|
|
7
|
+
close?: () => Promise<void> | void;
|
|
8
|
+
}
|
|
9
|
+
export declare function createLoomClient<TPayload = unknown, TLoomMeta = unknown, TTurnMeta = unknown, TEntryMeta = unknown, TIndexMeta = unknown>(options: CreateLoomClientOptions<TPayload, TLoomMeta, TTurnMeta, TEntryMeta, TIndexMeta>): LoomClient<TPayload, TLoomMeta, TTurnMeta, TEntryMeta, TIndexMeta>;
|
|
10
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/client/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAYL,KAAK,KAAK,EACX,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,uBAAuB,CACtC,QAAQ,GAAG,OAAO,EAClB,SAAS,GAAG,OAAO,EACnB,SAAS,GAAG,OAAO,EACnB,UAAU,GAAG,OAAO,EACpB,UAAU,GAAG,OAAO;IAEpB,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC7C,OAAO,EAAE,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACpC;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,GAAG,OAAO,EAClB,SAAS,GAAG,OAAO,EACnB,SAAS,GAAG,OAAO,EACnB,UAAU,GAAG,OAAO,EACpB,UAAU,GAAG,OAAO,EAEpB,OAAO,EAAE,uBAAuB,CAC9B,QAAQ,EACR,SAAS,EACT,SAAS,EACT,UAAU,EACV,UAAU,CACX,GACA,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CA8CpE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { brokenTopology, decodeReference, encodeReference, indexRef, loomRef, parseReference, referenceFromUrl, referenceToUrl, threadRef, turnRef, } from "../index.js";
|
|
2
|
+
export function createLoomClient(options) {
|
|
3
|
+
const { looms, indexes } = options;
|
|
4
|
+
return {
|
|
5
|
+
looms,
|
|
6
|
+
indexes,
|
|
7
|
+
references: {
|
|
8
|
+
loom: loomRef,
|
|
9
|
+
turn: turnRef,
|
|
10
|
+
thread: threadRef,
|
|
11
|
+
index: indexRef,
|
|
12
|
+
encode: encodeReference,
|
|
13
|
+
decode: decodeReference,
|
|
14
|
+
parse: parseReference,
|
|
15
|
+
toUrl: referenceToUrl,
|
|
16
|
+
fromUrl: referenceFromUrl,
|
|
17
|
+
},
|
|
18
|
+
async openReference(ref) {
|
|
19
|
+
switch (ref.kind) {
|
|
20
|
+
case "loom": {
|
|
21
|
+
const loom = await looms.open(ref.loomId);
|
|
22
|
+
return { kind: "loom", ref, loom };
|
|
23
|
+
}
|
|
24
|
+
case "turn": {
|
|
25
|
+
const loom = await looms.open(ref.loomId);
|
|
26
|
+
const turn = await loom.getTurn(ref.turnId);
|
|
27
|
+
if (!turn)
|
|
28
|
+
throw brokenTopology(`Reference target turn not found: ${ref.turnId}`);
|
|
29
|
+
return { kind: "turn", ref, loom, turn };
|
|
30
|
+
}
|
|
31
|
+
case "thread": {
|
|
32
|
+
const loom = await looms.open(ref.loomId);
|
|
33
|
+
const thread = await loom.threadTo(ref.turnId);
|
|
34
|
+
const target = thread.at(-1);
|
|
35
|
+
if (!target)
|
|
36
|
+
throw brokenTopology(`Reference target thread is empty: ${ref.turnId}`);
|
|
37
|
+
return { kind: "thread", ref, loom, thread, target };
|
|
38
|
+
}
|
|
39
|
+
case "index": {
|
|
40
|
+
const index = await indexes.open(ref.indexId);
|
|
41
|
+
return { kind: "index", ref, index };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
async close() {
|
|
46
|
+
await options.close?.();
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/client/create.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,QAAQ,EACR,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,OAAO,GAGR,MAAM,aAAa,CAAC;AAgBrB,MAAM,UAAU,gBAAgB,CAO9B,OAMC;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEnC,OAAO;QACL,KAAK;QACL,OAAO;QACP,UAAU,EAAE;YACV,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,eAAe;YACvB,MAAM,EAAE,eAAe;YACvB,KAAK,EAAE,cAAc;YACrB,KAAK,EAAE,cAAc;YACrB,OAAO,EAAE,gBAAgB;SAC1B;QACD,KAAK,CAAC,aAAa,CAAC,GAAkB;YACpC,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;gBACjB,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;gBACrC,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC1C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC5C,IAAI,CAAC,IAAI;wBAAE,MAAM,cAAc,CAAC,oCAAoC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;oBAClF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAC3C,CAAC;gBACD,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC1C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7B,IAAI,CAAC,MAAM;wBAAE,MAAM,cAAc,CAAC,qCAAqC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;oBACrF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;gBACvD,CAAC;gBACD,KAAK,OAAO,CAAC,CAAC,CAAC;oBACb,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type LyncAuthor } from "../looms.js";
|
|
2
|
+
import type { LoomClient } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* A fully in-memory loom client for tests and embedded experiments: looms and
|
|
5
|
+
* an index over memory event stores, no network. Deterministic when you pass
|
|
6
|
+
* `createId` and `now`.
|
|
7
|
+
*/
|
|
8
|
+
export interface TestLoomClientOptions {
|
|
9
|
+
author?: LyncAuthor;
|
|
10
|
+
createId?: () => string;
|
|
11
|
+
now?: () => number;
|
|
12
|
+
}
|
|
13
|
+
export declare function createTestLoomClient<TPayload = unknown, TLoomMeta = unknown, TTurnMeta = unknown, TEntryMeta = unknown, TIndexMeta = unknown>(options?: TestLoomClientOptions): LoomClient<TPayload, TLoomMeta, TTurnMeta, TEntryMeta, TIndexMeta>;
|
|
14
|
+
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/client/testing.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAG/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,GAAG,OAAO,EAClB,SAAS,GAAG,OAAO,EACnB,SAAS,GAAG,OAAO,EACnB,UAAU,GAAG,OAAO,EACpB,UAAU,GAAG,OAAO,EACpB,OAAO,GAAE,qBAA0B,GAAG,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAazG"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createMemoryEventStore } from "../memory-log.js";
|
|
2
|
+
import { createLyncLooms } from "../looms.js";
|
|
3
|
+
import { createMemoryLoomIndexes } from "../indexes/memory.js";
|
|
4
|
+
import { createLoomClient } from "./create.js";
|
|
5
|
+
export function createTestLoomClient(options = {}) {
|
|
6
|
+
const store = createMemoryEventStore();
|
|
7
|
+
const looms = createLyncLooms({
|
|
8
|
+
store,
|
|
9
|
+
author: options.author ?? { actor: "test" },
|
|
10
|
+
createId: options.createId,
|
|
11
|
+
now: options.now,
|
|
12
|
+
});
|
|
13
|
+
const indexes = createMemoryLoomIndexes({
|
|
14
|
+
createId: options.createId,
|
|
15
|
+
now: options.now,
|
|
16
|
+
});
|
|
17
|
+
return createLoomClient({ looms, indexes });
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=testing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/client/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAmB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAc/C,MAAM,UAAU,oBAAoB,CAMlC,UAAiC,EAAE;IACnC,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,eAAe,CAAiC;QAC5D,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;QAC3C,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,uBAAuB,CAAyB;QAC9D,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,OAAO,gBAAgB,CAAyD,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;AACtG,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Loom, LoomReference, Looms, Turn, indexRef, loomRef, referenceFromUrl, referenceToUrl, threadRef, turnRef, encodeReference, decodeReference, parseReference } from "../index.js";
|
|
2
|
+
import type { LoomIndex, LoomIndexes } from "../indexes/index.js";
|
|
3
|
+
export type ReferenceHelpers = {
|
|
4
|
+
loom: typeof loomRef;
|
|
5
|
+
turn: typeof turnRef;
|
|
6
|
+
thread: typeof threadRef;
|
|
7
|
+
index: typeof indexRef;
|
|
8
|
+
encode: typeof encodeReference;
|
|
9
|
+
decode: typeof decodeReference;
|
|
10
|
+
parse: typeof parseReference;
|
|
11
|
+
toUrl: typeof referenceToUrl;
|
|
12
|
+
fromUrl: typeof referenceFromUrl;
|
|
13
|
+
};
|
|
14
|
+
export type OpenedReference<TPayload = unknown, TLoomMeta = unknown, TTurnMeta = unknown, TEntryMeta = unknown, TIndexMeta = unknown> = {
|
|
15
|
+
kind: "loom";
|
|
16
|
+
ref: Extract<LoomReference, {
|
|
17
|
+
kind: "loom";
|
|
18
|
+
}>;
|
|
19
|
+
loom: Loom<TPayload, TLoomMeta, TTurnMeta>;
|
|
20
|
+
} | {
|
|
21
|
+
kind: "turn";
|
|
22
|
+
ref: Extract<LoomReference, {
|
|
23
|
+
kind: "turn";
|
|
24
|
+
}>;
|
|
25
|
+
loom: Loom<TPayload, TLoomMeta, TTurnMeta>;
|
|
26
|
+
turn: Turn<TPayload, TTurnMeta>;
|
|
27
|
+
} | {
|
|
28
|
+
kind: "thread";
|
|
29
|
+
ref: Extract<LoomReference, {
|
|
30
|
+
kind: "thread";
|
|
31
|
+
}>;
|
|
32
|
+
loom: Loom<TPayload, TLoomMeta, TTurnMeta>;
|
|
33
|
+
thread: Turn<TPayload, TTurnMeta>[];
|
|
34
|
+
target: Turn<TPayload, TTurnMeta>;
|
|
35
|
+
} | {
|
|
36
|
+
kind: "index";
|
|
37
|
+
ref: Extract<LoomReference, {
|
|
38
|
+
kind: "index";
|
|
39
|
+
}>;
|
|
40
|
+
index: LoomIndex<TEntryMeta, TIndexMeta>;
|
|
41
|
+
};
|
|
42
|
+
export interface LoomClient<TPayload = unknown, TLoomMeta = unknown, TTurnMeta = unknown, TEntryMeta = unknown, TIndexMeta = unknown> {
|
|
43
|
+
looms: Looms<TPayload, TLoomMeta, TTurnMeta>;
|
|
44
|
+
indexes: LoomIndexes<TEntryMeta, TIndexMeta>;
|
|
45
|
+
references: ReferenceHelpers;
|
|
46
|
+
openReference(ref: LoomReference): Promise<OpenedReference<TPayload, TLoomMeta, TTurnMeta, TEntryMeta, TIndexMeta>>;
|
|
47
|
+
close(): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EACJ,aAAa,EACb,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,OAAO,EACP,eAAe,EACf,eAAe,EACf,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,OAAO,OAAO,CAAC;IACrB,IAAI,EAAE,OAAO,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,SAAS,CAAC;IACzB,KAAK,EAAE,OAAO,QAAQ,CAAC;IACvB,MAAM,EAAE,OAAO,eAAe,CAAC;IAC/B,MAAM,EAAE,OAAO,eAAe,CAAC;IAC/B,KAAK,EAAE,OAAO,cAAc,CAAC;IAC7B,KAAK,EAAE,OAAO,cAAc,CAAC;IAC7B,OAAO,EAAE,OAAO,gBAAgB,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,eAAe,CACzB,QAAQ,GAAG,OAAO,EAClB,SAAS,GAAG,OAAO,EACnB,SAAS,GAAG,OAAO,EACnB,UAAU,GAAG,OAAO,EACpB,UAAU,GAAG,OAAO,IAElB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;CAC5C,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3C,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;CACjC,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC,CAAC;IAChD,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3C,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;IACpC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;CACnC,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC/C,KAAK,EAAE,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;CAC1C,CAAC;AAEN,MAAM,WAAW,UAAU,CACzB,QAAQ,GAAG,OAAO,EAClB,SAAS,GAAG,OAAO,EACnB,SAAS,GAAG,OAAO,EACnB,UAAU,GAAG,OAAO,EACpB,UAAU,GAAG,OAAO;IAEpB,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC7C,OAAO,EAAE,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC7C,UAAU,EAAE,gBAAgB,CAAC;IAC7B,aAAa,CACX,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;IACpF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":""}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type LoomErrorCode = "UNKNOWN_LOOM" | "UNKNOWN_INDEX" | "MISSING_PARENT" | "DUPLICATE_TURN_ID" | "DUPLICATE_LOOM_ID" | "INVALID_REFERENCE" | "INVALID_SNAPSHOT" | "CYCLE_DETECTED" | "BROKEN_TOPOLOGY" | "CLOSED_HANDLE";
|
|
2
|
+
export declare class LoomError extends Error {
|
|
3
|
+
readonly code: LoomErrorCode;
|
|
4
|
+
constructor(code: LoomErrorCode, message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function unknownLoom(loomId: string): LoomError;
|
|
7
|
+
export declare function unknownIndex(indexId: string): LoomError;
|
|
8
|
+
export declare function missingParent(parentId: string): LoomError;
|
|
9
|
+
export declare function duplicateTurnId(turnId: string): LoomError;
|
|
10
|
+
export declare function duplicateLoomId(loomId: string): LoomError;
|
|
11
|
+
export declare function invalidReference(message: string): LoomError;
|
|
12
|
+
export declare function invalidSnapshot(message: string): LoomError;
|
|
13
|
+
export declare function cycleDetected(turnId: string): LoomError;
|
|
14
|
+
export declare function brokenTopology(message: string): LoomError;
|
|
15
|
+
export declare function closedHandle(): LoomError;
|
|
16
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GACrB,cAAc,GACd,eAAe,GACf,gBAAgB,GAChB,mBAAmB,GACnB,mBAAmB,GACnB,mBAAmB,GACnB,kBAAkB,GAClB,gBAAgB,GAChB,iBAAiB,GACjB,eAAe,CAAC;AAEpB,qBAAa,SAAU,SAAQ,KAAK;IAClC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;gBAEjB,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM;CAKjD;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAErD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAEvD;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAEzD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAEzD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAEzD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAE3D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAE1D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAEvD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAEzD;AAED,wBAAgB,YAAY,IAAI,SAAS,CAExC"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export class LoomError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
constructor(code, message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "LoomError";
|
|
6
|
+
this.code = code;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function unknownLoom(loomId) {
|
|
10
|
+
return new LoomError("UNKNOWN_LOOM", `Unknown loom: ${loomId}`);
|
|
11
|
+
}
|
|
12
|
+
export function unknownIndex(indexId) {
|
|
13
|
+
return new LoomError("UNKNOWN_INDEX", `Unknown index: ${indexId}`);
|
|
14
|
+
}
|
|
15
|
+
export function missingParent(parentId) {
|
|
16
|
+
return new LoomError("MISSING_PARENT", `Missing parent turn: ${parentId}`);
|
|
17
|
+
}
|
|
18
|
+
export function duplicateTurnId(turnId) {
|
|
19
|
+
return new LoomError("DUPLICATE_TURN_ID", `Duplicate turn ID: ${turnId}`);
|
|
20
|
+
}
|
|
21
|
+
export function duplicateLoomId(loomId) {
|
|
22
|
+
return new LoomError("DUPLICATE_LOOM_ID", `Duplicate loom ID: ${loomId}`);
|
|
23
|
+
}
|
|
24
|
+
export function invalidReference(message) {
|
|
25
|
+
return new LoomError("INVALID_REFERENCE", message);
|
|
26
|
+
}
|
|
27
|
+
export function invalidSnapshot(message) {
|
|
28
|
+
return new LoomError("INVALID_SNAPSHOT", message);
|
|
29
|
+
}
|
|
30
|
+
export function cycleDetected(turnId) {
|
|
31
|
+
return new LoomError("CYCLE_DETECTED", `Cycle detected at turn: ${turnId}`);
|
|
32
|
+
}
|
|
33
|
+
export function brokenTopology(message) {
|
|
34
|
+
return new LoomError("BROKEN_TOPOLOGY", message);
|
|
35
|
+
}
|
|
36
|
+
export function closedHandle() {
|
|
37
|
+
return new LoomError("CLOSED_HANDLE", "This loom handle is closed");
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,IAAI,CAAgB;IAE7B,YAAY,IAAmB,EAAE,OAAe;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,OAAO,IAAI,SAAS,CAAC,cAAc,EAAE,iBAAiB,MAAM,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,IAAI,SAAS,CAAC,eAAe,EAAE,kBAAkB,OAAO,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,IAAI,SAAS,CAAC,gBAAgB,EAAE,wBAAwB,QAAQ,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,IAAI,SAAS,CAAC,mBAAmB,EAAE,sBAAsB,MAAM,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,IAAI,SAAS,CAAC,mBAAmB,EAAE,sBAAsB,MAAM,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,IAAI,SAAS,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,IAAI,SAAS,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,IAAI,SAAS,CAAC,gBAAgB,EAAE,2BAA2B,MAAM,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,OAAO,IAAI,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,SAAS,CAAC,eAAe,EAAE,4BAA4B,CAAC,CAAC;AACtE,CAAC"}
|
package/dist/events.d.ts
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
export type LyncLineClass = "accepted" | "nonconforming" | "garbage" | "damaged" | "conflict-variant";
|
|
2
|
+
export interface LyncEventBody {
|
|
3
|
+
v: number;
|
|
4
|
+
id: string;
|
|
5
|
+
kind: string;
|
|
6
|
+
at: string;
|
|
7
|
+
author: {
|
|
8
|
+
actor: string;
|
|
9
|
+
operator?: string;
|
|
10
|
+
imported_by?: string;
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
};
|
|
13
|
+
parents: string[];
|
|
14
|
+
payload: Record<string, unknown>;
|
|
15
|
+
marked?: string;
|
|
16
|
+
critical?: boolean;
|
|
17
|
+
[key: string]: unknown;
|
|
18
|
+
}
|
|
19
|
+
export interface LyncLineDiagnostic {
|
|
20
|
+
file: string;
|
|
21
|
+
line: number;
|
|
22
|
+
class: LyncLineClass;
|
|
23
|
+
reason: string;
|
|
24
|
+
id?: string;
|
|
25
|
+
hasDigest?: boolean;
|
|
26
|
+
hasSig?: boolean;
|
|
27
|
+
duplicateSighting?: boolean;
|
|
28
|
+
metadataDisagreement?: boolean;
|
|
29
|
+
event?: LyncEventBody;
|
|
30
|
+
bytes: Uint8Array;
|
|
31
|
+
terminator: "" | "\n";
|
|
32
|
+
bodyBytes?: Uint8Array;
|
|
33
|
+
bodyDigest?: string;
|
|
34
|
+
digest?: string;
|
|
35
|
+
sig?: string;
|
|
36
|
+
nonconformingReasons?: string[];
|
|
37
|
+
}
|
|
38
|
+
export interface LyncConflictVariant {
|
|
39
|
+
id: string;
|
|
40
|
+
digest: string;
|
|
41
|
+
file: string;
|
|
42
|
+
line: number;
|
|
43
|
+
bytes: Uint8Array;
|
|
44
|
+
bodyBytes: Uint8Array;
|
|
45
|
+
event: LyncEventBody;
|
|
46
|
+
}
|
|
47
|
+
export interface LyncPendingDiagnostic {
|
|
48
|
+
missingParent: string;
|
|
49
|
+
digest: string;
|
|
50
|
+
file: string;
|
|
51
|
+
line: number;
|
|
52
|
+
id: string;
|
|
53
|
+
bytes: Uint8Array;
|
|
54
|
+
}
|
|
55
|
+
export interface LyncObstacle {
|
|
56
|
+
class: "cycle" | "dangling" | "unavailable-due-to-conflict";
|
|
57
|
+
ids?: string[];
|
|
58
|
+
missing?: string;
|
|
59
|
+
id?: string;
|
|
60
|
+
}
|
|
61
|
+
export interface LyncParseResult {
|
|
62
|
+
lines: LyncLineDiagnostic[];
|
|
63
|
+
unionEventIds: string[];
|
|
64
|
+
viewEligibleIds: string[];
|
|
65
|
+
conflictIds: string[];
|
|
66
|
+
conflictVariants: LyncConflictVariant[];
|
|
67
|
+
pending: LyncPendingDiagnostic[];
|
|
68
|
+
pendingOverflowCount: number;
|
|
69
|
+
suppression: {
|
|
70
|
+
suppressedPayloadIds: string[];
|
|
71
|
+
notSuppressedIds: string[];
|
|
72
|
+
danglingTargetNoEffectUntilUnion: string[];
|
|
73
|
+
};
|
|
74
|
+
graphDiagnostics: LyncObstacle[];
|
|
75
|
+
}
|
|
76
|
+
export type LyncUnionStatus = "added" | "duplicate" | "conflict" | "buffered" | "damaged" | "garbage";
|
|
77
|
+
export interface LyncUnionIngestResult {
|
|
78
|
+
status: LyncUnionStatus;
|
|
79
|
+
line: LyncLineDiagnostic;
|
|
80
|
+
conflictVariants?: LyncConflictVariant[];
|
|
81
|
+
missingParent?: string;
|
|
82
|
+
drained?: LyncUnionIngestResult[];
|
|
83
|
+
}
|
|
84
|
+
export interface LyncUnionOptions {
|
|
85
|
+
pendingLimit?: number;
|
|
86
|
+
}
|
|
87
|
+
export declare class LyncUnion {
|
|
88
|
+
private readonly pendingLimit;
|
|
89
|
+
private readonly lines;
|
|
90
|
+
private readonly acceptedById;
|
|
91
|
+
private readonly conflictIds;
|
|
92
|
+
private readonly conflictVariants;
|
|
93
|
+
private readonly pendingByParent;
|
|
94
|
+
private pendingCount;
|
|
95
|
+
private pendingOverflowCount;
|
|
96
|
+
constructor(options?: LyncUnionOptions);
|
|
97
|
+
union(input: {
|
|
98
|
+
file: string;
|
|
99
|
+
bytes: Uint8Array | string;
|
|
100
|
+
}): LyncUnionIngestResult[];
|
|
101
|
+
result(): LyncParseResult;
|
|
102
|
+
private ingestParsedLine;
|
|
103
|
+
private acceptLine;
|
|
104
|
+
private markConflictVariant;
|
|
105
|
+
private bufferPending;
|
|
106
|
+
private drain;
|
|
107
|
+
private pending;
|
|
108
|
+
}
|
|
109
|
+
export declare function parseLyncFiles(inputs: {
|
|
110
|
+
file: string;
|
|
111
|
+
bytes: Uint8Array | string;
|
|
112
|
+
}[]): LyncParseResult;
|
|
113
|
+
export declare function exportCarriedLyncBytes(result: LyncParseResult): Uint8Array;
|
|
114
|
+
export declare function lyncDownset(result: LyncParseResult, id: string): {
|
|
115
|
+
ids: string[];
|
|
116
|
+
partial: boolean;
|
|
117
|
+
obstacles: LyncObstacle[];
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"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"}
|