prostgles-client 4.0.421 → 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.
- package/dist/SyncedTable/SyncedTable.d.ts +4 -2
- package/dist/SyncedTable/SyncedTable.d.ts.map +1 -1
- package/dist/SyncedTable/createSync.d.ts +3 -6
- package/dist/SyncedTable/createSync.d.ts.map +1 -1
- package/dist/SyncedTable/createSync.js +83 -37
- package/dist/SyncedTable/createSyncDataStore.d.ts.map +1 -1
- package/dist/SyncedTable/createSyncDataStore.js +4 -2
- package/dist/SyncedTable/createSyncStateUtils.d.ts +8 -2
- package/dist/SyncedTable/createSyncStateUtils.d.ts.map +1 -1
- package/dist/SyncedTable/createSyncStateUtils.js +11 -12
- package/dist/SyncedTable/createSyncSubscriptionManager.d.ts +7 -5
- package/dist/SyncedTable/createSyncSubscriptionManager.d.ts.map +1 -1
- package/dist/SyncedTable/createSyncSubscriptionManager.js +45 -15
- package/dist/getDbHandler.d.ts +2 -2
- package/dist/getDbHandler.d.ts.map +1 -1
- package/dist/getDbHandler.js +4 -4
- package/dist/{getSyncHandlerV2.d.ts → getSyncHandler.d.ts} +4 -4
- package/dist/getSyncHandler.d.ts.map +1 -0
- package/dist/{getSyncHandlerV2.js → getSyncHandler.js} +18 -10
- package/dist/index.umd.js +1 -1
- package/dist/prostgles.js +3 -9
- package/package.json +2 -2
- package/dist/getSyncHandlerV2.d.ts.map +0 -1
|
@@ -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
|
|
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
|
|
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":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,WAAW,EACX,aAAa,EACb,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAIpE,KAAK,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,GAAG,SAAS,CAAC;AAEzE,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC,GAAG;IAC9E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AACF,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC,GAAG;IACjF,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,SAAS,WAAW,IAAI,CAClF,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAC7B,KAAK,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,KAChC,GAAG,CAAC;AAET,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,IAAI,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,EAAE,SAAS,CAAC,EAAE,IAAI,SAAS,WAAW,EACzF,WAAW,EAAE,cAAc,CAAC,EAAE,CAAC,EAC/B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"SyncedTable.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/SyncedTable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,WAAW,EACX,aAAa,EACb,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAIpE,KAAK,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,GAAG,SAAS,CAAC;AAEzE,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC,GAAG;IAC9E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AACF,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC,GAAG;IACjF,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,SAAS,WAAW,IAAI,CAClF,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAC7B,KAAK,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,KAChC,GAAG,CAAC;AAET,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,IAAI,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,EAAE,SAAS,CAAC,EAAE,IAAI,SAAS,WAAW,EACzF,WAAW,EAAE,cAAc,CAAC,EAAE,CAAC,EAC/B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,EAC5B,OAAO,CAAC,EAAE,cAAc,KACrB,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AAE9B,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,SAAS,WAAW,IAAI,CACrF,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,EAC3B,KAAK,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAC9B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B;;GAEG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI,CAAC,EAAE,SAAS,CAAC,EAAE,IAAI,SAAS,cAAc,EAC/F,WAAW,EAAE,OAAO,CAAC,EAAE,CAAC,EACxB,OAAO,EAAE,IAAI,EACb,QAAQ,EAAE,WAAW,CAAC,EAAE,EAAE,IAAI,CAAC,EAC/B,OAAO,CAAC,EAAE,cAAc,KACrB,OAAO,CAAC,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;AAE3D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB,CAAC;AACF,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG;IACrC,OAAO,EAAE,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IACzD,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,SAAS,EAAE,IAAI,SAAS,OAAO,GAAG,SAAS,IAAI,CAC7E,QAAQ,EAAE,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,EACvC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,KAC3B,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAEhC,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,SAAS,IAAI,CAChD,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,KAC3B,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAEzB,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AACF,KAAK,WAAW,CAAC,CAAC,IAChB,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GACtB,CAAC,SAAS,MAAM,GAChB;KACG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACnC,GACD,CAAC,CAAC;AAEN;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAC3B,CAAC,SAAS,SAAS,GAAG,SAAS,EAC/B,IAAI,SAAS,OAAO,GAAG,SAAS,GAAG,KAAK,IACtC;IACF,IAAI,EAAE,MAAM,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACzC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC1E,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,CAAC,IAAI,SAAS,WAAW,EAChC,OAAO,EAAE,IAAI,SAAS;QAAE,SAAS,EAAE,IAAI,CAAA;KAAE,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACvE,IAAI,CAAC,EAAE,IAAI,KACR,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,UAAU,EAAE,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/B,eAAe,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;CACpC,CAAC;AAEF,KAAK,qBAAqB,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,WAAW,CAAC,QAAQ,CAAC,IAC7E,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAClC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,GACvD,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAC9C,CAAC,CAAC;AAEN,MAAM,MAAM,YAAY,CACtB,CAAC,SAAS,SAAS,EACnB,IAAI,SAAS,IAAI,CAAC,WAAW,EAAE,eAAe,GAAG,QAAQ,CAAC,IACxD,qBAAqB,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,GACzD,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,IAAI,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,GAC9F,OAAO,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzE,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,SAAS,IAAI;IAClD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;IAC9C,QAAQ,EAAE,MAAM,SAAS,EAAE,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAAE,IAAI,SAAS,OAAO,GAAG,KAAK,IAAI;IAC9F,SAAS,EAAE,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACzC,OAAO,EAAE,cAAc,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjF,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;CACtC,CAAC;AACF,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI;IAC/D,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAClC,OAAO,EAAE,cAAc,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;IACpD,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,IAAI,CACjE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EACzB,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,KACpB,GAAG,CAAC;AACT,MAAM,MAAM,oBAAoB,CAC9B,CAAC,SAAS,SAAS,GAAG,SAAS,EAC/B,IAAI,SAAS,OAAO,GAAG,SAAS,GAAG,KAAK,IACtC,CACF,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE;IAAE,aAAa,EAAE,IAAI,CAAA;CAAE,CAAC,EAC9C,KAAK,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAClC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,MAAM,EAAE,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAE9C;;;OAGG;IACH,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE/C,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;CACzF,CAAC;AAEF,eAAO,MAAM,SAAS,GACpB,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC5C,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS;;CAkB7C,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,KAAK,CAAC,KAAG,CAetC,CAAC"}
|
|
@@ -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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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":"
|
|
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
|
|
13
|
-
const store = (0, createSyncDataStore_1.createSyncDataStore)({ ..._syncInfo,
|
|
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
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
|
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)(
|
|
199
|
-
const
|
|
203
|
+
const subscriptionManager = (0, createSyncSubscriptionManager_1.createSyncSubscriptionManager)(stateUtils._syncInfo, store, stateUtils, upsert);
|
|
204
|
+
const attach = async (schema) => {
|
|
200
205
|
state.isSynced = false;
|
|
201
|
-
dbSync
|
|
202
|
-
|
|
203
|
-
|
|
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 {
|
|
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;
|
|
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
|
|
77
|
-
|
|
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:
|
|
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: () =>
|
|
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
|
|
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
|
|
22
|
-
if (!
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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: (
|
|
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,
|
|
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 = (
|
|
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) =>
|
|
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
|
|
67
|
-
|
|
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
|
-
|
|
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
|
};
|
package/dist/getDbHandler.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { type DBSchemaTable } from "prostgles-types";
|
|
2
2
|
import type { getSubscriptionHandler } from "./getSubscriptionHandler";
|
|
3
|
-
import type {
|
|
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
|
|
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,
|
|
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"}
|
package/dist/getDbHandler.js
CHANGED
|
@@ -34,7 +34,7 @@ const getDB = ({ tableSchema, onDebug, syncHandlerV2, subscriptionHandler, socke
|
|
|
34
34
|
throw `Table ${tableName} does not have syncConfig in publishInfo.select`;
|
|
35
35
|
}
|
|
36
36
|
dboTable._syncInfo = { ...syncConfig };
|
|
37
|
-
const syncOne = (async (basicFilter, options = { handlesOnData: true }, onChange) => {
|
|
37
|
+
const syncOne = (async (basicFilter, options = { handlesOnData: true }, onChange, onError) => {
|
|
38
38
|
await onDebug?.({
|
|
39
39
|
type: "table",
|
|
40
40
|
command: "syncOne",
|
|
@@ -42,9 +42,9 @@ const getDB = ({ tableSchema, onDebug, syncHandlerV2, subscriptionHandler, socke
|
|
|
42
42
|
data: { basicFilter, options },
|
|
43
43
|
});
|
|
44
44
|
checkSubscriptionArgs(basicFilter, options, onChange);
|
|
45
|
-
return (await syncHandlerV2.getTableSyncFunctions({ db, tableName, columns })).addSyncOne(basicFilter, options, onChange);
|
|
45
|
+
return (await syncHandlerV2.getTableSyncFunctions({ db, tableName, columns })).addSyncOne(basicFilter, options, onChange, onError);
|
|
46
46
|
});
|
|
47
|
-
const sync = (async (basicFilter, options = { handlesOnData: true }, onChange) => {
|
|
47
|
+
const sync = (async (basicFilter, options = { handlesOnData: true }, onChange, onError) => {
|
|
48
48
|
await onDebug?.({
|
|
49
49
|
type: "table",
|
|
50
50
|
command: "sync",
|
|
@@ -52,7 +52,7 @@ const getDB = ({ tableSchema, onDebug, syncHandlerV2, subscriptionHandler, socke
|
|
|
52
52
|
data: { basicFilter, options },
|
|
53
53
|
});
|
|
54
54
|
checkSubscriptionArgs(basicFilter, options, onChange);
|
|
55
|
-
return (await syncHandlerV2.getTableSyncFunctions({ db, tableName, columns })).addSync(basicFilter, options, onChange);
|
|
55
|
+
return (await syncHandlerV2.getTableSyncFunctions({ db, tableName, columns })).addSync(basicFilter, options, onChange, onError);
|
|
56
56
|
});
|
|
57
57
|
dboTable.sync = sync;
|
|
58
58
|
dboTable.syncOne = syncOne;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { type AnyObject, type ValidatedColumnInfo } from "prostgles-types";
|
|
1
|
+
import { type AnyObject, type DBSchemaTable, type ValidatedColumnInfo } from "prostgles-types";
|
|
2
2
|
import type { DBHandlerClient, InitOptions } from "./prostgles";
|
|
3
3
|
import type { Sync, SyncOne } from "./SyncedTable/SyncedTable";
|
|
4
|
-
export declare const
|
|
4
|
+
export declare const getSyncHandler: ({ socket, onDebug }: Pick<InitOptions, "socket" | "onDebug">) => {
|
|
5
5
|
getTableSyncFunctions: ({ db, tableName, columns, }: {
|
|
6
6
|
db: Partial<DBHandlerClient>;
|
|
7
7
|
tableName: string;
|
|
@@ -10,6 +10,6 @@ export declare const getSyncHandlerV2: ({ socket, onDebug }: Pick<InitOptions, "
|
|
|
10
10
|
addSync: Sync<AnyObject>;
|
|
11
11
|
addSyncOne: SyncOne<AnyObject>;
|
|
12
12
|
}>;
|
|
13
|
-
reAttachAll: () => Promise<void>;
|
|
13
|
+
reAttachAll: (db: Partial<DBHandlerClient>, tables?: DBSchemaTable[]) => Promise<void>;
|
|
14
14
|
};
|
|
15
|
-
//# sourceMappingURL=
|
|
15
|
+
//# sourceMappingURL=getSyncHandler.d.ts.map
|