@opra/core 0.25.4 → 0.26.0
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.
- package/cjs/http/adapters/express-adapter.host.js +34 -0
- package/cjs/{adapter/http → http/adapters}/express-adapter.js +1 -3
- package/cjs/{adapter/http/http-adapter.host.js → http/adapters/node-http-adapter.host.js} +30 -22
- package/cjs/http/adapters/node-http-adapter.js +14 -0
- package/cjs/http/helpers/json-body-loader.js +29 -0
- package/cjs/http/http-adapter-host.js +678 -0
- package/cjs/index.js +17 -16
- package/cjs/{adapter/platform-adapter.host.js → platform-adapter.host.js} +74 -45
- package/cjs/{adapter/endpoint-context.js → request-context.js} +5 -5
- package/cjs/{adapter/request.host.js → request.host.js} +3 -0
- package/cjs/response.js +2 -0
- package/esm/http/adapters/express-adapter.host.js +30 -0
- package/esm/{adapter/http → http/adapters}/express-adapter.js +1 -3
- package/esm/{adapter/http/http-adapter.host.js → http/adapters/node-http-adapter.host.js} +28 -20
- package/esm/http/adapters/node-http-adapter.js +11 -0
- package/esm/http/helpers/json-body-loader.js +24 -0
- package/esm/http/http-adapter-host.js +673 -0
- package/esm/index.js +17 -16
- package/esm/platform-adapter.host.js +132 -0
- package/esm/{adapter/endpoint-context.js → request-context.js} +4 -4
- package/esm/{adapter/request.host.js → request.host.js} +3 -0
- package/esm/response.js +1 -0
- package/i18n/en/error.json +1 -2
- package/package.json +3 -3
- package/types/augmentation/collection.augmentation.d.ts +26 -17
- package/types/augmentation/container.augmentation.d.ts +13 -0
- package/types/augmentation/resource.augmentation.d.ts +2 -2
- package/types/augmentation/singleton.augmentation.d.ts +14 -10
- package/types/augmentation/storage.augmentation.d.ts +16 -16
- package/types/{adapter/execution-context.d.ts → execution-context.d.ts} +3 -3
- package/types/{adapter/execution-context.host.d.ts → execution-context.host.d.ts} +1 -1
- package/types/{adapter/http → http/adapters}/express-adapter.d.ts +3 -3
- package/types/http/adapters/express-adapter.host.d.ts +12 -0
- package/types/{adapter/http/http-adapter.d.ts → http/adapters/node-http-adapter.d.ts} +5 -5
- package/types/http/adapters/node-http-adapter.host.d.ts +19 -0
- package/types/http/helpers/json-body-loader.d.ts +5 -0
- package/types/http/http-adapter-host.d.ts +34 -0
- package/types/{adapter/http → http}/impl/http-outgoing-message.host.d.ts +1 -1
- package/types/index.d.ts +17 -16
- package/types/{adapter/interfaces → interfaces}/request-handler.interface.d.ts +1 -1
- package/types/{adapter/platform-adapter.d.ts → platform-adapter.d.ts} +2 -2
- package/types/platform-adapter.host.d.ts +37 -0
- package/types/request-context.d.ts +10 -0
- package/types/{adapter/request.d.ts → request.d.ts} +8 -3
- package/types/{adapter/request.host.d.ts → request.host.d.ts} +7 -4
- package/types/{adapter/response.d.ts → response.d.ts} +1 -1
- package/types/{adapter/response.host.d.ts → response.host.d.ts} +2 -2
- package/cjs/adapter/http/express-adapter.host.js +0 -24
- package/cjs/adapter/http/http-adapter-base.js +0 -138
- package/cjs/adapter/http/http-adapter.js +0 -16
- package/cjs/adapter/http/request-handlers/entity-request-handler.js +0 -418
- package/cjs/adapter/http/request-handlers/parse-batch-request.js +0 -169
- package/cjs/adapter/http/request-handlers/request-handler-base.js +0 -27
- package/cjs/adapter/http/request-handlers/storage-request-handler.js +0 -133
- package/esm/adapter/http/express-adapter.host.js +0 -20
- package/esm/adapter/http/http-adapter-base.js +0 -134
- package/esm/adapter/http/http-adapter.js +0 -13
- package/esm/adapter/http/request-handlers/entity-request-handler.js +0 -413
- package/esm/adapter/http/request-handlers/parse-batch-request.js +0 -169
- package/esm/adapter/http/request-handlers/request-handler-base.js +0 -23
- package/esm/adapter/http/request-handlers/storage-request-handler.js +0 -128
- package/esm/adapter/platform-adapter.host.js +0 -103
- package/types/adapter/endpoint-context.d.ts +0 -10
- package/types/adapter/http/express-adapter.host.d.ts +0 -11
- package/types/adapter/http/http-adapter-base.d.ts +0 -23
- package/types/adapter/http/http-adapter.host.d.ts +0 -18
- package/types/adapter/http/request-handlers/entity-request-handler.d.ts +0 -24
- package/types/adapter/http/request-handlers/parse-batch-request.d.ts +0 -0
- package/types/adapter/http/request-handlers/request-handler-base.d.ts +0 -15
- package/types/adapter/http/request-handlers/storage-request-handler.d.ts +0 -23
- package/types/adapter/platform-adapter.host.d.ts +0 -33
- /package/cjs/{adapter/execution-context.js → augmentation/container.augmentation.js} +0 -0
- /package/cjs/{adapter/execution-context.host.js → execution-context.host.js} +0 -0
- /package/cjs/{adapter/interfaces/interceptor.interface.js → execution-context.js} +0 -0
- /package/cjs/{adapter/http → http}/helpers/common.js +0 -0
- /package/cjs/{adapter/http → http}/helpers/concat-readable.js +0 -0
- /package/cjs/{adapter/http → http}/helpers/convert-to-headers.js +0 -0
- /package/cjs/{adapter/http → http}/helpers/convert-to-raw-headers.js +0 -0
- /package/cjs/{adapter/http → http}/helpers/match-known-fields.js +0 -0
- /package/cjs/{adapter/http → http}/helpers/multipart-helper.js +0 -0
- /package/cjs/{adapter/http → http}/helpers/query-parsers.js +0 -0
- /package/cjs/{adapter/http → http}/http-server-request.js +0 -0
- /package/cjs/{adapter/http → http}/http-server-response.js +0 -0
- /package/cjs/{adapter/http → http}/impl/http-incoming-message.host.js +0 -0
- /package/cjs/{adapter/http → http}/impl/http-outgoing-message.host.js +0 -0
- /package/cjs/{adapter/interfaces/logger.interface.js → interfaces/interceptor.interface.js} +0 -0
- /package/cjs/{adapter/interfaces/request-handler.interface.js → interfaces/logger.interface.js} +0 -0
- /package/cjs/{adapter/platform-adapter.js → interfaces/request-handler.interface.js} +0 -0
- /package/cjs/{adapter/request.js → platform-adapter.js} +0 -0
- /package/cjs/{adapter/response.js → request.js} +0 -0
- /package/cjs/{adapter/response.host.js → response.host.js} +0 -0
- /package/cjs/{adapter/services → services}/logger.js +0 -0
- /package/esm/{adapter/execution-context.js → augmentation/container.augmentation.js} +0 -0
- /package/esm/{adapter/execution-context.host.js → execution-context.host.js} +0 -0
- /package/esm/{adapter/interfaces/interceptor.interface.js → execution-context.js} +0 -0
- /package/esm/{adapter/http → http}/helpers/common.js +0 -0
- /package/esm/{adapter/http → http}/helpers/concat-readable.js +0 -0
- /package/esm/{adapter/http → http}/helpers/convert-to-headers.js +0 -0
- /package/esm/{adapter/http → http}/helpers/convert-to-raw-headers.js +0 -0
- /package/esm/{adapter/http → http}/helpers/match-known-fields.js +0 -0
- /package/esm/{adapter/http → http}/helpers/multipart-helper.js +0 -0
- /package/esm/{adapter/http → http}/helpers/query-parsers.js +0 -0
- /package/esm/{adapter/http → http}/http-server-request.js +0 -0
- /package/esm/{adapter/http → http}/http-server-response.js +0 -0
- /package/esm/{adapter/http → http}/impl/http-incoming-message.host.js +0 -0
- /package/esm/{adapter/http → http}/impl/http-outgoing-message.host.js +0 -0
- /package/esm/{adapter/interfaces/logger.interface.js → interfaces/interceptor.interface.js} +0 -0
- /package/esm/{adapter/interfaces/request-handler.interface.js → interfaces/logger.interface.js} +0 -0
- /package/esm/{adapter/platform-adapter.js → interfaces/request-handler.interface.js} +0 -0
- /package/esm/{adapter/request.js → platform-adapter.js} +0 -0
- /package/esm/{adapter/response.js → request.js} +0 -0
- /package/esm/{adapter/response.host.js → response.host.js} +0 -0
- /package/esm/{adapter/services → services}/logger.js +0 -0
- /package/types/{adapter/http → http}/helpers/common.d.ts +0 -0
- /package/types/{adapter/http → http}/helpers/concat-readable.d.ts +0 -0
- /package/types/{adapter/http → http}/helpers/convert-to-headers.d.ts +0 -0
- /package/types/{adapter/http → http}/helpers/convert-to-raw-headers.d.ts +0 -0
- /package/types/{adapter/http → http}/helpers/match-known-fields.d.ts +0 -0
- /package/types/{adapter/http → http}/helpers/multipart-helper.d.ts +0 -0
- /package/types/{adapter/http → http}/helpers/query-parsers.d.ts +0 -0
- /package/types/{adapter/http → http}/http-server-request.d.ts +0 -0
- /package/types/{adapter/http → http}/http-server-response.d.ts +0 -0
- /package/types/{adapter/http → http}/impl/http-incoming-message.host.d.ts +0 -0
- /package/types/{adapter/interfaces → interfaces}/interceptor.interface.d.ts +0 -0
- /package/types/{adapter/interfaces → interfaces}/logger.interface.d.ts +0 -0
- /package/types/{adapter/services → services}/logger.d.ts +0 -0
package/cjs/index.js
CHANGED
|
@@ -4,22 +4,23 @@ const tslib_1 = require("tslib");
|
|
|
4
4
|
require("reflect-metadata");
|
|
5
5
|
require("./augmentation/resource.augmentation.js");
|
|
6
6
|
require("./augmentation/collection.augmentation.js");
|
|
7
|
+
require("./augmentation/container.augmentation.js");
|
|
7
8
|
require("./augmentation/singleton.augmentation.js");
|
|
8
9
|
require("./augmentation/storage.augmentation.js");
|
|
9
10
|
tslib_1.__exportStar(require("./types.js"), exports);
|
|
10
|
-
tslib_1.__exportStar(require("./
|
|
11
|
-
tslib_1.__exportStar(require("./
|
|
12
|
-
tslib_1.__exportStar(require("./
|
|
13
|
-
tslib_1.__exportStar(require("./
|
|
14
|
-
tslib_1.__exportStar(require("./
|
|
15
|
-
tslib_1.__exportStar(require("./
|
|
16
|
-
tslib_1.__exportStar(require("./
|
|
17
|
-
tslib_1.__exportStar(require("./
|
|
18
|
-
tslib_1.__exportStar(require("./
|
|
19
|
-
tslib_1.__exportStar(require("./
|
|
20
|
-
tslib_1.__exportStar(require("./
|
|
21
|
-
tslib_1.__exportStar(require("./
|
|
22
|
-
tslib_1.__exportStar(require("./
|
|
23
|
-
tslib_1.__exportStar(require("./
|
|
24
|
-
tslib_1.__exportStar(require("./
|
|
25
|
-
tslib_1.__exportStar(require("./
|
|
11
|
+
tslib_1.__exportStar(require("./execution-context.js"), exports);
|
|
12
|
+
tslib_1.__exportStar(require("./request-context.js"), exports);
|
|
13
|
+
tslib_1.__exportStar(require("./platform-adapter.js"), exports);
|
|
14
|
+
tslib_1.__exportStar(require("./request.js"), exports);
|
|
15
|
+
tslib_1.__exportStar(require("./response.js"), exports);
|
|
16
|
+
tslib_1.__exportStar(require("./http/adapters/express-adapter.js"), exports);
|
|
17
|
+
tslib_1.__exportStar(require("./http/adapters/node-http-adapter.js"), exports);
|
|
18
|
+
tslib_1.__exportStar(require("./http/impl/http-incoming-message.host.js"), exports);
|
|
19
|
+
tslib_1.__exportStar(require("./http/impl/http-outgoing-message.host.js"), exports);
|
|
20
|
+
tslib_1.__exportStar(require("./http/http-server-request.js"), exports);
|
|
21
|
+
tslib_1.__exportStar(require("./http/http-server-response.js"), exports);
|
|
22
|
+
tslib_1.__exportStar(require("./http/helpers/multipart-helper.js"), exports);
|
|
23
|
+
tslib_1.__exportStar(require("./interfaces/interceptor.interface.js"), exports);
|
|
24
|
+
tslib_1.__exportStar(require("./interfaces/logger.interface.js"), exports);
|
|
25
|
+
tslib_1.__exportStar(require("./interfaces/request-handler.interface.js"), exports);
|
|
26
|
+
tslib_1.__exportStar(require("./services/logger.js"), exports);
|
|
@@ -7,32 +7,17 @@ const putil_varhelpers_1 = require("putil-varhelpers");
|
|
|
7
7
|
const strict_typed_events_1 = require("strict-typed-events");
|
|
8
8
|
const common_1 = require("@opra/common");
|
|
9
9
|
const logger_js_1 = require("./services/logger.js");
|
|
10
|
+
const resourceInitialized = Symbol.for('opra.resource.initialized');
|
|
10
11
|
/**
|
|
11
12
|
* @class PlatformAdapterHost
|
|
12
13
|
*/
|
|
13
14
|
class PlatformAdapterHost extends strict_typed_events_1.AsyncEventEmitter {
|
|
14
|
-
constructor(
|
|
15
|
-
super();
|
|
16
|
-
this.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
this.
|
|
20
|
-
this._interceptors = [...(options?.interceptors || [])];
|
|
21
|
-
this._logger = options?.logger && options.logger instanceof logger_js_1.Logger
|
|
22
|
-
? options.logger
|
|
23
|
-
: new logger_js_1.Logger({ instance: options?.logger });
|
|
24
|
-
// Assign events
|
|
25
|
-
if (options?.on) {
|
|
26
|
-
for (const [event, fn] of Object.entries(options.on)) {
|
|
27
|
-
/* istanbul ignore next */
|
|
28
|
-
if (typeof fn === 'function')
|
|
29
|
-
this.on(event, fn);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
// Make a safe service name
|
|
33
|
-
this._serviceName = (0, putil_varhelpers_1.pascalCase)((api.info.title || '').replace(/[^a-z0-9_ ]/ig, '')) || 'OpraService';
|
|
34
|
-
if (!/^[a-z]/i.test(this._serviceName))
|
|
35
|
-
this._serviceName = 'X' + this._serviceName;
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments);
|
|
17
|
+
this._controllers = new Map();
|
|
18
|
+
}
|
|
19
|
+
get api() {
|
|
20
|
+
return this._api;
|
|
36
21
|
}
|
|
37
22
|
get platform() {
|
|
38
23
|
return this._platform;
|
|
@@ -41,56 +26,100 @@ class PlatformAdapterHost extends strict_typed_events_1.AsyncEventEmitter {
|
|
|
41
26
|
return this._protocol;
|
|
42
27
|
}
|
|
43
28
|
get serviceName() {
|
|
44
|
-
return this.
|
|
29
|
+
return this._serviceName;
|
|
30
|
+
}
|
|
31
|
+
get i18n() {
|
|
32
|
+
return this._i18n;
|
|
45
33
|
}
|
|
46
34
|
async close() {
|
|
47
35
|
const promises = [];
|
|
48
|
-
for (const r of this.
|
|
49
|
-
const onShutdown = r
|
|
36
|
+
for (const r of this._controllers.values()) {
|
|
37
|
+
const onShutdown = r?.onShutdown;
|
|
50
38
|
if (onShutdown)
|
|
51
39
|
promises.push((async () => onShutdown.call(r.controller, r))());
|
|
52
40
|
}
|
|
53
41
|
await Promise.allSettled(promises);
|
|
42
|
+
this._controllers.clear();
|
|
54
43
|
}
|
|
55
44
|
/**
|
|
56
45
|
* Initializes the adapter
|
|
57
46
|
*/
|
|
58
|
-
async init() {
|
|
59
|
-
if (this.
|
|
60
|
-
|
|
47
|
+
async init(api, options) {
|
|
48
|
+
if (this._api)
|
|
49
|
+
throw new Error(`Already initialized`);
|
|
50
|
+
this._api = api;
|
|
51
|
+
this._interceptors = [...(options?.interceptors || [])];
|
|
52
|
+
this._logger = options?.logger && options.logger instanceof logger_js_1.Logger
|
|
53
|
+
? options.logger
|
|
54
|
+
: new logger_js_1.Logger({ instance: options?.logger });
|
|
55
|
+
// Assign events
|
|
56
|
+
if (options?.on) {
|
|
57
|
+
for (const [event, fn] of Object.entries(options.on)) {
|
|
58
|
+
/* istanbul ignore next */
|
|
59
|
+
if (typeof fn === 'function')
|
|
60
|
+
this.on(event, fn);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Make a safe service name
|
|
64
|
+
this._serviceName = (0, putil_varhelpers_1.pascalCase)((api.info.title || '').replace(/[^a-z0-9_ ]/ig, '')) || 'OpraService';
|
|
65
|
+
if (!/^[a-z]/i.test(this._serviceName))
|
|
66
|
+
this._serviceName = 'X' + this._serviceName;
|
|
61
67
|
// Init I18n
|
|
62
|
-
if (
|
|
63
|
-
this._i18n =
|
|
64
|
-
else if (typeof
|
|
65
|
-
this._i18n = await
|
|
68
|
+
if (options?.i18n instanceof common_1.I18n)
|
|
69
|
+
this._i18n = options.i18n;
|
|
70
|
+
else if (typeof options?.i18n === 'function')
|
|
71
|
+
this._i18n = await options.i18n();
|
|
66
72
|
else
|
|
67
|
-
this._i18n = await this._createI18n(
|
|
73
|
+
this._i18n = await this._createI18n(options?.i18n);
|
|
68
74
|
this._i18n = this._i18n || common_1.I18n.defaultInstance;
|
|
69
75
|
if (!this._i18n.isInitialized)
|
|
70
76
|
await this._i18n.init();
|
|
71
77
|
// Initialize all resources
|
|
72
|
-
|
|
73
|
-
await this.getController(resource);
|
|
74
|
-
}
|
|
75
|
-
this._initialized = true;
|
|
78
|
+
await this.getController(this.api.root);
|
|
76
79
|
}
|
|
77
80
|
async getController(resource) {
|
|
78
81
|
resource = typeof resource === 'object' && resource instanceof common_1.Resource
|
|
79
82
|
? resource : this.api.getResource(resource);
|
|
80
83
|
let controller = this._controllers.get(resource);
|
|
81
84
|
if (!controller) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
85
|
+
controller = resource.controller;
|
|
86
|
+
if (!controller && resource.ctor) {
|
|
87
|
+
controller = new resource.ctor();
|
|
88
|
+
}
|
|
89
|
+
this._controllers.set(resource, controller);
|
|
90
|
+
}
|
|
91
|
+
if (controller && !controller[resourceInitialized]) {
|
|
92
|
+
controller[resourceInitialized] = true;
|
|
93
|
+
// Initialize controller
|
|
94
|
+
if (typeof controller.onInit === 'function')
|
|
95
|
+
await controller.onInit.call(controller);
|
|
96
|
+
// Initialize sub resources of Container
|
|
97
|
+
if (resource instanceof common_1.Container) {
|
|
98
|
+
for (const r of resource.resources.values()) {
|
|
99
|
+
await this.getController(r);
|
|
100
|
+
}
|
|
90
101
|
}
|
|
91
102
|
}
|
|
92
103
|
return controller;
|
|
93
104
|
}
|
|
105
|
+
async getOperationHandler(resource, operationOrAction) {
|
|
106
|
+
resource = typeof resource === 'object' && resource instanceof common_1.Resource
|
|
107
|
+
? resource
|
|
108
|
+
: this.api.getResource(resource);
|
|
109
|
+
const controller = await this.getController(resource);
|
|
110
|
+
const endpoint = (resource instanceof common_1.CrudResource && resource.operations.get(operationOrAction)) ||
|
|
111
|
+
resource.actions.get(operationOrAction);
|
|
112
|
+
if (endpoint) {
|
|
113
|
+
const handler = typeof controller[operationOrAction] === 'function' ? controller[operationOrAction] : undefined;
|
|
114
|
+
if (handler)
|
|
115
|
+
return { controller, endpoint, handler };
|
|
116
|
+
}
|
|
117
|
+
throw new common_1.ForbiddenError({
|
|
118
|
+
message: (0, common_1.translate)('OPERATION_FORBIDDEN', { resource: resource.name, endpoint: operationOrAction }, `'{{resource}}' does not accept '{{endpoint}}' operations`),
|
|
119
|
+
severity: 'error',
|
|
120
|
+
code: 'OPERATION_FORBIDDEN'
|
|
121
|
+
});
|
|
122
|
+
}
|
|
94
123
|
async _createI18n(options) {
|
|
95
124
|
const opts = {
|
|
96
125
|
...options,
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
var
|
|
5
|
-
(function (
|
|
3
|
+
exports.RequestContext = void 0;
|
|
4
|
+
var RequestContext;
|
|
5
|
+
(function (RequestContext) {
|
|
6
6
|
function from(executionContext, request, response) {
|
|
7
7
|
const out = {
|
|
8
8
|
request,
|
|
@@ -12,5 +12,5 @@ var EndpointContext;
|
|
|
12
12
|
Object.setPrototypeOf(out, executionContext);
|
|
13
13
|
return out;
|
|
14
14
|
}
|
|
15
|
-
|
|
16
|
-
})(
|
|
15
|
+
RequestContext.from = from;
|
|
16
|
+
})(RequestContext || (exports.RequestContext = RequestContext = {}));
|
package/cjs/response.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { OpraURLPath } from '@opra/common';
|
|
2
|
+
import { HttpAdapterHost } from '../http-adapter-host.js';
|
|
3
|
+
import { HttpServerRequest } from '../http-server-request.js';
|
|
4
|
+
import { HttpServerResponse } from '../http-server-response.js';
|
|
5
|
+
export class ExpressAdapterHost extends HttpAdapterHost {
|
|
6
|
+
constructor(app) {
|
|
7
|
+
super();
|
|
8
|
+
this._platform = 'express';
|
|
9
|
+
this._app = app;
|
|
10
|
+
}
|
|
11
|
+
get app() {
|
|
12
|
+
return this._app;
|
|
13
|
+
}
|
|
14
|
+
async init(api, options) {
|
|
15
|
+
await super.init(api, options);
|
|
16
|
+
this._api = api;
|
|
17
|
+
const basePath = new OpraURLPath(options?.basePath);
|
|
18
|
+
this._app.use(basePath.toString(), (_req, _res) => {
|
|
19
|
+
const req = HttpServerRequest.from(_req);
|
|
20
|
+
const res = HttpServerResponse.from(_res);
|
|
21
|
+
this.handleHttp(req, res)
|
|
22
|
+
.catch((e) => this._logger.fatal(e));
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
static async create(app, api, options) {
|
|
26
|
+
const adapter = new ExpressAdapterHost(app);
|
|
27
|
+
await adapter.init(api, options);
|
|
28
|
+
return adapter;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -5,9 +5,7 @@ import { ExpressAdapterHost } from './express-adapter.host.js';
|
|
|
5
5
|
export var ExpressAdapter;
|
|
6
6
|
(function (ExpressAdapter) {
|
|
7
7
|
async function create(app, api, options) {
|
|
8
|
-
|
|
9
|
-
await adapter.init();
|
|
10
|
-
return adapter;
|
|
8
|
+
return ExpressAdapterHost.create(app, api, options);
|
|
11
9
|
}
|
|
12
10
|
ExpressAdapter.create = create;
|
|
13
11
|
})(ExpressAdapter || (ExpressAdapter = {}));
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import http from 'http';
|
|
2
2
|
import { HttpStatusCodes, HttpStatusMessages, OpraURL, OpraURLPath, } from '@opra/common';
|
|
3
|
-
import {
|
|
4
|
-
import { HttpServerRequest } from '
|
|
5
|
-
import { HttpServerResponse } from '
|
|
3
|
+
import { HttpAdapterHost } from '../http-adapter-host.js';
|
|
4
|
+
import { HttpServerRequest } from '../http-server-request.js';
|
|
5
|
+
import { HttpServerResponse } from '../http-server-response.js';
|
|
6
6
|
/**
|
|
7
|
-
* @class
|
|
7
|
+
* @class NodeHttpAdapterHost
|
|
8
8
|
*/
|
|
9
|
-
export class
|
|
10
|
-
constructor(
|
|
11
|
-
super(
|
|
9
|
+
export class NodeHttpAdapterHost extends HttpAdapterHost {
|
|
10
|
+
constructor() {
|
|
11
|
+
super(...arguments);
|
|
12
12
|
this._platform = 'http';
|
|
13
|
-
this._basePath = new OpraURLPath(options?.basePath);
|
|
14
|
-
this._server = http.createServer((incomingMessage, serverResponse) => this._serverListener(incomingMessage, serverResponse));
|
|
15
13
|
}
|
|
16
14
|
get basePath() {
|
|
17
15
|
return this._basePath;
|
|
@@ -19,6 +17,22 @@ export class HttpAdapterHost extends HttpAdapterBase {
|
|
|
19
17
|
get server() {
|
|
20
18
|
return this._server;
|
|
21
19
|
}
|
|
20
|
+
async close() {
|
|
21
|
+
await super.close();
|
|
22
|
+
if (this.server.listening)
|
|
23
|
+
await new Promise((resolve, reject) => {
|
|
24
|
+
this.server.close((err) => {
|
|
25
|
+
if (err)
|
|
26
|
+
return reject(err);
|
|
27
|
+
resolve();
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
async init(api, options) {
|
|
32
|
+
await super.init(api, options);
|
|
33
|
+
this._basePath = new OpraURLPath(options?.basePath);
|
|
34
|
+
this._server = http.createServer((incomingMessage, serverResponse) => this._serverListener(incomingMessage, serverResponse));
|
|
35
|
+
}
|
|
22
36
|
_serverListener(incomingMessage, serverResponse) {
|
|
23
37
|
const originalUrl = incomingMessage.url;
|
|
24
38
|
const parsedUrl = new OpraURL(originalUrl);
|
|
@@ -40,18 +54,12 @@ export class HttpAdapterHost extends HttpAdapterBase {
|
|
|
40
54
|
});
|
|
41
55
|
const req = HttpServerRequest.from(incomingMessage);
|
|
42
56
|
const res = HttpServerResponse.from(serverResponse);
|
|
43
|
-
this.
|
|
57
|
+
this.handleHttp(req, res)
|
|
44
58
|
.catch((e) => this._logger.fatal(e));
|
|
45
59
|
}
|
|
46
|
-
async
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
this.server.close((err) => {
|
|
51
|
-
if (err)
|
|
52
|
-
return reject(err);
|
|
53
|
-
resolve();
|
|
54
|
-
});
|
|
55
|
-
});
|
|
60
|
+
static async create(api, options) {
|
|
61
|
+
const adapter = new NodeHttpAdapterHost();
|
|
62
|
+
await adapter.init(api, options);
|
|
63
|
+
return adapter;
|
|
56
64
|
}
|
|
57
65
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { NodeHttpAdapterHost } from './node-http-adapter.host.js';
|
|
2
|
+
/**
|
|
3
|
+
* @namespace NodeHttpAdapter
|
|
4
|
+
*/
|
|
5
|
+
export var NodeHttpAdapter;
|
|
6
|
+
(function (NodeHttpAdapter) {
|
|
7
|
+
async function create(api, options) {
|
|
8
|
+
return NodeHttpAdapterHost.create(api, options);
|
|
9
|
+
}
|
|
10
|
+
NodeHttpAdapter.create = create;
|
|
11
|
+
})(NodeHttpAdapter || (NodeHttpAdapter = {}));
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import bodyParser from 'body-parser';
|
|
2
|
+
const bodyLoaderCache = new WeakMap();
|
|
3
|
+
export function jsonBodyLoader(options, cachePoint) {
|
|
4
|
+
let bodyLoader = cachePoint ? bodyLoaderCache.get(cachePoint) : undefined;
|
|
5
|
+
if (bodyLoader)
|
|
6
|
+
return bodyLoader;
|
|
7
|
+
const parser = bodyParser.json({
|
|
8
|
+
...options,
|
|
9
|
+
type: 'json'
|
|
10
|
+
});
|
|
11
|
+
bodyLoader = (incoming) => {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
const next = (error) => {
|
|
14
|
+
if (error)
|
|
15
|
+
return reject(error);
|
|
16
|
+
resolve(incoming.body);
|
|
17
|
+
};
|
|
18
|
+
parser(incoming, {}, next);
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
if (cachePoint)
|
|
22
|
+
bodyLoaderCache.set(cachePoint, bodyLoader);
|
|
23
|
+
return bodyLoader;
|
|
24
|
+
}
|