@common-stack/server-stack 5.0.4-alpha.7 → 5.0.5-alpha.2

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 (109) hide show
  1. package/lib/MainStackServer.cjs +222 -0
  2. package/lib/MainStackServer.cjs.map +1 -0
  3. package/lib/MainStackServer.d.ts +28 -0
  4. package/lib/MainStackServer.mjs +222 -0
  5. package/lib/MainStackServer.mjs.map +1 -0
  6. package/lib/{stack-server.cjs → StackServer.cjs} +1 -1
  7. package/lib/StackServer.cjs.map +1 -0
  8. package/lib/{stack-server.mjs → StackServer.mjs} +1 -1
  9. package/lib/StackServer.mjs.map +1 -0
  10. package/lib/api/remote-config.cjs +6 -0
  11. package/lib/api/remote-config.cjs.map +1 -0
  12. package/lib/api/remote-config.d.ts +6 -0
  13. package/lib/api/remote-config.mjs +6 -0
  14. package/lib/api/remote-config.mjs.map +1 -0
  15. package/lib/api/resolver.cjs +11 -0
  16. package/lib/api/resolver.cjs.map +1 -0
  17. package/lib/api/resolver.d.ts +10 -0
  18. package/lib/api/resolver.mjs +11 -0
  19. package/lib/api/resolver.mjs.map +1 -0
  20. package/lib/api/root-schema.graphqls.cjs +2 -0
  21. package/lib/api/root-schema.graphqls.cjs.map +1 -0
  22. package/lib/api/root-schema.graphqls.mjs +2 -0
  23. package/lib/api/root-schema.graphqls.mjs.map +1 -0
  24. package/lib/api/scalar.cjs +14 -0
  25. package/lib/api/scalar.cjs.map +1 -0
  26. package/lib/api/scalar.d.ts +2 -0
  27. package/lib/api/scalar.mjs +14 -0
  28. package/lib/api/scalar.mjs.map +1 -0
  29. package/lib/api/schema-builder.cjs +148 -0
  30. package/lib/api/schema-builder.cjs.map +1 -0
  31. package/lib/api/schema-builder.d.ts +24 -0
  32. package/lib/api/schema-builder.mjs +148 -0
  33. package/lib/api/schema-builder.mjs.map +1 -0
  34. package/lib/api/utils.cjs +27 -0
  35. package/lib/api/utils.cjs.map +1 -0
  36. package/lib/api/utils.d.ts +4 -0
  37. package/lib/api/utils.mjs +27 -0
  38. package/lib/api/utils.mjs.map +1 -0
  39. package/lib/config/env-config.cjs +4 -0
  40. package/lib/config/env-config.cjs.map +1 -1
  41. package/lib/config/env-config.d.ts +4 -0
  42. package/lib/config/env-config.mjs +4 -0
  43. package/lib/config/env-config.mjs.map +1 -1
  44. package/lib/connectors/connection-broker.d.ts +2 -2
  45. package/lib/connectors/redis-connector.d.ts +1 -1
  46. package/lib/index.cjs +1 -1
  47. package/lib/index.d.ts +2 -1
  48. package/lib/index.mjs +1 -1
  49. package/lib/interfaces/dbMigration.d.ts +8 -0
  50. package/lib/interfaces/index.d.ts +3 -0
  51. package/lib/interfaces/module-interface.d.ts +13 -0
  52. package/lib/middleware/cors.cjs +26 -0
  53. package/lib/middleware/cors.cjs.map +1 -0
  54. package/lib/middleware/cors.d.ts +6 -0
  55. package/lib/middleware/cors.mjs +26 -0
  56. package/lib/middleware/cors.mjs.map +1 -0
  57. package/lib/middleware/error.cjs +48 -0
  58. package/lib/middleware/error.cjs.map +1 -0
  59. package/lib/middleware/error.d.ts +10 -0
  60. package/lib/middleware/error.mjs +48 -0
  61. package/lib/middleware/error.mjs.map +1 -0
  62. package/lib/middleware/sentry.cjs +3 -0
  63. package/lib/middleware/sentry.cjs.map +1 -0
  64. package/lib/middleware/sentry.d.ts +3 -0
  65. package/lib/middleware/sentry.mjs +3 -0
  66. package/lib/middleware/sentry.mjs.map +1 -0
  67. package/lib/middleware/services.cjs +12 -0
  68. package/lib/middleware/services.cjs.map +1 -0
  69. package/lib/middleware/services.d.ts +2 -0
  70. package/lib/middleware/services.mjs +12 -0
  71. package/lib/middleware/services.mjs.map +1 -0
  72. package/lib/plugins/index.d.ts +1 -0
  73. package/lib/plugins/invalidateCachePlugin.cjs +29 -0
  74. package/lib/plugins/invalidateCachePlugin.cjs.map +1 -0
  75. package/lib/plugins/invalidateCachePlugin.d.ts +5 -0
  76. package/lib/plugins/invalidateCachePlugin.mjs +29 -0
  77. package/lib/plugins/invalidateCachePlugin.mjs.map +1 -0
  78. package/lib/servers/ExpressApp.cjs +40 -0
  79. package/lib/servers/ExpressApp.cjs.map +1 -0
  80. package/lib/servers/ExpressApp.d.ts +3 -0
  81. package/lib/servers/ExpressApp.mjs +40 -0
  82. package/lib/servers/ExpressApp.mjs.map +1 -0
  83. package/lib/servers/GraphqlServer.cjs +146 -0
  84. package/lib/servers/GraphqlServer.cjs.map +1 -0
  85. package/lib/servers/GraphqlServer.d.ts +18 -0
  86. package/lib/servers/GraphqlServer.mjs +146 -0
  87. package/lib/servers/GraphqlServer.mjs.map +1 -0
  88. package/lib/servers/GraphqlWs.cjs +95 -0
  89. package/lib/servers/GraphqlWs.cjs.map +1 -0
  90. package/lib/servers/GraphqlWs.d.ts +14 -0
  91. package/lib/servers/GraphqlWs.mjs +95 -0
  92. package/lib/servers/GraphqlWs.mjs.map +1 -0
  93. package/lib/servers/WebsocketMultipathUpdate.cjs +63 -0
  94. package/lib/servers/WebsocketMultipathUpdate.cjs.map +1 -0
  95. package/lib/servers/WebsocketMultipathUpdate.d.ts +19 -0
  96. package/lib/servers/WebsocketMultipathUpdate.mjs +63 -0
  97. package/lib/servers/WebsocketMultipathUpdate.mjs.map +1 -0
  98. package/lib/servers/mongodb-migration-update.d.ts +36 -0
  99. package/lib/servers/utils.d.ts +14 -0
  100. package/lib/utils/migrations.cjs +26 -0
  101. package/lib/utils/migrations.cjs.map +1 -0
  102. package/lib/utils/migrations.d.ts +32 -0
  103. package/lib/utils/migrations.mjs +26 -0
  104. package/lib/utils/migrations.mjs.map +1 -0
  105. package/package.json +40 -3
  106. package/lib/stack-server.cjs.map +0 -1
  107. package/lib/stack-server.mjs.map +0 -1
  108. /package/lib/{stack-server.d.ts → StackServer.d.ts} +0 -0
  109. /package/lib/{interface.d.ts → interfaces/moleculer.d.ts} +0 -0
