prostgles-server 4.2.535 → 4.2.538

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.
Files changed (55) hide show
  1. package/dist/DboBuilder/DboBuilder.d.ts +1 -1
  2. package/dist/DboBuilder/DboBuilderTypes.d.ts +3 -1
  3. package/dist/DboBuilder/DboBuilderTypes.d.ts.map +1 -1
  4. package/dist/DboBuilder/TableHandler/TableHandler.d.ts +3 -1
  5. package/dist/DboBuilder/TableHandler/TableHandler.d.ts.map +1 -1
  6. package/dist/DboBuilder/TableHandler/TableHandler.js +20 -6
  7. package/dist/DboBuilder/TableHandler/TableHandler.js.map +1 -1
  8. package/dist/DboBuilder/runSql/runSqlUtils.d.ts +1 -1
  9. package/dist/DboBuilder/schema/getTablesForSchemaPostgresSQL.d.ts.map +1 -1
  10. package/dist/DboBuilder/schema/getTablesForSchemaPostgresSQL.js +0 -4
  11. package/dist/DboBuilder/schema/getTablesForSchemaPostgresSQL.js.map +1 -1
  12. package/dist/JSONBSchemaValidation/validateJSONBSchemaSQL.d.ts +1 -1
  13. package/dist/Logging.d.ts +4 -1
  14. package/dist/Logging.d.ts.map +1 -1
  15. package/dist/PubSubManager/PubSubManager.d.ts +5 -4
  16. package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
  17. package/dist/PubSubManager/PubSubManager.js +4 -2
  18. package/dist/PubSubManager/PubSubManager.js.map +1 -1
  19. package/dist/PubSubManager/SyncReplication/fetchSyncServerData.d.ts +11 -0
  20. package/dist/PubSubManager/SyncReplication/fetchSyncServerData.d.ts.map +1 -0
  21. package/dist/PubSubManager/SyncReplication/fetchSyncServerData.js +25 -0
  22. package/dist/PubSubManager/SyncReplication/fetchSyncServerData.js.map +1 -0
  23. package/dist/PubSubManager/SyncReplication/getSyncBatchOptions.d.ts +14 -0
  24. package/dist/PubSubManager/SyncReplication/getSyncBatchOptions.d.ts.map +1 -0
  25. package/dist/PubSubManager/SyncReplication/getSyncBatchOptions.js +19 -0
  26. package/dist/PubSubManager/SyncReplication/getSyncBatchOptions.js.map +1 -0
  27. package/dist/PubSubManager/SyncReplication/getSyncOrderByAndFields.d.ts +8 -0
  28. package/dist/PubSubManager/SyncReplication/getSyncOrderByAndFields.d.ts.map +1 -0
  29. package/dist/PubSubManager/SyncReplication/getSyncOrderByAndFields.js +9 -0
  30. package/dist/PubSubManager/SyncReplication/getSyncOrderByAndFields.js.map +1 -0
  31. package/dist/PubSubManager/SyncReplication/getSyncUtilFunctions.d.ts +44 -0
  32. package/dist/PubSubManager/SyncReplication/getSyncUtilFunctions.d.ts.map +1 -0
  33. package/dist/{SyncReplication.js → PubSubManager/SyncReplication/getSyncUtilFunctions.js} +101 -232
  34. package/dist/PubSubManager/SyncReplication/getSyncUtilFunctions.js.map +1 -0
  35. package/dist/{SyncReplication.d.ts → PubSubManager/SyncReplication/syncData.d.ts} +4 -4
  36. package/dist/PubSubManager/SyncReplication/syncData.d.ts.map +1 -0
  37. package/dist/PubSubManager/SyncReplication/syncData.js +132 -0
  38. package/dist/PubSubManager/SyncReplication/syncData.js.map +1 -0
  39. package/dist/PubSubManager/addSync.d.ts.map +1 -1
  40. package/dist/PubSubManager/addSync.js +10 -9
  41. package/dist/PubSubManager/addSync.js.map +1 -1
  42. package/lib/DboBuilder/DboBuilderTypes.ts +2 -1
  43. package/lib/DboBuilder/TableHandler/TableHandler.ts +26 -8
  44. package/lib/DboBuilder/schema/getTablesForSchemaPostgresSQL.ts +0 -4
  45. package/lib/Logging.ts +16 -1
  46. package/lib/PubSubManager/PubSubManager.ts +7 -5
  47. package/lib/PubSubManager/SyncReplication/fetchSyncServerData.ts +55 -0
  48. package/lib/PubSubManager/SyncReplication/getSyncBatchOptions.ts +31 -0
  49. package/lib/PubSubManager/SyncReplication/getSyncOrderByAndFields.ts +11 -0
  50. package/lib/{SyncReplication.ts → PubSubManager/SyncReplication/getSyncUtilFunctions.ts} +173 -330
  51. package/lib/PubSubManager/SyncReplication/syncData.ts +195 -0
  52. package/lib/PubSubManager/addSync.ts +13 -18
  53. package/package.json +2 -2
  54. package/dist/SyncReplication.d.ts.map +0 -1
  55. package/dist/SyncReplication.js.map +0 -1
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.syncData = syncData;
4
+ const prostgles_types_1 = require("prostgles-types");
5
+ const WAL_1 = require("prostgles-types/dist/WAL");
6
+ const getSyncUtilFunctions_1 = require("./getSyncUtilFunctions");
7
+ /**
8
+ * Server or client requested data sync
9
+ */
10
+ async function syncData(sync, clientData, source) {
11
+ const logSyncData = (state) => {
12
+ return this._log({
13
+ type: "sync",
14
+ command: "syncData",
15
+ channelName: sync.channel_name,
16
+ tableName: sync.table_name,
17
+ sid: sync.sid,
18
+ source,
19
+ ...(0, prostgles_types_1.pickKeys)(sync, ["socket_id", "condition", "last_synced", "is_syncing"]),
20
+ lr: JSON.stringify(sync.lr),
21
+ connectedSocketIds: this.dboBuilder.prostgles.connectedSockets.map((s) => s.id),
22
+ localParams: undefined,
23
+ duration: -1,
24
+ socketId: sync.socket_id,
25
+ syncParams: sync,
26
+ state,
27
+ });
28
+ };
29
+ await logSyncData("start");
30
+ const { socket_id, table_name, synced_field, id_fields = [], batch_size, throttle = 0 } = sync;
31
+ const socket = this.sockets[socket_id];
32
+ if (!socket?.connected) {
33
+ await logSyncData("socket?.connected");
34
+ return;
35
+ }
36
+ const tableHandler = this.dbo[table_name];
37
+ if (!tableHandler?.find) {
38
+ throw `dbo.${table_name}.find missing or not allowed`;
39
+ }
40
+ const { upsertData, updateSyncLR, getServerRowInfo, deleteData, getLastSynced, pushData, syncBatch, rowsFullyMatch, } = (0, getSyncUtilFunctions_1.getSyncUtilFunctions)({
41
+ tableHandler,
42
+ socket,
43
+ sync,
44
+ pubSubManager: this,
45
+ logSyncData,
46
+ });
47
+ /* Used to throttle and merge incoming updates */
48
+ sync.wal ??= new WAL_1.WAL({
49
+ id_fields,
50
+ synced_field,
51
+ throttle,
52
+ batch_size,
53
+ DEBUG_MODE: this.dboBuilder.prostgles.opts.DEBUG_MODE,
54
+ onSendStart: () => {
55
+ sync.is_syncing = true;
56
+ },
57
+ onSend: async (data) => {
58
+ const res = await upsertData(data);
59
+ return res;
60
+ },
61
+ onSendEnd: (batch) => {
62
+ updateSyncLR(batch);
63
+ sync.is_syncing = false;
64
+ /**
65
+ * After all data was inserted request SyncInfo from client and sync again if necessary
66
+ */
67
+ void this.syncData(sync, undefined, source);
68
+ },
69
+ });
70
+ /* Debounce sync requests */
71
+ if (!sync.wal.isSending() && sync.is_syncing) {
72
+ if (!this.syncTimeout) {
73
+ this.syncTimeout = setTimeout(() => {
74
+ this.syncTimeout = undefined;
75
+ void this.syncData(sync, undefined, source);
76
+ }, throttle);
77
+ }
78
+ return;
79
+ }
80
+ /**
81
+ * Express data sent from a client that has already been synced
82
+ * Add to WAL manager which will sync at the end
83
+ */
84
+ if (clientData) {
85
+ if (clientData.data && Array.isArray(clientData.data) && clientData.data.length) {
86
+ return sync.wal.addData(clientData.data.map((d) => ({ current: d })));
87
+ /* Not expecting this anymore. use normal db.table.delete channel */
88
+ }
89
+ else if (clientData.deleted &&
90
+ Array.isArray(clientData.deleted) &&
91
+ clientData.deleted.length) {
92
+ await deleteData(clientData.deleted);
93
+ }
94
+ }
95
+ else {
96
+ // do nothing
97
+ }
98
+ if (sync.wal.isSending()) {
99
+ await logSyncData("sync.wal.isSending()");
100
+ return;
101
+ }
102
+ sync.is_syncing = true;
103
+ // from synced does not make sense. It should be sync.lr only!!!
104
+ let from_synced = null;
105
+ /** Sync was already synced */
106
+ if (sync.lr) {
107
+ const { s_lr } = await getServerRowInfo();
108
+ /* Make sure trigger is not firing on freshly synced data */
109
+ if (!rowsFullyMatch(sync.lr, s_lr)) {
110
+ from_synced = sync.last_synced;
111
+ await logSyncData("sync.last_synced");
112
+ }
113
+ else {
114
+ await logSyncData("rowsFullyMatch");
115
+ }
116
+ }
117
+ else {
118
+ await logSyncData("getLastSynced(clientData)");
119
+ from_synced = await getLastSynced(clientData);
120
+ }
121
+ if (from_synced !== null) {
122
+ await logSyncData("syncBatch.start");
123
+ await syncBatch(from_synced);
124
+ await logSyncData("syncBatch.end");
125
+ }
126
+ else {
127
+ await logSyncData("nothingToSync");
128
+ }
129
+ await pushData([], true);
130
+ sync.is_syncing = false;
131
+ }
132
+ //# sourceMappingURL=syncData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncData.js","sourceRoot":"","sources":["../../../lib/PubSubManager/SyncReplication/syncData.ts"],"names":[],"mappings":";;AA+CA,4BAmJC;AAjMD,qDAA2C;AAC3C,kDAA+C;AAE/C,iEAA8D;AAwC9D;;GAEG;AACI,KAAK,UAAU,QAAQ,CAE5B,IAAgB,EAChB,UAAyC,EACzC,MAA4B;IAE5B,MAAM,WAAW,GAAG,CAAC,KAAiE,EAAE,EAAE;QACxF,OAAO,IAAI,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,UAAU;YACnB,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM;YACN,GAAG,IAAA,0BAAQ,EAAC,IAAI,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;YAC1E,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/E,WAAW,EAAE,SAAS;YACtB,QAAQ,EAAE,CAAC,CAAC;YACZ,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,UAAU,EAAE,IAAI;YAChB,KAAK;SACN,CAAC,CAAC;IACL,CAAC,CAAC;IACF,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IAE3B,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,GAAG,EAAE,EAAE,UAAU,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;IAE/F,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;QACvB,MAAM,WAAW,CAAC,mBAAmB,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;QACxB,MAAM,OAAO,UAAU,8BAA8B,CAAC;IACxD,CAAC;IAED,MAAM,EACJ,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,QAAQ,EACR,SAAS,EACT,cAAc,GACf,GAAG,IAAA,2CAAoB,EAAC;QACvB,YAAY;QACZ,MAAM;QACN,IAAI;QACJ,aAAa,EAAE,IAAI;QACnB,WAAW;KACZ,CAAC,CAAC;IAEH,iDAAiD;IACjD,IAAI,CAAC,GAAG,KAAK,IAAI,SAAG,CAAC;QACnB,SAAS;QACT,YAAY;QACZ,QAAQ;QACR,UAAU;QACV,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU;QACrD,WAAW,EAAE,GAAG,EAAE;YAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACrB,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YACnC,OAAO,GAAG,CAAC;QACb,CAAC;QACD,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YACnB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YAExB;;eAEG;YACH,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAC9C,CAAC;KACF,CAAC,CAAC;IAEH,4BAA4B;IAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;gBACjC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;gBAC7B,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YAC9C,CAAC,EAAE,QAAQ,CAAC,CAAC;QACf,CAAC;QACD,OAAO;IACT,CAAC;IAED;;;OAGG;IACH,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,UAAU,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAChF,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACtE,oEAAoE;QACtE,CAAC;aAAM,IACL,UAAU,CAAC,OAAO;YAClB,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;YACjC,UAAU,CAAC,OAAO,CAAC,MAAM,EACzB,CAAC;YACD,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,aAAa;IACf,CAAC;IAED,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC;QACzB,MAAM,WAAW,CAAC,sBAAsB,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IAEvB,gEAAgE;IAChE,IAAI,WAAW,GAAG,IAAI,CAAC;IAEvB,8BAA8B;IAC9B,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAE1C,4DAA4D;QAC5D,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;YACnC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YAC/B,MAAM,WAAW,CAAC,kBAAkB,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,CAAC,gBAAgB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,CAAC,2BAA2B,CAAC,CAAC;QAC/C,WAAW,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,WAAW,CAAC,iBAAiB,CAAC,CAAC;QACrC,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;QAC7B,MAAM,WAAW,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,MAAM,WAAW,CAAC,eAAe,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAEzB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AAC1B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"addSync.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/addSync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAiB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGnF;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,aAAa,GACxB,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CA0IlC"}
1
+ {"version":3,"file":"addSync.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/addSync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAiB,aAAa,EAAc,MAAM,iBAAiB,CAAC;AAI/F;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,aAAa,GACxB,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAqIlC"}
@@ -10,22 +10,19 @@ const PubSubManagerUtils_1 = require("./PubSubManagerUtils");
10
10
  async function addSync(syncParams) {
11
11
  const sid = this.dboBuilder.prostgles.authHandler.getSIDNoError({ socket: syncParams.socket });
12
12
  const res = await (0, prostgles_types_1.tryCatchV2)(async () => {
13
- const { socket = null, table_info = null, table_rules, synced_field = null, filter = {}, params, condition = "", } = syncParams;
13
+ const { socket, table_info, table_rules, filter, params, condition } = syncParams;
14
14
  const conditionParsed = (0, PubSubManagerUtils_1.parseCondition)(condition);
15
- if (!socket || !table_info)
16
- throw "socket or table_info missing";
17
15
  const { name: table_name } = table_info;
18
16
  const channelName = (0, prostgles_types_1.getSyncChannelName)({
19
17
  tableName: table_name,
20
18
  filter,
21
19
  select: params.select,
22
20
  });
23
- if (!synced_field)
24
- throw "synced_field missing from table_rules";
25
21
  this.upsertSocket(socket);
26
22
  const syncConfig = this.dboBuilder.prostgles.tableConfigurator?.getTableSyncConfig(table_name);
27
- if (!syncConfig)
23
+ if (!syncConfig) {
28
24
  throw `Sync not configured for table ${table_name}`;
25
+ }
29
26
  const upsertSync = () => {
30
27
  const newSync = {
31
28
  channel_name: channelName,
@@ -45,7 +42,7 @@ async function addSync(syncParams) {
45
42
  socket,
46
43
  params,
47
44
  };
48
- /* Only a sync per socket per table per condition allowed */
45
+ /* Only a sync per socket per table/condition/select allowed */
49
46
  const existing = (0, prostgles_types_1.find)(this.syncs, { socket_id: socket.id, channel_name: channelName });
50
47
  if (!existing) {
51
48
  this.syncs.push(newSync);
@@ -58,9 +55,11 @@ async function addSync(syncParams) {
58
55
  socketId: socket.id,
59
56
  tableName: table_name,
60
57
  condition,
58
+ channelName,
61
59
  sid,
62
60
  connectedSocketIds: this.connectedSocketIds,
63
61
  duration: -1,
62
+ syncParams: newSync,
64
63
  });
65
64
  socket.removeAllListeners(channelName);
66
65
  socket.removeAllListeners(unsyncChn);
@@ -104,9 +103,9 @@ async function addSync(syncParams) {
104
103
  }
105
104
  return newSync;
106
105
  };
107
- upsertSync();
106
+ const newSync = upsertSync();
108
107
  await this.addTrigger({ table_name, condition: conditionParsed, tracked_columns: undefined }, undefined, socket);
109
- return { channelName };
108
+ return { channelName, newSync };
110
109
  });
111
110
  await this._log({
112
111
  type: "sync",
@@ -118,6 +117,8 @@ async function addSync(syncParams) {
118
117
  duration: res.duration,
119
118
  error: res.error,
120
119
  sid,
120
+ channelName: res.data?.channelName || "",
121
+ syncParams: res.data?.newSync ?? {},
121
122
  });
122
123
  if (res.hasError)
123
124
  throw res.error;
@@ -1 +1 @@
1
- {"version":3,"file":"addSync.js","sourceRoot":"","sources":["../../lib/PubSubManager/addSync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"addSync.js","sourceRoot":"","sources":["../../lib/PubSubManager/addSync.ts"],"names":[],"mappings":";;AASA,0BAwIC;AAjJD,qDAA6F;AAE7F,6DAAsD;AAGtD;;;GAGG;AACI,KAAK,UAAU,OAAO,CAE3B,UAAyB;IAEzB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/F,MAAM,GAAG,GAAG,MAAM,IAAA,4BAAU,EAAC,KAAK,IAAI,EAAE;QACtC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,CAAC;QAClF,MAAM,eAAe,GAAG,IAAA,mCAAc,EAAC,SAAS,CAAC,CAAC;QAElD,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC;QACxC,MAAM,WAAW,GAAG,IAAA,oCAAkB,EAAC;YACrC,SAAS,EAAE,UAAU;YACrB,MAAM;YACN,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAE1B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC/F,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,iCAAiC,UAAU,EAAE,CAAC;QACtD,CAAC;QACD,MAAM,UAAU,GAAG,GAAG,EAAE;YACtB,MAAM,OAAO,GAAG;gBACd,YAAY,EAAE,WAAW;gBACzB,UAAU;gBACV,MAAM;gBACN,SAAS,EAAE,eAAe;gBAC1B,GAAG;gBACH,WAAW;gBACX,GAAG,UAAU;gBACb,SAAS,EAAE,MAAM,CAAC,EAAE;gBACpB,OAAO,EAAE,IAAI;gBACb,WAAW,EAAE,CAAC;gBACd,EAAE,EAAE,SAAS;gBACb,UAAU;gBACV,UAAU,EAAE,KAAK;gBACjB,GAAG,EAAE,SAAS;gBACd,MAAM;gBACN,MAAM;aACP,CAAC;YAEF,+DAA+D;YAC/D,MAAM,QAAQ,GAAG,IAAA,sBAAI,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;YACvF,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAEzB,MAAM,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;gBACzC,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,KAAU,EAAE,EAAiB,EAAE,EAAE;oBACvD,KAAK,IAAI,CAAC,IAAI,CAAC;wBACb,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,QAAQ;wBACjB,QAAQ,EAAE,MAAM,CAAC,EAAE;wBACnB,SAAS,EAAE,UAAU;wBACrB,SAAS;wBACT,WAAW;wBACX,GAAG;wBACH,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;wBAC3C,QAAQ,EAAE,CAAC,CAAC;wBACZ,UAAU,EAAE,OAAO;qBACpB,CAAC,CAAC;oBACH,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;oBACvC,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;oBACrC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;wBACnC,MAAM,OAAO,GACX,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,YAAY,KAAK,WAAW,CAAC;wBAC7E,OAAO,CAAC,OAAO,CAAC;oBAClB,CAAC,CAAC,CAAC;oBACH,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1B,CAAC,CAAC,CAAC;gBAEH,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;gBACvC,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,IAAuC,EAAE,EAAiB,EAAE,EAAE;oBACpF,IAAI,CAAC,IAAI,EAAE,CAAC;wBACV,EAAE,CAAC,EAAE,GAAG,EAAE,gDAAgD,EAAE,CAAC,CAAC;wBAC9D,OAAO;oBACT,CAAC;oBAED;;;;;;;;;;;sBAWE;oBAEF,IAAI,eAAe,IAAI,IAAI,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;wBAClD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;4BACjE,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;4BACvD,EAAE,CAAC,EAAE,GAAG,EAAE,IAAA,sCAAoB,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACzC,CAAC,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,IAAI,CAAC,CAAC;oBACpE,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,kDAAkD,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC1F,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;QAE7B,MAAM,IAAI,CAAC,UAAU,CACnB,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,EACtE,SAAS,EACT,MAAM,CACP,CAAC;QAEF,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,IAAI,CAAC;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,UAAU,CAAC,UAAU,CAAC,IAAI;QACrC,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE;QAC9B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG;QACH,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE;QACxC,UAAU,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,IAAK,EAAiB;KACpD,CAAC,CAAC;IAEH,IAAI,GAAG,CAAC,QAAQ;QAAE,MAAM,GAAG,CAAC,KAAK,CAAC;IAElC,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC"}
@@ -6,7 +6,6 @@ import type {
6
6
  EXISTS_KEY,
7
7
  RawJoinPath,
8
8
  SQLHandler,
9
- SyncTableInfo,
10
9
  TableInfo as TInfo,
11
10
  UserLike,
12
11
  } from "prostgles-types";
@@ -23,6 +22,7 @@ import type { FieldSpec } from "./QueryBuilder/Functions/Functions";
23
22
  import type { TableHandler } from "./TableHandler/TableHandler";
24
23
  import type { ParsedJoinPath } from "./ViewHandler/parseJoinPath";
25
24
  import pg = require("pg-promise/typescript/pg-subset");
25
+ import type { SyncTableInfo } from "prostgles-types/dist/WAL";
26
26
 
27
27
  type PGP = pgPromise.IMain<{}, pg.IClient>;
28
28
 
@@ -188,6 +188,7 @@ export type PRGLIOSocket = {
188
188
  };
189
189
 
190
190
  _user?: AnyObject;
191
+ connected: boolean;
191
192
 
192
193
  /** Used for publish error caching */
193
194
  prostgles?: Map<string, ClientSchema>;
@@ -4,12 +4,14 @@ import type {
4
4
  DeleteParams,
5
5
  FieldFilter,
6
6
  InsertParams,
7
+ ReplicationState,
7
8
  Select,
8
9
  UpdateParams,
9
10
  } from "prostgles-types";
10
11
  import { asName, isDefined } from "prostgles-types";
11
12
  import type { DB } from "../../Prostgles";
12
13
  import type { InsertRule, ParsedTableRule, UpdateRule } from "../../PublishParser/PublishParser";
14
+ import { getSyncBatchOptions } from "../../PubSubManager/SyncReplication/getSyncBatchOptions";
13
15
  import type TableConfigurator from "../../TableConfig/TableConfig";
14
16
  import type { TableDefinition } from "../../TableConfig/TableConfig";
15
17
  import type { DboBuilder, Filter, LocalParams, TableHandlers } from "../DboBuilder";
@@ -198,7 +200,7 @@ export class TableHandler extends ViewHandler {
198
200
  async sync(
199
201
  filter: Filter,
200
202
  params: { select?: FieldFilter },
201
- param3_unused: undefined,
203
+ _param3_unused: undefined,
202
204
  table_rules: ParsedTableRule,
203
205
  localParams: LocalParams,
204
206
  ) {
@@ -223,7 +225,7 @@ export class TableHandler extends ViewHandler {
223
225
  const ALLOWED_PARAMS = ["select"];
224
226
  const invalidParams = Object.keys(params).filter((k) => !ALLOWED_PARAMS.includes(k));
225
227
  if (invalidParams.length) {
226
- throw "Invalid or dissallowed params found: " + invalidParams.join(", ");
228
+ throw "Invalid or disallowed params found: " + invalidParams.join(", ");
227
229
  }
228
230
 
229
231
  const { synced_field } = syncConfig;
@@ -250,13 +252,20 @@ export class TableHandler extends ViewHandler {
250
252
  });
251
253
 
252
254
  /* Step 1: parse command and params */
253
- const result = await this.find(
255
+ const syncOpts = getSyncBatchOptions({
254
256
  filter,
255
- { select, limit: 0 },
257
+ params: { select },
258
+ ...syncConfig,
259
+ from_synced: undefined,
260
+ offset: undefined,
261
+ });
262
+ const syncResult = await this.find(
263
+ syncOpts.syncBatchFilter,
264
+ { select: syncOpts.select, limit: syncOpts.limit, orderBy: syncOpts.orderBy },
256
265
  undefined,
257
266
  table_rules,
258
267
  localParams,
259
- ).then(async (_isValid) => {
268
+ ).then(async (data: AnyObject[]) => {
260
269
  const { filterFields, forcedFilter } = table_rules.select || {};
261
270
  const condition = (
262
271
  await this.prepareWhere({
@@ -281,7 +290,16 @@ export class TableHandler extends ViewHandler {
281
290
  filter: { ...filter },
282
291
  params: { select },
283
292
  })
284
- .then(({ channelName }) => ({ channelName, id_fields, synced_field }));
293
+ .then(
294
+ ({ channelName }) =>
295
+ ({
296
+ channelName,
297
+ data,
298
+ id_fields,
299
+ synced_field,
300
+ isSynced: data.length < syncOpts.limit,
301
+ }) satisfies ReplicationState["channels"]["CHANNEL_PREFIX"]["client.emit"]["server.response"]["data"],
302
+ );
285
303
  });
286
304
  await this._log({
287
305
  command: "sync",
@@ -289,7 +307,7 @@ export class TableHandler extends ViewHandler {
289
307
  data: { filter, params },
290
308
  duration: Date.now() - start,
291
309
  });
292
- return result;
310
+ return syncResult;
293
311
  } catch (e) {
294
312
  await this._log({
295
313
  command: "sync",
@@ -309,7 +327,7 @@ export class TableHandler extends ViewHandler {
309
327
  /*
310
328
  REPLICATION
311
329
 
312
- 1 Sync proccess (NO DELETES ALLOWED):
330
+ 1 Sync process (NO DELETES ALLOWED):
313
331
 
314
332
  Client sends:
315
333
  "sync-request"
@@ -31,10 +31,6 @@ export async function getTablesForSchemaPostgresSQL(
31
31
  ddlWithRollback,
32
32
  }: { schemaFilter: ProstglesInitOptions["schemaFilter"]; ddlWithRollback?: string },
33
33
  ) {
34
- // : Promise<{
35
- // result: TableSchema[];
36
- // durations: Record<string, number>;
37
- // }>
38
34
  const { sql, schemaNames } = getSchemaFilter(schemaFilter);
39
35
 
40
36
  return db.tx(async (t) => {
package/lib/Logging.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { AnyObject, ClientSchema, TableHandler } from "prostgles-types";
2
2
  import type { LocalParams } from "./DboBuilder/DboBuilder";
3
- import type { PubSubManagerTriggers } from "./PubSubManager/PubSubManager";
3
+ import type { PubSubManagerTriggers, SyncParams } from "./PubSubManager/PubSubManager";
4
4
  import type { NotifTypeName } from "./PubSubManager/PubSubManagerUtils";
5
5
 
6
6
  type ClientInfo = {
@@ -30,11 +30,26 @@ export namespace EventTypes {
30
30
  tableName: string;
31
31
  localParams?: LocalParams;
32
32
  connectedSocketIds: string[];
33
+ channelName: string;
34
+ syncParams: SyncParams;
33
35
  } & (
34
36
  | {
35
37
  command: "syncData";
36
38
  source: "client" | "trigger";
37
39
  lr: string;
40
+ state:
41
+ | "start"
42
+ | "sync.wal.isSending()"
43
+ | "initial"
44
+ | "socket?.connected"
45
+ | "sync.last_synced"
46
+ | "rowsFullyMatch"
47
+ | "getLastSynced.rowsFullyMatch(lr)"
48
+ | "getLastSynced.nothingToSync"
49
+ | "syncBatch.start"
50
+ | "syncBatch.end"
51
+ | "nothingToSync"
52
+ | "getLastSynced(clientData)";
38
53
  }
39
54
  | {
40
55
  command: "upsertData" | "pushData";
@@ -15,11 +15,10 @@ import { refreshTriggers } from "./refreshTriggers";
15
15
 
16
16
  import type {
17
17
  AnyObject,
18
+ EqualityFilter,
18
19
  FieldFilter,
19
20
  SelectParams,
20
- SyncTableInfo,
21
21
  TableSchema,
22
- WAL,
23
22
  } from "prostgles-types";
24
23
  import { CHANNELS, getSerialisableError, type SubscribeOptions } from "prostgles-types";
25
24
 
@@ -28,11 +27,12 @@ import type { OnData } from "../DboBuilder/ViewHandler/subscribe";
28
27
  import { matchesLocalFuncs } from "../DboBuilder/ViewHandler/subscribe";
29
28
  import type { EventTypes } from "../Logging";
30
29
  import type { ParsedTableRule } from "../PublishParser/PublishParser";
31
- import { syncData } from "../SyncReplication";
30
+ import { syncData } from "./SyncReplication/syncData";
32
31
  import { addSub } from "./addSub";
33
32
  import { notifListener } from "./notifListener";
34
33
  import { log } from "./PubSubManagerUtils";
35
34
  import { pushSubData } from "./pushSubData";
35
+ import type { SyncTableInfo, WAL } from "prostgles-types/dist/WAL";
36
36
 
37
37
  export type BasicCallback = (err?: any, res?: any) => void;
38
38
 
@@ -41,11 +41,11 @@ export type SyncParams = {
41
41
  sid: string | undefined;
42
42
  channel_name: string;
43
43
  table_name: string;
44
- table_rules?: ParsedTableRule;
44
+ table_rules: ParsedTableRule;
45
45
  synced_field: string;
46
46
  id_fields: string[];
47
47
  batch_size: number;
48
- filter: object;
48
+ filter: EqualityFilter<AnyObject>;
49
49
  params: {
50
50
  select: FieldFilter;
51
51
  };
@@ -361,6 +361,7 @@ export class PubSubManager {
361
361
  type: "sync",
362
362
  command: "upsertSocket.disconnect",
363
363
  tableName: "",
364
+ channelName: "*",
364
365
  duration: 0,
365
366
  sid: this.dboBuilder.prostgles.authHandler.getSIDNoError({ socket }),
366
367
  socketId: socket.id,
@@ -374,6 +375,7 @@ export class PubSubManager {
374
375
  remainingSyncs: JSON.stringify(
375
376
  this.syncs.map((s) => pickKeys(s, ["table_name", "condition"])),
376
377
  ),
378
+ syncParams: {} as SyncParams,
377
379
  });
378
380
 
379
381
  return "ok";
@@ -0,0 +1,55 @@
1
+ import type { AnyObject } from "prostgles-types";
2
+ import type { PRGLIOSocket } from "../../DboBuilder/DboBuilder";
3
+ import type { TableHandler } from "../../DboBuilder/TableHandler/TableHandler";
4
+ import type { SyncParams } from "../PubSubManager";
5
+ import { getSyncOrderByAndFields } from "./getSyncOrderByAndFields";
6
+ import { getSyncBatchOptions } from "./getSyncBatchOptions";
7
+
8
+ export const fetchSyncServerData = async (
9
+ {
10
+ tableHandler,
11
+ socket,
12
+ from_synced,
13
+ offset,
14
+ }: {
15
+ tableHandler: TableHandler;
16
+ socket: PRGLIOSocket;
17
+ from_synced: number | undefined;
18
+ offset: number | undefined;
19
+ },
20
+ {
21
+ filter,
22
+ id_fields,
23
+ params,
24
+ synced_field,
25
+ batch_size,
26
+ table_rules,
27
+ }: Pick<
28
+ SyncParams,
29
+ "filter" | "params" | "id_fields" | "synced_field" | "batch_size" | "table_rules"
30
+ >,
31
+ ) => {
32
+ const { syncBatchFilter } = getSyncBatchOptions({
33
+ filter,
34
+ id_fields,
35
+ params,
36
+ synced_field,
37
+ batch_size,
38
+ from_synced,
39
+ offset,
40
+ });
41
+ const batchRows = await tableHandler.find(
42
+ syncBatchFilter,
43
+ {
44
+ select: params.select,
45
+ orderBy: getSyncOrderByAndFields({ synced_field, id_fields }).orderByAsc,
46
+ offset,
47
+ limit: batch_size,
48
+ },
49
+ undefined,
50
+ table_rules,
51
+ { clientReq: { socket } },
52
+ );
53
+
54
+ return batchRows as AnyObject[];
55
+ };
@@ -0,0 +1,31 @@
1
+ import type { SyncParams } from "../PubSubManager";
2
+ import { getSyncOrderByAndFields } from "./getSyncOrderByAndFields";
3
+
4
+ export const getSyncBatchOptions = ({
5
+ from_synced,
6
+ offset = 0,
7
+ filter,
8
+ id_fields,
9
+ params,
10
+ synced_field,
11
+ batch_size,
12
+ }: Pick<SyncParams, "filter" | "params" | "id_fields" | "synced_field" | "batch_size"> & {
13
+ from_synced: number | undefined;
14
+ offset: number | undefined;
15
+ }) => {
16
+ const syncBatchFilter =
17
+ from_synced === undefined ? filter : (
18
+ {
19
+ ...filter,
20
+ [synced_field]: { $gte: from_synced },
21
+ }
22
+ );
23
+
24
+ return {
25
+ select: params.select,
26
+ orderBy: getSyncOrderByAndFields({ synced_field, id_fields }).orderByAsc,
27
+ offset,
28
+ limit: batch_size,
29
+ syncBatchFilter,
30
+ };
31
+ };
@@ -0,0 +1,11 @@
1
+ import type { OrderBy } from "prostgles-types";
2
+ import type { SyncParams } from "../PubSubManager";
3
+
4
+ export const getSyncOrderByAndFields = ({
5
+ synced_field,
6
+ id_fields,
7
+ }: Pick<SyncParams, "id_fields" | "synced_field">) => {
8
+ const sync_fields = [synced_field, ...id_fields.sort()],
9
+ orderByAsc: OrderBy = sync_fields.reduce((a, v) => ({ ...a, [v]: true }), {});
10
+ return { orderByAsc, sync_fields };
11
+ };