prostgles-server 4.2.77 → 4.2.79
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/initPubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/initPubSubManager.js +105 -113
- package/dist/PubSubManager/initPubSubManager.js.map +1 -1
- package/lib/PubSubManager/initPubSubManager.ts +114 -115
- package/package.json +3 -3
- package/tests/server/package-lock.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initPubSubManager.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"initPubSubManager.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,aAAa,EAAW,MAAM,iBAAiB,CAAC;AAExE,eAAO,MAAM,4BAA4B,oEAA8E,CAAC;AAExH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAyK/F"}
|
|
@@ -4,12 +4,11 @@ exports.initPubSubManager = exports.REALTIME_TRIGGER_CHECK_QUERY = void 0;
|
|
|
4
4
|
const PostgresNotifListenManager_1 = require("../PostgresNotifListenManager");
|
|
5
5
|
const getWatchSchemaTagList_1 = require("../SchemaWatch/getWatchSchemaTagList");
|
|
6
6
|
const PubSubManager_1 = require("./PubSubManager");
|
|
7
|
-
exports.REALTIME_TRIGGER_CHECK_QUERY = "prostgles-server internal query used to manage realtime triggers";
|
|
8
7
|
const getInitQuery_1 = require("./getInitQuery");
|
|
8
|
+
exports.REALTIME_TRIGGER_CHECK_QUERY = "prostgles-server internal query used to manage realtime triggers";
|
|
9
9
|
async function initPubSubManager() {
|
|
10
10
|
if (!this.getIsDestroyed())
|
|
11
11
|
return undefined;
|
|
12
|
-
let tries = 5;
|
|
13
12
|
try {
|
|
14
13
|
const initQuery = await getInitQuery_1.getInitQuery.bind(this)();
|
|
15
14
|
await this.db.any(initQuery);
|
|
@@ -35,117 +34,110 @@ async function initPubSubManager() {
|
|
|
35
34
|
DELETE FROM prostgles.app_triggers
|
|
36
35
|
WHERE app_id = ${(0, PubSubManager_1.asValue)(this.appId)}
|
|
37
36
|
`);
|
|
38
|
-
console.log("REMOVE app check disabled");
|
|
39
|
-
if (!this.appCheck && Math.random() > 12) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
`;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
clearInterval(this.appCheck);
|
|
143
|
-
}
|
|
144
|
-
console.error("appCheck FAILED: \n", e, checkForStaleTriggers);
|
|
145
|
-
}
|
|
146
|
-
this.appChecking = false;
|
|
147
|
-
}, 0.8 * this.appCheckFrequencyMS);
|
|
148
|
-
}
|
|
37
|
+
// console.log("REMOVE app check disabled");
|
|
38
|
+
// if (!this.appCheck && Math.random() > 12) {
|
|
39
|
+
// this.appCheck = setInterval(async () => {
|
|
40
|
+
// let checkForStaleTriggers = "";
|
|
41
|
+
// try {
|
|
42
|
+
// this.appChecking = true;
|
|
43
|
+
// const listeners = this.getActiveListeners();
|
|
44
|
+
// const updateCurrentlyUsedTriggersQuery = !listeners.length? "" : `
|
|
45
|
+
// UPDATE prostgles.app_triggers
|
|
46
|
+
// SET last_used = CASE WHEN (table_name, condition) IN (
|
|
47
|
+
// ${listeners.map(l => ` ( ${asValue(l.table_name)}, ${asValue(l.condition)} ) `).join(", ")}
|
|
48
|
+
// ) THEN NOW() ELSE last_used END
|
|
49
|
+
// WHERE app_id = ${asValue(this.appId)};
|
|
50
|
+
// `;
|
|
51
|
+
// const checkedListenerTableCond = listeners.map(l => `${l.table_name}.${l.condition}`);
|
|
52
|
+
// let dataTriggerCheckQuery = "";
|
|
53
|
+
// if(this.checkedListenerTableCond?.sort().join() !== checkedListenerTableCond.sort().join()){
|
|
54
|
+
// this.checkedListenerTableCond = checkedListenerTableCond;
|
|
55
|
+
// dataTriggerCheckQuery = `
|
|
56
|
+
// /* Delete unused triggers. Might deadlock */
|
|
57
|
+
// IF EXISTS ( SELECT 1 FROM prostgles.app_triggers)
|
|
58
|
+
// THEN
|
|
59
|
+
// /* TODO: Fixed deadlocks */
|
|
60
|
+
// --LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
|
|
61
|
+
// /* UPDATE currently used triggers */
|
|
62
|
+
// ${updateCurrentlyUsedTriggersQuery}
|
|
63
|
+
// /* DELETE stale triggers for current app. Other triggers will be deleted on app startup
|
|
64
|
+
// DELETE FROM prostgles.app_triggers
|
|
65
|
+
// WHERE app_id = ${asValue(this.appId)}
|
|
66
|
+
// AND last_used < NOW() - 4 * ${asValue(this.appCheckFrequencyMS)} * interval '1 millisecond'; -- 10 seconds at the moment
|
|
67
|
+
// */
|
|
68
|
+
// END IF;
|
|
69
|
+
// `
|
|
70
|
+
// }
|
|
71
|
+
// const queryIdentifier = "prostgles query used to keep track of which prgl backend clients are still connected"
|
|
72
|
+
// checkForStaleTriggers = `
|
|
73
|
+
// DO $$
|
|
74
|
+
// BEGIN
|
|
75
|
+
// /*
|
|
76
|
+
// ${queryIdentifier}
|
|
77
|
+
// ${REALTIME_TRIGGER_CHECK_QUERY}
|
|
78
|
+
// ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
|
|
79
|
+
// */
|
|
80
|
+
// /* prostgles schema must exist */
|
|
81
|
+
// IF
|
|
82
|
+
// EXISTS (
|
|
83
|
+
// SELECT 1
|
|
84
|
+
// FROM information_schema.tables
|
|
85
|
+
// WHERE table_schema = 'prostgles'
|
|
86
|
+
// AND table_name = 'apps'
|
|
87
|
+
// )
|
|
88
|
+
// THEN
|
|
89
|
+
// /* Last check used to remove disconnected apps */
|
|
90
|
+
// UPDATE prostgles.apps
|
|
91
|
+
// SET last_check = NOW()
|
|
92
|
+
// WHERE id = ${asValue(this.appId)};
|
|
93
|
+
// ${dataTriggerCheckQuery}
|
|
94
|
+
// END IF;
|
|
95
|
+
// END $$;`
|
|
96
|
+
// const queryTimeoutMillis = Math.min(5e3, Math.round(this.appCheckFrequencyMS/2));
|
|
97
|
+
// const timeout = setTimeout(() => {
|
|
98
|
+
// this.db.any(`
|
|
99
|
+
// /*
|
|
100
|
+
// ${queryIdentifier}
|
|
101
|
+
// ${REALTIME_TRIGGER_CHECK_QUERY}
|
|
102
|
+
// ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
|
|
103
|
+
// */
|
|
104
|
+
// DO $$
|
|
105
|
+
// BEGIN
|
|
106
|
+
// /* PERFORM pg_sleep(\${queryTimeoutMillis}/1e3); */
|
|
107
|
+
// PERFORM pg_cancel_backend(pid)
|
|
108
|
+
// FROM pg_catalog.pg_stat_activity
|
|
109
|
+
// WHERE pid <> pg_backend_pid()
|
|
110
|
+
// AND query = \${queryIdentifier};
|
|
111
|
+
// END $$;
|
|
112
|
+
// `, { queryTimeoutMillis, queryIdentifier })
|
|
113
|
+
// }, queryTimeoutMillis);
|
|
114
|
+
// await this.db.any(checkForStaleTriggers);
|
|
115
|
+
// clearTimeout(timeout);
|
|
116
|
+
// tries = 5;
|
|
117
|
+
// log("updated last_check");
|
|
118
|
+
// } catch (e: any) {
|
|
119
|
+
// tries --;
|
|
120
|
+
// /** In some cases a query idles and blocks everything else. Terminate all similar queries */
|
|
121
|
+
// this.db.any(
|
|
122
|
+
// "SELECT state, pg_terminate_backend(pid) from pg_stat_activity \
|
|
123
|
+
// WHERE query ilike ${qid} \
|
|
124
|
+
// AND pid <> pg_backend_pid();",
|
|
125
|
+
// { qid: `%${REALTIME_TRIGGER_CHECK_QUERY}%` }
|
|
126
|
+
// );
|
|
127
|
+
// /** If no tries left
|
|
128
|
+
// * OR
|
|
129
|
+
// * If this database was dropped
|
|
130
|
+
// *
|
|
131
|
+
// * then stop interval
|
|
132
|
+
// * */
|
|
133
|
+
// if(tries <= 0 || e?.code === "3D000"){ // && e.message.includes(this.db.$cn.database)
|
|
134
|
+
// clearInterval(this.appCheck);
|
|
135
|
+
// }
|
|
136
|
+
// console.error("appCheck FAILED: \n", e, checkForStaleTriggers);
|
|
137
|
+
// }
|
|
138
|
+
// this.appChecking = false;
|
|
139
|
+
// }, 0.8 * this.appCheckFrequencyMS);
|
|
140
|
+
// }
|
|
149
141
|
}
|
|
150
142
|
this.postgresNotifListenManager = new PostgresNotifListenManager_1.PostgresNotifListenManager(this.db, this.notifListener, PubSubManager_1.NOTIF_CHANNEL.getFull(this.appId));
|
|
151
143
|
await this.initialiseEventTriggers();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initPubSubManager.js","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":";;;AAAA,8EAA2E;AAC3E,gFAA6E;AAC7E,
|
|
1
|
+
{"version":3,"file":"initPubSubManager.js","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { PostgresNotifListenManager } from "../PostgresNotifListenManager";
|
|
2
2
|
import { getWatchSchemaTagList } from "../SchemaWatch/getWatchSchemaTagList";
|
|
3
|
-
import {
|
|
4
|
-
export const REALTIME_TRIGGER_CHECK_QUERY = "prostgles-server internal query used to manage realtime triggers" as const;
|
|
3
|
+
import { NOTIF_CHANNEL, PubSubManager, asValue } from "./PubSubManager";
|
|
5
4
|
import { getInitQuery } from "./getInitQuery";
|
|
5
|
+
export const REALTIME_TRIGGER_CHECK_QUERY = "prostgles-server internal query used to manage realtime triggers" as const;
|
|
6
6
|
|
|
7
7
|
export async function initPubSubManager(this: PubSubManager): Promise<PubSubManager | undefined> {
|
|
8
8
|
if (!this.getIsDestroyed()) return undefined;
|
|
9
9
|
|
|
10
|
-
let tries = 5;
|
|
11
10
|
try {
|
|
12
11
|
|
|
13
12
|
const initQuery = await getInitQuery.bind(this)()
|
|
@@ -40,129 +39,129 @@ export async function initPubSubManager(this: PubSubManager): Promise<PubSubMana
|
|
|
40
39
|
WHERE app_id = ${asValue(this.appId)}
|
|
41
40
|
`);
|
|
42
41
|
|
|
43
|
-
console.log("REMOVE app check disabled");
|
|
44
|
-
if (!this.appCheck && Math.random() > 12) {
|
|
42
|
+
// console.log("REMOVE app check disabled");
|
|
43
|
+
// if (!this.appCheck && Math.random() > 12) {
|
|
45
44
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
// this.appCheck = setInterval(async () => {
|
|
46
|
+
// let checkForStaleTriggers = "";
|
|
47
|
+
// try {
|
|
49
48
|
|
|
50
|
-
|
|
49
|
+
// this.appChecking = true;
|
|
51
50
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
51
|
+
// const listeners = this.getActiveListeners();
|
|
52
|
+
// const updateCurrentlyUsedTriggersQuery = !listeners.length? "" : `
|
|
53
|
+
// UPDATE prostgles.app_triggers
|
|
54
|
+
// SET last_used = CASE WHEN (table_name, condition) IN (
|
|
55
|
+
// ${listeners.map(l => ` ( ${asValue(l.table_name)}, ${asValue(l.condition)} ) `).join(", ")}
|
|
56
|
+
// ) THEN NOW() ELSE last_used END
|
|
57
|
+
// WHERE app_id = ${asValue(this.appId)};
|
|
58
|
+
// `;
|
|
59
|
+
|
|
60
|
+
// const checkedListenerTableCond = listeners.map(l => `${l.table_name}.${l.condition}`);
|
|
61
|
+
// let dataTriggerCheckQuery = "";
|
|
62
|
+
// if(this.checkedListenerTableCond?.sort().join() !== checkedListenerTableCond.sort().join()){
|
|
63
|
+
// this.checkedListenerTableCond = checkedListenerTableCond;
|
|
64
|
+
// dataTriggerCheckQuery = `
|
|
65
|
+
// /* Delete unused triggers. Might deadlock */
|
|
66
|
+
// IF EXISTS ( SELECT 1 FROM prostgles.app_triggers)
|
|
68
67
|
|
|
69
|
-
|
|
68
|
+
// THEN
|
|
70
69
|
|
|
71
|
-
|
|
72
|
-
|
|
70
|
+
// /* TODO: Fixed deadlocks */
|
|
71
|
+
// --LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
|
|
73
72
|
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
// /* UPDATE currently used triggers */
|
|
74
|
+
// ${updateCurrentlyUsedTriggersQuery}
|
|
76
75
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
76
|
+
// /* DELETE stale triggers for current app. Other triggers will be deleted on app startup
|
|
77
|
+
// DELETE FROM prostgles.app_triggers
|
|
78
|
+
// WHERE app_id = ${asValue(this.appId)}
|
|
79
|
+
// AND last_used < NOW() - 4 * ${asValue(this.appCheckFrequencyMS)} * interval '1 millisecond'; -- 10 seconds at the moment
|
|
80
|
+
// */
|
|
82
81
|
|
|
83
|
-
|
|
82
|
+
// END IF;
|
|
84
83
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
84
|
+
// `
|
|
85
|
+
// }
|
|
86
|
+
|
|
87
|
+
// const queryIdentifier = "prostgles query used to keep track of which prgl backend clients are still connected"
|
|
88
|
+
// checkForStaleTriggers = `
|
|
89
|
+
// DO $$
|
|
90
|
+
// BEGIN
|
|
91
|
+
// /*
|
|
92
|
+
// ${queryIdentifier}
|
|
93
|
+
// ${REALTIME_TRIGGER_CHECK_QUERY}
|
|
94
|
+
// ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
|
|
95
|
+
// */
|
|
96
|
+
// /* prostgles schema must exist */
|
|
97
|
+
// IF
|
|
98
|
+
// EXISTS (
|
|
99
|
+
// SELECT 1
|
|
100
|
+
// FROM information_schema.tables
|
|
101
|
+
// WHERE table_schema = 'prostgles'
|
|
102
|
+
// AND table_name = 'apps'
|
|
103
|
+
// )
|
|
104
|
+
// THEN
|
|
105
|
+
|
|
106
|
+
// /* Last check used to remove disconnected apps */
|
|
107
|
+
// UPDATE prostgles.apps
|
|
108
|
+
// SET last_check = NOW()
|
|
109
|
+
// WHERE id = ${asValue(this.appId)};
|
|
110
|
+
|
|
111
|
+
// ${dataTriggerCheckQuery}
|
|
112
|
+
// END IF;
|
|
114
113
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
114
|
+
// END $$;`
|
|
115
|
+
|
|
116
|
+
// const queryTimeoutMillis = Math.min(5e3, Math.round(this.appCheckFrequencyMS/2));
|
|
117
|
+
// const timeout = setTimeout(() => {
|
|
118
|
+
// this.db.any(`
|
|
119
|
+
// /*
|
|
120
|
+
// ${queryIdentifier}
|
|
121
|
+
// ${REALTIME_TRIGGER_CHECK_QUERY}
|
|
122
|
+
// ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
|
|
123
|
+
// */
|
|
124
|
+
// DO $$
|
|
125
|
+
// BEGIN
|
|
126
|
+
// /* PERFORM pg_sleep(\${queryTimeoutMillis}/1e3); */
|
|
127
|
+
// PERFORM pg_cancel_backend(pid)
|
|
128
|
+
// FROM pg_catalog.pg_stat_activity
|
|
129
|
+
// WHERE pid <> pg_backend_pid()
|
|
130
|
+
// AND query = \${queryIdentifier};
|
|
131
|
+
// END $$;
|
|
132
|
+
// `, { queryTimeoutMillis, queryIdentifier })
|
|
133
|
+
// }, queryTimeoutMillis);
|
|
134
|
+
// await this.db.any(checkForStaleTriggers);
|
|
135
|
+
// clearTimeout(timeout);
|
|
137
136
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}
|
|
137
|
+
// tries = 5;
|
|
138
|
+
// log("updated last_check");
|
|
139
|
+
// } catch (e: any) {
|
|
140
|
+
// tries --;
|
|
141
|
+
|
|
142
|
+
// /** In some cases a query idles and blocks everything else. Terminate all similar queries */
|
|
143
|
+
// this.db.any(
|
|
144
|
+
// "SELECT state, pg_terminate_backend(pid) from pg_stat_activity \
|
|
145
|
+
// WHERE query ilike ${qid} \
|
|
146
|
+
// AND pid <> pg_backend_pid();",
|
|
147
|
+
// { qid: `%${REALTIME_TRIGGER_CHECK_QUERY}%` }
|
|
148
|
+
// );
|
|
149
|
+
|
|
150
|
+
// /** If no tries left
|
|
151
|
+
// * OR
|
|
152
|
+
// * If this database was dropped
|
|
153
|
+
// *
|
|
154
|
+
// * then stop interval
|
|
155
|
+
// * */
|
|
156
|
+
// if(tries <= 0 || e?.code === "3D000"){ // && e.message.includes(this.db.$cn.database)
|
|
157
|
+
// clearInterval(this.appCheck);
|
|
158
|
+
// }
|
|
159
|
+
// console.error("appCheck FAILED: \n", e, checkForStaleTriggers);
|
|
160
|
+
// }
|
|
161
|
+
|
|
162
|
+
// this.appChecking = false;
|
|
163
|
+
// }, 0.8 * this.appCheckFrequencyMS);
|
|
164
|
+
// }
|
|
166
165
|
}
|
|
167
166
|
|
|
168
167
|
this.postgresNotifListenManager = new PostgresNotifListenManager(this.db, this.notifListener, NOTIF_CHANNEL.getFull(this.appId));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prostgles-server",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.79",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -53,8 +53,8 @@
|
|
|
53
53
|
"@types/pg": "^8.11.5",
|
|
54
54
|
"@types/pg-cursor": "^2.7.2",
|
|
55
55
|
"@types/sharp": "^0.30.4",
|
|
56
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
57
|
-
"@typescript-eslint/parser": "^
|
|
56
|
+
"@typescript-eslint/eslint-plugin": "^7.14.1",
|
|
57
|
+
"@typescript-eslint/parser": "^7.14.1",
|
|
58
58
|
"eslint": "^8.51.0",
|
|
59
59
|
"socket.io": "^4.7.5",
|
|
60
60
|
"typescript": "^5.3.3"
|