@@ -0,0 +1,26 @@
1
+ import cors from'cors';import {logger}from'@cdm-logger/server';import {config}from'../config/env-config.mjs';/* eslint-disable jest/require-hook */
2
+ const CLIENT_URL = config.CLIENT_URL;
3
+ const BACKEND_URL = config.BACKEND_URL;
4
+ const corsWhitelist = [
5
+ BACKEND_URL,
6
+ CLIENT_URL,
7
+ config.GRAPHQL_URL,
8
+ // 'http://localhost:3000',
9
+ ];
10
+ logger.info('Cors whitelist: %j', corsWhitelist);
11
+ const corsOptions = {
12
+ origin: (origin, callback) => {
13
+ if (corsWhitelist.indexOf(origin) !== -1) {
14
+ callback(null, true);
15
+ }
16
+ else {
17
+ // TODO: only throw when in debug mode
18
+ logger.error('url (%s) is not in the whitelist', origin);
19
+ // callback(new Error('Not allowed by CORS'))
20
+ logger.warn('allowing all origins temporarily, you need to disable it.');
21
+ callback(null, true);
22
+ }
23
+ },
24
+ credentials: true,
25
+ };
26
+ const corsMiddleware = cors(corsOptions);export{corsMiddleware};//# sourceMappingURL=cors.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.mjs","sources":["../../src/middleware/cors.ts"],"sourcesContent":[null],"names":[],"mappings":"6GAAA;AAKA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACrC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AAEvC,MAAM,aAAa,GAAG;IAClB,WAAW;IACX,UAAU;AACV,IAAA,MAAM,CAAC,WAAW;;CAErB,CAAC;AACF,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;AACjD,MAAM,WAAW,GAAG;AAChB,IAAA,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAI;QACzB,IAAI,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;AACtC,YAAA,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SACxB;aAAM;;AAEH,YAAA,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAC;;AAEzD,YAAA,MAAM,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;AACzE,YAAA,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SACxB;KACJ;AACD,IAAA,WAAW,EAAE,IAAI;CACpB,CAAC;MAEW,cAAc,GAAG,IAAI,CAAC,WAAW"}
@@ -0,0 +1,48 @@
1
+ 'use strict';var path=require('path'),fs=require('fs'),url=require('url'),server=require('@cdm-logger/server');function _interopNamespaceDefault(e){var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var path__namespace=/*#__PURE__*/_interopNamespaceDefault(path);var fs__namespace=/*#__PURE__*/_interopNamespaceDefault(fs);var url__namespace=/*#__PURE__*/_interopNamespaceDefault(url);/// <reference path='../../../../typings/index.d.ts' />
2
+ let assetMap;
3
+ const stripCircular = (from, seen) => {
4
+ const to = Array.isArray(from) ? [] : {};
5
+ seen = seen || [];
6
+ seen.push(from);
7
+ Object.getOwnPropertyNames(from).forEach(key => {
8
+ if (!from[key] || (typeof from[key] !== 'object' && !Array.isArray(from[key]))) {
9
+ to[key] = from[key];
10
+ }
11
+ else if (seen.indexOf(from[key]) < 0) {
12
+ to[key] = stripCircular(from[key], seen.slice(0));
13
+ }
14
+ else {
15
+ to[key] = '[Circular]';
16
+ }
17
+ });
18
+ return to;
19
+ };
20
+ const { pathname } = url__namespace.parse(__BACKEND_URL__);
21
+ /**
22
+ * Middleware function that takes 4 arguments is classified as "error handling middleware"
23
+ * and will only get called if an error occurs.
24
+ * @param e
25
+ * @param req
26
+ * @param res
27
+ * @param next
28
+ */
29
+ const errorMiddleware = (e, req, res, next) => {
30
+ if (req.path === pathname) {
31
+ const stack = e.stack.toString().replace(/[\n]/g, '\\n');
32
+ res.status(200).send(`[{"data": {}, "errors":[{"message": "${stack}"}]}]`);
33
+ }
34
+ else {
35
+ server.logger.error(e);
36
+ if (__DEV__ || !assetMap) {
37
+ assetMap = JSON.parse(fs__namespace.readFileSync(path__namespace.join(__FRONTEND_BUILD_DIR__, 'assets.json')).toString());
38
+ }
39
+ const serverErrorScript = `<script charset="UTF-8">window.__SERVER_ERROR__=${JSON.stringify(stripCircular(e))};</script>`;
40
+ const vendorScript = assetMap['vendor.js']
41
+ ? `<script src="/${assetMap['vendor.js']}" charSet="utf-8"></script>`
42
+ : '';
43
+ res.status(200).send(`<html>${serverErrorScript}<body><div id="content"></div>
44
+ ${vendorScript}
45
+ <script src="/${assetMap['index.js']}" charSet="utf-8"></script>
46
+ </body></html>`);
47
+ }
48
+ };exports.errorMiddleware=errorMiddleware;//# sourceMappingURL=error.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.cjs","sources":["../../src/middleware/error.ts"],"sourcesContent":[null],"names":["url","logger","fs","path"],"mappings":"ukBAAA;AAQA,IAAI,QAAQ,CAAC;AAEb,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAU,KAAI;AACvC,IAAA,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;AACzC,IAAA,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;AAClB,IAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;QAC3C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC5E,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;SACvB;AAAM,aAAA,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;AACpC,YAAA,EAAE,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACrD;aAAM;AAAE,YAAA,EAAE,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;SAAE;AACtC,KAAC,CAAC,CAAC;AACH,IAAA,OAAO,EAAE,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,EAAE,QAAQ,EAAE,GAAGA,cAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AAEhD;;;;;;;AAOG;AACI,MAAM,eAAe,GACxB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,KAAI;AAClB,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AACvB,QAAA,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACzD,QAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAwC,qCAAA,EAAA,KAAK,CAAO,KAAA,CAAA,CAAC,CAAC;KAC9E;SAAM;AACH,QAAAC,aAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEhB,QAAA,IAAI,OAAO,IAAI,CAAC,QAAQ,EAAE;YACtB,QAAQ,GAAG,IAAI,CAAC,KAAK,CAACC,aAAE,CAAC,YAAY,CAACC,eAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;SACvG;AAED,QAAA,MAAM,iBAAiB,GAAG,CAAmD,gDAAA,EAAA,IAAI,CAAC,SAAS,CACvF,aAAa,CAAC,CAAC,CAAC,CACnB,YAAY,CAAC;AACd,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC;AACtC,cAAE,CAAiB,cAAA,EAAA,QAAQ,CAAC,WAAW,CAAC,CAA6B,2BAAA,CAAA;cACnE,EAAE,CAAC;QAET,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAChB,CAAA,MAAA,EAAS,iBAAiB,CAAA;UAChC,YAAY,CAAA;4BACM,QAAQ,CAAC,UAAU,CAAC,CAAA;AACrB,0BAAA,CAAA,CACd,CAAC;KACL;AACL"}
@@ -0,0 +1,10 @@
1
+ /// <reference types="typings" />
2
+ /**
3
+ * Middleware function that takes 4 arguments is classified as "error handling middleware"
4
+ * and will only get called if an error occurs.
5
+ * @param e
6
+ * @param req
7
+ * @param res
8
+ * @param next
9
+ */
10
+ export declare const errorMiddleware: (e: any, req: any, res: any, next: any) => void;
@@ -0,0 +1,48 @@
1
+ import*as path from'path';import*as fs from'fs';import*as url from'url';import {logger}from'@cdm-logger/server';/// <reference path='../../../../typings/index.d.ts' />
2
+ let assetMap;
3
+ const stripCircular = (from, seen) => {
4
+ const to = Array.isArray(from) ? [] : {};
5
+ seen = seen || [];
6
+ seen.push(from);
7
+ Object.getOwnPropertyNames(from).forEach(key => {
8
+ if (!from[key] || (typeof from[key] !== 'object' && !Array.isArray(from[key]))) {
9
+ to[key] = from[key];
10
+ }
11
+ else if (seen.indexOf(from[key]) < 0) {
12
+ to[key] = stripCircular(from[key], seen.slice(0));
13
+ }
14
+ else {
15
+ to[key] = '[Circular]';
16
+ }
17
+ });
18
+ return to;
19
+ };
20
+ const { pathname } = url.parse(__BACKEND_URL__);
21
+ /**
22
+ * Middleware function that takes 4 arguments is classified as "error handling middleware"
23
+ * and will only get called if an error occurs.
24
+ * @param e
25
+ * @param req
26
+ * @param res
27
+ * @param next
28
+ */
29
+ const errorMiddleware = (e, req, res, next) => {
30
+ if (req.path === pathname) {
31
+ const stack = e.stack.toString().replace(/[\n]/g, '\\n');
32
+ res.status(200).send(`[{"data": {}, "errors":[{"message": "${stack}"}]}]`);
33
+ }
34
+ else {
35
+ logger.error(e);
36
+ if (__DEV__ || !assetMap) {
37
+ assetMap = JSON.parse(fs.readFileSync(path.join(__FRONTEND_BUILD_DIR__, 'assets.json')).toString());
38
+ }
39
+ const serverErrorScript = `<script charset="UTF-8">window.__SERVER_ERROR__=${JSON.stringify(stripCircular(e))};</script>`;
40
+ const vendorScript = assetMap['vendor.js']
41
+ ? `<script src="/${assetMap['vendor.js']}" charSet="utf-8"></script>`
42
+ : '';
43
+ res.status(200).send(`<html>${serverErrorScript}<body><div id="content"></div>
44
+ ${vendorScript}
45
+ <script src="/${assetMap['index.js']}" charSet="utf-8"></script>
46
+ </body></html>`);
47
+ }
48
+ };export{errorMiddleware};//# sourceMappingURL=error.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.mjs","sources":["../../src/middleware/error.ts"],"sourcesContent":[null],"names":[],"mappings":"gHAAA;AAQA,IAAI,QAAQ,CAAC;AAEb,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAU,KAAI;AACvC,IAAA,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;AACzC,IAAA,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;AAClB,IAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,IAAG;QAC3C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC5E,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;SACvB;AAAM,aAAA,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE;AACpC,YAAA,EAAE,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACrD;aAAM;AAAE,YAAA,EAAE,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;SAAE;AACtC,KAAC,CAAC,CAAC;AACH,IAAA,OAAO,EAAE,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AAEhD;;;;;;;AAOG;AACI,MAAM,eAAe,GACxB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,KAAI;AAClB,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AACvB,QAAA,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACzD,QAAA,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAwC,qCAAA,EAAA,KAAK,CAAO,KAAA,CAAA,CAAC,CAAC;KAC9E;SAAM;AACH,QAAA,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEhB,QAAA,IAAI,OAAO,IAAI,CAAC,QAAQ,EAAE;YACtB,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;SACvG;AAED,QAAA,MAAM,iBAAiB,GAAG,CAAmD,gDAAA,EAAA,IAAI,CAAC,SAAS,CACvF,aAAa,CAAC,CAAC,CAAC,CACnB,YAAY,CAAC;AACd,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC;AACtC,cAAE,CAAiB,cAAA,EAAA,QAAQ,CAAC,WAAW,CAAC,CAA6B,2BAAA,CAAA;cACnE,EAAE,CAAC;QAET,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAChB,CAAA,MAAA,EAAS,iBAAiB,CAAA;UAChC,YAAY,CAAA;4BACM,QAAQ,CAAC,UAAU,CAAC,CAAA;AACrB,0BAAA,CAAA,CACd,CAAC;KACL;AACL"}
@@ -0,0 +1,3 @@
1
+ 'use strict';var node=require('@sentry/node');node.init({ dsn: process.env.SENTRY_DSN_BACKEND });
2
+ const sentryMiddleware = node.Handlers.requestHandler();
3
+ const sentryErrorHandlerMiddleware = node.Handlers.errorHandler();exports.sentryErrorHandlerMiddleware=sentryErrorHandlerMiddleware;exports.sentryMiddleware=sentryMiddleware;//# sourceMappingURL=sentry.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry.cjs","sources":["../../src/middleware/sentry.ts"],"sourcesContent":[null],"names":["init","Handlers"],"mappings":"8CAEAA,SAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;MAGjC,gBAAgB,GAAGC,aAAQ,CAAC,cAAc,GAAG;MAE7C,4BAA4B,GAAGA,aAAQ,CAAC,YAAY"}
@@ -0,0 +1,3 @@
1
+ /// <reference types="node" />
2
+ export declare const sentryMiddleware: (req: import("http").IncomingMessage, res: import("http").ServerResponse<import("http").IncomingMessage>, next: (error?: any) => void) => void;
3
+ export declare const sentryErrorHandlerMiddleware: any;
@@ -0,0 +1,3 @@
1
+ import {init,Handlers}from'@sentry/node';init({ dsn: process.env.SENTRY_DSN_BACKEND });
2
+ const sentryMiddleware = Handlers.requestHandler();
3
+ const sentryErrorHandlerMiddleware = Handlers.errorHandler();export{sentryErrorHandlerMiddleware,sentryMiddleware};//# sourceMappingURL=sentry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentry.mjs","sources":["../../src/middleware/sentry.ts"],"sourcesContent":[null],"names":[],"mappings":"yCAEA,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC;MAGjC,gBAAgB,GAAG,QAAQ,CAAC,cAAc,GAAG;MAE7C,4BAA4B,GAAG,QAAQ,CAAC,YAAY"}
@@ -0,0 +1,12 @@
1
+ 'use strict';require('isomorphic-fetch');const contextServicesMiddleware = (createContext, serviceContext) => (req, res, next) => {
2
+ Promise.all([
3
+ createContext(req, res),
4
+ serviceContext(req, res),
5
+ ])
6
+ .then(([context, services]) => {
7
+ req.context = context;
8
+ req.services = services;
9
+ next();
10
+ })
11
+ .catch((err) => next());
12
+ };exports.contextServicesMiddleware=contextServicesMiddleware;//# sourceMappingURL=services.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.cjs","sources":["../../src/middleware/services.ts"],"sourcesContent":[null],"names":[],"mappings":"yCAEa,MAAA,yBAAyB,GAAG,CAAC,aAAa,EAAE,cAAc,KAAM,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,KAAI;IAC5F,OAAO,CAAC,GAAG,CAAC;AACR,QAAA,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC;AACvB,QAAA,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC;KAC3B,CAAC;SACG,IAAI,CAAC,CAAC,CAAE,OAAO,EAAE,QAAQ,CAAE,KAAI;AAC5B,QAAA,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;AACtB,QAAA,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAExB,QAAA,IAAI,EAAE,CAAC;AACX,KAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;AAChC"}
@@ -0,0 +1,2 @@
1
+ import 'isomorphic-fetch';
2
+ export declare const contextServicesMiddleware: (createContext: any, serviceContext: any) => (req: any, res: any, next: any) => void;
@@ -0,0 +1,12 @@
1
+ import'isomorphic-fetch';const contextServicesMiddleware = (createContext, serviceContext) => (req, res, next) => {
2
+ Promise.all([
3
+ createContext(req, res),
4
+ serviceContext(req, res),
5
+ ])
6
+ .then(([context, services]) => {
7
+ req.context = context;
8
+ req.services = services;
9
+ next();
10
+ })
11
+ .catch((err) => next());
12
+ };export{contextServicesMiddleware};//# sourceMappingURL=services.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.mjs","sources":["../../src/middleware/services.ts"],"sourcesContent":[null],"names":[],"mappings":"yBAEa,MAAA,yBAAyB,GAAG,CAAC,aAAa,EAAE,cAAc,KAAM,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,KAAI;IAC5F,OAAO,CAAC,GAAG,CAAC;AACR,QAAA,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC;AACvB,QAAA,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC;KAC3B,CAAC;SACG,IAAI,CAAC,CAAC,CAAE,OAAO,EAAE,QAAQ,CAAE,KAAI;AAC5B,QAAA,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;AACtB,QAAA,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAExB,QAAA,IAAI,EAAE,CAAC;AACX,KAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;AAChC"}
@@ -0,0 +1 @@
1
+ export * from './invalidateCachePlugin';
@@ -0,0 +1,29 @@
1
+ 'use strict';const invalidateCachePlugin = ({ cache }) => {
2
+ return {
3
+ requestDidStart(requestContext) {
4
+ return {
5
+ async willSendResponse(responseContext) {
6
+ try {
7
+ const hasErrors = !!requestContext.errors?.length;
8
+ const { queriesToInvalidate } = requestContext.context;
9
+ const [{ operation }] = responseContext.document.definitions;
10
+ const isMutation = operation === 'mutation';
11
+ if (hasErrors || !queriesToInvalidate?.length || !isMutation) {
12
+ return;
13
+ }
14
+ // this to get the
15
+ const redisClient = cache?.client;
16
+ const nestedKeys = await Promise.all(queriesToInvalidate.map((query) => redisClient.keys(`keyv:fqc:${query}:*`)));
17
+ const keys = nestedKeys.flat();
18
+ await redisClient.del(keys);
19
+ }
20
+ catch (e) {
21
+ requestContext.logger.error('Error occurred in invalidateCachePlugin');
22
+ requestContext.logger.error(e);
23
+ return;
24
+ }
25
+ },
26
+ };
27
+ }
28
+ };
29
+ };exports.invalidateCachePlugin=invalidateCachePlugin;//# sourceMappingURL=invalidateCachePlugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalidateCachePlugin.cjs","sources":["../../src/plugins/invalidateCachePlugin.ts"],"sourcesContent":[null],"names":[],"mappings":"mBASa,qBAAqB,GAAG,CAAC,EAAE,KAAK,EAAyB,KAAI;IACtE,OAAO;AACH,QAAA,eAAe,CAAC,cAAc,EAAA;YAC1B,OAAO;gBACH,MAAM,gBAAgB,CAAC,eAAe,EAAA;AAClC,oBAAA,IAAI;wBACA,MAAM,SAAS,GAAG,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;AAClD,wBAAA,MAAM,EAAE,mBAAmB,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC;wBACvD,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,WAAwC,CAAC;AAC1F,wBAAA,MAAM,UAAU,GAAG,SAAS,KAAK,UAAU,CAAC;wBAC5C,IAAI,SAAS,IAAI,CAAC,mBAAmB,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE;4BAC1D,OAAO;yBACV;;AAED,wBAAA,MAAM,WAAW,GAAG,KAAK,EAAE,MAAe,CAAC;wBAC3C,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAAW,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,IAAI,CAAC,CAAY,SAAA,EAAA,KAAK,CAAI,EAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC5H,wBAAA,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;AAC/B,wBAAA,MAAM,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;qBAC/B;oBAAC,OAAO,CAAC,EAAE;AACR,wBAAA,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;AACvE,wBAAA,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC/B,OAAO;qBACV;iBACJ;aACJ,CAAA;SACJ;KAC2B,CAAC;AACrC"}
@@ -0,0 +1,5 @@
1
+ import { RedisCache } from 'apollo-server-cache-redis';
2
+ import { PluginDefinition } from 'apollo-server-core';
3
+ export declare const invalidateCachePlugin: ({ cache }: {
4
+ cache: RedisCache;
5
+ }) => PluginDefinition;
@@ -0,0 +1,29 @@
1
+ const invalidateCachePlugin = ({ cache }) => {
2
+ return {
3
+ requestDidStart(requestContext) {
4
+ return {
5
+ async willSendResponse(responseContext) {
6
+ try {
7
+ const hasErrors = !!requestContext.errors?.length;
8
+ const { queriesToInvalidate } = requestContext.context;
9
+ const [{ operation }] = responseContext.document.definitions;
10
+ const isMutation = operation === 'mutation';
11
+ if (hasErrors || !queriesToInvalidate?.length || !isMutation) {
12
+ return;
13
+ }
14
+ // this to get the
15
+ const redisClient = cache?.client;
16
+ const nestedKeys = await Promise.all(queriesToInvalidate.map((query) => redisClient.keys(`keyv:fqc:${query}:*`)));
17
+ const keys = nestedKeys.flat();
18
+ await redisClient.del(keys);
19
+ }
20
+ catch (e) {
21
+ requestContext.logger.error('Error occurred in invalidateCachePlugin');
22
+ requestContext.logger.error(e);
23
+ return;
24
+ }
25
+ },
26
+ };
27
+ }
28
+ };
29
+ };export{invalidateCachePlugin};//# sourceMappingURL=invalidateCachePlugin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalidateCachePlugin.mjs","sources":["../../src/plugins/invalidateCachePlugin.ts"],"sourcesContent":[null],"names":[],"mappings":"MASa,qBAAqB,GAAG,CAAC,EAAE,KAAK,EAAyB,KAAI;IACtE,OAAO;AACH,QAAA,eAAe,CAAC,cAAc,EAAA;YAC1B,OAAO;gBACH,MAAM,gBAAgB,CAAC,eAAe,EAAA;AAClC,oBAAA,IAAI;wBACA,MAAM,SAAS,GAAG,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;AAClD,wBAAA,MAAM,EAAE,mBAAmB,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC;wBACvD,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,WAAwC,CAAC;AAC1F,wBAAA,MAAM,UAAU,GAAG,SAAS,KAAK,UAAU,CAAC;wBAC5C,IAAI,SAAS,IAAI,CAAC,mBAAmB,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE;4BAC1D,OAAO;yBACV;;AAED,wBAAA,MAAM,WAAW,GAAG,KAAK,EAAE,MAAe,CAAC;wBAC3C,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAAW,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,IAAI,CAAC,CAAY,SAAA,EAAA,KAAK,CAAI,EAAA,CAAA,CAAC,CAAC,CAAC,CAAC;AAC5H,wBAAA,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;AAC/B,wBAAA,MAAM,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;qBAC/B;oBAAC,OAAO,CAAC,EAAE;AACR,wBAAA,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;AACvE,wBAAA,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC/B,OAAO;qBACV;iBACJ;aACJ,CAAA;SACJ;KAC2B,CAAC;AACrC"}
@@ -0,0 +1,40 @@
1
+ 'use strict';var express=require('express'),bodyParser=require('body-parser'),error=require('../middleware/error.cjs'),services=require('../middleware/services.cjs'),sentry=require('../middleware/sentry.cjs'),cors=require('../middleware/cors.cjs');function _interopNamespaceDefault(e){var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var bodyParser__namespace=/*#__PURE__*/_interopNamespaceDefault(bodyParser);/* eslint-disable @typescript-eslint/no-var-requires */
2
+ const cookiesMiddleware = require('universal-cookie-express');
3
+ function expressApp(modules, options, middlewares, http) {
4
+ const app = express();
5
+ for (const applyBeforeware of modules.beforewares) {
6
+ applyBeforeware(app);
7
+ }
8
+ app.use(cookiesMiddleware());
9
+ app.use(services.contextServicesMiddleware(options.createContext, options.serviceContext));
10
+ // Don't rate limit heroku
11
+ app.enable('trust proxy');
12
+ app.use(sentry.sentryMiddleware);
13
+ if (middlewares !== null) {
14
+ app.use(middlewares);
15
+ }
16
+ app.use('/', express.static(__FRONTEND_BUILD_DIR__, { maxAge: '180 days' }));
17
+ app.use(cors.corsMiddleware);
18
+ app.use((req, res, next) => {
19
+ res.header('Access-Control-Allow-Credentials', JSON.stringify(true));
20
+ res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
21
+ res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, X-CSP-Nonce, Content-Type, Accept');
22
+ next();
23
+ });
24
+ app.use(bodyParser__namespace.json({
25
+ limit: '50mb',
26
+ verify: (req, res, buf) => {
27
+ // #Todo: Find some proper solution for it
28
+ req.rawBody = buf;
29
+ },
30
+ }));
31
+ app.use(bodyParser__namespace.urlencoded({ limit: '50mb', extended: true, parameterLimit: 50000 }));
32
+ for (const applyMiddleware of modules.middlewares) {
33
+ applyMiddleware(app);
34
+ }
35
+ if (__DEV__) {
36
+ app.use(error.errorMiddleware);
37
+ }
38
+ app.use(sentry.sentryErrorHandlerMiddleware);
39
+ return app;
40
+ }exports.expressApp=expressApp;//# sourceMappingURL=ExpressApp.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpressApp.cjs","sources":["../../src/servers/ExpressApp.ts"],"sourcesContent":[null],"names":["contextServicesMiddleware","sentryMiddleware","corsMiddleware","bodyParser","errorMiddleware","sentryErrorHandlerMiddleware"],"mappings":"kmBAAA;AAUA,MAAM,iBAAiB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;AAExD,SAAU,UAAU,CAAC,OAAgB,EAAE,OAAuB,EAAE,WAAW,EAAE,IAAK,EAAA;AACpF,IAAA,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AAEtB,IAAA,KAAK,MAAM,eAAe,IAAI,OAAO,CAAC,WAAW,EAAE;QAC/C,eAAe,CAAC,GAAG,CAAC,CAAC;KACxB;AACD,IAAA,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC7B,IAAA,GAAG,CAAC,GAAG,CAACA,kCAAyB,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;;AAGlF,IAAA,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAE1B,IAAA,GAAG,CAAC,GAAG,CAACC,uBAAgB,CAAC,CAAC;AAE1B,IAAA,IAAI,WAAW,KAAK,IAAI,EAAE;AACtB,QAAA,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;KACxB;AAED,IAAA,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;AAE7E,IAAA,GAAG,CAAC,GAAG,CAACC,mBAAc,CAAC,CAAC;IACxB,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,KAAI;AACvB,QAAA,GAAG,CAAC,MAAM,CAAC,kCAAkC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AACrE,QAAA,GAAG,CAAC,MAAM,CAAC,8BAA8B,EAAE,qBAAqB,CAAC,CAAC;AAClE,QAAA,GAAG,CAAC,MAAM,CACN,8BAA8B,EAC9B,6EAA6E,CAChF,CAAC;AACF,QAAA,IAAI,EAAE,CAAC;AACX,KAAC,CAAC,CAAC;AAEH,IAAA,GAAG,CAAC,GAAG,CACHC,qBAAU,CAAC,IAAI,CAAC;AACZ,QAAA,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,KAAI;;AAErB,YAAA,GAAW,CAAC,OAAO,GAAG,GAAG,CAAC;SAC9B;AACJ,KAAA,CAAC,CACL,CAAC;IACF,GAAG,CAAC,GAAG,CAACA,qBAAU,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAEzF,IAAA,KAAK,MAAM,eAAe,IAAI,OAAO,CAAC,WAAW,EAAE;QAC/C,eAAe,CAAC,GAAG,CAAC,CAAC;KACxB;IAED,IAAI,OAAO,EAAE;AACT,QAAA,GAAG,CAAC,GAAG,CAACC,qBAAe,CAAC,CAAC;KAC5B;AAED,IAAA,GAAG,CAAC,GAAG,CAACC,mCAA4B,CAAC,CAAC;AAEtC,IAAA,OAAO,GAAG,CAAC;AACf"}
@@ -0,0 +1,3 @@
1
+ import { Feature } from '@common-stack/server-core';
2
+ import { IModuleService } from '../interfaces';
3
+ export declare function expressApp(modules: Feature, options: IModuleService, middlewares: any, http?: any): import("express-serve-static-core").Express;
@@ -0,0 +1,40 @@
1
+ import express from'express';import*as bodyParser from'body-parser';import {errorMiddleware}from'../middleware/error.mjs';import {contextServicesMiddleware}from'../middleware/services.mjs';import {sentryMiddleware,sentryErrorHandlerMiddleware}from'../middleware/sentry.mjs';import {corsMiddleware}from'../middleware/cors.mjs';/* eslint-disable @typescript-eslint/no-var-requires */
2
+ const cookiesMiddleware = require('universal-cookie-express');
3
+ function expressApp(modules, options, middlewares, http) {
4
+ const app = express();
5
+ for (const applyBeforeware of modules.beforewares) {
6
+ applyBeforeware(app);
7
+ }
8
+ app.use(cookiesMiddleware());
9
+ app.use(contextServicesMiddleware(options.createContext, options.serviceContext));
10
+ // Don't rate limit heroku
11
+ app.enable('trust proxy');
12
+ app.use(sentryMiddleware);
13
+ if (middlewares !== null) {
14
+ app.use(middlewares);
15
+ }
16
+ app.use('/', express.static(__FRONTEND_BUILD_DIR__, { maxAge: '180 days' }));
17
+ app.use(corsMiddleware);
18
+ app.use((req, res, next) => {
19
+ res.header('Access-Control-Allow-Credentials', JSON.stringify(true));
20
+ res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
21
+ res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, X-CSP-Nonce, Content-Type, Accept');
22
+ next();
23
+ });
24
+ app.use(bodyParser.json({
25
+ limit: '50mb',
26
+ verify: (req, res, buf) => {
27
+ // #Todo: Find some proper solution for it
28
+ req.rawBody = buf;
29
+ },
30
+ }));
31
+ app.use(bodyParser.urlencoded({ limit: '50mb', extended: true, parameterLimit: 50000 }));
32
+ for (const applyMiddleware of modules.middlewares) {
33
+ applyMiddleware(app);
34
+ }
35
+ if (__DEV__) {
36
+ app.use(errorMiddleware);
37
+ }
38
+ app.use(sentryErrorHandlerMiddleware);
39
+ return app;
40
+ }export{expressApp};//# sourceMappingURL=ExpressApp.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExpressApp.mjs","sources":["../../src/servers/ExpressApp.ts"],"sourcesContent":[null],"names":[],"mappings":"sUAAA;AAUA,MAAM,iBAAiB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;AAExD,SAAU,UAAU,CAAC,OAAgB,EAAE,OAAuB,EAAE,WAAW,EAAE,IAAK,EAAA;AACpF,IAAA,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AAEtB,IAAA,KAAK,MAAM,eAAe,IAAI,OAAO,CAAC,WAAW,EAAE;QAC/C,eAAe,CAAC,GAAG,CAAC,CAAC;KACxB;AACD,IAAA,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC7B,IAAA,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;;AAGlF,IAAA,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAE1B,IAAA,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAE1B,IAAA,IAAI,WAAW,KAAK,IAAI,EAAE;AACtB,QAAA,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;KACxB;AAED,IAAA,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;AAE7E,IAAA,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACxB,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,KAAI;AACvB,QAAA,GAAG,CAAC,MAAM,CAAC,kCAAkC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AACrE,QAAA,GAAG,CAAC,MAAM,CAAC,8BAA8B,EAAE,qBAAqB,CAAC,CAAC;AAClE,QAAA,GAAG,CAAC,MAAM,CACN,8BAA8B,EAC9B,6EAA6E,CAChF,CAAC;AACF,QAAA,IAAI,EAAE,CAAC;AACX,KAAC,CAAC,CAAC;AAEH,IAAA,GAAG,CAAC,GAAG,CACH,UAAU,CAAC,IAAI,CAAC;AACZ,QAAA,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,KAAI;;AAErB,YAAA,GAAW,CAAC,OAAO,GAAG,GAAG,CAAC;SAC9B;AACJ,KAAA,CAAC,CACL,CAAC;IACF,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAEzF,IAAA,KAAK,MAAM,eAAe,IAAI,OAAO,CAAC,WAAW,EAAE;QAC/C,eAAe,CAAC,GAAG,CAAC,CAAC;KACxB;IAED,IAAI,OAAO,EAAE;AACT,QAAA,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;KAC5B;AAED,IAAA,GAAG,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAEtC,IAAA,OAAO,GAAG,CAAC;AACf"}
@@ -0,0 +1,146 @@
1
+ 'use strict';var apolloServerExpress=require('apollo-server-express'),apolloServerCore=require('apollo-server-core'),responseCachePluginSource=require('apollo-server-plugin-response-cache');require('isomorphic-fetch');var Keyv=require('keyv'),KeyvRedis=require('@keyv/redis'),utils_keyvadapter=require('@apollo/utils.keyvadapter'),invalidateCachePlugin=require('../plugins/invalidateCachePlugin.cjs'),ws=require('ws'),GraphqlWs=require('./GraphqlWs.cjs'),envConfig=require('../config/env-config.cjs');const responseCachePlugin = responseCachePluginSource.default ?? responseCachePluginSource;
2
+ let debug = false;
3
+ if ((process.env.LOG_LEVEL && process.env.LOG_LEVEL === 'trace') || process.env.LOG_LEVEL === 'debug') {
4
+ debug = true;
5
+ }
6
+ // @workaround as the `dataSources` not available in Subscription (websocket) Context.
7
+ // https://github.com/apollographql/apollo-server/issues/1526 need to revisit in Apollo-Server v3.
8
+ const constructDataSourcesForSubscriptions = (context, cache, dataSources) => {
9
+ const intializeDataSource = (instance) => {
10
+ instance.initialize({ context, cache });
11
+ };
12
+ // tslint:disable-next-line:forin
13
+ // eslint-disable-next-line guard-for-in
14
+ for (const prop in dataSources) {
15
+ intializeDataSource(dataSources[prop]);
16
+ }
17
+ return dataSources;
18
+ };
19
+ let wsServerCleanup;
20
+ class GraphqlServer {
21
+ app;
22
+ httpServer;
23
+ cache;
24
+ moduleService;
25
+ enableSubscription;
26
+ logger;
27
+ constructor(app, httpServer, cache, moduleService, enableSubscription = true) {
28
+ this.app = app;
29
+ this.httpServer = httpServer;
30
+ this.cache = cache;
31
+ this.moduleService = moduleService;
32
+ this.enableSubscription = enableSubscription;
33
+ this.logger = this.moduleService.logger.child({ className: 'GraphqlServer' });
34
+ if (enableSubscription) {
35
+ const wsServer = new ws.WebSocketServer({
36
+ server: this.httpServer,
37
+ path: envConfig.config.GRAPHQL_ENDPOINT,
38
+ });
39
+ const graphqlWs = new GraphqlWs.GraphqlWs(wsServer, this.moduleService, this.cache);
40
+ wsServerCleanup = graphqlWs.create();
41
+ }
42
+ }
43
+ async initialize() {
44
+ this.logger.info('GraphqlServer initializing...');
45
+ const apolloServer = this.configureApolloServer();
46
+ await apolloServer.start();
47
+ const corsOptions = {
48
+ origin: [envConfig.config.CLIENT_URL],
49
+ credentials: true,
50
+ };
51
+ apolloServer.applyMiddleware({
52
+ app: this.app,
53
+ cors: corsOptions,
54
+ path: envConfig.config.GRAPHQL_ENDPOINT,
55
+ });
56
+ this.logger.info('GraphqlServer initialized - ', envConfig.config.CLIENT_URL);
57
+ }
58
+ getUserIpAddress(req) {
59
+ let ip = (req?.headers['x-forwarded-for'] || '').split(',')[0] || req?.connection?.remoteAddress;
60
+ if (ip.substr(0, 7) === '::ffff:') {
61
+ ip = ip.substr(7);
62
+ }
63
+ if (ip === '::1') {
64
+ ip = '127.0.0.1';
65
+ }
66
+ return ip;
67
+ }
68
+ configureApolloServer() {
69
+ this.logger.info('-- Configuring Apollo Server --');
70
+ // @ts-ignore
71
+ const cache = new utils_keyvadapter.KeyvAdapter(new Keyv({ store: new KeyvRedis(this.cache.client) }), {
72
+ disableBatchReads: true,
73
+ });
74
+ const serverConfig = {
75
+ debug,
76
+ cache,
77
+ schema: this.moduleService.schema,
78
+ dataSources: () => this.moduleService.dataSource,
79
+ context: async ({ req, res, connection, }) => {
80
+ let context;
81
+ let addons = {};
82
+ try {
83
+ if (connection) {
84
+ context = connection.context;
85
+ if (!context.dataSources) {
86
+ addons = {
87
+ // @workaround for apollo server issue #1526
88
+ dataSources: constructDataSourcesForSubscriptions(connection.context, this.cache, this.moduleService.dataSource),
89
+ };
90
+ }
91
+ else {
92
+ addons = {
93
+ // @workaround for apollo server issue #1526
94
+ dataSources: context.dataSources,
95
+ };
96
+ }
97
+ }
98
+ else {
99
+ const pureContext = await this.moduleService.createContext(req, res);
100
+ const contextServices = await this.moduleService.serviceContext(req, res);
101
+ context = {
102
+ ...pureContext,
103
+ ...contextServices,
104
+ preferences: this.moduleService.defaultPreferences,
105
+ // update: updateContainers,
106
+ };
107
+ }
108
+ context.userIp = this.getUserIpAddress(req);
109
+ }
110
+ catch (err) {
111
+ this.logger.error('Adding context to GraphQL failed', { error: err });
112
+ throw err;
113
+ }
114
+ return {
115
+ req,
116
+ res,
117
+ ...context,
118
+ ...addons,
119
+ };
120
+ },
121
+ plugins: [
122
+ apolloServerCore.ApolloServerPluginDrainHttpServer({ httpServer: this.httpServer }),
123
+ apolloServerCore.ApolloServerPluginCacheControl(),
124
+ responseCachePlugin({
125
+ sessionId: ({ context }) => context?.userContext?.accountId ?? null,
126
+ generateCacheKey({ queryHash, operationName }, keyData) {
127
+ return `${operationName}:${queryHash}`;
128
+ },
129
+ }),
130
+ invalidateCachePlugin.invalidateCachePlugin({ cache: this.cache }),
131
+ ],
132
+ };
133
+ if (this.enableSubscription) {
134
+ serverConfig.plugins.push({
135
+ async serverWillStart() {
136
+ return {
137
+ drainServer: async () => {
138
+ await wsServerCleanup.dispose();
139
+ },
140
+ };
141
+ },
142
+ });
143
+ }
144
+ return new apolloServerExpress.ApolloServer(serverConfig);
145
+ }
146
+ }exports.GraphqlServer=GraphqlServer;//# sourceMappingURL=GraphqlServer.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphqlServer.cjs","sources":["../../src/servers/GraphqlServer.ts"],"sourcesContent":[null],"names":["WebSocketServer","config","GraphqlWs","KeyvAdapter","ApolloServerPluginDrainHttpServer","ApolloServerPluginCacheControl","invalidateCachePlugin","ApolloServer"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /// <reference types="node" />
2
+ import 'isomorphic-fetch';
3
+ import { Express } from 'express';
4
+ import * as http from 'http';
5
+ import { RedisCache, RedisClusterCache } from 'apollo-server-cache-redis';
6
+ import { IModuleService } from '../interfaces';
7
+ export declare class GraphqlServer {
8
+ private app;
9
+ private httpServer;
10
+ private cache;
11
+ private moduleService;
12
+ private enableSubscription;
13
+ private logger;
14
+ constructor(app: Express, httpServer: http.Server, cache: RedisCache | RedisClusterCache, moduleService: IModuleService, enableSubscription?: boolean);
15
+ initialize(): Promise<void>;
16
+ getUserIpAddress(req: any): any;
17
+ private configureApolloServer;
18
+ }