@restorecommerce/facade 1.3.9 → 1.3.11

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 (267) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/LICENSE +19 -0
  3. package/codegen/index.d.ts +12 -0
  4. package/codegen/index.js +43 -0
  5. package/dist/gql/index.d.ts +1 -0
  6. package/dist/gql/index.js +1 -0
  7. package/dist/gql/protos/federation.d.ts +6 -0
  8. package/dist/gql/protos/federation.js +46 -0
  9. package/dist/gql/protos/graphql.d.ts +11 -0
  10. package/dist/gql/protos/graphql.js +158 -0
  11. package/dist/gql/protos/index.d.ts +6 -0
  12. package/dist/gql/protos/index.js +6 -0
  13. package/dist/gql/protos/registry.d.ts +23 -0
  14. package/dist/gql/protos/registry.js +366 -0
  15. package/dist/gql/protos/resolvers.d.ts +9 -0
  16. package/dist/gql/protos/resolvers.js +487 -0
  17. package/dist/gql/protos/schema.d.ts +14 -0
  18. package/dist/gql/protos/schema.js +224 -0
  19. package/dist/gql/protos/stream-to-async-iterator.d.ts +50 -0
  20. package/dist/gql/protos/stream-to-async-iterator.js +190 -0
  21. package/dist/gql/protos/types.d.ts +96 -0
  22. package/dist/gql/protos/types.js +1 -0
  23. package/dist/gql/protos/utils.d.ts +18 -0
  24. package/dist/gql/protos/utils.js +133 -0
  25. package/dist/gql/types/AccessControlTypes.d.ts +6 -0
  26. package/dist/gql/types/AccessControlTypes.js +97 -0
  27. package/dist/gql/types/DateType.d.ts +2 -0
  28. package/dist/gql/types/DateType.js +29 -0
  29. package/dist/gql/types/FilterType.d.ts +2 -0
  30. package/dist/gql/types/FilterType.js +72 -0
  31. package/dist/gql/types/MetaType.d.ts +2 -0
  32. package/dist/gql/types/MetaType.js +25 -0
  33. package/dist/gql/types/ScopeType.d.ts +2 -0
  34. package/dist/gql/types/ScopeType.js +13 -0
  35. package/dist/gql/types/SortType.d.ts +3 -0
  36. package/dist/gql/types/SortType.js +30 -0
  37. package/dist/gql/types/StatusType.d.ts +2 -0
  38. package/dist/gql/types/StatusType.js +15 -0
  39. package/dist/gql/types/index.d.ts +7 -0
  40. package/dist/gql/types/index.js +7 -0
  41. package/dist/index.d.ts +66 -0
  42. package/dist/index.js +315 -0
  43. package/dist/interfaces.d.ts +54 -0
  44. package/dist/interfaces.js +6 -0
  45. package/dist/middlewares/index.d.ts +1 -0
  46. package/dist/middlewares/index.js +1 -0
  47. package/dist/middlewares/req-res-logger/index.d.ts +14 -0
  48. package/dist/middlewares/req-res-logger/index.js +90 -0
  49. package/dist/modules/access-control/gql/federation.d.ts +2 -0
  50. package/dist/modules/access-control/gql/federation.js +13 -0
  51. package/dist/modules/access-control/gql/schema.d.ts +2 -0
  52. package/dist/modules/access-control/gql/schema.generated.d.ts +1147 -0
  53. package/dist/modules/access-control/gql/schema.generated.js +80 -0
  54. package/dist/modules/access-control/gql/schema.js +5 -0
  55. package/dist/modules/access-control/gql/types.d.ts +3 -0
  56. package/dist/modules/access-control/gql/types.js +14 -0
  57. package/dist/modules/access-control/grpc/index.d.ts +13 -0
  58. package/dist/modules/access-control/grpc/index.js +14 -0
  59. package/dist/modules/access-control/index.d.ts +2 -0
  60. package/dist/modules/access-control/index.js +26 -0
  61. package/dist/modules/access-control/interfaces.d.ts +15 -0
  62. package/dist/modules/access-control/interfaces.js +1 -0
  63. package/dist/modules/catalog/gql/federation.d.ts +2 -0
  64. package/dist/modules/catalog/gql/federation.js +13 -0
  65. package/dist/modules/catalog/gql/schema.d.ts +2 -0
  66. package/dist/modules/catalog/gql/schema.generated.d.ts +2026 -0
  67. package/dist/modules/catalog/gql/schema.generated.js +86 -0
  68. package/dist/modules/catalog/gql/schema.js +5 -0
  69. package/dist/modules/catalog/gql/types.d.ts +3 -0
  70. package/dist/modules/catalog/gql/types.js +16 -0
  71. package/dist/modules/catalog/grpc/index.d.ts +15 -0
  72. package/dist/modules/catalog/grpc/index.js +16 -0
  73. package/dist/modules/catalog/index.d.ts +2 -0
  74. package/dist/modules/catalog/index.js +26 -0
  75. package/dist/modules/catalog/interfaces.d.ts +16 -0
  76. package/dist/modules/catalog/interfaces.js +1 -0
  77. package/dist/modules/facade-status/gql/index.d.ts +1 -0
  78. package/dist/modules/facade-status/gql/index.js +11 -0
  79. package/dist/modules/facade-status/gql/resolvers.d.ts +2 -0
  80. package/dist/modules/facade-status/gql/resolvers.js +18 -0
  81. package/dist/modules/facade-status/gql/schema.d.ts +3 -0
  82. package/dist/modules/facade-status/gql/schema.generated.d.ts +109 -0
  83. package/dist/modules/facade-status/gql/schema.generated.js +1 -0
  84. package/dist/modules/facade-status/gql/schema.js +14 -0
  85. package/dist/modules/facade-status/gql/types.d.ts +2 -0
  86. package/dist/modules/facade-status/gql/types.js +10 -0
  87. package/dist/modules/facade-status/index.d.ts +2 -0
  88. package/dist/modules/facade-status/index.js +8 -0
  89. package/dist/modules/facade-status/interfaces.d.ts +4 -0
  90. package/dist/modules/facade-status/interfaces.js +1 -0
  91. package/dist/modules/fulfillment/gql/federation.d.ts +2 -0
  92. package/dist/modules/fulfillment/gql/federation.js +13 -0
  93. package/dist/modules/fulfillment/gql/schema.d.ts +2 -0
  94. package/dist/modules/fulfillment/gql/schema.generated.d.ts +2777 -0
  95. package/dist/modules/fulfillment/gql/schema.generated.js +109 -0
  96. package/dist/modules/fulfillment/gql/schema.js +5 -0
  97. package/dist/modules/fulfillment/gql/types.d.ts +3 -0
  98. package/dist/modules/fulfillment/gql/types.js +12 -0
  99. package/dist/modules/fulfillment/grpc/index.d.ts +9 -0
  100. package/dist/modules/fulfillment/grpc/index.js +10 -0
  101. package/dist/modules/fulfillment/index.d.ts +2 -0
  102. package/dist/modules/fulfillment/index.js +26 -0
  103. package/dist/modules/fulfillment/interfaces.d.ts +16 -0
  104. package/dist/modules/fulfillment/interfaces.js +1 -0
  105. package/dist/modules/identity/api-key/api-key.d.ts +11 -0
  106. package/dist/modules/identity/api-key/api-key.js +137 -0
  107. package/dist/modules/identity/gql/federation.d.ts +2 -0
  108. package/dist/modules/identity/gql/federation.js +5 -0
  109. package/dist/modules/identity/gql/schema.d.ts +2 -0
  110. package/dist/modules/identity/gql/schema.generated.d.ts +1686 -0
  111. package/dist/modules/identity/gql/schema.generated.js +75 -0
  112. package/dist/modules/identity/gql/schema.js +5 -0
  113. package/dist/modules/identity/gql/types.d.ts +3 -0
  114. package/dist/modules/identity/gql/types.js +18 -0
  115. package/dist/modules/identity/grpc/index.d.ts +15 -0
  116. package/dist/modules/identity/grpc/index.js +16 -0
  117. package/dist/modules/identity/index.d.ts +4 -0
  118. package/dist/modules/identity/index.js +54 -0
  119. package/dist/modules/identity/interfaces.d.ts +22 -0
  120. package/dist/modules/identity/interfaces.js +1 -0
  121. package/dist/modules/identity/oauth/oauth.d.ts +11 -0
  122. package/dist/modules/identity/oauth/oauth.js +170 -0
  123. package/dist/modules/identity/oidc/adapter.d.ts +4 -0
  124. package/dist/modules/identity/oidc/adapter.js +135 -0
  125. package/dist/modules/identity/oidc/in-memory-adapter.d.ts +16 -0
  126. package/dist/modules/identity/oidc/in-memory-adapter.js +85 -0
  127. package/dist/modules/identity/oidc/index.d.ts +18 -0
  128. package/dist/modules/identity/oidc/index.js +147 -0
  129. package/dist/modules/identity/oidc/interfaces.d.ts +73 -0
  130. package/dist/modules/identity/oidc/interfaces.js +7 -0
  131. package/dist/modules/identity/oidc/password-grant.d.ts +2 -0
  132. package/dist/modules/identity/oidc/password-grant.js +163 -0
  133. package/dist/modules/identity/oidc/router.d.ts +13 -0
  134. package/dist/modules/identity/oidc/router.js +164 -0
  135. package/dist/modules/identity/oidc/templates.d.ts +36 -0
  136. package/dist/modules/identity/oidc/templates.js +60 -0
  137. package/dist/modules/identity/oidc/user.d.ts +6 -0
  138. package/dist/modules/identity/oidc/user.js +91 -0
  139. package/dist/modules/identity/oidc/utils.d.ts +6 -0
  140. package/dist/modules/identity/oidc/utils.js +15 -0
  141. package/dist/modules/index.d.ts +13 -0
  142. package/dist/modules/index.js +13 -0
  143. package/dist/modules/indexing/gql/federation.d.ts +2 -0
  144. package/dist/modules/indexing/gql/federation.js +13 -0
  145. package/dist/modules/indexing/gql/schema.d.ts +2 -0
  146. package/dist/modules/indexing/gql/schema.generated.d.ts +231 -0
  147. package/dist/modules/indexing/gql/schema.generated.js +6 -0
  148. package/dist/modules/indexing/gql/schema.js +5 -0
  149. package/dist/modules/indexing/gql/types.d.ts +3 -0
  150. package/dist/modules/indexing/gql/types.js +8 -0
  151. package/dist/modules/indexing/grpc/index.d.ts +7 -0
  152. package/dist/modules/indexing/grpc/index.js +8 -0
  153. package/dist/modules/indexing/index.d.ts +2 -0
  154. package/dist/modules/indexing/index.js +26 -0
  155. package/dist/modules/indexing/interfaces.d.ts +13 -0
  156. package/dist/modules/indexing/interfaces.js +1 -0
  157. package/dist/modules/invoicing/gql/federation.d.ts +2 -0
  158. package/dist/modules/invoicing/gql/federation.js +13 -0
  159. package/dist/modules/invoicing/gql/schema.d.ts +2 -0
  160. package/dist/modules/invoicing/gql/schema.generated.d.ts +2241 -0
  161. package/dist/modules/invoicing/gql/schema.generated.js +98 -0
  162. package/dist/modules/invoicing/gql/schema.js +5 -0
  163. package/dist/modules/invoicing/gql/types.d.ts +3 -0
  164. package/dist/modules/invoicing/gql/types.js +8 -0
  165. package/dist/modules/invoicing/grpc/index.d.ts +7 -0
  166. package/dist/modules/invoicing/grpc/index.js +8 -0
  167. package/dist/modules/invoicing/index.d.ts +2 -0
  168. package/dist/modules/invoicing/index.js +26 -0
  169. package/dist/modules/invoicing/interfaces.d.ts +16 -0
  170. package/dist/modules/invoicing/interfaces.js +1 -0
  171. package/dist/modules/master_data/gql/federation.d.ts +2 -0
  172. package/dist/modules/master_data/gql/federation.js +13 -0
  173. package/dist/modules/master_data/gql/schema.d.ts +2 -0
  174. package/dist/modules/master_data/gql/schema.generated.d.ts +2569 -0
  175. package/dist/modules/master_data/gql/schema.generated.js +121 -0
  176. package/dist/modules/master_data/gql/schema.js +5 -0
  177. package/dist/modules/master_data/gql/types.d.ts +3 -0
  178. package/dist/modules/master_data/gql/types.js +32 -0
  179. package/dist/modules/master_data/grpc/index.d.ts +30 -0
  180. package/dist/modules/master_data/grpc/index.js +32 -0
  181. package/dist/modules/master_data/index.d.ts +2 -0
  182. package/dist/modules/master_data/index.js +26 -0
  183. package/dist/modules/master_data/interfaces.d.ts +16 -0
  184. package/dist/modules/master_data/interfaces.js +1 -0
  185. package/dist/modules/notification/gql/federation.d.ts +2 -0
  186. package/dist/modules/notification/gql/federation.js +13 -0
  187. package/dist/modules/notification/gql/schema.d.ts +2 -0
  188. package/dist/modules/notification/gql/schema.generated.d.ts +655 -0
  189. package/dist/modules/notification/gql/schema.generated.js +68 -0
  190. package/dist/modules/notification/gql/schema.js +5 -0
  191. package/dist/modules/notification/gql/types.d.ts +3 -0
  192. package/dist/modules/notification/gql/types.js +8 -0
  193. package/dist/modules/notification/grpc/index.d.ts +7 -0
  194. package/dist/modules/notification/grpc/index.js +8 -0
  195. package/dist/modules/notification/index.d.ts +2 -0
  196. package/dist/modules/notification/index.js +26 -0
  197. package/dist/modules/notification/interfaces.d.ts +16 -0
  198. package/dist/modules/notification/interfaces.js +1 -0
  199. package/dist/modules/ordering/gql/federation.d.ts +2 -0
  200. package/dist/modules/ordering/gql/federation.js +13 -0
  201. package/dist/modules/ordering/gql/schema.d.ts +2 -0
  202. package/dist/modules/ordering/gql/schema.generated.d.ts +2646 -0
  203. package/dist/modules/ordering/gql/schema.generated.js +125 -0
  204. package/dist/modules/ordering/gql/schema.js +5 -0
  205. package/dist/modules/ordering/gql/types.d.ts +3 -0
  206. package/dist/modules/ordering/gql/types.js +8 -0
  207. package/dist/modules/ordering/grpc/index.d.ts +7 -0
  208. package/dist/modules/ordering/grpc/index.js +8 -0
  209. package/dist/modules/ordering/index.d.ts +2 -0
  210. package/dist/modules/ordering/index.js +26 -0
  211. package/dist/modules/ordering/interfaces.d.ts +16 -0
  212. package/dist/modules/ordering/interfaces.js +1 -0
  213. package/dist/modules/ostorage/gql/federation.d.ts +2 -0
  214. package/dist/modules/ostorage/gql/federation.js +13 -0
  215. package/dist/modules/ostorage/gql/schema.d.ts +2 -0
  216. package/dist/modules/ostorage/gql/schema.generated.d.ts +869 -0
  217. package/dist/modules/ostorage/gql/schema.generated.js +31 -0
  218. package/dist/modules/ostorage/gql/schema.js +5 -0
  219. package/dist/modules/ostorage/gql/types.d.ts +3 -0
  220. package/dist/modules/ostorage/gql/types.js +8 -0
  221. package/dist/modules/ostorage/grpc/index.d.ts +7 -0
  222. package/dist/modules/ostorage/grpc/index.js +8 -0
  223. package/dist/modules/ostorage/index.d.ts +2 -0
  224. package/dist/modules/ostorage/index.js +46 -0
  225. package/dist/modules/ostorage/interfaces.d.ts +16 -0
  226. package/dist/modules/ostorage/interfaces.js +1 -0
  227. package/dist/modules/ostorage/objectDownloadReqHandler.d.ts +1 -0
  228. package/dist/modules/ostorage/objectDownloadReqHandler.js +133 -0
  229. package/dist/modules/payment/gql/federation.d.ts +2 -0
  230. package/dist/modules/payment/gql/federation.js +13 -0
  231. package/dist/modules/payment/gql/schema.d.ts +2 -0
  232. package/dist/modules/payment/gql/schema.generated.d.ts +647 -0
  233. package/dist/modules/payment/gql/schema.generated.js +156 -0
  234. package/dist/modules/payment/gql/schema.js +5 -0
  235. package/dist/modules/payment/gql/types.d.ts +3 -0
  236. package/dist/modules/payment/gql/types.js +8 -0
  237. package/dist/modules/payment/grpc/index.d.ts +7 -0
  238. package/dist/modules/payment/grpc/index.js +8 -0
  239. package/dist/modules/payment/index.d.ts +2 -0
  240. package/dist/modules/payment/index.js +26 -0
  241. package/dist/modules/payment/interfaces.d.ts +16 -0
  242. package/dist/modules/payment/interfaces.js +1 -0
  243. package/dist/modules/scheduling/gql/federation.d.ts +2 -0
  244. package/dist/modules/scheduling/gql/federation.js +13 -0
  245. package/dist/modules/scheduling/gql/schema.d.ts +2 -0
  246. package/dist/modules/scheduling/gql/schema.generated.d.ts +651 -0
  247. package/dist/modules/scheduling/gql/schema.generated.js +31 -0
  248. package/dist/modules/scheduling/gql/schema.js +5 -0
  249. package/dist/modules/scheduling/gql/types.d.ts +3 -0
  250. package/dist/modules/scheduling/gql/types.js +8 -0
  251. package/dist/modules/scheduling/grpc/index.d.ts +7 -0
  252. package/dist/modules/scheduling/grpc/index.js +8 -0
  253. package/dist/modules/scheduling/index.d.ts +2 -0
  254. package/dist/modules/scheduling/index.js +26 -0
  255. package/dist/modules/scheduling/interfaces.d.ts +16 -0
  256. package/dist/modules/scheduling/interfaces.js +1 -0
  257. package/dist/utils.d.ts +5 -0
  258. package/dist/utils.js +14 -0
  259. package/package.json +9 -8
  260. package/tsconfig-base.json +19 -8
  261. package/tsconfig.codegen.json +1 -0
  262. package/tsconfig.debug.json +5 -1
  263. package/tsconfig.generate.json +3 -0
  264. package/tsconfig.lib.json +2 -1
  265. package/tsconfig.test.json +22 -1
  266. package/codegen/tsconfig.codegen.tsbuildinfo +0 -1
  267. package/dist/tsconfig.lib.tsbuildinfo +0 -1
