quidproquo-dev-server 0.0.228

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 (86) hide show
  1. package/README.md +3 -0
  2. package/lib/commonjs/allServiceConfig.d.ts +3 -0
  3. package/lib/commonjs/allServiceConfig.js +44 -0
  4. package/lib/commonjs/dynamicModuleLoader/dynamicModuleLoader.d.ts +3 -0
  5. package/lib/commonjs/dynamicModuleLoader/dynamicModuleLoader.js +17 -0
  6. package/lib/commonjs/dynamicModuleLoader/index.d.ts +1 -0
  7. package/lib/commonjs/dynamicModuleLoader/index.js +17 -0
  8. package/lib/commonjs/entry/index.d.ts +1 -0
  9. package/lib/commonjs/entry/index.js +17 -0
  10. package/lib/commonjs/entry/route.d.ts +3 -0
  11. package/lib/commonjs/entry/route.js +64 -0
  12. package/lib/commonjs/getActionProcessor/core/event/express/api/getEventAutoRespondActionProcessor.d.ts +2 -0
  13. package/lib/commonjs/getActionProcessor/core/event/express/api/getEventAutoRespondActionProcessor.js +31 -0
  14. package/lib/commonjs/getActionProcessor/core/event/express/api/getEventGetRecordsActionProcessor.d.ts +2 -0
  15. package/lib/commonjs/getActionProcessor/core/event/express/api/getEventGetRecordsActionProcessor.js +34 -0
  16. package/lib/commonjs/getActionProcessor/core/event/express/api/getEventGetStorySessionActionProcessor.d.ts +2 -0
  17. package/lib/commonjs/getActionProcessor/core/event/express/api/getEventGetStorySessionActionProcessor.js +22 -0
  18. package/lib/commonjs/getActionProcessor/core/event/express/api/getEventMatchStoryActionProcessor.d.ts +2 -0
  19. package/lib/commonjs/getActionProcessor/core/event/express/api/getEventMatchStoryActionProcessor.js +55 -0
  20. package/lib/commonjs/getActionProcessor/core/event/express/api/getEventTransformResponseResultActionProcessor.d.ts +2 -0
  21. package/lib/commonjs/getActionProcessor/core/event/express/api/getEventTransformResponseResultActionProcessor.js +60 -0
  22. package/lib/commonjs/getActionProcessor/core/event/express/api/index.d.ts +2 -0
  23. package/lib/commonjs/getActionProcessor/core/event/express/api/index.js +21 -0
  24. package/lib/commonjs/getActionProcessor/core/event/express/api/types.d.ts +8 -0
  25. package/lib/commonjs/getActionProcessor/core/event/express/api/types.js +2 -0
  26. package/lib/commonjs/getActionProcessor/core/event/express/index.d.ts +1 -0
  27. package/lib/commonjs/getActionProcessor/core/event/express/index.js +17 -0
  28. package/lib/commonjs/getActionProcessor/core/event/index.d.ts +1 -0
  29. package/lib/commonjs/getActionProcessor/core/event/index.js +17 -0
  30. package/lib/commonjs/getActionProcessor/core/index.d.ts +1 -0
  31. package/lib/commonjs/getActionProcessor/core/index.js +17 -0
  32. package/lib/commonjs/getActionProcessor/index.d.ts +1 -0
  33. package/lib/commonjs/getActionProcessor/index.js +17 -0
  34. package/lib/commonjs/index.d.ts +1 -0
  35. package/lib/commonjs/index.js +17 -0
  36. package/lib/commonjs/main.d.ts +2 -0
  37. package/lib/commonjs/main.js +143 -0
  38. package/lib/commonjs/types/DevServerConfig.d.ts +4 -0
  39. package/lib/commonjs/types/DevServerConfig.js +2 -0
  40. package/lib/commonjs/types/ExpressEvent.d.ts +26 -0
  41. package/lib/commonjs/types/ExpressEvent.js +2 -0
  42. package/lib/commonjs/types/index.d.ts +2 -0
  43. package/lib/commonjs/types/index.js +18 -0
  44. package/lib/esm/allServiceConfig.d.ts +3 -0
  45. package/lib/esm/allServiceConfig.js +40 -0
  46. package/lib/esm/dynamicModuleLoader/dynamicModuleLoader.d.ts +3 -0
  47. package/lib/esm/dynamicModuleLoader/dynamicModuleLoader.js +6 -0
  48. package/lib/esm/dynamicModuleLoader/index.d.ts +1 -0
  49. package/lib/esm/dynamicModuleLoader/index.js +1 -0
  50. package/lib/esm/entry/index.d.ts +1 -0
  51. package/lib/esm/entry/index.js +1 -0
  52. package/lib/esm/entry/route.d.ts +3 -0
  53. package/lib/esm/entry/route.js +52 -0
  54. package/lib/esm/getActionProcessor/core/event/express/api/getEventAutoRespondActionProcessor.d.ts +2 -0
  55. package/lib/esm/getActionProcessor/core/event/express/api/getEventAutoRespondActionProcessor.js +16 -0
  56. package/lib/esm/getActionProcessor/core/event/express/api/getEventGetRecordsActionProcessor.d.ts +2 -0
  57. package/lib/esm/getActionProcessor/core/event/express/api/getEventGetRecordsActionProcessor.js +19 -0
  58. package/lib/esm/getActionProcessor/core/event/express/api/getEventGetStorySessionActionProcessor.d.ts +2 -0
  59. package/lib/esm/getActionProcessor/core/event/express/api/getEventGetStorySessionActionProcessor.js +7 -0
  60. package/lib/esm/getActionProcessor/core/event/express/api/getEventMatchStoryActionProcessor.d.ts +2 -0
  61. package/lib/esm/getActionProcessor/core/event/express/api/getEventMatchStoryActionProcessor.js +40 -0
  62. package/lib/esm/getActionProcessor/core/event/express/api/getEventTransformResponseResultActionProcessor.d.ts +2 -0
  63. package/lib/esm/getActionProcessor/core/event/express/api/getEventTransformResponseResultActionProcessor.js +48 -0
  64. package/lib/esm/getActionProcessor/core/event/express/api/index.d.ts +2 -0
  65. package/lib/esm/getActionProcessor/core/event/express/api/index.js +12 -0
  66. package/lib/esm/getActionProcessor/core/event/express/api/types.d.ts +8 -0
  67. package/lib/esm/getActionProcessor/core/event/express/api/types.js +1 -0
  68. package/lib/esm/getActionProcessor/core/event/express/index.d.ts +1 -0
  69. package/lib/esm/getActionProcessor/core/event/express/index.js +1 -0
  70. package/lib/esm/getActionProcessor/core/event/index.d.ts +1 -0
  71. package/lib/esm/getActionProcessor/core/event/index.js +1 -0
  72. package/lib/esm/getActionProcessor/core/index.d.ts +1 -0
  73. package/lib/esm/getActionProcessor/core/index.js +1 -0
  74. package/lib/esm/getActionProcessor/index.d.ts +1 -0
  75. package/lib/esm/getActionProcessor/index.js +1 -0
  76. package/lib/esm/index.d.ts +1 -0
  77. package/lib/esm/index.js +1 -0
  78. package/lib/esm/main.d.ts +2 -0
  79. package/lib/esm/main.js +127 -0
  80. package/lib/esm/types/DevServerConfig.d.ts +4 -0
  81. package/lib/esm/types/DevServerConfig.js +1 -0
  82. package/lib/esm/types/ExpressEvent.d.ts +26 -0
  83. package/lib/esm/types/ExpressEvent.js +1 -0
  84. package/lib/esm/types/index.d.ts +2 -0
  85. package/lib/esm/types/index.js +2 -0
  86. package/package.json +41 -0
