prostgles-server 3.0.86 → 3.0.88

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 (216) hide show
  1. package/.eslintignore +5 -0
  2. package/.eslintrc.json +30 -0
  3. package/dist/DBEventsManager.js +1 -1
  4. package/dist/DBEventsManager.js.map +1 -1
  5. package/dist/DBSchemaBuilder.d.ts.map +1 -1
  6. package/dist/DBSchemaBuilder.js +6 -6
  7. package/dist/DBSchemaBuilder.js.map +1 -1
  8. package/dist/DboBuilder/QueryBuilder/Functions.js +9 -9
  9. package/dist/DboBuilder/QueryBuilder/Functions.js.map +1 -1
  10. package/dist/DboBuilder/QueryBuilder/QueryBuilder.d.ts.map +1 -1
  11. package/dist/DboBuilder/QueryBuilder/QueryBuilder.js +8 -7
  12. package/dist/DboBuilder/QueryBuilder/QueryBuilder.js.map +1 -1
  13. package/dist/DboBuilder/QueryBuilder/makeSelectQuery.d.ts.map +1 -1
  14. package/dist/DboBuilder/QueryBuilder/makeSelectQuery.js +4 -4
  15. package/dist/DboBuilder/QueryBuilder/makeSelectQuery.js.map +1 -1
  16. package/dist/DboBuilder/TableHandler.d.ts.map +1 -1
  17. package/dist/DboBuilder/TableHandler.js +18 -20
  18. package/dist/DboBuilder/TableHandler.js.map +1 -1
  19. package/dist/DboBuilder/ViewHandler.d.ts +0 -10
  20. package/dist/DboBuilder/ViewHandler.d.ts.map +1 -1
  21. package/dist/DboBuilder/ViewHandler.js +50 -63
  22. package/dist/DboBuilder/ViewHandler.js.map +1 -1
  23. package/dist/DboBuilder/delete.js +0 -1
  24. package/dist/DboBuilder/delete.js.map +1 -1
  25. package/dist/DboBuilder/getColumns.js +5 -4
  26. package/dist/DboBuilder/getColumns.js.map +1 -1
  27. package/dist/DboBuilder/getCondition.d.ts.map +1 -1
  28. package/dist/DboBuilder/getCondition.js +6 -6
  29. package/dist/DboBuilder/getCondition.js.map +1 -1
  30. package/dist/DboBuilder/insert.js +15 -16
  31. package/dist/DboBuilder/insert.js.map +1 -1
  32. package/dist/DboBuilder/insertDataParse.d.ts.map +1 -1
  33. package/dist/DboBuilder/insertDataParse.js +9 -10
  34. package/dist/DboBuilder/insertDataParse.js.map +1 -1
  35. package/dist/DboBuilder/parseUpdateRules.js +2 -2
  36. package/dist/DboBuilder/parseUpdateRules.js.map +1 -1
  37. package/dist/DboBuilder/runSQL.d.ts.map +1 -1
  38. package/dist/DboBuilder/runSQL.js +5 -5
  39. package/dist/DboBuilder/runSQL.js.map +1 -1
  40. package/dist/DboBuilder/subscribe.js +3 -3
  41. package/dist/DboBuilder/subscribe.js.map +1 -1
  42. package/dist/DboBuilder/update.js +5 -6
  43. package/dist/DboBuilder/update.js.map +1 -1
  44. package/dist/DboBuilder/uploadFile.d.ts.map +1 -1
  45. package/dist/DboBuilder/uploadFile.js +1 -1
  46. package/dist/DboBuilder/uploadFile.js.map +1 -1
  47. package/dist/DboBuilder.d.ts.map +1 -1
  48. package/dist/DboBuilder.js +13 -14
  49. package/dist/DboBuilder.js.map +1 -1
  50. package/dist/FileManager.d.ts.map +1 -1
  51. package/dist/FileManager.js +3 -5
  52. package/dist/FileManager.js.map +1 -1
  53. package/dist/Filtering.js +7 -7
  54. package/dist/Filtering.js.map +1 -1
  55. package/dist/JSONBValidation/validate_jsonb_schema_sql.d.ts +3 -0
  56. package/dist/JSONBValidation/validate_jsonb_schema_sql.d.ts.map +1 -0
  57. package/dist/JSONBValidation/validate_jsonb_schema_sql.js +295 -0
  58. package/dist/JSONBValidation/validate_jsonb_schema_sql.js.map +1 -0
  59. package/dist/JSONBValidation/validation.d.ts +108 -0
  60. package/dist/JSONBValidation/validation.d.ts.map +1 -0
  61. package/dist/JSONBValidation/validation.js +222 -0
  62. package/dist/JSONBValidation/validation.js.map +1 -0
  63. package/dist/PostgresNotifListenManager.js +1 -1
  64. package/dist/PostgresNotifListenManager.js.map +1 -1
  65. package/dist/Prostgles.d.ts.map +1 -1
  66. package/dist/Prostgles.js +20 -20
  67. package/dist/Prostgles.js.map +1 -1
  68. package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
  69. package/dist/PubSubManager/PubSubManager.js +10 -8
  70. package/dist/PubSubManager/PubSubManager.js.map +1 -1
  71. package/dist/PubSubManager/initPubSubManager.d.ts.map +1 -1
  72. package/dist/PubSubManager/initPubSubManager.js +10 -7
  73. package/dist/PubSubManager/initPubSubManager.js.map +1 -1
  74. package/dist/PublishParser.d.ts.map +1 -1
  75. package/dist/PublishParser.js +122 -125
  76. package/dist/PublishParser.js.map +1 -1
  77. package/dist/SyncReplication.d.ts.map +1 -1
  78. package/dist/SyncReplication.js +19 -16
  79. package/dist/SyncReplication.js.map +1 -1
  80. package/dist/TableConfig.d.ts +9 -5
  81. package/dist/TableConfig.d.ts.map +1 -1
  82. package/dist/TableConfig.js +33 -12
  83. package/dist/TableConfig.js.map +1 -1
  84. package/dist/index.js +1 -1
  85. package/dist/index.js.map +1 -1
  86. package/dist/shortestPath.js +11 -11
  87. package/dist/shortestPath.js.map +1 -1
  88. package/dist/validation.d.ts +50 -24
  89. package/dist/validation.d.ts.map +1 -1
  90. package/dist/validation.js +177 -53
  91. package/dist/validation.js.map +1 -1
  92. package/lib/AuthHandler.d.ts +11 -11
  93. package/lib/AuthHandler.d.ts.map +1 -1
  94. package/lib/DBEventsManager.js +1 -1
  95. package/lib/DBEventsManager.ts +1 -1
  96. package/lib/DBSchemaBuilder.d.ts +3 -3
  97. package/lib/DBSchemaBuilder.d.ts.map +1 -1
  98. package/lib/DBSchemaBuilder.js +6 -6
  99. package/lib/DBSchemaBuilder.ts +10 -9
  100. package/lib/DboBuilder/QueryBuilder/Functions.d.ts +3 -3
  101. package/lib/DboBuilder/QueryBuilder/Functions.d.ts.map +1 -1
  102. package/lib/DboBuilder/QueryBuilder/Functions.js +9 -9
  103. package/lib/DboBuilder/QueryBuilder/Functions.ts +13 -13
  104. package/lib/DboBuilder/QueryBuilder/QueryBuilder.d.ts +3 -3
  105. package/lib/DboBuilder/QueryBuilder/QueryBuilder.d.ts.map +1 -1
  106. package/lib/DboBuilder/QueryBuilder/QueryBuilder.js +8 -7
  107. package/lib/DboBuilder/QueryBuilder/QueryBuilder.ts +12 -12
  108. package/lib/DboBuilder/QueryBuilder/makeSelectQuery.d.ts.map +1 -1
  109. package/lib/DboBuilder/QueryBuilder/makeSelectQuery.js +4 -4
  110. package/lib/DboBuilder/QueryBuilder/makeSelectQuery.ts +5 -5
  111. package/lib/DboBuilder/TableHandler.d.ts +1 -1
  112. package/lib/DboBuilder/TableHandler.d.ts.map +1 -1
  113. package/lib/DboBuilder/TableHandler.js +18 -20
  114. package/lib/DboBuilder/TableHandler.ts +21 -20
  115. package/lib/DboBuilder/ViewHandler.d.ts +1 -11
  116. package/lib/DboBuilder/ViewHandler.d.ts.map +1 -1
  117. package/lib/DboBuilder/ViewHandler.js +50 -63
  118. package/lib/DboBuilder/ViewHandler.ts +68 -97
  119. package/lib/DboBuilder/delete.js +0 -1
  120. package/lib/DboBuilder/delete.ts +1 -1
  121. package/lib/DboBuilder/getColumns.js +5 -4
  122. package/lib/DboBuilder/getColumns.ts +5 -5
  123. package/lib/DboBuilder/getCondition.d.ts.map +1 -1
  124. package/lib/DboBuilder/getCondition.js +6 -6
  125. package/lib/DboBuilder/getCondition.ts +7 -7
  126. package/lib/DboBuilder/insert.js +15 -16
  127. package/lib/DboBuilder/insert.ts +18 -18
  128. package/lib/DboBuilder/insertDataParse.d.ts.map +1 -1
  129. package/lib/DboBuilder/insertDataParse.js +9 -10
  130. package/lib/DboBuilder/insertDataParse.ts +42 -43
  131. package/lib/DboBuilder/parseUpdateRules.js +2 -2
  132. package/lib/DboBuilder/parseUpdateRules.ts +2 -2
  133. package/lib/DboBuilder/runSQL.d.ts.map +1 -1
  134. package/lib/DboBuilder/runSQL.js +5 -5
  135. package/lib/DboBuilder/runSQL.ts +6 -6
  136. package/lib/DboBuilder/subscribe.d.ts +1 -1
  137. package/lib/DboBuilder/subscribe.d.ts.map +1 -1
  138. package/lib/DboBuilder/subscribe.js +3 -3
  139. package/lib/DboBuilder/subscribe.ts +3 -3
  140. package/lib/DboBuilder/update.js +5 -6
  141. package/lib/DboBuilder/update.ts +6 -6
  142. package/lib/DboBuilder/uploadFile.d.ts.map +1 -1
  143. package/lib/DboBuilder/uploadFile.js +1 -1
  144. package/lib/DboBuilder/uploadFile.ts +2 -2
  145. package/lib/DboBuilder.d.ts +22 -22
  146. package/lib/DboBuilder.d.ts.map +1 -1
  147. package/lib/DboBuilder.js +13 -14
  148. package/lib/DboBuilder.ts +19 -19
  149. package/lib/FileManager.d.ts +6 -6
  150. package/lib/FileManager.d.ts.map +1 -1
  151. package/lib/FileManager.js +3 -5
  152. package/lib/FileManager.ts +7 -6
  153. package/lib/Filtering.d.ts +1 -1
  154. package/lib/Filtering.d.ts.map +1 -1
  155. package/lib/Filtering.js +7 -7
  156. package/lib/Filtering.ts +7 -7
  157. package/lib/JSONBValidation/validate_jsonb_schema_sql.d.ts +3 -0
  158. package/lib/JSONBValidation/validate_jsonb_schema_sql.d.ts.map +1 -0
  159. package/lib/JSONBValidation/validate_jsonb_schema_sql.js +294 -0
  160. package/lib/JSONBValidation/validate_jsonb_schema_sql.ts +293 -0
  161. package/lib/JSONBValidation/validation.d.ts +108 -0
  162. package/lib/JSONBValidation/validation.d.ts.map +1 -0
  163. package/lib/JSONBValidation/validation.js +221 -0
  164. package/lib/JSONBValidation/validation.ts +332 -0
  165. package/lib/PostgresNotifListenManager.d.ts +1 -1
  166. package/lib/PostgresNotifListenManager.d.ts.map +1 -1
  167. package/lib/PostgresNotifListenManager.js +1 -1
  168. package/lib/PostgresNotifListenManager.ts +1 -1
  169. package/lib/Prostgles.d.ts +14 -14
  170. package/lib/Prostgles.d.ts.map +1 -1
  171. package/lib/Prostgles.js +20 -19
  172. package/lib/Prostgles.ts +22 -21
  173. package/lib/PubSubManager/PubSubManager.d.ts +7 -7
  174. package/lib/PubSubManager/PubSubManager.d.ts.map +1 -1
  175. package/lib/PubSubManager/PubSubManager.js +10 -8
  176. package/lib/PubSubManager/PubSubManager.ts +13 -8
  177. package/lib/PubSubManager/initPubSubManager.d.ts.map +1 -1
  178. package/lib/PubSubManager/initPubSubManager.js +10 -7
  179. package/lib/PubSubManager/initPubSubManager.ts +12 -7
  180. package/lib/PublishParser.d.ts +32 -32
  181. package/lib/PublishParser.d.ts.map +1 -1
  182. package/lib/PublishParser.js +121 -124
  183. package/lib/PublishParser.ts +125 -127
  184. package/lib/SchemaWatch.d.ts +1 -1
  185. package/lib/SchemaWatch.d.ts.map +1 -1
  186. package/lib/SyncReplication.d.ts +5 -5
  187. package/lib/SyncReplication.d.ts.map +1 -1
  188. package/lib/SyncReplication.js +19 -16
  189. package/lib/SyncReplication.ts +470 -471
  190. package/lib/TableConfig.d.ts +28 -24
  191. package/lib/TableConfig.d.ts.map +1 -1
  192. package/lib/TableConfig.js +33 -12
  193. package/lib/TableConfig.ts +55 -21
  194. package/lib/index.js +1 -1
  195. package/lib/index.ts +1 -1
  196. package/lib/shortestPath.d.ts +1 -1
  197. package/lib/shortestPath.d.ts.map +1 -1
  198. package/lib/shortestPath.js +11 -11
  199. package/lib/shortestPath.ts +11 -11
  200. package/package.json +10 -6
  201. package/tests/client/PID.txt +1 -1
  202. package/tests/client/package-lock.json +53 -31
  203. package/tests/client/package.json +4 -1
  204. package/tests/isomorphic_queries.d.ts.map +1 -1
  205. package/tests/isomorphic_queries.js +28 -26
  206. package/tests/isomorphic_queries.ts +30 -29
  207. package/tests/server/DBoGenerated.d.ts +1 -1
  208. package/tests/server/index.js +8 -7
  209. package/tests/server/index.ts +10 -8
  210. package/tests/server/package-lock.json +76 -58
  211. package/tests/server/package.json +2 -2
  212. package/tests/server/server.ts +2 -3
  213. package/lib/validation.d.ts +0 -100
  214. package/lib/validation.d.ts.map +0 -1
  215. package/lib/validation.js +0 -280
  216. package/lib/validation.ts +0 -360
