jxp 3.0.0 → 4.0.0

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 (219) hide show
  1. package/.env.sample +31 -6
  2. package/README.md +27 -13
  3. package/dist/bin/init_db.d.ts +3 -0
  4. package/dist/bin/init_db.d.ts.map +1 -0
  5. package/dist/bin/init_db.js +48 -0
  6. package/dist/bin/init_db.js.map +1 -0
  7. package/dist/bin/server.d.ts +4 -0
  8. package/dist/bin/server.d.ts.map +1 -0
  9. package/dist/bin/server.js +132 -0
  10. package/dist/bin/server.js.map +1 -0
  11. package/dist/bin/setup.d.ts +3 -0
  12. package/dist/bin/setup.d.ts.map +1 -0
  13. package/dist/bin/setup.js +185 -0
  14. package/dist/bin/setup.js.map +1 -0
  15. package/dist/globals.d.ts +14 -0
  16. package/dist/globals.d.ts.map +1 -0
  17. package/dist/globals.js +3 -0
  18. package/dist/globals.js.map +1 -0
  19. package/dist/libs/aggregate_guard.d.ts +5 -0
  20. package/dist/libs/aggregate_guard.d.ts.map +1 -0
  21. package/dist/libs/aggregate_guard.js +58 -0
  22. package/dist/libs/aggregate_guard.js.map +1 -0
  23. package/dist/libs/bulkwrite_guard.d.ts +5 -0
  24. package/dist/libs/bulkwrite_guard.d.ts.map +1 -0
  25. package/dist/libs/bulkwrite_guard.js +44 -0
  26. package/dist/libs/bulkwrite_guard.js.map +1 -0
  27. package/dist/libs/cache.d.ts +2 -0
  28. package/dist/libs/cache.d.ts.map +1 -0
  29. package/dist/libs/cache.js +94 -0
  30. package/dist/libs/cache.js.map +1 -0
  31. package/dist/libs/call_guard.d.ts +3 -0
  32. package/dist/libs/call_guard.d.ts.map +1 -0
  33. package/dist/libs/call_guard.js +17 -0
  34. package/dist/libs/call_guard.js.map +1 -0
  35. package/dist/libs/connection_string.d.ts +3 -0
  36. package/dist/libs/connection_string.d.ts.map +1 -0
  37. package/dist/libs/connection_string.js +4 -0
  38. package/dist/libs/connection_string.js.map +1 -0
  39. package/dist/libs/datamunging.d.ts +2 -0
  40. package/dist/libs/datamunging.d.ts.map +1 -0
  41. package/dist/libs/datamunging.js +320 -0
  42. package/dist/libs/datamunging.js.map +1 -0
  43. package/dist/libs/docs.d.ts +2 -0
  44. package/dist/libs/docs.d.ts.map +1 -0
  45. package/dist/libs/docs.js +307 -0
  46. package/dist/libs/docs.js.map +1 -0
  47. package/dist/libs/groups.d.ts +2 -0
  48. package/dist/libs/groups.d.ts.map +1 -0
  49. package/dist/libs/groups.js +136 -0
  50. package/dist/libs/groups.js.map +1 -0
  51. package/dist/libs/jxp.d.ts +4 -0
  52. package/dist/libs/jxp.d.ts.map +1 -0
  53. package/dist/libs/jxp.js +1157 -0
  54. package/dist/libs/jxp.js.map +1 -0
  55. package/dist/libs/link_index.d.ts +14 -0
  56. package/dist/libs/link_index.d.ts.map +1 -0
  57. package/dist/libs/link_index.js +37 -0
  58. package/dist/libs/link_index.js.map +1 -0
  59. package/dist/libs/load-config.d.ts +16 -0
  60. package/dist/libs/load-config.d.ts.map +1 -0
  61. package/dist/libs/load-config.js +155 -0
  62. package/dist/libs/load-config.js.map +1 -0
  63. package/dist/libs/login.d.ts +2 -0
  64. package/dist/libs/login.d.ts.map +1 -0
  65. package/dist/libs/login.js +244 -0
  66. package/dist/libs/login.js.map +1 -0
  67. package/dist/libs/modeldir.d.ts +5 -0
  68. package/dist/libs/modeldir.d.ts.map +1 -0
  69. package/dist/libs/modeldir.js +15 -0
  70. package/dist/libs/modeldir.js.map +1 -0
  71. package/dist/libs/query_limits.d.ts +2 -0
  72. package/dist/libs/query_limits.d.ts.map +1 -0
  73. package/dist/libs/query_limits.js +84 -0
  74. package/dist/libs/query_limits.js.map +1 -0
  75. package/dist/libs/query_manipulation.d.ts +3 -0
  76. package/dist/libs/query_manipulation.d.ts.map +1 -0
  77. package/{libs → dist/libs}/query_manipulation.js +22 -21
  78. package/dist/libs/query_manipulation.js.map +1 -0
  79. package/dist/libs/query_sanitize.d.ts +5 -0
  80. package/dist/libs/query_sanitize.d.ts.map +1 -0
  81. package/dist/libs/query_sanitize.js +109 -0
  82. package/dist/libs/query_sanitize.js.map +1 -0
  83. package/dist/libs/response_sanitize.d.ts +7 -0
  84. package/dist/libs/response_sanitize.d.ts.map +1 -0
  85. package/dist/libs/response_sanitize.js +57 -0
  86. package/dist/libs/response_sanitize.js.map +1 -0
  87. package/dist/libs/safe_error.d.ts +3 -0
  88. package/dist/libs/safe_error.d.ts.map +1 -0
  89. package/dist/libs/safe_error.js +14 -0
  90. package/dist/libs/safe_error.js.map +1 -0
  91. package/dist/libs/schema.d.ts +14 -0
  92. package/dist/libs/schema.d.ts.map +1 -0
  93. package/dist/libs/schema.js +98 -0
  94. package/dist/libs/schema.js.map +1 -0
  95. package/dist/libs/schema_description.d.ts +3 -0
  96. package/dist/libs/schema_description.d.ts.map +1 -0
  97. package/{libs → dist/libs}/schema_description.js +12 -21
  98. package/dist/libs/schema_description.js.map +1 -0
  99. package/dist/libs/security.d.ts +2 -0
  100. package/dist/libs/security.d.ts.map +1 -0
  101. package/dist/libs/security.js +428 -0
  102. package/dist/libs/security.js.map +1 -0
  103. package/dist/libs/setup.d.ts +2 -0
  104. package/dist/libs/setup.d.ts.map +1 -0
  105. package/dist/libs/setup.js +87 -0
  106. package/dist/libs/setup.js.map +1 -0
  107. package/dist/libs/startup-deprecations.d.ts +2 -0
  108. package/dist/libs/startup-deprecations.d.ts.map +1 -0
  109. package/dist/libs/startup-deprecations.js +21 -0
  110. package/dist/libs/startup-deprecations.js.map +1 -0
  111. package/dist/libs/startup.d.ts +16 -0
  112. package/dist/libs/startup.d.ts.map +1 -0
  113. package/dist/libs/startup.js +63 -0
  114. package/dist/libs/startup.js.map +1 -0
  115. package/dist/libs/ws.d.ts +2 -0
  116. package/dist/libs/ws.d.ts.map +1 -0
  117. package/{libs → dist/libs}/ws.js +91 -73
  118. package/dist/libs/ws.js.map +1 -0
  119. package/dist/models/apikey_model.d.ts +10 -0
  120. package/dist/models/apikey_model.d.ts.map +1 -0
  121. package/dist/models/apikey_model.js +14 -0
  122. package/dist/models/apikey_model.js.map +1 -0
  123. package/dist/models/link_model.d.ts +9 -0
  124. package/dist/models/link_model.d.ts.map +1 -0
  125. package/dist/models/link_model.js +20 -0
  126. package/dist/models/link_model.js.map +1 -0
  127. package/dist/models/refreshtoken_model.d.ts +11 -0
  128. package/dist/models/refreshtoken_model.d.ts.map +1 -0
  129. package/dist/models/refreshtoken_model.js +22 -0
  130. package/dist/models/refreshtoken_model.js.map +1 -0
  131. package/dist/models/test_model.d.ts +24 -0
  132. package/dist/models/test_model.d.ts.map +1 -0
  133. package/dist/models/test_model.js +44 -0
  134. package/dist/models/test_model.js.map +1 -0
  135. package/dist/models/token_model.d.ts +14 -0
  136. package/dist/models/token_model.d.ts.map +1 -0
  137. package/dist/models/token_model.js +25 -0
  138. package/dist/models/token_model.js.map +1 -0
  139. package/dist/models/user_model.d.ts +15 -0
  140. package/dist/models/user_model.d.ts.map +1 -0
  141. package/dist/models/user_model.js +38 -0
  142. package/dist/models/user_model.js.map +1 -0
  143. package/dist/models/usergroups_model.d.ts +9 -0
  144. package/dist/models/usergroups_model.d.ts.map +1 -0
  145. package/dist/models/usergroups_model.js +18 -0
  146. package/dist/models/usergroups_model.js.map +1 -0
  147. package/dist/types/jxp-config.d.ts +134 -0
  148. package/dist/types/jxp-config.d.ts.map +1 -0
  149. package/dist/types/jxp-config.js +3 -0
  150. package/dist/types/jxp-config.js.map +1 -0
  151. package/dist/types/schema-fields.d.ts +43 -0
  152. package/dist/types/schema-fields.d.ts.map +1 -0
  153. package/dist/types/schema-fields.js +3 -0
  154. package/dist/types/schema-fields.js.map +1 -0
  155. package/docs/aggregations.md +40 -21
  156. package/docs/api.md +55 -15
  157. package/docs/authentication.md +60 -37
  158. package/docs/bulk_writes.md +11 -8
  159. package/docs/caching.md +28 -11
  160. package/docs/changelog.md +237 -31
  161. package/docs/configuration.md +99 -118
  162. package/docs/hooks.md +12 -8
  163. package/docs/index.md +17 -17
  164. package/docs/installation.md +23 -18
  165. package/docs/permissions.md +33 -19
  166. package/docs/queries.md +9 -5
  167. package/docs/schemas.md +21 -10
  168. package/docs/special.md +4 -4
  169. package/docs/typescript.md +86 -0
  170. package/docs/websocket.md +99 -1
  171. package/mkdocs.yml +1 -0
  172. package/package.json +121 -69
  173. package/templates/api.pug +32 -0
  174. package/templates/app-server.js +43 -0
  175. package/templates/app.env.sample +8 -0
  176. package/templates/assets/api-console.js +133 -0
  177. package/templates/assets/docs.css +227 -0
  178. package/templates/index.pug +62 -2
  179. package/templates/layout.pug +17 -11
  180. package/templates/md.pug +1 -1
  181. package/templates/model.pug +117 -68
  182. package/templates/navbar.pug +14 -21
  183. package/templates/sidebar.pug +30 -0
  184. package/.env +0 -9
  185. package/.eslintrc.json +0 -20
  186. package/.jshintrc +0 -4
  187. package/.vscode/launch.json +0 -34
  188. package/.vscode/settings.json +0 -3
  189. package/Dockerfile +0 -7
  190. package/bin/init_db.js +0 -54
  191. package/bin/server.js +0 -131
  192. package/bin/setup.js +0 -190
  193. package/config_sample.json +0 -10
  194. package/docker-compose.yml +0 -32
  195. package/libs/cache.js +0 -92
  196. package/libs/connection_string.js +0 -24
  197. package/libs/datamunging.js +0 -335
  198. package/libs/docs.js +0 -162
  199. package/libs/groups.js +0 -133
  200. package/libs/jxp.js +0 -1208
  201. package/libs/login.js +0 -222
  202. package/libs/modeldir.js +0 -14
  203. package/libs/schema.js +0 -99
  204. package/libs/security.js +0 -410
  205. package/libs/setup.js +0 -90
  206. package/models/apikey_model.js +0 -10
  207. package/models/link_model.js +0 -17
  208. package/models/refreshtoken_model.js +0 -20
  209. package/models/test_model.js +0 -50
  210. package/models/token_model.js +0 -23
  211. package/models/user_model.js +0 -38
  212. package/models/usergroups_model.js +0 -15
  213. package/setup.sh +0 -3
  214. package/test/.eslintrc.json +0 -13
  215. package/test/auth.js +0 -190
  216. package/test/init.js +0 -92
  217. package/test/setup.test.js +0 -62
  218. package/test/test.js +0 -1527
  219. package/test/wstest.js.old +0 -124
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Restify pulls in `spdy` → `http-deceiver`, which uses deprecated
5
+ * process.binding('http_parser') on Node 22+. Harmless until upstream fixes lazy loading.
6
+ */
7
+ const originalEmit = process.emit.bind(process);
8
+ process.emit = function emit(name, data, ...args) {
9
+ if (name === "warning" &&
10
+ typeof data === "object" &&
11
+ data !== null &&
12
+ "name" in data &&
13
+ data.name === "DeprecationWarning" &&
14
+ "message" in data &&
15
+ typeof data.message === "string" &&
16
+ data.message.includes("process.binding('http_parser')")) {
17
+ return false;
18
+ }
19
+ return originalEmit(name, data, ...args);
20
+ };
21
+ //# sourceMappingURL=startup-deprecations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-deprecations.js","sourceRoot":"","sources":["../../src/libs/startup-deprecations.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAEhD,OAAO,CAAC,IAAI,GAAG,SAAS,IAAI,CAC3B,IAAqB,EACrB,IAAa,EACb,GAAG,IAAe;IAElB,IACC,IAAI,KAAK,SAAS;QAClB,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,MAAM,IAAI,IAAI;QACb,IAA8B,CAAC,IAAI,KAAK,oBAAoB;QAC7D,SAAS,IAAI,IAAI;QACjB,OAAQ,IAAc,CAAC,OAAO,KAAK,QAAQ;QAC1C,IAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EACjE,CAAC;QACF,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;AAC1C,CAAwB,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface StartupContext {
2
+ name: string;
3
+ version: string;
4
+ mongoUri: string;
5
+ accessLog?: string;
6
+ maxPoolSize?: number;
7
+ }
8
+ export interface ReadyContext extends StartupContext {
9
+ url: string;
10
+ mongooseVersion: string;
11
+ mongoConnectedAt: Date;
12
+ }
13
+ export declare function printBanner(ctx: StartupContext): void;
14
+ export declare function printBooting(ctx: StartupContext): void;
15
+ export declare function printReady(ctx: ReadyContext): void;
16
+ //# sourceMappingURL=startup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup.d.ts","sourceRoot":"","sources":["../../src/libs/startup.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAa,SAAQ,cAAc;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,IAAI,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAWrD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAYtD;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAiBlD"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.printBanner = printBanner;
4
+ exports.printBooting = printBooting;
5
+ exports.printReady = printReady;
6
+ const c = {
7
+ reset: "\x1b[0m",
8
+ bold: "\x1b[1m",
9
+ dim: "\x1b[2m",
10
+ cyan: "\x1b[36m",
11
+ green: "\x1b[32m",
12
+ yellow: "\x1b[33m",
13
+ magenta: "\x1b[35m",
14
+ blue: "\x1b[34m",
15
+ gray: "\x1b[90m",
16
+ };
17
+ const BANNER = [
18
+ " ██╗██╗ ██╗██████╗ ",
19
+ " ██║╚██╗██╔╝██╔══██╗",
20
+ " ██║ ╚███╔╝ ██████╔╝",
21
+ "██ ██║ ██╔██╗ ██╔═══╝ ",
22
+ "╚█████╔╝██╔╝ ██╗██║ ",
23
+ " ╚════╝ ╚═╝ ╚═╝╚═╝ ",
24
+ ].join("\n");
25
+ function printBanner(ctx) {
26
+ const versionTag = `${ctx.name} v${ctx.version}`;
27
+ const bannerWidth = BANNER.split("\n")[0]?.length ?? versionTag.length;
28
+ const pad = Math.max(0, Math.floor((bannerWidth - versionTag.length) / 2));
29
+ console.log("");
30
+ console.log(`${c.cyan}${BANNER}${c.reset}`);
31
+ console.log(`${c.dim}${" ".repeat(pad)}${c.bold}${c.magenta}${versionTag}${c.reset}${c.dim} · REST API framework${c.reset}`);
32
+ console.log("");
33
+ }
34
+ function printBooting(ctx) {
35
+ const mongoDisplay = maskMongoCredentials(ctx.mongoUri);
36
+ console.log(`${c.gray} ┌─ booting${c.reset}`);
37
+ console.log(`${c.gray} │${c.reset} ${c.dim}MongoDB${c.reset} ${mongoDisplay}`);
38
+ if (ctx.accessLog) {
39
+ console.log(`${c.gray} │${c.reset} ${c.dim}Access log${c.reset} ${ctx.accessLog}`);
40
+ }
41
+ if (ctx.maxPoolSize) {
42
+ console.log(`${c.gray} │${c.reset} ${c.dim}Pool max${c.reset} ${ctx.maxPoolSize}`);
43
+ }
44
+ console.log(`${c.gray} └─${c.reset}`);
45
+ console.log("");
46
+ }
47
+ function printReady(ctx) {
48
+ const mongoDisplay = maskMongoCredentials(ctx.mongoUri);
49
+ const time = ctx.mongoConnectedAt.toLocaleTimeString();
50
+ console.log(`${c.green}${c.bold} ✓ Ready${c.reset}`);
51
+ console.log(`${c.gray} ├─${c.reset} ${c.dim}HTTP${c.reset} ${c.cyan}${ctx.url}${c.reset}`);
52
+ console.log(`${c.gray} ├─${c.reset} ${c.dim}MongoDB${c.reset} ${c.green}connected${c.reset} ${c.dim}at ${time}${c.reset}`);
53
+ console.log(`${c.gray} ├─${c.reset} ${c.dim}Database${c.reset} ${mongoDisplay}`);
54
+ if (ctx.accessLog) {
55
+ console.log(`${c.gray} ├─${c.reset} ${c.dim}Access log${c.reset} ${ctx.accessLog}`);
56
+ }
57
+ console.log(`${c.gray} └─${c.reset} ${c.dim}Mongoose${c.reset} v${ctx.mongooseVersion}${c.reset}`);
58
+ console.log("");
59
+ }
60
+ function maskMongoCredentials(uri) {
61
+ return uri.replace(/\/\/([^@/]+@)/, "//***@");
62
+ }
63
+ //# sourceMappingURL=startup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup.js","sourceRoot":"","sources":["../../src/libs/startup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ws.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/libs/ws.ts"],"names":[],"mappings":""}
@@ -1,33 +1,38 @@
1
+ "use strict";
1
2
  /*
2
3
  $auth
3
4
  $subscribe
4
5
  $fetch
5
6
  */
