@docukit/docsync 0.0.1-alpha.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.
Files changed (76) hide show
  1. package/LICENSE.md +20 -0
  2. package/README.md +1 -0
  3. package/dist/src/client/index.d.ts +158 -0
  4. package/dist/src/client/index.d.ts.map +1 -0
  5. package/dist/src/client/index.js +832 -0
  6. package/dist/src/client/index.js.map +1 -0
  7. package/dist/src/client/providers/indexeddb.d.ts +15 -0
  8. package/dist/src/client/providers/indexeddb.d.ts.map +1 -0
  9. package/dist/src/client/providers/indexeddb.js +79 -0
  10. package/dist/src/client/providers/indexeddb.js.map +1 -0
  11. package/dist/src/exports/client.d.ts +4 -0
  12. package/dist/src/exports/client.d.ts.map +1 -0
  13. package/dist/src/exports/client.js +3 -0
  14. package/dist/src/exports/client.js.map +1 -0
  15. package/dist/src/exports/docnode.d.ts +2 -0
  16. package/dist/src/exports/docnode.d.ts.map +1 -0
  17. package/dist/src/exports/docnode.js +2 -0
  18. package/dist/src/exports/docnode.js.map +1 -0
  19. package/dist/src/exports/index.d.ts +3 -0
  20. package/dist/src/exports/index.d.ts.map +1 -0
  21. package/dist/src/exports/index.js +3 -0
  22. package/dist/src/exports/index.js.map +1 -0
  23. package/dist/src/exports/server.d.ts +5 -0
  24. package/dist/src/exports/server.d.ts.map +1 -0
  25. package/dist/src/exports/server.js +4 -0
  26. package/dist/src/exports/server.js.map +1 -0
  27. package/dist/src/exports/testing.d.ts +7 -0
  28. package/dist/src/exports/testing.d.ts.map +1 -0
  29. package/dist/src/exports/testing.js +6 -0
  30. package/dist/src/exports/testing.js.map +1 -0
  31. package/dist/src/server/cli.d.ts +2 -0
  32. package/dist/src/server/cli.d.ts.map +1 -0
  33. package/dist/src/server/cli.js +10 -0
  34. package/dist/src/server/cli.js.map +1 -0
  35. package/dist/src/server/index.d.ts +37 -0
  36. package/dist/src/server/index.d.ts.map +1 -0
  37. package/dist/src/server/index.js +450 -0
  38. package/dist/src/server/index.js.map +1 -0
  39. package/dist/src/server/providers/memory.d.ts +17 -0
  40. package/dist/src/server/providers/memory.d.ts.map +1 -0
  41. package/dist/src/server/providers/memory.js +72 -0
  42. package/dist/src/server/providers/memory.js.map +1 -0
  43. package/dist/src/server/providers/postgres/drizzle.config.d.ts +3 -0
  44. package/dist/src/server/providers/postgres/drizzle.config.d.ts.map +1 -0
  45. package/dist/src/server/providers/postgres/drizzle.config.js +10 -0
  46. package/dist/src/server/providers/postgres/drizzle.config.js.map +1 -0
  47. package/dist/src/server/providers/postgres/index.d.ts +6 -0
  48. package/dist/src/server/providers/postgres/index.d.ts.map +1 -0
  49. package/dist/src/server/providers/postgres/index.js +83 -0
  50. package/dist/src/server/providers/postgres/index.js.map +1 -0
  51. package/dist/src/server/providers/postgres/schema.d.ts +159 -0
  52. package/dist/src/server/providers/postgres/schema.d.ts.map +1 -0
  53. package/dist/src/server/providers/postgres/schema.js +34 -0
  54. package/dist/src/server/providers/postgres/schema.js.map +1 -0
  55. package/dist/src/shared/debounce.d.ts +2 -0
  56. package/dist/src/shared/debounce.d.ts.map +1 -0
  57. package/dist/src/shared/debounce.js +10 -0
  58. package/dist/src/shared/debounce.js.map +1 -0
  59. package/dist/src/shared/docBinding.d.ts +17 -0
  60. package/dist/src/shared/docBinding.d.ts.map +1 -0
  61. package/dist/src/shared/docBinding.js +41 -0
  62. package/dist/src/shared/docBinding.js.map +1 -0
  63. package/dist/src/shared/throttle.d.ts +30 -0
  64. package/dist/src/shared/throttle.d.ts.map +1 -0
  65. package/dist/src/shared/throttle.js +51 -0
  66. package/dist/src/shared/throttle.js.map +1 -0
  67. package/dist/src/shared/types.d.ts +387 -0
  68. package/dist/src/shared/types.d.ts.map +1 -0
  69. package/dist/src/shared/types.js +6 -0
  70. package/dist/src/shared/types.js.map +1 -0
  71. package/dist/src/shared/utils.d.ts +2 -0
  72. package/dist/src/shared/utils.d.ts.map +1 -0
  73. package/dist/src/shared/utils.js +11 -0
  74. package/dist/src/shared/utils.js.map +1 -0
  75. package/dist/tsconfig.build.tsbuildinfo +1 -0
  76. package/package.json +68 -0
