@n8n/crdt 0.2.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 (59) hide show
  1. package/LICENSE.md +88 -0
  2. package/LICENSE_EE.md +27 -0
  3. package/README.md +155 -0
  4. package/dist/awareness/index.d.ts +1 -0
  5. package/dist/awareness/index.js +6 -0
  6. package/dist/awareness/index.js.map +1 -0
  7. package/dist/awareness/yjs-awareness.d.ts +17 -0
  8. package/dist/awareness/yjs-awareness.js +66 -0
  9. package/dist/awareness/yjs-awareness.js.map +1 -0
  10. package/dist/build.tsbuildinfo +1 -0
  11. package/dist/index.d.ts +15 -0
  12. package/dist/index.js +59 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/protocol.d.ts +22 -0
  15. package/dist/protocol.js +74 -0
  16. package/dist/protocol.js.map +1 -0
  17. package/dist/providers/yjs.d.ts +5 -0
  18. package/dist/providers/yjs.js +307 -0
  19. package/dist/providers/yjs.js.map +1 -0
  20. package/dist/sync/base-sync-provider.d.ts +24 -0
  21. package/dist/sync/base-sync-provider.js +82 -0
  22. package/dist/sync/base-sync-provider.js.map +1 -0
  23. package/dist/sync/index.d.ts +2 -0
  24. package/dist/sync/index.js +7 -0
  25. package/dist/sync/index.js.map +1 -0
  26. package/dist/sync/types.d.ts +12 -0
  27. package/dist/sync/types.js +3 -0
  28. package/dist/sync/types.js.map +1 -0
  29. package/dist/transports/index.d.ts +5 -0
  30. package/dist/transports/index.js +12 -0
  31. package/dist/transports/index.js.map +1 -0
  32. package/dist/transports/message-port.d.ts +18 -0
  33. package/dist/transports/message-port.js +72 -0
  34. package/dist/transports/message-port.js.map +1 -0
  35. package/dist/transports/mock.d.ts +18 -0
  36. package/dist/transports/mock.js +52 -0
  37. package/dist/transports/mock.js.map +1 -0
  38. package/dist/transports/types.d.ts +10 -0
  39. package/dist/transports/types.js +3 -0
  40. package/dist/transports/types.js.map +1 -0
  41. package/dist/transports/websocket.d.ts +41 -0
  42. package/dist/transports/websocket.js +175 -0
  43. package/dist/transports/websocket.js.map +1 -0
  44. package/dist/transports/worker.d.ts +28 -0
  45. package/dist/transports/worker.js +108 -0
  46. package/dist/transports/worker.js.map +1 -0
  47. package/dist/types.d.ts +120 -0
  48. package/dist/types.js +25 -0
  49. package/dist/types.js.map +1 -0
  50. package/dist/undo/index.d.ts +1 -0
  51. package/dist/undo/index.js +7 -0
  52. package/dist/undo/index.js.map +1 -0
  53. package/dist/undo/yjs-undo-manager.d.ts +26 -0
  54. package/dist/undo/yjs-undo-manager.js +145 -0
  55. package/dist/undo/yjs-undo-manager.js.map +1 -0
  56. package/dist/utils.d.ts +3 -0
  57. package/dist/utils.js +31 -0
  58. package/dist/utils.js.map +1 -0
  59. package/package.json +54 -0
