prostgles-client 4.0.358 → 4.0.359
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 +14 -13
- package/dist/SyncedTable/SyncedTable.d.ts.map +1 -1
- package/dist/SyncedTable/SyncedTable.js +19 -15
- package/dist/SyncedTable/createSync.d.ts +9 -0
- package/dist/SyncedTable/createSync.d.ts.map +1 -0
- package/dist/SyncedTable/createSync.js +190 -0
- package/dist/SyncedTable/createSyncDataStore.d.ts +19 -0
- package/dist/SyncedTable/createSyncDataStore.d.ts.map +1 -0
- package/dist/SyncedTable/createSyncDataStore.js +127 -0
- package/dist/SyncedTable/createSyncStateUtils.d.ts +25 -0
- package/dist/SyncedTable/createSyncStateUtils.d.ts.map +1 -0
- package/dist/SyncedTable/createSyncStateUtils.js +146 -0
- package/dist/SyncedTable/createSyncSubscriptionManager.d.ts +11 -0
- package/dist/SyncedTable/createSyncSubscriptionManager.d.ts.map +1 -0
- package/dist/SyncedTable/createSyncSubscriptionManager.js +230 -0
- package/dist/getDbHandler.d.ts.map +1 -1
- package/dist/getDbHandler.js +10 -23
- package/dist/getSyncHandler.d.ts.map +1 -1
- package/dist/getSyncHandler.js +22 -20
- package/dist/getSyncHandlerV2.d.ts +14 -0
- package/dist/getSyncHandlerV2.d.ts.map +1 -0
- package/dist/getSyncHandlerV2.js +41 -0
- package/dist/index.js +1 -1
- package/dist/index.no-sync.js +1 -1
- package/dist/prostgles.d.ts +8 -8
- package/dist/prostgles.d.ts.map +1 -1
- package/dist/prostgles.js +0 -1
- package/package.json +2 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { AnyObject, EqualityFilter, FieldFilter, NormalizedRow, SyncBatchParams, TableHandler } from "prostgles-types";
|
|
2
|
-
import { WAL } from "prostgles-types";
|
|
1
|
+
import type { AnyObject, EqualityFilter, FieldFilter, NormalizedRow, SyncBatchParams, TableHandler, ValidatedColumnInfo } from "prostgles-types";
|
|
3
2
|
import type { DBHandlerClient, SyncDebugEvent } from "../prostgles";
|
|
3
|
+
import { WAL } from "prostgles-types/dist/WAL";
|
|
4
4
|
type OmittedSyncProps = "onDebug" | "name" | "filter" | "db" | "onError";
|
|
5
5
|
export type SyncOptions = Partial<Omit<SyncedTableOptions, OmittedSyncProps>> & {
|
|
6
6
|
select?: FieldFilter;
|
|
@@ -13,18 +13,18 @@ export type OnErrorHandler = (error: any) => void;
|
|
|
13
13
|
/**
|
|
14
14
|
* Creates a local synchronized table
|
|
15
15
|
*/
|
|
16
|
-
export type OnChange<T extends Record<string, unknown>, Opts extends SyncOptions> = (data: SyncDataItem<T, Opts>[], delta?: Partial<T
|
|
16
|
+
export type OnChange<T extends Record<string, unknown>, Opts extends SyncOptions> = (data: SyncDataItem<T, Opts>[], delta?: Partial<NormalizedRow<T>>[]) => any;
|
|
17
17
|
export type SyncHandler<T> = {
|
|
18
18
|
$unsync: () => void;
|
|
19
19
|
$upsert: (newData: T[]) => void | Promise<void>;
|
|
20
20
|
getItems: () => T[];
|
|
21
21
|
};
|
|
22
22
|
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>>;
|
|
23
|
-
export type
|
|
23
|
+
export type OnChangeOne<T extends Record<string, unknown>, Opts extends SyncOptions> = (data: SyncDataItem<T, Opts>, delta?: Partial<NormalizedRow<T>>) => void | Promise<void>;
|
|
24
24
|
/**
|
|
25
25
|
* Creates a local synchronized record
|
|
26
26
|
*/
|
|
27
|
-
export type SyncOne<T extends AnyObject = AnyObject> = <TD extends T, Opts extends
|
|
27
|
+
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"]>>;
|
|
28
28
|
export type SyncBatchRequest = {
|
|
29
29
|
from_synced?: string | number;
|
|
30
30
|
to_synced?: string | number;
|
|
@@ -73,7 +73,7 @@ export type MultiSyncHandles<T extends AnyObject> = {
|
|
|
73
73
|
};
|
|
74
74
|
export type SubscriptionSingle<T extends AnyObject = AnyObject, Full extends boolean = false> = {
|
|
75
75
|
_onChange: SingleChangeListener<T, Full>;
|
|
76
|
-
notify: (data: T, delta?: DeepPartial<T
|
|
76
|
+
notify: (data: T, delta?: DeepPartial<NormalizedRow<T>>) => void | Promise<void>;
|
|
77
77
|
idObj: Partial<T>;
|
|
78
78
|
handlesOnData?: boolean;
|
|
79
79
|
handles?: SingleSyncHandles<T, Full>;
|
|
@@ -88,7 +88,7 @@ export type SubscriptionMulti<T extends AnyObject = AnyObject> = {
|
|
|
88
88
|
export type MultiChangeListener<T extends AnyObject = AnyObject> = (items: NormalizedRow<T>[], delta: DeepPartial<T>[]) => any;
|
|
89
89
|
export type SingleChangeListener<T extends AnyObject = AnyObject, Full extends boolean | undefined = false> = (item: SyncDataItem<T, {
|
|
90
90
|
handlesOnData: Full;
|
|
91
|
-
}>, delta?: DeepPartial<T
|
|
91
|
+
}>, delta?: DeepPartial<NormalizedRow<T>>) => void | Promise<void>;
|
|
92
92
|
export type SyncedTableOptions = {
|
|
93
93
|
/**
|
|
94
94
|
* Table name
|
|
@@ -97,7 +97,7 @@ export type SyncedTableOptions = {
|
|
|
97
97
|
/**
|
|
98
98
|
* Basic filter
|
|
99
99
|
*/
|
|
100
|
-
filter
|
|
100
|
+
filter: undefined | EqualityFilter<AnyObject>;
|
|
101
101
|
/**
|
|
102
102
|
* Data change listener.
|
|
103
103
|
* Called on first sync and every time the data changes
|
|
@@ -105,9 +105,10 @@ export type SyncedTableOptions = {
|
|
|
105
105
|
onChange?: MultiChangeListener;
|
|
106
106
|
onError?: OnErrorHandler;
|
|
107
107
|
db: DBHandlerClient | Partial<DBHandlerClient>;
|
|
108
|
-
select
|
|
108
|
+
select: FieldFilter | undefined;
|
|
109
|
+
columns: ValidatedColumnInfo[];
|
|
109
110
|
onReady: () => void;
|
|
110
|
-
onDebug?: (event: SyncDebugEvent
|
|
111
|
+
onDebug?: (event: SyncDebugEvent) => Promise<void> | void;
|
|
111
112
|
};
|
|
112
113
|
export type DbTableSync = {
|
|
113
114
|
unsync: () => void;
|
|
@@ -116,7 +117,7 @@ export type DbTableSync = {
|
|
|
116
117
|
export declare class SyncedTable {
|
|
117
118
|
db: DBHandlerClient | Partial<DBHandlerClient>;
|
|
118
119
|
name: string;
|
|
119
|
-
select?:
|
|
120
|
+
select?: FieldFilter;
|
|
120
121
|
filter?: EqualityFilter<AnyObject>;
|
|
121
122
|
id_fields: string[];
|
|
122
123
|
synced_field: string;
|
|
@@ -141,8 +142,8 @@ export declare class SyncedTable {
|
|
|
141
142
|
itemsMap: Map<string, AnyObject>;
|
|
142
143
|
isSynced: boolean;
|
|
143
144
|
onError: SyncedTableOptions["onError"];
|
|
144
|
-
onDebug?: (evt: Omit<SyncDebugEvent, "type" | "tableName" | "channelName" | "
|
|
145
|
-
constructor(
|
|
145
|
+
onDebug?: (evt: Omit<SyncDebugEvent, "type" | "tableName" | "channelName" | "options">) => Promise<void> | void;
|
|
146
|
+
constructor(options: SyncedTableOptions);
|
|
146
147
|
static create(opts: Omit<SyncedTableOptions, "onReady">): Promise<SyncedTable>;
|
|
147
148
|
/**
|
|
148
149
|
* Returns a sync handler to all records within the SyncedTable instance
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SyncedTable.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/SyncedTable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAGT,cAAc,EACd,WAAW,EACX,aAAa,EACb,eAAe,EACf,YAAY,
|
|
1
|
+
{"version":3,"file":"SyncedTable.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/SyncedTable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAGT,cAAc,EACd,WAAW,EACX,aAAa,EACb,eAAe,EACf,YAAY,EACZ,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AASzB,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEpE,OAAO,EAAE,GAAG,EAAgB,MAAM,0BAA0B,CAAC;AAI7D,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,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,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,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,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,EAAE,MAAM,IAAI,CAAC;IACpB,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,qBAAa,WAAW;IACtB,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,SAAO;IACf,UAAU,SAAM;IAEhB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAM;IAEpD,GAAG,CAAC,EAAE,GAAG,CAAC;IAEV,SAAS,CAAC,EAAE,GAAG,CAAC;IAEhB,mBAAmB,EAAE,iBAAiB,EAAE,CAAM;IAC9C,oBAAoB,EAAE,kBAAkB,EAAE,CAAM;IAEhD;;OAEG;IACH,IAAI,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAEhD;IACD,IAAI,kBAAkB,IAAI,iBAAiB,EAAE,CAE5C;IAED,IAAI,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,EAAE,EAElD;IACD,IAAI,mBAAmB,IAAI,kBAAkB,EAAE,CAE9C;IAED,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,yBAAgC;IACxC,QAAQ,UAAS;IACjB,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,CACR,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC,KACxE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;gBAEd,OAAO,EAAE,kBAAkB;IA2JvC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAqB9E;;;;OAIG;IACH,IAAI,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAClC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAChC,aAAa,UAAO,GACnB,gBAAgB,CAAC,CAAC,CAAC;IActB,qBAAqB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAAE,IAAI,SAAS,OAAO,GAAG,KAAK,EACjF,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EACjB,QAAQ,EAAE,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,GAC/D,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC;IA+B7B;;;;;OAKG;IACH,OAAO,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS,EAAE,IAAI,SAAS,OAAO,GAAG,KAAK,EACnE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EACjB,QAAQ,EAAE,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,EACvC,aAAa,UAAO,GACnB,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC;IAkC7B;;;OAGG;IACH,kBAAkB,GAAI,UAAS,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,EAAO,UAkDpF;IAEF,WAAW,GAAI,UAAU,oBAAoB,GAAG,mBAAmB,YAIjE;IAEF,QAAQ,CAAC,CAAC,EAAE,SAAS;IAMrB,QAAQ,CAAC,CAAC,EAAE,SAAS;IAOrB,aAAa,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS;IAQtC,MAAM,aAEJ;IAEF,OAAO,aAKL;IAEF,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS;IAQzC,YAAY,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,SAAS;IA+B/D;;;;OAIG;IACH,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,SAAS;IAkB/C,SAAS;IAIT,IAAI,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,aAAa,GAAG,QAAQ,CAAC,GAAG,SAAS,CAOtF;IAED,MAAM,GAAU,MAAM,SAAS,EAAE,qBAAmB,sBAQlD;IAEF;;OAEG;IACH,aAAa,GAAI,MAAM,SAAS,UAS9B;IAEF;;;;;OAKG;IACH,MAAM,GAAU,OAAO,UAAU,EAAE,EAAE,qBAAmB,KAAG,OAAO,CAAC,IAAI,CAAC,CA6HtE;IAGF,OAAO,CAAC,CAAC,GAAG,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS;IAMxD;;;;;;OAMG;IACH,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,UAAQ,EAAE,UAAU,UAAQ;IAYhE;;OAEG;IACH,QAAQ,GAAI,QAAQ,SAAS,EAAE,KAAG,IAAI,CASpC;IAEF;;OAEG;IACH,QAAQ,GAAI,CAAC,SAAS,SAAS,GAAG,SAAS,OAAK,CAAC,EAAE,CAsBjD;IAEF;;OAEG;IACH,QAAQ,GACN,4CAA2C,eAAiD;;QAe5F;CACH;AAED,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"}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.quickClone = exports.mergeDeep = exports.SyncedTable = void 0;
|
|
4
4
|
const prostgles_types_1 = require("prostgles-types");
|
|
5
5
|
const getMultiSyncSubscription_1 = require("./getMultiSyncSubscription");
|
|
6
|
+
const WAL_1 = require("prostgles-types/dist/WAL");
|
|
6
7
|
const hasWnd = typeof window !== "undefined";
|
|
7
8
|
class SyncedTable {
|
|
8
9
|
/**
|
|
@@ -20,7 +21,8 @@ class SyncedTable {
|
|
|
20
21
|
get singleSubscriptions() {
|
|
21
22
|
return this._singleSubscriptions;
|
|
22
23
|
}
|
|
23
|
-
constructor(
|
|
24
|
+
constructor(options) {
|
|
25
|
+
var _a;
|
|
24
26
|
this.throttle = 100;
|
|
25
27
|
this.batch_size = 50;
|
|
26
28
|
this.columns = [];
|
|
@@ -274,6 +276,7 @@ class SyncedTable {
|
|
|
274
276
|
}
|
|
275
277
|
return res;
|
|
276
278
|
};
|
|
279
|
+
const { name, filter = {}, onReady, onDebug, db, select = "*", onError } = options;
|
|
277
280
|
this.name = name;
|
|
278
281
|
this.filter = filter;
|
|
279
282
|
this.select = select;
|
|
@@ -283,20 +286,23 @@ class SyncedTable {
|
|
|
283
286
|
type: "sync",
|
|
284
287
|
tableName: name,
|
|
285
288
|
channelName: (0, prostgles_types_1.getSyncChannelName)({ filter, select, tableName: name }),
|
|
286
|
-
|
|
287
|
-
}
|
|
289
|
+
options,
|
|
290
|
+
});
|
|
288
291
|
this.onDebug({ command: "create", data: { name, filter, select } });
|
|
289
292
|
}
|
|
290
293
|
const tableHandler = db[name];
|
|
291
|
-
if (!tableHandler)
|
|
294
|
+
if (!tableHandler) {
|
|
292
295
|
throw `${name} table not found in db`;
|
|
296
|
+
}
|
|
293
297
|
this.db = db;
|
|
294
298
|
const { _sync, _syncInfo } = tableHandler;
|
|
295
|
-
if (!_sync || !_syncInfo)
|
|
299
|
+
if (!_sync || !_syncInfo) {
|
|
296
300
|
throw `${name} table does not support sync`;
|
|
301
|
+
}
|
|
297
302
|
const { id_fields, synced_field, throttle = 100, batch_size = 50 } = _syncInfo;
|
|
298
|
-
if (!id_fields.length || !synced_field)
|
|
303
|
+
if (!id_fields.length || !synced_field) {
|
|
299
304
|
throw "id_fields/synced_field missing";
|
|
305
|
+
}
|
|
300
306
|
this.id_fields = id_fields;
|
|
301
307
|
this.synced_field = synced_field;
|
|
302
308
|
this.batch_size = batch_size;
|
|
@@ -373,7 +379,7 @@ class SyncedTable {
|
|
|
373
379
|
/**
|
|
374
380
|
* Some syncs can be read only. Any changes are local
|
|
375
381
|
*/
|
|
376
|
-
this.wal = new
|
|
382
|
+
this.wal = new WAL_1.WAL({
|
|
377
383
|
...opts,
|
|
378
384
|
batch_size,
|
|
379
385
|
onSendStart: () => {
|
|
@@ -384,18 +390,18 @@ class SyncedTable {
|
|
|
384
390
|
const _data = walData.map((d) => d.current);
|
|
385
391
|
if (!_data.length)
|
|
386
392
|
return [];
|
|
387
|
-
return
|
|
393
|
+
return s.syncData(data);
|
|
388
394
|
}, //, deletedData);,
|
|
389
395
|
onSendEnd: () => {
|
|
390
396
|
if (hasWnd)
|
|
391
397
|
window.onbeforeunload = null;
|
|
392
398
|
},
|
|
393
399
|
});
|
|
394
|
-
this.notifyWal = new
|
|
400
|
+
this.notifyWal = new WAL_1.WAL({
|
|
395
401
|
...opts,
|
|
396
402
|
batch_size: Infinity,
|
|
397
403
|
throttle: 5,
|
|
398
|
-
onSend: async (
|
|
404
|
+
onSend: async (_, fullItems) => {
|
|
399
405
|
this._notifySubscribers(fullItems.map((d) => {
|
|
400
406
|
var _a;
|
|
401
407
|
return ({
|
|
@@ -408,11 +414,9 @@ class SyncedTable {
|
|
|
408
414
|
});
|
|
409
415
|
onReady();
|
|
410
416
|
});
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
});
|
|
415
|
-
}
|
|
417
|
+
(_a = tableHandler.getColumns) === null || _a === void 0 ? void 0 : _a.call(tableHandler).then((cols) => {
|
|
418
|
+
this.columns = cols;
|
|
419
|
+
});
|
|
416
420
|
}
|
|
417
421
|
static create(opts) {
|
|
418
422
|
return new Promise((resolve, reject) => {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { WAL } from "prostgles-types/dist/WAL";
|
|
2
|
+
import { type SyncedTableOptions } from "./SyncedTable";
|
|
3
|
+
import type { Socket } from "socket.io-client";
|
|
4
|
+
export declare const createSync: (socket: Socket, options: Omit<SyncedTableOptions, "onReady">) => Promise<{
|
|
5
|
+
sync: <T extends import("prostgles-types").AnyObject = import("prostgles-types").AnyObject>(onChange: import("./SyncedTable").MultiChangeListener<T>, handlesOnData?: boolean) => import("./SyncedTable").MultiSyncHandles<T>;
|
|
6
|
+
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>;
|
|
7
|
+
notifyWal: WAL;
|
|
8
|
+
}>;
|
|
9
|
+
//# sourceMappingURL=createSync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSync.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/createSync.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,GAAG,EAAgB,MAAM,0BAA0B,CAAC;AAI7D,OAAO,EAIL,KAAK,kBAAkB,EACxB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,eAAO,MAAM,UAAU,GAAU,QAAQ,MAAM,EAAE,SAAS,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC;;;;EA0N5F,CAAC"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSync = void 0;
|
|
4
|
+
const prostgles_types_1 = require("prostgles-types");
|
|
5
|
+
const WAL_1 = require("prostgles-types/dist/WAL");
|
|
6
|
+
const createSyncDataStore_1 = require("./createSyncDataStore");
|
|
7
|
+
const createSyncStateUtils_1 = require("./createSyncStateUtils");
|
|
8
|
+
const createSyncSubscriptionManager_1 = require("./createSyncSubscriptionManager");
|
|
9
|
+
const SyncedTable_1 = require("./SyncedTable");
|
|
10
|
+
const createSync = async (socket, options) => {
|
|
11
|
+
var _a;
|
|
12
|
+
const stateUtils = (0, createSyncStateUtils_1.createSyncStateUtils)(socket, options);
|
|
13
|
+
const { state, onDebug, id_fields, synced_field, throttle, batch_size, columns, _syncInfo, _sync, filter, } = stateUtils;
|
|
14
|
+
const store = (0, createSyncDataStore_1.createSyncDataStore)({ ..._syncInfo, columns, filter });
|
|
15
|
+
const onError = (_a = options.onError) !== null && _a !== void 0 ? _a : function (err) {
|
|
16
|
+
console.error("Sync internal error: ", err);
|
|
17
|
+
};
|
|
18
|
+
const onSyncRequest = (syncBatchParams) => {
|
|
19
|
+
let clientSyncInfo = { c_lr: undefined, c_fr: undefined, c_count: 0 };
|
|
20
|
+
const batch = store.getBatch(syncBatchParams);
|
|
21
|
+
if (batch.length) {
|
|
22
|
+
clientSyncInfo = {
|
|
23
|
+
c_fr: store.getRowSyncObj(batch[0]),
|
|
24
|
+
c_lr: store.getRowSyncObj(batch[batch.length - 1]),
|
|
25
|
+
c_count: batch.length,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
onDebug({ command: "onUpdates", data: { syncBatchParams, batch, clientSyncInfo } });
|
|
29
|
+
return clientSyncInfo;
|
|
30
|
+
};
|
|
31
|
+
const onPullRequest = async (syncBatchParams) => {
|
|
32
|
+
// if(this.getDeleted().length){
|
|
33
|
+
// await this.syncDeleted();
|
|
34
|
+
// }
|
|
35
|
+
const data = store.getBatch(syncBatchParams);
|
|
36
|
+
await onDebug({ command: "onPullRequest", data: { syncBatchParams, data } });
|
|
37
|
+
return { data };
|
|
38
|
+
};
|
|
39
|
+
const onUpdates = async (onUpdatesParams) => {
|
|
40
|
+
await onDebug({ command: "onUpdates", data: { onUpdatesParams } });
|
|
41
|
+
if ("err" in onUpdatesParams && onUpdatesParams.err) {
|
|
42
|
+
onError(onUpdatesParams.err);
|
|
43
|
+
}
|
|
44
|
+
else if ("isSynced" in onUpdatesParams && onUpdatesParams.isSynced && !state.isSynced) {
|
|
45
|
+
state.isSynced = onUpdatesParams.isSynced;
|
|
46
|
+
const items = store.getItems().map((d) => ({ ...d }));
|
|
47
|
+
store.setItems([]);
|
|
48
|
+
const updateItems = items.map((d) => ({
|
|
49
|
+
idObj: store.getIdObj(d),
|
|
50
|
+
delta: { ...d },
|
|
51
|
+
}));
|
|
52
|
+
await upsert(updateItems, true);
|
|
53
|
+
}
|
|
54
|
+
else if ("data" in onUpdatesParams) {
|
|
55
|
+
/* Delta left empty so we can prepare it here */
|
|
56
|
+
const updateItems = onUpdatesParams.data.map((d) => {
|
|
57
|
+
return {
|
|
58
|
+
idObj: store.getIdObj(d),
|
|
59
|
+
delta: d,
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
await upsert(updateItems, true);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.error("Unexpected onUpdates");
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
};
|
|
69
|
+
const opts = {
|
|
70
|
+
id_fields,
|
|
71
|
+
synced_field,
|
|
72
|
+
throttle,
|
|
73
|
+
};
|
|
74
|
+
const dbSync = await _sync({ onSyncRequest, onPullRequest, onUpdates });
|
|
75
|
+
/**
|
|
76
|
+
* Some syncs can be read only. Any changes are local
|
|
77
|
+
*/
|
|
78
|
+
const wal = new WAL_1.WAL({
|
|
79
|
+
...opts,
|
|
80
|
+
batch_size,
|
|
81
|
+
onSendStart: () => {
|
|
82
|
+
if (isWindowDefined) {
|
|
83
|
+
window.onbeforeunload = function confirmExit() {
|
|
84
|
+
return "Data may be lost. Are you sure?";
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
onSend: async (data, walData) => {
|
|
89
|
+
const _data = walData.map((d) => d.current);
|
|
90
|
+
if (!_data.length)
|
|
91
|
+
return [];
|
|
92
|
+
return dbSync.syncData(data);
|
|
93
|
+
},
|
|
94
|
+
onSendEnd: () => {
|
|
95
|
+
if (isWindowDefined)
|
|
96
|
+
window.onbeforeunload = null;
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
/**
|
|
100
|
+
* Upserts data locally -> notify subs -> sends to server if required
|
|
101
|
+
* synced_field is populated if data is not from server
|
|
102
|
+
* @param items <{ idObj: object, delta: object }[]> Data items that changed
|
|
103
|
+
* @param from_server : <boolean> If false then updates will be sent to server
|
|
104
|
+
*/
|
|
105
|
+
const upsert = async (items, from_server = false) => {
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
107
|
+
if ((!items || !items.length) && !from_server)
|
|
108
|
+
throw "No data provided for upsert";
|
|
109
|
+
/* If data has been deleted then wait for it to sync with server before continuing */
|
|
110
|
+
// if(from_server && this.getDeleted().length){
|
|
111
|
+
// await this.syncDeleted();
|
|
112
|
+
// }
|
|
113
|
+
const results = [];
|
|
114
|
+
let status;
|
|
115
|
+
const walItems = [];
|
|
116
|
+
await Promise.all(items.map(async (item, i) => {
|
|
117
|
+
var _a;
|
|
118
|
+
// let d = { ...item.idObj, ...item.delta };
|
|
119
|
+
const idObj = { ...item.idObj };
|
|
120
|
+
let delta = { ...item.delta };
|
|
121
|
+
/* Convert undefined to null because:
|
|
122
|
+
1) JSON.stringify drops these keys
|
|
123
|
+
2) Postgres does not have undefined
|
|
124
|
+
*/
|
|
125
|
+
Object.keys(delta).map((k) => {
|
|
126
|
+
if (delta[k] === undefined)
|
|
127
|
+
delta[k] = null;
|
|
128
|
+
});
|
|
129
|
+
if (!from_server) {
|
|
130
|
+
store.checkItemCols({ ...item.delta, ...item.idObj });
|
|
131
|
+
}
|
|
132
|
+
const oldItem = store.getItem(idObj);
|
|
133
|
+
/* Calc delta if missing or if from server */
|
|
134
|
+
if ((from_server || (0, prostgles_types_1.isEmpty)(delta)) && !(0, prostgles_types_1.isEmpty)(oldItem)) {
|
|
135
|
+
delta = store.getDelta(oldItem || {}, delta);
|
|
136
|
+
}
|
|
137
|
+
/* Add synced if local update */
|
|
138
|
+
/** Will need to check client clock shift */
|
|
139
|
+
if (!from_server) {
|
|
140
|
+
delta[synced_field] = Date.now();
|
|
141
|
+
}
|
|
142
|
+
let newItem = { ...oldItem, ...delta, ...idObj };
|
|
143
|
+
if (oldItem && !from_server) {
|
|
144
|
+
/**
|
|
145
|
+
* Merge deep
|
|
146
|
+
*/
|
|
147
|
+
if ((_a = item.opts) === null || _a === void 0 ? void 0 : _a.deepMerge) {
|
|
148
|
+
newItem = (0, SyncedTable_1.mergeDeep)({ ...oldItem, ...idObj }, { ...delta });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/* Update existing -> Expecting delta */
|
|
152
|
+
if (oldItem) {
|
|
153
|
+
status = oldItem[synced_field] < newItem[synced_field] ? "updated" : "unchanged";
|
|
154
|
+
/* Insert new item */
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
status = "inserted";
|
|
158
|
+
}
|
|
159
|
+
store.setItem(newItem);
|
|
160
|
+
// if(!status) throw "changeInfo status missing"
|
|
161
|
+
const changeInfo = { idObj, delta, oldItem, newItem, status, from_server };
|
|
162
|
+
/* IF Local updates then Keep any existing oldItem to revert to the earliest working item */
|
|
163
|
+
if (!from_server) {
|
|
164
|
+
walItems.push({
|
|
165
|
+
initial: oldItem,
|
|
166
|
+
current: { ...newItem },
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
if (!(0, prostgles_types_1.isEmpty)(changeInfo.delta)) {
|
|
170
|
+
results.push(changeInfo);
|
|
171
|
+
}
|
|
172
|
+
/* TODO: Deletes from server */
|
|
173
|
+
// if(allow_deletes){
|
|
174
|
+
// items = this.getItems();
|
|
175
|
+
// }
|
|
176
|
+
return true;
|
|
177
|
+
})).catch((err) => {
|
|
178
|
+
console.error("SyncedTable failed upsert: ", err);
|
|
179
|
+
});
|
|
180
|
+
subscriptionManager.notifyWal.addData(results.map((d) => ({ initial: d.oldItem, current: d.newItem })));
|
|
181
|
+
/* Push to server */
|
|
182
|
+
if (!from_server && walItems.length) {
|
|
183
|
+
wal.addData(walItems);
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
const subscriptionManager = (0, createSyncSubscriptionManager_1.createSyncSubscriptionManager)({ id_fields, synced_field }, store, stateUtils, upsert);
|
|
187
|
+
return subscriptionManager;
|
|
188
|
+
};
|
|
189
|
+
exports.createSync = createSync;
|
|
190
|
+
const isWindowDefined = typeof window !== "undefined";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SyncInfo } from "lib/prostgles";
|
|
2
|
+
import { type AnyObject, type SyncBatchParams } from "prostgles-types";
|
|
3
|
+
import { type SyncedTableOptions } from "./SyncedTable";
|
|
4
|
+
export declare const createSyncDataStore: ({ id_fields, synced_field, filter, columns, }: Pick<SyncInfo, "id_fields" | "synced_field"> & Pick<SyncedTableOptions, "filter" | "columns">) => {
|
|
5
|
+
getItems: <T extends AnyObject = AnyObject>() => T[];
|
|
6
|
+
getBatch: ({ from_synced, to_synced, offset, limit }?: SyncBatchParams) => {
|
|
7
|
+
[x: string]: any;
|
|
8
|
+
}[];
|
|
9
|
+
getIdObj: (d: AnyObject) => AnyObject;
|
|
10
|
+
getRowSyncObj: (d: AnyObject) => AnyObject;
|
|
11
|
+
getDelta: (o: AnyObject, n: AnyObject) => AnyObject;
|
|
12
|
+
setItems: (_items: AnyObject[]) => void;
|
|
13
|
+
checkItemCols: (item: AnyObject) => void;
|
|
14
|
+
setItem: (_item: AnyObject, isFullData?: boolean, deleteItem?: boolean) => void;
|
|
15
|
+
getItem: <T = AnyObject>(idObj: Partial<T>) => T | undefined;
|
|
16
|
+
matchesIdObj: (a: AnyObject | undefined, b: AnyObject | undefined) => boolean;
|
|
17
|
+
matchesFilter: (item: AnyObject | undefined) => boolean;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=createSyncDataStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSyncDataStore.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/createSyncDataStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAML,KAAK,SAAS,EACd,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAc,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEpE,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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSyncDataStore = void 0;
|
|
4
|
+
const prostgles_types_1 = require("prostgles-types");
|
|
5
|
+
const SyncedTable_1 = require("./SyncedTable");
|
|
6
|
+
const createSyncDataStore = ({ id_fields, synced_field, filter, columns, }) => {
|
|
7
|
+
const itemsMap = new Map();
|
|
8
|
+
const idFieldsSorted = id_fields.sort();
|
|
9
|
+
const syncFieldSorted = [synced_field, ...id_fields].sort();
|
|
10
|
+
const getIdStr = (d) => {
|
|
11
|
+
return idFieldsSorted.map((key) => `${d[key] || ""}`).join(".");
|
|
12
|
+
};
|
|
13
|
+
const getIdObj = (d) => {
|
|
14
|
+
const res = {};
|
|
15
|
+
idFieldsSorted.map((key) => {
|
|
16
|
+
res[key] = d[key];
|
|
17
|
+
});
|
|
18
|
+
return res;
|
|
19
|
+
};
|
|
20
|
+
const getRowSyncObj = (d) => {
|
|
21
|
+
const res = {};
|
|
22
|
+
syncFieldSorted.map((key) => {
|
|
23
|
+
res[key] = d[key];
|
|
24
|
+
});
|
|
25
|
+
return res;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Returns the current data ordered by synced_field ASC and matching the main filter;
|
|
29
|
+
*/
|
|
30
|
+
const getItems = () => {
|
|
31
|
+
let items = [];
|
|
32
|
+
items = Array.from(itemsMap.values()).map((d) => ({ ...d }));
|
|
33
|
+
const syncFields = [synced_field, ...id_fields.sort()];
|
|
34
|
+
items = items
|
|
35
|
+
.filter((d) => {
|
|
36
|
+
return !filter || !(0, prostgles_types_1.getKeys)(filter).find((key) => d[key] !== filter[key]);
|
|
37
|
+
})
|
|
38
|
+
.sort((a, b) => syncFields
|
|
39
|
+
.map((key) => (a[key] < b[key] ? -1
|
|
40
|
+
: a[key] > b[key] ? 1
|
|
41
|
+
: 0))
|
|
42
|
+
.find((v) => v));
|
|
43
|
+
return (0, SyncedTable_1.quickClone)(items);
|
|
44
|
+
};
|
|
45
|
+
const getBatch = ({ from_synced, to_synced, offset, limit } = { offset: 0, limit: undefined }) => {
|
|
46
|
+
const items = getItems();
|
|
47
|
+
let res = items
|
|
48
|
+
.map((c) => ({ ...c }))
|
|
49
|
+
.filter((c) => (!Number.isFinite(from_synced) || +c[synced_field] >= +from_synced) &&
|
|
50
|
+
(!Number.isFinite(to_synced) || +c[synced_field] <= +to_synced));
|
|
51
|
+
if (offset || limit) {
|
|
52
|
+
res = res.splice(offset !== null && offset !== void 0 ? offset : 0, limit || res.length);
|
|
53
|
+
}
|
|
54
|
+
return res;
|
|
55
|
+
};
|
|
56
|
+
const setItem = (_item, isFullData = false, deleteItem = false) => {
|
|
57
|
+
var _a;
|
|
58
|
+
const item = (0, SyncedTable_1.quickClone)(_item);
|
|
59
|
+
const id = getIdStr(item);
|
|
60
|
+
if (deleteItem) {
|
|
61
|
+
itemsMap.delete(id);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const existing = (_a = itemsMap.get(id)) !== null && _a !== void 0 ? _a : {};
|
|
65
|
+
itemsMap.set(id, isFullData ? { ...item } : { ...existing, ...item });
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const setItems = (_items) => {
|
|
69
|
+
const items = (0, SyncedTable_1.quickClone)(_items);
|
|
70
|
+
itemsMap.clear();
|
|
71
|
+
items.forEach((item) => {
|
|
72
|
+
const id = getIdStr(item);
|
|
73
|
+
itemsMap.set(id, { ...item });
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
const getItem = (idObj) => {
|
|
77
|
+
const d = itemsMap.get(getIdStr(idObj));
|
|
78
|
+
return (0, SyncedTable_1.quickClone)(d);
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Ensures that all object keys match valid column names
|
|
82
|
+
*/
|
|
83
|
+
const checkItemCols = (item) => {
|
|
84
|
+
if (columns.length) {
|
|
85
|
+
const badCols = Object.keys({ ...item }).filter((k) => !columns.find((c) => c.name === k));
|
|
86
|
+
if (badCols.length) {
|
|
87
|
+
throw `Unexpected columns in sync item update: ` + badCols.join(", ");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
const getDelta = (o, n) => {
|
|
92
|
+
if ((0, prostgles_types_1.isEmpty)(o))
|
|
93
|
+
return { ...n };
|
|
94
|
+
return Object.fromEntries(Object.entries({ ...n })
|
|
95
|
+
.filter(([k]) => !id_fields.includes(k))
|
|
96
|
+
.map(([k, v]) => {
|
|
97
|
+
if (!(0, prostgles_types_1.isEqual)(v, o[k])) {
|
|
98
|
+
const vClone = (0, prostgles_types_1.isObject)(v) ? { ...v }
|
|
99
|
+
: Array.isArray(v) ? v.slice(0)
|
|
100
|
+
: v;
|
|
101
|
+
return [k, vClone];
|
|
102
|
+
}
|
|
103
|
+
})
|
|
104
|
+
.filter(prostgles_types_1.isDefined));
|
|
105
|
+
};
|
|
106
|
+
const matchesFilter = (item) => {
|
|
107
|
+
return Boolean(item &&
|
|
108
|
+
(!filter || (0, prostgles_types_1.isEmpty)(filter) || !Object.keys(filter).find((k) => filter[k] !== item[k])));
|
|
109
|
+
};
|
|
110
|
+
const matchesIdObj = (a, b) => {
|
|
111
|
+
return Boolean(a && b && !id_fields.sort().find((k) => a[k] !== b[k]));
|
|
112
|
+
};
|
|
113
|
+
return {
|
|
114
|
+
getItems,
|
|
115
|
+
getBatch,
|
|
116
|
+
getIdObj,
|
|
117
|
+
getRowSyncObj,
|
|
118
|
+
getDelta,
|
|
119
|
+
setItems,
|
|
120
|
+
checkItemCols,
|
|
121
|
+
setItem,
|
|
122
|
+
getItem,
|
|
123
|
+
matchesIdObj,
|
|
124
|
+
matchesFilter,
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
exports.createSyncDataStore = createSyncDataStore;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type SyncDebugEvent, type SyncInfo } from "lib/prostgles";
|
|
2
|
+
import { type ClientSyncHandles } from "prostgles-types";
|
|
3
|
+
import type { Socket } from "socket.io-client";
|
|
4
|
+
import type { SyncedTableOptions } from "./SyncedTable";
|
|
5
|
+
export declare const createSyncStateUtils: (socket: Socket, options: Omit<SyncedTableOptions, "onReady">) => {
|
|
6
|
+
state: {
|
|
7
|
+
isSynced: boolean;
|
|
8
|
+
};
|
|
9
|
+
onDebug: (evt: Omit<SyncDebugEvent, "type" | "tableName" | "channelName" | "options">) => void | Promise<void> | undefined;
|
|
10
|
+
id_fields: string[];
|
|
11
|
+
synced_field: string;
|
|
12
|
+
throttle: number;
|
|
13
|
+
batch_size: number;
|
|
14
|
+
columns: import("prostgles-types").ValidatedColumnInfo[];
|
|
15
|
+
_syncInfo: import("prostgles-types").SyncTableInfo;
|
|
16
|
+
_sync: (handles: ClientSyncHandles) => Promise<{
|
|
17
|
+
sync_info: SyncInfo;
|
|
18
|
+
unsync: () => Promise<unknown>;
|
|
19
|
+
syncData: (data?: import("prostgles-types").AnyObject[], deleted?: import("prostgles-types").AnyObject[], cb?: (err?: any) => void) => void;
|
|
20
|
+
}>;
|
|
21
|
+
filter: import("prostgles-types").EqualityFilter<import("prostgles-types").AnyObject>;
|
|
22
|
+
select: import("prostgles-types").FieldFilter;
|
|
23
|
+
tableHandler: Partial<import("prostgles-types").TableHandler & import("lib/prostgles").TableHandlerClientMethods<import("prostgles-types").AnyObject, void>>;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=createSyncStateUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSyncStateUtils.d.ts","sourceRoot":"","sources":["../../lib/SyncedTable/createSyncStateUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAGL,KAAK,iBAAiB,EAEvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAe,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAErE,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,MAAM,EACd,SAAS,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC;;;;mBAKtB,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,CAAC;;;;;;;qBAyB9D,iBAAiB;;;2HAkIi6B,CAAC;;;;;CADl9B,CAAC"}
|