@opra/core 0.21.0 → 0.23.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/adapter/execution-context.host.js +48 -0
- package/cjs/adapter/http/express-adapter.host.js +24 -0
- package/cjs/adapter/http/express-adapter.js +12 -45
- package/cjs/adapter/http/helpers/concat-readable.js +20 -0
- package/cjs/adapter/http/helpers/multipart-helper.js +96 -0
- package/cjs/adapter/http/helpers/query-parsers.js +16 -0
- package/cjs/adapter/http/http-adapter-base.js +127 -0
- package/cjs/adapter/http/http-adapter.host.js +57 -0
- package/cjs/adapter/http/http-adapter.js +11 -129
- package/cjs/adapter/http/{impl/http-server-request.js → http-server-request.js} +11 -5
- package/cjs/adapter/http/{impl/http-server-response.js → http-server-response.js} +22 -22
- package/cjs/adapter/http/impl/http-incoming-message.host.js +148 -0
- package/cjs/adapter/http/impl/{http-outgoing-message-host.js → http-outgoing-message.host.js} +26 -38
- package/cjs/adapter/http/request-handlers/entity-request-handler.js +378 -0
- package/cjs/adapter/http/request-handlers/request-handler-base.js +27 -0
- package/cjs/adapter/http/request-handlers/storage-request-handler.js +134 -0
- package/cjs/adapter/operation-context.js +16 -0
- package/cjs/adapter/platform-adapter.host.js +107 -0
- package/cjs/adapter/request.host.js +1 -2
- package/cjs/adapter/request.js +2 -0
- package/cjs/adapter/response.js +2 -0
- package/cjs/adapter/services/logger.js +36 -0
- package/cjs/augmentation/collection.augmentation.js +2 -0
- package/cjs/augmentation/singleton.augmentation.js +2 -0
- package/cjs/augmentation/storage.augmentation.js +2 -0
- package/cjs/index.js +15 -9
- package/esm/adapter/execution-context.host.js +44 -0
- package/esm/adapter/http/express-adapter.host.js +20 -0
- package/esm/adapter/http/express-adapter.js +11 -20
- package/esm/adapter/http/helpers/concat-readable.js +16 -0
- package/esm/adapter/http/helpers/multipart-helper.js +91 -0
- package/esm/adapter/http/helpers/query-parsers.js +12 -0
- package/esm/adapter/http/http-adapter-base.js +123 -0
- package/esm/adapter/http/http-adapter.host.js +52 -0
- package/esm/adapter/http/http-adapter.js +11 -128
- package/esm/adapter/http/{impl/http-server-request.js → http-server-request.js} +12 -6
- package/esm/adapter/http/{impl/http-server-response.js → http-server-response.js} +22 -22
- package/esm/adapter/http/impl/http-incoming-message.host.js +144 -0
- package/esm/adapter/http/impl/{http-outgoing-message-host.js → http-outgoing-message.host.js} +25 -36
- package/esm/adapter/http/request-handlers/entity-request-handler.js +373 -0
- package/esm/adapter/http/request-handlers/request-handler-base.js +23 -0
- package/esm/adapter/http/request-handlers/storage-request-handler.js +129 -0
- package/esm/adapter/operation-context.js +13 -0
- package/esm/adapter/platform-adapter.host.js +102 -0
- package/esm/adapter/request.host.js +1 -2
- package/esm/adapter/request.js +1 -0
- package/esm/adapter/response.js +1 -0
- package/esm/adapter/services/logger.js +32 -0
- package/esm/augmentation/collection.augmentation.js +1 -0
- package/esm/augmentation/singleton.augmentation.js +1 -0
- package/esm/augmentation/storage.augmentation.js +1 -0
- package/esm/index.js +15 -9
- package/i18n/en/error.json +5 -2
- package/package.json +8 -7
- package/types/adapter/execution-context.d.ts +31 -0
- package/types/adapter/execution-context.host.d.ts +27 -0
- package/types/adapter/http/express-adapter.d.ts +12 -8
- package/types/adapter/http/express-adapter.host.d.ts +11 -0
- package/types/adapter/http/helpers/concat-readable.d.ts +3 -0
- package/types/adapter/http/helpers/multipart-helper.d.ts +25 -0
- package/types/adapter/http/helpers/query-parsers.d.ts +1 -0
- package/types/adapter/http/http-adapter-base.d.ts +23 -0
- package/types/adapter/http/http-adapter.d.ts +13 -29
- package/types/adapter/http/http-adapter.host.d.ts +18 -0
- package/types/adapter/http/{impl/http-server-request.d.ts → http-server-request.d.ts} +7 -6
- package/types/adapter/http/{impl/http-server-response.d.ts → http-server-response.d.ts} +2 -2
- package/types/adapter/http/impl/{http-incoming-message-host.d.ts → http-incoming-message.host.d.ts} +16 -12
- package/types/adapter/http/impl/{http-outgoing-message-host.d.ts → http-outgoing-message.host.d.ts} +12 -16
- package/types/adapter/http/request-handlers/entity-request-handler.d.ts +24 -0
- package/types/adapter/http/request-handlers/request-handler-base.d.ts +15 -0
- package/types/adapter/http/request-handlers/storage-request-handler.d.ts +23 -0
- package/types/adapter/interfaces/logger.interface.d.ts +7 -6
- package/types/adapter/interfaces/request-handler.interface.d.ts +4 -0
- package/types/adapter/operation-context.d.ts +11 -0
- package/types/adapter/{adapter.d.ts → platform-adapter.d.ts} +18 -28
- package/types/adapter/platform-adapter.host.d.ts +31 -0
- package/types/adapter/request.d.ts +11 -0
- package/types/adapter/request.host.d.ts +12 -21
- package/types/adapter/{interfaces/response.interface.d.ts → response.d.ts} +2 -2
- package/types/adapter/response.host.d.ts +2 -2
- package/types/adapter/services/logger.d.ts +14 -0
- package/types/augmentation/collection.augmentation.d.ts +112 -0
- package/types/augmentation/singleton.augmentation.d.ts +64 -0
- package/types/augmentation/storage.augmentation.d.ts +39 -0
- package/types/index.d.ts +15 -9
- package/cjs/adapter/adapter.js +0 -118
- package/cjs/adapter/http/impl/http-incoming-message-host.js +0 -127
- package/cjs/adapter/http/request-parsers/parse-collection-request.js +0 -165
- package/cjs/adapter/http/request-parsers/parse-request.js +0 -24
- package/cjs/adapter/http/request-parsers/parse-singleton-request.js +0 -96
- package/cjs/adapter/internal/metadata.resource.js +0 -26
- package/cjs/adapter/request-context.host.js +0 -44
- package/cjs/shared/collection-resource-base.js +0 -20
- package/esm/adapter/adapter.js +0 -113
- package/esm/adapter/http/impl/http-incoming-message-host.js +0 -122
- package/esm/adapter/http/request-parsers/parse-collection-request.js +0 -161
- package/esm/adapter/http/request-parsers/parse-request.js +0 -20
- package/esm/adapter/http/request-parsers/parse-singleton-request.js +0 -92
- package/esm/adapter/internal/metadata.resource.js +0 -23
- package/esm/adapter/request-context.host.js +0 -40
- package/esm/shared/collection-resource-base.js +0 -16
- package/types/adapter/http/request-parsers/parse-collection-request.d.ts +0 -4
- package/types/adapter/http/request-parsers/parse-request.d.ts +0 -4
- package/types/adapter/http/request-parsers/parse-singleton-request.d.ts +0 -4
- package/types/adapter/interfaces/request-context.interface.d.ts +0 -31
- package/types/adapter/interfaces/request.interface.d.ts +0 -15
- package/types/adapter/internal/metadata.resource.d.ts +0 -7
- package/types/adapter/request-context.host.d.ts +0 -22
- package/types/shared/collection-resource-base.d.ts +0 -11
- /package/cjs/adapter/{interfaces/request-context.interface.js → execution-context.js} +0 -0
- /package/cjs/adapter/http/{request-parsers/batch-request-parser.js → request-handlers/parse-batch-request.js} +0 -0
- /package/cjs/adapter/interfaces/{request.interface.js → request-handler.interface.js} +0 -0
- /package/cjs/adapter/{interfaces/response.interface.js → platform-adapter.js} +0 -0
- /package/esm/adapter/{interfaces/request-context.interface.js → execution-context.js} +0 -0
- /package/esm/adapter/http/{request-parsers/batch-request-parser.js → request-handlers/parse-batch-request.js} +0 -0
- /package/esm/adapter/interfaces/{request.interface.js → request-handler.interface.js} +0 -0
- /package/esm/adapter/{interfaces/response.interface.js → platform-adapter.js} +0 -0
- /package/types/adapter/http/{request-parsers/batch-request-parser.d.ts → request-handlers/parse-batch-request.d.ts} +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import type { Readable } from 'stream';
|
|
4
|
+
import type { MultipartIterator } from '../adapter/http/helpers/multipart-helper';
|
|
5
|
+
import type { OperationContext } from '../adapter/operation-context.js';
|
|
6
|
+
import type { Request as _Request } from '../adapter/request.js';
|
|
7
|
+
declare module "@opra/common" {
|
|
8
|
+
namespace Storage {
|
|
9
|
+
namespace Delete {
|
|
10
|
+
interface Request extends _Request {
|
|
11
|
+
}
|
|
12
|
+
interface Context extends OperationContext {
|
|
13
|
+
request: Request;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
namespace Get {
|
|
17
|
+
interface Request extends _Request {
|
|
18
|
+
}
|
|
19
|
+
interface Context extends OperationContext {
|
|
20
|
+
request: Request;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
namespace Post {
|
|
24
|
+
interface Request extends _Request {
|
|
25
|
+
parts: MultipartIterator;
|
|
26
|
+
}
|
|
27
|
+
interface Context extends OperationContext {
|
|
28
|
+
request: Request;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
interface StorageResource {
|
|
33
|
+
delete?(context: Storage.Delete.Context): Promise<number | undefined>;
|
|
34
|
+
get?(context: Storage.Get.Context): Promise<Buffer | Readable | undefined>;
|
|
35
|
+
post?(context: Storage.Post.Context): Promise<void>;
|
|
36
|
+
onInit?(): Promise<void>;
|
|
37
|
+
onShutdown?(): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
}
|
package/types/index.d.ts
CHANGED
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
2
|
import './augmentation/resource.augmentation.js';
|
|
3
|
+
import './augmentation/collection.augmentation.js';
|
|
4
|
+
import './augmentation/singleton.augmentation.js';
|
|
5
|
+
import './augmentation/storage.augmentation.js';
|
|
3
6
|
export * from './types.js';
|
|
4
|
-
export * from './adapter/
|
|
7
|
+
export * from './adapter/execution-context.js';
|
|
8
|
+
export * from './adapter/operation-context.js';
|
|
9
|
+
export * from './adapter/platform-adapter.js';
|
|
10
|
+
export * from './adapter/request.js';
|
|
11
|
+
export * from './adapter/response.js';
|
|
5
12
|
export * from './adapter/http/express-adapter.js';
|
|
6
13
|
export * from './adapter/http/http-adapter.js';
|
|
7
|
-
export * from './adapter/http/impl/http-
|
|
8
|
-
export * from './adapter/http/impl/http-
|
|
9
|
-
export * from './adapter/http/
|
|
10
|
-
export * from './adapter/http/
|
|
11
|
-
export * from './adapter/interfaces/request-context.interface.js';
|
|
14
|
+
export * from './adapter/http/impl/http-incoming-message.host.js';
|
|
15
|
+
export * from './adapter/http/impl/http-outgoing-message.host.js';
|
|
16
|
+
export * from './adapter/http/http-server-request.js';
|
|
17
|
+
export * from './adapter/http/http-server-response.js';
|
|
12
18
|
export * from './adapter/interfaces/logger.interface.js';
|
|
13
|
-
export * from './adapter/interfaces/request.interface.js';
|
|
14
|
-
export * from './adapter/
|
|
15
|
-
export * from './
|
|
19
|
+
export * from './adapter/interfaces/request-handler.interface.js';
|
|
20
|
+
export * from './adapter/services/logger.js';
|
|
21
|
+
export * from './adapter/http/helpers/multipart-helper.js';
|
package/cjs/adapter/adapter.js
DELETED
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.OpraAdapter = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const path_1 = tslib_1.__importDefault(require("path"));
|
|
6
|
-
const strict_typed_events_1 = require("strict-typed-events");
|
|
7
|
-
const common_1 = require("@opra/common");
|
|
8
|
-
const metadata_resource_js_1 = require("./internal/metadata.resource.js");
|
|
9
|
-
/**
|
|
10
|
-
* @class OpraAdapter
|
|
11
|
-
*/
|
|
12
|
-
class OpraAdapter extends strict_typed_events_1.AsyncEventEmitter {
|
|
13
|
-
constructor(api) {
|
|
14
|
-
super();
|
|
15
|
-
this.api = api;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Initializes the adapter
|
|
19
|
-
* @param options
|
|
20
|
-
* @protected
|
|
21
|
-
*/
|
|
22
|
-
async init(options) {
|
|
23
|
-
this.logger = options?.logger;
|
|
24
|
-
if (options?.i18n instanceof common_1.I18n)
|
|
25
|
-
this.i18n = options.i18n;
|
|
26
|
-
else if (typeof options?.i18n === 'function')
|
|
27
|
-
this.i18n = await options.i18n();
|
|
28
|
-
else
|
|
29
|
-
this.i18n = await this._createI18n(options?.i18n);
|
|
30
|
-
this.i18n = this.i18n || common_1.I18n.defaultInstance;
|
|
31
|
-
if (!this.i18n.isInitialized)
|
|
32
|
-
await this.i18n.init();
|
|
33
|
-
if (options?.onRequest)
|
|
34
|
-
this.on('request', options.onRequest);
|
|
35
|
-
this._apiRoot = await common_1.DocumentFactory.createDocument({
|
|
36
|
-
version: common_1.OpraSchema.SpecVersion,
|
|
37
|
-
info: {
|
|
38
|
-
version: common_1.OpraSchema.SpecVersion,
|
|
39
|
-
title: 'Internal resources',
|
|
40
|
-
},
|
|
41
|
-
references: { 'api': this.api },
|
|
42
|
-
resources: [new metadata_resource_js_1.MetadataResource(this.api)]
|
|
43
|
-
});
|
|
44
|
-
const promises = [];
|
|
45
|
-
for (const r of this.api.resources.values()) {
|
|
46
|
-
const onInit = r.onInit;
|
|
47
|
-
if (onInit)
|
|
48
|
-
promises.push((async () => onInit.call(r.controller, r))());
|
|
49
|
-
}
|
|
50
|
-
await Promise.all(promises);
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Calls shutDown hook for all resources
|
|
54
|
-
*/
|
|
55
|
-
async close() {
|
|
56
|
-
const promises = [];
|
|
57
|
-
for (const r of this.api.resources.values()) {
|
|
58
|
-
const onShutdown = r.onShutdown;
|
|
59
|
-
if (onShutdown)
|
|
60
|
-
promises.push((async () => onShutdown.call(r.controller, r))());
|
|
61
|
-
}
|
|
62
|
-
await Promise.allSettled(promises);
|
|
63
|
-
}
|
|
64
|
-
async executeRequest(context) {
|
|
65
|
-
await this.emitAsync('request', context);
|
|
66
|
-
const { request, response } = context;
|
|
67
|
-
const { resource, operation } = request;
|
|
68
|
-
if (resource instanceof common_1.Collection || resource instanceof common_1.Singleton) {
|
|
69
|
-
const endpoint = resource.operations[operation];
|
|
70
|
-
if (!endpoint?.handler)
|
|
71
|
-
throw new common_1.ForbiddenError({
|
|
72
|
-
message: (0, common_1.translate)('RESOLVER_FORBIDDEN', { operation }, `The resource endpoint does not accept '{{operation}}' operations`),
|
|
73
|
-
severity: 'error',
|
|
74
|
-
code: 'RESOLVER_FORBIDDEN'
|
|
75
|
-
});
|
|
76
|
-
const value = await endpoint.handler(context);
|
|
77
|
-
// if (value == null)
|
|
78
|
-
if (value != null)
|
|
79
|
-
response.value = value;
|
|
80
|
-
const { crud, many } = request;
|
|
81
|
-
if (crud === 'delete' || (crud === 'update' && many)) {
|
|
82
|
-
let affected = 0;
|
|
83
|
-
if (typeof response.value === 'number')
|
|
84
|
-
affected = response.value;
|
|
85
|
-
if (typeof response.value === 'boolean')
|
|
86
|
-
affected = response.value ? 1 : 0;
|
|
87
|
-
if (typeof response.value === 'object')
|
|
88
|
-
affected = response.value.affectedRows || response.value.affected;
|
|
89
|
-
response.value = {
|
|
90
|
-
operation: request.crud,
|
|
91
|
-
affected
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
else if (response.value != null) {
|
|
95
|
-
if (!request.many)
|
|
96
|
-
response.value = Array.isArray(response.value) ? response.value[0] : response.value;
|
|
97
|
-
else
|
|
98
|
-
response.value = Array.isArray(response.value) ? response.value : [response.value];
|
|
99
|
-
}
|
|
100
|
-
if ((request.operation === 'get' || request.operation === 'update') && response.value == null)
|
|
101
|
-
throw new common_1.ResourceNotFoundError(resource.name, request.args.key);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
async _createI18n(options) {
|
|
105
|
-
const opts = {
|
|
106
|
-
...options,
|
|
107
|
-
};
|
|
108
|
-
delete opts.resourceDirs;
|
|
109
|
-
const instance = common_1.I18n.createInstance(opts);
|
|
110
|
-
await instance.init();
|
|
111
|
-
await instance.loadResourceDir(path_1.default.resolve((0, common_1.getStackFileName)(), '../../../i18n'));
|
|
112
|
-
if (options?.resourceDirs)
|
|
113
|
-
for (const dir of options.resourceDirs)
|
|
114
|
-
await instance.loadResourceDir(dir);
|
|
115
|
-
return instance;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
exports.OpraAdapter = OpraAdapter;
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*
|
|
3
|
-
This file contains code blocks from open source NodeJs project
|
|
4
|
-
https://github.com/nodejs/
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.HttpIncomingMessageHost = exports.kTrailersDistinct = exports.kTrailers = exports.kHeadersDistinct = exports.kHeaders = exports.CRLF = void 0;
|
|
8
|
-
const tslib_1 = require("tslib");
|
|
9
|
-
const stream = tslib_1.__importStar(require("stream"));
|
|
10
|
-
const http_parser_1 = require("@browsery/http-parser");
|
|
11
|
-
const common_1 = require("@opra/common");
|
|
12
|
-
const convert_to_headers_js_1 = require("../helpers/convert-to-headers.js");
|
|
13
|
-
const convert_to_raw_headers_js_1 = require("../helpers/convert-to-raw-headers.js");
|
|
14
|
-
exports.CRLF = Buffer.from('\r\n');
|
|
15
|
-
exports.kHeaders = Symbol('kHeaders');
|
|
16
|
-
exports.kHeadersDistinct = Symbol('kHeadersDistinct');
|
|
17
|
-
exports.kTrailers = Symbol('kTrailers');
|
|
18
|
-
exports.kTrailersDistinct = Symbol('kTrailersDistinct');
|
|
19
|
-
/**
|
|
20
|
-
*
|
|
21
|
-
* @class HttpIncomingMessageHost
|
|
22
|
-
*/
|
|
23
|
-
class HttpIncomingMessageHost {
|
|
24
|
-
constructor() {
|
|
25
|
-
this.rawHeaders = [];
|
|
26
|
-
this.rawTrailers = [];
|
|
27
|
-
this.complete = false;
|
|
28
|
-
this.joinDuplicateHeaders = false;
|
|
29
|
-
stream.Readable.apply(this);
|
|
30
|
-
}
|
|
31
|
-
get httpVersion() {
|
|
32
|
-
return this.httpVersionMajor
|
|
33
|
-
? this.httpVersionMajor + '.' + this.httpVersionMinor
|
|
34
|
-
: '';
|
|
35
|
-
}
|
|
36
|
-
get headers() {
|
|
37
|
-
if (!this[exports.kHeaders])
|
|
38
|
-
this[exports.kHeaders] = (0, convert_to_headers_js_1.convertToHeaders)(this.rawHeaders, {}, this.joinDuplicateHeaders);
|
|
39
|
-
return this[exports.kHeaders];
|
|
40
|
-
}
|
|
41
|
-
set headers(headers) {
|
|
42
|
-
this[exports.kHeaders] = headers;
|
|
43
|
-
}
|
|
44
|
-
get headersDistinct() {
|
|
45
|
-
if (!this[exports.kHeadersDistinct])
|
|
46
|
-
this[exports.kHeadersDistinct] = (0, convert_to_headers_js_1.convertToHeadersDistinct)(this.rawHeaders, {});
|
|
47
|
-
return this[exports.kHeadersDistinct];
|
|
48
|
-
}
|
|
49
|
-
get trailers() {
|
|
50
|
-
if (!this[exports.kTrailers])
|
|
51
|
-
this[exports.kTrailers] = (0, convert_to_headers_js_1.convertToHeaders)(this.rawTrailers, {}, this.joinDuplicateHeaders);
|
|
52
|
-
return this[exports.kTrailers];
|
|
53
|
-
}
|
|
54
|
-
set trailers(trailers) {
|
|
55
|
-
this[exports.kTrailers] = trailers;
|
|
56
|
-
}
|
|
57
|
-
get trailersDistinct() {
|
|
58
|
-
if (!this[exports.kTrailersDistinct])
|
|
59
|
-
this[exports.kTrailersDistinct] = (0, convert_to_headers_js_1.convertToHeadersDistinct)(this.rawTrailers, {});
|
|
60
|
-
return this[exports.kTrailersDistinct];
|
|
61
|
-
}
|
|
62
|
-
_readConfig(init) {
|
|
63
|
-
this.complete = true;
|
|
64
|
-
this.httpVersionMajor = init?.httpVersionMajor || 1;
|
|
65
|
-
this.httpVersionMinor = init?.httpVersionMinor || 0;
|
|
66
|
-
this.method = (init.method || 'GET').toUpperCase();
|
|
67
|
-
this.url = init.url || '';
|
|
68
|
-
this.body = init.body;
|
|
69
|
-
if (init.headers)
|
|
70
|
-
this.rawHeaders = Array.isArray(init.headers) ? init.headers : (0, convert_to_raw_headers_js_1.convertToRawHeaders)(init.headers);
|
|
71
|
-
if (init.trailers)
|
|
72
|
-
this.rawTrailers = Array.isArray(init.trailers) ? init.trailers : (0, convert_to_raw_headers_js_1.convertToRawHeaders)(init.trailers);
|
|
73
|
-
this.ip = init.ip || '';
|
|
74
|
-
this.ips = init.ips || (this.ip ? [this.ip] : []);
|
|
75
|
-
}
|
|
76
|
-
_readBuffer(buf) {
|
|
77
|
-
const parser = new http_parser_1.HTTPParser(http_parser_1.HTTPParser.REQUEST);
|
|
78
|
-
let bodyChunks;
|
|
79
|
-
parser[http_parser_1.HTTPParser.kOnHeadersComplete] = (info) => {
|
|
80
|
-
this.httpVersionMajor = info.versionMajor;
|
|
81
|
-
this.httpVersionMinor = info.versionMinor;
|
|
82
|
-
this.rawHeaders = info.headers;
|
|
83
|
-
this.method = http_parser_1.HTTPParser.methods[info.method];
|
|
84
|
-
this.url = info.url;
|
|
85
|
-
};
|
|
86
|
-
parser[http_parser_1.HTTPParser.kOnHeaders] = (trailers) => {
|
|
87
|
-
this.rawTrailers = trailers;
|
|
88
|
-
};
|
|
89
|
-
parser[http_parser_1.HTTPParser.kOnBody] = (chunk, offset, length) => {
|
|
90
|
-
bodyChunks = bodyChunks || [];
|
|
91
|
-
bodyChunks.push(chunk.subarray(offset, offset + length));
|
|
92
|
-
};
|
|
93
|
-
parser[http_parser_1.HTTPParser.kOnMessageComplete] = () => {
|
|
94
|
-
this.complete = true;
|
|
95
|
-
if (bodyChunks)
|
|
96
|
-
this.body = Buffer.concat(bodyChunks);
|
|
97
|
-
};
|
|
98
|
-
const buffer = Buffer.from(buf);
|
|
99
|
-
let x = parser.execute(buffer, 0, buffer.length);
|
|
100
|
-
if (typeof x === 'object')
|
|
101
|
-
throw x;
|
|
102
|
-
if (!this.complete) {
|
|
103
|
-
x = parser.execute(exports.CRLF);
|
|
104
|
-
if (typeof x === 'object')
|
|
105
|
-
throw x;
|
|
106
|
-
}
|
|
107
|
-
parser.finish();
|
|
108
|
-
}
|
|
109
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
110
|
-
_readStream(readable) {
|
|
111
|
-
throw new Error('_readStream is not implemented yet');
|
|
112
|
-
}
|
|
113
|
-
static create(init) {
|
|
114
|
-
const msg = new HttpIncomingMessageHost();
|
|
115
|
-
if (Buffer.isBuffer(init))
|
|
116
|
-
msg._readBuffer(init);
|
|
117
|
-
else if ((0, common_1.isReadable)(init)) {
|
|
118
|
-
throw new Error('fromStream is not implemented yet');
|
|
119
|
-
}
|
|
120
|
-
else if (init)
|
|
121
|
-
msg._readConfig(init);
|
|
122
|
-
return msg;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
exports.HttpIncomingMessageHost = HttpIncomingMessageHost;
|
|
126
|
-
// Apply mixins
|
|
127
|
-
Object.assign(HttpIncomingMessageHost.prototype, stream.Readable.prototype);
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseCollectionRequest = void 0;
|
|
4
|
-
const common_1 = require("@opra/common");
|
|
5
|
-
const request_host_js_1 = require("../../request.host.js");
|
|
6
|
-
async function parseCollectionRequest(incoming, resource, url) {
|
|
7
|
-
if ((incoming.method === 'POST' || incoming.method === 'PATCH') &&
|
|
8
|
-
incoming.headers['content-type'] !== 'application/json')
|
|
9
|
-
throw new common_1.BadRequestError({ message: 'Unsupported Content-Type' });
|
|
10
|
-
url.searchParams.define({
|
|
11
|
-
'$search': { codec: 'string' },
|
|
12
|
-
'$pick': { codec: 'string', array: 'strict' },
|
|
13
|
-
'$omit': { codec: 'string', array: 'strict' },
|
|
14
|
-
'$include': { codec: 'string', array: 'strict' },
|
|
15
|
-
'$sort': { codec: 'string', array: 'strict' },
|
|
16
|
-
'$filter': { codec: 'filter' },
|
|
17
|
-
'$limit': { codec: 'number' },
|
|
18
|
-
'$skip': { codec: 'number' },
|
|
19
|
-
'$distinct': { codec: 'boolean' },
|
|
20
|
-
'$count': { codec: 'boolean' },
|
|
21
|
-
});
|
|
22
|
-
url.parse(incoming.url || '');
|
|
23
|
-
const contentId = incoming.headers['content-id'];
|
|
24
|
-
const p = url.path.get(0);
|
|
25
|
-
const params = url.searchParams;
|
|
26
|
-
switch (incoming.method) {
|
|
27
|
-
case 'POST': {
|
|
28
|
-
if (!p.key) {
|
|
29
|
-
const pick = params.get('$pick');
|
|
30
|
-
const omit = params.get('$omit');
|
|
31
|
-
const include = params.get('$include');
|
|
32
|
-
return new request_host_js_1.RequestHost({
|
|
33
|
-
http: incoming,
|
|
34
|
-
kind: 'CollectionCreateRequest',
|
|
35
|
-
contentId,
|
|
36
|
-
resource,
|
|
37
|
-
operation: 'create',
|
|
38
|
-
crud: 'create',
|
|
39
|
-
many: false,
|
|
40
|
-
args: {
|
|
41
|
-
data: incoming.body,
|
|
42
|
-
pick: pick && resource.normalizeFieldPath(pick),
|
|
43
|
-
omit: omit && resource.normalizeFieldPath(omit),
|
|
44
|
-
include: include && resource.normalizeFieldPath(include)
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
break;
|
|
49
|
-
}
|
|
50
|
-
case 'DELETE': {
|
|
51
|
-
if (p.key) {
|
|
52
|
-
return new request_host_js_1.RequestHost({
|
|
53
|
-
http: incoming,
|
|
54
|
-
kind: 'CollectionDeleteRequest',
|
|
55
|
-
contentId,
|
|
56
|
-
resource,
|
|
57
|
-
operation: 'delete',
|
|
58
|
-
crud: 'delete',
|
|
59
|
-
many: false,
|
|
60
|
-
args: {
|
|
61
|
-
key: resource.parseKeyValue(p.key)
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
const filter = resource.normalizeFilter(params.get('$filter'));
|
|
66
|
-
return new request_host_js_1.RequestHost({
|
|
67
|
-
http: incoming,
|
|
68
|
-
kind: 'CollectionDeleteManyRequest',
|
|
69
|
-
contentId,
|
|
70
|
-
resource,
|
|
71
|
-
operation: 'deleteMany',
|
|
72
|
-
crud: 'delete',
|
|
73
|
-
many: true,
|
|
74
|
-
args: {
|
|
75
|
-
filter
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
case 'GET': {
|
|
80
|
-
const pick = params.get('$pick');
|
|
81
|
-
const omit = params.get('$omit');
|
|
82
|
-
const include = params.get('$include');
|
|
83
|
-
if (p.key) {
|
|
84
|
-
return new request_host_js_1.RequestHost({
|
|
85
|
-
http: incoming,
|
|
86
|
-
kind: 'CollectionGetRequest',
|
|
87
|
-
contentId,
|
|
88
|
-
resource,
|
|
89
|
-
operation: 'get',
|
|
90
|
-
crud: 'read',
|
|
91
|
-
many: false,
|
|
92
|
-
args: {
|
|
93
|
-
key: resource.parseKeyValue(p.key),
|
|
94
|
-
pick: pick && resource.normalizeFieldPath(pick),
|
|
95
|
-
omit: omit && resource.normalizeFieldPath(omit),
|
|
96
|
-
include: include && resource.normalizeFieldPath(include)
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
const filter = resource.normalizeFilter(params.get('$filter'));
|
|
101
|
-
const sort = params.get('$sort');
|
|
102
|
-
return new request_host_js_1.RequestHost({
|
|
103
|
-
http: incoming,
|
|
104
|
-
kind: 'CollectionFindManyRequest',
|
|
105
|
-
contentId,
|
|
106
|
-
resource,
|
|
107
|
-
operation: 'findMany',
|
|
108
|
-
crud: 'read',
|
|
109
|
-
many: true,
|
|
110
|
-
args: {
|
|
111
|
-
pick: pick && resource.normalizeFieldPath(pick),
|
|
112
|
-
omit: omit && resource.normalizeFieldPath(omit),
|
|
113
|
-
include: include && resource.normalizeFieldPath(include),
|
|
114
|
-
sort: sort && resource.normalizeSortFields(sort),
|
|
115
|
-
filter,
|
|
116
|
-
limit: params.get('$limit'),
|
|
117
|
-
skip: params.get('$skip'),
|
|
118
|
-
distinct: params.get('$distinct'),
|
|
119
|
-
count: params.get('$count'),
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
case 'PATCH': {
|
|
124
|
-
if (p.key) {
|
|
125
|
-
const pick = params.get('$pick');
|
|
126
|
-
const omit = params.get('$omit');
|
|
127
|
-
const include = params.get('$include');
|
|
128
|
-
return new request_host_js_1.RequestHost({
|
|
129
|
-
http: incoming,
|
|
130
|
-
kind: 'CollectionUpdateRequest',
|
|
131
|
-
contentId,
|
|
132
|
-
resource,
|
|
133
|
-
operation: 'update',
|
|
134
|
-
crud: 'update',
|
|
135
|
-
many: false,
|
|
136
|
-
args: {
|
|
137
|
-
key: resource.parseKeyValue(p.key),
|
|
138
|
-
data: incoming.body,
|
|
139
|
-
pick: pick && resource.normalizeFieldPath(pick),
|
|
140
|
-
omit: omit && resource.normalizeFieldPath(omit),
|
|
141
|
-
include: include && resource.normalizeFieldPath(include),
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
const filter = resource.normalizeFilter(params.get('$filter'));
|
|
146
|
-
return new request_host_js_1.RequestHost({
|
|
147
|
-
http: incoming,
|
|
148
|
-
kind: 'CollectionUpdateManyRequest',
|
|
149
|
-
contentId,
|
|
150
|
-
resource,
|
|
151
|
-
operation: 'updateMany',
|
|
152
|
-
crud: 'update',
|
|
153
|
-
many: true,
|
|
154
|
-
args: {
|
|
155
|
-
data: incoming.body,
|
|
156
|
-
filter,
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
throw new common_1.MethodNotAllowedError({
|
|
162
|
-
message: `Collection resource does not accept http "${incoming.method}" method`
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
exports.parseCollectionRequest = parseCollectionRequest;
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseRequest = void 0;
|
|
4
|
-
const common_1 = require("@opra/common");
|
|
5
|
-
const parse_collection_request_js_1 = require("./parse-collection-request.js");
|
|
6
|
-
const parse_singleton_request_js_1 = require("./parse-singleton-request.js");
|
|
7
|
-
async function parseRequest(api, incoming) {
|
|
8
|
-
const url = new common_1.OpraURL(incoming.url);
|
|
9
|
-
if (!url.path.size) {
|
|
10
|
-
// Batch
|
|
11
|
-
if (incoming.headers['content-type'] === 'multipart/mixed') {
|
|
12
|
-
// todo
|
|
13
|
-
}
|
|
14
|
-
throw new common_1.BadRequestError();
|
|
15
|
-
}
|
|
16
|
-
const p = url.path.get(0);
|
|
17
|
-
const resource = api.getResource(p.resource);
|
|
18
|
-
if (resource instanceof common_1.Collection)
|
|
19
|
-
return await (0, parse_collection_request_js_1.parseCollectionRequest)(incoming, resource, url);
|
|
20
|
-
if (resource instanceof common_1.Singleton)
|
|
21
|
-
return await (0, parse_singleton_request_js_1.parseSingletonRequest)(incoming, resource, url);
|
|
22
|
-
throw new common_1.BadRequestError();
|
|
23
|
-
}
|
|
24
|
-
exports.parseRequest = parseRequest;
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.parseSingletonRequest = void 0;
|
|
4
|
-
const common_1 = require("@opra/common");
|
|
5
|
-
const request_host_js_1 = require("../../request.host.js");
|
|
6
|
-
async function parseSingletonRequest(incoming, resource, url) {
|
|
7
|
-
if ((incoming.method === 'POST' || incoming.method === 'PATCH') &&
|
|
8
|
-
incoming.headers['content-type'] !== 'application/json')
|
|
9
|
-
throw new common_1.BadRequestError({ message: 'Unsupported Content-Type' });
|
|
10
|
-
url.searchParams.define({
|
|
11
|
-
'$pick': { codec: 'string', array: 'strict' },
|
|
12
|
-
'$omit': { codec: 'string', array: 'strict' },
|
|
13
|
-
'$include': { codec: 'string', array: 'strict' }
|
|
14
|
-
});
|
|
15
|
-
url.parse(incoming.url || '');
|
|
16
|
-
const contentId = incoming.headers['content-id'];
|
|
17
|
-
const params = url.searchParams;
|
|
18
|
-
switch (incoming.method) {
|
|
19
|
-
case 'POST': {
|
|
20
|
-
const pick = params.get('$pick');
|
|
21
|
-
const omit = params.get('$omit');
|
|
22
|
-
const include = params.get('$include');
|
|
23
|
-
return new request_host_js_1.RequestHost({
|
|
24
|
-
http: incoming,
|
|
25
|
-
kind: 'SingletonCreateRequest',
|
|
26
|
-
contentId,
|
|
27
|
-
resource,
|
|
28
|
-
operation: 'create',
|
|
29
|
-
crud: 'create',
|
|
30
|
-
many: false,
|
|
31
|
-
args: {
|
|
32
|
-
data: incoming.body,
|
|
33
|
-
pick: pick && resource.normalizeFieldPath(pick),
|
|
34
|
-
omit: omit && resource.normalizeFieldPath(omit),
|
|
35
|
-
include: include && resource.normalizeFieldPath(include),
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
case 'DELETE': {
|
|
40
|
-
return new request_host_js_1.RequestHost({
|
|
41
|
-
http: incoming,
|
|
42
|
-
kind: 'SingletonDeleteRequest',
|
|
43
|
-
contentId,
|
|
44
|
-
resource,
|
|
45
|
-
operation: 'delete',
|
|
46
|
-
crud: 'delete',
|
|
47
|
-
many: false,
|
|
48
|
-
args: {}
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
case 'GET': {
|
|
52
|
-
const pick = params.get('$pick');
|
|
53
|
-
const omit = params.get('$omit');
|
|
54
|
-
const include = params.get('$include');
|
|
55
|
-
return new request_host_js_1.RequestHost({
|
|
56
|
-
http: incoming,
|
|
57
|
-
kind: 'SingletonGetRequest',
|
|
58
|
-
contentId,
|
|
59
|
-
resource,
|
|
60
|
-
operation: 'get',
|
|
61
|
-
crud: 'read',
|
|
62
|
-
many: false,
|
|
63
|
-
args: {
|
|
64
|
-
pick: pick && resource.normalizeFieldPath(pick),
|
|
65
|
-
omit: omit && resource.normalizeFieldPath(omit),
|
|
66
|
-
include: include && resource.normalizeFieldPath(include),
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
case 'PATCH': {
|
|
71
|
-
const pick = params.get('$pick');
|
|
72
|
-
const omit = params.get('$omit');
|
|
73
|
-
const include = params.get('$include');
|
|
74
|
-
return new request_host_js_1.RequestHost({
|
|
75
|
-
http: incoming,
|
|
76
|
-
kind: 'SingletonUpdateRequest',
|
|
77
|
-
contentId,
|
|
78
|
-
resource,
|
|
79
|
-
operation: 'update',
|
|
80
|
-
crud: 'update',
|
|
81
|
-
many: false,
|
|
82
|
-
args: {
|
|
83
|
-
data: incoming.body,
|
|
84
|
-
pick: pick && resource.normalizeFieldPath(pick),
|
|
85
|
-
omit: omit && resource.normalizeFieldPath(omit),
|
|
86
|
-
include: include && resource.normalizeFieldPath(include),
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
default:
|
|
91
|
-
throw new common_1.MethodNotAllowedError({
|
|
92
|
-
message: `Singleton resource does not accept http "${incoming.method}" method`
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
exports.parseSingletonRequest = parseSingletonRequest;
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MetadataResource = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const common_1 = require("@opra/common");
|
|
6
|
-
let MetadataResource = exports.MetadataResource = class MetadataResource {
|
|
7
|
-
constructor(document) {
|
|
8
|
-
this.document = document;
|
|
9
|
-
this._schema = document.exportSchema();
|
|
10
|
-
}
|
|
11
|
-
get() {
|
|
12
|
-
return (0, common_1.cloneObject)(this.document.exportSchema(), true);
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
tslib_1.__decorate([
|
|
16
|
-
common_1.Singleton.Get(),
|
|
17
|
-
tslib_1.__metadata("design:type", Function),
|
|
18
|
-
tslib_1.__metadata("design:paramtypes", []),
|
|
19
|
-
tslib_1.__metadata("design:returntype", void 0)
|
|
20
|
-
], MetadataResource.prototype, "get", null);
|
|
21
|
-
exports.MetadataResource = MetadataResource = tslib_1.__decorate([
|
|
22
|
-
(0, common_1.Singleton)(Object, {
|
|
23
|
-
name: '$metadata',
|
|
24
|
-
}),
|
|
25
|
-
tslib_1.__metadata("design:paramtypes", [common_1.ApiDocument])
|
|
26
|
-
], MetadataResource);
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RequestContextHost = void 0;
|
|
4
|
-
const strict_typed_events_1 = require("strict-typed-events");
|
|
5
|
-
class RequestContextHost extends strict_typed_events_1.AsyncEventEmitter {
|
|
6
|
-
constructor(protocol, platform, api, _request, _response) {
|
|
7
|
-
super();
|
|
8
|
-
this.protocol = protocol;
|
|
9
|
-
this.platform = platform;
|
|
10
|
-
this.api = api;
|
|
11
|
-
this._request = _request;
|
|
12
|
-
this._response = _response;
|
|
13
|
-
if (this.protocol === 'http') {
|
|
14
|
-
this._http = {
|
|
15
|
-
platform,
|
|
16
|
-
request: this._request.switchToHttp(),
|
|
17
|
-
response: this._response.switchToHttp(),
|
|
18
|
-
switchToContext: () => this
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
get request() {
|
|
23
|
-
return this._request;
|
|
24
|
-
}
|
|
25
|
-
get response() {
|
|
26
|
-
return this._response;
|
|
27
|
-
}
|
|
28
|
-
switchToHttp() {
|
|
29
|
-
if (this._http)
|
|
30
|
-
return this._http;
|
|
31
|
-
throw new TypeError('Not executing in an "Http" context');
|
|
32
|
-
}
|
|
33
|
-
switchToWs() {
|
|
34
|
-
if (this._ws)
|
|
35
|
-
return this._ws;
|
|
36
|
-
throw new TypeError('Not executing in an "WebSocket" context');
|
|
37
|
-
}
|
|
38
|
-
switchToRpc() {
|
|
39
|
-
if (this._rpc)
|
|
40
|
-
return this._rpc;
|
|
41
|
-
throw new TypeError('Not executing in an "RPC" context');
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
exports.RequestContextHost = RequestContextHost;
|