@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.
Files changed (118) hide show
  1. package/cjs/adapter/execution-context.host.js +48 -0
  2. package/cjs/adapter/http/express-adapter.host.js +24 -0
  3. package/cjs/adapter/http/express-adapter.js +12 -45
  4. package/cjs/adapter/http/helpers/concat-readable.js +20 -0
  5. package/cjs/adapter/http/helpers/multipart-helper.js +96 -0
  6. package/cjs/adapter/http/helpers/query-parsers.js +16 -0
  7. package/cjs/adapter/http/http-adapter-base.js +127 -0
  8. package/cjs/adapter/http/http-adapter.host.js +57 -0
  9. package/cjs/adapter/http/http-adapter.js +11 -129
  10. package/cjs/adapter/http/{impl/http-server-request.js → http-server-request.js} +11 -5
  11. package/cjs/adapter/http/{impl/http-server-response.js → http-server-response.js} +22 -22
  12. package/cjs/adapter/http/impl/http-incoming-message.host.js +148 -0
  13. package/cjs/adapter/http/impl/{http-outgoing-message-host.js → http-outgoing-message.host.js} +26 -38
  14. package/cjs/adapter/http/request-handlers/entity-request-handler.js +378 -0
  15. package/cjs/adapter/http/request-handlers/request-handler-base.js +27 -0
  16. package/cjs/adapter/http/request-handlers/storage-request-handler.js +134 -0
  17. package/cjs/adapter/operation-context.js +16 -0
  18. package/cjs/adapter/platform-adapter.host.js +107 -0
  19. package/cjs/adapter/request.host.js +1 -2
  20. package/cjs/adapter/request.js +2 -0
  21. package/cjs/adapter/response.js +2 -0
  22. package/cjs/adapter/services/logger.js +36 -0
  23. package/cjs/augmentation/collection.augmentation.js +2 -0
  24. package/cjs/augmentation/singleton.augmentation.js +2 -0
  25. package/cjs/augmentation/storage.augmentation.js +2 -0
  26. package/cjs/index.js +15 -9
  27. package/esm/adapter/execution-context.host.js +44 -0
  28. package/esm/adapter/http/express-adapter.host.js +20 -0
  29. package/esm/adapter/http/express-adapter.js +11 -20
  30. package/esm/adapter/http/helpers/concat-readable.js +16 -0
  31. package/esm/adapter/http/helpers/multipart-helper.js +91 -0
  32. package/esm/adapter/http/helpers/query-parsers.js +12 -0
  33. package/esm/adapter/http/http-adapter-base.js +123 -0
  34. package/esm/adapter/http/http-adapter.host.js +52 -0
  35. package/esm/adapter/http/http-adapter.js +11 -128
  36. package/esm/adapter/http/{impl/http-server-request.js → http-server-request.js} +12 -6
  37. package/esm/adapter/http/{impl/http-server-response.js → http-server-response.js} +22 -22
  38. package/esm/adapter/http/impl/http-incoming-message.host.js +144 -0
  39. package/esm/adapter/http/impl/{http-outgoing-message-host.js → http-outgoing-message.host.js} +25 -36
  40. package/esm/adapter/http/request-handlers/entity-request-handler.js +373 -0
  41. package/esm/adapter/http/request-handlers/request-handler-base.js +23 -0
  42. package/esm/adapter/http/request-handlers/storage-request-handler.js +129 -0
  43. package/esm/adapter/operation-context.js +13 -0
  44. package/esm/adapter/platform-adapter.host.js +102 -0
  45. package/esm/adapter/request.host.js +1 -2
  46. package/esm/adapter/request.js +1 -0
  47. package/esm/adapter/response.js +1 -0
  48. package/esm/adapter/services/logger.js +32 -0
  49. package/esm/augmentation/collection.augmentation.js +1 -0
  50. package/esm/augmentation/singleton.augmentation.js +1 -0
  51. package/esm/augmentation/storage.augmentation.js +1 -0
  52. package/esm/index.js +15 -9
  53. package/i18n/en/error.json +5 -2
  54. package/package.json +8 -7
  55. package/types/adapter/execution-context.d.ts +31 -0
  56. package/types/adapter/execution-context.host.d.ts +27 -0
  57. package/types/adapter/http/express-adapter.d.ts +12 -8
  58. package/types/adapter/http/express-adapter.host.d.ts +11 -0
  59. package/types/adapter/http/helpers/concat-readable.d.ts +3 -0
  60. package/types/adapter/http/helpers/multipart-helper.d.ts +25 -0
  61. package/types/adapter/http/helpers/query-parsers.d.ts +1 -0
  62. package/types/adapter/http/http-adapter-base.d.ts +23 -0
  63. package/types/adapter/http/http-adapter.d.ts +13 -29
  64. package/types/adapter/http/http-adapter.host.d.ts +18 -0
  65. package/types/adapter/http/{impl/http-server-request.d.ts → http-server-request.d.ts} +7 -6
  66. package/types/adapter/http/{impl/http-server-response.d.ts → http-server-response.d.ts} +2 -2
  67. package/types/adapter/http/impl/{http-incoming-message-host.d.ts → http-incoming-message.host.d.ts} +16 -12
  68. package/types/adapter/http/impl/{http-outgoing-message-host.d.ts → http-outgoing-message.host.d.ts} +12 -16
  69. package/types/adapter/http/request-handlers/entity-request-handler.d.ts +24 -0
  70. package/types/adapter/http/request-handlers/request-handler-base.d.ts +15 -0
  71. package/types/adapter/http/request-handlers/storage-request-handler.d.ts +23 -0
  72. package/types/adapter/interfaces/logger.interface.d.ts +7 -6
  73. package/types/adapter/interfaces/request-handler.interface.d.ts +4 -0
  74. package/types/adapter/operation-context.d.ts +11 -0
  75. package/types/adapter/{adapter.d.ts → platform-adapter.d.ts} +18 -28
  76. package/types/adapter/platform-adapter.host.d.ts +31 -0
  77. package/types/adapter/request.d.ts +11 -0
  78. package/types/adapter/request.host.d.ts +12 -21
  79. package/types/adapter/{interfaces/response.interface.d.ts → response.d.ts} +2 -2
  80. package/types/adapter/response.host.d.ts +2 -2
  81. package/types/adapter/services/logger.d.ts +14 -0
  82. package/types/augmentation/collection.augmentation.d.ts +112 -0
  83. package/types/augmentation/singleton.augmentation.d.ts +64 -0
  84. package/types/augmentation/storage.augmentation.d.ts +39 -0
  85. package/types/index.d.ts +15 -9
  86. package/cjs/adapter/adapter.js +0 -118
  87. package/cjs/adapter/http/impl/http-incoming-message-host.js +0 -127
  88. package/cjs/adapter/http/request-parsers/parse-collection-request.js +0 -165
  89. package/cjs/adapter/http/request-parsers/parse-request.js +0 -24
  90. package/cjs/adapter/http/request-parsers/parse-singleton-request.js +0 -96
  91. package/cjs/adapter/internal/metadata.resource.js +0 -26
  92. package/cjs/adapter/request-context.host.js +0 -44
  93. package/cjs/shared/collection-resource-base.js +0 -20
  94. package/esm/adapter/adapter.js +0 -113
  95. package/esm/adapter/http/impl/http-incoming-message-host.js +0 -122
  96. package/esm/adapter/http/request-parsers/parse-collection-request.js +0 -161
  97. package/esm/adapter/http/request-parsers/parse-request.js +0 -20
  98. package/esm/adapter/http/request-parsers/parse-singleton-request.js +0 -92
  99. package/esm/adapter/internal/metadata.resource.js +0 -23
  100. package/esm/adapter/request-context.host.js +0 -40
  101. package/esm/shared/collection-resource-base.js +0 -16
  102. package/types/adapter/http/request-parsers/parse-collection-request.d.ts +0 -4
  103. package/types/adapter/http/request-parsers/parse-request.d.ts +0 -4
  104. package/types/adapter/http/request-parsers/parse-singleton-request.d.ts +0 -4
  105. package/types/adapter/interfaces/request-context.interface.d.ts +0 -31
  106. package/types/adapter/interfaces/request.interface.d.ts +0 -15
  107. package/types/adapter/internal/metadata.resource.d.ts +0 -7
  108. package/types/adapter/request-context.host.d.ts +0 -22
  109. package/types/shared/collection-resource-base.d.ts +0 -11
  110. /package/cjs/adapter/{interfaces/request-context.interface.js → execution-context.js} +0 -0
  111. /package/cjs/adapter/http/{request-parsers/batch-request-parser.js → request-handlers/parse-batch-request.js} +0 -0
  112. /package/cjs/adapter/interfaces/{request.interface.js → request-handler.interface.js} +0 -0
  113. /package/cjs/adapter/{interfaces/response.interface.js → platform-adapter.js} +0 -0
  114. /package/esm/adapter/{interfaces/request-context.interface.js → execution-context.js} +0 -0
  115. /package/esm/adapter/http/{request-parsers/batch-request-parser.js → request-handlers/parse-batch-request.js} +0 -0
  116. /package/esm/adapter/interfaces/{request.interface.js → request-handler.interface.js} +0 -0
  117. /package/esm/adapter/{interfaces/response.interface.js → platform-adapter.js} +0 -0
  118. /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/adapter.js';
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-server-request.js';
8
- export * from './adapter/http/impl/http-server-response.js';
9
- export * from './adapter/http/impl/http-incoming-message-host.js';
10
- export * from './adapter/http/impl/http-outgoing-message-host.js';
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/interfaces/response.interface.js';
15
- export * from './shared/collection-resource-base.js';
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';
@@ -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;