@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.
Files changed (136) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +374 -0
  3. package/bin/lync.js +2 -0
  4. package/dist/cli/bin.d.ts +3 -0
  5. package/dist/cli/bin.d.ts.map +1 -0
  6. package/dist/cli/bin.js +5 -0
  7. package/dist/cli/bin.js.map +1 -0
  8. package/dist/cli/index.d.ts +11 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +404 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/cli/sync.d.ts +42 -0
  13. package/dist/cli/sync.d.ts.map +1 -0
  14. package/dist/cli/sync.js +232 -0
  15. package/dist/cli/sync.js.map +1 -0
  16. package/dist/client/create.d.ts +10 -0
  17. package/dist/client/create.d.ts.map +1 -0
  18. package/dist/client/create.js +50 -0
  19. package/dist/client/create.js.map +1 -0
  20. package/dist/client/index.d.ts +3 -0
  21. package/dist/client/index.d.ts.map +1 -0
  22. package/dist/client/index.js +3 -0
  23. package/dist/client/index.js.map +1 -0
  24. package/dist/client/testing.d.ts +14 -0
  25. package/dist/client/testing.d.ts.map +1 -0
  26. package/dist/client/testing.js +19 -0
  27. package/dist/client/testing.js.map +1 -0
  28. package/dist/client/types.d.ts +49 -0
  29. package/dist/client/types.d.ts.map +1 -0
  30. package/dist/client/types.js +2 -0
  31. package/dist/client/types.js.map +1 -0
  32. package/dist/errors.d.ts +16 -0
  33. package/dist/errors.d.ts.map +1 -0
  34. package/dist/errors.js +39 -0
  35. package/dist/errors.js.map +1 -0
  36. package/dist/events.d.ts +119 -0
  37. package/dist/events.d.ts.map +1 -0
  38. package/dist/events.js +686 -0
  39. package/dist/events.js.map +1 -0
  40. package/dist/file-log.d.ts +25 -0
  41. package/dist/file-log.d.ts.map +1 -0
  42. package/dist/file-log.js +97 -0
  43. package/dist/file-log.js.map +1 -0
  44. package/dist/idb-log.d.ts +21 -0
  45. package/dist/idb-log.d.ts.map +1 -0
  46. package/dist/idb-log.js +114 -0
  47. package/dist/idb-log.js.map +1 -0
  48. package/dist/index.d.ts +9 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +11 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/indexes/entries.d.ts +6 -0
  53. package/dist/indexes/entries.d.ts.map +1 -0
  54. package/dist/indexes/entries.js +7 -0
  55. package/dist/indexes/entries.js.map +1 -0
  56. package/dist/indexes/index.d.ts +3 -0
  57. package/dist/indexes/index.d.ts.map +1 -0
  58. package/dist/indexes/index.js +3 -0
  59. package/dist/indexes/index.js.map +1 -0
  60. package/dist/indexes/memory.d.ts +4 -0
  61. package/dist/indexes/memory.d.ts.map +1 -0
  62. package/dist/indexes/memory.js +193 -0
  63. package/dist/indexes/memory.js.map +1 -0
  64. package/dist/indexes/types.d.ts +70 -0
  65. package/dist/indexes/types.d.ts.map +1 -0
  66. package/dist/indexes/types.js +2 -0
  67. package/dist/indexes/types.js.map +1 -0
  68. package/dist/json.d.ts +3 -0
  69. package/dist/json.d.ts.map +1 -0
  70. package/dist/json.js +15 -0
  71. package/dist/json.js.map +1 -0
  72. package/dist/looms.d.ts +25 -0
  73. package/dist/looms.d.ts.map +1 -0
  74. package/dist/looms.js +359 -0
  75. package/dist/looms.js.map +1 -0
  76. package/dist/memory-log.d.ts +5 -0
  77. package/dist/memory-log.d.ts.map +1 -0
  78. package/dist/memory-log.js +7 -0
  79. package/dist/memory-log.js.map +1 -0
  80. package/dist/memory.d.ts +4 -0
  81. package/dist/memory.d.ts.map +1 -0
  82. package/dist/memory.js +255 -0
  83. package/dist/memory.js.map +1 -0
  84. package/dist/profiles/text-story.d.ts +26 -0
  85. package/dist/profiles/text-story.d.ts.map +1 -0
  86. package/dist/profiles/text-story.js +55 -0
  87. package/dist/profiles/text-story.js.map +1 -0
  88. package/dist/references.d.ts +14 -0
  89. package/dist/references.d.ts.map +1 -0
  90. package/dist/references.js +109 -0
  91. package/dist/references.js.map +1 -0
  92. package/dist/relay/attach.d.ts +24 -0
  93. package/dist/relay/attach.d.ts.map +1 -0
  94. package/dist/relay/attach.js +54 -0
  95. package/dist/relay/attach.js.map +1 -0
  96. package/dist/relay/index.d.ts +4 -0
  97. package/dist/relay/index.d.ts.map +1 -0
  98. package/dist/relay/index.js +4 -0
  99. package/dist/relay/index.js.map +1 -0
  100. package/dist/relay/relay.d.ts +80 -0
  101. package/dist/relay/relay.d.ts.map +1 -0
  102. package/dist/relay/relay.js +329 -0
  103. package/dist/relay/relay.js.map +1 -0
  104. package/dist/relay/serve.d.ts +18 -0
  105. package/dist/relay/serve.d.ts.map +1 -0
  106. package/dist/relay/serve.js +37 -0
  107. package/dist/relay/serve.js.map +1 -0
  108. package/dist/sha256.d.ts +2 -0
  109. package/dist/sha256.d.ts.map +1 -0
  110. package/dist/sha256.js +84 -0
  111. package/dist/sha256.js.map +1 -0
  112. package/dist/store.d.ts +97 -0
  113. package/dist/store.d.ts.map +1 -0
  114. package/dist/store.js +250 -0
  115. package/dist/store.js.map +1 -0
  116. package/dist/sync-protocol.d.ts +80 -0
  117. package/dist/sync-protocol.d.ts.map +1 -0
  118. package/dist/sync-protocol.js +135 -0
  119. package/dist/sync-protocol.js.map +1 -0
  120. package/dist/synced-store.d.ts +68 -0
  121. package/dist/synced-store.d.ts.map +1 -0
  122. package/dist/synced-store.js +340 -0
  123. package/dist/synced-store.js.map +1 -0
  124. package/dist/types.d.ts +78 -0
  125. package/dist/types.d.ts.map +1 -0
  126. package/dist/types.js +2 -0
  127. package/dist/types.js.map +1 -0
  128. package/dist/uuid.d.ts +9 -0
  129. package/dist/uuid.d.ts.map +1 -0
  130. package/dist/uuid.js +25 -0
  131. package/dist/uuid.js.map +1 -0
  132. package/dist/views.d.ts +78 -0
  133. package/dist/views.d.ts.map +1 -0
  134. package/dist/views.js +192 -0
  135. package/dist/views.js.map +1 -0
  136. package/package.json +183 -0
@@ -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,3 @@
1
+ export * from "./create.js";
2
+ export * from "./types.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export * from "./create.js";
2
+ export * from "./types.js";
3
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":""}
@@ -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"}
@@ -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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"}