@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,404 @@
1
+ import { uuidv7 } from "../uuid.js";
2
+ import { appendFile, readFile, stat, writeFile } from "node:fs/promises";
3
+ import { parseLyncFiles, } from "../events.js";
4
+ import { lyncBranchTreeView as coreTreeView, lyncTranscriptView as coreTranscriptView } from "../views.js";
5
+ const classes = ["accepted", "nonconforming", "garbage", "damaged", "conflict-variant"];
6
+ const textEncoder = new TextEncoder();
7
+ export async function runLyncCli(argv, io = {}) {
8
+ const out = io.stdout ?? process.stdout;
9
+ const err = io.stderr ?? process.stderr;
10
+ const [verb, ...rest] = argv;
11
+ try {
12
+ if (!verb || verb === "-h" || verb === "--help") {
13
+ out.write(helpText());
14
+ return 0;
15
+ }
16
+ switch (verb) {
17
+ case "verify":
18
+ return await verify(rest, out, err);
19
+ case "merge":
20
+ return await merge(rest, out, err);
21
+ case "view":
22
+ return await view(rest, out, err);
23
+ case "init":
24
+ return await init(rest, err);
25
+ case "append":
26
+ return await append(rest, io, out, err);
27
+ case "serve":
28
+ return await serveVerb(rest, out, err);
29
+ case "sync":
30
+ return await syncVerb(rest, out, err);
31
+ default:
32
+ err.write(`Unknown command '${verb}'. Run 'lync --help'.\n`);
33
+ return 2;
34
+ }
35
+ }
36
+ catch (error) {
37
+ err.write(`${messageOf(error)}\n`);
38
+ return 2;
39
+ }
40
+ }
41
+ function helpText() {
42
+ return [
43
+ "Usage: lync <command> [args]",
44
+ "",
45
+ "Commands:",
46
+ " verify <files> classify lync file lines and print counts",
47
+ " merge <files> -o <out> write a deterministic carried union",
48
+ " view <file> [--as transcript|tree]",
49
+ " init [file] create an empty valid lync file",
50
+ " append <file> read JSON from stdin and append one event",
51
+ " serve [dir] [--port N] [--token T] run the line-sync relay over a directory of roots",
52
+ " sync <file> <url> [--root R] [--follow] converge a file with a relay; --follow stays live",
53
+ "",
54
+ "verify exits 0 only when every line is accepted. It exits 1 for nonconforming, garbage, damaged, conflict, pending, or graph issues, and 2 for usage or I/O errors.",
55
+ "",
56
+ ].join("\n");
57
+ }
58
+ async function verify(args, out, err) {
59
+ if (args.length === 0) {
60
+ err.write("Usage: lync verify <files>\n");
61
+ return 2;
62
+ }
63
+ const result = parseLyncFiles(await readInputs(args));
64
+ const totals = zeroCounts();
65
+ const byFile = new Map();
66
+ for (const line of result.lines) {
67
+ const counts = byFile.get(line.file) ?? zeroCounts();
68
+ counts[line.class]++;
69
+ totals[line.class]++;
70
+ byFile.set(line.file, counts);
71
+ }
72
+ for (const file of args)
73
+ out.write(`${file} ${formatCounts(byFile.get(file) ?? zeroCounts())}\n`);
74
+ out.write(`total ${formatCounts(totals)}\n`);
75
+ for (const line of result.lines) {
76
+ if (line.class === "accepted")
77
+ continue;
78
+ out.write(`${line.file}:${line.line} ${line.class}: ${line.reason}\n`);
79
+ }
80
+ for (const pending of result.pending) {
81
+ out.write(`${pending.file}:${pending.line} pending: missing parent ${pending.missingParent}\n`);
82
+ }
83
+ for (const obstacle of result.graphDiagnostics) {
84
+ out.write(`graph ${JSON.stringify(obstacle)}\n`);
85
+ }
86
+ return hasVerifyIssues(result.lines, result.pending.length, result.graphDiagnostics.length) ? 1 : 0;
87
+ }
88
+ async function merge(args, _out, err) {
89
+ const outIndex = args.indexOf("-o");
90
+ if (outIndex < 0 || outIndex === args.length - 1) {
91
+ err.write("Usage: lync merge <files> -o <out>\n");
92
+ return 2;
93
+ }
94
+ const output = args[outIndex + 1];
95
+ const files = args.filter((_, index) => index !== outIndex && index !== outIndex + 1);
96
+ if (files.length === 0) {
97
+ err.write("Usage: lync merge <files> -o <out>\n");
98
+ return 2;
99
+ }
100
+ const result = parseLyncFiles(await readInputs(files));
101
+ await writeFile(output, mergeBytes(result.lines, new Set(result.unionEventIds)));
102
+ return 0;
103
+ }
104
+ async function view(args, out, err) {
105
+ const asIndex = args.indexOf("--as");
106
+ const as = asIndex >= 0 ? args[asIndex + 1] : "transcript";
107
+ const files = asIndex >= 0
108
+ ? args.filter((_, index) => index !== asIndex && index !== asIndex + 1)
109
+ : args;
110
+ if (files.length !== 1 || (as !== "transcript" && as !== "tree")) {
111
+ err.write("Usage: lync view <file> --as transcript|tree\n");
112
+ return 2;
113
+ }
114
+ const result = parseLyncFiles(await readInputs(files));
115
+ if (as === "tree") {
116
+ out.write(`${JSON.stringify(printableTreeView(coreTreeView(result)), null, 2)}\n`);
117
+ return result.graphDiagnostics.length || result.conflictIds.length ? 1 : 0;
118
+ }
119
+ const tree = coreTreeView(result);
120
+ const head = tree.leaves[tree.leaves.length - 1] ?? "";
121
+ const transcript = head
122
+ ? coreTranscriptView(result, head)
123
+ : { head: "", entries: [], downsetIds: [], obstacles: [], partial: false };
124
+ out.write(`${JSON.stringify(printableTranscriptView(transcript), null, 2)}\n`);
125
+ return transcript.partial || result.conflictIds.length ? 1 : 0;
126
+ }
127
+ async function init(args, err) {
128
+ if (args.length > 1) {
129
+ err.write("Usage: lync init [file]\n");
130
+ return 2;
131
+ }
132
+ if (args[0])
133
+ await writeFile(args[0], new Uint8Array());
134
+ return 0;
135
+ }
136
+ async function append(args, io, out, err) {
137
+ if (args.length !== 1) {
138
+ err.write("Usage: lync append <file>\n");
139
+ return 2;
140
+ }
141
+ let value;
142
+ try {
143
+ value = JSON.parse(await readAllStdin(io.stdin ?? process.stdin));
144
+ }
145
+ catch {
146
+ err.write("stdin must be a JSON object, for example: {\"kind\":\"note/text\",\"author\":{\"actor\":\"you\"},\"payload\":{\"text\":\"hello\"}}\n");
147
+ return 1;
148
+ }
149
+ const built = buildAppendEvent(value, io);
150
+ if (!built.ok) {
151
+ err.write(`${built.reason}\n`);
152
+ return 1;
153
+ }
154
+ const line = `${JSON.stringify(built.event)}\n`;
155
+ const parsed = parseLyncFiles([{ file: args[0], bytes: line }]).lines[0];
156
+ if (parsed?.class !== "accepted") {
157
+ err.write(`That JSON is not a valid event: ${parsed?.reason ?? "unknown validation failure"}.\n`);
158
+ return 1;
159
+ }
160
+ await appendLine(args[0], line);
161
+ out.write(`${built.event.id}\n`);
162
+ return 0;
163
+ }
164
+ function buildAppendEvent(value, io) {
165
+ if (!isRecord(value))
166
+ return { ok: false, reason: "stdin must be a JSON object." };
167
+ if ("v" in value && value.v !== 1)
168
+ return { ok: false, reason: "v must be 1 when provided." };
169
+ if ("id" in value && typeof value.id !== "string")
170
+ return { ok: false, reason: "id must be a string when provided." };
171
+ if (typeof value.kind !== "string")
172
+ return { ok: false, reason: "kind is required and must be a string like 'notes/text'." };
173
+ if (!value.kind.includes("/") || value.kind.startsWith("/") || value.kind.endsWith("/")) {
174
+ return { ok: false, reason: "kind must include a namespace and name, for example 'notes/text'." };
175
+ }
176
+ if (!isRecord(value.author))
177
+ return { ok: false, reason: "author is required and must be an object with actor." };
178
+ if (typeof value.author.actor !== "string" || value.author.actor.length === 0) {
179
+ return { ok: false, reason: "author.actor is required and must be a non-empty string." };
180
+ }
181
+ if ("parents" in value && (!Array.isArray(value.parents) || !value.parents.every((parent) => typeof parent === "string"))) {
182
+ return { ok: false, reason: "parents must be an array of strings when provided." };
183
+ }
184
+ if ("payload" in value && !isRecord(value.payload)) {
185
+ return { ok: false, reason: "payload must be an object when provided." };
186
+ }
187
+ const event = {
188
+ v: 1,
189
+ id: typeof value.id === "string" ? value.id : (io.randomId?.() ?? uuidv7()),
190
+ kind: value.kind,
191
+ at: typeof value.at === "string" ? value.at : (io.now?.() ?? new Date()).toISOString(),
192
+ author: value.author,
193
+ parents: Array.isArray(value.parents) ? value.parents : [],
194
+ payload: isRecord(value.payload) ? value.payload : {},
195
+ };
196
+ if ("marked" in value)
197
+ event.marked = value.marked;
198
+ if ("critical" in value)
199
+ event.critical = value.critical;
200
+ return { ok: true, event };
201
+ }
202
+ function mergeBytes(lines, unionIds) {
203
+ const eventChoices = new Map();
204
+ const carried = [];
205
+ for (const line of lines) {
206
+ if (line.id && unionIds.has(line.id) && (line.class === "accepted" || line.class === "nonconforming")) {
207
+ const existing = eventChoices.get(line.id);
208
+ if (!existing || richness(line) > richness(existing))
209
+ eventChoices.set(line.id, line);
210
+ continue;
211
+ }
212
+ carried.push(line);
213
+ }
214
+ const ordered = [
215
+ ...[...eventChoices.entries()].sort(([a], [b]) => a.localeCompare(b)).map(([, line]) => line),
216
+ ...carried,
217
+ ];
218
+ return joinLines(ordered);
219
+ }
220
+ function joinLines(lines) {
221
+ const chunks = lines.flatMap((line) => line.terminator ? [line.bytes, textEncoder.encode(line.terminator)] : [line.bytes]);
222
+ const total = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
223
+ const bytes = new Uint8Array(total);
224
+ let offset = 0;
225
+ for (const chunk of chunks) {
226
+ bytes.set(chunk, offset);
227
+ offset += chunk.byteLength;
228
+ }
229
+ return bytes;
230
+ }
231
+ async function readInputs(files) {
232
+ return Promise.all(files.map(async (file) => ({ file, bytes: await readFile(file) })));
233
+ }
234
+ function zeroCounts() {
235
+ return { accepted: 0, nonconforming: 0, garbage: 0, damaged: 0, "conflict-variant": 0 };
236
+ }
237
+ function formatCounts(counts) {
238
+ return classes.map((kind) => `${kind}=${counts[kind]}`).join(" ");
239
+ }
240
+ function hasVerifyIssues(lines, pending, obstacles) {
241
+ return pending > 0 || obstacles > 0 || lines.some((line) => line.class !== "accepted");
242
+ }
243
+ function richness(line) {
244
+ return (line.sig ? 2 : 0) + (line.digest ? 1 : 0);
245
+ }
246
+ function printableTranscriptView(view) {
247
+ return {
248
+ head: view.head,
249
+ entries: view.entries.map((entry) => ({
250
+ id: entry.id,
251
+ depth: entry.depth,
252
+ kind: entry.event.kind,
253
+ at: entry.event.at,
254
+ author: entry.event.author,
255
+ parents: entry.event.parents,
256
+ payload: entry.payloadSuppressed ? undefined : entry.event.payload,
257
+ payloadSuppressed: entry.payloadSuppressed,
258
+ })),
259
+ downsetIds: view.downsetIds,
260
+ obstacles: view.obstacles,
261
+ partial: view.partial,
262
+ };
263
+ }
264
+ function printableTreeView(view) {
265
+ return {
266
+ nodes: view.nodes.map((node) => ({
267
+ id: node.id,
268
+ kind: node.event.kind,
269
+ at: node.event.at,
270
+ author: node.event.author,
271
+ parents: node.parents,
272
+ children: node.children,
273
+ missingParents: node.missingParents,
274
+ conflictedParents: node.conflictedParents,
275
+ payload: node.payloadSuppressed ? undefined : node.event.payload,
276
+ payloadSuppressed: node.payloadSuppressed,
277
+ })),
278
+ roots: view.roots,
279
+ leaves: view.leaves,
280
+ obstacles: view.obstacles,
281
+ partial: view.partial,
282
+ };
283
+ }
284
+ async function appendLine(file, line) {
285
+ let prefix = "";
286
+ try {
287
+ const info = await stat(file);
288
+ if (info.size > 0) {
289
+ const bytes = await readFile(file);
290
+ if (bytes[bytes.byteLength - 1] !== 0x0a)
291
+ prefix = "\n";
292
+ }
293
+ }
294
+ catch (error) {
295
+ if (error.code !== "ENOENT")
296
+ throw error;
297
+ }
298
+ await appendFile(file, `${prefix}${line}`);
299
+ }
300
+ function readAllStdin(stdin) {
301
+ stdin.setEncoding("utf8");
302
+ return new Promise((resolve, reject) => {
303
+ let data = "";
304
+ stdin.on("data", (chunk) => {
305
+ data += chunk;
306
+ });
307
+ stdin.on("error", reject);
308
+ stdin.on("end", () => resolve(data));
309
+ });
310
+ }
311
+ function isRecord(value) {
312
+ return typeof value === "object" && value !== null && !Array.isArray(value);
313
+ }
314
+ function messageOf(error) {
315
+ return error instanceof Error ? error.message : String(error);
316
+ }
317
+ async function serveVerb(args, out, err) {
318
+ const { startLyncServe } = await import("../relay/index.js");
319
+ const positional = [];
320
+ let port;
321
+ let token;
322
+ for (let index = 0; index < args.length; index += 1) {
323
+ const arg = args[index];
324
+ if (arg === "--port") {
325
+ port = Number(args[++index]);
326
+ if (!Number.isInteger(port) || port < 0 || port > 65_535) {
327
+ err.write("lync serve: --port must be an integer between 0 and 65535\n");
328
+ return 2;
329
+ }
330
+ }
331
+ else if (arg === "--token") {
332
+ token = args[++index];
333
+ if (!token) {
334
+ err.write("lync serve: --token requires a value\n");
335
+ return 2;
336
+ }
337
+ }
338
+ else {
339
+ positional.push(arg);
340
+ }
341
+ }
342
+ if (positional.length > 1) {
343
+ err.write("Usage: lync serve [dir] [--port N] [--token T]\n");
344
+ return 2;
345
+ }
346
+ const server = await startLyncServe({
347
+ dir: positional[0] ?? ".",
348
+ port,
349
+ token,
350
+ log: (message) => err.write(`${message}\n`),
351
+ });
352
+ out.write(`lync serve: listening on ws://localhost:${server.port} over ${positional[0] ?? "."}\n`);
353
+ await new Promise((resolve) => {
354
+ process.once("SIGINT", resolve);
355
+ process.once("SIGTERM", resolve);
356
+ });
357
+ await server.close();
358
+ out.write("lync serve: closed\n");
359
+ return 0;
360
+ }
361
+ async function syncVerb(args, out, err) {
362
+ const { syncOnce } = await import("./sync.js");
363
+ const positional = [];
364
+ let root;
365
+ let follow = false;
366
+ for (let index = 0; index < args.length; index += 1) {
367
+ const arg = args[index];
368
+ if (arg === "--root") {
369
+ root = args[++index];
370
+ if (!root) {
371
+ err.write("lync sync: --root requires a value\n");
372
+ return 2;
373
+ }
374
+ }
375
+ else if (arg === "--follow") {
376
+ follow = true;
377
+ }
378
+ else {
379
+ positional.push(arg);
380
+ }
381
+ }
382
+ if (positional.length !== 2) {
383
+ err.write("Usage: lync sync <file> <url> [--root R] [--follow]\n");
384
+ return 2;
385
+ }
386
+ const stopper = new AbortController();
387
+ if (follow) {
388
+ process.once("SIGINT", () => stopper.abort());
389
+ process.once("SIGTERM", () => stopper.abort());
390
+ }
391
+ const result = await syncOnce({
392
+ file: positional[0],
393
+ url: positional[1],
394
+ root,
395
+ follow,
396
+ stopSignal: stopper.signal,
397
+ out,
398
+ err,
399
+ });
400
+ out.write(`lync sync: sent ${result.sent}, received ${result.received} new, ` +
401
+ `${result.duplicates} duplicates, ${result.surfaced} surfaced, cursor at seq ${result.seq}\n`);
402
+ return result.conflicts > 0 ? 1 : 0;
403
+ }
404
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * `lync sync <file> <url>` — one-shot convergence with a `lync serve` relay.
3
+ *
4
+ * The file itself is the offline queue: every local line is offered to the
5
+ * server (duplicates are no-ops under union), and every server line we lack
6
+ * is appended locally. The resume cursor lives in `<file>.sync.json`; it
7
+ * advances only after a received line has reached a durable local state —
8
+ * appended, recognized as a duplicate, or surfaced as unusable. A sync that
9
+ * cannot reach `live` within the timeout fails loudly; nothing hangs.
10
+ *
11
+ * The cursor stores the server's log generation alongside seq: a seq is only
12
+ * meaningful inside the generation that issued it (a broadcast whose disk
13
+ * write failed still consumed a seq, so after a server restart the recovered
14
+ * log can sit behind our cursor). When the server's `gen` differs from the
15
+ * stored one, the cursor resets to 0 and we resubscribe from scratch — union
16
+ * makes the re-download a set of duplicate no-ops, and nothing is skipped.
17
+ */
18
+ export interface LyncSyncOptions {
19
+ file: string;
20
+ url: string;
21
+ root?: string;
22
+ timeoutMs?: number;
23
+ /**
24
+ * Stay connected after `live`: keep appending incoming events and push
25
+ * local appends as they land. Resolves when the socket closes or
26
+ * `stopSignal` aborts.
27
+ */
28
+ follow?: boolean;
29
+ stopSignal?: AbortSignal;
30
+ out: Pick<NodeJS.WriteStream, "write">;
31
+ err: Pick<NodeJS.WriteStream, "write">;
32
+ }
33
+ export interface LyncSyncResult {
34
+ sent: number;
35
+ received: number;
36
+ duplicates: number;
37
+ surfaced: number;
38
+ conflicts: number;
39
+ seq: number;
40
+ }
41
+ export declare function syncOnce(options: LyncSyncOptions): Promise<LyncSyncResult>;
42
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACvC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAUD,wBAAsB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CA4MhF"}