@toa.io/extensions.exposition 1.0.0-alpha.3 → 1.0.0-alpha.5

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 (187) hide show
  1. package/components/identity.bans/manifest.toa.yaml +1 -0
  2. package/components/identity.basic/manifest.toa.yaml +1 -0
  3. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  4. package/components/identity.federation/manifest.toa.yaml +1 -0
  5. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  6. package/components/identity.roles/manifest.toa.yaml +1 -0
  7. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  8. package/components/identity.tokens/manifest.toa.yaml +1 -0
  9. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  10. package/components/octets.storage/manifest.toa.yaml +1 -0
  11. package/components/octets.storage/operations/store.js +1 -1
  12. package/documentation/components.md +5 -5
  13. package/documentation/query.md +45 -2
  14. package/features/body.feature +1 -1
  15. package/features/cors.feature +2 -2
  16. package/features/errors.feature +1 -1
  17. package/features/etag.feature +96 -0
  18. package/features/octets.entries.feature +1 -1
  19. package/features/steps/Gateway.ts +3 -0
  20. package/features/steps/components/echo/manifest.toa.yaml +1 -0
  21. package/features/steps/components/greeter/manifest.toa.yaml +1 -0
  22. package/features/steps/components/octets.tester/manifest.toa.yaml +1 -0
  23. package/features/steps/components/pots/manifest.toa.yaml +10 -3
  24. package/features/steps/components/sequences/manifest.toa.yaml +1 -0
  25. package/features/timing.feature +43 -0
  26. package/package.json +7 -10
  27. package/readme.md +7 -6
  28. package/schemas/annotation.cos.yaml +1 -0
  29. package/schemas/querystring.cos.yaml +1 -0
  30. package/source/Annotation.ts +1 -0
  31. package/source/Context.ts +6 -4
  32. package/source/Directive.test.ts +7 -7
  33. package/source/Directive.ts +16 -42
  34. package/source/Endpoint.ts +55 -6
  35. package/source/Factory.ts +17 -7
  36. package/source/Gateway.ts +38 -50
  37. package/source/HTTP/Context.ts +67 -0
  38. package/source/HTTP/Server.test.ts +1 -1
  39. package/source/HTTP/Server.ts +60 -95
  40. package/source/HTTP/Timing.ts +40 -0
  41. package/source/HTTP/index.ts +1 -0
  42. package/source/HTTP/messages.test.ts +27 -8
  43. package/source/HTTP/messages.ts +32 -48
  44. package/source/Mapping.ts +7 -8
  45. package/source/RTD/Context.ts +7 -10
  46. package/source/RTD/Directives.ts +28 -4
  47. package/source/RTD/Endpoint.ts +6 -4
  48. package/source/RTD/Match.ts +2 -7
  49. package/source/RTD/Method.ts +7 -13
  50. package/source/RTD/Node.ts +13 -14
  51. package/source/RTD/Tree.ts +17 -16
  52. package/source/RTD/factory.ts +2 -5
  53. package/source/deployment.ts +6 -0
  54. package/source/directives/auth/Anonymous.ts +3 -2
  55. package/source/directives/auth/Authorization.ts +7 -6
  56. package/source/directives/auth/Incept.ts +11 -6
  57. package/source/directives/auth/Role.ts +5 -3
  58. package/source/directives/auth/Scheme.ts +2 -2
  59. package/source/directives/cache/Cache.ts +4 -4
  60. package/source/directives/cache/Control.ts +5 -5
  61. package/source/directives/cache/types.ts +1 -1
  62. package/source/directives/cors/CORS.ts +18 -10
  63. package/source/directives/dev/Development.ts +3 -3
  64. package/source/directives/index.ts +2 -2
  65. package/source/directives/octets/Context.ts +1 -1
  66. package/source/directives/octets/Delete.ts +19 -9
  67. package/source/directives/octets/Fetch.ts +29 -14
  68. package/source/directives/octets/List.ts +14 -6
  69. package/source/directives/octets/Octets.ts +6 -5
  70. package/source/directives/octets/Permute.ts +12 -6
  71. package/source/directives/octets/Store.ts +25 -17
  72. package/source/directives/octets/Workflow.ts +3 -3
  73. package/source/directives/octets/workflows/Workflow.ts +2 -2
  74. package/source/directives/vary/Vary.ts +3 -3
  75. package/source/directives/vary/embeddings/Header.ts +2 -2
  76. package/source/directives/vary/embeddings/Language.ts +2 -2
  77. package/source/io.ts +2 -2
  78. package/transpiled/Annotation.d.ts +1 -0
  79. package/transpiled/Context.d.ts +6 -4
  80. package/transpiled/Directive.d.ts +8 -21
  81. package/transpiled/Directive.js +8 -11
  82. package/transpiled/Directive.js.map +1 -1
  83. package/transpiled/Endpoint.d.ts +7 -5
  84. package/transpiled/Endpoint.js +60 -2
  85. package/transpiled/Endpoint.js.map +1 -1
  86. package/transpiled/Factory.js +8 -2
  87. package/transpiled/Factory.js.map +1 -1
  88. package/transpiled/Gateway.d.ts +4 -8
  89. package/transpiled/Gateway.js +22 -32
  90. package/transpiled/Gateway.js.map +1 -1
  91. package/transpiled/HTTP/Context.d.ts +24 -0
  92. package/transpiled/HTTP/Context.js +47 -0
  93. package/transpiled/HTTP/Context.js.map +1 -0
  94. package/transpiled/HTTP/Server.d.ts +8 -7
  95. package/transpiled/HTTP/Server.js +68 -76
  96. package/transpiled/HTTP/Server.js.map +1 -1
  97. package/transpiled/HTTP/Timing.d.ts +10 -0
  98. package/transpiled/HTTP/Timing.js +29 -0
  99. package/transpiled/HTTP/Timing.js.map +1 -0
  100. package/transpiled/HTTP/index.d.ts +1 -0
  101. package/transpiled/HTTP/index.js +1 -0
  102. package/transpiled/HTTP/index.js.map +1 -1
  103. package/transpiled/HTTP/messages.d.ts +7 -21
  104. package/transpiled/HTTP/messages.js +24 -26
  105. package/transpiled/HTTP/messages.js.map +1 -1
  106. package/transpiled/Mapping.js +7 -7
  107. package/transpiled/Mapping.js.map +1 -1
  108. package/transpiled/RTD/Context.d.ts +7 -6
  109. package/transpiled/RTD/Directives.d.ts +19 -4
  110. package/transpiled/RTD/Endpoint.d.ts +6 -4
  111. package/transpiled/RTD/Match.d.ts +2 -4
  112. package/transpiled/RTD/Method.d.ts +7 -7
  113. package/transpiled/RTD/Method.js.map +1 -1
  114. package/transpiled/RTD/Node.d.ts +4 -6
  115. package/transpiled/RTD/Node.js +2 -1
  116. package/transpiled/RTD/Node.js.map +1 -1
  117. package/transpiled/RTD/Tree.d.ts +6 -6
  118. package/transpiled/RTD/Tree.js +4 -1
  119. package/transpiled/RTD/Tree.js.map +1 -1
  120. package/transpiled/RTD/factory.d.ts +2 -4
  121. package/transpiled/RTD/factory.js.map +1 -1
  122. package/transpiled/deployment.js +5 -0
  123. package/transpiled/deployment.js.map +1 -1
  124. package/transpiled/directives/auth/Anonymous.js +3 -4
  125. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  126. package/transpiled/directives/auth/Authorization.d.ts +2 -3
  127. package/transpiled/directives/auth/Authorization.js +1 -1
  128. package/transpiled/directives/auth/Authorization.js.map +1 -1
  129. package/transpiled/directives/auth/Incept.d.ts +1 -1
  130. package/transpiled/directives/auth/Incept.js +11 -6
  131. package/transpiled/directives/auth/Incept.js.map +1 -1
  132. package/transpiled/directives/auth/Role.js +5 -3
  133. package/transpiled/directives/auth/Role.js.map +1 -1
  134. package/transpiled/directives/auth/Scheme.js +2 -2
  135. package/transpiled/directives/auth/Scheme.js.map +1 -1
  136. package/transpiled/directives/cache/Cache.d.ts +3 -3
  137. package/transpiled/directives/cache/Cache.js +2 -2
  138. package/transpiled/directives/cache/Cache.js.map +1 -1
  139. package/transpiled/directives/cache/Control.d.ts +3 -3
  140. package/transpiled/directives/cache/Control.js +3 -3
  141. package/transpiled/directives/cache/Control.js.map +1 -1
  142. package/transpiled/directives/cache/types.d.ts +1 -1
  143. package/transpiled/directives/cors/CORS.d.ts +2 -3
  144. package/transpiled/directives/cors/CORS.js +17 -10
  145. package/transpiled/directives/cors/CORS.js.map +1 -1
  146. package/transpiled/directives/dev/Development.d.ts +3 -3
  147. package/transpiled/directives/dev/Development.js.map +1 -1
  148. package/transpiled/directives/index.d.ts +2 -2
  149. package/transpiled/directives/index.js.map +1 -1
  150. package/transpiled/directives/octets/Context.d.ts +1 -1
  151. package/transpiled/directives/octets/Context.js.map +1 -1
  152. package/transpiled/directives/octets/Delete.d.ts +1 -1
  153. package/transpiled/directives/octets/Delete.js +19 -9
  154. package/transpiled/directives/octets/Delete.js.map +1 -1
  155. package/transpiled/directives/octets/Fetch.d.ts +1 -1
  156. package/transpiled/directives/octets/Fetch.js +28 -14
  157. package/transpiled/directives/octets/Fetch.js.map +1 -1
  158. package/transpiled/directives/octets/List.d.ts +1 -1
  159. package/transpiled/directives/octets/List.js +13 -6
  160. package/transpiled/directives/octets/List.js.map +1 -1
  161. package/transpiled/directives/octets/Octets.d.ts +2 -3
  162. package/transpiled/directives/octets/Octets.js +4 -2
  163. package/transpiled/directives/octets/Octets.js.map +1 -1
  164. package/transpiled/directives/octets/Permute.d.ts +1 -1
  165. package/transpiled/directives/octets/Permute.js +11 -6
  166. package/transpiled/directives/octets/Permute.js.map +1 -1
  167. package/transpiled/directives/octets/Store.d.ts +1 -1
  168. package/transpiled/directives/octets/Store.js +17 -12
  169. package/transpiled/directives/octets/Store.js.map +1 -1
  170. package/transpiled/directives/octets/Workflow.d.ts +1 -1
  171. package/transpiled/directives/octets/Workflow.js +3 -3
  172. package/transpiled/directives/octets/Workflow.js.map +1 -1
  173. package/transpiled/directives/octets/workflows/Workflow.d.ts +1 -1
  174. package/transpiled/directives/octets/workflows/Workflow.js +2 -2
  175. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  176. package/transpiled/directives/vary/Vary.d.ts +2 -2
  177. package/transpiled/directives/vary/Vary.js +1 -1
  178. package/transpiled/directives/vary/embeddings/Header.js +2 -2
  179. package/transpiled/directives/vary/embeddings/Header.js.map +1 -1
  180. package/transpiled/directives/vary/embeddings/Language.js +2 -2
  181. package/transpiled/directives/vary/embeddings/Language.js.map +1 -1
  182. package/transpiled/io.d.ts +2 -2
  183. package/transpiled/tsconfig.tsbuildinfo +1 -1
  184. package/source/HTTP/Server.fixtures.ts +0 -40
  185. package/transpiled/HTTP/Server.fixtures.d.ts +0 -10
  186. package/transpiled/HTTP/Server.fixtures.js +0 -31
  187. package/transpiled/HTTP/Server.fixtures.js.map +0 -1
