prostgles-server 3.0.153 → 3.0.155
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/PubSubManager/PubSubManager.d.ts +21 -26
- package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/PubSubManager.js +43 -393
- package/dist/PubSubManager/PubSubManager.js.map +1 -1
- package/dist/PubSubManager/addSub.d.ts +7 -0
- package/dist/PubSubManager/addSub.d.ts.map +1 -0
- package/dist/PubSubManager/addSub.js +153 -0
- package/dist/PubSubManager/addSub.js.map +1 -0
- package/dist/PubSubManager/addSync.d.ts +8 -0
- package/dist/PubSubManager/addSync.d.ts.map +1 -0
- package/dist/PubSubManager/addSync.js +110 -0
- package/dist/PubSubManager/addSync.js.map +1 -0
- package/dist/PubSubManager/notifListener.d.ts +5 -0
- package/dist/PubSubManager/notifListener.d.ts.map +1 -0
- package/dist/PubSubManager/notifListener.js +97 -0
- package/dist/PubSubManager/notifListener.js.map +1 -0
- package/lib/DboBuilder/TableHandler.d.ts +1 -5
- package/lib/DboBuilder/TableHandler.d.ts.map +1 -1
- package/lib/PubSubManager/PubSubManager.d.ts +20 -29
- package/lib/PubSubManager/PubSubManager.d.ts.map +1 -1
- package/lib/PubSubManager/PubSubManager.js +44 -397
- package/lib/PubSubManager/PubSubManager.ts +82 -508
- package/lib/PubSubManager/addSub.d.ts +7 -0
- package/lib/PubSubManager/addSub.d.ts.map +1 -0
- package/lib/PubSubManager/addSub.js +152 -0
- package/lib/PubSubManager/addSub.ts +178 -0
- package/lib/PubSubManager/addSync.d.ts +8 -0
- package/lib/PubSubManager/addSync.d.ts.map +1 -0
- package/lib/PubSubManager/addSync.js +109 -0
- package/lib/PubSubManager/addSync.ts +127 -0
- package/lib/PubSubManager/notifListener.d.ts +5 -0
- package/lib/PubSubManager/notifListener.d.ts.map +1 -0
- package/lib/PubSubManager/notifListener.js +96 -0
- package/lib/PubSubManager/notifListener.ts +122 -0
- package/package.json +2 -2
- package/tests/client/PID.txt +1 -1
- package/tests/client/tsconfig.json +2 -1
- package/tests/client_only_queries.js +1 -1
- package/tests/client_only_queries.ts +1 -1
- package/tests/isomorphic_queries.ts +1 -1
- package/tests/server/package-lock.json +1 -1
- package/tests/server/tsconfig.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PubSubManager.d.ts","sourceRoot":"","sources":["PubSubManager.ts"],"names":[],"mappings":";AAKA,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAc,MAAM,eAAe,CAAC;AAClH,OAAO,EAAE,EAAE,EAAe,MAAM,cAAc,CAAC;AAO/C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"PubSubManager.d.ts","sourceRoot":"","sources":["PubSubManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,8 +27,8 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
27
27
|
return result;
|
|
28
28
|
};
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
exports.omitKeys = exports.pickKeys = exports.PubSubManager = exports.log = exports.DEFAULT_SYNC_BATCH_SIZE = exports.asValue = void 0;
|
|
31
|
-
const
|
|
30
|
+
exports.omitKeys = exports.pickKeys = exports.parseCondition = exports.PubSubManager = exports.log = exports.DEFAULT_SYNC_BATCH_SIZE = exports.asValue = void 0;
|
|
31
|
+
const addSync_1 = require("./addSync");
|
|
32
32
|
const DboBuilder_1 = require("../DboBuilder");
|
|
33
33
|
const Prostgles_1 = require("../Prostgles");
|
|
34
34
|
const initPubSubManager_1 = require("./initPubSubManager");
|
|
@@ -38,6 +38,8 @@ const prostgles_types_1 = require("prostgles-types");
|
|
|
38
38
|
const SyncReplication_1 = require("../SyncReplication");
|
|
39
39
|
const util_1 = require("prostgles-types/dist/util");
|
|
40
40
|
const getInitQuery_1 = require("./getInitQuery");
|
|
41
|
+
const addSub_1 = require("./addSub");
|
|
42
|
+
const notifListener_1 = require("./notifListener");
|
|
41
43
|
const pgp = pgPromise({
|
|
42
44
|
promiseLib: Bluebird
|
|
43
45
|
});
|
|
@@ -60,9 +62,10 @@ class PubSubManager {
|
|
|
60
62
|
return this.dboBuilder.dbo;
|
|
61
63
|
}
|
|
62
64
|
_triggers;
|
|
63
|
-
sockets;
|
|
64
|
-
subs;
|
|
65
|
-
|
|
65
|
+
sockets = {};
|
|
66
|
+
// subs: { [ke: string]: { [ke: string]: { subs: SubscriptionParams[] } } };
|
|
67
|
+
subs = [];
|
|
68
|
+
syncs = [];
|
|
66
69
|
socketChannelPreffix;
|
|
67
70
|
onSchemaChange = undefined;
|
|
68
71
|
postgresNotifListenManager;
|
|
@@ -73,9 +76,6 @@ class PubSubManager {
|
|
|
73
76
|
}
|
|
74
77
|
this.onSchemaChange = onSchemaChange;
|
|
75
78
|
this.dboBuilder = dboBuilder;
|
|
76
|
-
this.sockets = {};
|
|
77
|
-
this.subs = {};
|
|
78
|
-
this.syncs = [];
|
|
79
79
|
this.socketChannelPreffix = wsChannelNamePrefix || "_psqlWS_";
|
|
80
80
|
(0, exports.log)("Created PubSubManager");
|
|
81
81
|
}
|
|
@@ -126,7 +126,8 @@ class PubSubManager {
|
|
|
126
126
|
if (this.appCheck) {
|
|
127
127
|
clearInterval(this.appCheck);
|
|
128
128
|
}
|
|
129
|
-
this.
|
|
129
|
+
this.subs = [];
|
|
130
|
+
this.syncs = [];
|
|
130
131
|
if (!this.postgresNotifListenManager) {
|
|
131
132
|
throw "this.postgresNotifListenManager missing";
|
|
132
133
|
}
|
|
@@ -267,135 +268,32 @@ class PubSubManager {
|
|
|
267
268
|
throw "this.postgresNotifListenManager missing";
|
|
268
269
|
return this.postgresNotifListenManager.isListening();
|
|
269
270
|
}
|
|
270
|
-
getSubs(table_name, condition) {
|
|
271
|
-
const subs = this.subs
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
return subs
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
}
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
return parentSubs ?? s;
|
|
290
|
-
}
|
|
291
|
-
return s;
|
|
292
|
-
});
|
|
271
|
+
getSubs(table_name, condition, client) {
|
|
272
|
+
const subs = this.subs.filter(s => (0, util_1.find)(s.triggers, { table_name, condition }));
|
|
273
|
+
if (client) {
|
|
274
|
+
return subs.filter(s => client.func && s.func === client.func || client.socket_id && s.socket_id === client.socket_id);
|
|
275
|
+
}
|
|
276
|
+
return subs;
|
|
277
|
+
}
|
|
278
|
+
removeLocalSub(tableName, conditionRaw, func) {
|
|
279
|
+
const condition = (0, exports.parseCondition)(conditionRaw);
|
|
280
|
+
if (this.getSubs(tableName, condition, { func }).length) {
|
|
281
|
+
this.subs = this.subs.filter(s => s.func !== func && !(0, util_1.find)(s.triggers, { tableName, condition }));
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
console.error("Could not unsubscribe. Subscription might not have initialised yet", { tableName, condition });
|
|
285
|
+
}
|
|
293
286
|
}
|
|
294
287
|
getSyncs(table_name, condition) {
|
|
295
288
|
return (this.syncs || [])
|
|
296
289
|
.filter((s) => s.table_name === table_name && s.condition === condition);
|
|
297
290
|
}
|
|
298
|
-
|
|
299
|
-
notifListener = async (data) => {
|
|
300
|
-
const str = data.payload;
|
|
301
|
-
if (!str) {
|
|
302
|
-
console.error("Empty notif?");
|
|
303
|
-
return;
|
|
304
|
-
}
|
|
305
|
-
const dataArr = str.split(PubSubManager.DELIMITER), notifType = dataArr[0];
|
|
306
|
-
(0, exports.log)(str);
|
|
307
|
-
if (notifType === this.NOTIF_TYPE.schema) {
|
|
308
|
-
if (this.onSchemaChange) {
|
|
309
|
-
const command = dataArr[1], event_type = dataArr[2], query = dataArr[3];
|
|
310
|
-
if (query) {
|
|
311
|
-
this.onSchemaChange({ command, query });
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
if (notifType !== this.NOTIF_TYPE.data) {
|
|
317
|
-
console.error("Unexpected notif type: ", notifType);
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
if (dataArr.length < 3) {
|
|
321
|
-
throw "dataArr length < 3";
|
|
322
|
-
}
|
|
323
|
-
const table_name = dataArr[1], op_name = dataArr[2], condition_ids_str = dataArr[3];
|
|
324
|
-
// const triggers = await this.db.any("SELECT * FROM prostgles.triggers WHERE table_name = $1 AND id IN ($2:csv)", [table_name, condition_ids_str.split(",").map(v => +v)]);
|
|
325
|
-
// const conditions: string[] = triggers.map(t => t.condition);
|
|
326
|
-
/**
|
|
327
|
-
* Trigger error
|
|
328
|
-
*/
|
|
329
|
-
(0, exports.log)("PG Trigger ->", dataArr.join("__"));
|
|
330
|
-
if (condition_ids_str && condition_ids_str.startsWith("error") &&
|
|
331
|
-
this._triggers &&
|
|
332
|
-
this._triggers[table_name]?.length) {
|
|
333
|
-
const pref = "INTERNAL ERROR";
|
|
334
|
-
console.error(`${pref}: condition_ids_str: ${condition_ids_str}`);
|
|
335
|
-
this._triggers[table_name].map(c => {
|
|
336
|
-
const subs = this.getSubs(table_name, c);
|
|
337
|
-
subs.map(s => {
|
|
338
|
-
this.pushSubData(s, pref + ". Check server logs. Schema might have changed");
|
|
339
|
-
});
|
|
340
|
-
});
|
|
341
|
-
/**
|
|
342
|
-
* Trigger ok
|
|
343
|
-
*/
|
|
344
|
-
}
|
|
345
|
-
else if (condition_ids_str?.split(",").length &&
|
|
346
|
-
condition_ids_str?.split(",").every((c) => Number.isInteger(+c)) &&
|
|
347
|
-
this._triggers?.[table_name]?.length) {
|
|
348
|
-
const idxs = condition_ids_str.split(",").map(v => +v);
|
|
349
|
-
const conditions = this._triggers[table_name].filter((c, i) => idxs.includes(i));
|
|
350
|
-
(0, exports.log)("PG Trigger -> ", { table_name, op_name, condition_ids_str, conditions }, this._triggers[table_name]);
|
|
351
|
-
conditions.map(condition => {
|
|
352
|
-
const subs = this.getSubs(table_name, condition);
|
|
353
|
-
const syncs = this.getSyncs(table_name, condition);
|
|
354
|
-
syncs.map((s) => {
|
|
355
|
-
this.syncData(s, undefined, "trigger");
|
|
356
|
-
});
|
|
357
|
-
if (!subs) {
|
|
358
|
-
// console.error(`sub missing for ${table_name} ${condition}`, this.triggers);
|
|
359
|
-
// console.log(this.subs)
|
|
360
|
-
return;
|
|
361
|
-
}
|
|
362
|
-
/* Throttle the subscriptions */
|
|
363
|
-
for (let i = 0; i < subs.length; i++) {
|
|
364
|
-
const sub = subs[i];
|
|
365
|
-
if (this.dbo[sub.table_name] &&
|
|
366
|
-
sub.is_ready &&
|
|
367
|
-
(sub.socket_id && this.sockets[sub.socket_id]) || sub.func) {
|
|
368
|
-
const throttle = sub.throttle || 0;
|
|
369
|
-
if (sub.last_throttled <= Date.now() - throttle) {
|
|
370
|
-
/* It is assumed the policy was checked before this point */
|
|
371
|
-
this.pushSubData(sub);
|
|
372
|
-
// sub.last_throttled = Date.now();
|
|
373
|
-
}
|
|
374
|
-
else if (!sub.is_throttling) {
|
|
375
|
-
(0, exports.log)("throttling sub");
|
|
376
|
-
sub.is_throttling = setTimeout(() => {
|
|
377
|
-
(0, exports.log)("throttling finished. pushSubData...");
|
|
378
|
-
sub.is_throttling = null;
|
|
379
|
-
this.pushSubData(sub);
|
|
380
|
-
}, throttle); // sub.throttle);
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
});
|
|
385
|
-
}
|
|
386
|
-
else {
|
|
387
|
-
// if(!this._triggers || !this._triggers[table_name] || !this._triggers[table_name].length){
|
|
388
|
-
// console.warn(190, "Trigger sub not found. DROPPING TRIGGER", table_name, condition_ids_str, this._triggers);
|
|
389
|
-
// this.dropTrigger(table_name);
|
|
390
|
-
// } else {
|
|
391
|
-
// }
|
|
392
|
-
console.warn(190, "Trigger sub issue: ", table_name, condition_ids_str, this._triggers);
|
|
393
|
-
}
|
|
394
|
-
};
|
|
291
|
+
notifListener = notifListener_1.notifListener.bind(this);
|
|
395
292
|
pushSubData(sub, err) {
|
|
396
293
|
if (!sub)
|
|
397
294
|
throw "pushSubData: invalid sub";
|
|
398
|
-
const {
|
|
295
|
+
const { table_info, filter, params, table_rules, socket_id, channel_name, func } = sub; //, subOne = false
|
|
296
|
+
const { name: table_name } = table_info;
|
|
399
297
|
sub.last_throttled = Date.now();
|
|
400
298
|
if (err) {
|
|
401
299
|
if (socket_id) {
|
|
@@ -440,226 +338,24 @@ class PubSubManager {
|
|
|
440
338
|
upsertSocket(socket) {
|
|
441
339
|
if (socket && !this.sockets[socket.id]) {
|
|
442
340
|
this.sockets[socket.id] = socket;
|
|
443
|
-
socket.on("disconnect", () =>
|
|
341
|
+
socket.on("disconnect", () => {
|
|
342
|
+
this.subs = this.subs.filter(s => {
|
|
343
|
+
return !(s.socket && s.socket.id === socket.id);
|
|
344
|
+
});
|
|
345
|
+
this.syncs = this.syncs.filter(s => {
|
|
346
|
+
return !(s.socket_id && s.socket_id === socket.id);
|
|
347
|
+
});
|
|
348
|
+
delete this.sockets[socket.id];
|
|
349
|
+
return "ok";
|
|
350
|
+
});
|
|
444
351
|
}
|
|
445
352
|
}
|
|
446
353
|
syncTimeout;
|
|
447
354
|
async syncData(sync, clientData, source) {
|
|
448
355
|
return await (0, SyncReplication_1.syncData)(this, sync, clientData, source);
|
|
449
356
|
}
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
* A sync channel is unique per socket for each filter
|
|
453
|
-
*/
|
|
454
|
-
async addSync(syncParams) {
|
|
455
|
-
const { socket = null, table_info = null, table_rules, synced_field = null, allow_delete = false, id_fields = [], filter = {}, params, condition = "", throttle = 0 } = syncParams || {};
|
|
456
|
-
const conditionParsed = parseCondition(condition);
|
|
457
|
-
if (!socket || !table_info)
|
|
458
|
-
throw "socket or table_info missing";
|
|
459
|
-
const { name: table_name } = table_info, channel_name = `${this.socketChannelPreffix}.${table_name}.${JSON.stringify(filter)}.sync`;
|
|
460
|
-
if (!synced_field)
|
|
461
|
-
throw "synced_field missing from table_rules";
|
|
462
|
-
this.upsertSocket(socket);
|
|
463
|
-
const upsertSync = () => {
|
|
464
|
-
const newSync = {
|
|
465
|
-
channel_name,
|
|
466
|
-
table_name,
|
|
467
|
-
filter,
|
|
468
|
-
condition: conditionParsed,
|
|
469
|
-
synced_field,
|
|
470
|
-
id_fields,
|
|
471
|
-
allow_delete,
|
|
472
|
-
table_rules,
|
|
473
|
-
throttle: Math.max(throttle || 0, table_rules?.sync?.throttle || 0),
|
|
474
|
-
batch_size: (0, utils_1.get)(table_rules, "sync.batch_size") || exports.DEFAULT_SYNC_BATCH_SIZE,
|
|
475
|
-
last_throttled: 0,
|
|
476
|
-
socket_id: socket.id,
|
|
477
|
-
is_sync: true,
|
|
478
|
-
last_synced: 0,
|
|
479
|
-
lr: undefined,
|
|
480
|
-
table_info,
|
|
481
|
-
is_syncing: false,
|
|
482
|
-
wal: undefined,
|
|
483
|
-
socket,
|
|
484
|
-
params
|
|
485
|
-
};
|
|
486
|
-
/* Only a sync per socket per table per condition allowed */
|
|
487
|
-
this.syncs = this.syncs || [];
|
|
488
|
-
const existing = (0, util_1.find)(this.syncs, { socket_id: socket.id, channel_name });
|
|
489
|
-
if (!existing) {
|
|
490
|
-
this.syncs.push(newSync);
|
|
491
|
-
// console.log("Added SYNC");
|
|
492
|
-
socket.removeAllListeners(channel_name + "unsync");
|
|
493
|
-
socket.once(channel_name + "unsync", (_data, cb) => {
|
|
494
|
-
this.onSocketDisconnected(socket, channel_name);
|
|
495
|
-
cb(null, { res: "ok" });
|
|
496
|
-
});
|
|
497
|
-
socket.removeAllListeners(channel_name);
|
|
498
|
-
socket.on(channel_name, (data, cb) => {
|
|
499
|
-
if (!data) {
|
|
500
|
-
cb({ err: "Unexpected request. Need data or onSyncRequest" });
|
|
501
|
-
return;
|
|
502
|
-
}
|
|
503
|
-
/*
|
|
504
|
-
*/
|
|
505
|
-
/* Server will:
|
|
506
|
-
1. Ask for last_synced emit(onSyncRequest)
|
|
507
|
-
2. Ask for data >= server_synced emit(onPullRequest)
|
|
508
|
-
-> Upsert that data
|
|
509
|
-
2. Push data >= last_synced emit(data.data)
|
|
510
|
-
|
|
511
|
-
Client will:
|
|
512
|
-
1. Send last_synced on(onSyncRequest)
|
|
513
|
-
2. Send data >= server_synced on(onPullRequest)
|
|
514
|
-
3. Send data on CRUD emit(data.data | data.deleted)
|
|
515
|
-
4. Upsert data.data | deleted on(data.data | data.deleted)
|
|
516
|
-
*/
|
|
517
|
-
// if(data.data){
|
|
518
|
-
// console.error("THIS SHOUKD NEVER FIRE !! NEW DATA FROM SYNC");
|
|
519
|
-
// this.upsertClientData(newSync, data.data);
|
|
520
|
-
// } else
|
|
521
|
-
if (data.onSyncRequest) {
|
|
522
|
-
// console.log("syncData from socket")
|
|
523
|
-
this.syncData(newSync, data.onSyncRequest, "client");
|
|
524
|
-
// console.log("onSyncRequest ", socket._user)
|
|
525
|
-
}
|
|
526
|
-
else {
|
|
527
|
-
console.error("Unexpected sync request data from client: ", data);
|
|
528
|
-
}
|
|
529
|
-
});
|
|
530
|
-
// socket.emit(channel_name, { onSyncRequest: true }, (response) => {
|
|
531
|
-
// console.log(response)
|
|
532
|
-
// });
|
|
533
|
-
}
|
|
534
|
-
else {
|
|
535
|
-
console.warn("UNCLOSED DUPLICATE SYNC FOUND", existing.channel_name);
|
|
536
|
-
}
|
|
537
|
-
return newSync;
|
|
538
|
-
};
|
|
539
|
-
// const { min_id, max_id, count, max_synced } = params;
|
|
540
|
-
const _sync = upsertSync();
|
|
541
|
-
await this.addTrigger({ table_name, condition: conditionParsed });
|
|
542
|
-
return channel_name;
|
|
543
|
-
}
|
|
544
|
-
/* Must return a channel for socket */
|
|
545
|
-
/* The distinct list of channel names must have a corresponding trigger in the database */
|
|
546
|
-
async addSub(subscriptionParams) {
|
|
547
|
-
const { socket, func = null, table_info = null, table_rules, filter = {}, params = {}, condition = "", throttle = 0, //subOne = false,
|
|
548
|
-
viewOptions } = subscriptionParams || {};
|
|
549
|
-
let validated_throttle = subscriptionParams.throttle || 10;
|
|
550
|
-
if ((!socket && !func) || !table_info)
|
|
551
|
-
throw "socket/func or table_info missing";
|
|
552
|
-
const pubThrottle = (0, utils_1.get)(table_rules, ["subscribe", "throttle"]) || 0;
|
|
553
|
-
if (pubThrottle && Number.isInteger(pubThrottle) && pubThrottle > 0) {
|
|
554
|
-
validated_throttle = pubThrottle;
|
|
555
|
-
}
|
|
556
|
-
if (throttle && Number.isInteger(throttle) && throttle >= pubThrottle) {
|
|
557
|
-
validated_throttle = throttle;
|
|
558
|
-
}
|
|
559
|
-
const channel_name = `${this.socketChannelPreffix}.${table_info.name}.${JSON.stringify(filter)}.${JSON.stringify(params)}.${"m"}.sub`;
|
|
560
|
-
this.upsertSocket(socket);
|
|
561
|
-
const upsertSub = (newSubData, isReadyOverride) => {
|
|
562
|
-
const { table_name, condition: _cond, is_ready = false, parentSubParams } = newSubData, condition = parseCondition(_cond), newSub = {
|
|
563
|
-
socket,
|
|
564
|
-
table_name: table_info.name,
|
|
565
|
-
table_info,
|
|
566
|
-
filter,
|
|
567
|
-
params,
|
|
568
|
-
table_rules,
|
|
569
|
-
channel_name,
|
|
570
|
-
parentSubParams,
|
|
571
|
-
func: func ?? undefined,
|
|
572
|
-
socket_id: socket?.id,
|
|
573
|
-
throttle: validated_throttle,
|
|
574
|
-
is_throttling: null,
|
|
575
|
-
last_throttled: 0,
|
|
576
|
-
is_ready,
|
|
577
|
-
};
|
|
578
|
-
this.subs[table_name] = this.subs[table_name] ?? {};
|
|
579
|
-
this.subs[table_name][condition] = this.subs[table_name][condition] ?? { subs: [] };
|
|
580
|
-
this.subs[table_name][condition].subs = this.subs[table_name][condition].subs ?? [];
|
|
581
|
-
// console.log("1034 upsertSub", this.subs)
|
|
582
|
-
const sub_idx = this.subs[table_name][condition].subs.findIndex(s => s.channel_name === channel_name &&
|
|
583
|
-
(socket && s.socket_id === socket.id ||
|
|
584
|
-
func && s.func === func));
|
|
585
|
-
if (sub_idx < 0) {
|
|
586
|
-
this.subs[table_name][condition].subs.push(newSub);
|
|
587
|
-
if (socket) {
|
|
588
|
-
const chnUnsub = channel_name + "unsubscribe";
|
|
589
|
-
socket.removeAllListeners(chnUnsub);
|
|
590
|
-
socket.once(chnUnsub, (_data, cb) => {
|
|
591
|
-
const res = this.onSocketDisconnected(socket, channel_name);
|
|
592
|
-
cb(null, { res });
|
|
593
|
-
});
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
else {
|
|
597
|
-
this.subs[table_name][condition].subs[sub_idx] = newSub;
|
|
598
|
-
}
|
|
599
|
-
if (isReadyOverride ?? is_ready) {
|
|
600
|
-
this.pushSubData(newSub);
|
|
601
|
-
}
|
|
602
|
-
};
|
|
603
|
-
viewOptions?.relatedTables.map(async (relatedTable, relatedTableIdx) => {
|
|
604
|
-
const params = {
|
|
605
|
-
table_name: relatedTable.tableName,
|
|
606
|
-
condition: relatedTable.condition,
|
|
607
|
-
parentSubParams: {
|
|
608
|
-
...subscriptionParams,
|
|
609
|
-
channel_name
|
|
610
|
-
},
|
|
611
|
-
};
|
|
612
|
-
upsertSub({
|
|
613
|
-
...params,
|
|
614
|
-
is_ready: false,
|
|
615
|
-
}, false);
|
|
616
|
-
await this.addTrigger(params, viewOptions);
|
|
617
|
-
/** Trigger pushSubData only on last related table (if it's a view) to prevent duplicate firings */
|
|
618
|
-
const isLast = relatedTableIdx === viewOptions.relatedTables.length - 1;
|
|
619
|
-
upsertSub({
|
|
620
|
-
...params,
|
|
621
|
-
is_ready: true
|
|
622
|
-
}, isLast && !table_info.is_view);
|
|
623
|
-
});
|
|
624
|
-
if (table_info.is_view) {
|
|
625
|
-
if (!viewOptions?.relatedTables.length) {
|
|
626
|
-
throw "PubSubManager: view parent_tables missing";
|
|
627
|
-
}
|
|
628
|
-
return channel_name;
|
|
629
|
-
}
|
|
630
|
-
/* Just a table, add table + condition trigger */
|
|
631
|
-
// console.log(table_info, 202);
|
|
632
|
-
upsertSub({
|
|
633
|
-
table_name: table_info.name,
|
|
634
|
-
condition: parseCondition(condition),
|
|
635
|
-
parentSubParams: undefined,
|
|
636
|
-
is_ready: false
|
|
637
|
-
}, undefined);
|
|
638
|
-
await this.addTrigger({
|
|
639
|
-
table_name: table_info.name,
|
|
640
|
-
condition: parseCondition(condition),
|
|
641
|
-
});
|
|
642
|
-
upsertSub({
|
|
643
|
-
table_name: table_info.name,
|
|
644
|
-
condition: parseCondition(condition),
|
|
645
|
-
parentSubParams: undefined,
|
|
646
|
-
is_ready: true
|
|
647
|
-
}, undefined);
|
|
648
|
-
return channel_name;
|
|
649
|
-
}
|
|
650
|
-
removeLocalSub(table_name, condition, func) {
|
|
651
|
-
const cond = parseCondition(condition);
|
|
652
|
-
if ((0, utils_1.get)(this.subs, [table_name, cond, "subs"])) {
|
|
653
|
-
this.subs[table_name][cond].subs.map((sub, i) => {
|
|
654
|
-
if (sub.func && sub.func === func) {
|
|
655
|
-
this.subs[table_name][cond].subs.splice(i, 1);
|
|
656
|
-
}
|
|
657
|
-
});
|
|
658
|
-
}
|
|
659
|
-
else {
|
|
660
|
-
console.error("Could not unsubscribe. Subscription might not have initialised yet");
|
|
661
|
-
}
|
|
662
|
-
}
|
|
357
|
+
addSync = addSync_1.addSync.bind(this);
|
|
358
|
+
addSub = addSub_1.addSub.bind(this);
|
|
663
359
|
getActiveListeners = () => {
|
|
664
360
|
const result = [];
|
|
665
361
|
const upsert = (t, c) => {
|
|
@@ -670,63 +366,13 @@ class PubSubManager {
|
|
|
670
366
|
(this.syncs || []).map(s => {
|
|
671
367
|
upsert(s.table_name, s.condition);
|
|
672
368
|
});
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
upsert(table_name, condition);
|
|
677
|
-
}
|
|
369
|
+
this.subs.forEach(s => {
|
|
370
|
+
s.triggers.forEach(trg => {
|
|
371
|
+
upsert(trg.table_name, trg.condition);
|
|
678
372
|
});
|
|
679
373
|
});
|
|
680
374
|
return result;
|
|
681
375
|
};
|
|
682
|
-
onSocketDisconnected(socket, channel_name) {
|
|
683
|
-
// process.on('warning', e => {
|
|
684
|
-
// console.warn(e.stack)
|
|
685
|
-
// });
|
|
686
|
-
// console.log("onSocketDisconnected", channel_name, this.syncs)
|
|
687
|
-
if (this.subs) {
|
|
688
|
-
Object.keys(this.subs).map(table_name => {
|
|
689
|
-
Object.keys(this.subs[table_name]).map(condition => {
|
|
690
|
-
this.subs[table_name][condition].subs.map((sub, i) => {
|
|
691
|
-
/**
|
|
692
|
-
* If a channel name is specified then delete triggers
|
|
693
|
-
*/
|
|
694
|
-
if ((socket && sub.socket_id === socket.id) &&
|
|
695
|
-
(!channel_name || sub.channel_name === channel_name)) {
|
|
696
|
-
this.subs[table_name][condition].subs.splice(i, 1);
|
|
697
|
-
if (!this.subs[table_name][condition].subs.length) {
|
|
698
|
-
delete this.subs[table_name][condition];
|
|
699
|
-
if ((0, prostgles_types_1.isEmpty)(this.subs[table_name])) {
|
|
700
|
-
delete this.subs[table_name];
|
|
701
|
-
}
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
});
|
|
705
|
-
});
|
|
706
|
-
});
|
|
707
|
-
}
|
|
708
|
-
if (this.syncs) {
|
|
709
|
-
this.syncs = this.syncs.filter(s => {
|
|
710
|
-
const matchesSocket = Boolean(socket && s.socket_id !== socket.id);
|
|
711
|
-
if (channel_name) {
|
|
712
|
-
return matchesSocket || s.channel_name !== channel_name;
|
|
713
|
-
}
|
|
714
|
-
return matchesSocket;
|
|
715
|
-
});
|
|
716
|
-
}
|
|
717
|
-
if (!socket) {
|
|
718
|
-
// Do nothing
|
|
719
|
-
}
|
|
720
|
-
else if (!channel_name) {
|
|
721
|
-
delete this.sockets[socket.id];
|
|
722
|
-
}
|
|
723
|
-
else {
|
|
724
|
-
socket.removeAllListeners(channel_name);
|
|
725
|
-
socket.removeAllListeners(channel_name + "unsync");
|
|
726
|
-
socket.removeAllListeners(channel_name + "unsubscribe");
|
|
727
|
-
}
|
|
728
|
-
return "ok";
|
|
729
|
-
}
|
|
730
376
|
checkIfTimescaleBug = async (table_name) => {
|
|
731
377
|
const schema = "_timescaledb_catalog", res = await this.db.oneOrNone("SELECT EXISTS( \
|
|
732
378
|
SELECT * \
|
|
@@ -810,6 +456,7 @@ class PubSubManager {
|
|
|
810
456
|
}
|
|
811
457
|
exports.PubSubManager = PubSubManager;
|
|
812
458
|
const parseCondition = (condition) => condition && condition.trim().length ? condition : "TRUE";
|
|
459
|
+
exports.parseCondition = parseCondition;
|
|
813
460
|
var prostgles_types_2 = require("prostgles-types");
|
|
814
461
|
Object.defineProperty(exports, "pickKeys", { enumerable: true, get: function () { return prostgles_types_2.pickKeys; } });
|
|
815
462
|
Object.defineProperty(exports, "omitKeys", { enumerable: true, get: function () { return prostgles_types_2.omitKeys; } });
|