prostgles-client 4.0.166 → 4.0.167
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/index.js +1 -1
- package/dist/index.no-sync.js +1 -1
- package/dist/prostgles.d.ts +4 -1
- package/dist/prostgles.d.ts.map +1 -1
- package/dist/prostgles.js +9 -176
- package/dist/subscriptionHandler.d.ts +1 -1
- package/dist/subscriptionHandler.d.ts.map +1 -1
- package/dist/subscriptionHandler.js +4 -0
- package/dist/syncHandler.d.ts +9 -0
- package/dist/syncHandler.d.ts.map +1 -0
- package/dist/syncHandler.js +175 -0
- package/lib/prostgles.ts +18 -204
- package/lib/subscriptionHandler.ts +5 -1
- package/lib/syncHandler.ts +199 -0
- package/package.json +1 -1
- package/tests/package-lock.json +1 -1
package/dist/prostgles.d.ts
CHANGED
|
@@ -98,7 +98,10 @@ type DebugEvent = {
|
|
|
98
98
|
type: "method";
|
|
99
99
|
command: string;
|
|
100
100
|
data: AnyObject;
|
|
101
|
-
} | SyncDebugEvent
|
|
101
|
+
} | SyncDebugEvent | {
|
|
102
|
+
type: "schemaChanged";
|
|
103
|
+
data: AnyObject;
|
|
104
|
+
};
|
|
102
105
|
export type InitOptions<DBSchema = void> = {
|
|
103
106
|
socket: any;
|
|
104
107
|
/**
|
package/dist/prostgles.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prostgles.d.ts","sourceRoot":"","sources":["../lib/prostgles.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,SAAS,EAET,iBAAiB,EACjB,QAAQ,EACR,aAAa,EACb,WAAW,
|
|
1
|
+
{"version":3,"file":"prostgles.d.ts","sourceRoot":"","sources":["../lib/prostgles.ts"],"names":[],"mappings":"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"}
|
package/dist/prostgles.js
CHANGED
|
@@ -22,10 +22,10 @@ exports.prostgles = exports.asName = exports.debug = exports.hasWnd = void 0;
|
|
|
22
22
|
const prostgles_types_1 = require("prostgles-types");
|
|
23
23
|
Object.defineProperty(exports, "asName", { enumerable: true, get: function () { return prostgles_types_1.asName; } });
|
|
24
24
|
const Auth_1 = require("./Auth");
|
|
25
|
-
const FunctionQueuer_1 = require("./FunctionQueuer");
|
|
26
25
|
const react_hooks_1 = require("./react-hooks");
|
|
27
26
|
const SQL_1 = require("./SQL");
|
|
28
27
|
const subscriptionHandler_1 = require("./subscriptionHandler");
|
|
28
|
+
const syncHandler_1 = require("./syncHandler");
|
|
29
29
|
const DEBUG_KEY = "DEBUG_SYNCEDTABLE";
|
|
30
30
|
exports.hasWnd = typeof window !== "undefined";
|
|
31
31
|
const debug = function (...args) {
|
|
@@ -50,168 +50,11 @@ function prostgles(initOpts, syncedTable) {
|
|
|
50
50
|
socket.on(prostgles_types_1.CHANNELS.SCHEMA_CHANGED, cb);
|
|
51
51
|
}
|
|
52
52
|
const preffix = prostgles_types_1.CHANNELS._preffix;
|
|
53
|
-
let syncedTables = {};
|
|
54
53
|
//@ts-ignore
|
|
55
54
|
const subscriptionHandler = (0, subscriptionHandler_1.getSubscriptionHandler)(initOpts);
|
|
56
|
-
|
|
55
|
+
const syncHandler = (0, syncHandler_1.getSyncHandler)(initOpts);
|
|
57
56
|
let state;
|
|
58
57
|
const sql = new SQL_1.SQL();
|
|
59
|
-
const destroySyncs = async () => {
|
|
60
|
-
(0, exports.debug)("destroySyncs", { syncedTables });
|
|
61
|
-
// await subscriptionHandler.destroy();
|
|
62
|
-
syncs = {};
|
|
63
|
-
Object.values(syncedTables).map((s) => {
|
|
64
|
-
if (s && s.destroy)
|
|
65
|
-
s.destroy();
|
|
66
|
-
});
|
|
67
|
-
syncedTables = {};
|
|
68
|
-
};
|
|
69
|
-
function _unsync(channelName, triggers) {
|
|
70
|
-
(0, exports.debug)("_unsync", { channelName, triggers });
|
|
71
|
-
return new Promise((resolve, reject) => {
|
|
72
|
-
if (syncs[channelName]) {
|
|
73
|
-
syncs[channelName].triggers = syncs[channelName].triggers.filter(tr => (tr.onPullRequest !== triggers.onPullRequest &&
|
|
74
|
-
tr.onSyncRequest !== triggers.onSyncRequest &&
|
|
75
|
-
tr.onUpdates !== triggers.onUpdates));
|
|
76
|
-
if (!syncs[channelName].triggers.length) {
|
|
77
|
-
socket.emit(channelName + "unsync", {}, (err, res) => {
|
|
78
|
-
if (err)
|
|
79
|
-
reject(err);
|
|
80
|
-
else
|
|
81
|
-
resolve(res);
|
|
82
|
-
});
|
|
83
|
-
socket.removeListener(channelName, syncs[channelName].onCall);
|
|
84
|
-
delete syncs[channelName];
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
function addServerSync({ tableName, command, param1, param2 }, onSyncRequest) {
|
|
90
|
-
return new Promise((resolve, reject) => {
|
|
91
|
-
socket.emit(preffix, { tableName, command, param1, param2 }, (err, res) => {
|
|
92
|
-
if (err) {
|
|
93
|
-
console.error(err);
|
|
94
|
-
reject(err);
|
|
95
|
-
}
|
|
96
|
-
else if (res) {
|
|
97
|
-
const { id_fields, synced_field, channelName } = res;
|
|
98
|
-
socket.emit(channelName, { onSyncRequest: onSyncRequest({}) }, (response) => {
|
|
99
|
-
console.log(response);
|
|
100
|
-
});
|
|
101
|
-
resolve({ id_fields, synced_field, channelName });
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
// /**
|
|
107
|
-
// * Obtaines subscribe channel from server
|
|
108
|
-
// */
|
|
109
|
-
// function addServerSub({ tableName, command, param1, param2 }: CoreParams): Promise<SubscriptionChannels> {
|
|
110
|
-
// return new Promise((resolve, reject) => {
|
|
111
|
-
// socket.emit(preffix, { tableName, command, param1, param2 }, (err?: any, res?: SubscriptionChannels) => {
|
|
112
|
-
// if (err) {
|
|
113
|
-
// console.error(err);
|
|
114
|
-
// reject(err);
|
|
115
|
-
// } else if (res) {
|
|
116
|
-
// resolve(res);
|
|
117
|
-
// }
|
|
118
|
-
// });
|
|
119
|
-
// });
|
|
120
|
-
// }
|
|
121
|
-
const addSyncQueuer = new FunctionQueuer_1.FunctionQueuer(_addSync, ([{ tableName }]) => tableName);
|
|
122
|
-
async function addSync(params, triggers) {
|
|
123
|
-
return addSyncQueuer.run([params, triggers]);
|
|
124
|
-
}
|
|
125
|
-
async function _addSync({ tableName, command, param1, param2 }, triggers) {
|
|
126
|
-
const { onSyncRequest } = triggers;
|
|
127
|
-
function makeHandler(channelName) {
|
|
128
|
-
const unsync = function () {
|
|
129
|
-
_unsync(channelName, triggers);
|
|
130
|
-
};
|
|
131
|
-
const syncData = function (data, deleted, cb) {
|
|
132
|
-
socket.emit(channelName, {
|
|
133
|
-
onSyncRequest: {
|
|
134
|
-
...onSyncRequest({}),
|
|
135
|
-
...({ data }),
|
|
136
|
-
...({ deleted })
|
|
137
|
-
},
|
|
138
|
-
}, !cb ? null : (response) => {
|
|
139
|
-
cb(response);
|
|
140
|
-
});
|
|
141
|
-
};
|
|
142
|
-
return Object.freeze({ unsync, syncData });
|
|
143
|
-
}
|
|
144
|
-
const existingChannel = Object.keys(syncs).find(ch => {
|
|
145
|
-
const s = syncs[ch];
|
|
146
|
-
return (s &&
|
|
147
|
-
s.tableName === tableName &&
|
|
148
|
-
s.command === command &&
|
|
149
|
-
(0, react_hooks_1.isEqual)(s.param1, param1) &&
|
|
150
|
-
(0, react_hooks_1.isEqual)(s.param2, param2));
|
|
151
|
-
});
|
|
152
|
-
if (existingChannel) {
|
|
153
|
-
syncs[existingChannel].triggers.push(triggers);
|
|
154
|
-
return makeHandler(existingChannel);
|
|
155
|
-
}
|
|
156
|
-
else {
|
|
157
|
-
const sync_info = await addServerSync({ tableName, command, param1, param2 }, onSyncRequest);
|
|
158
|
-
const { channelName } = sync_info;
|
|
159
|
-
const onCall = function (data, cb) {
|
|
160
|
-
/*
|
|
161
|
-
Client will:
|
|
162
|
-
1. Send last_synced on(onSyncRequest)
|
|
163
|
-
2. Send data >= server_synced on(onPullRequest)
|
|
164
|
-
3. Send data on CRUD emit(data.data)
|
|
165
|
-
4. Upsert data.data on(data.data)
|
|
166
|
-
*/
|
|
167
|
-
if (!data)
|
|
168
|
-
return;
|
|
169
|
-
if (!syncs[channelName])
|
|
170
|
-
return;
|
|
171
|
-
syncs[channelName].triggers.map(({ onUpdates, onSyncRequest, onPullRequest }) => {
|
|
172
|
-
if (data.data) {
|
|
173
|
-
Promise.resolve(onUpdates(data))
|
|
174
|
-
.then(() => {
|
|
175
|
-
cb({ ok: true });
|
|
176
|
-
})
|
|
177
|
-
.catch(err => {
|
|
178
|
-
cb({ err });
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
else if (data.onSyncRequest) {
|
|
182
|
-
Promise.resolve(onSyncRequest(data.onSyncRequest))
|
|
183
|
-
.then(res => cb({ onSyncRequest: res }))
|
|
184
|
-
.catch(err => {
|
|
185
|
-
cb({ err });
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
else if (data.onPullRequest) {
|
|
189
|
-
Promise.resolve(onPullRequest(data.onPullRequest))
|
|
190
|
-
.then(arr => {
|
|
191
|
-
cb({ data: arr });
|
|
192
|
-
})
|
|
193
|
-
.catch(err => {
|
|
194
|
-
cb({ err });
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
console.log("unexpected response");
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
};
|
|
202
|
-
syncs[channelName] = {
|
|
203
|
-
tableName,
|
|
204
|
-
command,
|
|
205
|
-
param1,
|
|
206
|
-
param2,
|
|
207
|
-
triggers: [triggers],
|
|
208
|
-
syncInfo: sync_info,
|
|
209
|
-
onCall
|
|
210
|
-
};
|
|
211
|
-
socket.on(channelName, onCall);
|
|
212
|
-
return makeHandler(channelName);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
58
|
return new Promise((resolve, reject) => {
|
|
216
59
|
socket.removeAllListeners(prostgles_types_1.CHANNELS.CONNECTION);
|
|
217
60
|
socket.on(prostgles_types_1.CHANNELS.CONNECTION, error => {
|
|
@@ -234,11 +77,12 @@ function prostgles(initOpts, syncedTable) {
|
|
|
234
77
|
}
|
|
235
78
|
/* Schema = published schema */
|
|
236
79
|
socket.on(prostgles_types_1.CHANNELS.SCHEMA, async ({ joinTables = [], ...clientSchema }) => {
|
|
80
|
+
await (onDebug === null || onDebug === void 0 ? void 0 : onDebug({ type: "schemaChanged", data: clientSchema }));
|
|
237
81
|
const { schema, methods, tableSchema, auth: authConfig, rawSQL, err } = clientSchema;
|
|
238
82
|
/** Only destroy existing syncs if schema changed */
|
|
239
83
|
const schemaDidNotChange = (schemaAge === null || schemaAge === void 0 ? void 0 : schemaAge.clientSchema) && (0, react_hooks_1.isEqual)(schemaAge.clientSchema, clientSchema);
|
|
240
84
|
if (!schemaDidNotChange) {
|
|
241
|
-
await destroySyncs();
|
|
85
|
+
await syncHandler.destroySyncs();
|
|
242
86
|
}
|
|
243
87
|
if ((state === "connected" || state === "reconnected") && onReconnect) {
|
|
244
88
|
onReconnect(socket, err);
|
|
@@ -313,8 +157,8 @@ function prostgles(initOpts, syncedTable) {
|
|
|
313
157
|
};
|
|
314
158
|
const upsertSyncTable = async (basicFilter = {}, options = {}, onError) => {
|
|
315
159
|
const syncName = `${tableName}.${JSON.stringify(basicFilter)}.${JSON.stringify((0, prostgles_types_1.omitKeys)(options, ["handlesOnData"]))}`;
|
|
316
|
-
if (!syncedTables[syncName]) {
|
|
317
|
-
syncedTables[syncName] = await syncedTable.create({
|
|
160
|
+
if (!syncHandler.syncedTables[syncName]) {
|
|
161
|
+
syncHandler.syncedTables[syncName] = await syncedTable.create({
|
|
318
162
|
...options,
|
|
319
163
|
onDebug: onDebug,
|
|
320
164
|
name: tableName,
|
|
@@ -323,7 +167,7 @@ function prostgles(initOpts, syncedTable) {
|
|
|
323
167
|
onError
|
|
324
168
|
});
|
|
325
169
|
}
|
|
326
|
-
return syncedTables[syncName];
|
|
170
|
+
return syncHandler.syncedTables[syncName];
|
|
327
171
|
};
|
|
328
172
|
const sync = async (basicFilter, options = { handlesOnData: true, select: "*" }, onChange, onError) => {
|
|
329
173
|
await (onDebug === null || onDebug === void 0 ? void 0 : onDebug({ type: "table", command: "sync", tableName, data: { basicFilter, options } }));
|
|
@@ -346,7 +190,7 @@ function prostgles(initOpts, syncedTable) {
|
|
|
346
190
|
}
|
|
347
191
|
dboTable._sync = async function (param1, param2, syncHandles) {
|
|
348
192
|
await (onDebug === null || onDebug === void 0 ? void 0 : onDebug({ type: "table", command: "_sync", tableName, data: { param1, param2, syncHandles } }));
|
|
349
|
-
return addSync({ tableName, command, param1, param2 }, syncHandles);
|
|
193
|
+
return syncHandler.addSync({ tableName, command, param1, param2 }, syncHandles);
|
|
350
194
|
};
|
|
351
195
|
}
|
|
352
196
|
else if (sub_commands.includes(command)) {
|
|
@@ -406,18 +250,7 @@ function prostgles(initOpts, syncedTable) {
|
|
|
406
250
|
});
|
|
407
251
|
});
|
|
408
252
|
await subscriptionHandler.reAttachAll();
|
|
409
|
-
|
|
410
|
-
const firstTrigger = s.triggers[0];
|
|
411
|
-
if (firstTrigger) {
|
|
412
|
-
try {
|
|
413
|
-
await addServerSync(s, firstTrigger.onSyncRequest);
|
|
414
|
-
socket.on(ch, s.onCall);
|
|
415
|
-
}
|
|
416
|
-
catch (err) {
|
|
417
|
-
console.error("There was an issue reconnecting olf subscriptions", err);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
});
|
|
253
|
+
await syncHandler.reAttachAll();
|
|
421
254
|
joinTables.flat().map(table => {
|
|
422
255
|
var _a, _b, _c, _d;
|
|
423
256
|
(_a = dbo.innerJoin) !== null && _a !== void 0 ? _a : (dbo.innerJoin = {});
|
|
@@ -11,7 +11,7 @@ type Subscription = CoreParams & {
|
|
|
11
11
|
type Subscriptions = {
|
|
12
12
|
[key: string]: Subscription;
|
|
13
13
|
};
|
|
14
|
-
export declare const getSubscriptionHandler:
|
|
14
|
+
export declare const getSubscriptionHandler: (initOpts: Pick<InitOptions, "socket" | "onDebug">) => {
|
|
15
15
|
addSub: (dbo: any, params: CoreParams, onChange: AnyFunction, _onError?: AnyFunction) => Promise<SubscriptionHandler>;
|
|
16
16
|
subscriptions: Subscriptions;
|
|
17
17
|
addServerSub: ({ tableName, command, param1, param2 }: CoreParams) => Promise<SubscriptionChannels>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscriptionHandler.d.ts","sourceRoot":"","sources":["../lib/subscriptionHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+C,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAqB,MAAM,iBAAiB,CAAC;AACtJ,OAAO,EAAkB,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAGlG,KAAK,YAAY,GAAG,UAAU,GAAG;IAC/B,QAAQ,EAAE,GAAG,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,aAAa,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAC5B,CAAC;AAIF,eAAO,MAAM,sBAAsB;
|
|
1
|
+
{"version":3,"file":"subscriptionHandler.d.ts","sourceRoot":"","sources":["../lib/subscriptionHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+C,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAqB,MAAM,iBAAiB,CAAC;AACtJ,OAAO,EAAkB,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAGlG,KAAK,YAAY,GAAG,UAAU,GAAG;IAC/B,QAAQ,EAAE,GAAG,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,aAAa,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE,CAAC;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B,CAAC;AAEF,KAAK,aAAa,GAAG;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAC5B,CAAC;AAIF,eAAO,MAAM,sBAAsB,aAAc,KAAK,WAAW,EAAE,QAAQ,GAAG,SAAS,CAAC;kBAiE3D,GAAG,UAAU,UAAU,YAAY,WAAW,aAAa,WAAW,KAAG,QAAQ,mBAAmB,CAAC;;2DAlBlE,UAAU,KAAG,QAAQ,oBAAoB,CAAC;gCA7BrE,MAAM,gBAAgB,MAAM,WAAW,WAAW,WAAW,WAAW,CAAC,SAAS,CAAC,KAAG,QAAQ,IAAI,CAAC;;CA6KvI,CAAA"}
|
|
@@ -160,6 +160,10 @@ const getSubscriptionHandler = (initOpts) => {
|
|
|
160
160
|
socket.emit(channelNameReady, { now: Date.now() });
|
|
161
161
|
return makeHandler(channelName, channelNameUnsubscribe);
|
|
162
162
|
}
|
|
163
|
+
/**
|
|
164
|
+
* Reconnect all subscriptions
|
|
165
|
+
* Used when connection is lost and re-established or schema changes
|
|
166
|
+
*/
|
|
163
167
|
const reAttachAll = async () => {
|
|
164
168
|
for await (const s of Object.values(subscriptions)) {
|
|
165
169
|
try {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ClientSyncHandles } from "prostgles-types";
|
|
2
|
+
import type { CoreParams, InitOptions } from "./prostgles";
|
|
3
|
+
export declare const getSyncHandler: ({ socket, onDebug }: Pick<InitOptions, "socket" | "onDebug">) => {
|
|
4
|
+
destroySyncs: () => Promise<void>;
|
|
5
|
+
syncedTables: Record<string, any>;
|
|
6
|
+
addSync: (params: CoreParams, triggers: ClientSyncHandles) => Promise<any>;
|
|
7
|
+
reAttachAll: () => Promise<void>;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=syncHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syncHandler.d.ts","sourceRoot":"","sources":["../lib/syncHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,KAAK,EAAe,UAAU,EAAE,WAAW,EAAY,MAAM,aAAa,CAAC;AAgBlF,eAAO,MAAM,cAAc,wBAAyB,KAAK,WAAW,EAAE,QAAQ,GAAG,SAAS,CAAC;;;sBAsD1D,UAAU,YAAY,iBAAiB,KAAG,QAAQ,GAAG,CAAC;;CA+HtF,CAAA"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getSyncHandler = void 0;
|
|
4
|
+
const prostgles_types_1 = require("prostgles-types");
|
|
5
|
+
const prostgles_1 = require("./prostgles");
|
|
6
|
+
const FunctionQueuer_1 = require("./FunctionQueuer");
|
|
7
|
+
const preffix = prostgles_types_1.CHANNELS._preffix;
|
|
8
|
+
const getSyncHandler = ({ socket, onDebug }) => {
|
|
9
|
+
let syncedTables = {};
|
|
10
|
+
let syncs = {};
|
|
11
|
+
const destroySyncs = async () => {
|
|
12
|
+
(0, prostgles_1.debug)("destroySyncs", { syncedTables });
|
|
13
|
+
syncs = {};
|
|
14
|
+
Object.values(syncedTables).map((s) => {
|
|
15
|
+
if (s && s.destroy)
|
|
16
|
+
s.destroy();
|
|
17
|
+
});
|
|
18
|
+
syncedTables = {};
|
|
19
|
+
};
|
|
20
|
+
function _unsync(channelName, triggers) {
|
|
21
|
+
(0, prostgles_1.debug)("_unsync", { channelName, triggers });
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
if (syncs[channelName]) {
|
|
24
|
+
syncs[channelName].triggers = syncs[channelName].triggers.filter(tr => (tr.onPullRequest !== triggers.onPullRequest &&
|
|
25
|
+
tr.onSyncRequest !== triggers.onSyncRequest &&
|
|
26
|
+
tr.onUpdates !== triggers.onUpdates));
|
|
27
|
+
if (!syncs[channelName].triggers.length) {
|
|
28
|
+
socket.emit(channelName + "unsync", {}, (err, res) => {
|
|
29
|
+
if (err)
|
|
30
|
+
reject(err);
|
|
31
|
+
else
|
|
32
|
+
resolve(res);
|
|
33
|
+
});
|
|
34
|
+
socket.removeListener(channelName, syncs[channelName].onCall);
|
|
35
|
+
delete syncs[channelName];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function addServerSync({ tableName, command, param1, param2 }, onSyncRequest) {
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
socket.emit(preffix, { tableName, command, param1, param2 }, (err, res) => {
|
|
43
|
+
if (err) {
|
|
44
|
+
console.error(err);
|
|
45
|
+
reject(err);
|
|
46
|
+
}
|
|
47
|
+
else if (res) {
|
|
48
|
+
const { id_fields, synced_field, channelName } = res;
|
|
49
|
+
socket.emit(channelName, { onSyncRequest: onSyncRequest({}) }, (response) => {
|
|
50
|
+
console.log(response);
|
|
51
|
+
});
|
|
52
|
+
resolve({ id_fields, synced_field, channelName });
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const addSyncQueuer = new FunctionQueuer_1.FunctionQueuer(_addSync, ([{ tableName }]) => tableName);
|
|
58
|
+
async function addSync(params, triggers) {
|
|
59
|
+
return addSyncQueuer.run([params, triggers]);
|
|
60
|
+
}
|
|
61
|
+
async function _addSync({ tableName, command, param1, param2 }, triggers) {
|
|
62
|
+
const { onSyncRequest } = triggers;
|
|
63
|
+
function makeHandler(channelName) {
|
|
64
|
+
const unsync = function () {
|
|
65
|
+
_unsync(channelName, triggers);
|
|
66
|
+
};
|
|
67
|
+
const syncData = function (data, deleted, cb) {
|
|
68
|
+
socket.emit(channelName, {
|
|
69
|
+
onSyncRequest: {
|
|
70
|
+
...onSyncRequest({}),
|
|
71
|
+
...({ data }),
|
|
72
|
+
...({ deleted })
|
|
73
|
+
},
|
|
74
|
+
}, !cb ? null : (response) => {
|
|
75
|
+
cb(response);
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
return Object.freeze({ unsync, syncData });
|
|
79
|
+
}
|
|
80
|
+
const existingChannel = Object.keys(syncs).find(ch => {
|
|
81
|
+
const s = syncs[ch];
|
|
82
|
+
return (s &&
|
|
83
|
+
s.tableName === tableName &&
|
|
84
|
+
s.command === command &&
|
|
85
|
+
(0, prostgles_1.isEqual)(s.param1, param1) &&
|
|
86
|
+
(0, prostgles_1.isEqual)(s.param2, param2));
|
|
87
|
+
});
|
|
88
|
+
if (existingChannel) {
|
|
89
|
+
syncs[existingChannel].triggers.push(triggers);
|
|
90
|
+
return makeHandler(existingChannel);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
const sync_info = await addServerSync({ tableName, command, param1, param2 }, onSyncRequest);
|
|
94
|
+
const { channelName } = sync_info;
|
|
95
|
+
const onCall = function (data, cb) {
|
|
96
|
+
/*
|
|
97
|
+
Client will:
|
|
98
|
+
1. Send last_synced on(onSyncRequest)
|
|
99
|
+
2. Send data >= server_synced on(onPullRequest)
|
|
100
|
+
3. Send data on CRUD emit(data.data)
|
|
101
|
+
4. Upsert data.data on(data.data)
|
|
102
|
+
*/
|
|
103
|
+
if (!data)
|
|
104
|
+
return;
|
|
105
|
+
if (!syncs[channelName])
|
|
106
|
+
return;
|
|
107
|
+
syncs[channelName].triggers.map(({ onUpdates, onSyncRequest, onPullRequest }) => {
|
|
108
|
+
if (data.data) {
|
|
109
|
+
Promise.resolve(onUpdates(data))
|
|
110
|
+
.then(() => {
|
|
111
|
+
cb({ ok: true });
|
|
112
|
+
})
|
|
113
|
+
.catch(err => {
|
|
114
|
+
cb({ err });
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
else if (data.onSyncRequest) {
|
|
118
|
+
Promise.resolve(onSyncRequest(data.onSyncRequest))
|
|
119
|
+
.then(res => cb({ onSyncRequest: res }))
|
|
120
|
+
.catch(err => {
|
|
121
|
+
cb({ err });
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else if (data.onPullRequest) {
|
|
125
|
+
Promise.resolve(onPullRequest(data.onPullRequest))
|
|
126
|
+
.then(arr => {
|
|
127
|
+
cb({ data: arr });
|
|
128
|
+
})
|
|
129
|
+
.catch(err => {
|
|
130
|
+
cb({ err });
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
console.log("unexpected response");
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
};
|
|
138
|
+
syncs[channelName] = {
|
|
139
|
+
tableName,
|
|
140
|
+
command,
|
|
141
|
+
param1,
|
|
142
|
+
param2,
|
|
143
|
+
triggers: [triggers],
|
|
144
|
+
syncInfo: sync_info,
|
|
145
|
+
onCall
|
|
146
|
+
};
|
|
147
|
+
socket.on(channelName, onCall);
|
|
148
|
+
return makeHandler(channelName);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const reAttachAll = async () => {
|
|
152
|
+
let reAttached = 0;
|
|
153
|
+
Object.entries(syncs).forEach(async ([ch, s]) => {
|
|
154
|
+
const firstTrigger = s.triggers[0];
|
|
155
|
+
if (firstTrigger) {
|
|
156
|
+
try {
|
|
157
|
+
await addServerSync(s, firstTrigger.onSyncRequest);
|
|
158
|
+
socket.on(ch, s.onCall);
|
|
159
|
+
reAttached++;
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
console.error("There was an issue reconnecting olf subscriptions", err);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
console.log("reAttached", reAttached, " syncs", syncs);
|
|
167
|
+
};
|
|
168
|
+
return {
|
|
169
|
+
destroySyncs,
|
|
170
|
+
syncedTables,
|
|
171
|
+
addSync,
|
|
172
|
+
reAttachAll,
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
exports.getSyncHandler = getSyncHandler;
|