@zeroback/client 0.0.4 → 0.0.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeroback/client",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -10,10 +10,12 @@
10
10
  "import": "./dist/index.js"
11
11
  }
12
12
  },
13
- "files": ["dist"],
13
+ "files": [
14
+ "dist"
15
+ ],
14
16
  "dependencies": {
15
- "@zeroback/values": "^0.0.1",
16
- "@zeroback/server": "^0.0.1"
17
+ "@zeroback/values": "^0.0.5",
18
+ "@zeroback/server": "^0.0.5"
17
19
  },
18
20
  "scripts": {
19
21
  "build": "tsc --build",
@@ -22,5 +24,8 @@
22
24
  },
23
25
  "devDependencies": {
24
26
  "typescript": "^5.6.0"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
25
30
  }
26
31
  }
@@ -1,57 +0,0 @@
1
- import { QueryStore } from "./QueryStore";
2
- import type { LocalStore, QueryKey } from "./QueryStore";
3
- import type { PersistenceAdapter } from "./persistence/PersistenceAdapter.js";
4
- export type ConnectionState = "connecting" | "connected" | "disconnected";
5
- export interface ConvexClientOptions {
6
- persistence?: boolean | PersistenceAdapter;
7
- maxCacheAge?: number;
8
- schemaVersion?: string;
9
- }
10
- export declare class ConvexClient {
11
- private ws;
12
- private subscriptions;
13
- private pendingRequests;
14
- private url;
15
- private backoff;
16
- private isConnecting;
17
- private messageQueue;
18
- private closed;
19
- private _connectionState;
20
- private connectionListeners;
21
- /** Centralized query result cache with optimistic update support. */
22
- readonly queryStore: QueryStore;
23
- /** Sequential mutation queue — ensures mutations execute one at a time in order. */
24
- private mutationQueue;
25
- private persistedMutationQueue;
26
- private options;
27
- constructor(url: string, options?: ConvexClientOptions);
28
- /**
29
- * Initialize the client with persistence.
30
- * Hydrates cached data from IndexedDB, connects the WebSocket, and replays
31
- * any persisted offline mutations. Only needed when persistence is enabled.
32
- */
33
- init(): Promise<void>;
34
- private replayPersistedMutations;
35
- hasServerResult(key: QueryKey): boolean;
36
- get connectionState(): ConnectionState;
37
- onConnectionChange(listener: (state: ConnectionState) => void): () => void;
38
- private setConnectionState;
39
- private connect;
40
- private scheduleReconnect;
41
- /** Re-subscribe all active subscriptions after reconnect or server reset. */
42
- private resubscribeAll;
43
- private flushMessageQueue;
44
- private send;
45
- subscribe(fnName: string, args: unknown, callback?: (data: unknown) => void): () => void;
46
- /** Subscribe to changes for a specific query key in the centralized store. */
47
- watchQuery(key: QueryKey, listener: () => void): () => void;
48
- /** Get the current (merged base + optimistic) result for a query key. */
49
- getQueryResult(key: QueryKey): unknown | undefined;
50
- mutation(fnName: string, args: unknown, opts?: {
51
- optimisticUpdate?: (store: LocalStore) => void;
52
- }): Promise<unknown>;
53
- action(fnName: string, args: unknown): Promise<unknown>;
54
- private handleMessage;
55
- close(): void;
56
- }
57
- //# sourceMappingURL=ConvexClient.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConvexClient.d.ts","sourceRoot":"","sources":["../src/ConvexClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAI9E,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,CAAC;AAE1E,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,OAAO,GAAG,kBAAkB,CAAC;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,eAAe,CAGlB;IACL,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,gBAAgB,CAAmC;IAC3D,OAAO,CAAC,mBAAmB,CAA+C;IAE1E,qEAAqE;IACrE,QAAQ,CAAC,UAAU,aAAoB;IAEvC,oFAAoF;IACpF,OAAO,CAAC,aAAa,CAAoC;IAEzD,OAAO,CAAC,sBAAsB,CAA8B;IAC5D,OAAO,CAAC,OAAO,CAAsB;gBAEzB,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB;IAqBtD;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAMb,wBAAwB;IAatC,eAAe,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO;IAIvC,IAAI,eAAe,IAAI,eAAe,CAErC;IAED,kBAAkB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAK1E,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,OAAO;IA6Cf,OAAO,CAAC,iBAAiB;IAczB,6EAA6E;IAC7E,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,IAAI;IAQZ,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IASxF,8EAA8E;IAC9E,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAI3D,yEAAyE;IACzE,cAAc,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS;IAIlD,QAAQ,CACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,IAAI,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;KAAE,GACxD,OAAO,CAAC,OAAO,CAAC;IAoCb,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ7D,OAAO,CAAC,aAAa;IAsDrB,KAAK,IAAI,IAAI;CAMd"}
@@ -1,267 +0,0 @@
1
- import { SubscriptionRegistry } from "./SubscriptionRegistry";
2
- import { Backoff } from "./Backoff";
3
- import { QueryStore } from "./QueryStore";
4
- import { IDBPersistence } from "./persistence/IDBPersistence.js";
5
- import { MutationQueue } from "./persistence/MutationQueue.js";
6
- export class ConvexClient {
7
- ws = null;
8
- subscriptions;
9
- pendingRequests = new Map();
10
- url;
11
- backoff = new Backoff();
12
- isConnecting = false;
13
- messageQueue = [];
14
- closed = false;
15
- _connectionState = "disconnected";
16
- connectionListeners = new Set();
17
- /** Centralized query result cache with optimistic update support. */
18
- queryStore = new QueryStore();
19
- /** Sequential mutation queue — ensures mutations execute one at a time in order. */
20
- mutationQueue = Promise.resolve();
21
- persistedMutationQueue = null;
22
- options;
23
- constructor(url, options) {
24
- this.url = url;
25
- this.options = options ?? {};
26
- this.subscriptions = new SubscriptionRegistry();
27
- if (this.options.persistence) {
28
- const adapter = typeof this.options.persistence === "object"
29
- ? this.options.persistence
30
- : new IDBPersistence(url, {
31
- maxCacheAge: this.options.maxCacheAge,
32
- schemaVersion: this.options.schemaVersion,
33
- });
34
- this.queryStore.setPersistence(adapter);
35
- this.persistedMutationQueue = new MutationQueue(url);
36
- // When persistence is enabled, defer connect() to init()
37
- }
38
- else {
39
- this.connect();
40
- }
41
- }
42
- /**
43
- * Initialize the client with persistence.
44
- * Hydrates cached data from IndexedDB, connects the WebSocket, and replays
45
- * any persisted offline mutations. Only needed when persistence is enabled.
46
- */
47
- async init() {
48
- await this.queryStore.hydrate();
49
- this.connect();
50
- await this.replayPersistedMutations();
51
- }
52
- async replayPersistedMutations() {
53
- if (!this.persistedMutationQueue)
54
- return;
55
- const pending = await this.persistedMutationQueue.getAll();
56
- for (const m of pending) {
57
- try {
58
- await this.mutation(m.fnName, m.args);
59
- }
60
- catch {
61
- // Mutation failed on replay — discard it
62
- }
63
- await this.persistedMutationQueue.remove(m.id);
64
- }
65
- }
66
- hasServerResult(key) {
67
- return this.queryStore.hasServerConfirmation(key);
68
- }
69
- get connectionState() {
70
- return this._connectionState;
71
- }
72
- onConnectionChange(listener) {
73
- this.connectionListeners.add(listener);
74
- return () => this.connectionListeners.delete(listener);
75
- }
76
- setConnectionState(state) {
77
- if (this._connectionState === state)
78
- return;
79
- this._connectionState = state;
80
- for (const listener of this.connectionListeners) {
81
- listener(state);
82
- }
83
- }
84
- connect() {
85
- if (this.closed || this.isConnecting || (this.ws?.readyState === WebSocket.OPEN)) {
86
- return;
87
- }
88
- this.isConnecting = true;
89
- this.setConnectionState("connecting");
90
- try {
91
- this.ws = new WebSocket(this.url);
92
- }
93
- catch {
94
- this.isConnecting = false;
95
- this.setConnectionState("disconnected");
96
- this.scheduleReconnect();
97
- return;
98
- }
99
- this.ws.onopen = () => {
100
- this.isConnecting = false;
101
- this.backoff.reset();
102
- this.setConnectionState("connected");
103
- this.resubscribeAll();
104
- this.flushMessageQueue();
105
- };
106
- this.ws.onmessage = (event) => {
107
- try {
108
- const msg = JSON.parse(event.data);
109
- this.handleMessage(msg);
110
- }
111
- catch {
112
- // Ignore unparseable messages
113
- }
114
- };
115
- this.ws.onclose = () => {
116
- this.isConnecting = false;
117
- this.setConnectionState("disconnected");
118
- if (!this.closed)
119
- this.scheduleReconnect();
120
- };
121
- this.ws.onerror = () => {
122
- this.isConnecting = false;
123
- };
124
- }
125
- scheduleReconnect() {
126
- if (this.closed || !this.backoff.shouldRetry()) {
127
- // Reject all pending requests on permanent disconnect
128
- for (const [id, pending] of this.pendingRequests) {
129
- pending.reject(new Error("Connection lost"));
130
- this.pendingRequests.delete(id);
131
- }
132
- return;
133
- }
134
- const delay = this.backoff.next();
135
- setTimeout(() => this.connect(), delay);
136
- }
137
- /** Re-subscribe all active subscriptions after reconnect or server reset. */
138
- resubscribeAll() {
139
- for (const sub of this.subscriptions.getAll()) {
140
- this.send({ type: "query", id: sub.id, fn: sub.fnName, args: sub.args });
141
- }
142
- }
143
- flushMessageQueue() {
144
- while (this.messageQueue.length > 0) {
145
- const msg = this.messageQueue.shift();
146
- this.send(msg);
147
- }
148
- }
149
- send(msg) {
150
- if (this.ws?.readyState === WebSocket.OPEN) {
151
- this.ws.send(JSON.stringify(msg));
152
- }
153
- else {
154
- this.messageQueue.push(msg);
155
- }
156
- }
157
- subscribe(fnName, args, callback) {
158
- const subId = this.subscriptions.add(fnName, args, callback ?? (() => { }));
159
- this.send({ type: "query", id: subId, fn: fnName, args });
160
- return () => {
161
- this.subscriptions.remove(subId);
162
- this.send({ type: "unsubscribe", id: subId });
163
- };
164
- }
165
- /** Subscribe to changes for a specific query key in the centralized store. */
166
- watchQuery(key, listener) {
167
- return this.queryStore.subscribe(key, listener);
168
- }
169
- /** Get the current (merged base + optimistic) result for a query key. */
170
- getQueryResult(key) {
171
- return this.queryStore.getResult(key);
172
- }
173
- mutation(fnName, args, opts) {
174
- const id = crypto.randomUUID();
175
- // Apply optimistic update immediately (before waiting in queue)
176
- if (opts?.optimisticUpdate) {
177
- this.queryStore.addLayer(id, opts.optimisticUpdate);
178
- }
179
- // Persist mutation for offline replay (fire-and-forget)
180
- if (this.persistedMutationQueue) {
181
- this.persistedMutationQueue.add({ id, fnName, args, timestamp: Date.now() }).catch(() => { });
182
- }
183
- // Chain onto the mutation queue so mutations execute sequentially
184
- const result = this.mutationQueue.then(async () => {
185
- try {
186
- const res = await new Promise((resolve, reject) => {
187
- this.pendingRequests.set(id, { resolve, reject });
188
- this.send({ type: "mutation", id, fn: fnName, args });
189
- });
190
- // Mutation succeeded — remove from persisted queue
191
- this.persistedMutationQueue?.remove(id).catch(() => { });
192
- return res;
193
- }
194
- finally {
195
- if (opts?.optimisticUpdate) {
196
- this.queryStore.removeLayer(id);
197
- }
198
- }
199
- });
200
- // Update the queue — always resolve so subsequent mutations aren't blocked by failures
201
- this.mutationQueue = result.then(() => { }, () => { });
202
- return result;
203
- }
204
- async action(fnName, args) {
205
- const id = crypto.randomUUID();
206
- return new Promise((resolve, reject) => {
207
- this.pendingRequests.set(id, { resolve, reject });
208
- this.send({ type: "action", id, fn: fnName, args });
209
- });
210
- }
211
- handleMessage(msg) {
212
- switch (msg.type) {
213
- case "result":
214
- case "update": {
215
- // Update centralized store
216
- const sub = this.subscriptions.get(msg.id);
217
- if (sub) {
218
- const key = QueryStore.makeKey(sub.fnName, sub.args);
219
- this.queryStore.setServerResult(key, msg.result);
220
- }
221
- // Also call subscription callback (for usePaginatedQuery and direct subscribers)
222
- this.subscriptions.notify(msg.id, msg.result);
223
- break;
224
- }
225
- case "updates":
226
- for (const item of msg.items) {
227
- const sub = this.subscriptions.get(item.id);
228
- if (sub) {
229
- const key = QueryStore.makeKey(sub.fnName, sub.args);
230
- this.queryStore.setServerResult(key, item.result);
231
- }
232
- this.subscriptions.notify(item.id, item.result);
233
- }
234
- break;
235
- case "mutationResult":
236
- case "actionResult": {
237
- const pending = this.pendingRequests.get(msg.id);
238
- if (pending) {
239
- pending.resolve(msg.result);
240
- this.pendingRequests.delete(msg.id);
241
- }
242
- break;
243
- }
244
- case "error":
245
- if (msg.id) {
246
- const pending = this.pendingRequests.get(msg.id);
247
- if (pending) {
248
- pending.reject(new Error(msg.message));
249
- this.pendingRequests.delete(msg.id);
250
- }
251
- }
252
- break;
253
- case "reset":
254
- // Server lost subscription state (e.g. hibernation wake) — re-subscribe
255
- this.queryStore.clearServerConfirmations();
256
- this.resubscribeAll();
257
- break;
258
- }
259
- }
260
- close() {
261
- this.closed = true;
262
- this.ws?.close();
263
- this.ws = null;
264
- this.setConnectionState("disconnected");
265
- }
266
- }
267
- //# sourceMappingURL=ConvexClient.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConvexClient.js","sourceRoot":"","sources":["../src/ConvexClient.ts"],"names":[],"mappings":"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"}