@common-stack/server-stack 7.0.4-alpha.17 → 7.0.4-alpha.18

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 (167) hide show
  1. package/lib/MainStackServer.cjs +231 -0
  2. package/lib/MainStackServer.cjs.map +1 -0
  3. package/lib/MainStackServer.d.ts +28 -0
  4. package/lib/MainStackServer.mjs +231 -0
  5. package/lib/MainStackServer.mjs.map +1 -0
  6. package/lib/StackServer.cjs +92 -0
  7. package/lib/StackServer.cjs.map +1 -0
  8. package/lib/StackServer.d.ts +20 -0
  9. package/lib/StackServer.mjs +92 -0
  10. package/lib/StackServer.mjs.map +1 -0
  11. package/lib/api/remote-config.cjs +6 -0
  12. package/lib/api/remote-config.cjs.map +1 -0
  13. package/lib/api/remote-config.d.ts +6 -0
  14. package/lib/api/remote-config.mjs +6 -0
  15. package/lib/api/remote-config.mjs.map +1 -0
  16. package/lib/api/resolver.cjs +12 -0
  17. package/lib/api/resolver.cjs.map +1 -0
  18. package/lib/api/resolver.d.ts +10 -0
  19. package/lib/api/resolver.mjs +12 -0
  20. package/lib/api/resolver.mjs.map +1 -0
  21. package/lib/api/root-schema.graphqls.cjs +2 -0
  22. package/lib/api/root-schema.graphqls.cjs.map +1 -0
  23. package/lib/api/root-schema.graphqls.mjs +2 -0
  24. package/lib/api/root-schema.graphqls.mjs.map +1 -0
  25. package/lib/api/scalar.cjs +16 -0
  26. package/lib/api/scalar.cjs.map +1 -0
  27. package/lib/api/scalar.d.ts +2 -0
  28. package/lib/api/scalar.mjs +16 -0
  29. package/lib/api/scalar.mjs.map +1 -0
  30. package/lib/api/schema-builder.cjs +160 -0
  31. package/lib/api/schema-builder.cjs.map +1 -0
  32. package/lib/api/schema-builder.d.ts +24 -0
  33. package/lib/api/schema-builder.mjs +160 -0
  34. package/lib/api/schema-builder.mjs.map +1 -0
  35. package/lib/api/utils.cjs +27 -0
  36. package/lib/api/utils.cjs.map +1 -0
  37. package/lib/api/utils.d.ts +4 -0
  38. package/lib/api/utils.mjs +27 -0
  39. package/lib/api/utils.mjs.map +1 -0
  40. package/lib/config/env-config.cjs +38 -0
  41. package/lib/config/env-config.cjs.map +1 -0
  42. package/lib/config/env-config.d.ts +21 -0
  43. package/lib/config/env-config.mjs +38 -0
  44. package/lib/config/env-config.mjs.map +1 -0
  45. package/lib/config/index.d.ts +1 -0
  46. package/lib/config/moleculer.config.cjs +191 -0
  47. package/lib/config/moleculer.config.cjs.map +1 -0
  48. package/lib/config/moleculer.config.d.ts +20 -0
  49. package/lib/config/moleculer.config.mjs +191 -0
  50. package/lib/config/moleculer.config.mjs.map +1 -0
  51. package/lib/connectors/connection-broker.cjs +61 -0
  52. package/lib/connectors/connection-broker.cjs.map +1 -0
  53. package/lib/connectors/connection-broker.d.ts +26 -0
  54. package/lib/connectors/connection-broker.mjs +61 -0
  55. package/lib/connectors/connection-broker.mjs.map +1 -0
  56. package/lib/connectors/graphql-pubsub-connector.cjs +28 -0
  57. package/lib/connectors/graphql-pubsub-connector.cjs.map +1 -0
  58. package/lib/connectors/graphql-pubsub-connector.d.ts +22 -0
  59. package/lib/connectors/graphql-pubsub-connector.mjs +28 -0
  60. package/lib/connectors/graphql-pubsub-connector.mjs.map +1 -0
  61. package/lib/connectors/mongo-connector.cjs +57 -0
  62. package/lib/connectors/mongo-connector.cjs.map +1 -0
  63. package/lib/connectors/mongo-connector.d.ts +21 -0
  64. package/lib/connectors/mongo-connector.mjs +57 -0
  65. package/lib/connectors/mongo-connector.mjs.map +1 -0
  66. package/lib/connectors/nats-connector.cjs +63 -0
  67. package/lib/connectors/nats-connector.cjs.map +1 -0
  68. package/lib/connectors/nats-connector.d.ts +20 -0
  69. package/lib/connectors/nats-connector.mjs +63 -0
  70. package/lib/connectors/nats-connector.mjs.map +1 -0
  71. package/lib/connectors/redis-connector.cjs +79 -0
  72. package/lib/connectors/redis-connector.cjs.map +1 -0
  73. package/lib/connectors/redis-connector.d.ts +30 -0
  74. package/lib/connectors/redis-connector.mjs +79 -0
  75. package/lib/connectors/redis-connector.mjs.map +1 -0
  76. package/lib/graphql/directives/index.cjs +10 -0
  77. package/lib/graphql/directives/index.cjs.map +1 -0
  78. package/lib/graphql/directives/index.d.ts +7 -0
  79. package/lib/graphql/directives/index.mjs +10 -0
  80. package/lib/graphql/directives/index.mjs.map +1 -0
  81. package/lib/graphql/index.d.ts +2 -0
  82. package/lib/graphql/schema/directives.graphql.cjs +1 -0
  83. package/lib/graphql/schema/directives.graphql.cjs.map +1 -0
  84. package/lib/graphql/schema/directives.graphql.mjs +1 -0
  85. package/lib/graphql/schema/directives.graphql.mjs.map +1 -0
  86. package/lib/graphql/schema/index.cjs +1 -0
  87. package/lib/graphql/schema/index.cjs.map +1 -0
  88. package/lib/graphql/schema/index.d.ts +1 -0
  89. package/lib/graphql/schema/index.mjs +1 -0
  90. package/lib/graphql/schema/index.mjs.map +1 -0
  91. package/lib/index.cjs +1 -0
  92. package/lib/index.cjs.map +1 -0
  93. package/lib/index.d.ts +3 -0
  94. package/lib/index.mjs +1 -0
  95. package/lib/index.mjs.map +1 -0
  96. package/lib/interfaces/dbMigration.d.ts +8 -0
  97. package/lib/interfaces/graphql-request-context.d.ts +15 -0
  98. package/lib/interfaces/index.d.ts +4 -0
  99. package/lib/interfaces/module-interface.d.ts +13 -0
  100. package/lib/interfaces/moleculer.d.ts +7 -0
  101. package/lib/middleware/cors.cjs +26 -0
  102. package/lib/middleware/cors.cjs.map +1 -0
  103. package/lib/middleware/cors.d.ts +6 -0
  104. package/lib/middleware/cors.mjs +26 -0
  105. package/lib/middleware/cors.mjs.map +1 -0
  106. package/lib/middleware/error.cjs +18 -0
  107. package/lib/middleware/error.cjs.map +1 -0
  108. package/lib/middleware/error.d.ts +9 -0
  109. package/lib/middleware/error.mjs +18 -0
  110. package/lib/middleware/error.mjs.map +1 -0
  111. package/lib/middleware/moleculer-inter-namespace.cjs +44 -0
  112. package/lib/middleware/moleculer-inter-namespace.cjs.map +1 -0
  113. package/lib/middleware/moleculer-inter-namespace.d.ts +2 -0
  114. package/lib/middleware/moleculer-inter-namespace.mjs +44 -0
  115. package/lib/middleware/moleculer-inter-namespace.mjs.map +1 -0
  116. package/lib/middleware/sentry.cjs +3 -0
  117. package/lib/middleware/sentry.cjs.map +1 -0
  118. package/lib/middleware/sentry.d.ts +2 -0
  119. package/lib/middleware/sentry.mjs +3 -0
  120. package/lib/middleware/sentry.mjs.map +1 -0
  121. package/lib/middleware/services.cjs +12 -0
  122. package/lib/middleware/services.cjs.map +1 -0
  123. package/lib/middleware/services.d.ts +2 -0
  124. package/lib/middleware/services.mjs +12 -0
  125. package/lib/middleware/services.mjs.map +1 -0
  126. package/lib/plugins/index.d.ts +2 -0
  127. package/lib/plugins/invalidateCachePlugin.cjs +63 -0
  128. package/lib/plugins/invalidateCachePlugin.cjs.map +1 -0
  129. package/lib/plugins/invalidateCachePlugin.d.ts +8 -0
  130. package/lib/plugins/invalidateCachePlugin.mjs +63 -0
  131. package/lib/plugins/invalidateCachePlugin.mjs.map +1 -0
  132. package/lib/plugins/invalidateCachePlugin.test.d.ts +1 -0
  133. package/lib/plugins/response-cache-plugin.test.d.ts +1 -0
  134. package/lib/plugins/responseCachePlugin.cjs +63 -0
  135. package/lib/plugins/responseCachePlugin.cjs.map +1 -0
  136. package/lib/plugins/responseCachePlugin.d.ts +12 -0
  137. package/lib/plugins/responseCachePlugin.mjs +63 -0
  138. package/lib/plugins/responseCachePlugin.mjs.map +1 -0
  139. package/lib/servers/ExpressApp.cjs +37 -0
  140. package/lib/servers/ExpressApp.cjs.map +1 -0
  141. package/lib/servers/ExpressApp.d.ts +3 -0
  142. package/lib/servers/ExpressApp.mjs +37 -0
  143. package/lib/servers/ExpressApp.mjs.map +1 -0
  144. package/lib/servers/GraphqlServer.cjs +142 -0
  145. package/lib/servers/GraphqlServer.cjs.map +1 -0
  146. package/lib/servers/GraphqlServer.d.ts +23 -0
  147. package/lib/servers/GraphqlServer.mjs +142 -0
  148. package/lib/servers/GraphqlServer.mjs.map +1 -0
  149. package/lib/servers/GraphqlWs.cjs +97 -0
  150. package/lib/servers/GraphqlWs.cjs.map +1 -0
  151. package/lib/servers/GraphqlWs.d.ts +14 -0
  152. package/lib/servers/GraphqlWs.mjs +97 -0
  153. package/lib/servers/GraphqlWs.mjs.map +1 -0
  154. package/lib/servers/WebsocketMultipathUpdate.cjs +63 -0
  155. package/lib/servers/WebsocketMultipathUpdate.cjs.map +1 -0
  156. package/lib/servers/WebsocketMultipathUpdate.d.ts +18 -0
  157. package/lib/servers/WebsocketMultipathUpdate.mjs +63 -0
  158. package/lib/servers/WebsocketMultipathUpdate.mjs.map +1 -0
  159. package/lib/servers/mongodb-migration-update.d.ts +12 -0
  160. package/lib/servers/utils.d.ts +14 -0
  161. package/lib/utils/index.d.ts +1 -0
  162. package/lib/utils/migrations.cjs +26 -0
  163. package/lib/utils/migrations.cjs.map +1 -0
  164. package/lib/utils/migrations.d.ts +8 -0
  165. package/lib/utils/migrations.mjs +26 -0
  166. package/lib/utils/migrations.mjs.map +1 -0
  167. package/package.json +2 -2