6
-
7
+ Object.defineProperty(exports, "__esModule", { value: true });
7
8
  const WS = require("ws");
8
9
  const url = require('url');
9
10
  const crypto = require("crypto");
10
11
  const security = require("./security");
11
12
  let client_count = 0;
12
13
  const EventEmitter = require("events");
13
-
14
- class Emitter extends EventEmitter { }
14
+ class Emitter extends EventEmitter {
15
+ }
15
16
  const emitter = new Emitter();
16
17
  emitter.setMaxListeners(500);
17
-
18
18
  let models = [];
19
-
20
19
  const md5 = s => {
21
20
  return crypto.createHash('md5').update(String(s)).digest("hex");
22
- }
23
-
21
+ };
24
22
  const wss = new WS.Server({ noServer: true });
25
-
26
23
  const init = (data) => {
27
24
  models = data.models;
28
- }
29
-
25
+ };
30
26
  class WSClient {
27
+ ws;
28
+ id_string;
29
+ id;
30
+ msg_count;
31
+ is_authed;
32
+ user;
33
+ groups;
34
+ actions;
35
+ listeners;
31
36
  constructor(ws) {
32
37
  this.ws = ws;
33
38
  this.id_string = `client-${client_count++}-${+new Date()}`;
@@ -40,33 +45,36 @@ class WSClient {
40
45
  auth: this.auth,
41
46
  subscribe: this.subscribe,
42
47
  unsubscribe: this.unsubscribe
43
- }
48
+ };
44
49
  this.listeners = {};
45
50
  }
