@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.
- package/LICENSE.md +20 -0
- package/README.md +1 -0
- package/dist/src/client/index.d.ts +158 -0
- package/dist/src/client/index.d.ts.map +1 -0
- package/dist/src/client/index.js +832 -0
- package/dist/src/client/index.js.map +1 -0
- package/dist/src/client/providers/indexeddb.d.ts +15 -0
- package/dist/src/client/providers/indexeddb.d.ts.map +1 -0
- package/dist/src/client/providers/indexeddb.js +79 -0
- package/dist/src/client/providers/indexeddb.js.map +1 -0
- package/dist/src/exports/client.d.ts +4 -0
- package/dist/src/exports/client.d.ts.map +1 -0
- package/dist/src/exports/client.js +3 -0
- package/dist/src/exports/client.js.map +1 -0
- package/dist/src/exports/docnode.d.ts +2 -0
- package/dist/src/exports/docnode.d.ts.map +1 -0
- package/dist/src/exports/docnode.js +2 -0
- package/dist/src/exports/docnode.js.map +1 -0
- package/dist/src/exports/index.d.ts +3 -0
- package/dist/src/exports/index.d.ts.map +1 -0
- package/dist/src/exports/index.js +3 -0
- package/dist/src/exports/index.js.map +1 -0
- package/dist/src/exports/server.d.ts +5 -0
- package/dist/src/exports/server.d.ts.map +1 -0
- package/dist/src/exports/server.js +4 -0
- package/dist/src/exports/server.js.map +1 -0
- package/dist/src/exports/testing.d.ts +7 -0
- package/dist/src/exports/testing.d.ts.map +1 -0
- package/dist/src/exports/testing.js +6 -0
- package/dist/src/exports/testing.js.map +1 -0
- package/dist/src/server/cli.d.ts +2 -0
- package/dist/src/server/cli.d.ts.map +1 -0
- package/dist/src/server/cli.js +10 -0
- package/dist/src/server/cli.js.map +1 -0
- package/dist/src/server/index.d.ts +37 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +450 -0
- package/dist/src/server/index.js.map +1 -0
- package/dist/src/server/providers/memory.d.ts +17 -0
- package/dist/src/server/providers/memory.d.ts.map +1 -0
- package/dist/src/server/providers/memory.js +72 -0
- package/dist/src/server/providers/memory.js.map +1 -0
- package/dist/src/server/providers/postgres/drizzle.config.d.ts +3 -0
- package/dist/src/server/providers/postgres/drizzle.config.d.ts.map +1 -0
- package/dist/src/server/providers/postgres/drizzle.config.js +10 -0
- package/dist/src/server/providers/postgres/drizzle.config.js.map +1 -0
- package/dist/src/server/providers/postgres/index.d.ts +6 -0
- package/dist/src/server/providers/postgres/index.d.ts.map +1 -0
- package/dist/src/server/providers/postgres/index.js +83 -0
- package/dist/src/server/providers/postgres/index.js.map +1 -0
- package/dist/src/server/providers/postgres/schema.d.ts +159 -0
- package/dist/src/server/providers/postgres/schema.d.ts.map +1 -0
- package/dist/src/server/providers/postgres/schema.js +34 -0
- package/dist/src/server/providers/postgres/schema.js.map +1 -0
- package/dist/src/shared/debounce.d.ts +2 -0
- package/dist/src/shared/debounce.d.ts.map +1 -0
- package/dist/src/shared/debounce.js +10 -0
- package/dist/src/shared/debounce.js.map +1 -0
- package/dist/src/shared/docBinding.d.ts +17 -0
- package/dist/src/shared/docBinding.d.ts.map +1 -0
- package/dist/src/shared/docBinding.js +41 -0
- package/dist/src/shared/docBinding.js.map +1 -0
- package/dist/src/shared/throttle.d.ts +30 -0
- package/dist/src/shared/throttle.d.ts.map +1 -0
- package/dist/src/shared/throttle.js +51 -0
- package/dist/src/shared/throttle.js.map +1 -0
- package/dist/src/shared/types.d.ts +387 -0
- package/dist/src/shared/types.d.ts.map +1 -0
- package/dist/src/shared/types.js +6 -0
- package/dist/src/shared/types.js.map +1 -0
- package/dist/src/shared/utils.d.ts +2 -0
- package/dist/src/shared/utils.d.ts.map +1 -0
- package/dist/src/shared/utils.js +11 -0
- package/dist/src/shared/utils.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +68 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# DocSync License 1.0
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 German Jablonski. All rights reserved.
|
|
4
|
+
|
|
5
|
+
## Terms
|
|
6
|
+
|
|
7
|
+
This software is proprietary. Without a valid license, you may:
|
|
8
|
+
|
|
9
|
+
- View the source code for evaluation purposes
|
|
10
|
+
- Use it for personal, non-production projects
|
|
11
|
+
|
|
12
|
+
You may NOT:
|
|
13
|
+
|
|
14
|
+
- Use this software in production
|
|
15
|
+
- Modify, copy, or redistribute this software
|
|
16
|
+
- Use this software for commercial purposes
|
|
17
|
+
|
|
18
|
+
## Obtaining a License
|
|
19
|
+
|
|
20
|
+
For production use, please obtain a license at: https://docukit.dev/license
|
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Visit [our website](https://docukit.dev) for documentation and more.
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import type { DocBinding } from "../shared/docBinding.js";
|
|
2
|
+
import type { BroadcastMessage, ClientConfig, Provider, DocData, GetDocArgs, Identity, QueryResult, ConnectHandler, DisconnectHandler, ChangeHandler, SyncHandler, DocLoadHandler, DocUnloadHandler, ClientSocket, DocSyncEventName, DocSyncEvents, Presence, DeferredState } from "../shared/types.js";
|
|
3
|
+
type LocalResolved<S, O> = {
|
|
4
|
+
provider: Provider<S, O, "client">;
|
|
5
|
+
identity: Identity;
|
|
6
|
+
};
|
|
7
|
+
type PushStatus = "idle" | "pushing" | "pushing-with-pending";
|
|
8
|
+
export declare class DocSyncClient<D extends {} = {}, S extends {} = {}, O extends {} = {}> {
|
|
9
|
+
protected _docBinding: DocBinding<D, S, O>;
|
|
10
|
+
protected _docsCache: Map<string, {
|
|
11
|
+
promisedDoc: Promise<D | undefined>;
|
|
12
|
+
refCount: number;
|
|
13
|
+
presence: Presence;
|
|
14
|
+
presenceHandlers: Set<(presence: Presence) => void>;
|
|
15
|
+
}>;
|
|
16
|
+
protected _localPromise: Promise<LocalResolved<S, O>>;
|
|
17
|
+
protected _deviceId: string;
|
|
18
|
+
/** Client-generated id for presence (works offline; sent in auth so server uses same key) */
|
|
19
|
+
protected _clientId: string;
|
|
20
|
+
private _shouldBroadcast;
|
|
21
|
+
protected _broadcastChannel?: BroadcastChannel;
|
|
22
|
+
protected _socket: ClientSocket<S, O>;
|
|
23
|
+
protected _localOpsBatchState: Map<string, DeferredState<O[]>>;
|
|
24
|
+
protected _batchDelay: number;
|
|
25
|
+
protected _presenceDebounceState: Map<string, DeferredState<unknown>>;
|
|
26
|
+
protected _presenceDebounce: number;
|
|
27
|
+
protected _pushStatusByDocId: Map<string, PushStatus>;
|
|
28
|
+
protected _connectHandlers: Set<ConnectHandler>;
|
|
29
|
+
protected _disconnectHandlers: Set<DisconnectHandler>;
|
|
30
|
+
protected _changeHandlers: Set<ChangeHandler>;
|
|
31
|
+
protected _syncHandlers: Set<SyncHandler>;
|
|
32
|
+
protected _docLoadHandlers: Set<DocLoadHandler>;
|
|
33
|
+
protected _docUnloadHandlers: Set<DocUnloadHandler>;
|
|
34
|
+
constructor(config: ClientConfig<D, S, O>);
|
|
35
|
+
connect(): void;
|
|
36
|
+
disconnect(): void;
|
|
37
|
+
_applyOperations(operations: O, docId: string): Promise<void>;
|
|
38
|
+
private _applyPresencePatch;
|
|
39
|
+
/** Current presence for this client (debounce state or cache); does not clear the timer */
|
|
40
|
+
private _getOwnPresencePatch;
|
|
41
|
+
_replaceDocInCache({ docId, doc, serializedDoc, }: {
|
|
42
|
+
docId: string;
|
|
43
|
+
doc?: D;
|
|
44
|
+
serializedDoc?: S;
|
|
45
|
+
}): Promise<void>;
|
|
46
|
+
_applyServerOperations({ docId, operations, }: {
|
|
47
|
+
docId: string;
|
|
48
|
+
operations: O[];
|
|
49
|
+
}): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Subscribe to a document with reactive state updates.
|
|
52
|
+
*
|
|
53
|
+
* The behavior depends on which fields are provided:
|
|
54
|
+
* - `{ type, id }` → Try to get an existing doc. Returns `undefined` if not found.
|
|
55
|
+
* - `{ type, createIfMissing: true }` → Create a new doc with auto-generated ID (ulid).
|
|
56
|
+
* - `{ type, id, createIfMissing: true }` → Get existing doc or create it if not found.
|
|
57
|
+
*
|
|
58
|
+
* The callback will be invoked with state updates:
|
|
59
|
+
* 1. `{ status: "loading" }` - Initial state while fetching
|
|
60
|
+
* 2. `{ status: "success", data: { doc, docId } }` - Document loaded successfully
|
|
61
|
+
* 3. `{ status: "error", error }` - Failed to load document
|
|
62
|
+
*
|
|
63
|
+
* To observe document content changes, use `doc.onChange()` directly on the returned doc.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```ts
|
|
67
|
+
* const unsubscribe = client.getDoc(
|
|
68
|
+
* { type: "notes", id: "abc123" },
|
|
69
|
+
* (result) => {
|
|
70
|
+
* if (result.status === "loading") console.log("Loading...");
|
|
71
|
+
* if (result.status === "success") console.log("Doc:", result.data.doc);
|
|
72
|
+
* if (result.status === "error") console.error(result.error);
|
|
73
|
+
* }
|
|
74
|
+
* );
|
|
75
|
+
*
|
|
76
|
+
* // Clean up when done
|
|
77
|
+
* unsubscribe();
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
getDoc<T extends GetDocArgs>(args: T, onChange: (result: QueryResult<T extends {
|
|
81
|
+
createIfMissing: true;
|
|
82
|
+
} ? DocData<D> : DocData<D> | undefined>) => void): () => void;
|
|
83
|
+
/**
|
|
84
|
+
* Subscribe to presence updates for a document.
|
|
85
|
+
* Multiple handlers can be registered for the same document.
|
|
86
|
+
* @param args - The arguments for the getPresence request.
|
|
87
|
+
* @param onChange - The callback to invoke when the presence changes.
|
|
88
|
+
* @returns A function to unsubscribe from presence updates.
|
|
89
|
+
*/
|
|
90
|
+
getPresence(args: {
|
|
91
|
+
docId: string | undefined;
|
|
92
|
+
}, onChange: (presence: Presence) => void): () => void;
|
|
93
|
+
setPresence({ docId, presence }: {
|
|
94
|
+
docId: string;
|
|
95
|
+
presence: unknown;
|
|
96
|
+
}): Promise<void>;
|
|
97
|
+
private _setupChangeListener;
|
|
98
|
+
private _loadOrCreateDoc;
|
|
99
|
+
/**
|
|
100
|
+
* Decrease the reference count of a document and, if it is 0, delete the document from the cache.
|
|
101
|
+
*/
|
|
102
|
+
protected _unloadDoc(docId: string): Promise<void>;
|
|
103
|
+
_sendMessage(message: BroadcastMessage<O>): void;
|
|
104
|
+
onLocalOperations({ docId, operations }: {
|
|
105
|
+
docId: string;
|
|
106
|
+
operations: O[];
|
|
107
|
+
}): void;
|
|
108
|
+
/**
|
|
109
|
+
* Push local operations to the server for a specific document.
|
|
110
|
+
* Uses a per-docId queue to prevent concurrent pushes for the same doc.
|
|
111
|
+
*/
|
|
112
|
+
saveRemote({ docId }: {
|
|
113
|
+
docId: string;
|
|
114
|
+
}): void;
|
|
115
|
+
/**
|
|
116
|
+
* Unsubscribe from real-time updates for a document.
|
|
117
|
+
* Should be called when a document is unloaded (refCount 1 → 0).
|
|
118
|
+
*/
|
|
119
|
+
unsubscribeDoc(docId: string): Promise<void>;
|
|
120
|
+
protected _doPush({ docId }: {
|
|
121
|
+
docId: string;
|
|
122
|
+
}): Promise<void>;
|
|
123
|
+
protected _request<E extends DocSyncEventName>(event: E, payload: DocSyncEvents<S, O>[E]["request"]): Promise<DocSyncEvents<S, O>[E]["response"]>;
|
|
124
|
+
/**
|
|
125
|
+
* Register a handler for connection events.
|
|
126
|
+
* @returns Unsubscribe function
|
|
127
|
+
*/
|
|
128
|
+
onConnect(handler: ConnectHandler): () => void;
|
|
129
|
+
/**
|
|
130
|
+
* Register a handler for disconnection events.
|
|
131
|
+
* @returns Unsubscribe function
|
|
132
|
+
*/
|
|
133
|
+
onDisconnect(handler: DisconnectHandler): () => void;
|
|
134
|
+
/**
|
|
135
|
+
* Register a handler for document change events.
|
|
136
|
+
* @returns Unsubscribe function
|
|
137
|
+
*/
|
|
138
|
+
onChange(handler: ChangeHandler<O>): () => void;
|
|
139
|
+
/**
|
|
140
|
+
* Register a handler for sync events.
|
|
141
|
+
* @returns Unsubscribe function
|
|
142
|
+
*/
|
|
143
|
+
onSync(handler: SyncHandler<O>): () => void;
|
|
144
|
+
/**
|
|
145
|
+
* Register a handler for document load events.
|
|
146
|
+
* @returns Unsubscribe function
|
|
147
|
+
*/
|
|
148
|
+
onDocLoad(handler: DocLoadHandler): () => void;
|
|
149
|
+
/**
|
|
150
|
+
* Register a handler for document unload events.
|
|
151
|
+
* @returns Unsubscribe function
|
|
152
|
+
*/
|
|
153
|
+
onDocUnload(handler: DocUnloadHandler): () => void;
|
|
154
|
+
protected _emit(handlers: Set<() => void>): void;
|
|
155
|
+
protected _emit<T>(handlers: Set<(event: T) => void>, event: T): void;
|
|
156
|
+
}
|
|
157
|
+
export {};
|
|
158
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.ts"],"names":[],"mappings":"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"}
|