@@ -31,57 +31,47 @@ class Gateway extends core_1.Connector {
31
31
  broadcast;
32
32
  tree;
33
33
  interceptor;
34
- server;
35
- // eslint-disable-next-line max-params, max-len
36
- constructor(broadcast, server, tree, interception) {
34
+ constructor(broadcast, tree, interception) {
37
35
  super();
38
36
  this.broadcast = broadcast;
39
37
  this.tree = tree;
40
38
  this.interceptor = interception;
41
- this.server = server;
42
39
  this.depends(broadcast);
43
- // this.depends(server)
44
- server.attach(this.process.bind(this));
45
40
  }
46
- async open() {
47
- await this.discover();
48
- console.info('Gateway has started and is awaiting resource branches.');
49
- }
50
- dispose() {
51
- console.info('Gateway is closed.');
52
- }
53
- async process(request) {
54
- const interception = await this.interceptor.intercept(request);
41
+ async process(context) {
42
+ const interception = await context.timing.capture('gate:intercept', this.interceptor.intercept(context));
55
43
  if (interception !== null)
56
44
  return interception;
57
- const match = this.tree.match(request.path);
45
+ const match = this.tree.match(context.url.pathname);
58
46
  if (match === null)
59
47
  throw new http.NotFound();
60
48
  const { node, parameters } = match;
61
- if (!(request.method in node.methods))
49
+ if (!(context.request.method in node.methods))
62
50
  throw new http.MethodNotAllowed();
63
- const method = node.methods[request.method];
64
- const interruption = await method.directives.preflight(request, parameters);
65
- const response = interruption ?? await this.call(method, request, parameters);
66
- await method.directives.settle(request, response);
51
+ const method = node.methods[context.request.method];
52
+ const interruption = await context.timing.capture('gate:preflight', method.directives.preflight(context, parameters));
53
+ const response = interruption ??
54
+ await context.timing.capture('gate:call', this.call(method, context, parameters));
55
+ await context.timing.capture('gate:settle', method.directives.settle(context, response));
67
56
  return response;
68
57
  }
69
- async call(method, request, parameters) {
70
- if (request.path[request.path.length - 1] !== '/')
58
+ async open() {
59
+ await this.discover();
60
+ console.info('Gateway has started and is awaiting resource branches.');
61
+ }
62
+ dispose() {
63
+ console.info('Gateway is closed.');
64
+ }
65
+ async call(method, context, parameters) {
66
+ if (context.url.pathname[context.url.pathname.length - 1] !== '/')
71
67
  throw new http.NotFound('Trailing slash is required.');
72
- if (request.encoder === null)
68
+ if (context.encoder === null)
73
69
  throw new http.NotAcceptable();
74
70
  if (method.endpoint === null)
75
71
  throw new http.MethodNotAllowed();
76
- const body = await request.parse();
77
- if ('embed' in request && typeof body === 'object' && body !== null)
78
- Object.assign(body, request.embed);
79
- const reply = await method.endpoint
80
- .call(body, request.query, parameters)
72
+ return await method.endpoint
73
+ .call(context, parameters)
81
74
  .catch(exceptions_1.rethrow);
82
- if (reply instanceof Error)
83
- throw new http.Conflict(reply);
84
- return { body: reply };
85
75
  }
86
76
  async discover() {
87
77
  await this.broadcast.receive('expose', this.merge.bind(this));
@@ -1 +1 @@
1
- {"version":3,"file":"Gateway.js","sourceRoot":"","sources":["../source/Gateway.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Gateway.js","sourceRoot":"","sources":["../source/Gateway.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /// <reference types="node" />
2
+ import { Timing } from './Timing';
3
+ import { type Format } from './formats';
4
+ import type { OutgoingMessage } from './messages';
5
+ import type * as http from 'node:http';
6
+ export declare class Context {
7
+ readonly request: IncomingMessage;
8
+ readonly url: URL;
9
+ readonly subtype: string | null;
10
+ readonly encoder: Format | null;
11
+ readonly timing: Timing;
12
+ readonly pipelines: Pipelines;
13
+ constructor(request: IncomingMessage, trace?: boolean);
14
+ body<T>(): Promise<T>;
15
+ }
16
+ export interface IncomingMessage extends http.IncomingMessage {
17
+ url: string;
18
+ method: string;
19
+ }
20
+ interface Pipelines {
21
+ body: Array<(input: unknown) => unknown>;
22
+ response: Array<(output: OutgoingMessage) => void>;
23
+ }
24
+ export {};
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Context = void 0;
7
+ const negotiator_1 = __importDefault(require("negotiator"));
8
+ const Timing_1 = require("./Timing");
9
+ const formats_1 = require("./formats");
10
+ const messages_1 = require("./messages");
11
+ class Context {
12
+ request;
13
+ url;
14
+ subtype = null;
15
+ encoder = null;
16
+ timing;
17
+ pipelines = {
18
+ body: [],
19
+ response: []
20
+ };
21
+ constructor(request, trace = false) {
22
+ this.request = request;
23
+ this.url = new URL(request.url, `https://${request.headers.host}`);
24
+ this.timing = new Timing_1.Timing(trace);
25
+ if (this.request.headers.accept !== undefined) {
26
+ const match = SUBTYPE.exec(this.request.headers.accept);
27
+ if (match !== null) {
28
+ const { type, subtype, suffix } = match.groups;
29
+ this.request.headers.accept = `${type}/${suffix}`;
30
+ this.subtype = subtype;
31
+ }
32
+ }
33
+ const negotiator = new negotiator_1.default(this.request);
34
+ const mediaType = negotiator.mediaType(formats_1.types);
35
+ if (mediaType !== undefined)
36
+ this.encoder = formats_1.formats[mediaType];
37
+ }
38
+ async body() {
39
+ const value = await (0, messages_1.read)(this);
40
+ return this.pipelines.body.length === 0
41
+ ? value
42
+ : this.pipelines.body.reduce((value, transform) => transform(value), value);
43
+ }
44
+ }
45
+ exports.Context = Context;
46
+ const SUBTYPE = /^(?<type>\w{1,32})\/(vnd\.toa\.(?<subtype>\S{1,32})\+)(?<suffix>\S{1,32})$/;
47
+ //# sourceMappingURL=Context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Context.js","sourceRoot":"","sources":["../../source/HTTP/Context.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAmC;AACnC,qCAAiC;AACjC,uCAAuD;AACvD,yCAAiC;AAIjC,MAAa,OAAO;IACF,OAAO,CAAiB;IACxB,GAAG,CAAK;IACR,OAAO,GAAkB,IAAI,CAAA;IAC7B,OAAO,GAAkB,IAAI,CAAA;IAC7B,MAAM,CAAQ;IAEd,SAAS,GAAc;QACrC,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,EAAE;KACb,CAAA;IAED,YAAoB,OAAwB,EAAE,KAAK,GAAG,KAAK;QACzD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QAEtB,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,WAAW,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QAClE,IAAI,CAAC,MAAM,GAAG,IAAI,eAAM,CAAC,KAAK,CAAC,CAAA;QAE/B,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YAEvD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,MAAM,EACJ,IAAI,EACJ,OAAO,EACP,MAAM,EACP,GAAG,KAAK,CAAC,MAAO,CAAA;gBAEjB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,IAAI,IAAI,MAAM,EAAE,CAAA;gBACjD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;YACxB,CAAC;QACH,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,oBAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC/C,MAAM,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC,eAAK,CAAC,CAAA;QAE7C,IAAI,SAAS,KAAK,SAAS;YACzB,IAAI,CAAC,OAAO,GAAG,iBAAO,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,MAAM,KAAK,GAAG,MAAM,IAAA,eAAI,EAAC,IAAI,CAAC,CAAA;QAE9B,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YACrC,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAA;IAC/E,CAAC;CACF;AA/CD,0BA+CC;AAYD,MAAM,OAAO,GAAG,4EAA4E,CAAA"}
@@ -1,24 +1,25 @@
1
1
  import { Connector } from '@toa.io/core';
2
- import { type IncomingMessage, type OutgoingMessage } from './messages';
2
+ import { type OutgoingMessage } from './messages';
3
+ import { Context } from './Context';
3
4
  export declare class Server extends Connector {
4
- private server?;
5
- private readonly app;
6
- private readonly debug;
7
- private readonly requestedPort;
5
+ private readonly server;
6
+ private readonly properties;
7
+ private process?;
8
8
  private constructor();
9
9
  get port(): number;
10
10
  static create(options?: Partial<Properties>): Server;
11
11
  attach(process: Processing): void;
12
12
  protected open(): Promise<void>;
13
13
  protected close(): Promise<void>;
14
- private extend;
14
+ private listener;
15
15
  private success;
16
16
  private fail;
17
17
  }
18
18
  interface Properties {
19
19
  methods: Set<string>;
20
20
  debug: boolean;
21
+ trace: boolean;
21
22
  port: number;
22
23
  }
23
- export type Processing = (input: IncomingMessage) => Promise<OutgoingMessage>;
24
+ export type Processing = (input: Context) => Promise<OutgoingMessage>;
24
25
  export {};
@@ -1,4 +1,27 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
27
  };
@@ -6,27 +29,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
29
  exports.Server = void 0;
7
30
  const node_fs_1 = __importDefault(require("node:fs"));
8
31
  const node_os_1 = __importDefault(require("node:os"));
9
- const express_1 = __importDefault(require("express"));
32
+ const http = __importStar(require("node:http"));
33
+ const node_assert_1 = __importDefault(require("node:assert"));
34
+ const node_events_1 = require("node:events");
10
35
  const core_1 = require("@toa.io/core");
11
36
  const generic_1 = require("@toa.io/generic");
12
- const negotiator_1 = __importDefault(require("negotiator"));
13
37
  const messages_1 = require("./messages");
14
38
  const exceptions_1 = require("./exceptions");
15
- const formats_1 = require("./formats");
39
+ const Context_1 = require("./Context");
16
40
  class Server extends core_1.Connector {
17
- server;
18
- app;
19
- debug;
20
- requestedPort;
21
- constructor(app, debug, port) {
41
+ server = http.createServer();
42
+ properties;
43
+ process;
44
+ constructor(properties) {
22
45
  super();
23
- this.app = app;
24
- this.debug = debug;
25
- this.requestedPort = port;
46
+ this.properties = properties;
47
+ this.server.on('request', (req, res) => this.listener(req, res));
26
48
  }
27
49
  get port() {
28
- if (this.server === undefined)
29
- return this.requestedPort;
50
+ if (this.properties.port !== 0)
51
+ return this.properties.port;
30
52
  const address = this.server.address();
31
53
  if (address === null || typeof address === 'string')
32
54
  throw new Error('Server is not listening on a port.');
@@ -36,101 +58,71 @@ class Server extends core_1.Connector {
36
58
  const properties = options === undefined
37
59
  ? DEFAULTS
38
60
  : { ...DEFAULTS, ...options };
39
- const app = (0, express_1.default)();
40
- app.disable('x-powered-by');
41
- app.use(supportedMethods(properties.methods));
42
- return new Server(app, properties.debug, properties.port);
61
+ return new Server(properties);
43
62
  }
44
63
  attach(process) {
45
- this.app.use((request, response) => {
46
- const message = this.extend(request);
47
- process(message)
48
- .then(this.success(message, response))
49
- .catch(this.fail(message, response));
50
- });
64
+ this.process = process;
51
65
  }
52
66
  async open() {
53
- const listening = (0, generic_1.promex)();
54
- this.server = this.app.listen(this.requestedPort, listening.callback);
55
- await listening;
67
+ this.server.listen(this.properties.port);
68
+ await (0, node_events_1.once)(this.server, 'listening');
56
69
  console.info('HTTP Server is listening.');
57
70
  }
58
71
  async close() {
59
- const stopped = (0, generic_1.promex)();
60
- this.server?.close(stopped.callback);
61
- await stopped;
62
- this.server = undefined;
72
+ this.server.close();
73
+ console.info('HTTP Server stopped accepting new connections.');
74
+ await (0, node_events_1.once)(this.server, 'close');
63
75
  console.info('HTTP Server has been stopped.');
64
76
  }
65
- extend(request) {
66
- const message = request;
67
- negotiate(request, message);
68
- message.pipelines = { body: [], response: [] };
69
- message.parse = async () => {
70
- const value = await (0, messages_1.read)(request);
71
- if (message.pipelines.body.length === 0)
72
- return value;
73
- return message.pipelines.body.reduce((value, transform) => transform(value), value);
74
- };
75
- return message;
77
+ listener(request, response) {
78
+ if (request.method === undefined || !this.properties.methods.has(request.method)) {
79
+ response.writeHead(501).end();
80
+ return;
81
+ }
82
+ if (request.url === undefined) {
83
+ response.writeHead(400).end();
84
+ return;
85
+ }
86
+ node_assert_1.default.ok(this.process !== undefined, 'No processing function has been attached to the server.');
87
+ const context = new Context_1.Context(request, this.properties.trace);
88
+ this.process(context)
89
+ .then(this.success(context, response))
90
+ .catch(this.fail(context, response));
76
91
  }
77
- success(request, response) {
92
+ success(context, response) {
78
93
  return (message) => {
79
94
  let status = message.status;
80
95
  if (status === undefined)
81
96
  if (message.body === null)
82
97
  status = 404;
83
- else if (request.method === 'POST')
98
+ else if (context.request.method === 'POST')
84
99
  status = 201;
85
100
  else if (message.body === undefined)
86
101
  status = 204;
87
102
  else
88
103
  status = 200;
89
- response.status(status);
90
- (0, messages_1.write)(request, response, message);
104
+ response.statusCode = status;
105
+ (0, messages_1.write)(context, response, message);
91
106
  };
92
107
  }
93
- fail(request, response) {
108
+ fail(context, response) {
94
109
  return async (exception) => {
95
- if (!request.complete)
96
- await adam(request);
97
- const status = exception instanceof exceptions_1.Exception
110
+ if (!context.request.complete)
111
+ await adam(context.request);
112
+ response.statusCode = exception instanceof exceptions_1.Exception
98
113
  ? exception.status
99
114
  : 500;
100
- response.status(status);
101
115
  const message = {};
102
- const verbose = exception instanceof exceptions_1.ClientError || this.debug;
116
+ const verbose = exception instanceof exceptions_1.ClientError || this.properties.debug;
103
117
  if (verbose)
104
118
  message.body = exception instanceof exceptions_1.Exception
105
119
  ? exception.body
106
120
  : (exception.stack ?? exception.message);
107
- (0, messages_1.write)(request, response, message);
121
+ (0, messages_1.write)(context, response, message);
108
122
  };
109
123
  }
110
124
  }
111
125
  exports.Server = Server;
112
- function supportedMethods(methods) {
113
- return (req, res, next) => {
114
- if (methods.has(req.method))
115
- next();
116
- else
117
- res.sendStatus(501);
118
- };
119
- }
120
- function negotiate(request, message) {
121
- if (request.headers.accept !== undefined) {
122
- const match = SUBTYPE.exec(request.headers.accept);
123
- if (match !== null) {
124
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
125
- const { type, subtype, suffix } = match.groups;
126
- request.headers.accept = `${type}/${suffix}`;
127
- message.subtype = subtype;
128
- }
129
- }
130
- const negotiator = new negotiator_1.default(request);
131
- const mediaType = negotiator.mediaType(formats_1.types);
132
- message.encoder = mediaType === undefined ? null : formats_1.formats[mediaType];
133
- }
134
126
  // https://github.com/whatwg/fetch/issues/1254
135
127
  async function adam(request) {
136
128
  const completed = (0, generic_1.promex)();
@@ -138,12 +130,12 @@ async function adam(request) {
138
130
  request
139
131
  .on('end', completed.callback)
140
132
  .pipe(devnull);
141
- return await completed;
133
+ return completed;
142
134
  }
143
135
  const DEFAULTS = {
144
136
  methods: new Set(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']),
145
137
  debug: false,
138
+ trace: false,
146
139
  port: 8000
147
140
  };
148
- const SUBTYPE = /^(?<type>\w{1,32})\/(vnd\.toa\.(?<subtype>\S{1,32})\+)(?<suffix>\S{1,32})$/;
149
141
  //# sourceMappingURL=Server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Server.js","sourceRoot":"","sources":["../../source/HTTP/Server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Server.js","sourceRoot":"","sources":["../../source/HTTP/Server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /// <reference types="node" />
2
+ import type { ServerResponse } from 'node:http';
3
+ export declare class Timing {
4
+ private readonly skip;
5
+ private readonly start;
6
+ private readonly breakpoints;
7
+ constructor(enabled: boolean);
8
+ capture<T>(id: string, promise: Promise<T>): Promise<T>;
9
+ append(response: ServerResponse): void;
10
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Timing = void 0;
4
+ const node_perf_hooks_1 = require("node:perf_hooks");
5
+ class Timing {
6
+ skip;
7
+ start = node_perf_hooks_1.performance.now();
8
+ breakpoints = [];
9
+ constructor(enabled) {
10
+ this.skip = !enabled;
11
+ }
12
+ async capture(id, promise) {
13
+ if (this.skip)
14
+ return promise;
15
+ const start = node_perf_hooks_1.performance.now();
16
+ const result = promise instanceof Promise ? await promise : promise;
17
+ this.breakpoints.push({ id, duration: node_perf_hooks_1.performance.now() - start });
18
+ return result;
19
+ }
20
+ append(response) {
21
+ if (this.skip)
22
+ return;
23
+ this.breakpoints.push({ id: 'total', duration: node_perf_hooks_1.performance.now() - this.start });
24
+ for (const breakpoint of this.breakpoints)
25
+ response.appendHeader('server-timing', `${breakpoint.id};dur=${breakpoint.duration.toFixed(3)}`);
26
+ }
27
+ }
28
+ exports.Timing = Timing;
29
+ //# sourceMappingURL=Timing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Timing.js","sourceRoot":"","sources":["../../source/HTTP/Timing.ts"],"names":[],"mappings":";;;AAAA,qDAA6C;AAG7C,MAAa,MAAM;IACA,IAAI,CAAS;IACb,KAAK,GAAG,6BAAW,CAAC,GAAG,EAAE,CAAA;IACzB,WAAW,GAAiB,EAAE,CAAA;IAE/C,YAAoB,OAAgB;QAClC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAA;IACtB,CAAC;IAEM,KAAK,CAAC,OAAO,CAAK,EAAU,EAAE,OAAmB;QACtD,IAAI,IAAI,CAAC,IAAI;YACX,OAAO,OAAO,CAAA;QAEhB,MAAM,KAAK,GAAG,6BAAW,CAAC,GAAG,EAAE,CAAA;QAC/B,MAAM,MAAM,GAAG,OAAO,YAAY,OAAO,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA;QAEnE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,6BAAW,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAA;QAElE,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,MAAM,CAAE,QAAwB;QACrC,IAAI,IAAI,CAAC,IAAI;YACX,OAAM;QAER,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,6BAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;QAEhF,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW;YACvC,QAAQ,CAAC,YAAY,CAAC,eAAe,EACnC,GAAG,UAAU,CAAC,EAAE,QAAQ,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC/D,CAAC;CACF;AA/BD,wBA+BC"}
@@ -1,3 +1,4 @@
1
1
  export * from './Server';
2
2
  export * from './messages';
3
3
  export * from './exceptions';
4
+ export * from './Context';
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./Server"), exports);
18
18
  __exportStar(require("./messages"), exports);
19
19
  __exportStar(require("./exceptions"), exports);
20
+ __exportStar(require("./Context"), exports);
20
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../source/HTTP/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAwB;AACxB,6CAA0B;AAC1B,+CAA4B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../source/HTTP/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAwB;AACxB,6CAA0B;AAC1B,+CAA4B;AAC5B,4CAAyB"}
@@ -1,33 +1,19 @@
1
1
  /// <reference types="node" />
2
- import { type IncomingHttpHeaders } from 'node:http';
3
- import { type Request, type Response } from 'express';
4
- import type { ParsedQs } from 'qs';
5
- import type { Format } from './formats';
6
- export declare function write(request: IncomingMessage, response: Response, message: OutgoingMessage): void;
7
- export declare function read(request: Request): Promise<any>;
8
- export interface IncomingMessage extends Request {
9
- method: string;
10
- path: string;
11
- url: string;
12
- headers: IncomingHttpHeaders;
13
- query: Query;
14
- parse: <T>() => Promise<T>;
15
- encoder: Format | null;
16
- subtype: string | null;
17
- pipelines: {
18
- body: Array<(input: unknown) => unknown>;
19
- response: Array<(output: OutgoingMessage) => void>;
20
- };
21
- }
2
+ import type { Context } from './Context';
3
+ import type * as http from 'node:http';
4
+ export declare function write(context: Context, response: http.ServerResponse, message: OutgoingMessage): void;
5
+ export declare function read(context: Context): Promise<any>;
22
6
  export interface OutgoingMessage {
23
7
  status?: number;
24
8
  headers?: Headers;
25
9
  body?: any;
26
10
  }
27
- export interface Query extends ParsedQs {
11
+ export interface Query {
12
+ [key: string]: string | number | undefined;
28
13
  id?: string;
29
14
  criteria?: string;
30
15
  sort?: string;
31
16
  omit?: string;
32
17
  limit?: string;
18
+ version?: number;
33
19
  }