@@ -0,0 +1,307 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.YjsProvider = void 0;
37
+ const Y = __importStar(require("yjs"));
38
+ const yjs_awareness_1 = require("../awareness/yjs-awareness");
39
+ const types_1 = require("../types");
40
+ const yjs_undo_manager_1 = require("../undo/yjs-undo-manager");
41
+ function getChangeOrigin(transaction) {
42
+ if (transaction.origin instanceof Y.UndoManager) {
43
+ return types_1.ChangeOrigin.undoRedo;
44
+ }
45
+ return transaction.local ? types_1.ChangeOrigin.local : types_1.ChangeOrigin.remote;
46
+ }
47
+ function toJSONValue(value) {
48
+ if (value instanceof Y.Map || value instanceof Y.Array || value instanceof Y.Text) {
49
+ return value.toJSON();
50
+ }
51
+ return value;
52
+ }
53
+ const WRAPPER = Symbol('crdt-wrapper');
54
+ function wrapYjsValue(value) {
55
+ if (value instanceof Y.Map) {
56
+ const yMap = value;
57
+ yMap[WRAPPER] ??= new YjsMap(value);
58
+ return yMap[WRAPPER];
59
+ }
60
+ if (value instanceof Y.Array) {
61
+ const yArray = value;
62
+ yArray[WRAPPER] ??= new YjsArray(value);
63
+ return yArray[WRAPPER];
64
+ }
65
+ return value;
66
+ }
67
+ class YjsArray {
68
+ constructor(yArray) {
69
+ this.yArray = yArray;
70
+ }
71
+ getYArray() {
72
+ return this.yArray;
73
+ }
74
+ get length() {
75
+ return this.yArray.length;
76
+ }
77
+ get(index) {
78
+ const value = this.yArray.get(index);
79
+ return wrapYjsValue(value);
80
+ }
81
+ push(...items) {
82
+ const unwrapped = items.map((item) => {
83
+ if (item instanceof YjsMap)
84
+ return item.getYMap();
85
+ if (item instanceof YjsArray)
86
+ return item.getYArray();
87
+ return item;
88
+ });
89
+ this.yArray.push(unwrapped);
90
+ }
91
+ insert(index, ...items) {
92
+ const unwrapped = items.map((item) => {
93
+ if (item instanceof YjsMap)
94
+ return item.getYMap();
95
+ if (item instanceof YjsArray)
96
+ return item.getYArray();
97
+ return item;
98
+ });
99
+ this.yArray.insert(index, unwrapped);
100
+ }
101
+ delete(index, count = 1) {
102
+ this.yArray.delete(index, count);
103
+ }
104
+ toArray() {
105
+ return this.yArray.toJSON();
106
+ }
107
+ toJSON() {
108
+ return this.toArray();
109
+ }
110
+ onDeepChange(handler) {
111
+ const observer = (events, transaction) => {
112
+ const changes = [];
113
+ for (const event of events) {
114
+ if (event instanceof Y.YArrayEvent) {
115
+ changes.push(arrayEventToChange(event));
116
+ }
117
+ else if (event instanceof Y.YMapEvent) {
118
+ changes.push(...mapEventToChanges(event));
119
+ }
120
+ }
121
+ if (changes.length > 0) {
122
+ handler(changes, getChangeOrigin(transaction));
123
+ }
124
+ };
125
+ this.yArray.observeDeep(observer);
126
+ return () => {
127
+ this.yArray.unobserveDeep(observer);
128
+ };
129
+ }
130
+ }
131
+ function arrayEventToChange(event) {
132
+ return {
133
+ path: event.path,
134
+ delta: event.delta,
135
+ };
136
+ }
137
+ function mapEventToChanges(event) {
138
+ return Array.from(event.changes.keys, ([key, change]) => ({
139
+ path: [...event.path, key],
140
+ action: change.action,
141
+ ...(change.action !== types_1.ChangeAction.delete && {
142
+ value: toJSONValue(event.target.get(key)),
143
+ }),
144
+ ...(change.action !== types_1.ChangeAction.add && {
145
+ oldValue: toJSONValue(change.oldValue),
146
+ }),
147
+ }));
148
+ }
149
+ class YjsMap {
150
+ constructor(yMap) {
151
+ this.yMap = yMap;
152
+ }
153
+ getYMap() {
154
+ return this.yMap;
155
+ }
156
+ get(key) {
157
+ const value = this.yMap.get(key);
158
+ return wrapYjsValue(value);
159
+ }
160
+ set(key, value) {
161
+ if (value instanceof YjsMap) {
162
+ this.yMap.set(key, value.getYMap());
163
+ }
164
+ else if (value instanceof YjsArray) {
165
+ this.yMap.set(key, value.getYArray());
166
+ }
167
+ else {
168
+ this.yMap.set(key, value);
169
+ }
170
+ }
171
+ delete(key) {
172
+ this.yMap.delete(key);
173
+ }
174
+ has(key) {
175
+ return this.yMap.has(key);
176
+ }
177
+ keys() {
178
+ return this.yMap.keys();
179
+ }
180
+ *values() {
181
+ for (const value of this.yMap.values()) {
182
+ yield wrapYjsValue(value);
183
+ }
184
+ }
185
+ *entries() {
186
+ for (const [key, value] of this.yMap.entries()) {
187
+ yield [key, wrapYjsValue(value)];
188
+ }
189
+ }
190
+ toJSON() {
191
+ return this.yMap.toJSON();
192
+ }
193
+ onDeepChange(handler) {
194
+ const observer = (events, transaction) => {
195
+ const changes = [];
196
+ for (const event of events) {
197
+ if (event instanceof Y.YArrayEvent) {
198
+ changes.push(arrayEventToChange(event));
199
+ }
200
+ else if (event instanceof Y.YMapEvent) {
201
+ changes.push(...mapEventToChanges(event));
202
+ }
203
+ }
204
+ if (changes.length > 0) {
205
+ handler(changes, getChangeOrigin(transaction));
206
+ }
207
+ };
208
+ this.yMap.observeDeep(observer);
209
+ return () => {
210
+ this.yMap.unobserveDeep(observer);
211
+ };
212
+ }
213
+ }
214
+ class YjsDoc {
215
+ constructor(id) {
216
+ this.id = id;
217
+ this.awareness = null;
218
+ this.undoManager = null;
219
+ this._synced = false;
220
+ this.syncHandlers = new Set();
221
+ this.yDoc = new Y.Doc({ guid: id });
222
+ }
223
+ get synced() {
224
+ return this._synced;
225
+ }
226
+ setSynced(synced) {
227
+ if (this._synced === synced)
228
+ return;
229
+ this._synced = synced;
230
+ for (const handler of this.syncHandlers) {
231
+ handler(synced);
232
+ }
233
+ }
234
+ onSync(handler) {
235
+ this.syncHandlers.add(handler);
236
+ return () => {
237
+ this.syncHandlers.delete(handler);
238
+ };
239
+ }
240
+ getMap(name) {
241
+ return wrapYjsValue(this.yDoc.getMap(name));
242
+ }
243
+ getArray(name) {
244
+ return wrapYjsValue(this.yDoc.getArray(name));
245
+ }
246
+ createMap() {
247
+ return new YjsMap(new Y.Map());
248
+ }
249
+ createArray() {
250
+ return new YjsArray(new Y.Array());
251
+ }
252
+ transact(fn) {
253
+ this.yDoc.transact(fn, yjs_undo_manager_1.YjsUndoManagerOrigin);
254
+ }
255
+ encodeState() {
256
+ return Y.encodeStateAsUpdate(this.yDoc);
257
+ }
258
+ encodeStateVector() {
259
+ return Y.encodeStateVector(this.yDoc);
260
+ }
261
+ applyUpdate(update) {
262
+ Y.applyUpdate(this.yDoc, update, yjs_undo_manager_1.YjsRemoteOrigin);
263
+ }
264
+ onUpdate(handler) {
265
+ const wrappedHandler = (update, _origin, _doc, transaction) => {
266
+ handler(update, getChangeOrigin(transaction));
267
+ };
268
+ this.yDoc.on('update', wrappedHandler);
269
+ return () => {
270
+ this.yDoc.off('update', wrappedHandler);
271
+ };
272
+ }
273
+ getAwareness() {
274
+ this.awareness ??= new yjs_awareness_1.YjsAwareness(this.yDoc);
275
+ return this.awareness;
276
+ }
277
+ createUndoManager(options) {
278
+ if (this.undoManager) {
279
+ throw new Error('Undo manager already exists for this document');
280
+ }
281
+ this.undoManager = new yjs_undo_manager_1.YjsUndoManager(this.yDoc, options);
282
+ return this.undoManager;
283
+ }
284
+ destroy() {
285
+ if (this.undoManager) {
286
+ this.undoManager.destroy();
287
+ this.undoManager = null;
288
+ }
289
+ if (this.awareness) {
290
+ this.awareness.destroy();
291
+ this.awareness = null;
292
+ }
293
+ this.syncHandlers.clear();
294
+ this._synced = false;
295
+ this.yDoc.destroy();
296
+ }
297
+ }
298
+ class YjsProvider {
299
+ constructor() {
300
+ this.name = types_1.CRDTEngine.yjs;
301
+ }
302
+ createDoc(id) {
303
+ return new YjsDoc(id);
304
+ }
305
+ }
306
+ exports.YjsProvider = YjsProvider;
307
+ //# sourceMappingURL=yjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yjs.js","sourceRoot":"","sources":["../../src/providers/yjs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { SyncTransport } from '../transports';
2
+ import type { CRDTDoc, Unsubscribe } from '../types';
3
+ import type { SyncProvider } from './types';
4
+ type SyncStateHandler = (syncing: boolean) => void;
5
+ type ErrorHandler = (error: Error) => void;
6
+ export declare class BaseSyncProvider implements SyncProvider {
7
+ readonly doc: CRDTDoc;
8
+ readonly transport: SyncTransport;
9
+ private _syncing;
10
+ private stateHandlers;
11
+ private errorHandlers;
12
+ private unsubscribeDoc;
13
+ private unsubscribeTransport;
14
+ constructor(doc: CRDTDoc, transport: SyncTransport);
15
+ get syncing(): boolean;
16
+ start(): Promise<void>;
17
+ stop(): void;
18
+ onSyncStateChange(handler: SyncStateHandler): Unsubscribe;
19
+ onError(handler: ErrorHandler): Unsubscribe;
20
+ private notifyStateChange;
21
+ private notifyError;
22
+ }
23
+ export declare function createSyncProvider(doc: CRDTDoc, transport: SyncTransport): SyncProvider;
24
+ export {};
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BaseSyncProvider = void 0;
4
+ exports.createSyncProvider = createSyncProvider;
5
+ class BaseSyncProvider {
6
+ constructor(doc, transport) {
7
+ this.doc = doc;
8
+ this.transport = transport;
9
+ this._syncing = false;
10
+ this.stateHandlers = new Set();
11
+ this.errorHandlers = new Set();
12
+ this.unsubscribeDoc = null;
13
+ this.unsubscribeTransport = null;
14
+ }
15
+ get syncing() {
16
+ return this._syncing;
17
+ }
18
+ async start() {
19
+ if (this._syncing)
20
+ return;
21
+ await this.transport.connect();
22
+ this.unsubscribeTransport = this.transport.onReceive((data) => {
23
+ try {
24
+ this.doc.applyUpdate(data);
25
+ }
26
+ catch (error) {
27
+ this.notifyError(error instanceof Error ? error : new Error(String(error)));
28
+ }
29
+ });
30
+ this.unsubscribeDoc = this.doc.onUpdate((update) => {
31
+ if (this.transport.connected) {
32
+ this.transport.send(update);
33
+ }
34
+ });
35
+ const initialState = this.doc.encodeState();
36
+ this.transport.send(initialState);
37
+ this._syncing = true;
38
+ this.notifyStateChange();
39
+ }
40
+ stop() {
41
+ if (!this._syncing)
42
+ return;
43
+ if (this.unsubscribeDoc) {
44
+ this.unsubscribeDoc();
45
+ this.unsubscribeDoc = null;
46
+ }
47
+ if (this.unsubscribeTransport) {
48
+ this.unsubscribeTransport();
49
+ this.unsubscribeTransport = null;
50
+ }
51
+ this.transport.disconnect();
52
+ this._syncing = false;
53
+ this.notifyStateChange();
54
+ }
55
+ onSyncStateChange(handler) {
56
+ this.stateHandlers.add(handler);
57
+ return () => {
58
+ this.stateHandlers.delete(handler);
59
+ };
60
+ }
61
+ onError(handler) {
62
+ this.errorHandlers.add(handler);
63
+ return () => {
64
+ this.errorHandlers.delete(handler);
65
+ };
66
+ }
67
+ notifyStateChange() {
68
+ for (const handler of this.stateHandlers) {
69
+ handler(this._syncing);
70
+ }
71
+ }
72
+ notifyError(error) {
73
+ for (const handler of this.errorHandlers) {
74
+ handler(error);
75
+ }
76
+ }
77
+ }
78
+ exports.BaseSyncProvider = BaseSyncProvider;
79
+ function createSyncProvider(doc, transport) {
80
+ return new BaseSyncProvider(doc, transport);
81
+ }
82
+ //# sourceMappingURL=base-sync-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-sync-provider.js","sourceRoot":"","sources":["../../src/sync/base-sync-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export type { SyncProvider, CreateSyncProvider } from './types';
2
+ export { BaseSyncProvider, createSyncProvider } from './base-sync-provider';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSyncProvider = exports.BaseSyncProvider = void 0;
4
+ var base_sync_provider_1 = require("./base-sync-provider");
5
+ Object.defineProperty(exports, "BaseSyncProvider", { enumerable: true, get: function () { return base_sync_provider_1.BaseSyncProvider; } });
6
+ Object.defineProperty(exports, "createSyncProvider", { enumerable: true, get: function () { return base_sync_provider_1.createSyncProvider; } });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":";;;AACA,2DAA4E;AAAnE,sHAAA,gBAAgB,OAAA;AAAE,wHAAA,kBAAkB,OAAA"}
@@ -0,0 +1,12 @@
1
+ import type { SyncTransport } from '../transports';
2
+ import type { CRDTDoc, Unsubscribe } from '../types';
3
+ export interface SyncProvider {
4
+ readonly doc: CRDTDoc;
5
+ readonly transport: SyncTransport;
6
+ readonly syncing: boolean;
7
+ start(): Promise<void>;
8
+ stop(): void;
9
+ onSyncStateChange(handler: (syncing: boolean) => void): Unsubscribe;
10
+ onError(handler: (error: Error) => void): Unsubscribe;
11
+ }
12
+ export type CreateSyncProvider = (doc: CRDTDoc, transport: SyncTransport) => SyncProvider;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sync/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export type { SyncTransport } from './types';
2
+ export { MockTransport } from './mock';
3
+ export { MessagePortTransport } from './message-port';
4
+ export { WebSocketTransport, type WebSocketTransportConfig } from './websocket';
5
+ export { WorkerTransport, type WorkerTransportConfig } from './worker';
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorkerTransport = exports.WebSocketTransport = exports.MessagePortTransport = exports.MockTransport = void 0;
4
+ var mock_1 = require("./mock");
5
+ Object.defineProperty(exports, "MockTransport", { enumerable: true, get: function () { return mock_1.MockTransport; } });
6
+ var message_port_1 = require("./message-port");
7
+ Object.defineProperty(exports, "MessagePortTransport", { enumerable: true, get: function () { return message_port_1.MessagePortTransport; } });
8
+ var websocket_1 = require("./websocket");
9
+ Object.defineProperty(exports, "WebSocketTransport", { enumerable: true, get: function () { return websocket_1.WebSocketTransport; } });
10
+ var worker_1 = require("./worker");
11
+ Object.defineProperty(exports, "WorkerTransport", { enumerable: true, get: function () { return worker_1.WorkerTransport; } });
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transports/index.ts"],"names":[],"mappings":";;;AACA,+BAAuC;AAA9B,qGAAA,aAAa,OAAA;AACtB,+CAAsD;AAA7C,oHAAA,oBAAoB,OAAA;AAC7B,yCAAgF;AAAvE,+GAAA,kBAAkB,OAAA;AAC3B,mCAAuE;AAA9D,yGAAA,eAAe,OAAA"}
@@ -0,0 +1,18 @@
1
+ import type { Unsubscribe } from '../types';
2
+ import type { SyncTransport } from './types';
3
+ type ReceiveHandler = (data: Uint8Array) => void;
4
+ export declare class MessagePortTransport implements SyncTransport {
5
+ private readonly port;
6
+ private receiveHandlers;
7
+ private _connected;
8
+ private messageHandler;
9
+ constructor(port: MessagePort);
10
+ get connected(): boolean;
11
+ send(data: Uint8Array): void;
12
+ onReceive(handler: ReceiveHandler): Unsubscribe;
13
+ connect(): Promise<void>;
14
+ disconnect(): void;
15
+ onConnectionChange(_handler: (connected: boolean) => void): Unsubscribe;
16
+ onError(_handler: (error: Error) => void): Unsubscribe;
17
+ }
18
+ export {};
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MessagePortTransport = void 0;
4
+ function isPortMessage(data) {
5
+ return (typeof data === 'object' &&
6
+ data !== null &&
7
+ 'type' in data &&
8
+ data.type === 'sync');
9
+ }
10
+ class MessagePortTransport {
11
+ constructor(port) {
12
+ this.port = port;
13
+ this.receiveHandlers = new Set();
14
+ this._connected = false;
15
+ this.messageHandler = null;
16
+ }
17
+ get connected() {
18
+ return this._connected;
19
+ }
20
+ send(data) {
21
+ if (!this._connected) {
22
+ throw new Error('Transport not connected');
23
+ }
24
+ const copy = new Uint8Array(data);
25
+ const message = { type: 'sync', data: copy };
26
+ this.port.postMessage(message, [copy.buffer]);
27
+ }
28
+ onReceive(handler) {
29
+ this.receiveHandlers.add(handler);
30
+ return () => {
31
+ this.receiveHandlers.delete(handler);
32
+ };
33
+ }
34
+ async connect() {
35
+ if (this._connected) {
36
+ return await Promise.resolve();
37
+ }
38
+ this.messageHandler = (event) => {
39
+ if (!isPortMessage(event.data))
40
+ return;
41
+ const message = event.data;
42
+ if (message.type === 'sync') {
43
+ const data = message.data instanceof Uint8Array ? message.data : new Uint8Array(message.data);
44
+ for (const handler of this.receiveHandlers) {
45
+ handler(data);
46
+ }
47
+ }
48
+ };
49
+ this.port.addEventListener('message', this.messageHandler);
50
+ this.port.start();
51
+ this._connected = true;
52
+ return await Promise.resolve();
53
+ }
54
+ disconnect() {
55
+ if (!this._connected) {
56
+ return;
57
+ }
58
+ if (this.messageHandler) {
59
+ this.port.removeEventListener('message', this.messageHandler);
60
+ this.messageHandler = null;
61
+ }
62
+ this._connected = false;
63
+ }
64
+ onConnectionChange(_handler) {
65
+ return () => { };
66
+ }
67
+ onError(_handler) {
68
+ return () => { };
69
+ }
70
+ }
71
+ exports.MessagePortTransport = MessagePortTransport;
72
+ //# sourceMappingURL=message-port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-port.js","sourceRoot":"","sources":["../../src/transports/message-port.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Unsubscribe } from '../types';
2
+ import type { SyncTransport } from './types';
3
+ type ReceiveHandler = (data: Uint8Array) => void;
4
+ export declare class MockTransport implements SyncTransport {
5
+ private peer;
6
+ private receiveHandlers;
7
+ private _connected;
8
+ get connected(): boolean;
9
+ static link(a: MockTransport, b: MockTransport): void;
10
+ send(data: Uint8Array): void;
11
+ onReceive(handler: ReceiveHandler): Unsubscribe;
12
+ connect(): Promise<void>;
13
+ disconnect(): void;
14
+ onConnectionChange(_handler: (connected: boolean) => void): Unsubscribe;
15
+ onError(_handler: (error: Error) => void): Unsubscribe;
16
+ private deliver;
17
+ }
18
+ export {};
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MockTransport = void 0;
4
+ class MockTransport {
5
+ constructor() {
6
+ this.peer = null;
7
+ this.receiveHandlers = new Set();
8
+ this._connected = false;
9
+ }
10
+ get connected() {
11
+ return this._connected;
12
+ }
13
+ static link(a, b) {
14
+ a.peer = b;
15
+ b.peer = a;
16
+ }
17
+ send(data) {
18
+ if (!this._connected) {
19
+ throw new Error('Transport not connected');
20
+ }
21
+ if (!this.peer) {
22
+ throw new Error('Transport has no peer');
23
+ }
24
+ this.peer.deliver(data);
25
+ }
26
+ onReceive(handler) {
27
+ this.receiveHandlers.add(handler);
28
+ return () => {
29
+ this.receiveHandlers.delete(handler);
30
+ };
31
+ }
32
+ async connect() {
33
+ this._connected = true;
34
+ return await Promise.resolve();
35
+ }
36
+ disconnect() {
37
+ this._connected = false;
38
+ }
39
+ onConnectionChange(_handler) {
40
+ return () => { };
41
+ }
42
+ onError(_handler) {
43
+ return () => { };
44
+ }
45
+ deliver(data) {
46
+ for (const handler of this.receiveHandlers) {
47
+ handler(data);
48
+ }
49
+ }
50
+ }
51
+ exports.MockTransport = MockTransport;
52
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/transports/mock.ts"],"names":[],"mappings":";;;AAeA,MAAa,aAAa;IAA1B;QACS,SAAI,GAAyB,IAAI,CAAC;QAClC,oBAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,eAAU,GAAG,KAAK,CAAC;IA2D5B,CAAC;IAzDA,IAAI,SAAS;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;IAKD,MAAM,CAAC,IAAI,CAAC,CAAgB,EAAE,CAAgB;QAC7C,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QACX,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IACZ,CAAC;IAED,IAAI,CAAC,IAAgB;QACpB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,SAAS,CAAC,OAAuB;QAChC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE;YACX,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,OAAO,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,UAAU;QACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IACzB,CAAC;IAGD,kBAAkB,CAAC,QAAsC;QACxD,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IACjB,CAAC;IAGD,OAAO,CAAC,QAAgC;QACvC,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IACjB,CAAC;IAKO,OAAO,CAAC,IAAgB;QAC/B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;IACF,CAAC;CACD;AA9DD,sCA8DC"}