@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.
- package/LICENSE.md +88 -0
- package/LICENSE_EE.md +27 -0
- package/README.md +155 -0
- package/dist/awareness/index.d.ts +1 -0
- package/dist/awareness/index.js +6 -0
- package/dist/awareness/index.js.map +1 -0
- package/dist/awareness/yjs-awareness.d.ts +17 -0
- package/dist/awareness/yjs-awareness.js +66 -0
- package/dist/awareness/yjs-awareness.js.map +1 -0
- package/dist/build.tsbuildinfo +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +59 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol.d.ts +22 -0
- package/dist/protocol.js +74 -0
- package/dist/protocol.js.map +1 -0
- package/dist/providers/yjs.d.ts +5 -0
- package/dist/providers/yjs.js +307 -0
- package/dist/providers/yjs.js.map +1 -0
- package/dist/sync/base-sync-provider.d.ts +24 -0
- package/dist/sync/base-sync-provider.js +82 -0
- package/dist/sync/base-sync-provider.js.map +1 -0
- package/dist/sync/index.d.ts +2 -0
- package/dist/sync/index.js +7 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/types.d.ts +12 -0
- package/dist/sync/types.js +3 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/transports/index.d.ts +5 -0
- package/dist/transports/index.js +12 -0
- package/dist/transports/index.js.map +1 -0
- package/dist/transports/message-port.d.ts +18 -0
- package/dist/transports/message-port.js +72 -0
- package/dist/transports/message-port.js.map +1 -0
- package/dist/transports/mock.d.ts +18 -0
- package/dist/transports/mock.js +52 -0
- package/dist/transports/mock.js.map +1 -0
- package/dist/transports/types.d.ts +10 -0
- package/dist/transports/types.js +3 -0
- package/dist/transports/types.js.map +1 -0
- package/dist/transports/websocket.d.ts +41 -0
- package/dist/transports/websocket.js +175 -0
- package/dist/transports/websocket.js.map +1 -0
- package/dist/transports/worker.d.ts +28 -0
- package/dist/transports/worker.js +108 -0
- package/dist/transports/worker.js.map +1 -0
- package/dist/types.d.ts +120 -0
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -0
- package/dist/undo/index.d.ts +1 -0
- package/dist/undo/index.js +7 -0
- package/dist/undo/index.js.map +1 -0
- package/dist/undo/yjs-undo-manager.d.ts +26 -0
- package/dist/undo/yjs-undo-manager.js +145 -0
- package/dist/undo/yjs-undo-manager.js.map +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.js +31 -0
- package/dist/utils.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Unsubscribe } from '../types';
|
|
2
|
+
export interface SyncTransport {
|
|
3
|
+
send(data: Uint8Array): void;
|
|
4
|
+
onReceive(handler: (data: Uint8Array) => void): Unsubscribe;
|
|
5
|
+
connect(): Promise<void>;
|
|
6
|
+
disconnect(): void;
|
|
7
|
+
readonly connected: boolean;
|
|
8
|
+
onConnectionChange(handler: (connected: boolean) => void): Unsubscribe;
|
|
9
|
+
onError(handler: (error: Error) => void): Unsubscribe;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/transports/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Unsubscribe } from '../types';
|
|
2
|
+
import type { SyncTransport } from './types';
|
|
3
|
+
type ReceiveHandler = (data: Uint8Array) => void;
|
|
4
|
+
type ConnectionHandler = (connected: boolean) => void;
|
|
5
|
+
type ErrorHandler = (error: Error) => void;
|
|
6
|
+
export interface WebSocketTransportConfig {
|
|
7
|
+
url: string;
|
|
8
|
+
reconnect?: boolean;
|
|
9
|
+
maxReconnectAttempts?: number;
|
|
10
|
+
reconnectDelay?: number;
|
|
11
|
+
maxReconnectDelay?: number;
|
|
12
|
+
reconnectBackoff?: number;
|
|
13
|
+
connectionTimeout?: number;
|
|
14
|
+
}
|
|
15
|
+
export declare class WebSocketTransport implements SyncTransport {
|
|
16
|
+
private ws;
|
|
17
|
+
private receiveHandlers;
|
|
18
|
+
private connectionHandlers;
|
|
19
|
+
private errorHandlers;
|
|
20
|
+
private _connected;
|
|
21
|
+
private reconnectAttempts;
|
|
22
|
+
private reconnectTimeout;
|
|
23
|
+
private shouldReconnect;
|
|
24
|
+
private isConnecting;
|
|
25
|
+
private connectionPromise;
|
|
26
|
+
private readonly config;
|
|
27
|
+
constructor(config: WebSocketTransportConfig);
|
|
28
|
+
get connected(): boolean;
|
|
29
|
+
send(data: Uint8Array): void;
|
|
30
|
+
onReceive(handler: ReceiveHandler): Unsubscribe;
|
|
31
|
+
onConnectionChange(handler: ConnectionHandler): Unsubscribe;
|
|
32
|
+
onError(handler: ErrorHandler): Unsubscribe;
|
|
33
|
+
connect(): Promise<void>;
|
|
34
|
+
disconnect(): void;
|
|
35
|
+
private doConnect;
|
|
36
|
+
private scheduleReconnect;
|
|
37
|
+
private clearReconnectTimeout;
|
|
38
|
+
private notifyConnectionChange;
|
|
39
|
+
private notifyError;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebSocketTransport = void 0;
|
|
4
|
+
class WebSocketTransport {
|
|
5
|
+
constructor(config) {
|
|
6
|
+
this.ws = null;
|
|
7
|
+
this.receiveHandlers = new Set();
|
|
8
|
+
this.connectionHandlers = new Set();
|
|
9
|
+
this.errorHandlers = new Set();
|
|
10
|
+
this._connected = false;
|
|
11
|
+
this.reconnectAttempts = 0;
|
|
12
|
+
this.reconnectTimeout = null;
|
|
13
|
+
this.shouldReconnect = false;
|
|
14
|
+
this.isConnecting = false;
|
|
15
|
+
this.connectionPromise = null;
|
|
16
|
+
this.config = {
|
|
17
|
+
url: config.url,
|
|
18
|
+
reconnect: config.reconnect ?? true,
|
|
19
|
+
maxReconnectAttempts: config.maxReconnectAttempts ?? Infinity,
|
|
20
|
+
reconnectDelay: config.reconnectDelay ?? 1000,
|
|
21
|
+
maxReconnectDelay: config.maxReconnectDelay ?? 30000,
|
|
22
|
+
reconnectBackoff: config.reconnectBackoff ?? 2,
|
|
23
|
+
connectionTimeout: config.connectionTimeout ?? 10000,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
get connected() {
|
|
27
|
+
return this._connected;
|
|
28
|
+
}
|
|
29
|
+
send(data) {
|
|
30
|
+
if (!this._connected || !this.ws) {
|
|
31
|
+
throw new Error('Transport not connected');
|
|
32
|
+
}
|
|
33
|
+
this.ws.send(data);
|
|
34
|
+
}
|
|
35
|
+
onReceive(handler) {
|
|
36
|
+
this.receiveHandlers.add(handler);
|
|
37
|
+
return () => {
|
|
38
|
+
this.receiveHandlers.delete(handler);
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
onConnectionChange(handler) {
|
|
42
|
+
this.connectionHandlers.add(handler);
|
|
43
|
+
return () => {
|
|
44
|
+
this.connectionHandlers.delete(handler);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
onError(handler) {
|
|
48
|
+
this.errorHandlers.add(handler);
|
|
49
|
+
return () => {
|
|
50
|
+
this.errorHandlers.delete(handler);
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async connect() {
|
|
54
|
+
this.clearReconnectTimeout();
|
|
55
|
+
if (this._connected) {
|
|
56
|
+
return await Promise.resolve();
|
|
57
|
+
}
|
|
58
|
+
if (this.isConnecting && this.connectionPromise) {
|
|
59
|
+
return await this.connectionPromise;
|
|
60
|
+
}
|
|
61
|
+
this.shouldReconnect = this.config.reconnect;
|
|
62
|
+
this.connectionPromise = this.doConnect();
|
|
63
|
+
return await this.connectionPromise;
|
|
64
|
+
}
|
|
65
|
+
disconnect() {
|
|
66
|
+
this.shouldReconnect = false;
|
|
67
|
+
this.clearReconnectTimeout();
|
|
68
|
+
if (this.ws) {
|
|
69
|
+
this.ws.onclose = null;
|
|
70
|
+
this.ws.onerror = null;
|
|
71
|
+
this.ws.onmessage = null;
|
|
72
|
+
this.ws.onopen = null;
|
|
73
|
+
this.ws.close();
|
|
74
|
+
this.ws = null;
|
|
75
|
+
}
|
|
76
|
+
if (this._connected) {
|
|
77
|
+
this._connected = false;
|
|
78
|
+
this.notifyConnectionChange(false);
|
|
79
|
+
}
|
|
80
|
+
this.isConnecting = false;
|
|
81
|
+
this.connectionPromise = null;
|
|
82
|
+
}
|
|
83
|
+
async doConnect() {
|
|
84
|
+
this.isConnecting = true;
|
|
85
|
+
return await new Promise((resolve, reject) => {
|
|
86
|
+
const timeoutId = setTimeout(() => {
|
|
87
|
+
if (this.ws) {
|
|
88
|
+
this.ws.close();
|
|
89
|
+
}
|
|
90
|
+
reject(new Error('Connection timeout'));
|
|
91
|
+
}, this.config.connectionTimeout);
|
|
92
|
+
try {
|
|
93
|
+
this.ws = new WebSocket(this.config.url);
|
|
94
|
+
this.ws.binaryType = 'arraybuffer';
|
|
95
|
+
this.ws.onopen = () => {
|
|
96
|
+
clearTimeout(timeoutId);
|
|
97
|
+
this._connected = true;
|
|
98
|
+
this.isConnecting = false;
|
|
99
|
+
this.reconnectAttempts = 0;
|
|
100
|
+
this.notifyConnectionChange(true);
|
|
101
|
+
resolve();
|
|
102
|
+
};
|
|
103
|
+
this.ws.onclose = () => {
|
|
104
|
+
clearTimeout(timeoutId);
|
|
105
|
+
const wasConnected = this._connected;
|
|
106
|
+
this._connected = false;
|
|
107
|
+
this.isConnecting = false;
|
|
108
|
+
if (wasConnected) {
|
|
109
|
+
this.notifyConnectionChange(false);
|
|
110
|
+
}
|
|
111
|
+
if (this.shouldReconnect) {
|
|
112
|
+
this.scheduleReconnect();
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
this.ws.onerror = () => {
|
|
116
|
+
clearTimeout(timeoutId);
|
|
117
|
+
const error = new Error('WebSocket error');
|
|
118
|
+
this.notifyError(error);
|
|
119
|
+
if (this.isConnecting) {
|
|
120
|
+
this.isConnecting = false;
|
|
121
|
+
reject(error);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
this.ws.onmessage = (event) => {
|
|
125
|
+
if (event.data instanceof ArrayBuffer) {
|
|
126
|
+
const data = new Uint8Array(event.data);
|
|
127
|
+
for (const handler of this.receiveHandlers) {
|
|
128
|
+
handler(data);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
clearTimeout(timeoutId);
|
|
135
|
+
this.isConnecting = false;
|
|
136
|
+
reject(error instanceof Error ? error : new Error(String(error)));
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
scheduleReconnect() {
|
|
141
|
+
if (!this.shouldReconnect) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {
|
|
145
|
+
this.notifyError(new Error('Max reconnection attempts reached'));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const delay = Math.min(this.config.reconnectDelay * Math.pow(this.config.reconnectBackoff, this.reconnectAttempts), this.config.maxReconnectDelay);
|
|
149
|
+
this.reconnectAttempts++;
|
|
150
|
+
this.reconnectTimeout = setTimeout(() => {
|
|
151
|
+
this.reconnectTimeout = null;
|
|
152
|
+
this.doConnect().catch((error) => {
|
|
153
|
+
this.notifyError(error);
|
|
154
|
+
});
|
|
155
|
+
}, delay);
|
|
156
|
+
}
|
|
157
|
+
clearReconnectTimeout() {
|
|
158
|
+
if (this.reconnectTimeout) {
|
|
159
|
+
clearTimeout(this.reconnectTimeout);
|
|
160
|
+
this.reconnectTimeout = null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
notifyConnectionChange(connected) {
|
|
164
|
+
for (const handler of this.connectionHandlers) {
|
|
165
|
+
handler(connected);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
notifyError(error) {
|
|
169
|
+
for (const handler of this.errorHandlers) {
|
|
170
|
+
handler(error);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
exports.WebSocketTransport = WebSocketTransport;
|
|
175
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/transports/websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Unsubscribe } from '../types';
|
|
2
|
+
import type { SyncTransport } from './types';
|
|
3
|
+
type ReceiveHandler = (data: Uint8Array) => void;
|
|
4
|
+
export interface WorkerTransportConfig {
|
|
5
|
+
port: MessagePort | Worker;
|
|
6
|
+
docId: string;
|
|
7
|
+
serverUrl: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class WorkerTransport implements SyncTransport {
|
|
10
|
+
private receiveHandlers;
|
|
11
|
+
private _connected;
|
|
12
|
+
private messageHandler;
|
|
13
|
+
private connectPromise;
|
|
14
|
+
private connectResolve;
|
|
15
|
+
private readonly port;
|
|
16
|
+
private readonly docId;
|
|
17
|
+
private readonly serverUrl;
|
|
18
|
+
constructor(config: WorkerTransportConfig);
|
|
19
|
+
get connected(): boolean;
|
|
20
|
+
send(data: Uint8Array): void;
|
|
21
|
+
onReceive(handler: ReceiveHandler): Unsubscribe;
|
|
22
|
+
connect(): Promise<void>;
|
|
23
|
+
disconnect(): void;
|
|
24
|
+
onConnectionChange(_handler: (connected: boolean) => void): Unsubscribe;
|
|
25
|
+
onError(_handler: (error: Error) => void): Unsubscribe;
|
|
26
|
+
private handleBinaryMessage;
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkerTransport = void 0;
|
|
4
|
+
const protocol_1 = require("../protocol");
|
|
5
|
+
class WorkerTransport {
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.receiveHandlers = new Set();
|
|
8
|
+
this._connected = false;
|
|
9
|
+
this.messageHandler = null;
|
|
10
|
+
this.connectPromise = null;
|
|
11
|
+
this.connectResolve = null;
|
|
12
|
+
this.port = config.port;
|
|
13
|
+
this.docId = config.docId;
|
|
14
|
+
this.serverUrl = config.serverUrl;
|
|
15
|
+
}
|
|
16
|
+
get connected() {
|
|
17
|
+
return this._connected;
|
|
18
|
+
}
|
|
19
|
+
send(data) {
|
|
20
|
+
if (!this._connected) {
|
|
21
|
+
throw new Error('Transport not connected');
|
|
22
|
+
}
|
|
23
|
+
const messageType = data[0];
|
|
24
|
+
const payload = data.subarray(1);
|
|
25
|
+
const message = (0, protocol_1.encodeWithDocId)(messageType, this.docId, payload);
|
|
26
|
+
this.port.postMessage(message);
|
|
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
|
+
if (this.connectPromise) {
|
|
39
|
+
return await this.connectPromise;
|
|
40
|
+
}
|
|
41
|
+
this.connectPromise = new Promise((resolve) => {
|
|
42
|
+
this.connectResolve = resolve;
|
|
43
|
+
this.messageHandler = (event) => {
|
|
44
|
+
const data = event.data;
|
|
45
|
+
if (data instanceof Uint8Array || data instanceof ArrayBuffer) {
|
|
46
|
+
const bytes = data instanceof ArrayBuffer ? new Uint8Array(data) : data;
|
|
47
|
+
this.handleBinaryMessage(bytes);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
this.port.addEventListener('message', this.messageHandler);
|
|
51
|
+
if ('start' in this.port) {
|
|
52
|
+
this.port.start();
|
|
53
|
+
}
|
|
54
|
+
const subscribeMessage = (0, protocol_1.encodeWithDocId)(protocol_1.MESSAGE_SUBSCRIBE, this.docId, (0, protocol_1.encodeString)(this.serverUrl));
|
|
55
|
+
this.port.postMessage(subscribeMessage);
|
|
56
|
+
});
|
|
57
|
+
return await this.connectPromise;
|
|
58
|
+
}
|
|
59
|
+
disconnect() {
|
|
60
|
+
if (!this._connected && !this.connectPromise) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const unsubscribeMessage = (0, protocol_1.encodeWithDocId)(protocol_1.MESSAGE_UNSUBSCRIBE, this.docId);
|
|
64
|
+
this.port.postMessage(unsubscribeMessage);
|
|
65
|
+
if (this.messageHandler) {
|
|
66
|
+
this.port.removeEventListener('message', this.messageHandler);
|
|
67
|
+
this.messageHandler = null;
|
|
68
|
+
}
|
|
69
|
+
this._connected = false;
|
|
70
|
+
this.connectPromise = null;
|
|
71
|
+
this.connectResolve = null;
|
|
72
|
+
}
|
|
73
|
+
onConnectionChange(_handler) {
|
|
74
|
+
return () => { };
|
|
75
|
+
}
|
|
76
|
+
onError(_handler) {
|
|
77
|
+
return () => { };
|
|
78
|
+
}
|
|
79
|
+
handleBinaryMessage(data) {
|
|
80
|
+
try {
|
|
81
|
+
const { messageType, docId, payload } = (0, protocol_1.decodeWithDocId)(data);
|
|
82
|
+
if (docId !== this.docId) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (messageType === protocol_1.MESSAGE_CONNECTED) {
|
|
86
|
+
this._connected = true;
|
|
87
|
+
}
|
|
88
|
+
else if (messageType === protocol_1.MESSAGE_DISCONNECTED) {
|
|
89
|
+
this._connected = false;
|
|
90
|
+
}
|
|
91
|
+
if (messageType === protocol_1.MESSAGE_INITIAL_SYNC && this.connectResolve) {
|
|
92
|
+
this._connected = true;
|
|
93
|
+
this.connectResolve();
|
|
94
|
+
this.connectResolve = null;
|
|
95
|
+
}
|
|
96
|
+
const serverFormat = new Uint8Array(1 + payload.length);
|
|
97
|
+
serverFormat[0] = messageType;
|
|
98
|
+
serverFormat.set(payload, 1);
|
|
99
|
+
for (const handler of this.receiveHandlers) {
|
|
100
|
+
handler(serverFormat);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.WorkerTransport = WorkerTransport;
|
|
108
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/transports/worker.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
export type Unsubscribe = () => void;
|
|
2
|
+
export declare const ChangeAction: {
|
|
3
|
+
readonly add: "add";
|
|
4
|
+
readonly update: "update";
|
|
5
|
+
readonly delete: "delete";
|
|
6
|
+
};
|
|
7
|
+
export type ChangeAction = (typeof ChangeAction)[keyof typeof ChangeAction];
|
|
8
|
+
export interface DeepChangeEvent {
|
|
9
|
+
path: Array<string | number>;
|
|
10
|
+
action: ChangeAction;
|
|
11
|
+
value?: unknown;
|
|
12
|
+
oldValue?: unknown;
|
|
13
|
+
}
|
|
14
|
+
export interface ArrayDelta {
|
|
15
|
+
insert?: unknown[];
|
|
16
|
+
retain?: number;
|
|
17
|
+
delete?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ArrayChangeEvent {
|
|
20
|
+
path: Array<string | number>;
|
|
21
|
+
delta: ArrayDelta[];
|
|
22
|
+
}
|
|
23
|
+
export type DeepChange = ArrayChangeEvent | DeepChangeEvent;
|
|
24
|
+
export declare const ChangeOrigin: {
|
|
25
|
+
readonly local: "local";
|
|
26
|
+
readonly remote: "remote";
|
|
27
|
+
readonly undoRedo: "undoRedo";
|
|
28
|
+
};
|
|
29
|
+
export type ChangeOrigin = (typeof ChangeOrigin)[keyof typeof ChangeOrigin];
|
|
30
|
+
export declare function isMapChange(change: DeepChange): change is DeepChangeEvent;
|
|
31
|
+
export declare function isArrayChange(change: DeepChange): change is ArrayChangeEvent;
|
|
32
|
+
export interface CRDTArray<T = unknown> {
|
|
33
|
+
readonly length: number;
|
|
34
|
+
get(index: number): T | undefined;
|
|
35
|
+
push(...items: T[]): void;
|
|
36
|
+
insert(index: number, ...items: T[]): void;
|
|
37
|
+
delete(index: number, count?: number): void;
|
|
38
|
+
toArray(): T[];
|
|
39
|
+
toJSON(): T[];
|
|
40
|
+
onDeepChange(handler: (changes: DeepChange[], origin: ChangeOrigin) => void): Unsubscribe;
|
|
41
|
+
}
|
|
42
|
+
export interface CRDTMap<T = unknown> {
|
|
43
|
+
get(key: string): T | CRDTMap<unknown> | CRDTArray<unknown> | undefined;
|
|
44
|
+
set(key: string, value: T | CRDTMap<unknown> | CRDTArray<unknown>): void;
|
|
45
|
+
delete(key: string): void;
|
|
46
|
+
has(key: string): boolean;
|
|
47
|
+
keys(): IterableIterator<string>;
|
|
48
|
+
values(): IterableIterator<T | CRDTMap<unknown> | CRDTArray<unknown>>;
|
|
49
|
+
entries(): IterableIterator<[string, T | CRDTMap<unknown> | CRDTArray<unknown>]>;
|
|
50
|
+
toJSON(): Record<string, T>;
|
|
51
|
+
onDeepChange(handler: (changes: DeepChange[], origin: ChangeOrigin) => void): Unsubscribe;
|
|
52
|
+
}
|
|
53
|
+
export interface CRDTDoc {
|
|
54
|
+
readonly id: string;
|
|
55
|
+
readonly synced: boolean;
|
|
56
|
+
getMap<T = unknown>(name: string): CRDTMap<T>;
|
|
57
|
+
getArray<T = unknown>(name: string): CRDTArray<T>;
|
|
58
|
+
createMap<T = unknown>(): CRDTMap<T>;
|
|
59
|
+
createArray<T = unknown>(): CRDTArray<T>;
|
|
60
|
+
transact(fn: () => void): void;
|
|
61
|
+
encodeState(): Uint8Array;
|
|
62
|
+
encodeStateVector(): Uint8Array;
|
|
63
|
+
applyUpdate(update: Uint8Array): void;
|
|
64
|
+
onUpdate(handler: (update: Uint8Array, origin: ChangeOrigin) => void): Unsubscribe;
|
|
65
|
+
onSync(handler: (isSynced: boolean) => void): Unsubscribe;
|
|
66
|
+
setSynced(synced: boolean): void;
|
|
67
|
+
getAwareness<T extends AwarenessState = AwarenessState>(): CRDTAwareness<T>;
|
|
68
|
+
createUndoManager(options?: UndoManagerOptions): CRDTUndoManager;
|
|
69
|
+
destroy(): void;
|
|
70
|
+
}
|
|
71
|
+
export interface CRDTProvider {
|
|
72
|
+
readonly name: string;
|
|
73
|
+
createDoc(id: string): CRDTDoc;
|
|
74
|
+
}
|
|
75
|
+
export declare const CRDTEngine: {
|
|
76
|
+
readonly yjs: "yjs";
|
|
77
|
+
};
|
|
78
|
+
export type CRDTEngine = (typeof CRDTEngine)[keyof typeof CRDTEngine];
|
|
79
|
+
export interface CRDTConfig {
|
|
80
|
+
engine: CRDTEngine;
|
|
81
|
+
}
|
|
82
|
+
export type AwarenessClientId = number;
|
|
83
|
+
export type AwarenessState = Record<string, unknown>;
|
|
84
|
+
export interface AwarenessChangeEvent {
|
|
85
|
+
added: AwarenessClientId[];
|
|
86
|
+
updated: AwarenessClientId[];
|
|
87
|
+
removed: AwarenessClientId[];
|
|
88
|
+
}
|
|
89
|
+
export interface CRDTAwareness<T extends AwarenessState = AwarenessState> {
|
|
90
|
+
readonly clientId: AwarenessClientId;
|
|
91
|
+
getLocalState(): T | null;
|
|
92
|
+
setLocalState(state: T | null): void;
|
|
93
|
+
setLocalStateField<K extends keyof T>(field: K, value: T[K]): void;
|
|
94
|
+
getStates(): Map<AwarenessClientId, T>;
|
|
95
|
+
onChange(handler: (event: AwarenessChangeEvent, origin: ChangeOrigin) => void): Unsubscribe;
|
|
96
|
+
encodeState(clients?: AwarenessClientId[]): Uint8Array;
|
|
97
|
+
applyUpdate(update: Uint8Array): void;
|
|
98
|
+
onUpdate(handler: (update: Uint8Array, origin: ChangeOrigin) => void): Unsubscribe;
|
|
99
|
+
removeStates(clients: AwarenessClientId[]): void;
|
|
100
|
+
destroy(): void;
|
|
101
|
+
}
|
|
102
|
+
export interface UndoManagerOptions {
|
|
103
|
+
captureTimeout?: number;
|
|
104
|
+
}
|
|
105
|
+
export interface UndoStackChangeEvent {
|
|
106
|
+
canUndo: boolean;
|
|
107
|
+
canRedo: boolean;
|
|
108
|
+
}
|
|
109
|
+
export interface CRDTUndoManager {
|
|
110
|
+
undo(): boolean;
|
|
111
|
+
redo(): boolean;
|
|
112
|
+
canUndo(): boolean;
|
|
113
|
+
canRedo(): boolean;
|
|
114
|
+
stopCapturing(): void;
|
|
115
|
+
clear(): void;
|
|
116
|
+
onStackChange(handler: (event: UndoStackChangeEvent) => void): Unsubscribe;
|
|
117
|
+
setMeta<V>(key: string, value: V): void;
|
|
118
|
+
getMeta<V>(key: string): V | undefined;
|
|
119
|
+
destroy(): void;
|
|
120
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CRDTEngine = exports.ChangeOrigin = exports.ChangeAction = void 0;
|
|
4
|
+
exports.isMapChange = isMapChange;
|
|
5
|
+
exports.isArrayChange = isArrayChange;
|
|
6
|
+
exports.ChangeAction = {
|
|
7
|
+
add: 'add',
|
|
8
|
+
update: 'update',
|
|
9
|
+
delete: 'delete',
|
|
10
|
+
};
|
|
11
|
+
exports.ChangeOrigin = {
|
|
12
|
+
local: 'local',
|
|
13
|
+
remote: 'remote',
|
|
14
|
+
undoRedo: 'undoRedo',
|
|
15
|
+
};
|
|
16
|
+
function isMapChange(change) {
|
|
17
|
+
return 'action' in change;
|
|
18
|
+
}
|
|
19
|
+
function isArrayChange(change) {
|
|
20
|
+
return 'delta' in change;
|
|
21
|
+
}
|
|
22
|
+
exports.CRDTEngine = {
|
|
23
|
+
yjs: 'yjs',
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AA8EA,kCAEC;AAKD,sCAEC;AA/EY,QAAA,YAAY,GAAG;IAC3B,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACP,CAAC;AAoDE,QAAA,YAAY,GAAG;IAE3B,KAAK,EAAE,OAAO;IAEd,MAAM,EAAE,QAAQ;IAEhB,QAAQ,EAAE,UAAU;CACX,CAAC;AAOX,SAAgB,WAAW,CAAC,MAAkB;IAC7C,OAAO,QAAQ,IAAI,MAAM,CAAC;AAC3B,CAAC;AAKD,SAAgB,aAAa,CAAC,MAAkB;IAC/C,OAAO,OAAO,IAAI,MAAM,CAAC;AAC1B,CAAC;AA0IY,QAAA,UAAU,GAAG;IACzB,GAAG,EAAE,KAAK;CACD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { YjsUndoManager, YjsUndoManagerOrigin } from './yjs-undo-manager';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.YjsUndoManagerOrigin = exports.YjsUndoManager = void 0;
|
|
4
|
+
var yjs_undo_manager_1 = require("./yjs-undo-manager");
|
|
5
|
+
Object.defineProperty(exports, "YjsUndoManager", { enumerable: true, get: function () { return yjs_undo_manager_1.YjsUndoManager; } });
|
|
6
|
+
Object.defineProperty(exports, "YjsUndoManagerOrigin", { enumerable: true, get: function () { return yjs_undo_manager_1.YjsUndoManagerOrigin; } });
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/undo/index.ts"],"names":[],"mappings":";;;AAAA,uDAA0E;AAAjE,kHAAA,cAAc,OAAA;AAAE,wHAAA,oBAAoB,OAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as Y from 'yjs';
|
|
2
|
+
import type { CRDTUndoManager, UndoManagerOptions, UndoStackChangeEvent, Unsubscribe } from '../types';
|
|
3
|
+
export declare const YjsUndoManagerOrigin: unique symbol;
|
|
4
|
+
export declare const YjsRemoteOrigin: unique symbol;
|
|
5
|
+
export declare class YjsUndoManager implements CRDTUndoManager {
|
|
6
|
+
private readonly undoManager;
|
|
7
|
+
private readonly stackChangeHandlers;
|
|
8
|
+
private destroyed;
|
|
9
|
+
private lastMeta;
|
|
10
|
+
private prevCanUndo;
|
|
11
|
+
private prevCanRedo;
|
|
12
|
+
constructor(yDoc: Y.Doc, options?: UndoManagerOptions);
|
|
13
|
+
private handleStackChange;
|
|
14
|
+
private handleStackItemPopped;
|
|
15
|
+
private notifyIfChanged;
|
|
16
|
+
undo(): boolean;
|
|
17
|
+
redo(): boolean;
|
|
18
|
+
canUndo(): boolean;
|
|
19
|
+
canRedo(): boolean;
|
|
20
|
+
stopCapturing(): void;
|
|
21
|
+
clear(): void;
|
|
22
|
+
onStackChange(handler: (event: UndoStackChangeEvent) => void): Unsubscribe;
|
|
23
|
+
setMeta<V>(key: string, value: V): void;
|
|
24
|
+
getMeta<V>(key: string): V | undefined;
|
|
25
|
+
destroy(): void;
|
|
26
|
+
}
|