prostgles-server 4.2.234 → 4.2.236

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 (46) hide show
  1. package/dist/Auth/AuthTypes.d.ts +2 -2
  2. package/dist/Auth/AuthTypes.d.ts.map +1 -1
  3. package/dist/Auth/endpoints/setMagicLinkOrOTPRequestHandler.d.ts.map +1 -1
  4. package/dist/Auth/endpoints/setMagicLinkOrOTPRequestHandler.js +49 -47
  5. package/dist/Auth/endpoints/setMagicLinkOrOTPRequestHandler.js.map +1 -1
  6. package/dist/Auth/endpoints/setRegisterRequestHandler.js +1 -1
  7. package/dist/Auth/endpoints/setRegisterRequestHandler.js.map +1 -1
  8. package/dist/DboBuilder/ViewHandler/subscribe.d.ts.map +1 -1
  9. package/dist/DboBuilder/ViewHandler/subscribe.js.map +1 -1
  10. package/dist/Logging.d.ts +6 -3
  11. package/dist/Logging.d.ts.map +1 -1
  12. package/dist/PubSubManager/PubSubManager.d.ts +12 -3
  13. package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
  14. package/dist/PubSubManager/PubSubManager.js +20 -237
  15. package/dist/PubSubManager/PubSubManager.js.map +1 -1
  16. package/dist/PubSubManager/addTrigger.d.ts +21 -0
  17. package/dist/PubSubManager/addTrigger.d.ts.map +1 -0
  18. package/dist/PubSubManager/addTrigger.js +83 -0
  19. package/dist/PubSubManager/addTrigger.js.map +1 -0
  20. package/dist/PubSubManager/deleteOrphanedTriggers.d.ts +3 -0
  21. package/dist/PubSubManager/deleteOrphanedTriggers.d.ts.map +1 -0
  22. package/dist/PubSubManager/deleteOrphanedTriggers.js +32 -0
  23. package/dist/PubSubManager/deleteOrphanedTriggers.js.map +1 -0
  24. package/dist/PubSubManager/initialiseEventTriggers.d.ts +3 -0
  25. package/dist/PubSubManager/initialiseEventTriggers.d.ts.map +1 -0
  26. package/dist/PubSubManager/initialiseEventTriggers.js +150 -0
  27. package/dist/PubSubManager/initialiseEventTriggers.js.map +1 -0
  28. package/dist/PubSubManager/notifListener.d.ts.map +1 -1
  29. package/dist/PubSubManager/notifListener.js +5 -26
  30. package/dist/PubSubManager/notifListener.js.map +1 -1
  31. package/dist/PubSubManager/refreshTriggers.d.ts +3 -0
  32. package/dist/PubSubManager/refreshTriggers.d.ts.map +1 -0
  33. package/dist/PubSubManager/refreshTriggers.js +31 -0
  34. package/dist/PubSubManager/refreshTriggers.js.map +1 -0
  35. package/lib/Auth/AuthTypes.ts +2 -2
  36. package/lib/Auth/endpoints/setMagicLinkOrOTPRequestHandler.ts +48 -48
  37. package/lib/Auth/endpoints/setRegisterRequestHandler.ts +1 -1
  38. package/lib/DboBuilder/ViewHandler/subscribe.ts +0 -1
  39. package/lib/Logging.ts +7 -3
  40. package/lib/PubSubManager/PubSubManager.ts +27 -266
  41. package/lib/PubSubManager/addTrigger.ts +94 -0
  42. package/lib/PubSubManager/deleteOrphanedTriggers.ts +31 -0
  43. package/lib/PubSubManager/initialiseEventTriggers.ts +156 -0
  44. package/lib/PubSubManager/notifListener.ts +5 -29
  45. package/lib/PubSubManager/refreshTriggers.ts +38 -0
  46. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initialiseEventTriggers.js","sourceRoot":"","sources":["../../lib/PubSubManager/initialiseEventTriggers.ts"],"names":[],"mappings":";;;AAAA,kCAAkC;AAClC,mDAAgD;AAChD,4CAA8C;AAC9C,8DAA2D;AAC3D,6DAAsE;AACtE,2EAA2D;AAE3D,MAAM,OAAO,GAAG,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9C,KAAK,UAAU,uBAAuB;IAC3C,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC;IACvD,IAAI,WAAW,IAAI,CAAC,CAAC,MAAM,IAAA,0BAAc,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,IAAI,CACV,uFAAuF,CACxF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,qEAAqE;QACrE,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;QACxF,MAAM,gBAAgB,GACpB,aAAa,CAAC,MAAM,CAAC,CAAC;YACpB,yBAAyB,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YACzF,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,MAAM,CACzB;;;;aAIO,6BAAa,CAAC,kCAAkC;;;;;;;;;;;;;;;cAe/C,mDAA8B;;;;cAI9B,gBAAgB;;;;;;;;;;;;;;;;;;;kBAmBZ,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;;;cAGrC,gCAAgC;;;;;;;OAOvC,EACD,EAAE,kBAAkB,EAAlB,uCAAkB,EAAE,CACvB,CAAC;QAEF,MAAM,IAAI,CAAC,EAAE;aACV,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aACvB,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE;YAChB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;QAEL,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AApFD,0DAoFC;AAED,MAAM,gCAAgC,GAAG;;;;;;;;;;;;;;;;;;;sBAmBnB,OAAO,CAAC,wCAAY,CAAC,oBAAoB,CAAC;;;;;;;;;;;;;;;YAepD,OAAO,CAAC,wCAAY,CAAC,oBAAoB,CAAC;YAC1C,OAAO,CAAC,wCAAY,CAAC,yBAAyB,CAAC;;;;;;;;;;;;qCAYtB,wCAAY,CAAC,oBAAoB;6BACzC,wCAAY,CAAC,oBAAoB;;;0BAGpC,wCAAY,CAAC,iBAAiB;;qCAEnB,wCAAY,CAAC,yBAAyB;6BAC9C,wCAAY,CAAC,yBAAyB;;;0BAGzC,wCAAY,CAAC,iBAAiB;;;CAGvD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"notifListener.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/notifListener.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG1F,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,iBAkMjF"}