package/lib/Prostgles.ts CHANGED
@@ -9,10 +9,8 @@ import pg = require('pg-promise/typescript/pg-subset');
9
9
  import FileManager, { ImageOptions, LocalConfig, S3Config } from "./FileManager";
10
10
  import { SchemaWatch } from "./SchemaWatch";
11
11
 
12
- const pkgj = require('../package.json');
13
- const version = pkgj.version;
14
- import AuthHandler, { Auth, SessionUser, AuthRequestParams } from "./AuthHandler";
15
- console.log("Add a basic auth mode where user and sessions table are created");
12
+ const { version } = require('../package.json');
13
+ import AuthHandler, { Auth, SessionUser, AuthRequestParams } from "./AuthHandler";
16
14
 
17
15
  import TableConfigurator, { TableConfig } from "./TableConfig";
18
16
 
@@ -31,7 +29,7 @@ type DbConnection = string | pg.IConnectionParameters<pg.IClient>;
31
29
  type DbConnectionOpts = pg.IDefaults;
32
30
  export const TABLE_METHODS = ["update", "find", "findOne", "insert", "delete", "upsert"] as const;
33
31
  function getDbConnection(dbConnection: DbConnection, options: DbConnectionOpts | undefined, debugQueries = false, onNotice: ProstglesInitOptions["onNotice"]): { db: DB, pgp: PGP } {
34
- let pgp: PGP = pgPromise({
32
+ const pgp: PGP = pgPromise({
35
33
 
36
34
  promiseLib: promise,
37
35
  ...(debugQueries ? {
@@ -48,7 +46,8 @@ function getDbConnection(dbConnection: DbConnection, options: DbConnectionOpts |
48
46
  }
49
47
  } : {}),
50
48
  ...((onNotice || debugQueries) ? {
51
- connect: function (client, dc, isFresh) {
49
+ connect: function ({ client, dc, useCount }) {
50
+ const isFresh = !useCount;
52
51
  if (isFresh && !client.listeners('notice').length) {
53
52
  client.on('notice', function (msg) {
54
53
  if (onNotice) {
@@ -333,7 +332,9 @@ export class Prostgles {
333
332
  port: 5432,
334
333
  application_name: "prostgles_app"
335
334
  },
336
- onReady: () => { },
335
+ onReady: () => {
336
+ //empty
337
+ },
337
338
  schema: "public",
338
339
  watchSchema: false,
339
340
  watchSchemaType: "DDL_trigger",
@@ -381,7 +382,7 @@ export class Prostgles {
381
382
  if (!params.io) console.warn("io missing. WebSockets will not be set up");
382
383
 
383
384
  // TODO: find an exact keyof T<->arr TS matching method
384
- let config: Array<keyof ProstglesInitOptions> = [
385
+ const config: Array<keyof ProstglesInitOptions> = [
385
386
  "transactions", "joins", "tsGeneratedTypesDir",
386
387
  "onReady", "dbConnection", "dbOptions", "publishMethods", "io",
387
388
  "publish", "schema", "publishRawSQL", "wsChannelNamePrefix", "onSocketConnect",
@@ -715,7 +716,7 @@ export class Prostgles {
715
716
 
716
717
  if (!this.dbo) throw "dbo missing";
717
718
 
718
- let publishParser = new PublishParser(this.opts.publish, this.opts.publishMethods, this.opts.publishRawSQL, this.dbo, this.db!, this as any);
719
+ const publishParser = new PublishParser(this.opts.publish, this.opts.publishMethods, this.opts.publishRawSQL, this.dbo, this.db!, this as any);
719
720
  this.publishParser = publishParser;
720
721
 
721
722
  if (!this.opts.io) return;
@@ -739,7 +740,7 @@ export class Prostgles {
739
740
  this.connectedSockets.push(socket);
740
741
 
741
742
  if (!this.db || !this.dbo) throw new Error("db/dbo missing");
742
- let { dbo, db, pgp } = this;
743
+ const { dbo, db } = this;
743
744
 
744
745
  try {
745
746
  if (this.opts.onSocketConnect) {
@@ -759,7 +760,7 @@ export class Prostgles {
759
760
  Checks request against publish and if OK run it with relevant publish functions. Local (server) requests do not check the policy
760
761
  */
761
762
  socket.removeAllListeners(CHANNELS.DEFAULT)
762
- socket.on(CHANNELS.DEFAULT, async ({ tableName, command, param1, param2, param3 }: SocketRequestParams, cb = (...callback: any[]) => { }) => {
763
+ socket.on(CHANNELS.DEFAULT, async ({ tableName, command, param1, param2, param3 }: SocketRequestParams, cb = (..._callback: any[]) => { /* Empty */}) => {
763
764
 
764
765
  try { /* Channel name will only include client-sent params so we ignore table_rules enforced params */
765
766
  if (!socket || !this.authHandler || !this.publishParser || !this.dbo) {
@@ -768,9 +769,9 @@ export class Prostgles {
768
769
  }
769
770
 
770
771
  const clientInfo = await this.authHandler.getClientInfo({ socket });
771
- let valid_table_command_rules = await this.publishParser.getValidatedRequestRule({ tableName, command, localParams: { socket } }, clientInfo);
772
+ const valid_table_command_rules = await this.publishParser.getValidatedRequestRule({ tableName, command, localParams: { socket } }, clientInfo);
772
773
  if (valid_table_command_rules) {
773
- let res = await this.dbo[tableName][command]!(param1, param2, param3, valid_table_command_rules, { socket, isRemoteRequest: true });
774
+ const res = await this.dbo[tableName][command]!(param1, param2, param3, valid_table_command_rules, { socket, isRemoteRequest: true });
774
775
  cb(null, res);
775
776
  } else throw `Invalid OR disallowed request: ${tableName}.${command} `;
776
777
 
@@ -791,11 +792,11 @@ export class Prostgles {
791
792
  if (this.opts.onSocketDisconnect) {
792
793
  const getUser = async () => { return await this.authHandler?.getClientInfo({ socket }); }
793
794
  this.opts.onSocketDisconnect({ socket, dbo: dbo as any, db, getUser });
794
- };
795
+ }
795
796
  });
796
797
 
797
798
  socket.removeAllListeners(CHANNELS.METHOD)
798
- socket.on(CHANNELS.METHOD, async ({ method, params }: SocketMethodRequest, cb = (...callback: any) => { }) => {
799
+ socket.on(CHANNELS.METHOD, async ({ method, params }: SocketMethodRequest, cb = (..._callback: any) => { /* Empty */ }) => {
799
800
  try {
800
801
  const methods = await this.publishParser?.getAllowedMethods(socket);
801
802
 
@@ -827,13 +828,13 @@ export class Prostgles {
827
828
  pushSocketSchema = async (socket: any) => {
828
829
 
829
830
  try {
830
- let { auth, userData } = await this.authHandler?.makeSocketAuth(socket) || {};
831
+ const { auth, userData } = await this.authHandler?.makeSocketAuth(socket) || {};
831
832
 
832
833
  // let needType = this.publishRawSQL && typeof this.publishRawSQL === "function";
833
834
  // let DATA_TYPES = !needType? [] : await this.db.any("SELECT oid, typname FROM pg_type");
834
835
  // let USER_TABLES = !needType? [] : await this.db.any("SELECT relid, relname FROM pg_catalog.pg_statio_user_tables");
835
836
 
836
- const { dbo, db, pgp, publishParser } = this;
837
+ const { db, publishParser } = this;
837
838
  let fullSchema: {
838
839
  schema: TableSchemaForClient;
839
840
  tables: DBSchemaTable[];
@@ -856,13 +857,13 @@ export class Prostgles {
856
857
  if (this.opts.publishRawSQL && typeof this.opts.publishRawSQL === "function") {
857
858
  const canRunSQL = async () => {
858
859
  const publishParams = await this.publishParser?.getPublishParams({ socket })
859
- let res = await this.opts.publishRawSQL?.(publishParams as any);
860
+ const res = await this.opts.publishRawSQL?.(publishParams as any);
860
861
  return Boolean(res && typeof res === "boolean" || res === "*");
861
862
  }
862
863
 
863
864
  if (await canRunSQL()) {
864
865
  socket.removeAllListeners(CHANNELS.SQL)
865
- socket.on(CHANNELS.SQL, async ({ query, params, options }: SQLRequest, cb = (...callback: any) => { }) => {
866
+ socket.on(CHANNELS.SQL, async ({ query, params, options }: SQLRequest, cb = (..._callback: any) => { /* Empty */ }) => {
866
867
 
867
868
  if (!this.dbo?.sql) throw "Internal error: sql handler missing";
868
869
 
@@ -881,9 +882,9 @@ export class Prostgles {
881
882
  }
882
883
 
883
884
  const { schema, tables } = fullSchema ?? { schema: {}, tables: [] };
884
- let joinTables2: string[][] = [];
885
+ const joinTables2: string[][] = [];
885
886
  if (this.opts.joins) {
886
- let _joinTables2 = this.dboBuilder.getJoinPaths()
887
+ const _joinTables2 = this.dboBuilder.getJoinPaths()
887
888
  .filter(jp =>
888
889
  ![jp.t1, jp.t2].find(t => !schema[t] || !schema[t].findOne)
889
890
  ).map(jp => [jp.t1, jp.t2].sort());
@@ -8,8 +8,8 @@ import { TableRule } from "../PublishParser";
8
8
  export declare const asValue: (v: any) => string;
9
9
  export declare const DEFAULT_SYNC_BATCH_SIZE = 50;
10
10
  export declare const log: (...args: any[]) => void;
11
- export declare type BasicCallback = (err?: any, res?: any) => void;
12
- export declare type SyncParams = {
11
+ export type BasicCallback = (err?: any, res?: any) => void;
12
+ export type SyncParams = {
13
13
  socket_id: string;
14
14
  channel_name: string;
15
15
  table_name: string;
@@ -29,7 +29,7 @@ export declare type SyncParams = {
29
29
  last_synced: number;
30
30
  is_syncing: boolean;
31
31
  };
32
- declare type AddSyncParams = {
32
+ type AddSyncParams = {
33
33
  socket: any;
34
34
  table_info: TableInfo;
35
35
  table_rules: TableRule;
@@ -43,7 +43,7 @@ declare type AddSyncParams = {
43
43
  condition: string;
44
44
  throttle?: number;
45
45
  };
46
- export declare type ViewSubscriptionOptions = {
46
+ export type ViewSubscriptionOptions = {
47
47
  viewName: string;
48
48
  definition: string;
49
49
  relatedTables: {
@@ -52,7 +52,7 @@ export declare type ViewSubscriptionOptions = {
52
52
  condition: string;
53
53
  }[];
54
54
  };
55
- declare type SubscriptionParams = {
55
+ type SubscriptionParams = {
56
56
  socket_id?: string;
57
57
  channel_name: string;
58
58
  table_name: string;
@@ -72,10 +72,10 @@ declare type SubscriptionParams = {
72
72
  is_throttling?: any;
73
73
  is_ready?: boolean;
74
74
  };
75
- declare type AddSubscriptionParams = SubscriptionParams & {
75
+ type AddSubscriptionParams = SubscriptionParams & {
76
76
  condition: string;
77
77
  };
78
- export declare type PubSubManagerOptions = {
78
+ export type PubSubManagerOptions = {
79
79
  dboBuilder: DboBuilder;
80
80
  wsChannelNamePrefix?: string;
81
81
  pgChannelName?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"PubSubManager.d.ts","sourceRoot":"","sources":["PubSubManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PubSubManager.d.ts","sourceRoot":"","sources":["PubSubManager.ts"],"names":[],"mappings":"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"}
@@ -530,7 +530,7 @@ class PubSubManager {
530
530
  }
531
531
  const channel_name = `${this.socketChannelPreffix}.${table_info.name}.${JSON.stringify(filter)}.${JSON.stringify(params)}.${"m"}.sub`;
532
532
  this.upsertSocket(socket, channel_name);
533
- const upsertSub = (newSubData) => {
533
+ const upsertSub = (newSubData, isReadyOverride) => {
534
534
  const { table_name, condition: _cond, is_ready = false, parentSubParams } = newSubData, condition = parseCondition(_cond), newSub = {
535
535
  socket,
536
536
  table_name: table_info.name,
@@ -568,13 +568,13 @@ class PubSubManager {
568
568
  else {
569
569
  this.subs[table_name][condition].subs[sub_idx] = newSub;
570
570
  }
571
- if (is_ready) {
571
+ if (isReadyOverride ?? is_ready) {
572
572
  this.pushSubData(newSub);
573
573
  }
574
574
  };
575
575
  if (table_info.is_view) {
576
576
  if (viewOptions?.relatedTables.length) {
577
- viewOptions?.relatedTables.map(async (relatedTable) => {
577
+ viewOptions?.relatedTables.map(async (relatedTable, relatedTableIdx) => {
578
578
  const params = {
579
579
  table_name: relatedTable.tableName,
580
580
  condition: relatedTable.condition,
@@ -585,13 +585,15 @@ class PubSubManager {
585
585
  };
586
586
  upsertSub({
587
587
  ...params,
588
- is_ready: false
589
- });
588
+ is_ready: false,
589
+ }, false);
590
590
  await this.addTrigger(params, viewOptions);
591
+ /** Trigger pushSubData only on last related table to prevent duplicate firings */
592
+ const isLast = relatedTableIdx === viewOptions.relatedTables.length - 1;
591
593
  upsertSub({
592
594
  ...params,
593
595
  is_ready: true
594
- });
596
+ }, isLast);
595
597
  });
596
598
  return channel_name;
597
599
  }
@@ -608,7 +610,7 @@ class PubSubManager {
608
610
  condition: parseCondition(condition),
609
611
  parentSubParams: undefined,
610
612
  is_ready: false
611
- });
613
+ }, undefined);
612
614
  await this.addTrigger({
613
615
  table_name: table_info.name,
614
616
  condition: parseCondition(condition),
@@ -618,7 +620,7 @@ class PubSubManager {
618
620
  condition: parseCondition(condition),
619
621
  parentSubParams: undefined,
620
622
  is_ready: true
621
- });
623
+ }, undefined);
622
624
  return channel_name;
623
625
  }
624
626
  }
@@ -694,7 +694,7 @@ export class PubSubManager {
694
694
 
695
695
  this.upsertSocket(socket, channel_name);
696
696
 
697
- const upsertSub = (newSubData: { table_name: string; condition: string; is_ready: boolean; parentSubParams: SubscriptionParams["parentSubParams"] }) => {
697
+ const upsertSub = (newSubData: { table_name: string; condition: string; is_ready: boolean; parentSubParams: SubscriptionParams["parentSubParams"] }, isReadyOverride: boolean | undefined) => {
698
698
  const { table_name, condition: _cond, is_ready = false, parentSubParams } = newSubData,
699
699
  condition = parseCondition(_cond),
700
700
  newSub: SubscriptionParams = {
@@ -740,7 +740,7 @@ export class PubSubManager {
740
740
  this.subs[table_name][condition].subs[sub_idx] = newSub;
741
741
  }
742
742
 
743
- if (is_ready) {
743
+ if (isReadyOverride ?? is_ready) {
744
744
  this.pushSubData(newSub);
745
745
  }
746
746
  };
@@ -749,7 +749,9 @@ export class PubSubManager {
749
749
  if (table_info.is_view) {
750
750
  if (viewOptions?.relatedTables.length) {
751
751
 
752
- viewOptions?.relatedTables.map(async relatedTable => {
752
+ viewOptions?.relatedTables.map(async (relatedTable, relatedTableIdx) => {
753
+
754
+
753
755
  const params: Omit<Parameters<typeof upsertSub>[0], "is_ready"> = {
754
756
  table_name: relatedTable.tableName,
755
757
  condition: relatedTable.condition,
@@ -761,15 +763,18 @@ export class PubSubManager {
761
763
 
762
764
  upsertSub({
763
765
  ...params,
764
- is_ready: false
765
- });
766
+ is_ready: false,
767
+
768
+ }, false);
766
769
 
767
770
  await this.addTrigger(params, viewOptions);
768
771
 
772
+ /** Trigger pushSubData only on last related table to prevent duplicate firings */
773
+ const isLast = relatedTableIdx === viewOptions.relatedTables.length - 1;
769
774
  upsertSub({
770
775
  ...params,
771
776
  is_ready: true
772
- });
777
+ }, isLast);
773
778
  });
774
779
 
775
780
  return channel_name
@@ -786,7 +791,7 @@ export class PubSubManager {
786
791
  condition: parseCondition(condition),
787
792
  parentSubParams: undefined,
788
793
  is_ready: false
789
- });
794
+ }, undefined);
790
795
  await this.addTrigger({
791
796
  table_name: table_info.name,
792
797
  condition: parseCondition(condition),
@@ -796,7 +801,7 @@ export class PubSubManager {
796
801
  condition: parseCondition(condition),
797
802
  parentSubParams: undefined,
798
803
  is_ready: true
799
- });
804
+ }, undefined);
800
805
 
801
806
  return channel_name
802
807
  }
@@ -1 +1 @@
1
- {"version":3,"file":"initPubSubManager.d.ts","sourceRoot":"","sources":["initPubSubManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG9D,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA0oB/F"}
1
+ {"version":3,"file":"initPubSubManager.d.ts","sourceRoot":"","sources":["initPubSubManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAM9D,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA4oB/F"}
@@ -4,6 +4,7 @@ exports.initPubSubManager = void 0;
4
4
  const PostgresNotifListenManager_1 = require("../PostgresNotifListenManager");
5
5
  const PubSubManager_1 = require("./PubSubManager");
6
6
  const REALTIME_TRIGGER_CHECK_QUERY = "prostgles-server internal query used to manage realtime triggers";
7
+ const validate_jsonb_schema_sql_1 = require("../JSONBValidation/validate_jsonb_schema_sql");
7
8
  async function initPubSubManager() {
8
9
  if (!this.canContinue())
9
10
  return undefined;
@@ -30,14 +31,14 @@ async function initPubSubManager() {
30
31
  IF EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = 'prostgles') THEN
31
32
 
32
33
  IF
33
- NOT EXISTS (
34
- SELECT 1
35
- FROM information_schema.tables
36
- WHERE table_schema = 'prostgles'
37
- AND table_name = 'versions'
38
- )
34
+ NOT EXISTS (
35
+ SELECT 1
36
+ FROM information_schema.tables
37
+ WHERE table_schema = 'prostgles'
38
+ AND table_name = 'versions'
39
+ )
39
40
  THEN
40
- DROP SCHEMA IF EXISTS prostgles CASCADE;
41
+ DROP SCHEMA IF EXISTS prostgles CASCADE;
41
42
  ELSE
42
43
  IF NOT EXISTS(SELECT 1 FROM prostgles.versions WHERE version >= ${schema_version}) THEN
43
44
  DROP SCHEMA IF EXISTS prostgles CASCADE;
@@ -58,6 +59,8 @@ async function initPubSubManager() {
58
59
  );
59
60
  INSERT INTO prostgles.versions(version) VALUES(${schema_version}) ON CONFLICT DO NOTHING;
60
61
 
62
+ ${validate_jsonb_schema_sql_1.validate_jsonb_schema_sql}
63
+
61
64
  CREATE OR REPLACE FUNCTION prostgles.random_string(length INTEGER DEFAULT 33) RETURNS TEXT AS $$
62
65
  DECLARE
63
66
  chars TEXT[] := '{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}';
@@ -1,6 +1,9 @@
1
1
  import { PostgresNotifListenManager } from "../PostgresNotifListenManager";
2
2
  import { asValue, log, PubSubManager } from "./PubSubManager";
3
3
  const REALTIME_TRIGGER_CHECK_QUERY = "prostgles-server internal query used to manage realtime triggers" as const;
4
+ import * as fs from "fs";
5
+ import * as path from "path";
6
+ import { validate_jsonb_schema_sql } from "../JSONBValidation/validate_jsonb_schema_sql";
4
7
 
5
8
  export async function initPubSubManager(this: PubSubManager): Promise<PubSubManager | undefined> {
6
9
  if (!this.canContinue()) return undefined;
@@ -29,14 +32,14 @@ export async function initPubSubManager(this: PubSubManager): Promise<PubSubMana
29
32
  IF EXISTS (SELECT 1 FROM information_schema.schemata WHERE schema_name = 'prostgles') THEN
30
33
 
31
34
  IF
32
- NOT EXISTS (
33
- SELECT 1
34
- FROM information_schema.tables
35
- WHERE table_schema = 'prostgles'
36
- AND table_name = 'versions'
37
- )
35
+ NOT EXISTS (
36
+ SELECT 1
37
+ FROM information_schema.tables
38
+ WHERE table_schema = 'prostgles'
39
+ AND table_name = 'versions'
40
+ )
38
41
  THEN
39
- DROP SCHEMA IF EXISTS prostgles CASCADE;
42
+ DROP SCHEMA IF EXISTS prostgles CASCADE;
40
43
  ELSE
41
44
  IF NOT EXISTS(SELECT 1 FROM prostgles.versions WHERE version >= ${schema_version}) THEN
42
45
  DROP SCHEMA IF EXISTS prostgles CASCADE;
@@ -57,6 +60,8 @@ export async function initPubSubManager(this: PubSubManager): Promise<PubSubMana
57
60
  );
58
61
  INSERT INTO prostgles.versions(version) VALUES(${schema_version}) ON CONFLICT DO NOTHING;
59
62
 
63
+ ${validate_jsonb_schema_sql}
64
+
60
65
  CREATE OR REPLACE FUNCTION prostgles.random_string(length INTEGER DEFAULT 33) RETURNS TEXT AS $$
61
66
  DECLARE
62
67
  chars TEXT[] := '{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}';
@@ -3,56 +3,56 @@ import { AuthResult, SessionUser } from "./AuthHandler";
3
3
  import { CommonTableRules, LocalParams, PRGLIOSocket, TableOrViewInfo, TableSchemaColumn } from "./DboBuilder";
4
4
  import { Prostgles, DBHandlerServer, DB } from "./Prostgles";
5
5
  import type { DBOFullyTyped, PublishFullyTyped } from "./DBSchemaBuilder";
6
- export declare type PublishMethods<S = void, SUser extends SessionUser = SessionUser> = (params: PublishParams<S, SUser>) => {
6
+ export type PublishMethods<S = void, SUser extends SessionUser = SessionUser> = (params: PublishParams<S, SUser>) => {
7
7
  [key: string]: Method;
8
8
  } | Promise<{
9
9
  [key: string]: Method;
10
10
  } | null>;
11
- export declare type Awaitable<T> = T | Promise<T>;
12
- declare type Request = {
11
+ export type Awaitable<T> = T | Promise<T>;
12
+ type Request = {
13
13
  socket?: any;
14
14
  httpReq?: any;
15
15
  };
16
- declare type DboTable = Request & {
16
+ type DboTable = Request & {
17
17
  tableName: string;
18
18
  localParams: LocalParams;
19
19
  };
20
- declare type DboTableCommand = Request & DboTable & {
20
+ type DboTableCommand = Request & DboTable & {
21
21
  command: string;
22
22
  localParams: LocalParams;
23
23
  };
24
24
  import { FieldFilter, SelectParams } from "prostgles-types";
25
- export declare type InsertRequestData = {
25
+ export type InsertRequestData = {
26
26
  data: object | object[];
27
27
  returning: FieldFilter;
28
28
  };
29
- export declare type SelectRequestData = {
29
+ export type SelectRequestData = {
30
30
  filter: object;
31
31
  params: SelectParams;
32
32
  };
33
- export declare type DeleteRequestData = {
33
+ export type DeleteRequestData = {
34
34
  filter: object;
35
35
  returning: FieldFilter;
36
36
  };
37
- export declare type UpdateRequestDataOne<R extends AnyObject> = {
37
+ export type UpdateRequestDataOne<R extends AnyObject> = {
38
38
  filter: FullFilter<R>;
39
39
  data: Partial<R>;
40
40
  returning: FieldFilter<R>;
41
41
  };
42
- export declare type UpdateReq<R extends AnyObject> = {
42
+ export type UpdateReq<R extends AnyObject> = {
43
43
  filter: FullFilter<R>;
44
44
  data: Partial<R>;
45
45
  };
46
- export declare type UpdateRequestDataBatch<R extends AnyObject> = {
46
+ export type UpdateRequestDataBatch<R extends AnyObject> = {
47
47
  data: UpdateReq<R>[];
48
48
  };
49
- export declare type UpdateRequestData<R extends AnyObject = AnyObject> = UpdateRequestDataOne<R> | UpdateRequestDataBatch<R>;
50
- export declare type ValidateRow<R extends AnyObject = AnyObject, S = void> = (row: R, dbx: DBOFullyTyped<S>) => R | Promise<R>;
51
- export declare type ValidateUpdateRow<R extends AnyObject = AnyObject, S = void> = (args: {
49
+ export type UpdateRequestData<R extends AnyObject = AnyObject> = UpdateRequestDataOne<R> | UpdateRequestDataBatch<R>;
50
+ export type ValidateRow<R extends AnyObject = AnyObject, S = void> = (row: R, dbx: DBOFullyTyped<S>) => R | Promise<R>;
51
+ export type ValidateUpdateRow<R extends AnyObject = AnyObject, S = void> = (args: {
52
52
  update: Partial<R>;
53
53
  filter: FullFilter<R>;
54
54
  }, dbx: DBOFullyTyped<S>) => R | Promise<R>;
55
- export declare type SelectRule<Cols extends AnyObject = AnyObject, S = void> = {
55
+ export type SelectRule<Cols extends AnyObject = AnyObject, S = void> = {
56
56
  /**
57
57
  * Fields allowed to be selected.
58
58
  * Tip: Use false to exclude field
@@ -80,7 +80,7 @@ export declare type SelectRule<Cols extends AnyObject = AnyObject, S = void> = {
80
80
  */
81
81
  validate?(args: SelectRequestData): SelectRequestData | Promise<SelectRequestData>;
82
82
  };
83
- export declare type InsertRule<Cols extends AnyObject = AnyObject, S = void> = {
83
+ export type InsertRule<Cols extends AnyObject = AnyObject, S = void> = {
84
84
  /**
85
85
  * Fields allowed to be inserted. Tip: Use false to exclude field
86
86
  */
@@ -107,7 +107,7 @@ export declare type InsertRule<Cols extends AnyObject = AnyObject, S = void> = {
107
107
  */
108
108
  postValidate?: ValidateRow<Required<Cols>, S>;
109
109
  };
110
- export declare type UpdateRule<Cols extends AnyObject = AnyObject, S = void> = {
110
+ export type UpdateRule<Cols extends AnyObject = AnyObject, S = void> = {
111
111
  /**
112
112
  * Fields allowed to be updated. Tip: Use false/0 to exclude field
113
113
  */
@@ -150,7 +150,7 @@ export declare type UpdateRule<Cols extends AnyObject = AnyObject, S = void> = {
150
150
  */
151
151
  postValidate?: ValidateRow<Required<Cols>, S>;
152
152
  };
153
- export declare type DeleteRule<Cols extends AnyObject = AnyObject, S = void> = {
153
+ export type DeleteRule<Cols extends AnyObject = AnyObject, S = void> = {
154
154
  /**
155
155
  * Filter added to every query (e.g. user_id) to restrict access
156
156
  */
@@ -168,7 +168,7 @@ export declare type DeleteRule<Cols extends AnyObject = AnyObject, S = void> = {
168
168
  */
169
169
  validate?(...args: any[]): Awaitable<void>;
170
170
  };
171
- export declare type SyncRule<Cols extends AnyObject = AnyObject> = {
171
+ export type SyncRule<Cols extends AnyObject = AnyObject> = {
172
172
  /**
173
173
  * Primary keys used in updating data
174
174
  */
@@ -190,35 +190,35 @@ export declare type SyncRule<Cols extends AnyObject = AnyObject> = {
190
190
  */
191
191
  batch_size?: number;
192
192
  };
193
- export declare type SubscribeRule = {
193
+ export type SubscribeRule = {
194
194
  throttle?: number;
195
195
  };
196
- export declare type ViewRule<S extends AnyObject = AnyObject> = CommonTableRules & {
196
+ export type ViewRule<S extends AnyObject = AnyObject> = CommonTableRules & {
197
197
  /**
198
198
  * What can be read from the table
199
199
  */
200
200
  select?: SelectRule<S>;
201
201
  };
202
- export declare type TableRule<RowType extends AnyObject = AnyObject, S = void> = ViewRule<RowType> & {
202
+ export type TableRule<RowType extends AnyObject = AnyObject, S = void> = ViewRule<RowType> & {
203
203
  insert?: InsertRule<RowType, S>;
204
204
  update?: UpdateRule<RowType, S>;
205
205
  delete?: DeleteRule<RowType, S>;
206
206
  sync?: SyncRule<RowType>;
207
207
  subscribe?: SubscribeRule;
208
208
  };
209
- export declare type PublishViewRule<Col extends AnyObject = AnyObject, S = void> = {
209
+ export type PublishViewRule<Col extends AnyObject = AnyObject, S = void> = {
210
210
  select?: SelectRule<Col, S> | PublishAllOrNothing;
211
211
  getColumns?: PublishAllOrNothing;
212
212
  getInfo?: PublishAllOrNothing;
213
213
  };
214
- export declare type PublishTableRule<Col extends AnyObject = AnyObject, S = void> = PublishViewRule<Col, S> & {
214
+ export type PublishTableRule<Col extends AnyObject = AnyObject, S = void> = PublishViewRule<Col, S> & {
215
215
  insert?: InsertRule<Col, S> | PublishAllOrNothing;
216
216
  update?: UpdateRule<Col, S> | PublishAllOrNothing;
217
217
  delete?: DeleteRule<Col, S> | PublishAllOrNothing;
218
218
  sync?: SyncRule<Col>;
219
219
  subscribe?: SubscribeRule | PublishAllOrNothing;
220
220
  };
221
- export declare type ParsedPublishTable = {
221
+ export type ParsedPublishTable = {
222
222
  select?: SelectRule;
223
223
  getColumns?: true;
224
224
  getInfo?: true;
@@ -229,7 +229,7 @@ export declare type ParsedPublishTable = {
229
229
  subscribe?: SubscribeRule;
230
230
  subscribeOne?: SubscribeRule;
231
231
  };
232
- export declare type PublishParams<S = void, SUser extends SessionUser = SessionUser> = {
232
+ export type PublishParams<S = void, SUser extends SessionUser = SessionUser> = {
233
233
  sid?: string;
234
234
  dbo: DBOFullyTyped<S>;
235
235
  db: DB;
@@ -241,19 +241,19 @@ export declare type PublishParams<S = void, SUser extends SessionUser = SessionU
241
241
  columns: TableSchemaColumn[];
242
242
  }[];
243
243
  };
244
- export declare type RequestParams = {
244
+ export type RequestParams = {
245
245
  dbo?: DBHandlerServer;
246
246
  socket?: any;
247
247
  };
248
- export declare type PublishAllOrNothing = true | "*" | false | null;
249
- declare type PublishObject = {
248
+ export type PublishAllOrNothing = true | "*" | false | null;
249
+ type PublishObject = {
250
250
  [table_name: string]: (PublishTableRule | PublishViewRule | PublishAllOrNothing);
251
251
  };
252
- export declare type ParsedPublishTables = {
252
+ export type ParsedPublishTables = {
253
253
  [table_name: string]: ParsedPublishTable;
254
254
  };
255
- export declare type PublishedResult<Schema = void> = PublishAllOrNothing | PublishFullyTyped<Schema>;
256
- export declare type Publish<Schema = void, SUser extends SessionUser = SessionUser> = PublishedResult<Schema> | ((params: PublishParams<Schema, SUser>) => Awaitable<PublishedResult<Schema>>);
255
+ export type PublishedResult<Schema = void> = PublishAllOrNothing | PublishFullyTyped<Schema>;
256
+ export type Publish<Schema = void, SUser extends SessionUser = SessionUser> = PublishedResult<Schema> | ((params: PublishParams<Schema, SUser>) => Awaitable<PublishedResult<Schema>>);
257
257
  export declare class PublishParser {
258
258
  publish: any;
259
259
  publishMethods?: PublishMethods<void, SessionUser<AnyObject, AnyObject>> | undefined;