@@ -0,0 +1,127 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable no-console */
3
+ import bodyParser from 'body-parser';
4
+ import express from 'express';
5
+ import multer from 'multer';
6
+ import path from 'path';
7
+ import { askProcessEvent, qpqCoreUtils, qpqExecuteLog, QpqRuntimeType, qpqWebServerUtils, } from 'quidproquo';
8
+ import { route } from './entry/route';
9
+ import { getAllServiceConfigs } from './allServiceConfig';
10
+ import { dynamicModuleLoader } from './dynamicModuleLoader';
11
+ const getServiceBaseDomain = (qpqConfig, devServerConfig) => qpqWebServerUtils.getDomainRoot(`${devServerConfig.serverDomain}:${devServerConfig.serverPort}`, qpqCoreUtils.getApplicationModuleEnvironment(qpqConfig), qpqCoreUtils.getApplicationModuleFeature(qpqConfig));
12
+ const getApiDomainsFromConfig = (qpqConfig, devServerConfig) => {
13
+ const baseDomain = getServiceBaseDomain(qpqConfig, devServerConfig);
14
+ const serviceName = qpqCoreUtils.getApplicationModuleName(qpqConfig);
15
+ // Get apis
16
+ const apiConfigs = qpqWebServerUtils.getApiConfigs(qpqConfig);
17
+ const apiDomains = apiConfigs.map((apiConfig) => ({
18
+ apiName: apiConfig.apiName,
19
+ service: serviceName,
20
+ qpqConfig,
21
+ domain: `${apiConfig.apiSubdomain}.${baseDomain}`,
22
+ devDomain: baseDomain,
23
+ devPath: `/${apiConfig.apiSubdomain}/${serviceName}`,
24
+ }));
25
+ return apiDomains;
26
+ };
27
+ const getDynamicModuleLoader = (qpqConfig) => {
28
+ const serviceName = qpqCoreUtils.getApplicationModuleName(qpqConfig);
29
+ return async (runtime) => dynamicModuleLoader(serviceName, runtime);
30
+ };
31
+ export const spinUpService = async (devServerConfig) => {
32
+ const allServiceConfig = await getAllServiceConfigs(devServerConfig);
33
+ const app = express();
34
+ app.use(multer().any());
35
+ app.use(bodyParser.json({ limit: '50mb' }));
36
+ const apiConfigs = allServiceConfig.map((qpqConfig) => getApiDomainsFromConfig(qpqConfig, devServerConfig)).flat();
37
+ const adminFrontend = path.join(__dirname, '../../..', 'node_modules', 'quidproquo-web-admin', 'lib');
38
+ // Admin page
39
+ app.use('/admin', express.static(adminFrontend));
40
+ app.get('/admin/service/log/list', (req, res) => {
41
+ // Manually set CORS headers
42
+ res.header('Access-Control-Allow-Headers', '*');
43
+ res.header('Access-Control-Allow-Methods', '*');
44
+ res.header('Access-Control-Allow-Origin', '*');
45
+ res.header('Access-Control-Allow-Credentials', 'false');
46
+ const serviceList = allServiceConfig.map((qpqConfig) => qpqCoreUtils.getApplicationModuleName(qpqConfig)).map((name) => `api/${name}`);
47
+ res.json(serviceList);
48
+ });
49
+ app.use(express.json());
50
+ app.options('/admin/service/log/execute', async (req, res) => {
51
+ // Manually set CORS headers
52
+ res.header('Access-Control-Allow-Headers', '*');
53
+ res.header('Access-Control-Allow-Methods', '*');
54
+ res.header('Access-Control-Allow-Origin', '*');
55
+ res.header('Access-Control-Allow-Credentials', 'false');
56
+ res.json({ done: true });
57
+ });
58
+ app.get('/mf-manifest-location.json', async (req, res) => {
59
+ // Manually set CORS headers
60
+ res.header('Access-Control-Allow-Headers', '*');
61
+ res.header('Access-Control-Allow-Methods', '*');
62
+ res.header('Access-Control-Allow-Origin', '*');
63
+ res.header('Access-Control-Allow-Credentials', 'false');
64
+ res.json({ location: 'http://localhost:3005/mf-manifest.json' });
65
+ });
66
+ app.post('/admin/service/log/execute', async (req, res) => {
67
+ // Manually set CORS headers
68
+ res.header('Access-Control-Allow-Headers', '*');
69
+ res.header('Access-Control-Allow-Methods', '*');
70
+ res.header('Access-Control-Allow-Origin', '*');
71
+ res.header('Access-Control-Allow-Credentials', 'false');
72
+ // TODO: Get list of services from config dynamically
73
+ const serviceLog = req.body;
74
+ let runtimeModule = askProcessEvent;
75
+ if (serviceLog.runtimeType === QpqRuntimeType.EXECUTE_STORY) {
76
+ const [srcEntry, module] = serviceLog.tags[0].split('::');
77
+ const loadedModule = await dynamicModuleLoader(serviceLog.moduleName, srcEntry);
78
+ runtimeModule = loadedModule[module];
79
+ }
80
+ const result = await qpqExecuteLog(serviceLog, runtimeModule);
81
+ res.json(result);
82
+ });
83
+ // Proxy for all services
84
+ app.all('*', async (req, res) => {
85
+ const apiConfig = apiConfigs.find((c) => req.url.startsWith(`${c.devPath}/`));
86
+ if (apiConfig) {
87
+ console.log(`[${req.method}::${req.socket.remoteAddress}]: ${req.protocol}://${req.get('host')}${req.url}`);
88
+ const event = {
89
+ protocol: req.protocol,
90
+ host: req.get('host') || devServerConfig.serverDomain,
91
+ path: req.url.substring(apiConfig.devPath.length).split('?')[0],
92
+ ip: req.socket.remoteAddress || '127.0.0.1',
93
+ query: req.query,
94
+ correlation: '',
95
+ headers: req.headers,
96
+ method: req.method,
97
+ isBase64Encoded: false,
98
+ body: typeof req.body === 'object' ? JSON.stringify(req.body) : req.body,
99
+ };
100
+ if (req.files) {
101
+ event.files = req.files.map((file) => ({
102
+ base64Data: file.buffer.toString('base64'),
103
+ filename: file.originalname,
104
+ mimetype: file.mimetype,
105
+ }));
106
+ }
107
+ const response = await route(event, apiConfig.qpqConfig, getDynamicModuleLoader(apiConfig.qpqConfig));
108
+ for (const [header, value] of Object.entries(response.headers)) {
109
+ res.set(header, value);
110
+ }
111
+ if (response.isBase64Encoded) {
112
+ res.status(response.statusCode).send(Buffer.from(response.body, 'base64'));
113
+ }
114
+ else {
115
+ res.status(response.statusCode).send(response.body);
116
+ }
117
+ }
118
+ else {
119
+ console.log(`NotFound::[${req.method}::${req.socket.remoteAddress}]: ${req.protocol}://${req.get('host')}${req.url}`);
120
+ res.status(500).send({ message: 'resource does not exist' });
121
+ }
122
+ });
123
+ app.listen(devServerConfig.serverPort, '0.0.0.0', () => {
124
+ const baseDomain = getServiceBaseDomain(allServiceConfig[0], devServerConfig);
125
+ console.log(`⚡️⚡️⚡️[Qpq - Dev Server]⚡️⚡️⚡️: Server is running at [http://${baseDomain}]`);
126
+ });
127
+ };
@@ -0,0 +1,4 @@
1
+ export type DevServerConfig = {
2
+ serverDomain: 'localhost';
3
+ serverPort: 8080;
4
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ import { QPQBinaryData } from 'quidproquo';
2
+ export interface ExpressEvent {
3
+ protocol: string;
4
+ host: string;
5
+ path: string;
6
+ ip: string;
7
+ method: string;
8
+ query: {
9
+ [key: string]: undefined | string | string[];
10
+ };
11
+ correlation: string;
12
+ isBase64Encoded: boolean;
13
+ body: any;
14
+ headers: {
15
+ [key: string]: undefined | string;
16
+ };
17
+ files?: QPQBinaryData[];
18
+ }
19
+ export interface ExpressEventResponse {
20
+ statusCode: number;
21
+ body: string;
22
+ headers: {
23
+ [key: string]: undefined | string;
24
+ };
25
+ isBase64Encoded: boolean;
26
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from './DevServerConfig';
2
+ export * from './ExpressEvent';
@@ -0,0 +1,2 @@
1
+ export * from './DevServerConfig';
2
+ export * from './ExpressEvent';
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "quidproquo-dev-server",
3
+ "version": "0.0.228",
4
+ "description": "",
5
+ "main": "./lib/commonjs/index.js",
6
+ "module": "./lib/esm/index.js",
7
+ "types": "./lib/commonjs/index.d.ts",
8
+ "sideEffects": false,
9
+ "files": [
10
+ "lib/**/*"
11
+ ],
12
+ "scripts": {
13
+ "test": "echo \"Error: no test specified\" && exit 1",
14
+ "clean": "npx rimraf lib && npx rimraf node_modules",
15
+ "build": "npm run clean && npm run build:esm && npm run build:cjs",
16
+ "watch": "tsc -p tsconfig.commonjs.json -w",
17
+ "build:cjs": "tsc -p tsconfig.commonjs.json",
18
+ "build:esm": "tsc -p tsconfig.esm.json"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/joe-coady/quidproquo.git"
23
+ },
24
+ "keywords": [],
25
+ "author": "",
26
+ "license": "MIT",
27
+ "bugs": {
28
+ "url": "https://github.com/joe-coady/quidproquo/issues"
29
+ },
30
+ "homepage": "https://github.com/joe-coady/quidproquo#readme",
31
+ "dependencies": {
32
+ "multer": "^1.4.5-lts.1",
33
+ "quidproquo-core": "0.0.228",
34
+ "quidproquo-webserver": "0.0.228"
35
+ },
36
+ "devDependencies": {
37
+ "@types/multer": "^1.4.12",
38
+ "quidproquo-tsconfig": "0.0.228",
39
+ "typescript": "^4.9.3"
40
+ }
41
+ }