1
+ {"version":3,"file":"notifListener.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/notifListener.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG1F,wBAAsB,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,iBA0KjF"}
@@ -62,11 +62,11 @@ async function notifListener(data) {
62
62
  if (!table_name) {
63
63
  throw "table_name undef";
64
64
  }
65
- const tableTriggerConditions = this._triggers?.[table_name]?.map((condition, idx) => ({
65
+ const tableTriggerConditions = this._triggers?.[table_name]?.map((cond, idx) => ({
66
66
  idx,
67
- condition,
68
- subs: this.getTriggerSubs(table_name, condition),
69
- syncs: this.getSyncs(table_name, condition),
67
+ ...cond,
68
+ subs: this.getTriggerSubs(table_name, cond.condition),
69
+ syncs: this.getSyncs(table_name, cond.condition),
70
70
  }));
71
71
  let state = "ok";
72
72
  // const triggers = await this.db.any("SELECT * FROM prostgles.triggers WHERE table_name = $1 AND id IN ($2:csv)", [table_name, condition_ids_str.split(",").map(v => +v)]);
@@ -95,28 +95,7 @@ async function notifListener(data) {
95
95
  return !tc || (tc.subs.length === 0 && tc.syncs.length === 0);
96
96
  });
97
97
  if (orphanedTableConditions.length) {
98
- this.db
99
- .any(`
100
- /* Delete removed subscriptions */
101
- /* ${PubSubManager_1.PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID} */
102
- DELETE FROM prostgles.app_triggers at
103
- WHERE EXISTS (
104
- SELECT 1
105
- FROM prostgles.v_triggers t
106
- WHERE t.table_name = $1
107
- AND t.c_id IN ($2:csv)
108
- AND t.app_id = $3
109
- AND at.app_id = t.app_id
110
- AND at.table_name = t.table_name
111
- AND at.condition = t.condition
112
- )
113
- `, [table_name, orphanedTableConditions, this.appId])
114
- .then(() => {
115
- return this.refreshTriggers();
116
- })
117
- .catch((e) => {
118
- console.error("Error deleting orphaned triggers", e);
119
- });
98
+ void this.deleteOrphanedTriggers.bind(this)(table_name);
120
99
  }
121
100
  firedTableConditions.map(({ subs, syncs }) => {
122
101
  (0, PubSubManager_1.log)("notifListener", subs.map((s) => s.channel_name), syncs.map((s) => s.channel_name));
@@ -1 +1 @@
1
- {"version":3,"file":"notifListener.js","sourceRoot":"","sources":["../../lib/PubSubManager/notifListener.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"notifListener.js","sourceRoot":"","sources":["../../lib/PubSubManager/notifListener.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PubSubManager } from "./PubSubManager";
2
+ export declare function refreshTriggers(this: PubSubManager): Promise<void>;
3
+ //# sourceMappingURL=refreshTriggers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refreshTriggers.d.ts","sourceRoot":"","sources":["../../lib/PubSubManager/refreshTriggers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,wBAAsB,eAAe,CAAC,IAAI,EAAE,aAAa,iBAmCxD"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.refreshTriggers = void 0;
4
+ async function refreshTriggers() {
5
+ const start = Date.now();
6
+ const triggers = await this.db.any(`
7
+ SELECT *
8
+ FROM prostgles.v_triggers
9
+ WHERE app_id = $1
10
+ ORDER BY table_name, condition
11
+ `, [this.dboBuilder.prostgles.appId]);
12
+ const oldTriggers = { ...this._triggers };
13
+ this._triggers = {};
14
+ triggers.map((t) => {
15
+ this._triggers ??= {};
16
+ this._triggers[t.table_name] ??= [];
17
+ if (!this._triggers[t.table_name]?.map((t) => t.condition).includes(t.condition)) {
18
+ this._triggers[t.table_name]?.push({ condition: t.condition, hash: t.condition_hash });
19
+ }
20
+ });
21
+ await this._log({
22
+ type: "syncOrSub",
23
+ command: "refreshTriggers",
24
+ duration: Date.now() - start,
25
+ connectedSocketIds: this.connectedSocketIds,
26
+ triggers: this._triggers,
27
+ oldTriggers,
28
+ });
29
+ }
30
+ exports.refreshTriggers = refreshTriggers;
31
+ //# sourceMappingURL=refreshTriggers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refreshTriggers.js","sourceRoot":"","sources":["../../lib/PubSubManager/refreshTriggers.ts"],"names":[],"mappings":";;;AAEO,KAAK,UAAU,eAAe;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,MAAM,QAAQ,GAIR,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CACrB;;;;;OAKG,EACH,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAClC,CAAC;IAEF,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAE1C,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IACpB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACjB,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;YACjF,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;QACzF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,IAAI,CAAC;QACd,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,iBAAiB;QAC1B,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;QAC5B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,QAAQ,EAAE,IAAI,CAAC,SAAS;QACxB,WAAW;KACZ,CAAC,CAAC;AACL,CAAC;AAnCD,0CAmCC"}
@@ -343,8 +343,8 @@ export type LoginResponse =
343
343
  | AuthResponse.MagicLinkAuthFailure["code"];
344
344
 
345
345
  export type MagicLinkOrOTPData =
346
- | { type: "magic-link"; id: string; returnToken?: boolean }
347
- | { type: "otp"; code: string; email: string; returnToken?: boolean };
346
+ | { type: "magic-link"; id: string; returnToken: boolean }
347
+ | { type: "otp"; code: string; email: string; returnToken: boolean };
348
348
 
349
349
  export const getMagicLinkUrl = (websiteUrl: string, data: MagicLinkOrOTPData) => {
350
350
  if (data.type === "magic-link") {
@@ -62,61 +62,61 @@ export function setMagicLinkOrOTPRequestHandler(
62
62
  .status(HTTP_FAIL_CODES.BAD_REQUEST)
63
63
  .json({ success: false, code: "invalid-magic-link", message: "Invalid magic link" });
64
64
  }
65
- return handler(req, res, { type: "magic-link", id: id });
65
+ return handler(req, res, { type: "magic-link", id, returnToken: false });
66
66
  });
67
67
 
68
68
  app.get(AUTH_ROUTES_AND_PARAMS.magicLinks, (req, res: MagicLinkResponseHandler) => {
69
- const { id, code, email, returnToken = false } = req.query;
69
+ const data = parseMagicLinkOrOTPData(res, req.query);
70
+ if (!data) return;
71
+ return handler(req, res, data);
72
+ });
70
73
 
71
- if (typeof returnToken !== "boolean") {
72
- return res.status(HTTP_FAIL_CODES.BAD_REQUEST).json({
74
+ app.post(AUTH_ROUTES_AND_PARAMS.magicLinks, (req, res: MagicLinkResponseHandler) => {
75
+ const data = parseMagicLinkOrOTPData(res, req.body);
76
+ if (!data) return;
77
+ return handler(req, res, data);
78
+ });
79
+ }
80
+
81
+ const parseMagicLinkOrOTPData = (res: Response, data: any): MagicLinkOrOTPData | undefined => {
82
+ const { id, code, email, returnToken = false } = data;
83
+
84
+ if (typeof returnToken !== "boolean") {
85
+ res.status(HTTP_FAIL_CODES.BAD_REQUEST).json({
86
+ success: false,
87
+ code: "something-went-wrong",
88
+ message: "Invalid magic link request. Must provide returnToken must be of type boolean",
89
+ });
90
+ return;
91
+ }
92
+ const noCode = typeof code !== "string" || !code;
93
+ const noEmail = typeof email !== "string" || !email;
94
+ if (typeof id !== "string" || !id) {
95
+ if (noCode && noEmail) {
96
+ res.status(HTTP_FAIL_CODES.BAD_REQUEST).json({
73
97
  success: false,
74
98
  code: "something-went-wrong",
75
- message: "Invalid magic link request. Must provide returnToken must be of type boolean",
99
+ message: "Invalid magic link. Must provide id or email and code",
76
100
  });
101
+ return;
77
102
  }
78
- const noCode = typeof code !== "string" || !code;
79
- const noEmail = typeof email !== "string" || !email;
80
- if (typeof id !== "string" || !id) {
81
- if (noCode && noEmail) {
82
- return res.status(HTTP_FAIL_CODES.BAD_REQUEST).json({
83
- success: false,
84
- code: "something-went-wrong",
85
- message: "Invalid magic link. Must provide id or email and code",
86
- });
87
- }
88
- if (noCode) {
89
- return res.status(HTTP_FAIL_CODES.BAD_REQUEST).json({
90
- success: false,
91
- code: "invalid-otp-code",
92
- message: "Invalid or empty code",
93
- });
94
- }
95
- if (noEmail) {
96
- return res.status(HTTP_FAIL_CODES.BAD_REQUEST).json({
97
- success: false,
98
- code: "invalid-email",
99
- message: "Invalid or empty email",
100
- });
101
- }
102
- return handler(req, res, { type: "otp", code, email, returnToken });
103
- }
104
- return handler(req, res, { type: "magic-link", id, returnToken });
105
- });
106
-
107
- app.post(AUTH_ROUTES_AND_PARAMS.magicLinks, (req, res: MagicLinkResponseHandler) => {
108
- const { code, email } = req.body;
109
-
110
- if (typeof code !== "string" || !code) {
111
- res
112
- .status(HTTP_FAIL_CODES.BAD_REQUEST)
113
- .json({ success: false, code: "invalid-otp-code", message: "Invalid or empty code" });
103
+ if (noCode) {
104
+ res.status(HTTP_FAIL_CODES.BAD_REQUEST).json({
105
+ success: false,
106
+ code: "invalid-otp-code",
107
+ message: "Invalid or empty code",
108
+ });
109
+ return;
114
110
  }
115
- if (typeof email !== "string" || !email) {
116
- res
117
- .status(HTTP_FAIL_CODES.BAD_REQUEST)
118
- .json({ success: false, code: "invalid-email", message: "Invalid or empty email" });
111
+ if (noEmail) {
112
+ res.status(HTTP_FAIL_CODES.BAD_REQUEST).json({
113
+ success: false,
114
+ code: "invalid-email",
115
+ message: "Invalid or empty email",
116
+ });
117
+ return;
119
118
  }
120
- return handler(req, res, { type: "otp", code, email });
121
- });
122
- }
119
+ return { type: "otp", code, email, returnToken };
120
+ }
121
+ return { type: "magic-link", id, returnToken };
122
+ };
@@ -50,7 +50,7 @@ export const setRegisterRequestHandler = (
50
50
  email: username,
51
51
  password,
52
52
  getConfirmationUrl: ({ code, websiteUrl }) =>
53
- getMagicLinkUrl(websiteUrl, { type: "otp", code, email: username }),
53
+ getMagicLinkUrl(websiteUrl, { type: "otp", code, email: username, returnToken: false }),
54
54
  clientInfo,
55
55
  req,
56
56
  });
@@ -3,7 +3,6 @@ import { TableRule } from "../../PublishParser/PublishParser";
3
3
  import {
4
4
  Filter,
5
5
  LocalParams,
6
- getClientErrorFromPGError,
7
6
  getErrorAsObject,
8
7
  getSerializedClientErrorFromPGError,
9
8
  } from "../DboBuilder";
package/lib/Logging.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { AnyObject, ClientSchema, TableHandler } from "prostgles-types";
2
2
  import { LocalParams } from "./DboBuilder/DboBuilder";
3
- import { NotifTypeName } from "./PubSubManager/PubSubManager";
3
+ import { NotifTypeName, PubSubManagerTriggers } from "./PubSubManager/PubSubManager";
4
4
 
5
5
  type ClientInfo = {
6
6
  socketId: string | undefined;
@@ -60,7 +60,7 @@ export namespace EventTypes {
60
60
  export type SyncOrSub = DebugInfo & {
61
61
  type: "syncOrSub";
62
62
  connectedSocketIds: string[];
63
- triggers: Record<string, string[]> | undefined;
63
+ triggers: PubSubManagerTriggers | undefined;
64
64
  } & (
65
65
  | (SyncOrSubWithClientInfo & {
66
66
  command: "addTrigger";
@@ -82,7 +82,7 @@ export namespace EventTypes {
82
82
  command: "notifListener.Finished";
83
83
  op_name: string | undefined;
84
84
  condition_ids_str: string | undefined;
85
- tableTriggers: string[] | undefined;
85
+ tableTriggers: PubSubManagerTriggers[string] | undefined;
86
86
  tableSyncs: string;
87
87
  state: "ok" | "error" | "no-triggers" | "invalid_condition_ids";
88
88
  })
@@ -100,6 +100,10 @@ export namespace EventTypes {
100
100
  | {
101
101
  command: "postgresNotifListenManager.create" | "postgresNotifListenManager.destroy";
102
102
  }
103
+ | {
104
+ command: "refreshTriggers";
105
+ oldTriggers: PubSubManagerTriggers;
106
+ }
103
107
  );
104
108
 
105
109
  export type Connection =
@@ -3,7 +3,6 @@
3
3
  * Licensed under the MIT License. See LICENSE in the project root for license information.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
 
6
- import * as crypto from "crypto";
7
6
  import {
8
7
  DBHandlerServer,
9
8
  DboBuilder,
@@ -12,9 +11,13 @@ import {
12
11
  TableOrViewInfo,
13
12
  } from "../DboBuilder/DboBuilder";
14
13
  import { PostgresNotifListenManager } from "../PostgresNotifListenManager";
15
- import { DB, getIsSuperUser } from "../Prostgles";
14
+ import { DB } from "../Prostgles";
16
15
  import { addSync } from "./addSync";
16
+ import { addTrigger } from "./addTrigger";
17
+ import { initialiseEventTriggers } from "./initialiseEventTriggers";
17
18
  import { initPubSubManager } from "./initPubSubManager";
19
+ import { refreshTriggers } from "./refreshTriggers";
20
+ import { deleteOrphanedTriggers } from "./deleteOrphanedTriggers";
18
21
 
19
22
  import * as pgPromise from "pg-promise";
20
23
  import pg from "pg-promise/typescript/pg-subset";
@@ -28,20 +31,17 @@ import {
28
31
  WAL,
29
32
  } from "prostgles-types";
30
33
 
31
- import { find, pickKeys, tryCatch, tryCatchV2 } from "prostgles-types/dist/util";
34
+ import { find, pickKeys } from "prostgles-types/dist/util";
32
35
  import { LocalFuncs, getOnDataFunc, matchesLocalFuncs } from "../DboBuilder/ViewHandler/subscribe";
33
- import { EVENT_TRIGGER_TAGS } from "../Event_Trigger_Tags";
34
36
  import { EventTypes } from "../Logging";
35
37
  import { TableRule } from "../PublishParser/PublishParser";
36
38
  import { syncData } from "../SyncReplication";
37
39
  import { addSub } from "./addSub";
38
- import { DB_OBJ_NAMES } from "./getPubSubManagerInitQuery";
39
40
  import { notifListener } from "./notifListener";
40
- import { DELETE_DISCONNECTED_APPS_QUERY } from "./orphanTriggerCheck";
41
41
  import { pushSubData } from "./pushSubData";
42
42
 
43
43
  type PGP = pgPromise.IMain<{}, pg.IClient>;
44
- const pgp: PGP = pgPromise({});
44
+ export const pgp: PGP = pgPromise({});
45
45
  export const asValue = (v: any) => pgp.as.format("$1", [v]);
46
46
  export const DEFAULT_SYNC_BATCH_SIZE = 50;
47
47
 
@@ -156,6 +156,8 @@ export type Subscription = Pick<
156
156
  }[];
157
157
  };
158
158
 
159
+ export type PubSubManagerTriggers = Record<string, { condition: string; hash: string }[]>;
160
+
159
161
  /**
160
162
  * Used to facilitate table subscribe and sync
161
163
  */
@@ -183,7 +185,7 @@ export class PubSubManager {
183
185
  }
184
186
 
185
187
  dboBuilder: DboBuilder;
186
- _triggers: Record<string, string[]> | undefined;
188
+ _triggers: PubSubManagerTriggers | undefined;
187
189
  sockets: AnyObject = {};
188
190
 
189
191
  subs: Subscription[] = [];
@@ -232,92 +234,7 @@ export class PubSubManager {
232
234
 
233
235
  appChecking = false;
234
236
  checkedListenerTableCond?: string[];
235
-
236
- initialiseEventTriggers = async () => {
237
- const { watchSchema } = this.dboBuilder.prostgles.opts;
238
- if (watchSchema && !(await getIsSuperUser(this.db))) {
239
- console.warn(
240
- "prostgles watchSchema requires superuser db user. Will not watch using event triggers"
241
- );
242
- }
243
-
244
- try {
245
- /** We use these names because they include schema where necessary */
246
- const allTableNames = Object.keys(this.dbo).filter((k) => this.dbo[k]?.tableOrViewInfo);
247
- const tableFilterQuery =
248
- allTableNames.length ?
249
- `OR table_name NOT IN (${allTableNames.map((tblName) => asValue(tblName)).join(", ")})`
250
- : "";
251
- const query = pgp.as.format(
252
- `
253
- BEGIN;-- ISOLATION LEVEL SERIALIZABLE;
254
-
255
- /**
256
- * ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID}
257
- * Drop stale triggers
258
- * */
259
- DO
260
- $do$
261
- DECLARE trg RECORD;
262
- q TEXT;
263
- ev_trg_needed BOOLEAN := FALSE;
264
- ev_trg_exists BOOLEAN := FALSE;
265
- is_super_user BOOLEAN := FALSE;
266
- BEGIN
267
-
268
- /**
269
- * Delete disconnected app records, this will delete related triggers
270
- * */
271
- ${DELETE_DISCONNECTED_APPS_QUERY};
272
-
273
- DELETE FROM prostgles.app_triggers
274
- WHERE app_id NOT IN (SELECT id FROM prostgles.apps)
275
- ${tableFilterQuery}
276
- ;
277
-
278
- /** IS THIS STILL NEEDED? Delete existing triggers without locking
279
- */
280
- LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
281
- EXECUTE format(
282
- $q$
283
-
284
- CREATE TEMP TABLE %1$I AS --ON COMMIT DROP AS
285
- SELECT * FROM prostgles.app_triggers;
286
-
287
- DELETE FROM prostgles.app_triggers;
288
-
289
- INSERT INTO prostgles.app_triggers
290
- SELECT * FROM %1$I;
291
-
292
- DROP TABLE IF EXISTS %1$I;
293
- $q$,
294
- ${asValue("triggers_" + this.appId)}
295
- );
296
-
297
- ${SCHEMA_WATCH_EVENT_TRIGGER_QUERY}
298
-
299
- END
300
- $do$;
301
-
302
-
303
- COMMIT;
304
- `,
305
- { EVENT_TRIGGER_TAGS }
306
- );
307
-
308
- await this.db
309
- .tx((t) => t.any(query))
310
- .catch((e: any) => {
311
- console.error("prepareTriggers failed: ", e);
312
- throw e;
313
- });
314
-
315
- return true;
316
- } catch (e) {
317
- console.error("prepareTriggers failed: ", e);
318
- throw e;
319
- }
320
- };
237
+ initialiseEventTriggers = initialiseEventTriggers.bind(this);
321
238
 
322
239
  getClientSubs({
323
240
  channel_name,
@@ -457,184 +374,15 @@ export class PubSubManager {
457
374
  /**
458
375
  * Sync triggers with database
459
376
  * */
460
- refreshTriggers = async () => {
461
- const triggers: {
462
- table_name: string;
463
- condition: string;
464
- }[] = await this.db.any(
465
- `
466
- SELECT *
467
- FROM prostgles.v_triggers
468
- WHERE app_id = $1
469
- ORDER BY table_name, condition
470
- `,
471
- [this.dboBuilder.prostgles.appId]
472
- );
377
+ refreshTriggers = refreshTriggers.bind(this);
473
378
 
474
- this._triggers = {};
475
- triggers.map((t) => {
476
- this._triggers ??= {};
477
- this._triggers[t.table_name] ??= [];
478
- if (!this._triggers[t.table_name]?.includes(t.condition)) {
479
- this._triggers[t.table_name]?.push(t.condition);
480
- }
481
- });
482
- };
379
+ deleteOrphanedTriggers = debounce(deleteOrphanedTriggers.bind(this), 1000);
483
380
 
484
381
  addingTrigger: any;
485
382
  addTriggerPool?: Record<string, string[]> = undefined;
486
- async addTrigger(
487
- params: { table_name: string; condition: string },
488
- viewOptions: ViewSubscriptionOptions | undefined,
489
- socket: PRGLIOSocket | undefined
490
- ) {
491
- const addedTrigger = await tryCatchV2(async () => {
492
- const { table_name } = { ...params };
493
- let { condition } = { ...params };
494
- if (!table_name) throw "MISSING table_name";
495
-
496
- if (!condition || !condition.trim().length) {
497
- condition = "TRUE";
498
- }
499
-
500
- if (this.dbo[table_name]?.tableOrViewInfo?.isHyperTable) {
501
- throw "Triggers do not work on timescaledb hypertables due to bug:\nhttps://github.com/timescale/timescaledb/issues/1084";
502
- }
503
-
504
- const trgVals = {
505
- tbl: asValue(table_name),
506
- cond: asValue(condition),
507
- condHash: asValue(crypto.createHash("md5").update(condition).digest("hex")),
508
- };
509
-
510
- await this.db.tx((t) =>
511
- t.any(`
512
- BEGIN WORK;
513
- /* ${PubSubManager.EXCLUDE_QUERY_FROM_SCHEMA_WATCH_ID} */
514
- /* why is this lock level needed? */
515
- --LOCK TABLE prostgles.app_triggers IN ACCESS EXCLUSIVE MODE;
516
-
517
- /** app_triggers is not refreshed when tables are dropped */
518
- DELETE FROM prostgles.app_triggers at
519
- WHERE app_id = ${asValue(this.appId)}
520
- AND NOT EXISTS (
521
- SELECT 1
522
- FROM pg_catalog.pg_trigger t
523
- WHERE tgname like format('prostgles_triggers_%s_', at.table_name) || '%'
524
- AND tgenabled = 'O'
525
- );
526
-
527
- INSERT INTO prostgles.app_triggers (
528
- table_name,
529
- condition,
530
- condition_hash,
531
- app_id,
532
- related_view_name,
533
- related_view_def
534
- )
535
- VALUES (
536
- ${trgVals.tbl},
537
- ${trgVals.cond},
538
- ${trgVals.condHash},
539
- ${asValue(this.appId)},
540
- ${asValue(viewOptions?.viewName ?? null)},
541
- ${asValue(viewOptions?.definition ?? null)}
542
- )
543
- ON CONFLICT DO NOTHING;
544
-
545
- COMMIT WORK;
546
- `)
547
- );
548
-
549
- /** This might be redundant due to trigger on app_triggers */
550
- await this.refreshTriggers();
551
-
552
- return trgVals;
553
- });
554
-
555
- await this._log({
556
- type: "syncOrSub",
557
- command: "addTrigger",
558
- condition: addedTrigger.data?.cond ?? params.condition,
559
- duration: addedTrigger.duration,
560
- socketId: socket?.id,
561
- state: !addedTrigger.data?.tbl ? "fail" : "ok",
562
- error: addedTrigger.error,
563
- sid: socket && this.dboBuilder.prostgles.authHandler?.getSIDNoError({ socket }),
564
- tableName: addedTrigger.data?.tbl ?? params.table_name,
565
- connectedSocketIds: this.dboBuilder.prostgles.connectedSockets.map((s) => s.id),
566
- localParams: socket && { clientReq: { socket } },
567
- triggers: this._triggers,
568
- });
569
-
570
- if (addedTrigger.error) throw addedTrigger.error;
571
-
572
- return addedTrigger;
573
- }
383
+ addTrigger = addTrigger.bind(this);
574
384
  }
575
385
 
576
- const SCHEMA_WATCH_EVENT_TRIGGER_QUERY = `
577
-
578
- is_super_user := EXISTS (select 1 from pg_user where usename = CURRENT_USER AND usesuper IS TRUE);
579
-
580
- /* DROP the old buggy schema watch trigger */
581
- IF EXISTS (
582
- SELECT 1 FROM pg_catalog.pg_event_trigger
583
- WHERE evtname = 'prostgles_schema_watch_trigger'
584
- ) AND is_super_user IS TRUE
585
- THEN
586
- DROP EVENT TRIGGER IF EXISTS prostgles_schema_watch_trigger;
587
- END IF;
588
-
589
- ev_trg_needed := EXISTS (
590
- SELECT 1 FROM prostgles.apps
591
- WHERE watching_schema_tag_names IS NOT NULL
592
- );
593
- ev_trg_exists := EXISTS (
594
- SELECT 1 FROM pg_catalog.pg_event_trigger
595
- WHERE evtname = ${asValue(DB_OBJ_NAMES.schema_watch_trigger)}
596
- );
597
-
598
- /* DROP stale event trigger */
599
- IF
600
- is_super_user IS TRUE
601
- AND ev_trg_needed IS FALSE
602
- AND ev_trg_exists IS TRUE
603
- THEN
604
-
605
- SELECT format(
606
- $$
607
- DROP EVENT TRIGGER IF EXISTS %I ;
608
- DROP EVENT TRIGGER IF EXISTS %I ;
609
- $$
610
- , ${asValue(DB_OBJ_NAMES.schema_watch_trigger)}
611
- , ${asValue(DB_OBJ_NAMES.schema_watch_trigger_drop)}
612
- )
613
- INTO q;
614
- EXECUTE q;
615
-
616
- /* CREATE event trigger */
617
- ELSIF
618
- is_super_user IS TRUE
619
- AND ev_trg_needed IS TRUE
620
- AND ev_trg_exists IS FALSE
621
- THEN
622
-
623
- DROP EVENT TRIGGER IF EXISTS ${DB_OBJ_NAMES.schema_watch_trigger};
624
- CREATE EVENT TRIGGER ${DB_OBJ_NAMES.schema_watch_trigger}
625
- ON ddl_command_end
626
- WHEN TAG IN (\${EVENT_TRIGGER_TAGS:csv})
627
- EXECUTE PROCEDURE ${DB_OBJ_NAMES.schema_watch_func}();
628
-
629
- DROP EVENT TRIGGER IF EXISTS ${DB_OBJ_NAMES.schema_watch_trigger_drop};
630
- CREATE EVENT TRIGGER ${DB_OBJ_NAMES.schema_watch_trigger_drop}
631
- ON sql_drop
632
- --WHEN TAG IN (\${EVENT_TRIGGER_TAGS:csv})
633
- EXECUTE PROCEDURE ${DB_OBJ_NAMES.schema_watch_func}();
634
-
635
- END IF;
636
- `;
637
-
638
386
  export const NOTIF_TYPE = {
639
387
  data: "data_has_changed",
640
388
  data_trigger_change: "data_watch_triggers_have_changed",
@@ -650,6 +398,19 @@ export const NOTIF_CHANNEL = {
650
398
  },
651
399
  };
652
400
 
401
+ function debounce<Params extends any[]>(
402
+ func: (...args: Params) => any,
403
+ timeout: number
404
+ ): (...args: Params) => void {
405
+ let timer: NodeJS.Timeout;
406
+ return (...args: Params) => {
407
+ clearTimeout(timer);
408
+ timer = setTimeout(() => {
409
+ func(...args);
410
+ }, timeout);
411
+ };
412
+ }
413
+
653
414
  export const parseCondition = (condition: string): string =>
654
415
  condition && condition.trim().length ? condition : "TRUE";
655
416