@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
package/dist/memory.js ADDED
@@ -0,0 +1,255 @@
1
+ import { brokenTopology, closedHandle, cycleDetected, duplicateTurnId, invalidSnapshot, missingParent, unknownLoom, } from "./errors.js";
2
+ import { assertJsonEncodable, cloneJson } from "./json.js";
3
+ const ROOT_CHILDREN_KEY = "__root__";
4
+ export function createMemoryLooms(options = {}) {
5
+ const createId = options.createId ?? (() => crypto.randomUUID());
6
+ const now = options.now ?? (() => Date.now());
7
+ const docs = new Map();
8
+ const createDoc = (meta) => {
9
+ assertJsonEncodable(meta, "loom meta");
10
+ const id = `memory:${createId()}`;
11
+ const loom = omitUndefined({
12
+ id,
13
+ meta: cloneJson(meta),
14
+ createdAt: now(),
15
+ });
16
+ return {
17
+ loom,
18
+ turns: new Map(),
19
+ children: new Map([[ROOT_CHILDREN_KEY, []]]),
20
+ listeners: new Set(),
21
+ };
22
+ };
23
+ return {
24
+ async create(meta) {
25
+ const doc = createDoc(meta);
26
+ docs.set(doc.loom.id, doc);
27
+ return cloneJson(doc.loom);
28
+ },
29
+ async get(loomId) {
30
+ const doc = docs.get(loomId);
31
+ return doc ? cloneJson(doc.loom) : null;
32
+ },
33
+ async open(loomId) {
34
+ const doc = docs.get(loomId);
35
+ if (!doc)
36
+ throw unknownLoom(loomId);
37
+ return new MemoryLoom(loomId, doc, createId, now);
38
+ },
39
+ async import(snapshot) {
40
+ validateSnapshot(snapshot);
41
+ const doc = createDoc(snapshot.loom.meta);
42
+ doc.loom.createdAt = snapshot.loom.createdAt;
43
+ for (const imported of snapshot.turns) {
44
+ const turn = omitUndefined({
45
+ ...cloneJson(imported),
46
+ loomId: doc.loom.id,
47
+ });
48
+ doc.turns.set(turn.id, turn);
49
+ const parentKey = parentKeyOf(turn.parentId);
50
+ const siblings = doc.children.get(parentKey) ?? [];
51
+ siblings.push(turn.id);
52
+ doc.children.set(parentKey, siblings);
53
+ if (!doc.children.has(turn.id))
54
+ doc.children.set(turn.id, []);
55
+ }
56
+ docs.set(doc.loom.id, doc);
57
+ return cloneJson(doc.loom);
58
+ },
59
+ };
60
+ }
61
+ class MemoryLoom {
62
+ id;
63
+ doc;
64
+ createId;
65
+ now;
66
+ closed = false;
67
+ constructor(id, doc, createId, now) {
68
+ this.id = id;
69
+ this.doc = doc;
70
+ this.createId = createId;
71
+ this.now = now;
72
+ }
73
+ async info() {
74
+ this.assertOpen();
75
+ return cloneJson(this.doc.loom);
76
+ }
77
+ async updateMeta(meta) {
78
+ this.assertOpen();
79
+ assertJsonEncodable(meta, "loom meta");
80
+ this.doc.loom = omitUndefined({
81
+ ...this.doc.loom,
82
+ meta: cloneJson(meta),
83
+ });
84
+ this.emit({ type: "loom-updated", loom: cloneJson(this.doc.loom) });
85
+ return cloneJson(this.doc.loom);
86
+ }
87
+ async appendTurn(parentId, payload, meta) {
88
+ this.assertOpen();
89
+ assertJsonEncodable(payload, "turn payload");
90
+ assertJsonEncodable(meta, "turn meta");
91
+ if (parentId !== null && !this.doc.turns.has(parentId))
92
+ throw missingParent(parentId);
93
+ const turnId = this.createId();
94
+ if (turnId === ROOT_CHILDREN_KEY)
95
+ throw duplicateTurnId(turnId);
96
+ if (this.doc.turns.has(turnId))
97
+ throw duplicateTurnId(turnId);
98
+ const turn = omitUndefined({
99
+ id: turnId,
100
+ loomId: this.id,
101
+ parentId,
102
+ payload: cloneJson(payload),
103
+ meta: cloneJson(meta),
104
+ createdAt: this.now(),
105
+ });
106
+ this.doc.turns.set(turn.id, turn);
107
+ if (!this.doc.children.has(turn.id))
108
+ this.doc.children.set(turn.id, []);
109
+ const key = parentKeyOf(parentId);
110
+ const siblings = this.doc.children.get(key) ?? [];
111
+ siblings.push(turn.id);
112
+ this.doc.children.set(key, siblings);
113
+ const output = cloneJson(turn);
114
+ this.emit({ type: "turn-added", loomId: this.id, turn: output });
115
+ return output;
116
+ }
117
+ async getTurn(turnId) {
118
+ this.assertOpen();
119
+ const turn = this.doc.turns.get(turnId);
120
+ return turn ? cloneJson(turn) : null;
121
+ }
122
+ async hasTurn(turnId) {
123
+ this.assertOpen();
124
+ return this.doc.turns.has(turnId);
125
+ }
126
+ async childrenOf(parentId) {
127
+ this.assertOpen();
128
+ if (parentId !== null && !this.doc.turns.has(parentId))
129
+ throw missingParent(parentId);
130
+ return (this.doc.children.get(parentKeyOf(parentId)) ?? []).map((id) => {
131
+ const turn = this.doc.turns.get(id);
132
+ if (!turn)
133
+ throw brokenTopology(`Child list references missing turn: ${id}`);
134
+ return cloneJson(turn);
135
+ });
136
+ }
137
+ async threadTo(turnId) {
138
+ this.assertOpen();
139
+ const thread = [];
140
+ const seen = new Set();
141
+ let currentId = turnId;
142
+ while (currentId !== null) {
143
+ if (seen.has(currentId))
144
+ throw cycleDetected(currentId);
145
+ seen.add(currentId);
146
+ const turn = this.doc.turns.get(currentId);
147
+ if (!turn)
148
+ throw brokenTopology(`Thread references missing turn: ${currentId}`);
149
+ thread.push(turn);
150
+ currentId = turn.parentId;
151
+ }
152
+ return cloneJson(thread.reverse());
153
+ }
154
+ async leaves() {
155
+ this.assertOpen();
156
+ const leaves = [];
157
+ const visit = (parentId) => {
158
+ for (const childId of this.doc.children.get(parentKeyOf(parentId)) ?? []) {
159
+ const turn = this.doc.turns.get(childId);
160
+ if (!turn)
161
+ throw brokenTopology(`Child list references missing turn: ${childId}`);
162
+ if ((this.doc.children.get(childId) ?? []).length === 0) {
163
+ leaves.push(turn);
164
+ }
165
+ else {
166
+ visit(childId);
167
+ }
168
+ }
169
+ };
170
+ visit(null);
171
+ return cloneJson(leaves);
172
+ }
173
+ subscribe(listener) {
174
+ this.assertOpen();
175
+ this.doc.listeners.add(listener);
176
+ return () => {
177
+ this.doc.listeners.delete(listener);
178
+ };
179
+ }
180
+ async export() {
181
+ this.assertOpen();
182
+ const turns = [];
183
+ const visit = (parentId) => {
184
+ for (const childId of this.doc.children.get(parentKeyOf(parentId)) ?? []) {
185
+ const turn = this.doc.turns.get(childId);
186
+ if (!turn)
187
+ throw brokenTopology(`Child list references missing turn: ${childId}`);
188
+ turns.push(turn);
189
+ visit(childId);
190
+ }
191
+ };
192
+ visit(null);
193
+ return cloneJson({ loom: this.doc.loom, turns });
194
+ }
195
+ close() {
196
+ this.closed = true;
197
+ this.doc.listeners.delete(this.emit);
198
+ }
199
+ assertOpen() {
200
+ if (this.closed)
201
+ throw closedHandle();
202
+ }
203
+ emit(event) {
204
+ for (const listener of this.doc.listeners)
205
+ listener(event);
206
+ }
207
+ }
208
+ function validateSnapshot(snapshot) {
209
+ if (!snapshot || typeof snapshot !== "object") {
210
+ throw invalidSnapshot("Snapshot must be an object");
211
+ }
212
+ if (!snapshot.loom || typeof snapshot.loom.id !== "string") {
213
+ throw invalidSnapshot("Snapshot needs a loom id");
214
+ }
215
+ if (!Array.isArray(snapshot.turns))
216
+ throw invalidSnapshot("Snapshot turns must be an array");
217
+ assertJsonEncodable(snapshot, "loom snapshot");
218
+ const ids = new Set();
219
+ for (const turn of snapshot.turns) {
220
+ if (!turn || typeof turn.id !== "string")
221
+ throw invalidSnapshot("Every turn needs a string id");
222
+ if (turn.id === ROOT_CHILDREN_KEY)
223
+ throw invalidSnapshot(`${ROOT_CHILDREN_KEY} is reserved`);
224
+ if (ids.has(turn.id))
225
+ throw duplicateTurnId(turn.id);
226
+ if (turn.loomId !== snapshot.loom.id) {
227
+ throw invalidSnapshot(`Turn ${turn.id} belongs to ${turn.loomId}, expected ${snapshot.loom.id}`);
228
+ }
229
+ ids.add(turn.id);
230
+ }
231
+ for (const turn of snapshot.turns) {
232
+ if (turn.parentId !== null && !ids.has(turn.parentId))
233
+ throw missingParent(turn.parentId);
234
+ }
235
+ for (const turn of snapshot.turns) {
236
+ const seen = new Set();
237
+ let current = turn.id;
238
+ while (current !== null) {
239
+ if (seen.has(current))
240
+ throw cycleDetected(current);
241
+ seen.add(current);
242
+ const currentTurn = snapshot.turns.find((candidate) => candidate.id === current);
243
+ if (!currentTurn)
244
+ throw brokenTopology(`Missing turn while validating thread: ${current}`);
245
+ current = currentTurn.parentId;
246
+ }
247
+ }
248
+ }
249
+ function parentKeyOf(parentId) {
250
+ return parentId ?? ROOT_CHILDREN_KEY;
251
+ }
252
+ function omitUndefined(value) {
253
+ return Object.fromEntries(Object.entries(value).filter(([, entryValue]) => entryValue !== undefined));
254
+ }
255
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { Loom, LoomInfo, Turn, TurnId } from "../types.js";
2
+ export declare const TEXT_STORY_PROFILE: "org.lync.profile.textStory.v1";
3
+ export type TextStoryProfile = typeof TEXT_STORY_PROFILE;
4
+ export interface TextStoryLoomMeta {
5
+ profile: TextStoryProfile;
6
+ title?: string;
7
+ }
8
+ export interface TextStoryTurnPayload {
9
+ text: string;
10
+ }
11
+ export interface TextStoryTurnMeta {
12
+ role?: string;
13
+ revises?: TurnId;
14
+ generatedBy?: unknown;
15
+ }
16
+ export type TextStoryLoom = Loom<TextStoryTurnPayload, TextStoryLoomMeta, TextStoryTurnMeta>;
17
+ export type TextStoryTurn = Turn<TextStoryTurnPayload, TextStoryTurnMeta>;
18
+ export declare function textStoryLoomMeta(meta?: Omit<TextStoryLoomMeta, "profile">): TextStoryLoomMeta;
19
+ export declare function isTextStoryLoomMeta(meta: unknown): meta is TextStoryLoomMeta;
20
+ export declare function assertTextStoryLoomInfo(info: LoomInfo<unknown>): asserts info is LoomInfo<TextStoryLoomMeta>;
21
+ export declare function isTextStoryTurnPayload(payload: unknown): payload is TextStoryTurnPayload;
22
+ export declare function isTextStoryTurnMeta(meta: unknown): meta is TextStoryTurnMeta;
23
+ export declare function isTextStoryTurn(turn: Turn<unknown, unknown>): turn is TextStoryTurn;
24
+ export declare function assertTextStoryTurn(turn: Turn<unknown, unknown>): asserts turn is TextStoryTurn;
25
+ export declare function assertTextStoryThread(turns: Turn<unknown, unknown>[]): asserts turns is TextStoryTurn[];
26
+ //# sourceMappingURL=text-story.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-story.d.ts","sourceRoot":"","sources":["../../src/profiles/text-story.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,MAAM,EACP,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,kBAAkB,EAAG,+BAAwC,CAAC;AAE3E,MAAM,MAAM,gBAAgB,GAAG,OAAO,kBAAkB,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,CAClB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,CAAC;AAE1E,wBAAgB,iBAAiB,CAC/B,IAAI,GAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAM,GAC5C,iBAAiB,CAKnB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,iBAAiB,CAI3B;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GACtB,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,iBAAiB,CAAC,CAM7C;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,GACf,OAAO,IAAI,oBAAoB,CAEjC;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,iBAAiB,CAQ3B;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,GAC3B,IAAI,IAAI,aAAa,CAKvB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,GAC3B,OAAO,CAAC,IAAI,IAAI,aAAa,CAO/B;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAC9B,OAAO,CAAC,KAAK,IAAI,aAAa,EAAE,CAIlC"}
@@ -0,0 +1,55 @@
1
+ export const TEXT_STORY_PROFILE = "org.lync.profile.textStory.v1";
2
+ export function textStoryLoomMeta(meta = {}) {
3
+ return {
4
+ ...meta,
5
+ profile: TEXT_STORY_PROFILE,
6
+ };
7
+ }
8
+ export function isTextStoryLoomMeta(meta) {
9
+ if (!isRecord(meta))
10
+ return false;
11
+ if (meta.profile !== TEXT_STORY_PROFILE)
12
+ return false;
13
+ return meta.title === undefined || typeof meta.title === "string";
14
+ }
15
+ export function assertTextStoryLoomInfo(info) {
16
+ if (!isTextStoryLoomMeta(info.meta)) {
17
+ throw new TypeError(`Expected loom meta profile ${TEXT_STORY_PROFILE}`);
18
+ }
19
+ }
20
+ export function isTextStoryTurnPayload(payload) {
21
+ return isRecord(payload) && typeof payload.text === "string";
22
+ }
23
+ export function isTextStoryTurnMeta(meta) {
24
+ if (meta === undefined)
25
+ return true;
26
+ if (!isRecord(meta))
27
+ return false;
28
+ if (meta.role !== undefined && typeof meta.role !== "string")
29
+ return false;
30
+ if (meta.revises !== undefined && typeof meta.revises !== "string") {
31
+ return false;
32
+ }
33
+ return true;
34
+ }
35
+ export function isTextStoryTurn(turn) {
36
+ return (isTextStoryTurnPayload(turn.payload) &&
37
+ isTextStoryTurnMeta(turn.meta));
38
+ }
39
+ export function assertTextStoryTurn(turn) {
40
+ if (!isTextStoryTurnPayload(turn.payload)) {
41
+ throw new TypeError("Expected text-story turn payload with string text");
42
+ }
43
+ if (!isTextStoryTurnMeta(turn.meta)) {
44
+ throw new TypeError("Expected text-story turn metadata");
45
+ }
46
+ }
47
+ export function assertTextStoryThread(turns) {
48
+ for (const turn of turns) {
49
+ assertTextStoryTurn(turn);
50
+ }
51
+ }
52
+ function isRecord(value) {
53
+ return typeof value === "object" && value !== null && !Array.isArray(value);
54
+ }
55
+ //# sourceMappingURL=text-story.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-story.js","sourceRoot":"","sources":["../../src/profiles/text-story.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,kBAAkB,GAAG,+BAAwC,CAAC;AA2B3E,MAAM,UAAU,iBAAiB,CAC/B,OAA2C,EAAE;IAE7C,OAAO;QACL,GAAG,IAAI;QACP,OAAO,EAAE,kBAAkB;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAa;IAEb,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,IAAI,CAAC,OAAO,KAAK,kBAAkB;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,IAAuB;IAEvB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,SAAS,CACjB,8BAA8B,kBAAkB,EAAE,CACnD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAAgB;IAEhB,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAa;IAEb,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3E,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,IAA4B;IAE5B,OAAO,CACL,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;QACpC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAA4B;IAE5B,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAA+B;IAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { IndexId, LoomId, LoomReference, TurnId } from "./types.js";
2
+ export interface ReferenceUrlOptions {
3
+ param?: string;
4
+ }
5
+ export declare function loomRef(loomId: LoomId): LoomReference;
6
+ export declare function turnRef(loomId: LoomId, turnId: TurnId): LoomReference;
7
+ export declare function threadRef(loomId: LoomId, turnId: TurnId): LoomReference;
8
+ export declare function indexRef(indexId: IndexId): LoomReference;
9
+ export declare function parseReference(value: unknown): LoomReference;
10
+ export declare function encodeReference(ref: LoomReference): string;
11
+ export declare function decodeReference(encoded: string): LoomReference;
12
+ export declare function referenceToUrl(ref: LoomReference, location: Location | URL, options?: ReferenceUrlOptions): string;
13
+ export declare function referenceFromUrl(location: Location | URL, options?: ReferenceUrlOptions): LoomReference | null;
14
+ //# sourceMappingURL=references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../src/references.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIzE,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAErD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAErE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAEvE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAExD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CA2B5D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAE1D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAO9D;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,QAAQ,GAAG,GAAG,EACxB,OAAO,GAAE,mBAAwB,GAChC,MAAM,CAOR;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,GAAG,GAAG,EACxB,OAAO,GAAE,mBAAwB,GAChC,aAAa,GAAG,IAAI,CAItB"}
@@ -0,0 +1,109 @@
1
+ import { invalidReference } from "./errors.js";
2
+ const BASE64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
3
+ export function loomRef(loomId) {
4
+ return { v: 1, kind: "loom", loomId };
5
+ }
6
+ export function turnRef(loomId, turnId) {
7
+ return { v: 1, kind: "turn", loomId, turnId };
8
+ }
9
+ export function threadRef(loomId, turnId) {
10
+ return { v: 1, kind: "thread", loomId, turnId };
11
+ }
12
+ export function indexRef(indexId) {
13
+ return { v: 1, kind: "index", indexId };
14
+ }
15
+ export function parseReference(value) {
16
+ if (!value || typeof value !== "object") {
17
+ throw invalidReference("Reference must be an object");
18
+ }
19
+ const ref = value;
20
+ if (ref.v !== 1)
21
+ throw invalidReference("Unsupported reference version");
22
+ if (ref.kind === "loom" && typeof ref.loomId === "string") {
23
+ return loomRef(ref.loomId);
24
+ }
25
+ if (ref.kind === "turn" &&
26
+ typeof ref.loomId === "string" &&
27
+ typeof ref.turnId === "string") {
28
+ return turnRef(ref.loomId, ref.turnId);
29
+ }
30
+ if (ref.kind === "thread" &&
31
+ typeof ref.loomId === "string" &&
32
+ typeof ref.turnId === "string") {
33
+ return threadRef(ref.loomId, ref.turnId);
34
+ }
35
+ if (ref.kind === "index" && typeof ref.indexId === "string") {
36
+ return indexRef(ref.indexId);
37
+ }
38
+ throw invalidReference("Invalid reference shape");
39
+ }
40
+ export function encodeReference(ref) {
41
+ return encodeBase64Url(JSON.stringify(parseReference(ref)));
42
+ }
43
+ export function decodeReference(encoded) {
44
+ try {
45
+ return parseReference(JSON.parse(decodeBase64Url(encoded)));
46
+ }
47
+ catch (error) {
48
+ if (error instanceof Error && error.name === "LoomError")
49
+ throw error;
50
+ throw invalidReference("Invalid encoded reference");
51
+ }
52
+ }
53
+ export function referenceToUrl(ref, location, options = {}) {
54
+ const param = options.param ?? "ref";
55
+ const url = new URL(location.href);
56
+ url.search = "";
57
+ url.hash = "";
58
+ url.searchParams.set(param, encodeReference(ref));
59
+ return url.toString();
60
+ }
61
+ export function referenceFromUrl(location, options = {}) {
62
+ const param = options.param ?? "ref";
63
+ const encoded = new URLSearchParams(location.search).get(param);
64
+ return encoded ? decodeReference(encoded) : null;
65
+ }
66
+ function encodeBase64Url(value) {
67
+ const bytes = new TextEncoder().encode(value);
68
+ const base64 = encodeBase64(bytes);
69
+ return base64.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, "");
70
+ }
71
+ function decodeBase64Url(value) {
72
+ const normalized = value.replace(/-/g, "+").replace(/_/g, "/");
73
+ const padded = normalized.padEnd(normalized.length + ((4 - (normalized.length % 4)) % 4), "=");
74
+ return new TextDecoder().decode(decodeBase64(padded));
75
+ }
76
+ function encodeBase64(bytes) {
77
+ let output = "";
78
+ for (let index = 0; index < bytes.length; index += 3) {
79
+ const first = bytes[index];
80
+ const second = bytes[index + 1];
81
+ const third = bytes[index + 2];
82
+ output += BASE64_ALPHABET[first >> 2];
83
+ output += BASE64_ALPHABET[((first & 0x03) << 4) | ((second ?? 0) >> 4)];
84
+ output += second === undefined
85
+ ? "="
86
+ : BASE64_ALPHABET[((second & 0x0f) << 2) | ((third ?? 0) >> 6)];
87
+ output += third === undefined ? "=" : BASE64_ALPHABET[third & 0x3f];
88
+ }
89
+ return output;
90
+ }
91
+ function decodeBase64(value) {
92
+ const clean = value.replace(/=+$/g, "");
93
+ const bytes = [];
94
+ let buffer = 0;
95
+ let bits = 0;
96
+ for (const char of clean) {
97
+ const value = BASE64_ALPHABET.indexOf(char);
98
+ if (value < 0)
99
+ throw new Error("Invalid base64 character");
100
+ buffer = (buffer << 6) | value;
101
+ bits += 6;
102
+ if (bits >= 8) {
103
+ bits -= 8;
104
+ bytes.push((buffer >> bits) & 0xff);
105
+ }
106
+ }
107
+ return Uint8Array.from(bytes);
108
+ }
109
+ //# sourceMappingURL=references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"references.js","sourceRoot":"","sources":["../src/references.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Server } from "node:http";
2
+ import { type LyncRelayOptions, type LyncRoomStatus } from "./relay.js";
3
+ /**
4
+ * Mount the relay on an existing Node HTTP server. Adds an `upgrade` listener
5
+ * that handles only `path` (default `/lync`) and passes the rest through, so a
6
+ * web app can share one server between its routes and lync sync.
7
+ */
8
+ export interface AttachLyncServerOptions extends Omit<LyncRelayOptions, "dir" | "onConnection"> {
9
+ /** Directory of per-root append-only files. */
10
+ storageDir: string;
11
+ /** URL path to serve the relay on. Default `/lync`. */
12
+ path?: string;
13
+ /** Send a WebSocket ping on this interval (ms) to keep proxies from idling out. */
14
+ keepAliveInterval?: number;
15
+ /** Reject upgrades once this many sockets are connected. */
16
+ maxConnections?: number;
17
+ }
18
+ export interface AttachedLyncServer {
19
+ /** Read-only snapshot of the relay's live rooms. See `LyncRelay.status`. */
20
+ status: () => LyncRoomStatus[];
21
+ close: () => Promise<void>;
22
+ }
23
+ export declare function attachLyncServer(server: Server, options: AttachLyncServerOptions): AttachedLyncServer;
24
+ //# sourceMappingURL=attach.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach.d.ts","sourceRoot":"","sources":["../../src/relay/attach.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,MAAM,EAAE,MAAM,WAAW,CAAC;AAEzD,OAAO,EAAmB,KAAK,gBAAgB,EAAwB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/G;;;;GAIG;AAEH,MAAM,WAAW,uBAAwB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,cAAc,CAAC;IAC7F,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,MAAM,EAAE,MAAM,cAAc,EAAE,CAAC;IAC/B,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG,kBAAkB,CAsDrG"}
@@ -0,0 +1,54 @@
1
+ import { createLyncRelay } from "./relay.js";
2
+ export function attachLyncServer(server, options) {
3
+ const path = options.path ?? "/lync";
4
+ const log = options.log ?? ((message) => process.stderr.write(`${message}\n`));
5
+ const live = new Set();
6
+ const pingTimer = options.keepAliveInterval && options.keepAliveInterval > 0
7
+ ? setInterval(() => {
8
+ for (const ws of live) {
9
+ if (ws.readyState === ws.OPEN) {
10
+ try {
11
+ ws.ping();
12
+ }
13
+ catch {
14
+ live.delete(ws);
15
+ }
16
+ }
17
+ }
18
+ }, options.keepAliveInterval)
19
+ : undefined;
20
+ pingTimer?.unref?.();
21
+ const relay = createLyncRelay({
22
+ dir: options.storageDir,
23
+ token: options.token,
24
+ authenticate: options.authenticate,
25
+ log,
26
+ onConnection: (ws) => {
27
+ live.add(ws);
28
+ ws.on("close", () => live.delete(ws));
29
+ },
30
+ });
31
+ const onUpgrade = (request, socket, head) => {
32
+ if ((request.url ?? "").split("?")[0] !== path)
33
+ return;
34
+ if (options.maxConnections !== undefined && live.size >= options.maxConnections) {
35
+ log(`[lync relay] rejecting upgrade: at max connections (${options.maxConnections})`);
36
+ socket.write("HTTP/1.1 503 Service Unavailable\r\n\r\n");
37
+ socket.destroy();
38
+ return;
39
+ }
40
+ relay.handleUpgrade(request, socket, head);
41
+ };
42
+ server.on("upgrade", onUpgrade);
43
+ return {
44
+ status: () => relay.status(),
45
+ close: async () => {
46
+ server.off("upgrade", onUpgrade);
47
+ if (pingTimer)
48
+ clearInterval(pingTimer);
49
+ live.clear();
50
+ await relay.close();
51
+ },
52
+ };
53
+ }
54
+ //# sourceMappingURL=attach.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attach.js","sourceRoot":"","sources":["../../src/relay/attach.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAoE,MAAM,YAAY,CAAC;AAyB/G,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAAgC;IAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC;IACvF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;IAExC,MAAM,SAAS,GACb,OAAO,CAAC,iBAAiB,IAAI,OAAO,CAAC,iBAAiB,GAAG,CAAC;QACxD,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE;YACf,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;gBACtB,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;oBAC9B,IAAI,CAAC;wBACH,EAAE,CAAC,IAAI,EAAE,CAAC;oBACZ,CAAC;oBAAC,MAAM,CAAC;wBACP,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC;QAC/B,CAAC,CAAC,SAAS,CAAC;IAChB,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC;IAErB,MAAM,KAAK,GAAG,eAAe,CAAC;QAC5B,GAAG,EAAE,OAAO,CAAC,UAAU;QACvB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,GAAG;QACH,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE;YACnB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACb,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,CAAC,OAAwB,EAAE,MAAc,EAAE,IAAY,EAAE,EAAE;QAC3E,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,OAAO;QACvD,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAChF,GAAG,CAAC,uDAAuD,OAAO,CAAC,cAAc,GAAG,CAAC,CAAC;YACtF,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;YACzD,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEhC,OAAO;QACL,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE;QAC5B,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACjC,IAAI,SAAS;gBAAE,aAAa,CAAC,SAAS,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createLyncRelay, type LyncRelay, type LyncRelayOptions, type LyncRelaySocket, type LyncRoomStatus } from "./relay.js";
2
+ export { startLyncServe, type LyncServeOptions, type LyncSyncServer } from "./serve.js";
3
+ export { attachLyncServer, type AttachLyncServerOptions, type AttachedLyncServer } from "./attach.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/relay/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/H,OAAO,EAAE,cAAc,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createLyncRelay } from "./relay.js";
2
+ export { startLyncServe } from "./serve.js";
3
+ export { attachLyncServer } from "./attach.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/relay/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAoF,MAAM,YAAY,CAAC;AAC/H,OAAO,EAAE,cAAc,EAA8C,MAAM,YAAY,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAyD,MAAM,aAAa,CAAC"}