prostgles-client 4.0.420 → 4.0.422

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.
@@ -18,12 +18,12 @@ export type SyncHandler<T> = {
18
18
  $upsert: (newData: T[]) => void | Promise<void>;
19
19
  getItems: () => T[];
20
20
  };
21
- export type Sync<T extends AnyObject = AnyObject> = <TD extends T, Opts extends SyncOptions>(basicFilter: EqualityFilter<TD>, options: SyncOptions, onChange: OnChange<TD, Opts>) => Promise<SyncHandler<TD>>;
21
+ export type Sync<T extends AnyObject = AnyObject> = <TD extends T, Opts extends SyncOptions>(basicFilter: EqualityFilter<TD>, options: SyncOptions, onChange: OnChange<TD, Opts>, onError?: OnErrorHandler) => Promise<SyncHandler<TD>>;
22
22
  export type OnChangeOne<T extends Record<string, unknown>, Opts extends SyncOptions> = (data: SyncDataItem<T, Opts>, delta?: Partial<NormalizedRow<T>>) => void | Promise<void>;
23
23
  /**
24
24
  * Creates a local synchronized record
25
25
  */
26
- export type SyncOne<T extends AnyObject = AnyObject> = <TD extends T, Opts extends SyncOneOptions>(basicFilter: Partial<TD>, options: Opts, onChange: OnChangeOne<TD, Opts>) => Promise<SingleSyncHandles<TD, Opts["handlesOnData"]>>;
26
+ export type SyncOne<T extends AnyObject = AnyObject> = <TD extends T, Opts extends SyncOneOptions>(basicFilter: Partial<TD>, options: Opts, onChange: OnChangeOne<TD, Opts>, onError?: OnErrorHandler) => Promise<SingleSyncHandles<TD, Opts["handlesOnData"]>>;
27
27
  export type SyncBatchRequest = {
28
28
  from_synced?: string | number;
29
29
  to_synced?: string | number;
@@ -72,6 +72,7 @@ export type MultiSyncHandles<T extends AnyObject> = {
72
72
  };
73
73
  export type SubscriptionSingle<T extends AnyObject = AnyObject, Full extends boolean = false> = {
74
74
  _onChange: SingleChangeListener<T, Full>;
75
+ onError: OnErrorHandler | undefined;
75
76
  notify: (data: T, delta?: DeepPartial<NormalizedRow<T>>) => void | Promise<void>;
76
77
  idObj: Partial<T>;
77
78
  handlesOnData?: boolean;
@@ -79,6 +80,7 @@ export type SubscriptionSingle<T extends AnyObject = AnyObject, Full extends boo
79
80
  };
80
81
  export type SubscriptionMulti<T extends AnyObject = AnyObject> = {
81
82
  _onChange: MultiChangeListener<T>;
83
+ onError: OnErrorHandler | undefined;
82
84
  notify: (data: T[], delta: DeepPartial<T>[]) => T[];
83
85
  idObj?: Partial<T>;
84
86
  handlesOnData?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"SyncedTable.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/SyncedTable.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SyncedTable.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/SyncedTable.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,8 @@
1
- import { WAL } from "prostgles-types/dist/WAL";
2
1
  import type { Socket } from "socket.io-client";
3
2
  import { type SyncedTableOptions } from "./SyncedTable";
4
3
  export declare const createSync: (socket: Socket, options: Omit<SyncedTableOptions, "onReady">) => Promise<{
5
- reAttach: () => Promise<void>;
6
- sync: <T extends import("prostgles-types").AnyObject = import("prostgles-types").AnyObject>(onChange: import("./SyncedTable").MultiChangeListener<T>, handlesOnData?: boolean) => import("./SyncedTable").MultiSyncHandles<T>;
7
- syncOne: <T extends import("prostgles-types").AnyObject = import("prostgles-types").AnyObject, Full extends boolean = false>(idObj: Partial<T>, onChange: import("./SyncedTable").SingleChangeListener<T, Full>, handlesOnData?: boolean) => import("./SyncedTable").SingleSyncHandles<T, Full>;
8
- notifyWal: WAL;
9
- notifyCurrentData: () => void;
4
+ sync: <T extends import("prostgles-types").AnyObject = import("prostgles-types").AnyObject>(onChange: import("./SyncedTable").MultiChangeListener<T>, handlesOnData?: boolean, onError?: import("./SyncedTable").OnErrorHandler) => import("./SyncedTable").MultiSyncHandles<T>;
5
+ syncOne: <T extends import("prostgles-types").AnyObject = import("prostgles-types").AnyObject, Full extends boolean = false>(idObj: Partial<T>, onChange: import("./SyncedTable").SingleChangeListener<T, Full>, handlesOnData?: boolean, onError?: import("./SyncedTable").OnErrorHandler) => import("./SyncedTable").SingleSyncHandles<T, Full>;
6
+ reAttach: (schema: Pick<SyncedTableOptions, "db" | "columns">) => Promise<void>;
10
7
  }>;
11
8
  //# sourceMappingURL=createSync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createSync.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/createSync.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,GAAG,EAAgB,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI/C,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,UAAU,GAAU,QAAQ,MAAM,EAAE,SAAS,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC;;;;;;EAsP5F,CAAC"}
1
+ {"version":3,"file":"createSync.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/createSync.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI/C,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,UAAU,GAAU,QAAQ,MAAM,EAAE,SAAS,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC;;;uBA0QjE,IAAI,CAAC,kBAAkB,EAAE,IAAI,GAAG,SAAS,CAAC;EAgBrE,CAAC"}
@@ -9,8 +9,8 @@ const createSyncSubscriptionManager_1 = require("./createSyncSubscriptionManager
9
9
  const SyncedTable_1 = require("./SyncedTable");
10
10
  const createSync = async (socket, options) => {
11
11
  const stateUtils = (0, createSyncStateUtils_1.createSyncStateUtils)(socket, options);
12
- const { state, onDebug, id_fields, synced_field, throttle, batch_size, columns, _syncInfo, initializeSync, filter, } = stateUtils;
13
- const store = (0, createSyncDataStore_1.createSyncDataStore)({ ..._syncInfo, columns, filter });
12
+ const { state, onDebug } = stateUtils;
13
+ const store = (0, createSyncDataStore_1.createSyncDataStore)({ ...stateUtils._syncInfo, ...options });
14
14
  const onError = (err) => {
15
15
  console.error("Sync internal error: ", err);
16
16
  };
@@ -78,37 +78,39 @@ const createSync = async (socket, options) => {
78
78
  }
79
79
  return { success: true };
80
80
  };
81
- const opts = {
82
- id_fields,
83
- synced_field,
84
- throttle,
85
- };
86
81
  const clientSyncHandles = { onSyncRequest, onPullRequest, onUpdates };
87
- let dbSync = await initializeSync(clientSyncHandles);
82
+ let dbSync = await stateUtils.initializeSync(clientSyncHandles);
83
+ let reattaching;
88
84
  /**
89
85
  * Some syncs can be read only. Any changes are local
90
86
  */
91
- const wal = new WAL_1.WAL({
92
- ...opts,
93
- batch_size,
94
- onSendStart: () => {
95
- if (isWindowDefined) {
96
- window.onbeforeunload = function confirmExit() {
97
- return "Data may be lost. Are you sure?";
98
- };
99
- }
100
- },
101
- onSend: async (data, walData) => {
102
- const _data = walData.map((d) => d.current);
103
- if (!_data.length)
104
- return [];
105
- return dbSync.syncData(data);
106
- },
107
- onSendEnd: () => {
108
- if (isWindowDefined)
109
- window.onbeforeunload = null;
110
- },
111
- });
87
+ const createWal = () => {
88
+ const nextWal = new WAL_1.WAL({
89
+ ...stateUtils._syncInfo,
90
+ onSendStart: () => {
91
+ if (isWindowDefined) {
92
+ window.onbeforeunload = function confirmExit() {
93
+ return "Data may be lost. Are you sure?";
94
+ };
95
+ }
96
+ },
97
+ onSend: async (data, walData) => {
98
+ await reattaching;
99
+ if (state.error || wal !== nextWal)
100
+ return;
101
+ const _data = walData.map((d) => d.current);
102
+ if (!_data.length)
103
+ return [];
104
+ return dbSync.syncData(data);
105
+ },
106
+ onSendEnd: () => {
107
+ if (isWindowDefined && wal === nextWal)
108
+ window.onbeforeunload = null;
109
+ },
110
+ });
111
+ return nextWal;
112
+ };
113
+ let wal = createWal();
112
114
  /**
113
115
  * Upserts data locally -> notify subs -> sends to server if required
114
116
  * synced_field is populated if data is not from server
@@ -116,6 +118,9 @@ const createSync = async (socket, options) => {
116
118
  * @param from_server : <boolean> If false then updates will be sent to server
117
119
  */
118
120
  const upsert = async (items, from_server = false) => {
121
+ if (state.error)
122
+ throw state.error;
123
+ const { synced_field } = stateUtils;
119
124
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
120
125
  if ((!items || !items.length) && !from_server)
121
126
  throw "No data provided for upsert";
@@ -128,7 +133,8 @@ const createSync = async (socket, options) => {
128
133
  const walItems = [];
129
134
  await Promise.all(items.map(async (item, i) => {
130
135
  // let d = { ...item.idObj, ...item.delta };
131
- const idObj = { ...item.idObj };
136
+ const oldItem = store.getItem(item.idObj);
137
+ const idObj = store.getIdObj({ ...oldItem, ...item.delta, ...item.idObj });
132
138
  let delta = { ...item.delta };
133
139
  /* Convert undefined to null because:
134
140
  1) JSON.stringify drops these keys
@@ -141,7 +147,6 @@ const createSync = async (socket, options) => {
141
147
  if (!from_server) {
142
148
  store.checkItemCols({ ...item.delta, ...item.idObj });
143
149
  }
144
- const oldItem = store.getItem(idObj);
145
150
  /* Calc delta if missing or if from server */
146
151
  if ((from_server || (0, prostgles_types_1.isEmpty)(delta)) && !(0, prostgles_types_1.isEmpty)(oldItem)) {
147
152
  delta = store.getDelta(oldItem || {}, delta);
@@ -195,12 +200,53 @@ const createSync = async (socket, options) => {
195
200
  wal.addData(walItems);
196
201
  }
197
202
  };
198
- const subscriptionManager = (0, createSyncSubscriptionManager_1.createSyncSubscriptionManager)({ id_fields, synced_field }, store, stateUtils, upsert);
199
- const reAttach = async () => {
203
+ const subscriptionManager = (0, createSyncSubscriptionManager_1.createSyncSubscriptionManager)(stateUtils._syncInfo, store, stateUtils, upsert);
204
+ const attach = async (schema) => {
200
205
  state.isSynced = false;
201
- dbSync = await initializeSync(clientSyncHandles);
202
- store.setItems(dbSync.syncInfo.data);
203
- await dbSync.syncData();
206
+ dbSync.unsync();
207
+ try {
208
+ const nextStateUtils = (0, createSyncStateUtils_1.createSyncStateUtils)(socket, { ...options, ...schema });
209
+ const syncConfigChanged = !(0, prostgles_types_1.isEqual)(stateUtils._syncInfo, nextStateUtils._syncInfo);
210
+ const syncFieldsChanged = !(0, prostgles_types_1.isEqual)(stateUtils.id_fields, nextStateUtils.id_fields) ||
211
+ stateUtils.synced_field !== nextStateUtils.synced_field;
212
+ const schemaChanged = syncConfigChanged || !(0, prostgles_types_1.isEqual)(stateUtils.columns, nextStateUtils.columns);
213
+ Object.assign(stateUtils, nextStateUtils, { state });
214
+ if (schemaChanged || state.error) {
215
+ if (syncConfigChanged || state.error) {
216
+ const pendingItems = !syncFieldsChanged && !state.error ? wal.getPendingItems() : [];
217
+ clearTimeout(wal.isSendingTimeout);
218
+ clearTimeout(wal.willDeleteHistory);
219
+ wal = createWal();
220
+ if (pendingItems.length) {
221
+ void wal.addData(pendingItems);
222
+ }
223
+ }
224
+ Object.assign(store, (0, createSyncDataStore_1.createSyncDataStore)({ ...stateUtils._syncInfo, ...options, ...schema }));
225
+ subscriptionManager.reset(stateUtils._syncInfo);
226
+ }
227
+ state.error = undefined;
228
+ dbSync = await stateUtils.initializeSync(clientSyncHandles);
229
+ store.setItems([
230
+ ...dbSync.syncInfo.data,
231
+ ...wal.getPendingItems().map(({ current }) => current),
232
+ ]);
233
+ await dbSync.syncData();
234
+ }
235
+ catch (error) {
236
+ state.error = error;
237
+ store.setItems([]);
238
+ clearTimeout(wal.isSendingTimeout);
239
+ clearTimeout(wal.willDeleteHistory);
240
+ subscriptionManager.reset(stateUtils._syncInfo);
241
+ subscriptionManager.notifyError(error);
242
+ throw error;
243
+ }
244
+ };
245
+ const reAttach = (schema) => {
246
+ reattaching = (reattaching ?? Promise.resolve())
247
+ .catch(() => undefined)
248
+ .then(() => attach(schema));
249
+ return reattaching;
204
250
  };
205
251
  store.setItems(dbSync.syncInfo.data);
206
252
  /** TODO */
@@ -209,7 +255,7 @@ const createSync = async (socket, options) => {
209
255
  // } else {
210
256
  // state.isSynced = true;
211
257
  // }
212
- return { ...subscriptionManager, reAttach };
258
+ return { sync: subscriptionManager.sync, syncOne: subscriptionManager.syncOne, reAttach };
213
259
  };
214
260
  exports.createSync = createSync;
215
261
  const isWindowDefined = typeof window !== "undefined";
@@ -1 +1 @@
1
- {"version":3,"file":"createSyncDataStore.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/createSyncDataStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,SAAS,EACd,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAc,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,eAAO,MAAM,mBAAmB,GAAI,+CAKjC,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,cAAc,CAAC,GAC7C,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,SAAS,CAAC;eA2B5B,CAAC,SAAS,SAAS,mBAAiB,CAAC,EAAE;2DAyBZ,eAAe;;;kBA3CvC,SAAS;uBAOJ,SAAS;kBA0Fd,SAAS,KAAK,SAAS,KAAG,SAAS;uBA3B9B,SAAS,EAAE,KAAG,IAAI;0BAkBf,SAAS;qBA7Bd,SAAS;cAoBhB,CAAC,qBAAqB,OAAO,CAAC,CAAC,CAAC,KAAG,CAAC,GAAG,SAAS;sBA0CxC,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS;0BAN3C,SAAS,GAAG,SAAS;CAuBnD,CAAC"}
1
+ {"version":3,"file":"createSyncDataStore.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/createSyncDataStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,SAAS,EACd,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAc,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,eAAO,MAAM,mBAAmB,GAAI,+CAKjC,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,cAAc,CAAC,GAC7C,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,SAAS,CAAC;eA2B5B,CAAC,SAAS,SAAS,mBAAiB,CAAC,EAAE;2DAyBZ,eAAe;;;kBA3CvC,SAAS;uBAOJ,SAAS;kBA+Fd,SAAS,KAAK,SAAS,KAAG,SAAS;uBAhC9B,SAAS,EAAE,KAAG,IAAI;0BAuBf,SAAS;qBAlCd,SAAS;cAoBhB,CAAC,qBAAqB,OAAO,CAAC,CAAC,CAAC,KAAG,CAAC,GAAG,SAAS;sBA+CxC,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG,SAAS;0BAN3C,SAAS,GAAG,SAAS;CAuBnD,CAAC"}
@@ -73,8 +73,10 @@ const createSyncDataStore = ({ id_fields, synced_field, filter, columns, }) => {
73
73
  });
74
74
  };
75
75
  const getItem = (idObj) => {
76
- const d = itemsMap.get(getIdStr(idObj));
77
- return (0, SyncedTable_1.quickClone)(d);
76
+ const matchedItem = (id_fields.every((field) => field in idObj) ?
77
+ itemsMap.get(getIdStr(idObj))
78
+ : Array.from(itemsMap.values()).find((item) => Object.entries(idObj).every(([field, value]) => item[field] === value)));
79
+ return (0, SyncedTable_1.quickClone)(matchedItem);
78
80
  };
79
81
  /**
80
82
  * Ensures that all object keys match valid column names
@@ -5,6 +5,7 @@ import type { SyncedTableOptions } from "./SyncedTable";
5
5
  export declare const createSyncStateUtils: (socket: Socket, options: SyncedTableOptions) => {
6
6
  state: {
7
7
  isSynced: boolean;
8
+ error: unknown;
8
9
  };
9
10
  onDebug: (evt: Omit<SyncDebugEvent, "type" | "tableName" | "channelName" | "options">) => void | Promise<void> | undefined;
10
11
  id_fields: string[];
@@ -12,7 +13,12 @@ export declare const createSyncStateUtils: (socket: Socket, options: SyncedTable
12
13
  throttle: number;
13
14
  batch_size: number;
14
15
  columns: import("prostgles-types").ValidatedColumnInfo[];
15
- _syncInfo: import("prostgles-types").SyncTableInfo;
16
+ _syncInfo: {
17
+ id_fields: string[];
18
+ synced_field: string;
19
+ throttle: number;
20
+ batch_size: number;
21
+ };
16
22
  initializeSync: (handles: ClientSyncHandles) => Promise<{
17
23
  syncInfo: import("prostgles-types").JSONB.GetObjectType<{
18
24
  readonly id_fields: "string[]";
@@ -21,7 +27,7 @@ export declare const createSyncStateUtils: (socket: Socket, options: SyncedTable
21
27
  readonly data: "any[]";
22
28
  readonly isSynced: "boolean";
23
29
  }>;
24
- unsync: () => Promise<unknown>;
30
+ unsync: () => void;
25
31
  syncData: (data?: import("prostgles-types").AnyObject[], deleted?: import("prostgles-types").AnyObject[], cb?: (err?: any) => void) => void;
26
32
  handlers: ReplicationProtocol.OutgoingHandlers<"client">;
27
33
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"createSyncStateUtils.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/createSyncStateUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,mBAAmB,EACnB,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAe,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAErE,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,EAAE,SAAS,kBAAkB;;;;mBAIxD,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;;;;;;;8BAyBrD,iBAAiB;;;;;;;;;2HAiEk2E,CAAC;;;;;;CAD55E,CAAC"}
1
+ {"version":3,"file":"createSyncStateUtils.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/createSyncStateUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,mBAAmB,EACnB,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAe,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAErE,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,EAAE,SAAS,kBAAkB;;;eACzB,OAAO;;mBAGtC,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;;;;;;;;;;;;8BA0BrD,iBAAiB;;;;;;;;;2HAgEy1E,CAAC;;;;;;CADn5E,CAAC"}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createSyncStateUtils = void 0;
4
4
  const prostgles_types_1 = require("prostgles-types");
5
5
  const createSyncStateUtils = (socket, options) => {
6
- const state = { isSynced: false };
6
+ const state = { isSynced: false, error: undefined };
7
7
  const { db, name, select = "*", filter = {}, columns } = options;
8
8
  const channelName = (0, prostgles_types_1.getSyncChannelName)({ filter, select, tableName: name });
9
9
  const onDebug = (evt) => options.onDebug?.({
@@ -18,15 +18,17 @@ const createSyncStateUtils = (socket, options) => {
18
18
  if (!tableHandler) {
19
19
  throw `${name} table not found in db`;
20
20
  }
21
- const { _syncInfo } = tableHandler;
22
- if (!_syncInfo) {
21
+ const syncInfo = tableHandler._syncInfo;
22
+ if (!syncInfo) {
23
23
  throw `${name} table does not support sync`;
24
24
  }
25
+ const _syncInfo = { ...syncInfo, id_fields: [...syncInfo.id_fields].sort() };
25
26
  const { id_fields, synced_field, throttle = 100, batch_size = 50 } = _syncInfo;
26
27
  if (!id_fields.length || !synced_field) {
27
28
  throw "id_fields/synced_field missing";
28
29
  }
29
30
  const initializeSync = async (handles) => {
31
+ let attached = true;
30
32
  const syncInfo = await new Promise((resolve, reject) => {
31
33
  socket.emit(prostgles_types_1.CHANNEL_PREFIX, {
32
34
  tableName: name,
@@ -50,20 +52,17 @@ const createSyncStateUtils = (socket, options) => {
50
52
  });
51
53
  const syncData = async (data) => {
52
54
  const { c_count, c_fr, c_lr } = await handles.onSyncRequest({});
55
+ if (!attached)
56
+ return;
53
57
  handlers.ClientSyncRequest(data && c_fr && c_lr ?
54
58
  { state: "syncing-data", c_count, c_fr, c_lr, data }
55
59
  : { state: "syncing", c_count, c_fr, c_lr });
56
60
  };
57
61
  const unsync = () => {
58
- return new Promise((resolve, reject) => {
59
- socket.emit(channelName + "unsync", {}, (err, res) => {
60
- if (err)
61
- reject(err);
62
- else
63
- resolve(res);
64
- });
65
- socket.removeAllListeners(channelName);
66
- });
62
+ attached = false;
63
+ socket.removeAllListeners(channelName);
64
+ /* The server may already have removed the sync during a schema change. */
65
+ socket.timeout(5000).emit(channelName + "unsync", {}, () => undefined);
67
66
  };
68
67
  return { syncInfo, unsync, syncData, handlers };
69
68
  };
@@ -2,11 +2,13 @@ import type { AnyObject, SyncConfig } from "prostgles-types";
2
2
  import { WAL } from "prostgles-types/dist/WAL";
3
3
  import type { createSyncDataStore } from "./createSyncDataStore";
4
4
  import type { createSyncStateUtils } from "./createSyncStateUtils";
5
- import { type ItemUpdate, type MultiChangeListener, type MultiSyncHandles, type SingleChangeListener, type SingleSyncHandles } from "./SyncedTable";
6
- export declare const createSyncSubscriptionManager: ({ id_fields, synced_field }: Omit<SyncConfig, "channelName">, store: ReturnType<typeof createSyncDataStore>, stateUtils: ReturnType<typeof createSyncStateUtils>, upsert: (items: ItemUpdate[], from_server?: boolean) => Promise<void>) => {
7
- sync: <T extends AnyObject = AnyObject>(onChange: MultiChangeListener<T>, handlesOnData?: boolean) => MultiSyncHandles<T>;
8
- syncOne: <T extends AnyObject = AnyObject, Full extends boolean = false>(idObj: Partial<T>, onChange: SingleChangeListener<T, Full>, handlesOnData?: boolean) => SingleSyncHandles<T, Full>;
9
- notifyWal: WAL;
5
+ import { type ItemUpdate, type MultiChangeListener, type MultiSyncHandles, type OnErrorHandler, type SingleChangeListener, type SingleSyncHandles } from "./SyncedTable";
6
+ export declare const createSyncSubscriptionManager: (syncConfig: Omit<SyncConfig, "channelName">, store: ReturnType<typeof createSyncDataStore>, stateUtils: ReturnType<typeof createSyncStateUtils>, upsert: (items: ItemUpdate[], from_server?: boolean) => Promise<void>) => {
7
+ sync: <T extends AnyObject = AnyObject>(onChange: MultiChangeListener<T>, handlesOnData?: boolean, onError?: OnErrorHandler) => MultiSyncHandles<T>;
8
+ syncOne: <T extends AnyObject = AnyObject, Full extends boolean = false>(idObj: Partial<T>, onChange: SingleChangeListener<T, Full>, handlesOnData?: boolean, onError?: OnErrorHandler) => SingleSyncHandles<T, Full>;
9
+ readonly notifyWal: WAL;
10
+ reset: (nextSyncConfig: typeof syncConfig) => void;
11
+ notifyError: (error: unknown) => void;
10
12
  notifyCurrentData: () => void;
11
13
  };
12
14
  //# sourceMappingURL=createSyncSubscriptionManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createSyncSubscriptionManager.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/createSyncSubscriptionManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiB,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAGL,KAAK,UAAU,EAEf,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EAIvB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,6BAA6B,GACxC,6BAA6B,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,EAC5D,OAAO,UAAU,CAAC,OAAO,mBAAmB,CAAC,EAC7C,YAAY,UAAU,CAAC,OAAO,oBAAoB,CAAC,EACnD,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,WAAW,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC;WAgKvD,CAAC,SAAS,SAAS,wBACrB,mBAAmB,CAAC,CAAC,CAAC,8BAE/B,gBAAgB,CAAC,CAAC,CAAC;cAsDL,CAAC,SAAS,SAAS,cAAc,IAAI,SAAS,OAAO,iBAC7D,OAAO,CAAC,CAAC,CAAC,YACP,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,8BAEtC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC;;;CAwC9B,CAAC"}
1
+ {"version":3,"file":"createSyncSubscriptionManager.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/createSyncSubscriptionManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAiB,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAGL,KAAK,UAAU,EAEf,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EAIvB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,6BAA6B,GACxC,YAAY,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,EAC3C,OAAO,UAAU,CAAC,OAAO,mBAAmB,CAAC,EAC7C,YAAY,UAAU,CAAC,OAAO,oBAAoB,CAAC,EACnD,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,WAAW,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC;WA8KvD,CAAC,SAAS,SAAS,wBACrB,mBAAmB,CAAC,CAAC,CAAC,qCAEtB,cAAc,KACvB,gBAAgB,CAAC,CAAC,CAAC;cAwDL,CAAC,SAAS,SAAS,cAAc,IAAI,SAAS,OAAO,iBAC7D,OAAO,CAAC,CAAC,CAAC,YACP,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,qCAE7B,cAAc,KACvB,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC;;4BA1JE,OAAO,UAAU;yBAqMzB,OAAO;;CAW/B,CAAC"}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createSyncSubscriptionManager = void 0;
4
4
  const WAL_1 = require("prostgles-types/dist/WAL");
5
5
  const SyncedTable_1 = require("./SyncedTable");
6
- const createSyncSubscriptionManager = ({ id_fields, synced_field }, store, stateUtils, upsert) => {
6
+ const createSyncSubscriptionManager = (syncConfig, store, stateUtils, upsert) => {
7
7
  let multiSubscriptions = [];
8
8
  let singleSubscriptions = [];
9
9
  const unsubscribe = (onChange) => {
@@ -29,7 +29,7 @@ const createSyncSubscriptionManager = ({ id_fields, synced_field }, store, state
29
29
  changes.map(({ idObj, newItem, delta }) => {
30
30
  /* Single subs do not care about the filter */
31
31
  singleSubscriptions
32
- .filter((s) => store.matchesIdObj(s.idObj, idObj))
32
+ .filter((s) => Object.entries(s.idObj).every(([field, value]) => newItem[field] === value))
33
33
  .map(async (s) => {
34
34
  try {
35
35
  await s.notify(newItem, delta);
@@ -63,12 +63,13 @@ const createSyncSubscriptionManager = ({ id_fields, synced_field }, store, state
63
63
  });
64
64
  }
65
65
  };
66
- const notifyWal = new WAL_1.WAL({
67
- id_fields,
68
- synced_field,
66
+ const createNotifyWal = () => new WAL_1.WAL({
67
+ ...syncConfig,
69
68
  batch_size: Infinity,
70
69
  throttle: 5,
71
70
  onSend: async (_, fullItems) => {
71
+ if (state.error)
72
+ return;
72
73
  _notifySubscribers(fullItems.map((d) => ({
73
74
  delta: store.getDelta(d.initial ?? {}, d.current),
74
75
  idObj: store.getIdObj(d.current),
@@ -76,8 +77,17 @@ const createSyncSubscriptionManager = ({ id_fields, synced_field }, store, state
76
77
  })));
77
78
  },
78
79
  });
80
+ let notifyWal = createNotifyWal();
81
+ const reset = (nextSyncConfig) => {
82
+ syncConfig = nextSyncConfig;
83
+ clearTimeout(notifyWal.isSendingTimeout);
84
+ clearTimeout(notifyWal.willDeleteHistory);
85
+ notifyWal = createNotifyWal();
86
+ };
79
87
  const _delete = async (item, from_server = false) => {
80
- const idObj = store.getIdObj(item);
88
+ if (state.error)
89
+ throw state.error;
90
+ const idObj = store.getIdObj(store.getItem(item) ?? item);
81
91
  store.setItem(idObj, true, true);
82
92
  if (!from_server) {
83
93
  await stateUtils.tableHandler.delete?.(idObj);
@@ -85,7 +95,7 @@ const createSyncSubscriptionManager = ({ id_fields, synced_field }, store, state
85
95
  _notifySubscribers();
86
96
  return true;
87
97
  };
88
- const getMultiSyncSubscription = ({ onChange, handlesOnData, }) => {
98
+ const getMultiSyncSubscription = ({ onChange, handlesOnData, onError, }) => {
89
99
  const handles = {
90
100
  $unsync: () => {
91
101
  return unsubscribe(onChange);
@@ -104,15 +114,16 @@ const createSyncSubscriptionManager = ({ id_fields, synced_field }, store, state
104
114
  };
105
115
  };
106
116
  if (Array.isArray(newData)) {
107
- upsert(newData.map((d) => prepareOne(d)));
117
+ return upsert(newData.map((d) => prepareOne(d)));
108
118
  }
109
119
  else {
110
- upsert([prepareOne(newData)]);
120
+ return upsert([prepareOne(newData)]);
111
121
  }
112
122
  },
113
123
  };
114
124
  const sub = {
115
125
  _onChange: onChange,
126
+ onError,
116
127
  handlesOnData,
117
128
  handles,
118
129
  notify: (_allItems, _allDeltas) => {
@@ -131,7 +142,7 @@ const createSyncSubscriptionManager = ({ id_fields, synced_field }, store, state
131
142
  $delete: async () => {
132
143
  return _delete(idObj);
133
144
  },
134
- $cloneMultiSync: (onChange) => sync(onChange, handlesOnData),
145
+ $cloneMultiSync: (onChange, onError) => sync(onChange, handlesOnData, onError),
135
146
  });
136
147
  const idObj = store.getIdObj(item);
137
148
  return getItem(item, idObj);
@@ -142,10 +153,13 @@ const createSyncSubscriptionManager = ({ id_fields, synced_field }, store, state
142
153
  };
143
154
  return { sub, handles };
144
155
  };
145
- const sync = (onChange, handlesOnData = true) => {
156
+ const sync = (onChange, handlesOnData = true, onError) => {
157
+ if (state.error)
158
+ throw state.error;
146
159
  const { sub, handles } = getMultiSyncSubscription.bind(this)({
147
160
  onChange: onChange,
148
161
  handlesOnData,
162
+ onError,
149
163
  });
150
164
  multiSubscriptions.push(sub);
151
165
  setTimeout(() => {
@@ -171,7 +185,7 @@ const createSyncSubscriptionManager = ({ id_fields, synced_field }, store, state
171
185
  }
172
186
  return upsert([{ idObj, delta: (0, SyncedTable_1.quickClone)(newData), opts }]);
173
187
  },
174
- $cloneSync: (onChange) => syncOne(idObj, onChange),
188
+ $cloneSync: (onChange, onError) => syncOne(idObj, onChange, undefined, onError),
175
189
  // TODO: add clone sync hook
176
190
  // $useCloneSync: () => {
177
191
  // const handles = this.syncOne<T, Full>(idObj, item => {
@@ -179,7 +193,7 @@ const createSyncSubscriptionManager = ({ id_fields, synced_field }, store, state
179
193
  // });
180
194
  // return handles.$unsync;
181
195
  // },
182
- $cloneMultiSync: (onChange) => sync(onChange, true),
196
+ $cloneMultiSync: (onChange, onError) => sync(onChange, true, onError),
183
197
  };
184
198
  return handles;
185
199
  };
@@ -189,10 +203,13 @@ const createSyncSubscriptionManager = ({ id_fields, synced_field }, store, state
189
203
  * @param onChange change listener <(item: object, delta: object) => any >
190
204
  * @param handlesOnData If true then $update, $delete and $unsync handles will be added on the data item. True by default;
191
205
  */
192
- const syncOne = (idObj, onChange, handlesOnData = true) => {
206
+ const syncOne = (idObj, onChange, handlesOnData = true, onError) => {
207
+ if (state.error)
208
+ throw state.error;
193
209
  const handles = makeSingleSyncHandles(idObj, onChange);
194
210
  const sub = {
195
211
  _onChange: onChange,
212
+ onError,
196
213
  idObj,
197
214
  handlesOnData,
198
215
  handles,
@@ -221,7 +238,20 @@ const createSyncSubscriptionManager = ({ id_fields, synced_field }, store, state
221
238
  return {
222
239
  sync,
223
240
  syncOne,
224
- notifyWal,
241
+ get notifyWal() {
242
+ return notifyWal;
243
+ },
244
+ reset,
245
+ notifyError: (error) => {
246
+ for (const subscription of [...singleSubscriptions, ...multiSubscriptions]) {
247
+ try {
248
+ subscription.onError?.(error);
249
+ }
250
+ catch (callbackError) {
251
+ console.error("Sync error callback failed:", callbackError);
252
+ }
253
+ }
254
+ },
225
255
  notifyCurrentData: () => _notifySubscribers(),
226
256
  };
227
257
  };
@@ -1,12 +1,12 @@
1
1
  import { type DBSchemaTable } from "prostgles-types";
2
2
  import type { getSubscriptionHandler } from "./getSubscriptionHandler";
3
- import type { getSyncHandlerV2 } from "./getSyncHandlerV2";
3
+ import type { getSyncHandler } from "./getSyncHandler";
4
4
  import { type DBHandlerClient, type InitOptions } from "./prostgles";
5
5
  type Args = {
6
6
  tableSchema: DBSchemaTable[] | undefined;
7
7
  onDebug: InitOptions["onDebug"];
8
8
  socket: InitOptions["socket"];
9
- syncHandlerV2: ReturnType<typeof getSyncHandlerV2>;
9
+ syncHandlerV2: ReturnType<typeof getSyncHandler>;
10
10
  subscriptionHandler: ReturnType<typeof getSubscriptionHandler>;
11
11
  };
12
12
  export declare const getDB: <DBSchema = void>({ tableSchema, onDebug, syncHandlerV2, subscriptionHandler, socket, }: Args) => {
@@ -1 +1 @@
1
- {"version":3,"file":"getDbHandler.d.ts","sourceRoot":"","sources":["../lib/getDbHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAKnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAI3D,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,WAAW,EAEjB,MAAM,aAAa,CAAC;AAWrB,KAAK,IAAI,GAAG;IACV,WAAW,EAAE,aAAa,EAAE,GAAG,SAAS,CAAC;IACzC,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,aAAa,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IACnD,mBAAmB,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;CAChE,CAAC;AAIF,eAAO,MAAM,KAAK,GAAI,QAAQ,GAAG,IAAI,EAAE,uEAMpC,IAAI;QAkMc,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;CACtD,CAAC"}
1
+ {"version":3,"file":"getDbHandler.d.ts","sourceRoot":"","sources":["../lib/getDbHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,aAAa,EAKnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKvD,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,WAAW,EAEjB,MAAM,aAAa,CAAC;AAYrB,KAAK,IAAI,GAAG;IACV,WAAW,EAAE,aAAa,EAAE,GAAG,SAAS,CAAC;IACzC,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,aAAa,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;IACjD,mBAAmB,EAAE,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;CAChE,CAAC;AAIF,eAAO,MAAM,KAAK,GAAI,QAAQ,GAAG,IAAI,EAAE,uEAMpC,IAAI;QA0Lc,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;CACtD,CAAC"}