@@ -0,0 +1,63 @@
1
+ 'use strict';var _=require('lodash-es'),serverCore=require('@common-stack/server-core'),envConfig=require('../config/env-config.cjs');const invalidateCachePlugin = ({ cache: redisClient, invalidateCacheKeyGenerator, }) => ({
2
+ requestDidStart(requestContext) {
3
+ return {
4
+ willSendResponse: async (responseContext) => {
5
+ // in case of websocket request initially the requestContext comes empty
6
+ if (!requestContext) {
7
+ return;
8
+ }
9
+ try {
10
+ const hasErrors = !!requestContext.errors?.length;
11
+ const { schema } = requestContext;
12
+ const { queriesToInvalidate, user, req } = requestContext.contextValue;
13
+ const tenantId = serverCore.extractTenantId(req?.currentPageUriSegments?.authority);
14
+ const [{ operation }] = responseContext.document.definitions;
15
+ const isMutation = operation === 'mutation';
16
+ if (hasErrors || !queriesToInvalidate?.length || !isMutation) {
17
+ return;
18
+ }
19
+ const nestedKeys = await Promise.all(queriesToInvalidate.map(async (query) => {
20
+ // Build keys in order of specificity
21
+ let keys = [];
22
+ const cachePolicy = serverCore.getDirectiveArgsFromSchema({
23
+ schema,
24
+ queryName: query,
25
+ directiveName: serverCore.CACHE_CONTROL_DIRECTIVE,
26
+ });
27
+ const isPrivate = cachePolicy.scope?.toLowerCase() === 'private';
28
+ // Add tenant-specific key if tenant exists
29
+ if (tenantId) {
30
+ keys.push(`${envConfig.config.APP_NAME}:${tenantId}:${query}:*`);
31
+ // Add user-specific key if user exists
32
+ if (user?.sub && isPrivate) {
33
+ keys.push(`${envConfig.config.APP_NAME}:${tenantId}:${user.sub}:${query}:*`);
34
+ }
35
+ }
36
+ // Add global key as fallback
37
+ keys.push(`${envConfig.config.APP_NAME}:${query}:*`);
38
+ // Allow custom key generation if provided
39
+ if (typeof invalidateCacheKeyGenerator === 'function') {
40
+ keys = keys.map((key) => invalidateCacheKeyGenerator(requestContext, responseContext, key));
41
+ }
42
+ const matchedKeys = await Promise.all(keys.map(async (key) => {
43
+ const matchingKeys = await redisClient.keys(key);
44
+ if (matchingKeys.length) {
45
+ return matchingKeys;
46
+ }
47
+ return [];
48
+ }));
49
+ return matchedKeys.flat();
50
+ }));
51
+ const keys = nestedKeys.flat();
52
+ if (keys?.length) {
53
+ await redisClient.del(_.uniq(keys));
54
+ }
55
+ }
56
+ catch (e) {
57
+ requestContext.logger.error('Error occurred in invalidateCachePlugin');
58
+ requestContext.logger.error(e);
59
+ }
60
+ },
61
+ };
62
+ },
63
+ });exports.invalidateCachePlugin=invalidateCachePlugin;//# sourceMappingURL=invalidateCachePlugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalidateCachePlugin.cjs","sources":["../../src/plugins/invalidateCachePlugin.ts"],"sourcesContent":[null],"names":["extractTenantId","getDirectiveArgsFromSchema","CACHE_CONTROL_DIRECTIVE","config","uniq"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Redis, Cluster } from 'ioredis';
2
+ import type { BaseContext, GraphQLRequestContextWillSendResponse } from '@apollo/server';
3
+ import { ApolloServerOptions, GraphQLRequestContext } from '@apollo/server';
4
+ export type InvalidationKeyGenerator = (requestContext: GraphQLRequestContext<unknown>, responseContext: GraphQLRequestContextWillSendResponse<unknown>, cacheKey?: string) => string;
5
+ export declare const invalidateCachePlugin: ({ cache: redisClient, invalidateCacheKeyGenerator, }: {
6
+ cache: Redis | Cluster;
7
+ invalidateCacheKeyGenerator: InvalidationKeyGenerator;
8
+ }) => ApolloServerOptions<BaseContext>["plugins"][0];
@@ -0,0 +1,63 @@
1
+ import {uniq}from'lodash-es';import {extractTenantId,getDirectiveArgsFromSchema,CACHE_CONTROL_DIRECTIVE}from'@common-stack/server-core';import {config}from'../config/env-config.mjs';const invalidateCachePlugin = ({ cache: redisClient, invalidateCacheKeyGenerator, }) => ({
2
+ requestDidStart(requestContext) {
3
+ return {
4
+ willSendResponse: async (responseContext) => {
5
+ // in case of websocket request initially the requestContext comes empty
6
+ if (!requestContext) {
7
+ return;
8
+ }
9
+ try {
10
+ const hasErrors = !!requestContext.errors?.length;
11
+ const { schema } = requestContext;
12
+ const { queriesToInvalidate, user, req } = requestContext.contextValue;
13
+ const tenantId = extractTenantId(req?.currentPageUriSegments?.authority);
14
+ const [{ operation }] = responseContext.document.definitions;
15
+ const isMutation = operation === 'mutation';
16
+ if (hasErrors || !queriesToInvalidate?.length || !isMutation) {
17
+ return;
18
+ }
19
+ const nestedKeys = await Promise.all(queriesToInvalidate.map(async (query) => {
20
+ // Build keys in order of specificity
21
+ let keys = [];
22
+ const cachePolicy = getDirectiveArgsFromSchema({
23
+ schema,
24
+ queryName: query,
25
+ directiveName: CACHE_CONTROL_DIRECTIVE,
26
+ });
27
+ const isPrivate = cachePolicy.scope?.toLowerCase() === 'private';
28
+ // Add tenant-specific key if tenant exists
29
+ if (tenantId) {
30
+ keys.push(`${config.APP_NAME}:${tenantId}:${query}:*`);
31
+ // Add user-specific key if user exists
32
+ if (user?.sub && isPrivate) {
33
+ keys.push(`${config.APP_NAME}:${tenantId}:${user.sub}:${query}:*`);
34
+ }
35
+ }
36
+ // Add global key as fallback
37
+ keys.push(`${config.APP_NAME}:${query}:*`);
38
+ // Allow custom key generation if provided
39
+ if (typeof invalidateCacheKeyGenerator === 'function') {
40
+ keys = keys.map((key) => invalidateCacheKeyGenerator(requestContext, responseContext, key));
41
+ }
42
+ const matchedKeys = await Promise.all(keys.map(async (key) => {
43
+ const matchingKeys = await redisClient.keys(key);
44
+ if (matchingKeys.length) {
45
+ return matchingKeys;
46
+ }
47
+ return [];
48
+ }));
49
+ return matchedKeys.flat();
50
+ }));
51
+ const keys = nestedKeys.flat();
52
+ if (keys?.length) {
53
+ await redisClient.del(uniq(keys));
54
+ }
55
+ }
56
+ catch (e) {
57
+ requestContext.logger.error('Error occurred in invalidateCachePlugin');
58
+ requestContext.logger.error(e);
59
+ }
60
+ },
61
+ };
62
+ },
63
+ });export{invalidateCachePlugin};//# sourceMappingURL=invalidateCachePlugin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalidateCachePlugin.mjs","sources":["../../src/plugins/invalidateCachePlugin.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,63 @@
1
+ 'use strict';var serverCore=require('@common-stack/server-core'),_=require('lodash-es'),apolloCachePlugin=require('@apollo/server-plugin-response-cache');const cachePlugin = apolloCachePlugin.default ?? apolloCachePlugin;
2
+ const isCacheable = (requestContext) => {
3
+ const { document, schema } = requestContext;
4
+ const cache = serverCore.getDirectiveArgsFromSchema({
5
+ schema,
6
+ document,
7
+ directiveName: serverCore.CACHE_CONTROL_DIRECTIVE,
8
+ });
9
+ if (!cache)
10
+ return false;
11
+ if (cache.scope && !cache.maxAge) {
12
+ cache.maxAge = 86400;
13
+ }
14
+ if (!requestContext.overallCachePolicy) {
15
+ // eslint-disable-next-line no-param-reassign
16
+ // to support test cases
17
+ requestContext.overallCachePolicy = {};
18
+ }
19
+ requestContext.overallCachePolicy.maxAge = cache.maxAge;
20
+ return cache.maxAge > 0;
21
+ };
22
+ const generateCacheKey = ({ logger, cacheKeyGenerator }) => (requestContext) => {
23
+ if (!isCacheable(requestContext)) {
24
+ return null;
25
+ }
26
+ const { request, contextValue, document, schema } = requestContext;
27
+ const { user, req } = contextValue ?? {};
28
+ const { query, variables } = request;
29
+ const cacheControlDirective = serverCore.getDirectiveArgsFromSchema({
30
+ schema,
31
+ document,
32
+ directiveName: serverCore.CACHE_CONTROL_DIRECTIVE,
33
+ });
34
+ const { scope } = cacheControlDirective ?? {};
35
+ const isPrivate = scope?.toLowerCase() === 'private';
36
+ const tenantId = serverCore.extractTenantId(req?.currentPageUriSegments?.authority);
37
+ const cacheKey = serverCore.generateQueryCacheKey({
38
+ query,
39
+ variables,
40
+ logger,
41
+ userId: isPrivate ? user?.sub || null : null,
42
+ tenantId,
43
+ });
44
+ try {
45
+ if (typeof cacheKeyGenerator === 'function') {
46
+ const generatedKey = cacheKeyGenerator(requestContext, cacheKey);
47
+ return generatedKey || cacheKey;
48
+ }
49
+ return cacheKey;
50
+ }
51
+ catch (e) {
52
+ // `this.logger` won't work here
53
+ console.warn('GenerateCacheKey Failed %s', e.message);
54
+ return cacheKey;
55
+ }
56
+ };
57
+ const responseCachePlugin = ({ logger, cacheKeyGenerator }) => cachePlugin({
58
+ sessionId: ({ contextValue }) => Promise.resolve(contextValue?.user?.sub ?? null),
59
+ generateCacheKey: generateCacheKey({ logger, cacheKeyGenerator }),
60
+ shouldWriteToCache: (ctx) =>
61
+ // Cache only successful responses
62
+ isCacheable(ctx) && _.isEmpty(ctx?.response?.body?.singleResult.errors),
63
+ });exports.generateCacheKey=generateCacheKey;exports.isCacheable=isCacheable;exports.responseCachePlugin=responseCachePlugin;//# sourceMappingURL=responseCachePlugin.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseCachePlugin.cjs","sources":["../../src/plugins/responseCachePlugin.ts"],"sourcesContent":[null],"names":["getDirectiveArgsFromSchema","CACHE_CONTROL_DIRECTIVE","extractTenantId","generateQueryCacheKey","isEmpty"],"mappings":"0JAcA,MAAM,WAAW,GAAI,iBAAyB,CAAC,OAAO,IAAI,iBAAiB,CAAC;AAO/D,MAAA,WAAW,GAAG,CAAC,cAA4D,KAAI;AACxF,IAAA,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC;IAC5C,MAAM,KAAK,GAAGA,qCAA0B,CAAC;QACrC,MAAM;QACN,QAAQ;AACR,QAAA,aAAa,EAAEC,kCAAuB;AACzC,KAAA,CAAC,CAAC;AACH,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,KAAK,CAAC;IACzB,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AAC9B,QAAA,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;KACxB;AACD,IAAA,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE;;;AAGnC,QAAA,cAAsB,CAAC,kBAAkB,GAAG,EAAE,CAAC;KACnD;IACD,cAAc,CAAC,kBAAkB,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;AACxD,IAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5B,EAAE;AAEW,MAAA,gBAAgB,GACzB,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAA4B,KACxD,CAAC,cAA4D,KAAY;AACrE,IAAA,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE;AAC9B,QAAA,OAAO,IAAI,CAAC;KACf;IACD,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC;IACnE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,YAAY,IAAI,EAAE,CAAC;AACzC,IAAA,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACrC,MAAM,qBAAqB,GAAGD,qCAA0B,CAAC;QACrD,MAAM;QACN,QAAQ;AACR,QAAA,aAAa,EAAEC,kCAAuB;AACzC,KAAA,CAAC,CAAC;AACH,IAAA,MAAM,EAAE,KAAK,EAAE,GAAG,qBAAqB,IAAI,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,KAAK,EAAE,WAAW,EAAE,KAAK,SAAS,CAAC;IACrD,MAAM,QAAQ,GAAGC,0BAAe,CAAC,GAAG,EAAE,sBAAsB,EAAE,SAAS,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAGC,gCAAqB,CAAC;QACnC,KAAK;QACL,SAAS;QACT,MAAM;AACN,QAAA,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI;QAC5C,QAAQ;AACX,KAAA,CAAC,CAAC;AACH,IAAA,IAAI;AACA,QAAA,IAAI,OAAO,iBAAiB,KAAK,UAAU,EAAE;YACzC,MAAM,YAAY,GAAG,iBAAiB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;YACjE,OAAO,YAAY,IAAI,QAAQ,CAAC;SACnC;AACD,QAAA,OAAO,QAAQ,CAAC;KACnB;IAAC,OAAO,CAAC,EAAE;;QAER,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AACtD,QAAA,OAAO,QAAQ,CAAC;KACnB;AACL,EAAE;AACC,MAAM,mBAAmB,GAAG,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAA4B,KACvF,WAAW,CAAC;AACR,IAAA,SAAS,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC;IACjF,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;AACjE,IAAA,kBAAkB,EAAE,CAAC,GAAG;;AAEpB,IAAA,WAAW,CAAC,GAAG,CAAC,IAAIC,SAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC;AAC5E,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { GraphQLRequestContext } from '@apollo/server';
2
+ import { ILogger } from '@cdm-logger/core/lib/interface';
3
+ import { GraphqlRequestContext } from '../interfaces';
4
+ import { KeyGenerator } from '../servers/GraphqlServer';
5
+ type ApolloCachePluginOptions = {
6
+ logger: ILogger;
7
+ cacheKeyGenerator: KeyGenerator;
8
+ };
9
+ export declare const isCacheable: (requestContext: GraphQLRequestContext<GraphqlRequestContext>) => boolean;
10
+ export declare const generateCacheKey: ({ logger, cacheKeyGenerator }: ApolloCachePluginOptions) => (requestContext: GraphQLRequestContext<GraphqlRequestContext>) => string;
11
+ export declare const responseCachePlugin: ({ logger, cacheKeyGenerator }: ApolloCachePluginOptions) => any;
12
+ export {};
@@ -0,0 +1,63 @@
1
+ import {getDirectiveArgsFromSchema,CACHE_CONTROL_DIRECTIVE,extractTenantId,generateQueryCacheKey}from'@common-stack/server-core';import {isEmpty}from'lodash-es';import apolloCachePlugin from'@apollo/server-plugin-response-cache';const cachePlugin = apolloCachePlugin.default ?? apolloCachePlugin;
2
+ const isCacheable = (requestContext) => {
3
+ const { document, schema } = requestContext;
4
+ const cache = getDirectiveArgsFromSchema({
5
+ schema,
6
+ document,
7
+ directiveName: CACHE_CONTROL_DIRECTIVE,
8
+ });
9
+ if (!cache)
10
+ return false;
11
+ if (cache.scope && !cache.maxAge) {
12
+ cache.maxAge = 86400;
13
+ }
14
+ if (!requestContext.overallCachePolicy) {
15
+ // eslint-disable-next-line no-param-reassign
16
+ // to support test cases
17
+ requestContext.overallCachePolicy = {};
18
+ }
19
+ requestContext.overallCachePolicy.maxAge = cache.maxAge;
20
+ return cache.maxAge > 0;
21
+ };
22
+ const generateCacheKey = ({ logger, cacheKeyGenerator }) => (requestContext) => {
23
+ if (!isCacheable(requestContext)) {
24
+ return null;
25
+ }
26
+ const { request, contextValue, document, schema } = requestContext;
27
+ const { user, req } = contextValue ?? {};
28
+ const { query, variables } = request;
29
+ const cacheControlDirective = getDirectiveArgsFromSchema({
30
+ schema,
31
+ document,
32
+ directiveName: CACHE_CONTROL_DIRECTIVE,
33
+ });
34
+ const { scope } = cacheControlDirective ?? {};
35
+ const isPrivate = scope?.toLowerCase() === 'private';
36
+ const tenantId = extractTenantId(req?.currentPageUriSegments?.authority);
37
+ const cacheKey = generateQueryCacheKey({
38
+ query,
39
+ variables,
40
+ logger,
41
+ userId: isPrivate ? user?.sub || null : null,
42
+ tenantId,
43
+ });
44
+ try {
45
+ if (typeof cacheKeyGenerator === 'function') {
46
+ const generatedKey = cacheKeyGenerator(requestContext, cacheKey);
47
+ return generatedKey || cacheKey;
48
+ }
49
+ return cacheKey;
50
+ }
51
+ catch (e) {
52
+ // `this.logger` won't work here
53
+ console.warn('GenerateCacheKey Failed %s', e.message);
54
+ return cacheKey;
55
+ }
56
+ };
57
+ const responseCachePlugin = ({ logger, cacheKeyGenerator }) => cachePlugin({
58
+ sessionId: ({ contextValue }) => Promise.resolve(contextValue?.user?.sub ?? null),
59
+ generateCacheKey: generateCacheKey({ logger, cacheKeyGenerator }),
60
+ shouldWriteToCache: (ctx) =>
61
+ // Cache only successful responses
62
+ isCacheable(ctx) && isEmpty(ctx?.response?.body?.singleResult.errors),
63
+ });export{generateCacheKey,isCacheable,responseCachePlugin};//# sourceMappingURL=responseCachePlugin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseCachePlugin.mjs","sources":["../../src/plugins/responseCachePlugin.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
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
+ function expressApp(modules, options, middlewares, http) {
3
+ const app = express();
4
+ for (const applyBeforeware of modules.beforewares) {
5
+ applyBeforeware(app);
6
+ }
7
+ app.use(services.contextServicesMiddleware(options.createContext, options.serviceContext));
8
+ // Don't rate limit heroku
9
+ app.enable('trust proxy');
10
+ app.use(sentry.sentryMiddleware);
11
+ if (middlewares !== null) {
12
+ app.use(middlewares);
13
+ }
14
+ app.use(cors.corsMiddleware);
15
+ app.use((req, res, next) => {
16
+ res.header('Access-Control-Allow-Credentials', JSON.stringify(true));
17
+ res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
18
+ res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, X-CSP-Nonce, Content-Type, Accept');
19
+ next();
20
+ });
21
+ app.use(bodyParser__namespace.json({
22
+ limit: '50mb',
23
+ verify: (req, res, buf) => {
24
+ // #Todo: Find some proper solution for it
25
+ req.rawBody = buf;
26
+ },
27
+ }));
28
+ app.use(bodyParser__namespace.urlencoded({ limit: '50mb', extended: true, parameterLimit: 50000 }));
29
+ for (const applyMiddleware of modules.middlewares) {
30
+ applyMiddleware(app);
31
+ }
32
+ if (__DEV__) {
33
+ app.use(error.errorMiddleware);
34
+ }
35
+ app.use(sentry.sentryErrorHandlerMiddleware);
36
+ return app;
37
+ }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;AAUM,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,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,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,37 @@
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
+ function expressApp(modules, options, middlewares, http) {
3
+ const app = express();
4
+ for (const applyBeforeware of modules.beforewares) {
5
+ applyBeforeware(app);
6
+ }
7
+ app.use(contextServicesMiddleware(options.createContext, options.serviceContext));
8
+ // Don't rate limit heroku
9
+ app.enable('trust proxy');
10
+ app.use(sentryMiddleware);
11
+ if (middlewares !== null) {
12
+ app.use(middlewares);
13
+ }
14
+ app.use(corsMiddleware);
15
+ app.use((req, res, next) => {
16
+ res.header('Access-Control-Allow-Credentials', JSON.stringify(true));
17
+ res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
18
+ res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, X-CSP-Nonce, Content-Type, Accept');
19
+ next();
20
+ });
21
+ app.use(bodyParser.json({
22
+ limit: '50mb',
23
+ verify: (req, res, buf) => {
24
+ // #Todo: Find some proper solution for it
25
+ req.rawBody = buf;
26
+ },
27
+ }));
28
+ app.use(bodyParser.urlencoded({ limit: '50mb', extended: true, parameterLimit: 50000 }));
29
+ for (const applyMiddleware of modules.middlewares) {
30
+ applyMiddleware(app);
31
+ }
32
+ if (__DEV__) {
33
+ app.use(errorMiddleware);
34
+ }
35
+ app.use(sentryErrorHandlerMiddleware);
36
+ return app;
37
+ }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;AAUM,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,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,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,142 @@
1
+ 'use strict';var server=require('@apollo/server'),express4=require('@apollo/server/express4'),cacheControl=require('@apollo/server/plugin/cacheControl'),drainHttpServer=require('@apollo/server/plugin/drainHttpServer');require('isomorphic-fetch');var express=require('express'),cors=require('cors'),Keyv=require('keyv'),KeyvRedis=require('@keyv/redis'),utils_keyvadapter=require('@apollo/utils.keyvadapter'),ws=require('ws'),invalidateCachePlugin=require('../plugins/invalidateCachePlugin.cjs'),responseCachePlugin=require('../plugins/responseCachePlugin.cjs'),GraphqlWs=require('./GraphqlWs.cjs'),envConfig=require('../config/env-config.cjs');if ((process.env.LOG_LEVEL && process.env.LOG_LEVEL === 'trace') || process.env.LOG_LEVEL === 'debug') ;
2
+ // @workaround as the `dataSources` not available in Subscription (websocket) Context.
3
+ // https://github.com/apollographql/apollo-server/issues/1526 need to revisit in Apollo-Server v3.
4
+ const constructDataSourcesForSubscriptions = (context, cache, dataSources) => {
5
+ const initializeDataSource = (instance) => {
6
+ instance.initialize({ context, cache });
7
+ };
8
+ for (const prop in dataSources) {
9
+ initializeDataSource(dataSources[prop]);
10
+ }
11
+ return dataSources;
12
+ };
13
+ class GraphqlServer {
14
+ app;
15
+ httpServer;
16
+ redisClient;
17
+ moduleService;
18
+ enableSubscription;
19
+ cacheKeyGenerator;
20
+ invalidateCacheKeyGenerator;
21
+ logger;
22
+ graphqlWsServer;
23
+ constructor(app, httpServer, redisClient, moduleService, enableSubscription = true, cacheKeyGenerator, invalidateCacheKeyGenerator) {
24
+ this.app = app;
25
+ this.httpServer = httpServer;
26
+ this.redisClient = redisClient;
27
+ this.moduleService = moduleService;
28
+ this.enableSubscription = enableSubscription;
29
+ this.cacheKeyGenerator = cacheKeyGenerator;
30
+ this.invalidateCacheKeyGenerator = invalidateCacheKeyGenerator;
31
+ this.logger = this.moduleService.logger.child({ className: 'GraphqlServer' });
32
+ if (enableSubscription) {
33
+ const wsServer = new ws.WebSocketServer({
34
+ server: this.httpServer,
35
+ path: envConfig.config.GRAPHQL_ENDPOINT,
36
+ });
37
+ this.graphqlWsServer = new GraphqlWs.GraphqlWs(wsServer, this.moduleService, this.redisClient);
38
+ }
39
+ }
40
+ async initialize() {
41
+ this.logger.info('GraphqlServer initializing...');
42
+ this.graphqlWsServer.create();
43
+ const apolloServer = this.configureApolloServer();
44
+ await apolloServer.start();
45
+ const corsOptions = {
46
+ origin: [envConfig.config.CLIENT_URL],
47
+ credentials: true,
48
+ };
49
+ this.app.use(__GRAPHQL_ENDPOINT__, cors(corsOptions), express.json(), express4.expressMiddleware(apolloServer, {
50
+ context: async ({ req, res, connection }) => {
51
+ let context;
52
+ let addons = {};
53
+ const dataSources = this.moduleService.dataSource;
54
+ try {
55
+ if (connection) {
56
+ context = connection.context;
57
+ if (!context.dataSources) {
58
+ addons = {
59
+ dataSources: constructDataSourcesForSubscriptions(connection.context, this.redisClient, dataSources),
60
+ };
61
+ }
62
+ else {
63
+ addons = {
64
+ dataSources,
65
+ };
66
+ }
67
+ }
68
+ else {
69
+ const pureContext = await this.moduleService.createContext(req, res);
70
+ const contextServices = await this.moduleService.serviceContext(req, res);
71
+ context = {
72
+ ...pureContext,
73
+ ...contextServices,
74
+ preferences: this.moduleService.defaultPreferences,
75
+ };
76
+ }
77
+ context.userIp = this.getUserIpAddress(req);
78
+ }
79
+ catch (err) {
80
+ this.logger.error(err, 'adding context to graphql failed due to [%s]', err.message);
81
+ throw err;
82
+ }
83
+ return {
84
+ req,
85
+ res,
86
+ dataSources,
87
+ ...context,
88
+ ...addons,
89
+ };
90
+ },
91
+ }));
92
+ this.logger.info('GraphqlServer initialized - ', envConfig.config.CLIENT_URL);
93
+ }
94
+ getUserIpAddress(req) {
95
+ let ip = (req?.headers['x-forwarded-for'] || '').split(',')[0] || req?.connection?.remoteAddress;
96
+ if (ip.substr(0, 7) === '::ffff:') {
97
+ ip = ip.substr(7);
98
+ }
99
+ if (ip === '::1') {
100
+ ip = '127.0.0.1';
101
+ }
102
+ return ip;
103
+ }
104
+ configureApolloServer() {
105
+ const redisStore = new KeyvRedis(this.redisClient);
106
+ redisStore.on('error', (err) => {
107
+ this.logger.error(err, 'Redis connection error:');
108
+ });
109
+ const keyvCache = new Keyv({ store: redisStore, namespace: envConfig.config.APP_NAME });
110
+ const cacheAdapter = new utils_keyvadapter.KeyvAdapter(keyvCache);
111
+ const cacheGet = cacheAdapter.get.bind(cacheAdapter);
112
+ cacheAdapter.get = (key) => cacheGet(key.replaceAll('fqc:', ''));
113
+ const cacheSet = cacheAdapter.set.bind(cacheAdapter);
114
+ cacheAdapter.set = (key, value, opts) => cacheSet(key.replaceAll('fqc:', ''), value, opts);
115
+ const { cacheKeyGenerator, invalidateCacheKeyGenerator, logger } = this;
116
+ const serverConfig = {
117
+ schema: this.moduleService.schema,
118
+ allowBatchedHttpRequests: true,
119
+ cache: cacheAdapter,
120
+ plugins: [
121
+ drainHttpServer.ApolloServerPluginDrainHttpServer({ httpServer: this.httpServer }),
122
+ cacheControl.ApolloServerPluginCacheControl(),
123
+ invalidateCachePlugin.invalidateCachePlugin({ cache: this.redisClient, invalidateCacheKeyGenerator }),
124
+ responseCachePlugin.responseCachePlugin({ logger, cacheKeyGenerator }),
125
+ ],
126
+ };
127
+ if (this.enableSubscription) {
128
+ serverConfig.plugins.push({
129
+ async serverWillStart() {
130
+ const response = {
131
+ async drainServer() {
132
+ await this?.graphqlWsServer?.disconnect();
133
+ },
134
+ };
135
+ response.drainServer.bind(this);
136
+ return response;
137
+ },
138
+ });
139
+ }
140
+ return new server.ApolloServer(serverConfig);
141
+ }
142
+ }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","expressMiddleware","KeyvAdapter","ApolloServerPluginDrainHttpServer","ApolloServerPluginCacheControl","invalidateCachePlugin","responseCachePlugin","ApolloServer"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { GraphQLRequestContext } from '@apollo/server';
2
+ import * as IORedis from 'ioredis';
3
+ import 'isomorphic-fetch';
4
+ import { Express } from 'express';
5
+ import * as http from 'http';
6
+ import { InvalidationKeyGenerator } from '../plugins';
7
+ import { IModuleService } from '../interfaces';
8
+ export type KeyGenerator = (context: GraphQLRequestContext<unknown>, cacheKey?: string) => string;
9
+ export declare class GraphqlServer {
10
+ private app;
11
+ private httpServer;
12
+ private redisClient;
13
+ private moduleService;
14
+ private enableSubscription;
15
+ private readonly cacheKeyGenerator?;
16
+ private readonly invalidateCacheKeyGenerator?;
17
+ private logger;
18
+ private graphqlWsServer;
19
+ constructor(app: Express, httpServer: http.Server, redisClient: IORedis.Redis | IORedis.Cluster, moduleService: IModuleService, enableSubscription?: boolean, cacheKeyGenerator?: KeyGenerator, invalidateCacheKeyGenerator?: InvalidationKeyGenerator);
20
+ initialize(): Promise<void>;
21
+ getUserIpAddress(req: any): any;
22
+ private configureApolloServer;
23
+ }