@framers/sql-storage-adapter 0.4.2 → 0.5.1
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/README.md +94 -2
- package/dist/adapters/electron/electronMainAdapter.d.ts +241 -0
- package/dist/adapters/electron/electronMainAdapter.d.ts.map +1 -0
- package/dist/adapters/electron/electronMainAdapter.js +442 -0
- package/dist/adapters/electron/electronMainAdapter.js.map +1 -0
- package/dist/adapters/electron/electronRendererAdapter.d.ts +177 -0
- package/dist/adapters/electron/electronRendererAdapter.d.ts.map +1 -0
- package/dist/adapters/electron/electronRendererAdapter.js +339 -0
- package/dist/adapters/electron/electronRendererAdapter.js.map +1 -0
- package/dist/adapters/electron/index.d.ts +74 -0
- package/dist/adapters/electron/index.d.ts.map +1 -0
- package/dist/adapters/electron/index.js +96 -0
- package/dist/adapters/electron/index.js.map +1 -0
- package/dist/adapters/electron/ipc/channels.d.ts +196 -0
- package/dist/adapters/electron/ipc/channels.d.ts.map +1 -0
- package/dist/adapters/electron/ipc/channels.js +121 -0
- package/dist/adapters/electron/ipc/channels.js.map +1 -0
- package/dist/adapters/electron/ipc/index.d.ts +11 -0
- package/dist/adapters/electron/ipc/index.d.ts.map +1 -0
- package/dist/adapters/electron/ipc/index.js +11 -0
- package/dist/adapters/electron/ipc/index.js.map +1 -0
- package/dist/adapters/electron/ipc/protocol.d.ts +78 -0
- package/dist/adapters/electron/ipc/protocol.d.ts.map +1 -0
- package/dist/adapters/electron/ipc/protocol.js +347 -0
- package/dist/adapters/electron/ipc/protocol.js.map +1 -0
- package/dist/adapters/electron/ipc/types.d.ts +248 -0
- package/dist/adapters/electron/ipc/types.d.ts.map +1 -0
- package/dist/adapters/electron/ipc/types.js +8 -0
- package/dist/adapters/electron/ipc/types.js.map +1 -0
- package/dist/adapters/electron/migration/autoMigrator.d.ts +184 -0
- package/dist/adapters/electron/migration/autoMigrator.d.ts.map +1 -0
- package/dist/adapters/electron/migration/autoMigrator.js +478 -0
- package/dist/adapters/electron/migration/autoMigrator.js.map +1 -0
- package/dist/adapters/electron/migration/index.d.ts +9 -0
- package/dist/adapters/electron/migration/index.d.ts.map +1 -0
- package/dist/adapters/electron/migration/index.js +9 -0
- package/dist/adapters/electron/migration/index.js.map +1 -0
- package/dist/adapters/electron/preload.d.ts +126 -0
- package/dist/adapters/electron/preload.d.ts.map +1 -0
- package/dist/adapters/electron/preload.js +254 -0
- package/dist/adapters/electron/preload.js.map +1 -0
- package/dist/adapters/electron/recovery/corruptionDetector.d.ts +214 -0
- package/dist/adapters/electron/recovery/corruptionDetector.d.ts.map +1 -0
- package/dist/adapters/electron/recovery/corruptionDetector.js +410 -0
- package/dist/adapters/electron/recovery/corruptionDetector.js.map +1 -0
- package/dist/adapters/electron/recovery/index.d.ts +11 -0
- package/dist/adapters/electron/recovery/index.d.ts.map +1 -0
- package/dist/adapters/electron/recovery/index.js +11 -0
- package/dist/adapters/electron/recovery/index.js.map +1 -0
- package/dist/adapters/electron/recovery/walCheckpoint.d.ts +186 -0
- package/dist/adapters/electron/recovery/walCheckpoint.d.ts.map +1 -0
- package/dist/adapters/electron/recovery/walCheckpoint.js +302 -0
- package/dist/adapters/electron/recovery/walCheckpoint.js.map +1 -0
- package/dist/adapters/electron/window/index.d.ts +9 -0
- package/dist/adapters/electron/window/index.d.ts.map +1 -0
- package/dist/adapters/electron/window/index.js +9 -0
- package/dist/adapters/electron/window/index.js.map +1 -0
- package/dist/adapters/electron/window/windowManager.d.ts +190 -0
- package/dist/adapters/electron/window/windowManager.d.ts.map +1 -0
- package/dist/adapters/electron/window/windowManager.js +358 -0
- package/dist/adapters/electron/window/windowManager.js.map +1 -0
- package/dist/core/contracts/context.d.ts +2 -2
- package/dist/core/contracts/context.d.ts.map +1 -1
- package/dist/core/database.d.ts +19 -0
- package/dist/core/database.d.ts.map +1 -1
- package/dist/core/database.js +4 -0
- package/dist/core/database.js.map +1 -1
- package/dist/core/resolver.d.ts +3 -0
- package/dist/core/resolver.d.ts.map +1 -1
- package/dist/core/resolver.js +39 -3
- package/dist/core/resolver.js.map +1 -1
- package/dist/features/sync/conflicts/conflictResolver.d.ts +222 -0
- package/dist/features/sync/conflicts/conflictResolver.d.ts.map +1 -0
- package/dist/features/sync/conflicts/conflictResolver.js +396 -0
- package/dist/features/sync/conflicts/conflictResolver.js.map +1 -0
- package/dist/features/sync/conflicts/index.d.ts +9 -0
- package/dist/features/sync/conflicts/index.d.ts.map +1 -0
- package/dist/features/sync/conflicts/index.js +9 -0
- package/dist/features/sync/conflicts/index.js.map +1 -0
- package/dist/features/sync/crossPlatformSync.d.ts +281 -0
- package/dist/features/sync/crossPlatformSync.d.ts.map +1 -0
- package/dist/features/sync/crossPlatformSync.js +623 -0
- package/dist/features/sync/crossPlatformSync.js.map +1 -0
- package/dist/features/sync/devices/deviceManager.d.ts +243 -0
- package/dist/features/sync/devices/deviceManager.d.ts.map +1 -0
- package/dist/features/sync/devices/deviceManager.js +494 -0
- package/dist/features/sync/devices/deviceManager.js.map +1 -0
- package/dist/features/sync/devices/index.d.ts +10 -0
- package/dist/features/sync/devices/index.d.ts.map +1 -0
- package/dist/features/sync/devices/index.js +10 -0
- package/dist/features/sync/devices/index.js.map +1 -0
- package/dist/features/sync/index.d.ts +37 -0
- package/dist/features/sync/index.d.ts.map +1 -0
- package/dist/features/sync/index.js +47 -0
- package/dist/features/sync/index.js.map +1 -0
- package/dist/features/sync/protocol/index.d.ts +11 -0
- package/dist/features/sync/protocol/index.d.ts.map +1 -0
- package/dist/features/sync/protocol/index.js +11 -0
- package/dist/features/sync/protocol/index.js.map +1 -0
- package/dist/features/sync/protocol/messages.d.ts +348 -0
- package/dist/features/sync/protocol/messages.d.ts.map +1 -0
- package/dist/features/sync/protocol/messages.js +216 -0
- package/dist/features/sync/protocol/messages.js.map +1 -0
- package/dist/features/sync/protocol/vectorClock.d.ts +164 -0
- package/dist/features/sync/protocol/vectorClock.d.ts.map +1 -0
- package/dist/features/sync/protocol/vectorClock.js +286 -0
- package/dist/features/sync/protocol/vectorClock.js.map +1 -0
- package/dist/features/sync/tables/index.d.ts +10 -0
- package/dist/features/sync/tables/index.d.ts.map +1 -0
- package/dist/features/sync/tables/index.js +10 -0
- package/dist/features/sync/tables/index.js.map +1 -0
- package/dist/features/sync/tables/syncLogManager.d.ts +216 -0
- package/dist/features/sync/tables/syncLogManager.d.ts.map +1 -0
- package/dist/features/sync/tables/syncLogManager.js +456 -0
- package/dist/features/sync/tables/syncLogManager.js.map +1 -0
- package/dist/features/sync/transport/httpTransport.d.ts +123 -0
- package/dist/features/sync/transport/httpTransport.d.ts.map +1 -0
- package/dist/features/sync/transport/httpTransport.js +380 -0
- package/dist/features/sync/transport/httpTransport.js.map +1 -0
- package/dist/features/sync/transport/index.d.ts +12 -0
- package/dist/features/sync/transport/index.d.ts.map +1 -0
- package/dist/features/sync/transport/index.js +12 -0
- package/dist/features/sync/transport/index.js.map +1 -0
- package/dist/features/sync/transport/transport.d.ts +259 -0
- package/dist/features/sync/transport/transport.d.ts.map +1 -0
- package/dist/features/sync/transport/transport.js +153 -0
- package/dist/features/sync/transport/transport.js.map +1 -0
- package/dist/features/sync/transport/websocketTransport.d.ts +126 -0
- package/dist/features/sync/transport/websocketTransport.d.ts.map +1 -0
- package/dist/features/sync/transport/websocketTransport.js +374 -0
- package/dist/features/sync/transport/websocketTransport.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/package.json +21 -1
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport Layer Interface.
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract for sync transports (WebSocket, HTTP polling, etc.).
|
|
5
|
+
* Transports handle the low-level communication between sync nodes.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import type { SyncMessage } from '../protocol/messages';
|
|
10
|
+
/**
|
|
11
|
+
* Transport connection state.
|
|
12
|
+
*/
|
|
13
|
+
export type TransportState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';
|
|
14
|
+
/**
|
|
15
|
+
* Transport configuration options.
|
|
16
|
+
*/
|
|
17
|
+
export interface TransportOptions {
|
|
18
|
+
/** Server endpoint URL */
|
|
19
|
+
endpoint: string;
|
|
20
|
+
/** Authentication token or API key */
|
|
21
|
+
authToken?: string;
|
|
22
|
+
/** Custom headers for HTTP requests */
|
|
23
|
+
headers?: Record<string, string>;
|
|
24
|
+
/** Connection timeout in milliseconds */
|
|
25
|
+
connectionTimeout?: number;
|
|
26
|
+
/** Request timeout in milliseconds */
|
|
27
|
+
requestTimeout?: number;
|
|
28
|
+
/** Enable automatic reconnection */
|
|
29
|
+
autoReconnect?: boolean;
|
|
30
|
+
/** Initial reconnection delay in milliseconds */
|
|
31
|
+
reconnectDelay?: number;
|
|
32
|
+
/** Maximum reconnection delay in milliseconds */
|
|
33
|
+
maxReconnectDelay?: number;
|
|
34
|
+
/** Maximum reconnection attempts (0 = unlimited) */
|
|
35
|
+
maxReconnectAttempts?: number;
|
|
36
|
+
/** Heartbeat interval in milliseconds (0 = disabled) */
|
|
37
|
+
heartbeatInterval?: number;
|
|
38
|
+
/** Enable message compression */
|
|
39
|
+
compression?: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Transport event types.
|
|
43
|
+
*/
|
|
44
|
+
export type TransportEventType = 'connected' | 'disconnected' | 'message' | 'error' | 'reconnecting' | 'stateChange';
|
|
45
|
+
/**
|
|
46
|
+
* Transport event payloads.
|
|
47
|
+
*/
|
|
48
|
+
export interface TransportEvents {
|
|
49
|
+
connected: {
|
|
50
|
+
timestamp: number;
|
|
51
|
+
};
|
|
52
|
+
disconnected: {
|
|
53
|
+
reason: string;
|
|
54
|
+
wasClean: boolean;
|
|
55
|
+
};
|
|
56
|
+
message: {
|
|
57
|
+
message: SyncMessage;
|
|
58
|
+
receivedAt: number;
|
|
59
|
+
};
|
|
60
|
+
error: {
|
|
61
|
+
error: Error;
|
|
62
|
+
recoverable: boolean;
|
|
63
|
+
};
|
|
64
|
+
reconnecting: {
|
|
65
|
+
attempt: number;
|
|
66
|
+
delay: number;
|
|
67
|
+
};
|
|
68
|
+
stateChange: {
|
|
69
|
+
previousState: TransportState;
|
|
70
|
+
currentState: TransportState;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Transport event listener.
|
|
75
|
+
*/
|
|
76
|
+
export type TransportEventListener<T extends TransportEventType> = (event: TransportEvents[T]) => void;
|
|
77
|
+
/**
|
|
78
|
+
* Transport statistics.
|
|
79
|
+
*/
|
|
80
|
+
export interface TransportStats {
|
|
81
|
+
/** Current connection state */
|
|
82
|
+
state: TransportState;
|
|
83
|
+
/** Time when connection was established (epoch ms) */
|
|
84
|
+
connectedAt?: number;
|
|
85
|
+
/** Total messages sent */
|
|
86
|
+
messagesSent: number;
|
|
87
|
+
/** Total messages received */
|
|
88
|
+
messagesReceived: number;
|
|
89
|
+
/** Total bytes sent */
|
|
90
|
+
bytesSent: number;
|
|
91
|
+
/** Total bytes received */
|
|
92
|
+
bytesReceived: number;
|
|
93
|
+
/** Number of reconnection attempts */
|
|
94
|
+
reconnectAttempts: number;
|
|
95
|
+
/** Average round-trip latency in milliseconds */
|
|
96
|
+
averageLatency?: number;
|
|
97
|
+
/** Last error encountered */
|
|
98
|
+
lastError?: Error;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Transport interface for sync communication.
|
|
102
|
+
*
|
|
103
|
+
* Implementations handle the actual network communication,
|
|
104
|
+
* allowing the sync engine to be transport-agnostic.
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```typescript
|
|
108
|
+
* const transport = new WebSocketTransport({
|
|
109
|
+
* endpoint: 'wss://sync.example.com',
|
|
110
|
+
* authToken: 'bearer-token',
|
|
111
|
+
* autoReconnect: true,
|
|
112
|
+
* });
|
|
113
|
+
*
|
|
114
|
+
* transport.on('message', ({ message }) => {
|
|
115
|
+
* console.log('Received:', message);
|
|
116
|
+
* });
|
|
117
|
+
*
|
|
118
|
+
* await transport.connect();
|
|
119
|
+
* await transport.send(handshakeMessage);
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
export interface SyncTransport {
|
|
123
|
+
/** Transport type identifier */
|
|
124
|
+
readonly type: 'websocket' | 'http' | 'custom';
|
|
125
|
+
/** Current connection state */
|
|
126
|
+
readonly state: TransportState;
|
|
127
|
+
/** Whether the transport is currently connected */
|
|
128
|
+
readonly isConnected: boolean;
|
|
129
|
+
/**
|
|
130
|
+
* Connect to the sync server.
|
|
131
|
+
*
|
|
132
|
+
* @throws {TransportError} If connection fails
|
|
133
|
+
*/
|
|
134
|
+
connect(): Promise<void>;
|
|
135
|
+
/**
|
|
136
|
+
* Disconnect from the sync server.
|
|
137
|
+
*
|
|
138
|
+
* @param reason - Optional disconnect reason
|
|
139
|
+
*/
|
|
140
|
+
disconnect(reason?: string): Promise<void>;
|
|
141
|
+
/**
|
|
142
|
+
* Send a message to the sync server.
|
|
143
|
+
*
|
|
144
|
+
* @param message - The sync message to send
|
|
145
|
+
* @returns Promise that resolves when message is sent
|
|
146
|
+
* @throws {TransportError} If send fails
|
|
147
|
+
*/
|
|
148
|
+
send(message: SyncMessage): Promise<void>;
|
|
149
|
+
/**
|
|
150
|
+
* Send a message and wait for a response.
|
|
151
|
+
*
|
|
152
|
+
* @param message - The sync message to send
|
|
153
|
+
* @param timeout - Optional response timeout in milliseconds
|
|
154
|
+
* @returns Promise that resolves with the response message
|
|
155
|
+
* @throws {TransportError} If send fails or times out
|
|
156
|
+
*/
|
|
157
|
+
request(message: SyncMessage, timeout?: number): Promise<SyncMessage>;
|
|
158
|
+
/**
|
|
159
|
+
* Register an event listener.
|
|
160
|
+
*
|
|
161
|
+
* @param event - Event type to listen for
|
|
162
|
+
* @param listener - Callback function
|
|
163
|
+
* @returns Unsubscribe function
|
|
164
|
+
*/
|
|
165
|
+
on<T extends TransportEventType>(event: T, listener: TransportEventListener<T>): () => void;
|
|
166
|
+
/**
|
|
167
|
+
* Register a one-time event listener.
|
|
168
|
+
*
|
|
169
|
+
* @param event - Event type to listen for
|
|
170
|
+
* @param listener - Callback function
|
|
171
|
+
* @returns Unsubscribe function
|
|
172
|
+
*/
|
|
173
|
+
once<T extends TransportEventType>(event: T, listener: TransportEventListener<T>): () => void;
|
|
174
|
+
/**
|
|
175
|
+
* Get transport statistics.
|
|
176
|
+
*/
|
|
177
|
+
getStats(): TransportStats;
|
|
178
|
+
/**
|
|
179
|
+
* Dispose of the transport and release resources.
|
|
180
|
+
*/
|
|
181
|
+
dispose(): Promise<void>;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Transport error with additional context.
|
|
185
|
+
*/
|
|
186
|
+
export declare class TransportError extends Error {
|
|
187
|
+
/** Error code for categorization */
|
|
188
|
+
readonly code: string;
|
|
189
|
+
/** Whether the error is recoverable */
|
|
190
|
+
readonly recoverable: boolean;
|
|
191
|
+
/** Original error if wrapping another error */
|
|
192
|
+
readonly cause?: Error;
|
|
193
|
+
constructor(message: string, code: string, options?: {
|
|
194
|
+
recoverable?: boolean;
|
|
195
|
+
cause?: Error;
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Common transport error codes.
|
|
200
|
+
*/
|
|
201
|
+
export declare const TransportErrorCodes: {
|
|
202
|
+
/** Connection failed */
|
|
203
|
+
readonly CONNECTION_FAILED: "CONNECTION_FAILED";
|
|
204
|
+
/** Connection timeout */
|
|
205
|
+
readonly CONNECTION_TIMEOUT: "CONNECTION_TIMEOUT";
|
|
206
|
+
/** Authentication failed */
|
|
207
|
+
readonly AUTH_FAILED: "AUTH_FAILED";
|
|
208
|
+
/** Request timeout */
|
|
209
|
+
readonly REQUEST_TIMEOUT: "REQUEST_TIMEOUT";
|
|
210
|
+
/** Send failed */
|
|
211
|
+
readonly SEND_FAILED: "SEND_FAILED";
|
|
212
|
+
/** Server error */
|
|
213
|
+
readonly SERVER_ERROR: "SERVER_ERROR";
|
|
214
|
+
/** Network error */
|
|
215
|
+
readonly NETWORK_ERROR: "NETWORK_ERROR";
|
|
216
|
+
/** Protocol error */
|
|
217
|
+
readonly PROTOCOL_ERROR: "PROTOCOL_ERROR";
|
|
218
|
+
/** Transport disposed */
|
|
219
|
+
readonly DISPOSED: "DISPOSED";
|
|
220
|
+
};
|
|
221
|
+
/**
|
|
222
|
+
* Base transport implementation with common functionality.
|
|
223
|
+
*/
|
|
224
|
+
export declare abstract class BaseTransport implements SyncTransport {
|
|
225
|
+
abstract readonly type: 'websocket' | 'http' | 'custom';
|
|
226
|
+
protected _state: TransportState;
|
|
227
|
+
protected _stats: TransportStats;
|
|
228
|
+
protected _options: Required<TransportOptions>;
|
|
229
|
+
protected _disposed: boolean;
|
|
230
|
+
private _listeners;
|
|
231
|
+
constructor(options: TransportOptions);
|
|
232
|
+
get state(): TransportState;
|
|
233
|
+
get isConnected(): boolean;
|
|
234
|
+
abstract connect(): Promise<void>;
|
|
235
|
+
abstract disconnect(reason?: string): Promise<void>;
|
|
236
|
+
abstract send(message: SyncMessage): Promise<void>;
|
|
237
|
+
abstract request(message: SyncMessage, timeout?: number): Promise<SyncMessage>;
|
|
238
|
+
on<T extends TransportEventType>(event: T, listener: TransportEventListener<T>): () => void;
|
|
239
|
+
once<T extends TransportEventType>(event: T, listener: TransportEventListener<T>): () => void;
|
|
240
|
+
getStats(): TransportStats;
|
|
241
|
+
dispose(): Promise<void>;
|
|
242
|
+
/**
|
|
243
|
+
* Emit an event to all registered listeners.
|
|
244
|
+
*/
|
|
245
|
+
protected emit<T extends TransportEventType>(event: T, data: TransportEvents[T]): void;
|
|
246
|
+
/**
|
|
247
|
+
* Update transport state and emit event.
|
|
248
|
+
*/
|
|
249
|
+
protected setState(newState: TransportState): void;
|
|
250
|
+
/**
|
|
251
|
+
* Check if transport is disposed and throw if so.
|
|
252
|
+
*/
|
|
253
|
+
protected checkDisposed(): void;
|
|
254
|
+
/**
|
|
255
|
+
* Calculate next reconnection delay with exponential backoff.
|
|
256
|
+
*/
|
|
257
|
+
protected calculateReconnectDelay(attempt: number): number;
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../../src/features/sync/transport/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport Layer Interface.
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract for sync transports (WebSocket, HTTP polling, etc.).
|
|
5
|
+
* Transports handle the low-level communication between sync nodes.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Transport error with additional context.
|
|
11
|
+
*/
|
|
12
|
+
export class TransportError extends Error {
|
|
13
|
+
constructor(message, code, options) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.name = 'TransportError';
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.recoverable = options?.recoverable ?? false;
|
|
18
|
+
this.cause = options?.cause;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Common transport error codes.
|
|
23
|
+
*/
|
|
24
|
+
export const TransportErrorCodes = {
|
|
25
|
+
/** Connection failed */
|
|
26
|
+
CONNECTION_FAILED: 'CONNECTION_FAILED',
|
|
27
|
+
/** Connection timeout */
|
|
28
|
+
CONNECTION_TIMEOUT: 'CONNECTION_TIMEOUT',
|
|
29
|
+
/** Authentication failed */
|
|
30
|
+
AUTH_FAILED: 'AUTH_FAILED',
|
|
31
|
+
/** Request timeout */
|
|
32
|
+
REQUEST_TIMEOUT: 'REQUEST_TIMEOUT',
|
|
33
|
+
/** Send failed */
|
|
34
|
+
SEND_FAILED: 'SEND_FAILED',
|
|
35
|
+
/** Server error */
|
|
36
|
+
SERVER_ERROR: 'SERVER_ERROR',
|
|
37
|
+
/** Network error */
|
|
38
|
+
NETWORK_ERROR: 'NETWORK_ERROR',
|
|
39
|
+
/** Protocol error */
|
|
40
|
+
PROTOCOL_ERROR: 'PROTOCOL_ERROR',
|
|
41
|
+
/** Transport disposed */
|
|
42
|
+
DISPOSED: 'DISPOSED',
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Base transport implementation with common functionality.
|
|
46
|
+
*/
|
|
47
|
+
export class BaseTransport {
|
|
48
|
+
constructor(options) {
|
|
49
|
+
this._state = 'disconnected';
|
|
50
|
+
this._disposed = false;
|
|
51
|
+
this._listeners = new Map();
|
|
52
|
+
this._options = {
|
|
53
|
+
endpoint: options.endpoint,
|
|
54
|
+
authToken: options.authToken ?? '',
|
|
55
|
+
headers: options.headers ?? {},
|
|
56
|
+
connectionTimeout: options.connectionTimeout ?? 10000,
|
|
57
|
+
requestTimeout: options.requestTimeout ?? 30000,
|
|
58
|
+
autoReconnect: options.autoReconnect ?? true,
|
|
59
|
+
reconnectDelay: options.reconnectDelay ?? 1000,
|
|
60
|
+
maxReconnectDelay: options.maxReconnectDelay ?? 30000,
|
|
61
|
+
maxReconnectAttempts: options.maxReconnectAttempts ?? 0,
|
|
62
|
+
heartbeatInterval: options.heartbeatInterval ?? 30000,
|
|
63
|
+
compression: options.compression ?? true,
|
|
64
|
+
};
|
|
65
|
+
this._stats = {
|
|
66
|
+
state: 'disconnected',
|
|
67
|
+
messagesSent: 0,
|
|
68
|
+
messagesReceived: 0,
|
|
69
|
+
bytesSent: 0,
|
|
70
|
+
bytesReceived: 0,
|
|
71
|
+
reconnectAttempts: 0,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
get state() {
|
|
75
|
+
return this._state;
|
|
76
|
+
}
|
|
77
|
+
get isConnected() {
|
|
78
|
+
return this._state === 'connected';
|
|
79
|
+
}
|
|
80
|
+
on(event, listener) {
|
|
81
|
+
if (!this._listeners.has(event)) {
|
|
82
|
+
this._listeners.set(event, new Set());
|
|
83
|
+
}
|
|
84
|
+
const listeners = this._listeners.get(event);
|
|
85
|
+
listeners.add(listener);
|
|
86
|
+
return () => {
|
|
87
|
+
listeners.delete(listener);
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
once(event, listener) {
|
|
91
|
+
const wrapper = (eventData) => {
|
|
92
|
+
unsubscribe();
|
|
93
|
+
listener(eventData);
|
|
94
|
+
};
|
|
95
|
+
const unsubscribe = this.on(event, wrapper);
|
|
96
|
+
return unsubscribe;
|
|
97
|
+
}
|
|
98
|
+
getStats() {
|
|
99
|
+
return { ...this._stats, state: this._state };
|
|
100
|
+
}
|
|
101
|
+
async dispose() {
|
|
102
|
+
if (this._disposed)
|
|
103
|
+
return;
|
|
104
|
+
this._disposed = true;
|
|
105
|
+
await this.disconnect('disposed');
|
|
106
|
+
this._listeners.clear();
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Emit an event to all registered listeners.
|
|
110
|
+
*/
|
|
111
|
+
emit(event, data) {
|
|
112
|
+
const listeners = this._listeners.get(event);
|
|
113
|
+
if (!listeners)
|
|
114
|
+
return;
|
|
115
|
+
for (const listener of listeners) {
|
|
116
|
+
try {
|
|
117
|
+
listener(data);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.error(`[Transport] Error in ${event} listener:`, error);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Update transport state and emit event.
|
|
126
|
+
*/
|
|
127
|
+
setState(newState) {
|
|
128
|
+
if (this._state === newState)
|
|
129
|
+
return;
|
|
130
|
+
const previousState = this._state;
|
|
131
|
+
this._state = newState;
|
|
132
|
+
this._stats.state = newState;
|
|
133
|
+
this.emit('stateChange', { previousState, currentState: newState });
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Check if transport is disposed and throw if so.
|
|
137
|
+
*/
|
|
138
|
+
checkDisposed() {
|
|
139
|
+
if (this._disposed) {
|
|
140
|
+
throw new TransportError('Transport has been disposed', TransportErrorCodes.DISPOSED, { recoverable: false });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Calculate next reconnection delay with exponential backoff.
|
|
145
|
+
*/
|
|
146
|
+
calculateReconnectDelay(attempt) {
|
|
147
|
+
const delay = Math.min(this._options.reconnectDelay * Math.pow(2, attempt - 1), this._options.maxReconnectDelay);
|
|
148
|
+
// Add jitter (±20%)
|
|
149
|
+
const jitter = delay * 0.2 * (Math.random() * 2 - 1);
|
|
150
|
+
return Math.floor(delay + jitter);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/features/sync/transport/transport.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiNH;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAUvC,YACE,OAAe,EACf,IAAY,EACZ,OAAkD;QAElD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,KAAK,CAAC;QACjD,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;IAC9B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,wBAAwB;IACxB,iBAAiB,EAAE,mBAAmB;IAEtC,yBAAyB;IACzB,kBAAkB,EAAE,oBAAoB;IAExC,4BAA4B;IAC5B,WAAW,EAAE,aAAa;IAE1B,sBAAsB;IACtB,eAAe,EAAE,iBAAiB;IAElC,kBAAkB;IAClB,WAAW,EAAE,aAAa;IAE1B,mBAAmB;IACnB,YAAY,EAAE,cAAc;IAE5B,oBAAoB;IACpB,aAAa,EAAE,eAAe;IAE9B,qBAAqB;IACrB,cAAc,EAAE,gBAAgB;IAEhC,yBAAyB;IACzB,QAAQ,EAAE,UAAU;CACZ,CAAC;AAEX;;GAEG;AACH,MAAM,OAAgB,aAAa;IAUjC,YAAY,OAAyB;QAP3B,WAAM,GAAmB,cAAc,CAAC;QAGxC,cAAS,GAAG,KAAK,CAAC;QAEpB,eAAU,GAA6E,IAAI,GAAG,EAAE,CAAC;QAGvG,IAAI,CAAC,QAAQ,GAAG;YACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,KAAK;YACrD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,KAAK;YAC/C,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;YAC5C,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI;YAC9C,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,KAAK;YACrD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,IAAI,CAAC;YACvD,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,KAAK;YACrD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;SACzC,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG;YACZ,KAAK,EAAE,cAAc;YACrB,YAAY,EAAE,CAAC;YACf,gBAAgB,EAAE,CAAC;YACnB,SAAS,EAAE,CAAC;YACZ,aAAa,EAAE,CAAC;YAChB,iBAAiB,EAAE,CAAC;SACrB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;IACrC,CAAC;IAOD,EAAE,CACA,KAAQ,EACR,QAAmC;QAEnC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC;QAC9C,SAAS,CAAC,GAAG,CAAC,QAAsD,CAAC,CAAC;QAEtE,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,MAAM,CAAC,QAAsD,CAAC,CAAC;QAC3E,CAAC,CAAC;IACJ,CAAC;IAED,IAAI,CACF,KAAQ,EACR,QAAmC;QAEnC,MAAM,OAAO,GAA8B,CAAC,SAAS,EAAE,EAAE;YACvD,WAAW,EAAE,CAAC;YACd,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED;;OAEG;IACO,IAAI,CACZ,KAAQ,EACR,IAAwB;QAExB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACF,QAAsC,CAAC,IAAI,CAAC,CAAC;YAChD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,KAAK,YAAY,EAAE,KAAK,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACO,QAAQ,CAAC,QAAwB;QACzC,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO;QAErC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,QAAQ,CAAC;QAE7B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACO,aAAa;QACrB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,cAAc,CACtB,6BAA6B,EAC7B,mBAAmB,CAAC,QAAQ,EAC5B,EAAE,WAAW,EAAE,KAAK,EAAE,CACvB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACO,uBAAuB,CAAC,OAAe;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,QAAQ,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,EACvD,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAChC,CAAC;QAEF,oBAAoB;QACpB,MAAM,MAAM,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Transport Implementation.
|
|
3
|
+
*
|
|
4
|
+
* Real-time bidirectional sync transport using WebSockets.
|
|
5
|
+
* Supports automatic reconnection, heartbeats, and message compression.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
import { BaseTransport, type TransportOptions } from './transport';
|
|
10
|
+
import type { SyncMessage } from '../protocol/messages';
|
|
11
|
+
/**
|
|
12
|
+
* WebSocket-specific transport options.
|
|
13
|
+
*/
|
|
14
|
+
export interface WebSocketTransportOptions extends TransportOptions {
|
|
15
|
+
/** WebSocket protocols to use */
|
|
16
|
+
protocols?: string[];
|
|
17
|
+
/** Binary message format */
|
|
18
|
+
binaryType?: 'arraybuffer' | 'blob';
|
|
19
|
+
/** Enable ping/pong heartbeats */
|
|
20
|
+
pingPong?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* WebSocket transport for real-time sync.
|
|
24
|
+
*
|
|
25
|
+
* Provides low-latency bidirectional communication with:
|
|
26
|
+
* - Automatic reconnection with exponential backoff
|
|
27
|
+
* - Request/response correlation
|
|
28
|
+
* - Heartbeat keep-alive
|
|
29
|
+
* - Message compression (gzip)
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* const transport = new WebSocketTransport({
|
|
34
|
+
* endpoint: 'wss://sync.example.com/v1/sync',
|
|
35
|
+
* authToken: 'bearer-token',
|
|
36
|
+
* autoReconnect: true,
|
|
37
|
+
* heartbeatInterval: 30000,
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* transport.on('message', ({ message }) => {
|
|
41
|
+
* handleSyncMessage(message);
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* await transport.connect();
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare class WebSocketTransport extends BaseTransport {
|
|
48
|
+
readonly type: "websocket";
|
|
49
|
+
private _ws;
|
|
50
|
+
private _heartbeatTimer;
|
|
51
|
+
private _reconnectTimer;
|
|
52
|
+
private _pendingRequests;
|
|
53
|
+
private _wsOptions;
|
|
54
|
+
private _lastPongAt;
|
|
55
|
+
private _shouldReconnect;
|
|
56
|
+
constructor(options: WebSocketTransportOptions);
|
|
57
|
+
/**
|
|
58
|
+
* Connect to the WebSocket server.
|
|
59
|
+
*/
|
|
60
|
+
connect(): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Disconnect from the WebSocket server.
|
|
63
|
+
*/
|
|
64
|
+
disconnect(reason?: string): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Send a sync message.
|
|
67
|
+
*/
|
|
68
|
+
send(message: SyncMessage): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Send a message and wait for a response.
|
|
71
|
+
*/
|
|
72
|
+
request(message: SyncMessage, timeout?: number): Promise<SyncMessage>;
|
|
73
|
+
/**
|
|
74
|
+
* Create WebSocket connection.
|
|
75
|
+
*/
|
|
76
|
+
private _createConnection;
|
|
77
|
+
/**
|
|
78
|
+
* Build WebSocket URL with auth token.
|
|
79
|
+
*/
|
|
80
|
+
private _buildUrl;
|
|
81
|
+
/**
|
|
82
|
+
* Handle incoming WebSocket message.
|
|
83
|
+
*/
|
|
84
|
+
private _handleMessage;
|
|
85
|
+
/**
|
|
86
|
+
* Handle WebSocket close event.
|
|
87
|
+
*/
|
|
88
|
+
private _handleClose;
|
|
89
|
+
/**
|
|
90
|
+
* Schedule reconnection attempt.
|
|
91
|
+
*/
|
|
92
|
+
private _scheduleReconnect;
|
|
93
|
+
/**
|
|
94
|
+
* Start heartbeat timer.
|
|
95
|
+
*/
|
|
96
|
+
private _startHeartbeat;
|
|
97
|
+
/**
|
|
98
|
+
* Stop heartbeat timer.
|
|
99
|
+
*/
|
|
100
|
+
private _stopHeartbeat;
|
|
101
|
+
/**
|
|
102
|
+
* Clear all timers.
|
|
103
|
+
*/
|
|
104
|
+
private _clearTimers;
|
|
105
|
+
/**
|
|
106
|
+
* Reject all pending requests.
|
|
107
|
+
*/
|
|
108
|
+
private _rejectAllPending;
|
|
109
|
+
/**
|
|
110
|
+
* Serialize message for transmission.
|
|
111
|
+
*/
|
|
112
|
+
private _serialize;
|
|
113
|
+
/**
|
|
114
|
+
* Deserialize received message.
|
|
115
|
+
*/
|
|
116
|
+
private _deserialize;
|
|
117
|
+
/**
|
|
118
|
+
* Dispose of the transport.
|
|
119
|
+
*/
|
|
120
|
+
dispose(): Promise<void>;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Create a WebSocket transport instance.
|
|
124
|
+
*/
|
|
125
|
+
export declare const createWebSocketTransport: (options: WebSocketTransportOptions) => WebSocketTransport;
|
|
126
|
+
//# sourceMappingURL=websocketTransport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocketTransport.d.ts","sourceRoot":"","sources":["../../../../src/features/sync/transport/websocketTransport.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,aAAa,EAGb,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxD;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,gBAAgB;IACjE,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;IAEpC,kCAAkC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAWD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,kBAAmB,SAAQ,aAAa;IACnD,QAAQ,CAAC,IAAI,cAAwB;IAErC,OAAO,CAAC,GAAG,CAA0B;IACrC,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,gBAAgB,CAA0C;IAClE,OAAO,CAAC,UAAU,CAAsC;IACxD,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,gBAAgB,CAAS;gBAErB,OAAO,EAAE,yBAAyB;IAW9C;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB9B;;OAEG;IACG,UAAU,CAAC,MAAM,SAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB7D;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B/C;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA0B3E;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkEzB;;OAEG;IACH,OAAO,CAAC,SAAS;IAWjB;;OAEG;IACH,OAAO,CAAC,cAAc;IA6DtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAwBpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;OAEG;IACH,OAAO,CAAC,eAAe;IA0BvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,OAAO,CAAC,UAAU;IAKlB;;OAEG;IACH,OAAO,CAAC,YAAY;IAWpB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAI/B;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,YAC1B,yBAAyB,KACjC,kBAEF,CAAC"}
|