46
-
47
51
  close() {
48
52
  this.is_authed = false;
49
53
  this.user = null;
50
- this.listeners = [];
54
+ this.listeners = {};
51
55
  }
52
-
53
56
  async receive(msg) {
54
57
  this.msg_count++;
55
58
  let parsed_msg = null;
56
59
  try {
57
60
  parsed_msg = JSON.parse(msg);
58
- } catch (err) {
61
+ }
62
+ catch (err) {
59
63
  console.log("Unable to parse message", msg);
60
64
  return {
61
65
  status: "error",
62
66
  message: "Unable to parse message"
63
- }
67
+ };
64
68
  }
65
69
  try {
66
- if (typeof parsed_msg !== "object") throw "msg should be an object";
67
- if (!parsed_msg.action) throw "missing action";
68
- if (!this.actions[parsed_msg.action]) throw `action ${parsed_msg.action} not implemented`;
69
- if (!parsed_msg.msg_id) throw `missing msg_id`;
70
+ if (typeof parsed_msg !== "object")
71
+ throw "msg should be an object";
72
+ if (!parsed_msg.action)
73
+ throw "missing action";
74
+ if (!this.actions[parsed_msg.action])
75
+ throw `action ${parsed_msg.action} not implemented`;
76
+ if (!parsed_msg.msg_id)
77
+ throw `missing msg_id`;
70
78
  parsed_msg.data = parsed_msg.data || {};
71
79
  const result = await this.actions[parsed_msg.action].call(this, parsed_msg.data);
72
80
  return {
@@ -75,21 +83,20 @@ class WSClient {
75
83
  client_id: this.id,
76
84
  msg_id: parsed_msg.msg_id,
77
85
  result
78
- }
79
- } catch (err) {
86
+ };
87
+ }
88
+ catch (err) {
80
89
  console.error(err);
81
90
  return {
82
91
  status: "error",
83
92
  message: err,
84
93
  msg_id: parsed_msg.msg_id
85
- }
94
+ };
86
95
  }