@@ -0,0 +1,387 @@
1
+ /**
2
+ * DocSync Type Definitions
3
+ *
4
+ * This file contains all type definitions for the DocSync library.
5
+ * It is organized into collapsible regions for better navigation.
6
+ */
7
+ import type { DocBinding } from "./docBinding.js";
8
+ export type Result<D, E = Error> = {
9
+ data: D;
10
+ error?: never;
11
+ } | {
12
+ data?: never;
13
+ error: E;
14
+ };
15
+ export type QueryResult<D, E = Error> = {
16
+ status: "loading";
17
+ data?: never;
18
+ error?: never;
19
+ } | {
20
+ status: "success";
21
+ data: D;
22
+ error?: never;
23
+ } | {
24
+ status: "error";
25
+ data?: never;
26
+ error: E;
27
+ };
28
+ export type DocSyncEvents<S, O> = {
29
+ "sync-operations": {
30
+ request: {
31
+ docId: string;
32
+ operations?: O[];
33
+ clock: number;
34
+ presence?: unknown;
35
+ };
36
+ response: Result<{
37
+ docId: string;
38
+ operations?: O[];
39
+ serializedDoc?: S;
40
+ clock: number;
41
+ }, {
42
+ type: "AuthorizationError" | "DatabaseError" | "ValidationError";
43
+ message: string;
44
+ }>;
45
+ };
46
+ presence: {
47
+ request: {
48
+ docId: string;
49
+ presence: unknown;
50
+ };
51
+ response: Result<void>;
52
+ };
53
+ "delete-doc": {
54
+ request: {
55
+ docId: string;
56
+ };
57
+ response: {
58
+ success: boolean;
59
+ };
60
+ };
61
+ "unsubscribe-doc": {
62
+ request: {
63
+ docId: string;
64
+ };
65
+ response: {
66
+ success: boolean;
67
+ };
68
+ };
69
+ };
70
+ export type DocSyncEventName = keyof DocSyncEvents<unknown, unknown>;
71
+ export type AuthorizeEvent<TContext = {}, S = unknown, O = unknown> = {
72
+ [K in DocSyncEventName]: {
73
+ type: K;
74
+ payload: DocSyncEvents<S, O>[K]["request"];
75
+ userId: string;
76
+ context: TContext;
77
+ };
78
+ }[DocSyncEventName];
79
+ /**
80
+ * Client-side event definitions.
81
+ *
82
+ * Based on "wide events" philosophy from loggingsucks.com:
83
+ * 1. **Optional fields** added as they become available
84
+ * 2. **Can have partial data** (error + partial response can coexist) - **SERVER EVENTS ONLY**
85
+ * 3. **One operation = one event** (sync start + complete + error = single wide event)
86
+ * 4. **Separate concerns = separate events** (connect ≠ disconnect)
87
+ *
88
+ * ## Events
89
+ *
90
+ * **Client (6):** `onConnect`, `onDisconnect`, `onChange`, `onSync`, `onDocLoad`, `onDocUnload`
91
+ * **Server (3):** `onClientConnect`, `onClientDisconnect`, `onSyncRequest`
92
+ *
93
+ * **Wide events:** `onSyncRequest` (server)
94
+ * **Strict Result events:** `onSync` (client) - uses Result type for mutually exclusive data/error
95
+ */
96
+ /** Emitted when WebSocket connection is lost */
97
+ export type DisconnectEvent = {
98
+ reason: string;
99
+ };
100
+ /** Emitted when document content changes */
101
+ export type ChangeEvent<O = unknown> = {
102
+ docId: string;
103
+ origin: "local" | "broadcast" | "remote";
104
+ operations: O[];
105
+ };
106
+ /** Emitted once after sync completes (success or error) */
107
+ export type SyncEvent<O = unknown, S = unknown> = {
108
+ req: {
109
+ docId: string;
110
+ operations: O[];
111
+ clock: number;
112
+ };
113
+ } & Result<{
114
+ operations?: O[];
115
+ clock: number;
116
+ serializedDoc?: S;
117
+ }, {
118
+ type: "NetworkError" | "AuthorizationError" | "DatabaseError" | "ValidationError";
119
+ message: string;
120
+ }>;
121
+ /** Emitted when document is loaded */
122
+ export type DocLoadEvent = {
123
+ docId: string;
124
+ source: "cache" | "local" | "created";
125
+ refCount: number;
126
+ };
127
+ /** Emitted when document is unloaded. If refCount is 0, the document is removed from the cache. */
128
+ export type DocUnloadEvent = {
129
+ docId: string;
130
+ refCount: number;
131
+ };
132
+ export type ConnectHandler = () => void;
133
+ export type DisconnectHandler = (event: DisconnectEvent) => void;
134
+ export type ChangeHandler<O = {}> = {
135
+ (event: ChangeEvent<O>): void;
136
+ };
137
+ export type SyncHandler<O = {}> = {
138
+ (event: SyncEvent<O>): void;
139
+ };
140
+ export type DocLoadHandler = (event: DocLoadEvent) => void;
141
+ export type DocUnloadHandler = (event: DocUnloadEvent) => void;
142
+ /**
143
+ * Server-side event definitions.
144
+ * These events follow the "wide events" philosophy for comprehensive logging.
145
+ */
146
+ /** Emitted when client successfully authenticates and connects */
147
+ export type ClientConnectEvent<TContext = unknown> = {
148
+ userId: string;
149
+ deviceId: string;
150
+ socketId: string;
151
+ context: TContext;
152
+ };
153
+ /**
154
+ * Emitted when client disconnects.
155
+ *
156
+ * Also emitted when a connection attempt fails (e.g., authentication failure).
157
+ * In that case, userId and deviceId may not be available.
158
+ *
159
+ * Common `reason` values from Socket.IO:
160
+ * - "transport close" - Connection lost
161
+ * - "client namespace disconnect" - Client explicitly disconnected
162
+ * - "server namespace disconnect" - Server closed connection
163
+ * - "Authentication failed: invalid token" - Auth failed during connection attempt
164
+ */
165
+ export type ClientDisconnectEvent = {
166
+ userId: string;
167
+ deviceId: string;
168
+ socketId: string;
169
+ reason: string;
170
+ };
171
+ /**
172
+ * Emitted once after sync-operations request completes.
173
+ *
174
+ * Common error.type values:
175
+ * - "AuthorizationError" - Access denied (authorization failed)
176
+ * - "DatabaseError" - Database operation failed
177
+ * - "ValidationError" - Invalid request data
178
+ */
179
+ export type SyncRequestEvent<O = unknown, S = unknown> = {
180
+ userId: string;
181
+ deviceId: string;
182
+ socketId: string;
183
+ status: "success" | "error";
184
+ req: {
185
+ docId: string;
186
+ operations?: O[];
187
+ clock: number;
188
+ presence?: unknown;
189
+ };
190
+ res?: {
191
+ operations?: O[];
192
+ clock?: number;
193
+ serializedDoc?: S;
194
+ };
195
+ durationMs?: number;
196
+ devicesCount?: number;
197
+ clientsCount?: number;
198
+ error?: {
199
+ type: "AuthorizationError" | "DatabaseError" | "ValidationError";
200
+ message: string;
201
+ stack?: string;
202
+ };
203
+ };
204
+ export type ClientConnectHandler<TContext = unknown> = (event: ClientConnectEvent<TContext>) => void;
205
+ export type ClientDisconnectHandler = (event: ClientDisconnectEvent) => void;
206
+ export type SyncRequestHandler<O = unknown, S = unknown> = (event: SyncRequestEvent<O, S>) => void;
207
+ /**
208
+ * State for deferred operations (batching and debouncing).
209
+ * Used to track pending timeouts and their associated data.
210
+ */
211
+ export type DeferredState<T> = {
212
+ timeout?: ReturnType<typeof setTimeout>;
213
+ data: T;
214
+ };
215
+ export type Identity = {
216
+ userId: string;
217
+ secret: string;
218
+ };
219
+ /**
220
+ * Arguments for {@link DocSyncClient["getDoc"]}.
221
+ *
222
+ * - `{ type, id }` → Try to get an existing doc by ID. Returns `undefined` if not found.
223
+ * - `{ type, createIfMissing: true }` → Create a new doc with auto-generated ID (ulid).
224
+ * - `{ type, id, createIfMissing: true }` → Get existing doc or create it if not found.
225
+ */
226
+ export type GetDocArgs = {
227
+ type: string;
228
+ id: string;
229
+ createIfMissing?: boolean;
230
+ } | {
231
+ type: string;
232
+ createIfMissing: true;
233
+ };
234
+ export type DocData<D> = {
235
+ doc: D;
236
+ docId: string;
237
+ };
238
+ /**
239
+ * Presence is a record of user IDs to their presence data.
240
+ * It is used to track the presence of users in a document.
241
+ */
242
+ export type Presence<T = unknown> = Record<string, T>;
243
+ export type BroadcastMessage<O> = {
244
+ type: "OPERATIONS";
245
+ operations: O;
246
+ docId: string;
247
+ presence?: Record<string, unknown>;
248
+ } | {
249
+ type: "PRESENCE";
250
+ docId: string;
251
+ presence: Record<string, unknown>;
252
+ };
253
+ export type ClientConfig<D extends {} = {}, S extends {} = {}, O extends {} = {}> = {
254
+ docBinding: DocBinding<D, S, O>;
255
+ server: {
256
+ url: string;
257
+ auth: {
258
+ /**
259
+ * Server authentication token.
260
+ *
261
+ * - Passed verbatim to the server on connection.
262
+ * - Validation is delegated to the server via `onAuth`.
263
+ * - This library does not issue, refresh, or rotate tokens.
264
+ */
265
+ getToken: () => Promise<string>;
266
+ };
267
+ };
268
+ local: {
269
+ provider: new (identity: Identity) => Provider<any, any, "client">;
270
+ /**
271
+ * Resolves the local storage identity.
272
+ *
273
+ * Used exclusively for:
274
+ * - Namespacing local persistence (userId)
275
+ * - Deriving encryption keys for data at rest (secret)
276
+ *
277
+ * About the secret:
278
+ * - Must never be persisted client-side (localStorage, IndexedDB, etc).
279
+ * - Re-encryption is not supported, so losing the secret makes local data permanently unrecoverable.
280
+ *
281
+ */
282
+ getIdentity: () => Promise<Identity>;
283
+ };
284
+ };
285
+ /**
286
+ * Server configuration with generic context type.
287
+ *
288
+ * @typeParam TContext - Application-defined context shape returned by authenticate
289
+ * and passed to authorize. Defaults to empty object.
290
+ */
291
+ export type ServerConfig<TContext, D extends {}, S extends {}, O extends {}> = {
292
+ docBinding: DocBinding<D, S, O>;
293
+ port?: number;
294
+ provider: new () => Provider<NoInfer<S>, NoInfer<O>, "server">;
295
+ /**
296
+ * Authenticates a WebSocket connection.
297
+ *
298
+ * - Called once per connection attempt.
299
+ * - Must validate the provided token.
300
+ * - Must resolve the canonical userId.
301
+ * - May optionally return a context object that will be passed to authorize.
302
+ *
303
+ * @returns User info with optional context, or undefined if authentication fails.
304
+ */
305
+ authenticate(ev: {
306
+ token: string;
307
+ }): Promise<{
308
+ userId: string;
309
+ context?: TContext;
310
+ } | undefined>;
311
+ /**
312
+ * Authorizes an operation.
313
+ *
314
+ * - Called for each operation (get-doc, apply-operations, create-doc, save-doc).
315
+ * - Receives the cached context from authenticate.
316
+ * - Can use cached context for fast checks or fetch fresh data for consistency.
317
+ *
318
+ * @returns true to allow, false to deny.
319
+ */
320
+ authorize?(ev: AuthorizeEvent<TContext, S, O>): Promise<boolean>;
321
+ };
322
+ export type SerializedDocPayload<S> = {
323
+ serializedDoc: S;
324
+ docId: string;
325
+ clock: number;
326
+ };
327
+ /**
328
+ * Context passed to transaction callbacks.
329
+ * All operations share the same underlying transaction.
330
+ */
331
+ export type TransactionContext<S, O, P extends "server" | "client"> = {
332
+ getSerializedDoc(docId: string): Promise<{
333
+ serializedDoc: S;
334
+ clock: number;
335
+ } | undefined>;
336
+ getOperations(arg: P extends "server" ? {
337
+ docId: string;
338
+ clock: number;
339
+ } : {
340
+ docId: string;
341
+ }): Promise<O[][]>;
342
+ deleteOperations(arg: {
343
+ docId: string;
344
+ count: number;
345
+ }): Promise<void>;
346
+ saveOperations(arg: {
347
+ docId: string;
348
+ operations: O[];
349
+ }): Promise<P extends "server" ? number : void>;
350
+ saveSerializedDoc(arg: SerializedDocPayload<S>): Promise<void>;
351
+ };
352
+ /**
353
+ * Storage provider for client or server.
354
+ * All operations must be performed within a transaction.
355
+ */
356
+ export type Provider<S, O, P extends "server" | "client"> = {
357
+ /**
358
+ * Run operations in a single atomic transaction.
359
+ * If any operation fails, all changes are rolled back.
360
+ */
361
+ transaction<T>(mode: "readonly" | "readwrite", callback: (ctx: TransactionContext<S, O, P>) => Promise<T>): Promise<T>;
362
+ };
363
+ /**
364
+ * Socket.IO type definitions derived from DocSync events.
365
+ */
366
+ type ClientToServerEvents<S, O> = {
367
+ [K in DocSyncEventName]: (payload: DocSyncEvents<S, O>[K]["request"], cb: (res: DocSyncEvents<S, O>[K]["response"]) => void) => void;
368
+ };
369
+ type ServerToClientEvents = {
370
+ dirty: (payload: {
371
+ docId: string;
372
+ }) => void;
373
+ presence: (payload: {
374
+ docId: string;
375
+ presence: Presence;
376
+ }) => void;
377
+ };
378
+ export type ServerSocket<S, O> = import("socket.io").Server<ClientToServerEvents<S, O>, ServerToClientEvents>;
379
+ export type ClientSocket<S, O> = import("socket.io-client").Socket<ServerToClientEvents, ClientToServerEvents<S, O>>;
380
+ /**
381
+ * Server socket event handlers type - TypeScript errors if any event is missing.
382
+ */
383
+ export type SocketHandlers<S, O> = {
384
+ [K in DocSyncEventName]: (payload: DocSyncEvents<S, O>[K]["request"], cb: (res: DocSyncEvents<S, O>[K]["response"]) => void) => void | Promise<void>;
385
+ };
386
+ export {};
387
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ // TODO: review this line! Importing socket.io and socket.io-client
2
+ // as dynamic imports produces environment pollution errors.
3
+ /* eslint-disable @typescript-eslint/consistent-type-imports */
4
+ export {};
5
+ // #endregion
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/shared/types.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,4DAA4D;AAC5D,+DAA+D;;AAqf/D,aAAa"}
@@ -0,0 +1,2 @@
1
+ export declare function throttle<T extends (...args: unknown[]) => void>(fn: T, wait: number): (...args: Parameters<T>) => void;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/shared/utils.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,EAC7D,EAAE,EAAE,CAAC,EACL,IAAI,EAAE,MAAM,IAIJ,GAAG,MAAM,UAAU,CAAC,CAAC,CAAC,UAO/B"}
@@ -0,0 +1,11 @@
1
+ export function throttle(fn, wait) {
2
+ let last = 0;
3
+ return (...args) => {
4
+ const now = Date.now();
5
+ if (now - last >= wait) {
6
+ last = now;
7
+ fn(...args);
8
+ }
9
+ };
10
+ }
11
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/shared/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CACtB,EAAK,EACL,IAAY;IAEZ,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,OAAO,CAAC,GAAG,IAAmB,EAAE,EAAE;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,GAAG,CAAC;YACX,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}