prostgles-server 2.0.145 → 2.0.148
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/AuthHandler.d.ts +15 -13
- package/dist/AuthHandler.d.ts.map +1 -1
- package/dist/AuthHandler.js +43 -44
- package/dist/AuthHandler.js.map +1 -1
- package/dist/DBEventsManager.d.ts +6 -5
- package/dist/DBEventsManager.d.ts.map +1 -1
- package/dist/DBEventsManager.js +8 -2
- package/dist/DBEventsManager.js.map +1 -1
- package/dist/DboBuilder.d.ts +54 -50
- package/dist/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder.js +275 -206
- package/dist/DboBuilder.js.map +1 -1
- package/dist/FileManager.d.ts +5 -5
- package/dist/FileManager.d.ts.map +1 -1
- package/dist/FileManager.js +59 -31
- package/dist/FileManager.js.map +1 -1
- package/dist/Filtering.d.ts.map +1 -1
- package/dist/Filtering.js +17 -14
- package/dist/Filtering.js.map +1 -1
- package/dist/PostgresNotifListenManager.d.ts +3 -3
- package/dist/PostgresNotifListenManager.d.ts.map +1 -1
- package/dist/PostgresNotifListenManager.js +7 -5
- package/dist/PostgresNotifListenManager.js.map +1 -1
- package/dist/Prostgles.d.ts +6 -9
- package/dist/Prostgles.d.ts.map +1 -1
- package/dist/Prostgles.js +125 -86
- package/dist/Prostgles.js.map +1 -1
- package/dist/PubSubManager.d.ts +8 -8
- package/dist/PubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager.js +58 -52
- package/dist/PubSubManager.js.map +1 -1
- package/dist/QueryBuilder.d.ts +21 -8
- package/dist/QueryBuilder.d.ts.map +1 -1
- package/dist/QueryBuilder.js +179 -107
- package/dist/QueryBuilder.js.map +1 -1
- package/dist/SyncReplication.js +38 -35
- package/dist/SyncReplication.js.map +1 -1
- package/dist/TableConfig.d.ts +0 -1
- package/dist/TableConfig.d.ts.map +1 -1
- package/dist/TableConfig.js +36 -28
- package/dist/TableConfig.js.map +1 -1
- package/dist/shortestPath.d.ts.map +1 -1
- package/dist/shortestPath.js +2 -1
- package/dist/shortestPath.js.map +1 -1
- package/dist/utils.d.ts +2 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +7 -0
- package/dist/utils.js.map +1 -1
- package/lib/AuthHandler.ts +50 -40
- package/lib/DBEventsManager.ts +14 -7
- package/lib/DboBuilder.ts +265 -199
- package/lib/FileManager.ts +30 -21
- package/lib/Filtering.ts +19 -16
- package/lib/PostgresNotifListenManager.ts +11 -10
- package/lib/Prostgles.ts +89 -73
- package/lib/PubSubManager.ts +13 -11
- package/lib/QueryBuilder.ts +128 -55
- package/lib/SyncReplication.ts +10 -10
- package/lib/TableConfig.ts +23 -15
- package/lib/shortestPath.ts +6 -4
- package/lib/utils.ts +7 -1
- package/package.json +8 -9
- package/tests/client/PID.txt +1 -1
- package/tests/client/index.js +10 -7
- package/tests/client/index.ts +12 -8
- package/tests/client/package-lock.json +14 -14
- package/tests/client/package.json +2 -2
- package/tests/client/tsconfig.json +2 -2
- package/tests/client_only_queries.js +127 -104
- package/tests/client_only_queries.ts +43 -17
- package/tests/isomorphic_queries.js +43 -6
- package/tests/isomorphic_queries.ts +41 -6
- package/tests/server/package-lock.json +29 -31
- package/tests/server/package.json +2 -2
- package/tests/server/tsconfig.json +2 -2
- package/tsconfig.json +3 -2
package/tests/client/index.js
CHANGED
|
@@ -14,13 +14,16 @@ const log = (msg, extra) => {
|
|
|
14
14
|
log("Started client...");
|
|
15
15
|
const url = process.env.PRGL_CLIENT_URL || "http://127.0.0.1:3001", path = process.env.PRGL_CLIENT_PATH || "/teztz/s", socket = (0, socket_io_client_1.default)(url, { path, query: { token: "haha" } }), //
|
|
16
16
|
stopTest = (err) => {
|
|
17
|
-
|
|
18
|
-
log("Stopping client...");
|
|
19
|
-
if (err)
|
|
20
|
-
console.trace(err);
|
|
21
|
-
});
|
|
17
|
+
log("Stopping client due to error: " + JSON.stringify(err));
|
|
22
18
|
setTimeout(() => {
|
|
23
|
-
|
|
19
|
+
socket.emit("stop-test", !err ? err : { err: err.toString(), error: err }, cb => {
|
|
20
|
+
log("Stopping client...");
|
|
21
|
+
if (err)
|
|
22
|
+
console.trace(err);
|
|
23
|
+
});
|
|
24
|
+
setTimeout(() => {
|
|
25
|
+
process.exit(err ? 1 : 0);
|
|
26
|
+
}, 1000);
|
|
24
27
|
}, 1000);
|
|
25
28
|
};
|
|
26
29
|
try {
|
|
@@ -62,7 +65,7 @@ try {
|
|
|
62
65
|
catch (err) {
|
|
63
66
|
console.trace(err);
|
|
64
67
|
stopTest(err);
|
|
65
|
-
throw err;
|
|
68
|
+
// throw err;
|
|
66
69
|
}
|
|
67
70
|
}
|
|
68
71
|
});
|
package/tests/client/index.ts
CHANGED
|
@@ -15,15 +15,19 @@ const url = process.env.PRGL_CLIENT_URL || "http://127.0.0.1:3001",
|
|
|
15
15
|
path = process.env.PRGL_CLIENT_PATH || "/teztz/s",
|
|
16
16
|
socket = io(url, { path, query: { token: "haha" } }), //
|
|
17
17
|
stopTest = (err?) => {
|
|
18
|
-
|
|
18
|
+
log("Stopping client due to error: " + JSON.stringify(err));
|
|
19
19
|
|
|
20
|
-
log("Stopping client...");
|
|
21
|
-
if(err) console.trace(err);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
});
|
|
25
20
|
setTimeout(() => {
|
|
26
|
-
|
|
21
|
+
socket.emit("stop-test", !err? err : { err: err.toString(), error: err }, cb => {
|
|
22
|
+
|
|
23
|
+
log("Stopping client...");
|
|
24
|
+
if(err) console.trace(err);
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
});
|
|
28
|
+
setTimeout(() => {
|
|
29
|
+
process.exit(err? 1 : 0)
|
|
30
|
+
}, 1000);
|
|
27
31
|
}, 1000);
|
|
28
32
|
|
|
29
33
|
};
|
|
@@ -70,7 +74,7 @@ try {
|
|
|
70
74
|
} catch (err){
|
|
71
75
|
console.trace(err)
|
|
72
76
|
stopTest(err);
|
|
73
|
-
throw err;
|
|
77
|
+
// throw err;
|
|
74
78
|
}
|
|
75
79
|
}
|
|
76
80
|
});
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@types/node": "^14.14.16",
|
|
13
13
|
"@types/socket.io-client": "^1.4.35",
|
|
14
|
-
"prostgles-client": "^1.5.
|
|
14
|
+
"prostgles-client": "^1.5.138",
|
|
15
15
|
"prostgles-types": "^1.5.68",
|
|
16
|
-
"socket.io-client": "^4.5.
|
|
16
|
+
"socket.io-client": "^4.5.1"
|
|
17
17
|
}
|
|
18
18
|
},
|
|
19
19
|
"node_modules/@socket.io/component-emitter": {
|
|
@@ -73,9 +73,9 @@
|
|
|
73
73
|
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
|
74
74
|
},
|
|
75
75
|
"node_modules/prostgles-client": {
|
|
76
|
-
"version": "1.5.
|
|
77
|
-
"resolved": "https://registry.npmjs.org/prostgles-client/-/prostgles-client-1.5.
|
|
78
|
-
"integrity": "sha512
|
|
76
|
+
"version": "1.5.138",
|
|
77
|
+
"resolved": "https://registry.npmjs.org/prostgles-client/-/prostgles-client-1.5.138.tgz",
|
|
78
|
+
"integrity": "sha512-+xuu1erZ9mReRyGlTYLEvF0kB6VniVerXUW2ib/wRRBokBxKVKa5lB8cfZznP+Ch+U51gzzCIZzEVNlYSwy/cw==",
|
|
79
79
|
"dependencies": {
|
|
80
80
|
"prostgles-types": "^1.5.123"
|
|
81
81
|
}
|
|
@@ -86,9 +86,9 @@
|
|
|
86
86
|
"integrity": "sha512-BL5I7lc8eqTa6z3SH5Z9g/1g1H+crlDoBCPH8zVEDBK3y5xMIiCW3SOYRZQfPfRM1lYnW4ljWzx3Cb2x9D1Ofg=="
|
|
87
87
|
},
|
|
88
88
|
"node_modules/socket.io-client": {
|
|
89
|
-
"version": "4.5.
|
|
90
|
-
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.
|
|
91
|
-
"integrity": "sha512-
|
|
89
|
+
"version": "4.5.1",
|
|
90
|
+
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.1.tgz",
|
|
91
|
+
"integrity": "sha512-e6nLVgiRYatS+AHXnOnGi4ocOpubvOUCGhyWw8v+/FxW8saHkinG6Dfhi9TU0Kt/8mwJIAASxvw6eujQmjdZVA==",
|
|
92
92
|
"dependencies": {
|
|
93
93
|
"@socket.io/component-emitter": "~3.1.0",
|
|
94
94
|
"debug": "~4.3.2",
|
|
@@ -187,9 +187,9 @@
|
|
|
187
187
|
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
|
188
188
|
},
|
|
189
189
|
"prostgles-client": {
|
|
190
|
-
"version": "1.5.
|
|
191
|
-
"resolved": "https://registry.npmjs.org/prostgles-client/-/prostgles-client-1.5.
|
|
192
|
-
"integrity": "sha512
|
|
190
|
+
"version": "1.5.138",
|
|
191
|
+
"resolved": "https://registry.npmjs.org/prostgles-client/-/prostgles-client-1.5.138.tgz",
|
|
192
|
+
"integrity": "sha512-+xuu1erZ9mReRyGlTYLEvF0kB6VniVerXUW2ib/wRRBokBxKVKa5lB8cfZznP+Ch+U51gzzCIZzEVNlYSwy/cw==",
|
|
193
193
|
"requires": {
|
|
194
194
|
"prostgles-types": "^1.5.123"
|
|
195
195
|
}
|
|
@@ -200,9 +200,9 @@
|
|
|
200
200
|
"integrity": "sha512-BL5I7lc8eqTa6z3SH5Z9g/1g1H+crlDoBCPH8zVEDBK3y5xMIiCW3SOYRZQfPfRM1lYnW4ljWzx3Cb2x9D1Ofg=="
|
|
201
201
|
},
|
|
202
202
|
"socket.io-client": {
|
|
203
|
-
"version": "4.5.
|
|
204
|
-
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.
|
|
205
|
-
"integrity": "sha512-
|
|
203
|
+
"version": "4.5.1",
|
|
204
|
+
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.5.1.tgz",
|
|
205
|
+
"integrity": "sha512-e6nLVgiRYatS+AHXnOnGi4ocOpubvOUCGhyWw8v+/FxW8saHkinG6Dfhi9TU0Kt/8mwJIAASxvw6eujQmjdZVA==",
|
|
206
206
|
"requires": {
|
|
207
207
|
"@socket.io/component-emitter": "~3.1.0",
|
|
208
208
|
"debug": "~4.3.2",
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"@types/node": "^14.14.16",
|
|
16
16
|
"@types/socket.io-client": "^1.4.35",
|
|
17
|
-
"prostgles-client": "^1.5.
|
|
17
|
+
"prostgles-client": "^1.5.138",
|
|
18
18
|
"prostgles-types": "^1.5.68",
|
|
19
|
-
"socket.io-client": "^4.5.
|
|
19
|
+
"socket.io-client": "^4.5.1"
|
|
20
20
|
}
|
|
21
21
|
}
|
|
@@ -6,45 +6,62 @@ async function client_only(db, auth, log, methods) {
|
|
|
6
6
|
const testRealtime = () => {
|
|
7
7
|
log("Started testRealtime");
|
|
8
8
|
return new Promise(async (resolve, reject) => {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
9
|
+
try {
|
|
10
|
+
/* METHODS */
|
|
11
|
+
const t222 = await methods.get();
|
|
12
|
+
assert_1.strict.equal(t222, 222, "methods.get() failed");
|
|
13
|
+
log("SQL Full result");
|
|
14
|
+
/* RAWSQL */
|
|
15
|
+
await (0, isomorphic_queries_1.tryRunP)("SQL Full result", async (resolve, reject) => {
|
|
16
|
+
const sqlStatement = await db.sql("SELECT $1", [1], { returnType: "statement" });
|
|
17
|
+
assert_1.strict.equal(sqlStatement, "SELECT 1", "db.sql statement query failed");
|
|
18
|
+
const arrayMode = await db.sql("SELECT 1 as a, 2 as a", undefined, { returnType: "arrayMode" });
|
|
19
|
+
assert_1.strict.equal(arrayMode.rows?.[0].join("."), "1.2", "db.sql statement arrayMode failed");
|
|
20
|
+
assert_1.strict.equal(arrayMode.fields?.map(f => f.name).join("."), "a.a", "db.sql statement arrayMode failed");
|
|
21
|
+
const select1 = await db.sql("SELECT $1 as col1", [1], { returnType: "rows" });
|
|
22
|
+
assert_1.strict.deepStrictEqual(select1[0], { col1: 1 }, "db.sql justRows query failed");
|
|
23
|
+
const fullResult = await db.sql("SELECT $1 as col1", [1]);
|
|
24
|
+
// console.log(fullResult)
|
|
25
|
+
assert_1.strict.deepStrictEqual(fullResult.rows[0], { col1: 1 }, "db.sql query failed");
|
|
26
|
+
assert_1.strict.deepStrictEqual(fullResult.fields, [{
|
|
27
|
+
name: 'col1',
|
|
28
|
+
tableID: 0,
|
|
29
|
+
columnID: 0,
|
|
30
|
+
dataTypeID: 23,
|
|
31
|
+
dataTypeSize: 4,
|
|
32
|
+
dataTypeModifier: -1,
|
|
33
|
+
format: 'text',
|
|
34
|
+
dataType: 'int4',
|
|
35
|
+
udt_name: 'int4',
|
|
36
|
+
tsDataType: "number"
|
|
37
|
+
}], "db.sql query failed");
|
|
38
|
+
resolve(true);
|
|
39
|
+
}, log);
|
|
40
|
+
log("sql LISTEN NOTIFY events");
|
|
41
|
+
await (0, isomorphic_queries_1.tryRunP)("sql LISTEN NOTIFY events", async (resolve, reject) => {
|
|
42
|
+
const sub = await db.sql("LISTEN chnl ");
|
|
43
|
+
// console.log({ sub })
|
|
44
|
+
sub.addListener(notif => {
|
|
45
|
+
// console.log({ notif })
|
|
46
|
+
if (notif === "hello")
|
|
47
|
+
resolve(true);
|
|
48
|
+
else
|
|
49
|
+
reject("Something went bad");
|
|
50
|
+
});
|
|
51
|
+
db.sql("NOTIFY chnl , 'hello'; ");
|
|
52
|
+
}, log);
|
|
53
|
+
log("sql NOTICE events");
|
|
54
|
+
await (0, isomorphic_queries_1.tryRunP)("sql NOTICE events", async (resolve, reject) => {
|
|
55
|
+
const sub = await db.sql("", {}, { returnType: "noticeSubscription" });
|
|
56
|
+
// console.log({ sub })
|
|
57
|
+
sub.addListener(notice => {
|
|
58
|
+
// console.log({ notif })
|
|
59
|
+
if (notice.message === "hello2")
|
|
60
|
+
resolve(true);
|
|
61
|
+
else
|
|
62
|
+
reject("Something went bad");
|
|
63
|
+
});
|
|
64
|
+
db.sql(`
|
|
48
65
|
DO $$
|
|
49
66
|
BEGIN
|
|
50
67
|
|
|
@@ -52,72 +69,78 @@ async function client_only(db, auth, log, methods) {
|
|
|
52
69
|
|
|
53
70
|
END $$;
|
|
54
71
|
`);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
let updt = 0;
|
|
96
|
-
const sync = await db.planes.sync({}, { handlesOnData: true, patchText: true }, (planes, deltas) => {
|
|
97
|
-
const x20 = planes.filter(p => p.x == 20).length;
|
|
98
|
-
const x10 = planes.filter(p => p.x == 10);
|
|
99
|
-
log(`sync: \nx10 -> ${x10.length} \nx20 -> ${x20}`);
|
|
100
|
-
let update = false;
|
|
101
|
-
planes.map(p => {
|
|
102
|
-
// if(p.y === 1) window.up = p;
|
|
103
|
-
if (typeof p.x !== "number")
|
|
104
|
-
log(typeof p.x);
|
|
105
|
-
if (+p.x < 10) {
|
|
106
|
-
updt++;
|
|
107
|
-
update = true;
|
|
108
|
-
p.$update({ x: 10 });
|
|
72
|
+
}, log);
|
|
73
|
+
/* REPLICATION */
|
|
74
|
+
let start = Date.now();
|
|
75
|
+
const msLimit = 20000;
|
|
76
|
+
setTimeout(() => {
|
|
77
|
+
const msg = "Replication test failed due to taking longer than " + msLimit + "ms";
|
|
78
|
+
log(msg);
|
|
79
|
+
reject(msg);
|
|
80
|
+
}, msLimit);
|
|
81
|
+
await db.planes.delete();
|
|
82
|
+
let inserts = new Array(100).fill(null).map((d, i) => ({ id: i, flight_number: `FN${i}`, x: Math.random(), y: i }));
|
|
83
|
+
await db.planes.insert(inserts);
|
|
84
|
+
if ((await db.planes.count()) !== 100)
|
|
85
|
+
throw "Not 100 planes";
|
|
86
|
+
/**
|
|
87
|
+
* Two listeners are added at the same time to dbo.planes (which has 100 records):
|
|
88
|
+
* subscribe({ x: 10 }
|
|
89
|
+
* sync({}
|
|
90
|
+
*
|
|
91
|
+
* sync starts updating x to 10
|
|
92
|
+
* subscribe waits for 100 records of x=10 and then updates everything to x=20
|
|
93
|
+
* sync waits for 100 records of x=20 and finishes the test
|
|
94
|
+
*/
|
|
95
|
+
/* After all sync records are updated to x10 here we'll update them to x20 */
|
|
96
|
+
const sP = await db.planes.subscribe({ x: 10 }, {}, async (planes) => {
|
|
97
|
+
const p10 = planes.filter(p => p.x == 10);
|
|
98
|
+
log("sub: x10 -> ", p10.length, " x20 ->", planes.filter(p => p.x == 20).length);
|
|
99
|
+
if (p10.length === 100) {
|
|
100
|
+
// db.planes.findOne({}, { select: { last_updated: "$max"}}).then(log);
|
|
101
|
+
sP.unsubscribe();
|
|
102
|
+
log("Update to x20 start");
|
|
103
|
+
const dLastUpdated = Math.max(...p10.map(v => +v.last_updated));
|
|
104
|
+
const last_updated = Date.now();
|
|
105
|
+
if (dLastUpdated >= last_updated)
|
|
106
|
+
throw "dLastUpdated >= last_updated should not happen";
|
|
107
|
+
await db.planes.update({}, { x: 20, last_updated });
|
|
108
|
+
log("Updated to x20", await db.planes.count({ x: 20 }));
|
|
109
|
+
// db.planes.findOne({}, { select: { last_updated: "$max"}}).then(log)
|
|
109
110
|
}
|
|
110
111
|
});
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
log(
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
112
|
+
let updt = 0;
|
|
113
|
+
const sync = await db.planes.sync({}, { handlesOnData: true, patchText: true }, (planes, deltas) => {
|
|
114
|
+
const x20 = planes.filter(p => p.x == 20).length;
|
|
115
|
+
const x10 = planes.filter(p => p.x == 10);
|
|
116
|
+
log(`sync: \nx10 -> ${x10.length} \nx20 -> ${x20}`);
|
|
117
|
+
let update = false;
|
|
118
|
+
planes.map(p => {
|
|
119
|
+
// if(p.y === 1) window.up = p;
|
|
120
|
+
if (typeof p.x !== "number")
|
|
121
|
+
log(typeof p.x);
|
|
122
|
+
if (+p.x < 10) {
|
|
123
|
+
updt++;
|
|
124
|
+
update = true;
|
|
125
|
+
p.$update({ x: 10 });
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
// if(update) log("$update({ x: 10 })", updt)
|
|
129
|
+
if (x20 === 100) {
|
|
130
|
+
// log(22)
|
|
131
|
+
// console.timeEnd("test")
|
|
132
|
+
log("Finished replication test. Inserting 100 rows then updating two times took: " + (Date.now() - start) + "ms");
|
|
133
|
+
resolve(true);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
// sync.upsert(inserts)
|
|
137
|
+
// await db.planes.update({}, { x: 20, last_updated: Date.now() });
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
log(JSON.stringify(err));
|
|
141
|
+
await tout(1000);
|
|
142
|
+
throw err;
|
|
143
|
+
}
|
|
121
144
|
});
|
|
122
145
|
};
|
|
123
146
|
/* TODO: SECURITY */
|
|
@@ -175,7 +198,7 @@ async function client_only(db, auth, log, methods) {
|
|
|
175
198
|
{ id: 1, public: 'public data' },
|
|
176
199
|
{ id: 2, public: 'public data' }
|
|
177
200
|
]);
|
|
178
|
-
});
|
|
201
|
+
}, log);
|
|
179
202
|
}
|
|
180
203
|
}
|
|
181
204
|
exports.default = client_only;
|
|
@@ -9,26 +9,45 @@ export default async function client_only(db: DBHandlerClient, auth: Auth, log:
|
|
|
9
9
|
const testRealtime = () => {
|
|
10
10
|
log("Started testRealtime")
|
|
11
11
|
return new Promise(async (resolve, reject) => {
|
|
12
|
+
try {
|
|
13
|
+
|
|
12
14
|
/* METHODS */
|
|
13
15
|
const t222 = await methods.get();
|
|
14
16
|
assert.equal(t222, 222, "methods.get() failed");
|
|
15
17
|
|
|
18
|
+
log("SQL Full result")
|
|
16
19
|
/* RAWSQL */
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const select1 = await db.sql("SELECT $1 as col1", [1], { returnType: "rows" });
|
|
25
|
-
assert.deepStrictEqual(select1[0], { col1: 1 }, "db.sql justRows query failed");
|
|
26
|
-
|
|
27
|
-
const fullResult = await db.sql("SELECT $1 as col1", [1]);
|
|
28
|
-
// console.log(fullResult)
|
|
29
|
-
assert.deepStrictEqual(fullResult.rows[0], { col1: 1 }, "db.sql query failed");
|
|
30
|
-
assert.deepStrictEqual(fullResult.fields, [ { name: 'col1', tableID: 0,columnID: 0, dataTypeID: 23, dataTypeSize: 4, dataTypeModifier: -1,format: 'text', dataType: 'int4' } ] , "db.sql query failed");
|
|
20
|
+
await tryRunP("SQL Full result", async (resolve, reject) => {
|
|
21
|
+
const sqlStatement = await db.sql("SELECT $1", [1], { returnType: "statement" });
|
|
22
|
+
assert.equal(sqlStatement, "SELECT 1", "db.sql statement query failed");
|
|
23
|
+
|
|
24
|
+
const arrayMode = await db.sql("SELECT 1 as a, 2 as a", undefined, { returnType: "arrayMode" });
|
|
25
|
+
assert.equal(arrayMode.rows?.[0].join("."), "1.2", "db.sql statement arrayMode failed");
|
|
26
|
+
assert.equal(arrayMode.fields?.map(f => f.name).join("."), "a.a", "db.sql statement arrayMode failed");
|
|
31
27
|
|
|
28
|
+
const select1 = await db.sql("SELECT $1 as col1", [1], { returnType: "rows" });
|
|
29
|
+
assert.deepStrictEqual(select1[0], { col1: 1 }, "db.sql justRows query failed");
|
|
30
|
+
|
|
31
|
+
const fullResult = await db.sql("SELECT $1 as col1", [1]);
|
|
32
|
+
// console.log(fullResult)
|
|
33
|
+
assert.deepStrictEqual(fullResult.rows[0], { col1: 1 }, "db.sql query failed");
|
|
34
|
+
assert.deepStrictEqual(fullResult.fields, [ {
|
|
35
|
+
name: 'col1',
|
|
36
|
+
tableID: 0,
|
|
37
|
+
columnID: 0,
|
|
38
|
+
dataTypeID: 23,
|
|
39
|
+
dataTypeSize: 4,
|
|
40
|
+
dataTypeModifier: -1,
|
|
41
|
+
format: 'text',
|
|
42
|
+
dataType: 'int4',
|
|
43
|
+
udt_name: 'int4',
|
|
44
|
+
tsDataType: "number"
|
|
45
|
+
}] , "db.sql query failed");
|
|
46
|
+
resolve(true);
|
|
47
|
+
}, log);
|
|
48
|
+
|
|
49
|
+
log("sql LISTEN NOTIFY events")
|
|
50
|
+
|
|
32
51
|
await tryRunP("sql LISTEN NOTIFY events", async (resolve, reject) => {
|
|
33
52
|
|
|
34
53
|
const sub = await db.sql("LISTEN chnl ");
|
|
@@ -39,7 +58,9 @@ export default async function client_only(db: DBHandlerClient, auth: Auth, log:
|
|
|
39
58
|
else reject("Something went bad")
|
|
40
59
|
});
|
|
41
60
|
db.sql("NOTIFY chnl , 'hello'; ");
|
|
42
|
-
});
|
|
61
|
+
}, log);
|
|
62
|
+
|
|
63
|
+
log("sql NOTICE events")
|
|
43
64
|
await tryRunP("sql NOTICE events", async (resolve, reject) => {
|
|
44
65
|
|
|
45
66
|
const sub = await db.sql("", {}, { returnType: "noticeSubscription" });
|
|
@@ -57,7 +78,7 @@ export default async function client_only(db: DBHandlerClient, auth: Auth, log:
|
|
|
57
78
|
|
|
58
79
|
END $$;
|
|
59
80
|
`);
|
|
60
|
-
});
|
|
81
|
+
}, log);
|
|
61
82
|
|
|
62
83
|
|
|
63
84
|
/* REPLICATION */
|
|
@@ -135,6 +156,11 @@ export default async function client_only(db: DBHandlerClient, auth: Auth, log:
|
|
|
135
156
|
// await db.planes.update({}, { x: 20, last_updated: Date.now() });
|
|
136
157
|
|
|
137
158
|
|
|
159
|
+
} catch(err){
|
|
160
|
+
log(JSON.stringify(err));
|
|
161
|
+
await tout(1000);
|
|
162
|
+
throw err;
|
|
163
|
+
}
|
|
138
164
|
});
|
|
139
165
|
|
|
140
166
|
}
|
|
@@ -205,7 +231,7 @@ export default async function client_only(db: DBHandlerClient, auth: Auth, log:
|
|
|
205
231
|
{ id: 1, public: 'public data' },
|
|
206
232
|
{ id: 2, public: 'public data' }
|
|
207
233
|
]);
|
|
208
|
-
});
|
|
234
|
+
}, log);
|
|
209
235
|
}
|
|
210
236
|
|
|
211
237
|
}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -22,19 +26,31 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
22
26
|
exports.tryRunP = exports.tryRun = void 0;
|
|
23
27
|
const assert_1 = require("assert");
|
|
24
28
|
const fs = __importStar(require("fs"));
|
|
25
|
-
async function tryRun(desc, func) {
|
|
29
|
+
async function tryRun(desc, func, log) {
|
|
26
30
|
try {
|
|
27
31
|
await func();
|
|
28
32
|
}
|
|
29
33
|
catch (err) {
|
|
30
34
|
console.error(desc + " FAILED:");
|
|
31
|
-
|
|
35
|
+
log?.("FAIL: ", err);
|
|
36
|
+
setTimeout(() => {
|
|
37
|
+
throw err;
|
|
38
|
+
}, 2000);
|
|
32
39
|
}
|
|
33
40
|
}
|
|
34
41
|
exports.tryRun = tryRun;
|
|
35
|
-
function tryRunP(desc, func) {
|
|
36
|
-
return new Promise((rv, rj) => {
|
|
37
|
-
|
|
42
|
+
function tryRunP(desc, func, log) {
|
|
43
|
+
return new Promise(async (rv, rj) => {
|
|
44
|
+
try {
|
|
45
|
+
await func(rv, rj);
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
log?.(JSON.stringify(err));
|
|
49
|
+
setTimeout(() => {
|
|
50
|
+
log?.("Throw err");
|
|
51
|
+
throw err;
|
|
52
|
+
}, 1000);
|
|
53
|
+
}
|
|
38
54
|
});
|
|
39
55
|
}
|
|
40
56
|
exports.tryRunP = tryRunP;
|
|
@@ -313,6 +329,27 @@ async function isomorphic(db) {
|
|
|
313
329
|
const res = await db.various.count({ "jsn->a->>b": '3' });
|
|
314
330
|
assert_1.strict.equal(res, 1);
|
|
315
331
|
});
|
|
332
|
+
await tryRun("Complex filtering", async () => {
|
|
333
|
+
const res = await db.various.count({
|
|
334
|
+
$and: [
|
|
335
|
+
{
|
|
336
|
+
$filter: [
|
|
337
|
+
{ $year: ["added"] },
|
|
338
|
+
"=",
|
|
339
|
+
'1996'
|
|
340
|
+
]
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
$filter: [
|
|
344
|
+
{ $Mon: ["added"] },
|
|
345
|
+
"=",
|
|
346
|
+
'Dec'
|
|
347
|
+
]
|
|
348
|
+
}
|
|
349
|
+
]
|
|
350
|
+
});
|
|
351
|
+
assert_1.strict.equal(res, 1);
|
|
352
|
+
});
|
|
316
353
|
await tryRun("template_string function", async () => {
|
|
317
354
|
const res = await db.various.findOne({ name: 'abc9' }, { select: { tstr: { $template_string: ["{name} is hehe"] } } });
|
|
318
355
|
const res2 = await db.various.findOne({ name: 'abc9' }, { select: { tstr: { $template_string: ["is hehe"] } } });
|