prostgles-server 4.2.77 → 4.2.78

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.
@@ -1 +1 @@
1
- {"version":3,"file":"initPubSubManager.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/initPubSubManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAA+B,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC7E,eAAO,MAAM,4BAA4B,oEAA8E,CAAC;AAGxH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA0K/F"}
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
- this.appCheck = setInterval(async () => {
41
- let checkForStaleTriggers = "";
42
- try {
43
- this.appChecking = true;
44
- const listeners = this.getActiveListeners();
45
- const updateCurrentlyUsedTriggersQuery = !listeners.length ? "" : `
46
- UPDATE prostgles.app_triggers
47
- SET last_used = CASE WHEN (table_name, condition) IN (
48
- ${listeners.map(l => ` ( ${(0, PubSubManager_1.asValue)(l.table_name)}, ${(0, PubSubManager_1.asValue)(l.condition)} ) `).join(", ")}
49
- ) THEN NOW() ELSE last_used END
50
- WHERE app_id = ${(0, PubSubManager_1.asValue)(this.appId)};
51
- `;
52
- const checkedListenerTableCond = listeners.map(l => `${l.table_name}.${l.condition}`);
53
- let dataTriggerCheckQuery = "";
54
- if (this.checkedListenerTableCond?.sort().join() !== checkedListenerTableCond.sort().join()) {
55
- this.checkedListenerTableCond = checkedListenerTableCond;
56
- dataTriggerCheckQuery = `
57
- /* Delete unused triggers. Might deadlock */
58
- IF EXISTS ( SELECT 1 FROM prostgles.app_triggers)
59
-
60
- THEN
61
-
62
- /* TODO: Fixed deadlocks */
63
- --LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
64
-
65
- /* UPDATE currently used triggers */
66
- ${updateCurrentlyUsedTriggersQuery}
67
-
68
- /* DELETE stale triggers for current app. Other triggers will be deleted on app startup
69
- DELETE FROM prostgles.app_triggers
70
- WHERE app_id = ${(0, PubSubManager_1.asValue)(this.appId)}
71
- AND last_used < NOW() - 4 * ${(0, PubSubManager_1.asValue)(this.appCheckFrequencyMS)} * interval '1 millisecond'; -- 10 seconds at the moment
72
- */
73
-
74
- END IF;
75
-
76
- `;
77
- }
78
- const queryIdentifier = "prostgles query used to keep track of which prgl backend clients are still connected";
79
- checkForStaleTriggers = `
80
- DO $$
81
- BEGIN
82
- /*
83
- ${queryIdentifier}
84
- ${exports.REALTIME_TRIGGER_CHECK_QUERY}
85
- ${PubSubManager_1.PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
86
- */
87
- /* prostgles schema must exist */
88
- IF
89
- EXISTS (
90
- SELECT 1
91
- FROM information_schema.tables
92
- WHERE table_schema = 'prostgles'
93
- AND table_name = 'apps'
94
- )
95
- THEN
96
-
97
- /* Last check used to remove disconnected apps */
98
- UPDATE prostgles.apps
99
- SET last_check = NOW()
100
- WHERE id = ${(0, PubSubManager_1.asValue)(this.appId)};
101
-
102
- ${dataTriggerCheckQuery}
103
- END IF;
104
-
105
- END $$;`;
106
- const queryTimeoutMillis = Math.min(5e3, Math.round(this.appCheckFrequencyMS / 2));
107
- const timeout = setTimeout(() => {
108
- this.db.any(`
109
- /*
110
- ${queryIdentifier}
111
- ${exports.REALTIME_TRIGGER_CHECK_QUERY}
112
- ${PubSubManager_1.PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
113
- */
114
- DO $$
115
- BEGIN
116
- /* PERFORM pg_sleep(\${queryTimeoutMillis}/1e3); */
117
- PERFORM pg_cancel_backend(pid)
118
- FROM pg_catalog.pg_stat_activity
119
- WHERE pid <> pg_backend_pid()
120
- AND query = \${queryIdentifier};
121
- END $$;
122
- `, { queryTimeoutMillis, queryIdentifier });
123
- }, queryTimeoutMillis);
124
- await this.db.any(checkForStaleTriggers);
125
- clearTimeout(timeout);
126
- tries = 5;
127
- (0, PubSubManager_1.log)("updated last_check");
128
- }
129
- catch (e) {
130
- tries--;
131
- /** In some cases a query idles and blocks everything else. Terminate all similar queries */
132
- this.db.any("SELECT state, pg_terminate_backend(pid) from pg_stat_activity \
133
- WHERE query ilike ${qid} \
134
- AND pid <> pg_backend_pid();", { qid: `%${exports.REALTIME_TRIGGER_CHECK_QUERY}%` });
135
- /** If no tries left
136
- * OR
137
- * If this database was dropped
138
- *
139
- * then stop interval
140
- * */
141
- if (tries <= 0 || e?.code === "3D000") { // && e.message.includes(this.db.$cn.database)
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":"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"}
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 { asValue, log, NOTIF_CHANNEL, PubSubManager } from "./PubSubManager";
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
- this.appCheck = setInterval(async () => {
47
- let checkForStaleTriggers = "";
48
- try {
45
+ // this.appCheck = setInterval(async () => {
46
+ // let checkForStaleTriggers = "";
47
+ // try {
49
48
 
50
- this.appChecking = true;
49
+ // this.appChecking = true;
51
50
 
52
- const listeners = this.getActiveListeners();
53
- const updateCurrentlyUsedTriggersQuery = !listeners.length? "" : `
54
- UPDATE prostgles.app_triggers
55
- SET last_used = CASE WHEN (table_name, condition) IN (
56
- ${listeners.map(l => ` ( ${asValue(l.table_name)}, ${asValue(l.condition)} ) `).join(", ")}
57
- ) THEN NOW() ELSE last_used END
58
- WHERE app_id = ${asValue(this.appId)};
59
- `;
60
-
61
- const checkedListenerTableCond = listeners.map(l => `${l.table_name}.${l.condition}`);
62
- let dataTriggerCheckQuery = "";
63
- if(this.checkedListenerTableCond?.sort().join() !== checkedListenerTableCond.sort().join()){
64
- this.checkedListenerTableCond = checkedListenerTableCond;
65
- dataTriggerCheckQuery = `
66
- /* Delete unused triggers. Might deadlock */
67
- IF EXISTS ( SELECT 1 FROM prostgles.app_triggers)
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
- THEN
68
+ // THEN
70
69
 
71
- /* TODO: Fixed deadlocks */
72
- --LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
70
+ // /* TODO: Fixed deadlocks */
71
+ // --LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
73
72
 
74
- /* UPDATE currently used triggers */
75
- ${updateCurrentlyUsedTriggersQuery}
73
+ // /* UPDATE currently used triggers */
74
+ // ${updateCurrentlyUsedTriggersQuery}
76
75
 
77
- /* DELETE stale triggers for current app. Other triggers will be deleted on app startup
78
- DELETE FROM prostgles.app_triggers
79
- WHERE app_id = ${asValue(this.appId)}
80
- AND last_used < NOW() - 4 * ${asValue(this.appCheckFrequencyMS)} * interval '1 millisecond'; -- 10 seconds at the moment
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
- END IF;
82
+ // END IF;
84
83
 
85
- `
86
- }
87
-
88
- const queryIdentifier = "prostgles query used to keep track of which prgl backend clients are still connected"
89
- checkForStaleTriggers = `
90
- DO $$
91
- BEGIN
92
- /*
93
- ${queryIdentifier}
94
- ${REALTIME_TRIGGER_CHECK_QUERY}
95
- ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
96
- */
97
- /* prostgles schema must exist */
98
- IF
99
- EXISTS (
100
- SELECT 1
101
- FROM information_schema.tables
102
- WHERE table_schema = 'prostgles'
103
- AND table_name = 'apps'
104
- )
105
- THEN
106
-
107
- /* Last check used to remove disconnected apps */
108
- UPDATE prostgles.apps
109
- SET last_check = NOW()
110
- WHERE id = ${asValue(this.appId)};
111
-
112
- ${dataTriggerCheckQuery}
113
- END IF;
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
- END $$;`
116
-
117
- const queryTimeoutMillis = Math.min(5e3, Math.round(this.appCheckFrequencyMS/2));
118
- const timeout = setTimeout(() => {
119
- this.db.any(`
120
- /*
121
- ${queryIdentifier}
122
- ${REALTIME_TRIGGER_CHECK_QUERY}
123
- ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
124
- */
125
- DO $$
126
- BEGIN
127
- /* PERFORM pg_sleep(\${queryTimeoutMillis}/1e3); */
128
- PERFORM pg_cancel_backend(pid)
129
- FROM pg_catalog.pg_stat_activity
130
- WHERE pid <> pg_backend_pid()
131
- AND query = \${queryIdentifier};
132
- END $$;
133
- `, { queryTimeoutMillis, queryIdentifier })
134
- }, queryTimeoutMillis);
135
- await this.db.any(checkForStaleTriggers);
136
- clearTimeout(timeout);
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
- tries = 5;
139
- log("updated last_check");
140
- } catch (e: any) {
141
- tries --;
142
-
143
- /** In some cases a query idles and blocks everything else. Terminate all similar queries */
144
- this.db.any(
145
- "SELECT state, pg_terminate_backend(pid) from pg_stat_activity \
146
- WHERE query ilike ${qid} \
147
- AND pid <> pg_backend_pid();",
148
- { qid: `%${REALTIME_TRIGGER_CHECK_QUERY}%` }
149
- );
150
-
151
- /** If no tries left
152
- * OR
153
- * If this database was dropped
154
- *
155
- * then stop interval
156
- * */
157
- if(tries <= 0 || e?.code === "3D000"){ // && e.message.includes(this.db.$cn.database)
158
- clearInterval(this.appCheck);
159
- }
160
- console.error("appCheck FAILED: \n", e, checkForStaleTriggers);
161
- }
162
-
163
- this.appChecking = false;
164
- }, 0.8 * this.appCheckFrequencyMS);
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.77",
3
+ "version": "4.2.78",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "../..": {
23
23
  "name": "prostgles-server",
24
- "version": "4.2.76",
24
+ "version": "4.2.77",
25
25
  "license": "MIT",
26
26
  "dependencies": {
27
27
  "bluebird": "^3.7.2",