87
96
  }
88
-
89
97
  async ping() {
90
98
  return "pong!";
91
99
  }
92
-
93
100
  async auth(data) {
94
101
  let user = null;
95
102
  if (data.email && data.password) {
@@ -101,57 +108,66 @@ class WSClient {
101
108
  if (data.token) {
102
109
  user = await security.bearerAuth(data.token);
103
110
  }
104
- if (!user || !user.email) throw "Unable to authenticate";
111
+ if (!user || !user.email)
112
+ throw "Unable to authenticate";
105
113
  this.user = user;
106
114
  this.is_authed = true;
107
115
  this.groups = await security.getGroups(this.user._id);
108
- console.log(`Logged in ${user.name} <${user.email}>`)
116
+ console.log(`Logged in ${user.name} <${user.email}>`);
109
117
  return "Authed";
110
118
  }
111
-
112
119
  async subscribe(data) {
113
120
  try {
114
- if (!this.is_authed) throw ("User not authenticated");
121
+ if (!this.is_authed)
122
+ throw ("User not authenticated");
115
123
  if (data.id) {
116
- if (this.listeners[`put-${this.id}-${data.model}-${data.id}`]) return `Already subscribed`;
124
+ if (this.listeners[`put-${this.id}-${data.model}-${data.id}`])
125
+ return `Already subscribed`;
117
126
  await security.check_perms(this.user, this.groups, models[data.model], "r", data.id);
118
127
  // Put
119
128
  this.listeners[`put-${this.id}-${data.model}-${data.id}`] = {};
120
129
  this.listeners[`put-${this.id}-${data.model}-${data.id}`].fn = this.sendPut.bind(this);
121
- if (data.filter) this.listeners[`put-${this.id}-${data.model}-${data.id}`].filter = data.filter;
130
+ if (data.filter)
131
+ this.listeners[`put-${this.id}-${data.model}-${data.id}`].filter = data.filter;
122
132
  emitter.on(`put-${data.model}-${data.id}`, this.listeners[`put-${this.id}-${data.model}-${data.id}`].fn);
123
133
  // Delete
124
134
  this.listeners[`del-${this.id}-${data.model}-${data.id}`] = {};
125
135
  this.listeners[`del-${this.id}-${data.model}-${data.id}`].fn = this.sendPut.bind(this);
126
- if (data.filter) this.listeners[`del-${this.id}-${data.model}-${data.id}`].filter = data.filter;
136
+ if (data.filter)
137
+ this.listeners[`del-${this.id}-${data.model}-${data.id}`].filter = data.filter;
127
138
  emitter.on(`del-${data.model}-${data.id}`, this.listeners[`del-${this.id}-${data.model}-${data.id}`].fn);
128
139
  return `Subscribed to put-${this.id}-${data.model}-${data.id}`;
129
- } else {
130
- if (this.listeners[`post-${this.id}-${data.model}`]) return `Already subscribed`;
140
+ }
141
+ else {
142
+ if (this.listeners[`post-${this.id}-${data.model}`])
143
+ return `Already subscribed`;
131
144
  await security.check_perms(this.user, this.groups, models[data.model], "r");
132
145
  // Post
133
146
  this.listeners[`post-${this.id}-${data.model}`] = {};
134
- if (data.filter) this.listeners[`post-${this.id}-${data.model}`].filter = data.filter;
147
+ if (data.filter)
148
+ this.listeners[`post-${this.id}-${data.model}`].filter = data.filter;
135
149
  this.listeners[`post-${this.id}-${data.model}`].fn = this.sendPost.bind(this);
136
150
  emitter.on(`post-${data.model}`, this.listeners[`post-${this.id}-${data.model}`].fn);
137
151
  // Put
138
152
  this.listeners[`put-${this.id}-${data.model}`] = {};
139
153
  this.listeners[`put-${this.id}-${data.model}`].fn = this.sendPut.bind(this);
140
- if (data.filter) this.listeners[`put-${this.id}-${data.model}`].filter = data.filter;
154
+ if (data.filter)
155
+ this.listeners[`put-${this.id}-${data.model}`].filter = data.filter;
141
156
  emitter.on(`put-${data.model}`, this.listeners[`put-${this.id}-${data.model}`].fn);
142
157
  // Delete
143
158
  this.listeners[`del-${this.id}-${data.model}`] = {};
144
159
  this.listeners[`del-${this.id}-${data.model}`].fn = this.sendPut.bind(this);
145
- if (data.filter) this.listeners[`del-${this.id}-${data.model}`].filter = data.filter;
160
+ if (data.filter)
161
+ this.listeners[`del-${this.id}-${data.model}`].filter = data.filter;
146
162
  emitter.on(`del-${data.model}`, this.listeners[`del-${this.id}-${data.model}`].fn);
147
163
  return `Subscribed to post-${this.id}-${data.model}`;
148
164
  }
149
- } catch (err) {
165
+ }
166
+ catch (err) {
150
167
  console.error(err);
151
168
  return `Failed to subscribe to ${data.model} (${err})`;
152
169
  }
153
170
  }
154
-
155
171
  async unsubscribe(data) {
156
172
  if (data.id) {
157
173
  emitter.off(`put-${this.id}-${data.model}-${data._id}`, this.listeners[`put-${this.id}-${data.model}-${data._id}`].fn);
@@ -159,7 +175,8 @@ class WSClient {
159
175
  emitter.off(`del-${this.id}-${data.model}-${data._id}`, this.listeners[`del-${this.id}-${data.model}-${data._id}`].fn);
160
176
  delete (this.listeners[`del-${this.id}-${data.model}-${data._id}`]);
161
177
  return `Unsubscribed to ${data.model}-${data._id}`;
162
- } else {
178
+ }
179
+ else {
163
180
  emitter.off(`post-${this.id}-${data.model}`, this.listeners[`post-${this.id}-${data.model}`].fn);
164
181
  delete (this.listeners[`post-${this.id}-${data.model}`]);
165
182
  emitter.off(`put-${this.id}-${data.model}`, this.listeners[`put-${this.id}-${data.model}`].fn);
@@ -169,19 +186,20 @@ class WSClient {
169
186
  return `Unsubscribed to ${data.model}`;
170
187
  }
171
188
  }
172
-
173
189
  async send(data) {
174
190
  this.ws.send(JSON.stringify({ client_id: this.id, data }));
175
191
  }
176
-
177
192
  async sendPost(data) {
178
193
  if (this.listeners[`post-${this.id}-${data.modelname}`] && this.listeners[`post-${this.id}-${data.modelname}`].filter) {
179
194
  let passed = false;
180
- if (!Object.keys(this.listeners[`post-${this.id}-${data.modelname}`].filter).length) passed = true;
195
+ if (!Object.keys(this.listeners[`post-${this.id}-${data.modelname}`].filter).length)
196
+ passed = true;
181
197
  for (let filter in this.listeners[`post-${this.id}-${data.modelname}`].filter) {
182
- if (data.result[filter].toString() === this.listeners[`post-${this.id}-${data.modelname}`].filter[filter]) passed = true;
198
+ if (data.result[filter].toString() === this.listeners[`post-${this.id}-${data.modelname}`].filter[filter])
199
+ passed = true;
183
200
  }
184
- if (!passed) return;
201
+ if (!passed)
202
+ return;
185
203
  }
186
204
  this.send({
187
205
  event: "post",
@@ -192,15 +210,17 @@ class WSClient {
192
210
  user_email: data.user.email,
193
211
  });
194
212
  }
195
-
196
213
  async sendPut(data) {
197
214
  if (this.listeners[`put-${this.id}-${data.modelname}`] && this.listeners[`put-${this.id}-${data.modelname}`].filter) {
198
215
  let passed = false;
199
- if (!Object.keys(this.listeners[`post-${this.id}-${data.modelname}`].filter).length) passed = true;
216
+ if (!Object.keys(this.listeners[`post-${this.id}-${data.modelname}`].filter).length)
217
+ passed = true;
200
218
  for (let filter in this.listeners[`put-${this.id}-${data.modelname}`].filter) {
201
- if (data.result[filter].toString() === this.listeners[`put-${this.id}-${data.modelname}`].filter[filter]) passed = true;
219
+ if (data.result[filter].toString() === this.listeners[`put-${this.id}-${data.modelname}`].filter[filter])
220
+ passed = true;
202
221
  }
203
- if (!passed) return;
222
+ if (!passed)
223
+ return;
204
224
  }
205
225
  this.send({
206
226
  event: "put",
@@ -211,15 +231,17 @@ class WSClient {
211
231
  user_email: data.user.email,
212
232
  });
213
233
  }
214
-
215
234
  async sendDel(data) {
216
235
  if (this.listeners[`del-${this.id}-${data.modelname}`] && this.listeners[`del-${this.id}-${data.modelname}`].filter) {
217
236
  let passed = false;
218
- if (!Object.keys(this.listeners[`post-${this.id}-${data.modelname}`].filter).length) passed = true;
237
+ if (!Object.keys(this.listeners[`post-${this.id}-${data.modelname}`].filter).length)
238
+ passed = true;
219
239
  for (let filter in this.listeners[`del-${this.id}-${data.modelname}`].filter) {
220
- if (data.result[filter].toString() === this.listeners[`del-${this.id}-${data.modelname}`].filter[filter]) passed = true;
240
+ if (data.result[filter].toString() === this.listeners[`del-${this.id}-${data.modelname}`].filter[filter])
241
+ passed = true;
221
242
  }
222
- if (!passed) return;
243
+ if (!passed)
244
+ return;
223
245
  }
224
246
  this.send({
225
247
  event: "del",
@@ -231,13 +253,11 @@ class WSClient {
231
253
  });
232
254
  }
233
255
  }
234
-
235
256
  wss.on('connection', function connection(ws) {
236
257
  try {
237
258
  const client = new WSClient(ws);
238
259
  const startTime = Date.now();
239
260
  console.log(`New WebSocket connection established at ${new Date()}`);
240
-
241
261
  ws.on('message', async function message(msg) {
242
262
  const messageStartTime = Date.now();
243
263
  try {
@@ -245,22 +265,22 @@ wss.on('connection', function connection(ws) {
245
265
  const result = await client.receive(msg);
246
266
  ws.send(JSON.stringify(result));
247
267
  console.log(`Message processed in ${Date.now() - messageStartTime}ms`);
248
- } catch (err) {
268
+ }
269
+ catch (err) {
249
270
  console.error("message error", err);
250
271
  console.error(`Message processing failed after ${Date.now() - messageStartTime}ms`);
251
272
  }
252
273
  });
253
-
254
274
  ws.on('close', function close() {
255
275
  const connectionDuration = Date.now() - startTime;
256
276
  if (client.user) {
257
277
  console.log(`Connection closed for ${client.user.name} <${client.user.email}> after ${connectionDuration}ms`);
258
- } else {
278
+ }
279
+ else {
259
280
  console.log(`Anonymous connection closed after ${connectionDuration}ms`);
260
281
  }
261
282
  client.close();
262
283
  });
263
-
264
284
  // Add ping/pong monitoring
265
285
  const pingInterval = setInterval(() => {
266
286
  if (ws.readyState === ws.OPEN) {
@@ -274,45 +294,43 @@ wss.on('connection', function connection(ws) {
274
294
  });
275
295
  }
276
296
  }, 30000);
277
-
278
297
  ws.on('close', () => clearInterval(pingInterval));
279
- } catch (err) {
298
+ }
299
+ catch (err) {
280
300
  console.error("connection error", err);
281
301
  }
282
302
  });
283
-
284
303
  const upgrade = async (req, socket, head) => {
285
304
  try {
286
305
  const pathname = url.parse(req.url).pathname;
287
- if (pathname !== "/websocket") throw ("Only /websocket endpoint supported");
306
+ if (pathname !== "/websocket")
307
+ throw ("Only /websocket endpoint supported");
288
308
  wss.handleUpgrade(req, socket, head, function done(ws) {
289
309
  wss.emit('connection', ws, req);
290
310
  });
291
- } catch (err) {
311
+ }
312
+ catch (err) {
292
313
  console.log("Websocket Auth failed");
293
314
  socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
294
315
  socket.destroy();
295
316
  }
296
- }
297
-
317
+ };
298
318
  const postHook = async (modelname, result, user) => {
299
319
  emitter.emit(`post-${modelname}`, { modelname, result, user });
300
- }
301
-
320
+ };
302
321
  const putHook = async (modelname, result, user) => {
303
322
  emitter.emit(`put-${modelname}-${result._id}`, { modelname, result, user });
304
323
  emitter.emit(`put-${modelname}`, { modelname, result, user });
305
- }
306
-
324
+ };
307
325
  const delHook = async (modelname, result, user) => {
308
326
  emitter.emit(`del-${modelname}-${result._id}`, { modelname, result, user });
309
327
  emitter.emit(`del-${modelname}`, { modelname, result, user });
310
- }
311
-
328
+ };
312
329
  module.exports = {
313
330
  upgrade,
314
331
  postHook,
315
332
  putHook,
316
333
  delHook,
317
334
  init
318
- };
335
+ };
336
+ //# sourceMappingURL=ws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/libs/ws.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Types } from "mongoose";
2
+ export interface IAPIKey {
3
+ _id?: Types.ObjectId;
4
+ user_id?: Types.ObjectId;
5
+ apikey?: string;
6
+ last_accessed?: Date;
7
+ }
8
+ declare const APIKey: import("mongoose").Model<IAPIKey, {}, {}, {}, any>;
9
+ export default APIKey;
10
+ //# sourceMappingURL=apikey_model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apikey_model.d.ts","sourceRoot":"","sources":["../../src/models/apikey_model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,OAAO;IACvB,GAAG,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,IAAI,CAAC;CACrB;AAQD,QAAA,MAAM,MAAM,oDAAmD,CAAC;AAChE,eAAe,MAAM,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const schema_1 = __importDefault(require("../libs/schema"));
7
+ const APIKeySchema = new schema_1.default({
8
+ user_id: { type: global.ObjectId, index: true, unique: true },
9
+ apikey: { type: String, index: true, unique: true },
10
+ last_accessed: { type: Date, default: Date.now, index: true },
11
+ });
12
+ const APIKey = schema_1.default.model("APIKey", APIKeySchema);
13
+ exports.default = APIKey;
14
+ //# sourceMappingURL=apikey_model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apikey_model.js","sourceRoot":"","sources":["../../src/models/apikey_model.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuC;AAUvC,MAAM,YAAY,GAAG,IAAI,gBAAS,CAAC;IAClC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IAC7D,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACnD,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE;CAC7D,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,gBAAS,CAAC,KAAK,CAAU,QAAQ,EAAE,YAAY,CAAC,CAAC;AAChE,kBAAe,MAAM,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Types } from "mongoose";
2
+ export interface ILink {
3
+ _id?: Types.ObjectId;
4
+ name?: string;
5
+ val?: string;
6
+ }
7
+ declare const Link: import("mongoose").Model<ILink, {}, {}, {}, any>;
8
+ export default Link;
9
+ //# sourceMappingURL=link_model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link_model.d.ts","sourceRoot":"","sources":["../../src/models/link_model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,KAAK;IACrB,GAAG,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAiBD,QAAA,MAAM,IAAI,kDAA6C,CAAC;AACxD,eAAe,IAAI,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const schema_1 = __importDefault(require("../libs/schema"));
7
+ const LinkSchema = new schema_1.default({
8
+ name: String,
9
+ val: String,
10
+ }, {
11
+ perms: {
12
+ admin: "crud",
13
+ owner: "crud",
14
+ user: "cr",
15
+ all: "r",
16
+ },
17
+ });
18
+ const Link = schema_1.default.model("Link", LinkSchema);
19
+ exports.default = Link;
20
+ //# sourceMappingURL=link_model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link_model.js","sourceRoot":"","sources":["../../src/models/link_model.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuC;AASvC,MAAM,UAAU,GAAG,IAAI,gBAAS,CAC/B;IACC,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;CACX,EACD;IACC,KAAK,EAAE;QACN,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,IAAI;QACV,GAAG,EAAE,GAAG;KACR;CACD,CACD,CAAC;AAEF,MAAM,IAAI,GAAG,gBAAS,CAAC,KAAK,CAAQ,MAAM,EAAE,UAAU,CAAC,CAAC;AACxD,kBAAe,IAAI,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Types } from "mongoose";
2
+ export interface IRefreshToken {
3
+ _id?: Types.ObjectId;
4
+ user_id?: Types.ObjectId;
5
+ refresh_token?: string;
6
+ expires_in?: number;
7
+ createdAt?: Date;
8
+ }
9
+ declare const RefreshToken: import("mongoose").Model<IRefreshToken, {}, {}, {}, any>;
10
+ export default RefreshToken;
11
+ //# sourceMappingURL=refreshtoken_model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refreshtoken_model.d.ts","sourceRoot":"","sources":["../../src/models/refreshtoken_model.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC7B,GAAG,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,IAAI,CAAC;CACjB;AAsBD,QAAA,MAAM,YAAY,0DAAqE,CAAC;AACxF,eAAe,YAAY,CAAC"}