prostgles-server 4.2.535 → 4.2.537
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/DboBuilder/DboBuilder.d.ts +1 -1
- package/dist/DboBuilder/DboBuilderTypes.d.ts +3 -1
- package/dist/DboBuilder/DboBuilderTypes.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.d.ts +3 -1
- package/dist/DboBuilder/TableHandler/TableHandler.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.js +20 -6
- package/dist/DboBuilder/TableHandler/TableHandler.js.map +1 -1
- package/dist/DboBuilder/runSql/runSqlUtils.d.ts +1 -1
- package/dist/DboBuilder/schema/getTablesForSchemaPostgresSQL.d.ts.map +1 -1
- package/dist/DboBuilder/schema/getTablesForSchemaPostgresSQL.js +0 -4
- package/dist/DboBuilder/schema/getTablesForSchemaPostgresSQL.js.map +1 -1
- package/dist/JSONBSchemaValidation/validateJSONBSchemaSQL.d.ts +1 -1
- package/dist/Logging.d.ts +4 -1
- package/dist/Logging.d.ts.map +1 -1
- package/dist/PubSubManager/PubSubManager.d.ts +5 -4
- package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/PubSubManager.js +4 -2
- package/dist/PubSubManager/PubSubManager.js.map +1 -1
- package/dist/PubSubManager/SyncReplication/fetchSyncServerData.d.ts +11 -0
- package/dist/PubSubManager/SyncReplication/fetchSyncServerData.d.ts.map +1 -0
- package/dist/PubSubManager/SyncReplication/fetchSyncServerData.js +25 -0
- package/dist/PubSubManager/SyncReplication/fetchSyncServerData.js.map +1 -0
- package/dist/PubSubManager/SyncReplication/getSyncBatchOptions.d.ts +14 -0
- package/dist/PubSubManager/SyncReplication/getSyncBatchOptions.d.ts.map +1 -0
- package/dist/PubSubManager/SyncReplication/getSyncBatchOptions.js +19 -0
- package/dist/PubSubManager/SyncReplication/getSyncBatchOptions.js.map +1 -0
- package/dist/PubSubManager/SyncReplication/getSyncOrderByAndFields.d.ts +8 -0
- package/dist/PubSubManager/SyncReplication/getSyncOrderByAndFields.d.ts.map +1 -0
- package/dist/PubSubManager/SyncReplication/getSyncOrderByAndFields.js +9 -0
- package/dist/PubSubManager/SyncReplication/getSyncOrderByAndFields.js.map +1 -0
- package/dist/PubSubManager/SyncReplication/getSyncUtilFunctions.d.ts +40 -0
- package/dist/PubSubManager/SyncReplication/getSyncUtilFunctions.d.ts.map +1 -0
- package/dist/{SyncReplication.js → PubSubManager/SyncReplication/getSyncUtilFunctions.js} +84 -214
- package/dist/PubSubManager/SyncReplication/getSyncUtilFunctions.js.map +1 -0
- package/dist/{SyncReplication.d.ts → PubSubManager/SyncReplication/syncData.d.ts} +4 -4
- package/dist/PubSubManager/SyncReplication/syncData.d.ts.map +1 -0
- package/dist/PubSubManager/SyncReplication/syncData.js +131 -0
- package/dist/PubSubManager/SyncReplication/syncData.js.map +1 -0
- package/dist/PubSubManager/addSync.d.ts.map +1 -1
- package/dist/PubSubManager/addSync.js +10 -9
- package/dist/PubSubManager/addSync.js.map +1 -1
- package/lib/DboBuilder/DboBuilderTypes.ts +2 -1
- package/lib/DboBuilder/TableHandler/TableHandler.ts +26 -8
- package/lib/DboBuilder/schema/getTablesForSchemaPostgresSQL.ts +0 -4
- package/lib/Logging.ts +13 -1
- package/lib/PubSubManager/PubSubManager.ts +7 -5
- package/lib/PubSubManager/SyncReplication/fetchSyncServerData.ts +55 -0
- package/lib/PubSubManager/SyncReplication/getSyncBatchOptions.ts +31 -0
- package/lib/PubSubManager/SyncReplication/getSyncOrderByAndFields.ts +11 -0
- package/lib/{SyncReplication.ts → PubSubManager/SyncReplication/getSyncUtilFunctions.ts} +144 -310
- package/lib/PubSubManager/SyncReplication/syncData.ts +194 -0
- package/lib/PubSubManager/addSync.ts +13 -18
- package/package.json +2 -2
- package/dist/SyncReplication.d.ts.map +0 -1
- package/dist/SyncReplication.js.map +0 -1
|
@@ -0,0 +1,131 @@
|
|
|
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
|
+
});
|
|
46
|
+
/* Used to throttle and merge incoming updates */
|
|
47
|
+
sync.wal ??= new WAL_1.WAL({
|
|
48
|
+
id_fields,
|
|
49
|
+
synced_field,
|
|
50
|
+
throttle,
|
|
51
|
+
batch_size,
|
|
52
|
+
DEBUG_MODE: this.dboBuilder.prostgles.opts.DEBUG_MODE,
|
|
53
|
+
onSendStart: () => {
|
|
54
|
+
sync.is_syncing = true;
|
|
55
|
+
},
|
|
56
|
+
onSend: async (data) => {
|
|
57
|
+
const res = await upsertData(data);
|
|
58
|
+
return res;
|
|
59
|
+
},
|
|
60
|
+
onSendEnd: (batch) => {
|
|
61
|
+
updateSyncLR(batch);
|
|
62
|
+
sync.is_syncing = false;
|
|
63
|
+
/**
|
|
64
|
+
* After all data was inserted request SyncInfo from client and sync again if necessary
|
|
65
|
+
*/
|
|
66
|
+
void this.syncData(sync, undefined, source);
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
/* Debounce sync requests */
|
|
70
|
+
if (!sync.wal.isSending() && sync.is_syncing) {
|
|
71
|
+
if (!this.syncTimeout) {
|
|
72
|
+
this.syncTimeout = setTimeout(() => {
|
|
73
|
+
this.syncTimeout = undefined;
|
|
74
|
+
void this.syncData(sync, undefined, source);
|
|
75
|
+
}, throttle);
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Express data sent from a client that has already been synced
|
|
81
|
+
* Add to WAL manager which will sync at the end
|
|
82
|
+
*/
|
|
83
|
+
if (clientData) {
|
|
84
|
+
if (clientData.data && Array.isArray(clientData.data) && clientData.data.length) {
|
|
85
|
+
return sync.wal.addData(clientData.data.map((d) => ({ current: d })));
|
|
86
|
+
/* Not expecting this anymore. use normal db.table.delete channel */
|
|
87
|
+
}
|
|
88
|
+
else if (clientData.deleted &&
|
|
89
|
+
Array.isArray(clientData.deleted) &&
|
|
90
|
+
clientData.deleted.length) {
|
|
91
|
+
await deleteData(clientData.deleted);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// do nothing
|
|
96
|
+
}
|
|
97
|
+
if (sync.wal.isSending()) {
|
|
98
|
+
await logSyncData("sync.wal.isSending()");
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
sync.is_syncing = true;
|
|
102
|
+
// from synced does not make sense. It should be sync.lr only!!!
|
|
103
|
+
let from_synced = null;
|
|
104
|
+
/** Sync was already synced */
|
|
105
|
+
if (sync.lr) {
|
|
106
|
+
const { s_lr } = await getServerRowInfo();
|
|
107
|
+
/* Make sure trigger is not firing on freshly synced data */
|
|
108
|
+
if (!rowsFullyMatch(sync.lr, s_lr)) {
|
|
109
|
+
from_synced = sync.last_synced;
|
|
110
|
+
await logSyncData("sync.last_synced");
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
await logSyncData("rowsFullyMatch");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
await logSyncData("getLastSynced(clientData)");
|
|
118
|
+
from_synced = await getLastSynced(clientData);
|
|
119
|
+
}
|
|
120
|
+
if (from_synced !== null) {
|
|
121
|
+
await logSyncData("syncBatch.start");
|
|
122
|
+
await syncBatch(from_synced);
|
|
123
|
+
await logSyncData("syncBatch.end");
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// console.log("from_synced is null")
|
|
127
|
+
}
|
|
128
|
+
await pushData([], true);
|
|
129
|
+
sync.is_syncing = false;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=syncData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syncData.js","sourceRoot":"","sources":["../../../lib/PubSubManager/SyncReplication/syncData.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addSync.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/addSync.ts"],"names":[],"mappings":"
|
|
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
|
|
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
|
|
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":";;AASA,
|
|
1
|
+
{"version":3,"file":"addSync.js","sourceRoot":"","sources":["../../lib/PubSubManager/addSync.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
|
|
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
|
|
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
|
|
255
|
+
const syncOpts = getSyncBatchOptions({
|
|
254
256
|
filter,
|
|
255
|
-
{ select
|
|
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 (
|
|
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(
|
|
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
|
|
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
|
|
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,23 @@ 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
|
+
| "syncBatch.start"
|
|
48
|
+
| "syncBatch.end"
|
|
49
|
+
| "getLastSynced(clientData)";
|
|
38
50
|
}
|
|
39
51
|
| {
|
|
40
52
|
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 "
|
|
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
|
|
44
|
+
table_rules: ParsedTableRule;
|
|
45
45
|
synced_field: string;
|
|
46
46
|
id_fields: string[];
|
|
47
47
|
batch_size: number;
|
|
48
|
-
filter:
|
|
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
|
+
};
|