@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,142 @@
1
+ import {ApolloServer}from'@apollo/server';import {expressMiddleware}from'@apollo/server/express4';import {ApolloServerPluginCacheControl}from'@apollo/server/plugin/cacheControl';import {ApolloServerPluginDrainHttpServer}from'@apollo/server/plugin/drainHttpServer';import'isomorphic-fetch';import express from'express';import cors from'cors';import Keyv from'keyv';import KeyvRedis from'@keyv/redis';import {KeyvAdapter}from'@apollo/utils.keyvadapter';import {WebSocketServer}from'ws';import {invalidateCachePlugin}from'../plugins/invalidateCachePlugin.mjs';import {responseCachePlugin}from'../plugins/responseCachePlugin.mjs';import {GraphqlWs}from'./GraphqlWs.mjs';import {config}from'../config/env-config.mjs';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 WebSocketServer({
34
+ server: this.httpServer,
35
+ path: config.GRAPHQL_ENDPOINT,
36
+ });
37
+ this.graphqlWsServer = new 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: [config.CLIENT_URL],
47
+ credentials: true,
48
+ };
49
+ this.app.use(__GRAPHQL_ENDPOINT__, cors(corsOptions), express.json(), 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 - ', 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: config.APP_NAME });
110
+ const cacheAdapter = new 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
+ ApolloServerPluginDrainHttpServer({ httpServer: this.httpServer }),
122
+ ApolloServerPluginCacheControl(),
123
+ invalidateCachePlugin({ cache: this.redisClient, invalidateCacheKeyGenerator }),
124
+ 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 ApolloServer(serverConfig);
141
+ }
142
+ }export{GraphqlServer};//# sourceMappingURL=GraphqlServer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphqlServer.mjs","sources":["../../src/servers/GraphqlServer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,97 @@
1
+ 'use strict';var ws=require('graphql-ws/lib/use/ws');require('graphql');// @workaround as the `dataSources` not available in Subscription (websocket) Context.
2
+ // https://github.com/apollographql/apollo-server/issues/1526 need to revisit in Apollo-Server v3.
3
+ const constructDataSourcesForSubscriptions = (context, cache, dataSources) => {
4
+ const intializeDataSource = (instance) => {
5
+ instance.initialize({ context, cache });
6
+ };
7
+ // tslint:disable-next-line:forin
8
+ for (const prop in dataSources) {
9
+ if (dataSources[prop] && typeof dataSources[prop]?.initialize === 'function') {
10
+ intializeDataSource(dataSources[prop]);
11
+ }
12
+ }
13
+ return dataSources;
14
+ };
15
+ class GraphqlWs {
16
+ wsServer;
17
+ moduleService;
18
+ cache;
19
+ subscriptionServer;
20
+ logger;
21
+ constructor(wsServer, moduleService, cache) {
22
+ this.wsServer = wsServer;
23
+ this.moduleService = moduleService;
24
+ this.cache = cache;
25
+ this.logger = this.moduleService.logger;
26
+ }
27
+ create() {
28
+ this.subscriptionServer = ws.useServer({
29
+ schema: this.moduleService.schema,
30
+ // Adding a context property lets you add data to your GraphQL operation context
31
+ context: async (ctx) => {
32
+ // Returning an object here will add that information to our
33
+ // GraphQL context, which all of our resolvers have access to.
34
+ // ctx is the `graphql-ws` Context where connectionParams live
35
+ try {
36
+ const pureContext = await this.moduleService.createContext(ctx.connectionParams, null);
37
+ const contextServices = await this.moduleService.serviceContext(ctx.connectionParams, null);
38
+ const context = {
39
+ ...contextServices,
40
+ ...pureContext,
41
+ preferences: this.moduleService.defaultPreferences,
42
+ // update: updateContainers,
43
+ ...ctx,
44
+ };
45
+ const addons = {
46
+ dataSources: constructDataSourcesForSubscriptions(context, this.cache, this.moduleService.dataSource),
47
+ };
48
+ return {
49
+ ...context,
50
+ ...addons,
51
+ ...ctx,
52
+ ...pureContext,
53
+ preferences: this.moduleService.defaultPreferences,
54
+ };
55
+ }
56
+ catch (err) {
57
+ this.logger.error(err);
58
+ }
59
+ },
60
+ // onConnect: async (ctx) => {
61
+ // // do anything when connected
62
+ // },
63
+ // onOperation: (ctx, msg) => {
64
+ // }
65
+ // onOperation: async (message: { payload: any }, connection: ExecutionParams) => {
66
+ // connection.formatResponse = (value: ExecutionResult) => ({
67
+ // ...value,
68
+ // errors:
69
+ // value.errors &&
70
+ // formatApolloErrors([...value.errors], {
71
+ // formatter: this.requestOptions.formatError,
72
+ // debug: this.requestOptions.debug,
73
+ // }),
74
+ // });
75
+ // let context: Context = this.context ? this.context : { connection };
76
+ // try {
77
+ // context =
78
+ // typeof this.context === 'function'
79
+ // ? await this.context({ connection, payload: message.payload })
80
+ // : context;
81
+ // } catch (e) {
82
+ // throw formatApolloErrors([e], {
83
+ // formatter: this.requestOptions.formatError,
84
+ // debug: this.requestOptions.debug,
85
+ // })[0];
86
+ // }
87
+ // return { ...connection }; // TODO: we didn't add `context`
88
+ // },
89
+ }, this.wsServer);
90
+ return this.subscriptionServer;
91
+ }
92
+ disconnect() {
93
+ if (this.subscriptionServer) {
94
+ this.subscriptionServer.dispose();
95
+ }
96
+ }
97
+ }exports.GraphqlWs=GraphqlWs;//# sourceMappingURL=GraphqlWs.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphqlWs.cjs","sources":["../../src/servers/GraphqlWs.ts"],"sourcesContent":[null],"names":["useServer"],"mappings":"wEAUA;AACA;AACA,MAAM,oCAAoC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,KAAI;AACzE,IAAA,MAAM,mBAAmB,GAAG,CAAC,QAAQ,KAAI;QACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5C,KAAC,CAAC;;AAEF,IAAA,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE;AAC5B,QAAA,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,OAAO,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,KAAK,UAAU,EAAE;AAC1E,YAAA,mBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;SAC1C;KACJ;AACD,IAAA,OAAO,WAAW,CAAC;AACvB,CAAC,CAAC;MA0CW,SAAS,CAAA;AAMN,IAAA,QAAA,CAAA;AACA,IAAA,aAAA,CAAA;AACE,IAAA,KAAA,CAAA;AAPN,IAAA,kBAAkB,CAAa;AAE/B,IAAA,MAAM,CAAU;AAExB,IAAA,WAAA,CACY,QAAyB,EACzB,aAA6B,EAC3B,KAAsC,EAAA;QAFxC,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAiB;QACzB,IAAa,CAAA,aAAA,GAAb,aAAa,CAAgB;QAC3B,IAAK,CAAA,KAAA,GAAL,KAAK,CAAiC;QAEhD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;KAC3C;IAEM,MAAM,GAAA;AACT,QAAA,IAAI,CAAC,kBAAkB,GAAGA,YAAS,CAC/B;AACI,YAAA,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM;;AAEjC,YAAA,OAAO,EAAE,OAAO,GAAG,KAAI;;;;AAInB,gBAAA,IAAI;AACA,oBAAA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;AACvF,oBAAA,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;AAC5F,oBAAA,MAAM,OAAO,GAAG;AACZ,wBAAA,GAAG,eAAe;AAClB,wBAAA,GAAG,WAAW;AACd,wBAAA,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,kBAAkB;;AAElD,wBAAA,GAAG,GAAG;qBACT,CAAC;AACF,oBAAA,MAAM,MAAM,GAAG;AACX,wBAAA,WAAW,EAAE,oCAAoC,CAC7C,OAAO,EACP,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,aAAa,CAAC,UAAU,CAChC;qBACJ,CAAC;oBACF,OAAO;AACH,wBAAA,GAAG,OAAO;AACV,wBAAA,GAAG,MAAM;AACT,wBAAA,GAAG,GAAG;AACN,wBAAA,GAAG,WAAW;AACd,wBAAA,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,kBAAkB;qBACrD,CAAC;iBACL;gBAAC,OAAO,GAAG,EAAE;AACV,oBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;iBAC1B;aACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCJ,SAAA,EACD,IAAI,CAAC,QAAQ,CAChB,CAAC;QACF,OAAO,IAAI,CAAC,kBAAkB,CAAC;KAClC;IAEM,UAAU,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AACzB,YAAA,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;SACrC;KACJ;AACJ"}
@@ -0,0 +1,14 @@
1
+ import * as IORedis from 'ioredis';
2
+ import { Disposable } from 'graphql-ws';
3
+ import { WebSocketServer } from 'ws';
4
+ import { IModuleService } from '../interfaces';
5
+ export declare class GraphqlWs {
6
+ private wsServer;
7
+ private moduleService;
8
+ protected cache: IORedis.Redis | IORedis.Cluster;
9
+ private subscriptionServer;
10
+ private logger;
11
+ constructor(wsServer: WebSocketServer, moduleService: IModuleService, cache: IORedis.Redis | IORedis.Cluster);
12
+ create(): Disposable;
13
+ disconnect(): void;
14
+ }
@@ -0,0 +1,97 @@
1
+ import {useServer}from'graphql-ws/lib/use/ws';import'graphql';// @workaround as the `dataSources` not available in Subscription (websocket) Context.
2
+ // https://github.com/apollographql/apollo-server/issues/1526 need to revisit in Apollo-Server v3.
3
+ const constructDataSourcesForSubscriptions = (context, cache, dataSources) => {
4
+ const intializeDataSource = (instance) => {
5
+ instance.initialize({ context, cache });
6
+ };
7
+ // tslint:disable-next-line:forin
8
+ for (const prop in dataSources) {
9
+ if (dataSources[prop] && typeof dataSources[prop]?.initialize === 'function') {
10
+ intializeDataSource(dataSources[prop]);
11
+ }
12
+ }
13
+ return dataSources;
14
+ };
15
+ class GraphqlWs {
16
+ wsServer;
17
+ moduleService;
18
+ cache;
19
+ subscriptionServer;
20
+ logger;
21
+ constructor(wsServer, moduleService, cache) {
22
+ this.wsServer = wsServer;
23
+ this.moduleService = moduleService;
24
+ this.cache = cache;
25
+ this.logger = this.moduleService.logger;
26
+ }
27
+ create() {
28
+ this.subscriptionServer = useServer({
29
+ schema: this.moduleService.schema,
30
+ // Adding a context property lets you add data to your GraphQL operation context
31
+ context: async (ctx) => {
32
+ // Returning an object here will add that information to our
33
+ // GraphQL context, which all of our resolvers have access to.
34
+ // ctx is the `graphql-ws` Context where connectionParams live
35
+ try {
36
+ const pureContext = await this.moduleService.createContext(ctx.connectionParams, null);
37
+ const contextServices = await this.moduleService.serviceContext(ctx.connectionParams, null);
38
+ const context = {
39
+ ...contextServices,
40
+ ...pureContext,
41
+ preferences: this.moduleService.defaultPreferences,
42
+ // update: updateContainers,
43
+ ...ctx,
44
+ };
45
+ const addons = {
46
+ dataSources: constructDataSourcesForSubscriptions(context, this.cache, this.moduleService.dataSource),
47
+ };
48
+ return {
49
+ ...context,
50
+ ...addons,
51
+ ...ctx,
52
+ ...pureContext,
53
+ preferences: this.moduleService.defaultPreferences,
54
+ };
55
+ }
56
+ catch (err) {
57
+ this.logger.error(err);
58
+ }
59
+ },
60
+ // onConnect: async (ctx) => {
61
+ // // do anything when connected
62
+ // },
63
+ // onOperation: (ctx, msg) => {
64
+ // }
65
+ // onOperation: async (message: { payload: any }, connection: ExecutionParams) => {
66
+ // connection.formatResponse = (value: ExecutionResult) => ({
67
+ // ...value,
68
+ // errors:
69
+ // value.errors &&
70
+ // formatApolloErrors([...value.errors], {
71
+ // formatter: this.requestOptions.formatError,
72
+ // debug: this.requestOptions.debug,
73
+ // }),
74
+ // });
75
+ // let context: Context = this.context ? this.context : { connection };
76
+ // try {
77
+ // context =
78
+ // typeof this.context === 'function'
79
+ // ? await this.context({ connection, payload: message.payload })
80
+ // : context;
81
+ // } catch (e) {
82
+ // throw formatApolloErrors([e], {
83
+ // formatter: this.requestOptions.formatError,
84
+ // debug: this.requestOptions.debug,
85
+ // })[0];
86
+ // }
87
+ // return { ...connection }; // TODO: we didn't add `context`
88
+ // },
89
+ }, this.wsServer);
90
+ return this.subscriptionServer;
91
+ }
92
+ disconnect() {
93
+ if (this.subscriptionServer) {
94
+ this.subscriptionServer.dispose();
95
+ }
96
+ }
97
+ }export{GraphqlWs};//# sourceMappingURL=GraphqlWs.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GraphqlWs.mjs","sources":["../../src/servers/GraphqlWs.ts"],"sourcesContent":[null],"names":[],"mappings":"8DAUA;AACA;AACA,MAAM,oCAAoC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,KAAI;AACzE,IAAA,MAAM,mBAAmB,GAAG,CAAC,QAAQ,KAAI;QACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5C,KAAC,CAAC;;AAEF,IAAA,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE;AAC5B,QAAA,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,OAAO,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,KAAK,UAAU,EAAE;AAC1E,YAAA,mBAAmB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;SAC1C;KACJ;AACD,IAAA,OAAO,WAAW,CAAC;AACvB,CAAC,CAAC;MA0CW,SAAS,CAAA;AAMN,IAAA,QAAA,CAAA;AACA,IAAA,aAAA,CAAA;AACE,IAAA,KAAA,CAAA;AAPN,IAAA,kBAAkB,CAAa;AAE/B,IAAA,MAAM,CAAU;AAExB,IAAA,WAAA,CACY,QAAyB,EACzB,aAA6B,EAC3B,KAAsC,EAAA;QAFxC,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAiB;QACzB,IAAa,CAAA,aAAA,GAAb,aAAa,CAAgB;QAC3B,IAAK,CAAA,KAAA,GAAL,KAAK,CAAiC;QAEhD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;KAC3C;IAEM,MAAM,GAAA;AACT,QAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAC/B;AACI,YAAA,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM;;AAEjC,YAAA,OAAO,EAAE,OAAO,GAAG,KAAI;;;;AAInB,gBAAA,IAAI;AACA,oBAAA,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;AACvF,oBAAA,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;AAC5F,oBAAA,MAAM,OAAO,GAAG;AACZ,wBAAA,GAAG,eAAe;AAClB,wBAAA,GAAG,WAAW;AACd,wBAAA,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,kBAAkB;;AAElD,wBAAA,GAAG,GAAG;qBACT,CAAC;AACF,oBAAA,MAAM,MAAM,GAAG;AACX,wBAAA,WAAW,EAAE,oCAAoC,CAC7C,OAAO,EACP,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,aAAa,CAAC,UAAU,CAChC;qBACJ,CAAC;oBACF,OAAO;AACH,wBAAA,GAAG,OAAO;AACV,wBAAA,GAAG,MAAM;AACT,wBAAA,GAAG,GAAG;AACN,wBAAA,GAAG,WAAW;AACd,wBAAA,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,kBAAkB;qBACrD,CAAC;iBACL;gBAAC,OAAO,GAAG,EAAE;AACV,oBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;iBAC1B;aACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCJ,SAAA,EACD,IAAI,CAAC,QAAQ,CAChB,CAAC;QACF,OAAO,IAAI,CAAC,kBAAkB,CAAC;KAClC;IAEM,UAAU,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AACzB,YAAA,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;SACrC;KACJ;AACJ"}
@@ -0,0 +1,63 @@
1
+ 'use strict';var url=require('url'),ws=require('ws'),ws$1=require('graphql-ws/lib/use/ws');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 url__namespace=/*#__PURE__*/_interopNamespaceDefault(url);class WebsocketMultiPathServer {
2
+ moduleService;
3
+ cache;
4
+ webSockets = {};
5
+ // private graphqlSubscriptionServer: GraphqlSubscriptionServer;
6
+ _graphqlWs;
7
+ constructor(moduleService, cache, multiplePathConfig) {
8
+ this.moduleService = moduleService;
9
+ this.cache = cache;
10
+ this._graphqlWs = new ws.WebSocketServer({ noServer: true, path: __GRAPHQL_ENDPOINT__ });
11
+ this.webSockets[__GRAPHQL_ENDPOINT__] = this._graphqlWs;
12
+ this.webSockets[__GRAPHQL_ENDPOINT__].on('connection', (ws, request) => {
13
+ console.log('--REQUESTED CONNECTION--', this._graphqlWs);
14
+ ws$1.useServer({
15
+ schema: moduleService.schema,
16
+ }, this._graphqlWs);
17
+ });
18
+ for (let key in multiplePathConfig) {
19
+ if (!multiplePathConfig.hasOwnProperty(key)) {
20
+ continue;
21
+ }
22
+ if (!this.webSockets[key]) {
23
+ this.webSockets[key] = new ws.WebSocketServer({ noServer: true });
24
+ this.webSockets[key].on('connection', (ws, request) => {
25
+ Promise.all([
26
+ moduleService.createContext(request, null),
27
+ moduleService.serviceContext(request, null),
28
+ ]).then(multiplePathConfig[key](ws));
29
+ });
30
+ }
31
+ }
32
+ }
33
+ httpServerUpgrade(httpServer) {
34
+ httpServer.on('upgrade', (request, socket, head) => {
35
+ const pathname = url__namespace.parse(request.url).pathname;
36
+ console.log('--UPGRADE', request.url);
37
+ if (!this.webSockets[pathname]) {
38
+ // in development
39
+ if (pathname !== '/sockjs-node') {
40
+ // need to destroy
41
+ socket.destroy();
42
+ }
43
+ }
44
+ // code to run when a new connection is made
45
+ this.webSockets[pathname].handleUpgrade(request, socket, head, (ws) => {
46
+ this.webSockets[pathname].emit('connection', ws, request);
47
+ });
48
+ });
49
+ // (new GraphqlWs(this.graphqlWs, this.moduleService, this.cache)).create();
50
+ // useServer({
51
+ // schema: this.moduleService.schema,
52
+ // }, this.graphqlWs);
53
+ return httpServer;
54
+ }
55
+ get graphqlWs() {
56
+ return this._graphqlWs;
57
+ }
58
+ close() {
59
+ for (const key in this.webSockets) {
60
+ this.webSockets[key].close();
61
+ }
62
+ }
63
+ }exports.WebsocketMultiPathServer=WebsocketMultiPathServer;//# sourceMappingURL=WebsocketMultipathUpdate.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebsocketMultipathUpdate.cjs","sources":["../../src/servers/WebsocketMultipathUpdate.ts"],"sourcesContent":[null],"names":["WebSocketServer","useServer","url"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { WebSocketServer } from 'ws';
2
+ import { Server } from 'http';
3
+ import * as IORedis from 'ioredis';
4
+ import { IModuleService } from '../interfaces';
5
+ interface MultiWebsocketConfig {
6
+ [key: string]: any;
7
+ }
8
+ export declare class WebsocketMultiPathServer {
9
+ moduleService: IModuleService;
10
+ cache: IORedis.Redis | IORedis.Cluster;
11
+ private webSockets;
12
+ private _graphqlWs;
13
+ constructor(moduleService: IModuleService, cache: IORedis.Redis | IORedis.Cluster, multiplePathConfig?: MultiWebsocketConfig);
14
+ httpServerUpgrade(httpServer: Server): Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
15
+ get graphqlWs(): WebSocketServer;
16
+ close(): void;
17
+ }
18
+ export {};
@@ -0,0 +1,63 @@
1
+ import*as url from'url';import {WebSocketServer}from'ws';import {useServer}from'graphql-ws/lib/use/ws';class WebsocketMultiPathServer {
2
+ moduleService;
3
+ cache;
4
+ webSockets = {};
5
+ // private graphqlSubscriptionServer: GraphqlSubscriptionServer;
6
+ _graphqlWs;
7
+ constructor(moduleService, cache, multiplePathConfig) {
8
+ this.moduleService = moduleService;
9
+ this.cache = cache;
10
+ this._graphqlWs = new WebSocketServer({ noServer: true, path: __GRAPHQL_ENDPOINT__ });
11
+ this.webSockets[__GRAPHQL_ENDPOINT__] = this._graphqlWs;
12
+ this.webSockets[__GRAPHQL_ENDPOINT__].on('connection', (ws, request) => {
13
+ console.log('--REQUESTED CONNECTION--', this._graphqlWs);
14
+ useServer({
15
+ schema: moduleService.schema,
16
+ }, this._graphqlWs);
17
+ });
18
+ for (let key in multiplePathConfig) {
19
+ if (!multiplePathConfig.hasOwnProperty(key)) {
20
+ continue;
21
+ }
22
+ if (!this.webSockets[key]) {
23
+ this.webSockets[key] = new WebSocketServer({ noServer: true });
24
+ this.webSockets[key].on('connection', (ws, request) => {
25
+ Promise.all([
26
+ moduleService.createContext(request, null),
27
+ moduleService.serviceContext(request, null),
28
+ ]).then(multiplePathConfig[key](ws));
29
+ });
30
+ }
31
+ }
32
+ }
33
+ httpServerUpgrade(httpServer) {
34
+ httpServer.on('upgrade', (request, socket, head) => {
35
+ const pathname = url.parse(request.url).pathname;
36
+ console.log('--UPGRADE', request.url);
37
+ if (!this.webSockets[pathname]) {
38
+ // in development
39
+ if (pathname !== '/sockjs-node') {
40
+ // need to destroy
41
+ socket.destroy();
42
+ }
43
+ }
44
+ // code to run when a new connection is made
45
+ this.webSockets[pathname].handleUpgrade(request, socket, head, (ws) => {
46
+ this.webSockets[pathname].emit('connection', ws, request);
47
+ });
48
+ });
49
+ // (new GraphqlWs(this.graphqlWs, this.moduleService, this.cache)).create();
50
+ // useServer({
51
+ // schema: this.moduleService.schema,
52
+ // }, this.graphqlWs);
53
+ return httpServer;
54
+ }
55
+ get graphqlWs() {
56
+ return this._graphqlWs;
57
+ }
58
+ close() {
59
+ for (const key in this.webSockets) {
60
+ this.webSockets[key].close();
61
+ }
62
+ }
63
+ }export{WebsocketMultiPathServer};//# sourceMappingURL=WebsocketMultipathUpdate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebsocketMultipathUpdate.mjs","sources":["../../src/servers/WebsocketMultipathUpdate.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { IModuleService } from '../interfaces';
2
+ import { Schema, Connection as DBConnection } from 'mongoose';
3
+ export declare const MigrationSchema: Schema<any, import("mongoose").Model<any, any, any, any, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, {
4
+ name: string;
5
+ migrated_at?: Date;
6
+ }>;
7
+ export declare class MongoDBMigrationUpgrade {
8
+ private moduleService;
9
+ private mongoDB;
10
+ constructor(moduleService: IModuleService, mongoDB: DBConnection);
11
+ migrate(): Promise<any>;
12
+ }
@@ -0,0 +1,14 @@
1
+ import * as IORedis from 'ioredis';
2
+ import { CdmLogger } from '@cdm-logger/core';
3
+ type ILogger = CdmLogger.ILogger;
4
+ /**
5
+ * It'll get messy below but there's an issue currently with the state of the protocols that can be used (subscriptions-transport-ws vs graphql-ws).
6
+ * Read more from: https://www.apollographql.com/docs/apollo-server/data/subscriptions/#the-graphql-ws-transport-library
7
+ *
8
+ * Bottomline is, if we use the newer and actively maintained `graphql-ws` lib, then the GraphQL Playground will not work because it uses the old protocol.
9
+ *
10
+ * The approach below tries to support both based on the template provided here but adjusted for our setup here.
11
+ * https://github.com/enisdenjo/graphql-ws#ws-backwards-compat
12
+ */
13
+ export declare function createContextFromConnectionParams(context: any, datasources: any, cache: IORedis.Redis | IORedis.Cluster, logger: ILogger): Promise<any>;
14
+ export {};
@@ -0,0 +1 @@
1
+ export * from './migrations';
@@ -0,0 +1,26 @@
1
+ 'use strict';var mongoose=require('mongoose');const MigrationSchema = new mongoose.Schema({
2
+ migrated_at: Date,
3
+ name: { required: true, type: String },
4
+ });
5
+ async function migrate(db, container, logger) {
6
+ try {
7
+ const migrations = container.getAll('MongodbMigration');
8
+ const model = db.model('Migration', MigrationSchema);
9
+ migrations.map(async (migration) => {
10
+ const exists = await model.findOne({ name: migration.id });
11
+ if (!exists) {
12
+ try {
13
+ await migration.up();
14
+ await model.create({ name: migration.id, migrated_at: new Date() });
15
+ }
16
+ catch (e) {
17
+ console.log(`Can not process migration ${migration.id}: `, e);
18
+ }
19
+ }
20
+ return migration.id;
21
+ });
22
+ }
23
+ catch (err) {
24
+ console.warn('ignoring migrate database due to ', err.message);
25
+ }
26
+ }exports.MigrationSchema=MigrationSchema;exports.migrate=migrate;//# sourceMappingURL=migrations.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.cjs","sources":["../../src/utils/migrations.ts"],"sourcesContent":[null],"names":["Schema"],"mappings":"8CAKa,MAAA,eAAe,GAAG,IAAIA,eAAM,CAAC;AACtC,IAAA,WAAW,EAAE,IAAI;IACjB,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;AACzC,CAAA,EAAE;AAEI,eAAe,OAAO,CAAC,EAAc,EAAE,SAAoB,EAAE,MAAyB,EAAA;AACzF,IAAA,IAAI;QACA,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAqB,kBAAkB,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAW,WAAW,EAAE,eAAe,CAAC,CAAC;AAC/D,QAAA,UAAU,CAAC,GAAG,CAAC,OAAO,SAAS,KAAI;AAC/B,YAAA,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,EAAE;AACT,gBAAA,IAAI;AACA,oBAAA,MAAM,SAAS,CAAC,EAAE,EAAE,CAAC;AACrB,oBAAA,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;iBACvE;gBAAC,OAAO,CAAC,EAAE;oBACR,OAAO,CAAC,GAAG,CAAC,CAA6B,0BAAA,EAAA,SAAS,CAAC,EAAE,CAAI,EAAA,CAAA,EAAE,CAAC,CAAC,CAAC;iBACjE;aACJ;YAED,OAAO,SAAS,CAAC,EAAE,CAAC;AACxB,SAAC,CAAC,CAAC;KACN;IAAC,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;KAClE;AAEL"}
@@ -0,0 +1,8 @@
1
+ import { Schema, Connection } from 'mongoose';
2
+ import { Container } from 'inversify';
3
+ import { CdmLogger } from '@cdm-logger/core';
4
+ export declare const MigrationSchema: Schema<any, import("mongoose").Model<any, any, any, any, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, {
5
+ name: string;
6
+ migrated_at?: Date;
7
+ }>;
8
+ export declare function migrate(db: Connection, container: Container, logger: CdmLogger.ILogger): Promise<void>;
@@ -0,0 +1,26 @@
1
+ import {Schema}from'mongoose';const MigrationSchema = new Schema({
2
+ migrated_at: Date,
3
+ name: { required: true, type: String },
4
+ });
5
+ async function migrate(db, container, logger) {
6
+ try {
7
+ const migrations = container.getAll('MongodbMigration');
8
+ const model = db.model('Migration', MigrationSchema);
9
+ migrations.map(async (migration) => {
10
+ const exists = await model.findOne({ name: migration.id });
11
+ if (!exists) {
12
+ try {
13
+ await migration.up();
14
+ await model.create({ name: migration.id, migrated_at: new Date() });
15
+ }
16
+ catch (e) {
17
+ console.log(`Can not process migration ${migration.id}: `, e);
18
+ }
19
+ }
20
+ return migration.id;
21
+ });
22
+ }
23
+ catch (err) {
24
+ console.warn('ignoring migrate database due to ', err.message);
25
+ }
26
+ }export{MigrationSchema,migrate};//# sourceMappingURL=migrations.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.mjs","sources":["../../src/utils/migrations.ts"],"sourcesContent":[null],"names":[],"mappings":"8BAKa,MAAA,eAAe,GAAG,IAAI,MAAM,CAAC;AACtC,IAAA,WAAW,EAAE,IAAI;IACjB,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;AACzC,CAAA,EAAE;AAEI,eAAe,OAAO,CAAC,EAAc,EAAE,SAAoB,EAAE,MAAyB,EAAA;AACzF,IAAA,IAAI;QACA,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAqB,kBAAkB,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAW,WAAW,EAAE,eAAe,CAAC,CAAC;AAC/D,QAAA,UAAU,CAAC,GAAG,CAAC,OAAO,SAAS,KAAI;AAC/B,YAAA,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,EAAE;AACT,gBAAA,IAAI;AACA,oBAAA,MAAM,SAAS,CAAC,EAAE,EAAE,CAAC;AACrB,oBAAA,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;iBACvE;gBAAC,OAAO,CAAC,EAAE;oBACR,OAAO,CAAC,GAAG,CAAC,CAA6B,0BAAA,EAAA,SAAS,CAAC,EAAE,CAAI,EAAA,CAAA,EAAE,CAAC,CAAC,CAAC;iBACjE;aACJ;YAED,OAAO,SAAS,CAAC,EAAE,CAAC;AACxB,SAAC,CAAC,CAAC;KACN;IAAC,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,IAAI,CAAC,mCAAmC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;KAClE;AAEL"}