package/dist/index.js ADDED
@@ -0,0 +1,315 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { createLogger } from '@restorecommerce/logger';
11
+ import { ServerResponse } from 'node:http';
12
+ import Koa from 'koa';
13
+ import { ApolloServer } from '@apollo/server';
14
+ import { koaMiddleware } from '@as-integrations/koa';
15
+ import { GraphQLSchema, printSchema } from 'graphql';
16
+ import { ApolloGateway, LocalGraphQLDataSource, RemoteGraphQLDataSource, IntrospectAndCompose } from '@apollo/gateway';
17
+ import { facadeStatusModule } from './modules/index.js';
18
+ /* eslint-disable */
19
+ import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer';
20
+ /* eslint-disable */
21
+ import { ApolloServerPluginLandingPageLocalDefault } from '@apollo/server/plugin/landingPage/default';
22
+ import { createServer } from 'node:http';
23
+ import { WebSocketServer } from 'ws';
24
+ /* eslint-disable */
25
+ import { useServer } from 'graphql-ws/lib/use/ws';
26
+ import _ from 'lodash';
27
+ import { makeExecutableSchema } from 'graphql-tools';
28
+ import { gql } from 'graphql-tag';
29
+ import { mergeSubscribeIntoSchema } from './gql/protos/index.js';
30
+ import compose from 'koa-compose';
31
+ import { setUseSubscriptions } from './gql/protos/utils.js';
32
+ import bodyParser from 'koa-bodyparser';
33
+ import cors from '@koa/cors';
34
+ import graphqlUploadKoa from 'graphql-upload/graphqlUploadKoa.mjs';
35
+ import Router from 'koa-router';
36
+ export * from './modules/index.js';
37
+ export * from './middlewares/index.js';
38
+ export * from './interfaces.js';
39
+ export * from './utils.js';
40
+ export * from './gql/index.js';
41
+ export class RestoreCommerceFacade {
42
+ constructor({ koa, logger, port, hostname, env, kafka, fileUploadOptions }) {
43
+ this.apolloServices = {};
44
+ this.allResolvers = {};
45
+ this._initialized = false;
46
+ this.modules = [];
47
+ this.startFns = [];
48
+ this.stopFns = [];
49
+ this.logger = logger;
50
+ this.port = port !== null && port !== void 0 ? port : 5000;
51
+ this.hostname = hostname !== null && hostname !== void 0 ? hostname : '127.0.0.1';
52
+ this.koa = koa;
53
+ this.env = env !== null && env !== void 0 ? env : 'development';
54
+ this.kafkaConfig = kafka;
55
+ this.fileUploadOptionsConfig = fileUploadOptions;
56
+ setUseSubscriptions(!!kafka);
57
+ }
58
+ get server() {
59
+ return this._server;
60
+ }
61
+ get address() {
62
+ var _a;
63
+ const address = (_a = this._server) === null || _a === void 0 ? void 0 : _a.address();
64
+ if (address && typeof address === 'object') {
65
+ return address;
66
+ }
67
+ return undefined;
68
+ }
69
+ get listening() {
70
+ return !!this._server && this._server.listening;
71
+ }
72
+ useMiddleware(middleware) {
73
+ this.koa.use(middleware);
74
+ return this;
75
+ }
76
+ useModule(module) {
77
+ if (this.modules.some(m => module.moduleName === m.moduleName)) {
78
+ throw new Error(`module ${module.moduleName} already loaded`);
79
+ }
80
+ this.modules.push(module);
81
+ module(this);
82
+ return this;
83
+ }
84
+ supportsModule(module) {
85
+ return this.modules.some(m => module.moduleName === m.moduleName);
86
+ }
87
+ addApolloService({ name, schema, url }) {
88
+ if (schema instanceof GraphQLSchema) {
89
+ this.apolloServices[name] = { schema, url };
90
+ }
91
+ else if ('federatedSchema' in schema && 'resolvers' in schema) {
92
+ this.apolloServices[name] = { schema: schema.federatedSchema, url };
93
+ this.allResolvers = _.merge(this.allResolvers, schema.resolvers);
94
+ }
95
+ }
96
+ onStart(fn) {
97
+ debugger;
98
+ this.startFns.push(fn);
99
+ }
100
+ onStop(fn) {
101
+ this.stopFns.push(fn);
102
+ }
103
+ runFnQueue(fns) {
104
+ return __awaiter(this, void 0, void 0, function* () {
105
+ const _fns = [...fns];
106
+ const runQueue = () => __awaiter(this, void 0, void 0, function* () {
107
+ const fn = _fns.shift();
108
+ if (fn) {
109
+ try {
110
+ yield fn();
111
+ }
112
+ catch (error) {
113
+ this.logger.error('Error in start/stop function', error);
114
+ }
115
+ yield runQueue();
116
+ }
117
+ });
118
+ yield runQueue();
119
+ });
120
+ }
121
+ start() {
122
+ return __awaiter(this, void 0, void 0, function* () {
123
+ if (!this._initialized) {
124
+ this.runFnQueue(this.startFns);
125
+ yield this.mountApolloServer();
126
+ this._initialized = true;
127
+ }
128
+ return new Promise((resolve, reject) => {
129
+ var _a;
130
+ try {
131
+ (_a = this.server) === null || _a === void 0 ? void 0 : _a.listen(this.port, this.hostname, () => {
132
+ const address = this.address;
133
+ if (address) {
134
+ this.logger.info(`Service is listening on ${address.address}:${address.port}`);
135
+ }
136
+ else {
137
+ this.logger.info(`Service is listening`);
138
+ }
139
+ resolve();
140
+ });
141
+ }
142
+ catch (err) {
143
+ reject(err);
144
+ }
145
+ });
146
+ });
147
+ }
148
+ stop() {
149
+ return __awaiter(this, void 0, void 0, function* () {
150
+ return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
151
+ var _a;
152
+ yield this.runFnQueue(this.stopFns);
153
+ (_a = this.server) === null || _a === void 0 ? void 0 : _a.close((err) => {
154
+ if (err) {
155
+ this.logger.error(`Error stopping service`, err);
156
+ reject(err);
157
+ }
158
+ else {
159
+ this.logger.info(`Service stopped`);
160
+ this._server = undefined;
161
+ resolve();
162
+ }
163
+ });
164
+ }));
165
+ });
166
+ }
167
+ mountApolloServer() {
168
+ var _a, _b;
169
+ return __awaiter(this, void 0, void 0, function* () {
170
+ const serviceList = Object.keys(this.apolloServices).map(key => {
171
+ var _a;
172
+ return {
173
+ name: key,
174
+ url: (_a = this.apolloServices[key].url) !== null && _a !== void 0 ? _a : `local`,
175
+ };
176
+ });
177
+ const gateway = new ApolloGateway({
178
+ logger: this.logger,
179
+ // serviceList,
180
+ supergraphSdl: new IntrospectAndCompose({
181
+ subgraphs: serviceList
182
+ }),
183
+ debug: true,
184
+ buildService: ({ name, url }) => {
185
+ var _a;
186
+ if (url !== 'local') {
187
+ return new RemoteGraphQLDataSource({
188
+ url,
189
+ // TODO willSendRequest
190
+ });
191
+ }
192
+ else {
193
+ const schema = (_a = this.apolloServices[name]) === null || _a === void 0 ? void 0 : _a.schema;
194
+ if (schema) {
195
+ return new LocalGraphQLDataSource(schema);
196
+ }
197
+ else {
198
+ throw new Error('Invalid schema ' + name);
199
+ }
200
+ }
201
+ }
202
+ });
203
+ this._server = createServer(this.koa.callback());
204
+ const wsServer = new WebSocketServer({
205
+ server: this._server,
206
+ path: '/graphql',
207
+ });
208
+ let serverCleanup;
209
+ gateway.onSchemaLoadOrUpdate(schemaContext => {
210
+ const typeDefs = printSchema(new GraphQLSchema({
211
+ subscription: schemaContext.apiSchema.getSubscriptionType()
212
+ }));
213
+ let schema = makeExecutableSchema({
214
+ typeDefs: gql(typeDefs + `
215
+ type Query { sample: String }
216
+ `),
217
+ resolvers: {
218
+ Subscription: Object.assign({}, this.allResolvers['Subscription'])
219
+ }
220
+ });
221
+ if ('Subscription' in this.allResolvers) {
222
+ mergeSubscribeIntoSchema(schema.getSubscriptionType(), this.allResolvers['Subscription']);
223
+ }
224
+ serverCleanup = useServer({
225
+ schema,
226
+ context: (ctx, message, args) => __awaiter(this, void 0, void 0, function* () {
227
+ const newCtx = this.koa.createContext(ctx.extra.request, new ServerResponse(ctx.extra.request));
228
+ const fn = yield compose(this.koa.middleware);
229
+ yield fn(newCtx);
230
+ newCtx.kafkaConfig = this.kafkaConfig;
231
+ newCtx.logger = this.logger;
232
+ return newCtx;
233
+ }),
234
+ }, wsServer);
235
+ });
236
+ const gqlServer = new ApolloServer({
237
+ gateway,
238
+ introspection: true,
239
+ allowBatchedHttpRequests: true,
240
+ plugins: [
241
+ ApolloServerPluginDrainHttpServer({ httpServer: this._server }),
242
+ ApolloServerPluginLandingPageLocalDefault({
243
+ embed: true
244
+ }),
245
+ {
246
+ serverWillStart() {
247
+ return __awaiter(this, void 0, void 0, function* () {
248
+ return {
249
+ drainServer() {
250
+ return __awaiter(this, void 0, void 0, function* () {
251
+ yield serverCleanup.dispose();
252
+ });
253
+ },
254
+ };
255
+ });
256
+ },
257
+ },
258
+ ],
259
+ includeStacktraceInErrorResponses: true,
260
+ formatError: (error) => {
261
+ this.logger.error('Error while processing request', { message: error.message });
262
+ this.logger.debug('Error while processing request', { error });
263
+ return {
264
+ message: error.message,
265
+ locations: error.locations,
266
+ stack: error
267
+ };
268
+ },
269
+ });
270
+ yield gqlServer.start();
271
+ // set maxFile size and maximum files via Facade config of `createFacade`
272
+ const maxFileSize = ((_a = this.fileUploadOptionsConfig) === null || _a === void 0 ? void 0 : _a.maxFileSize) ? this.fileUploadOptionsConfig.maxFileSize : 10000000;
273
+ const maxFiles = ((_b = this.fileUploadOptionsConfig) === null || _b === void 0 ? void 0 : _b.maxFiles) ? this.fileUploadOptionsConfig.maxFiles : 20;
274
+ this.koa.use(graphqlUploadKoa({
275
+ maxFileSize,
276
+ maxFiles
277
+ }));
278
+ this.koa.use(cors());
279
+ this.koa.use(bodyParser());
280
+ const apolloGraphQLRouter = new Router();
281
+ apolloGraphQLRouter.all('/graphql', koaMiddleware(gqlServer, {
282
+ context: ({ ctx }) => __awaiter(this, void 0, void 0, function* () { return ctx; }),
283
+ }));
284
+ this.koa.use(apolloGraphQLRouter.routes());
285
+ });
286
+ }
287
+ }
288
+ export const createFacade = (config) => {
289
+ const koa = new Koa();
290
+ if (config.env) {
291
+ koa.env = config.env;
292
+ }
293
+ if (config.keys) {
294
+ koa.keys = config.keys;
295
+ }
296
+ let loggerCfg;
297
+ if (config.logger) {
298
+ loggerCfg = config.logger;
299
+ loggerCfg.esTransformer = (msg) => {
300
+ msg.fields = JSON.stringify(msg.fields);
301
+ return msg;
302
+ };
303
+ }
304
+ const logger = loggerCfg !== null && loggerCfg !== void 0 ? loggerCfg : createLogger(loggerCfg);
305
+ koa.context.logger = logger;
306
+ return new RestoreCommerceFacade({
307
+ koa,
308
+ logger,
309
+ port: config.port,
310
+ hostname: config.hostname,
311
+ env: config.env,
312
+ kafka: config.kafka,
313
+ fileUploadOptions: config.fileUploadOptions,
314
+ }).useModule(facadeStatusModule);
315
+ };
@@ -0,0 +1,54 @@
1
+ /// <reference types="koa-websocket" />
2
+ /// <reference types="node" resolution-mode="require"/>
3
+ /// <reference types="node" resolution-mode="require"/>
4
+ import type Koa from 'koa';
5
+ import { type Logger } from 'winston';
6
+ import { type Server } from 'node:http';
7
+ import { type AddressInfo } from 'node:net';
8
+ type RequireAtLeastOne<T, Keys extends keyof T> = Pick<T, Exclude<keyof T, Keys>> & {
9
+ [K in Keys]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>>;
10
+ }[Keys];
11
+ export interface FacadeBaseContext extends Koa.Context {
12
+ logger: Logger;
13
+ facade: Facade;
14
+ }
15
+ export interface FacadeModuleBase<TContext extends FacadeBaseContext = FacadeBaseContext> {
16
+ moduleName: string;
17
+ }
18
+ export interface FacadeModule<TContext extends FacadeBaseContext = FacadeBaseContext> extends FacadeModuleBase<TContext> {
19
+ (facade: Facade<[FacadeModule<TContext>]>): void;
20
+ }
21
+ export interface FacadeModuleFactory<TConfig = any, TContext extends FacadeBaseContext = FacadeBaseContext> extends FacadeModuleBase<TContext> {
22
+ (config: TConfig): FacadeModule<TContext>;
23
+ }
24
+ export type ExtractModuleContext<TModule> = TModule extends FacadeModuleFactory<infer TConfig, infer TContext> ? TContext : TModule extends FacadeModule<infer TContext> ? TContext : never;
25
+ export type FacadeModulesContext<T extends FacadeModuleBase[]> = (T[0] extends FacadeModuleBase ? ExtractModuleContext<T[0]> : FacadeBaseContext) & (T[1] extends FacadeModuleBase ? ExtractModuleContext<T[1]> : FacadeBaseContext) & (T[2] extends FacadeModuleBase ? ExtractModuleContext<T[2]> : FacadeBaseContext) & (T[3] extends FacadeModuleBase ? ExtractModuleContext<T[3]> : FacadeBaseContext) & (T[4] extends FacadeModuleBase ? ExtractModuleContext<T[4]> : FacadeBaseContext) & (T[5] extends FacadeModuleBase ? ExtractModuleContext<T[5]> : FacadeBaseContext) & (T[6] extends FacadeModuleBase ? ExtractModuleContext<T[6]> : FacadeBaseContext) & (T[7] extends FacadeModuleBase ? ExtractModuleContext<T[7]> : FacadeBaseContext) & (T[8] extends FacadeModuleBase ? ExtractModuleContext<T[8]> : FacadeBaseContext) & (T[9] extends FacadeModuleBase ? ExtractModuleContext<T[9]> : FacadeBaseContext);
26
+ export type FacadeContext<T extends FacadeModuleBase[] | Facade<any> = []> = T extends FacadeModuleBase[] ? FacadeModulesContext<T> : T extends Facade<infer TFacadeModules> ? FacadeModulesContext<TFacadeModules> : FacadeBaseContext;
27
+ export interface Facade<TModules extends FacadeModuleBase[] = []> {
28
+ readonly logger: Logger;
29
+ readonly koa: Koa<any, FacadeModulesContext<TModules>>;
30
+ readonly server?: Server;
31
+ readonly address?: string | AddressInfo;
32
+ readonly listening: boolean;
33
+ readonly env: string;
34
+ start(): Promise<void>;
35
+ onStart(fn: () => Promise<void>): void;
36
+ onStop(fn: () => Promise<void>): void;
37
+ stop(): Promise<void>;
38
+ addApolloService({ name, schema, url }: RequireAtLeastOne<{
39
+ name: string;
40
+ url: string;
41
+ schema: any;
42
+ }, 'url' | 'schema'>): void;
43
+ useMiddleware<TNewState extends object = {}, TNewContext extends object = {}>(middleware: Koa.Middleware<TNewState, TNewContext & FacadeModulesContext<TModules>>): Facade<TModules>;
44
+ useModule<TNewModule extends FacadeModule>(mod: TNewModule): Facade<[...TModules, TNewModule]>;
45
+ supportsModule<TSupportedModule extends FacadeModuleBase>(mod: TSupportedModule): this is Facade<[TSupportedModule, ...TModules]> & Facade<[...TModules]>;
46
+ }
47
+ export interface FileUploadOptionsConfig {
48
+ fileUploadOptions: FileUploadOptions;
49
+ }
50
+ interface FileUploadOptions {
51
+ maxFileSize: number;
52
+ maxFiles: number;
53
+ }
54
+ export {};
@@ -0,0 +1,6 @@
1
+ ;
2
+ ;
3
+ ;
4
+ ;
5
+ ;
6
+ export {};
@@ -0,0 +1 @@
1
+ export * from './req-res-logger/index.js';
@@ -0,0 +1 @@
1
+ export * from './req-res-logger/index.js';
@@ -0,0 +1,14 @@
1
+ import type * as koa from 'koa';
2
+ import { type Logger } from 'winston';
3
+ export interface ReqResLoggerOptions {
4
+ logger?: Logger;
5
+ logGraphQL?: boolean;
6
+ logGraphQLVariables?: boolean;
7
+ logResBody?: boolean;
8
+ }
9
+ /**
10
+ Middleware that logs incoming request and outgoing response
11
+ @param {Object} [options] - middleware options
12
+ @returns {Middleware}
13
+ */
14
+ export declare const reqResLogger: (opts: ReqResLoggerOptions) => koa.Middleware<koa.DefaultState, koa.DefaultContext, any>;
@@ -0,0 +1,90 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import _debug from 'debug';
11
+ import { createLogger } from '@restorecommerce/logger';
12
+ const debug = _debug('@restorecommerce/koa-req-res-logger');
13
+ const getGraphQLData = (opts, body) => {
14
+ if (typeof body !== 'object' || !body) {
15
+ return;
16
+ }
17
+ const line = {};
18
+ if ('operationName' in body) {
19
+ Object.assign(line, { operationName: body.operationName });
20
+ }
21
+ if ('query' in body) {
22
+ Object.assign(line, { query: body.query });
23
+ }
24
+ if (opts.logGraphQLVariables === true && 'variables' in body) {
25
+ Object.assign(line, { variables: body.variables });
26
+ }
27
+ return line;
28
+ };
29
+ /**
30
+ Middleware that logs incoming request and outgoing response
31
+ @param {Object} [options] - middleware options
32
+ @returns {Middleware}
33
+ */
34
+ export const reqResLogger = (opts) => {
35
+ let loggerCfg;
36
+ if (opts.logger) {
37
+ loggerCfg = opts.logger;
38
+ loggerCfg.esTransformer = (msg) => {
39
+ msg.fields = JSON.stringify(msg.fields);
40
+ return msg;
41
+ };
42
+ }
43
+ const logger = loggerCfg !== null && loggerCfg !== void 0 ? loggerCfg : createLogger(loggerCfg);
44
+ const fn = (ctx, next) => __awaiter(void 0, void 0, void 0, function* () {
45
+ const request = ctx.request;
46
+ debug('yield middleware: %s', reqResLogger.name);
47
+ const start = Date.now();
48
+ const reqLog = {
49
+ method: ctx.request.method,
50
+ url: ctx.request.url,
51
+ header: ctx.request.header
52
+ };
53
+ if (opts.logGraphQL === true && request.body) {
54
+ const graphQLData = getGraphQLData(opts, request.body);
55
+ if (graphQLData && Object.keys(graphQLData).length > 0) {
56
+ Object.assign(reqLog, {
57
+ graphql: graphQLData
58
+ });
59
+ }
60
+ }
61
+ // Log incoming request during downstream processing
62
+ logger.verbose('Request', reqLog);
63
+ // Call next middleware in stack
64
+ yield next();
65
+ const delta = Math.ceil(Date.now() - start);
66
+ // Log outgoing response during upstream
67
+ // Generally only response successful request
68
+ // Error will be handled in the Koa.js error handler
69
+ // The response body and procTime are not logged
70
+ const resLog = {
71
+ procTime: delta,
72
+ status: ctx.response.status,
73
+ header: ctx.response.header
74
+ };
75
+ if (opts.logGraphQL === true && !('graphql' in reqLog) && request.body) {
76
+ const graphQLData = getGraphQLData(opts, request.body);
77
+ if (graphQLData && Object.keys(graphQLData).length > 0) {
78
+ Object.assign(resLog, {
79
+ graphql: graphQLData
80
+ });
81
+ }
82
+ }
83
+ if (opts.logResBody === true) {
84
+ Object.assign(resLog, { body: ctx.body });
85
+ }
86
+ // `procTime` is in millisecond
87
+ logger.verbose('Response', resLog);
88
+ });
89
+ return fn;
90
+ };
@@ -0,0 +1,2 @@
1
+ import { type AccessControlServiceConfig } from '../interfaces.js';
2
+ export declare const FederatedAccessControlSchema: (cfg: AccessControlServiceConfig) => import("graphql").GraphQLSchema;
@@ -0,0 +1,13 @@
1
+ import { gql } from 'graphql-tag';
2
+ import { buildSubgraphSchema } from '@apollo/federation';
3
+ import { schema } from './schema.js';
4
+ import { namespace } from '../interfaces.js';
5
+ import { generateSubServiceResolvers } from '../../../gql/protos/index.js';
6
+ import { subServices } from './types.js';
7
+ import { printSchema } from 'graphql';
8
+ // TODO There is currently no way of building a federated schema from GraphQLSchema Object
9
+ // See https://github.com/apollographql/apollo-server/pull/4310
10
+ export const FederatedAccessControlSchema = (cfg) => buildSubgraphSchema({
11
+ typeDefs: gql(printSchema(schema(cfg))),
12
+ resolvers: generateSubServiceResolvers(subServices, cfg, namespace)
13
+ });
@@ -0,0 +1,2 @@
1
+ import { type AccessControlServiceConfig } from '../interfaces.js';
2
+ export declare const schema: (cfg: AccessControlServiceConfig) => import("graphql").GraphQLSchema;