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

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 (152) 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/errors.feature +1 -1
  16. package/features/etag.feature +86 -0
  17. package/features/octets.entries.feature +1 -1
  18. package/features/steps/Gateway.ts +3 -0
  19. package/features/steps/components/echo/manifest.toa.yaml +1 -0
  20. package/features/steps/components/greeter/manifest.toa.yaml +1 -0
  21. package/features/steps/components/octets.tester/manifest.toa.yaml +1 -0
  22. package/features/steps/components/pots/manifest.toa.yaml +10 -3
  23. package/features/steps/components/sequences/manifest.toa.yaml +1 -0
  24. package/features/timing.feature +43 -0
  25. package/package.json +7 -10
  26. package/readme.md +7 -6
  27. package/schemas/annotation.cos.yaml +1 -0
  28. package/schemas/querystring.cos.yaml +1 -0
  29. package/source/Annotation.ts +1 -0
  30. package/source/Directive.test.ts +3 -3
  31. package/source/Directive.ts +11 -11
  32. package/source/Endpoint.ts +18 -4
  33. package/source/Factory.ts +8 -4
  34. package/source/Gateway.ts +55 -42
  35. package/source/HTTP/Context.ts +67 -0
  36. package/source/HTTP/Server.test.ts +1 -1
  37. package/source/HTTP/Server.ts +60 -95
  38. package/source/HTTP/Timing.ts +40 -0
  39. package/source/HTTP/index.ts +1 -0
  40. package/source/HTTP/messages.test.ts +27 -8
  41. package/source/HTTP/messages.ts +32 -48
  42. package/source/Mapping.ts +7 -8
  43. package/source/deployment.ts +6 -0
  44. package/source/directives/auth/Anonymous.ts +3 -2
  45. package/source/directives/auth/Authorization.ts +5 -3
  46. package/source/directives/auth/Incept.ts +11 -6
  47. package/source/directives/auth/Role.ts +5 -3
  48. package/source/directives/auth/Scheme.ts +2 -2
  49. package/source/directives/cache/Cache.ts +2 -2
  50. package/source/directives/cache/Control.ts +5 -5
  51. package/source/directives/cache/types.ts +1 -1
  52. package/source/directives/cors/CORS.ts +5 -3
  53. package/source/directives/octets/Context.ts +1 -1
  54. package/source/directives/octets/Delete.ts +19 -9
  55. package/source/directives/octets/Fetch.ts +29 -14
  56. package/source/directives/octets/List.ts +14 -6
  57. package/source/directives/octets/Octets.ts +4 -2
  58. package/source/directives/octets/Permute.ts +12 -6
  59. package/source/directives/octets/Store.ts +18 -16
  60. package/source/directives/octets/Workflow.ts +3 -3
  61. package/source/directives/octets/workflows/Workflow.ts +2 -2
  62. package/source/directives/vary/Vary.ts +1 -1
  63. package/source/directives/vary/embeddings/Header.ts +1 -1
  64. package/source/directives/vary/embeddings/Language.ts +1 -1
  65. package/source/io.ts +2 -2
  66. package/transpiled/Annotation.d.ts +1 -0
  67. package/transpiled/Directive.d.ts +6 -6
  68. package/transpiled/Directive.js +8 -8
  69. package/transpiled/Directive.js.map +1 -1
  70. package/transpiled/Endpoint.d.ts +3 -3
  71. package/transpiled/Endpoint.js +34 -1
  72. package/transpiled/Endpoint.js.map +1 -1
  73. package/transpiled/Factory.js +4 -2
  74. package/transpiled/Factory.js.map +1 -1
  75. package/transpiled/Gateway.d.ts +5 -6
  76. package/transpiled/Gateway.js +38 -32
  77. package/transpiled/Gateway.js.map +1 -1
  78. package/transpiled/HTTP/Context.d.ts +24 -0
  79. package/transpiled/HTTP/Context.js +47 -0
  80. package/transpiled/HTTP/Context.js.map +1 -0
  81. package/transpiled/HTTP/Server.d.ts +8 -7
  82. package/transpiled/HTTP/Server.js +68 -76
  83. package/transpiled/HTTP/Server.js.map +1 -1
  84. package/transpiled/HTTP/Timing.d.ts +10 -0
  85. package/transpiled/HTTP/Timing.js +29 -0
  86. package/transpiled/HTTP/Timing.js.map +1 -0
  87. package/transpiled/HTTP/index.d.ts +1 -0
  88. package/transpiled/HTTP/index.js +1 -0
  89. package/transpiled/HTTP/index.js.map +1 -1
  90. package/transpiled/HTTP/messages.d.ts +7 -21
  91. package/transpiled/HTTP/messages.js +24 -26
  92. package/transpiled/HTTP/messages.js.map +1 -1
  93. package/transpiled/Mapping.js +7 -7
  94. package/transpiled/Mapping.js.map +1 -1
  95. package/transpiled/deployment.js +5 -0
  96. package/transpiled/deployment.js.map +1 -1
  97. package/transpiled/directives/auth/Anonymous.js +3 -4
  98. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  99. package/transpiled/directives/auth/Authorization.js +1 -1
  100. package/transpiled/directives/auth/Authorization.js.map +1 -1
  101. package/transpiled/directives/auth/Incept.d.ts +1 -1
  102. package/transpiled/directives/auth/Incept.js +11 -6
  103. package/transpiled/directives/auth/Incept.js.map +1 -1
  104. package/transpiled/directives/auth/Role.js +5 -3
  105. package/transpiled/directives/auth/Role.js.map +1 -1
  106. package/transpiled/directives/auth/Scheme.js +2 -2
  107. package/transpiled/directives/auth/Scheme.js.map +1 -1
  108. package/transpiled/directives/cache/Cache.d.ts +1 -1
  109. package/transpiled/directives/cache/Cache.js +2 -2
  110. package/transpiled/directives/cache/Cache.js.map +1 -1
  111. package/transpiled/directives/cache/Control.d.ts +3 -3
  112. package/transpiled/directives/cache/Control.js +3 -3
  113. package/transpiled/directives/cache/Control.js.map +1 -1
  114. package/transpiled/directives/cache/types.d.ts +1 -1
  115. package/transpiled/directives/cors/CORS.js +4 -3
  116. package/transpiled/directives/cors/CORS.js.map +1 -1
  117. package/transpiled/directives/octets/Context.d.ts +1 -1
  118. package/transpiled/directives/octets/Context.js.map +1 -1
  119. package/transpiled/directives/octets/Delete.d.ts +1 -1
  120. package/transpiled/directives/octets/Delete.js +19 -9
  121. package/transpiled/directives/octets/Delete.js.map +1 -1
  122. package/transpiled/directives/octets/Fetch.d.ts +1 -1
  123. package/transpiled/directives/octets/Fetch.js +28 -14
  124. package/transpiled/directives/octets/Fetch.js.map +1 -1
  125. package/transpiled/directives/octets/List.d.ts +1 -1
  126. package/transpiled/directives/octets/List.js +13 -6
  127. package/transpiled/directives/octets/List.js.map +1 -1
  128. package/transpiled/directives/octets/Octets.js +4 -2
  129. package/transpiled/directives/octets/Octets.js.map +1 -1
  130. package/transpiled/directives/octets/Permute.d.ts +1 -1
  131. package/transpiled/directives/octets/Permute.js +11 -6
  132. package/transpiled/directives/octets/Permute.js.map +1 -1
  133. package/transpiled/directives/octets/Store.d.ts +1 -1
  134. package/transpiled/directives/octets/Store.js +11 -11
  135. package/transpiled/directives/octets/Store.js.map +1 -1
  136. package/transpiled/directives/octets/Workflow.d.ts +1 -1
  137. package/transpiled/directives/octets/Workflow.js +3 -3
  138. package/transpiled/directives/octets/Workflow.js.map +1 -1
  139. package/transpiled/directives/octets/workflows/Workflow.d.ts +1 -1
  140. package/transpiled/directives/octets/workflows/Workflow.js +2 -2
  141. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  142. package/transpiled/directives/vary/Vary.js +1 -1
  143. package/transpiled/directives/vary/embeddings/Header.js +1 -1
  144. package/transpiled/directives/vary/embeddings/Header.js.map +1 -1
  145. package/transpiled/directives/vary/embeddings/Language.js +1 -1
  146. package/transpiled/directives/vary/embeddings/Language.js.map +1 -1
  147. package/transpiled/io.d.ts +2 -2
  148. package/transpiled/tsconfig.tsbuildinfo +1 -1
  149. package/source/HTTP/Server.fixtures.ts +0 -40
  150. package/transpiled/HTTP/Server.fixtures.d.ts +0 -10
  151. package/transpiled/HTTP/Server.fixtures.js +0 -31
  152. package/transpiled/HTTP/Server.fixtures.js.map +0 -1
@@ -1,7 +1,31 @@
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
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.EndpointsFactory = exports.Endpoint = void 0;
4
27
  const Mapping_1 = require("./Mapping");
28
+ const http = __importStar(require("./HTTP"));
5
29
  class Endpoint {
6
30
  endpoint;
7
31
  mapping;
@@ -15,7 +39,16 @@ class Endpoint {
15
39
  async call(body, query, parameters) {
16
40
  const request = this.mapping.fit(body, query, parameters);
17
41
  this.remote ??= await this.discovery;
18
- return await this.remote.invoke(this.endpoint, request);
42
+ const reply = await this.remote.invoke(this.endpoint, request);
43
+ if (reply instanceof Error)
44
+ throw new http.Conflict(reply);
45
+ const message = { body: reply };
46
+ if (typeof reply === 'object' && reply !== null && '_version' in reply) {
47
+ message.headers ??= new Headers();
48
+ message.headers.set('etag', `"${reply._version.toString()}"`);
49
+ delete reply._version;
50
+ }
51
+ return message;
19
52
  }
20
53
  async close() {
21
54
  this.remote ??= await this.discovery;
@@ -1 +1 @@
1
- {"version":3,"file":"Endpoint.js","sourceRoot":"","sources":["../source/Endpoint.ts"],"names":[],"mappings":";;;AAEA,uCAAmC;AAKnC,MAAa,QAAQ;IACF,QAAQ,CAAQ;IAChB,OAAO,CAAS;IAChB,SAAS,CAAoB;IACtC,MAAM,GAAqB,IAAI,CAAA;IAEvC,YAAoB,QAAgB,EAAE,OAAgB,EAAE,SAA6B;QACnF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAEM,KAAK,CAAC,IAAI,CAAE,IAAS,EAAE,KAAiB,EAAE,UAA2B;QAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;QAEzD,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,SAAS,CAAA;QAEpC,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACzD,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,SAAS,CAAA;QAEpC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC;CACF;AAzBD,4BAyBC;AAED,MAAa,gBAAgB;IACV,OAAO,CAAS;IAEjC,YAAoB,OAAgB;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAEM,MAAM,CAAE,MAAyB,EAAE,OAAgB;QACxD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;YAC9B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;QAE5D,MAAM,OAAO,GAAG,iBAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACpD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,SAAS,CAAA;QAC1E,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,SAAS,CAAA;QAE1E,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;YACpD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;QAElE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAE7D,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;IAClE,CAAC;CACF;AAtBD,4CAsBC;AAED,MAAM,SAAS,GAAG,IAAI,CAAA"}
1
+ {"version":3,"file":"Endpoint.js","sourceRoot":"","sources":["../source/Endpoint.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,uCAAmC;AAEnC,6CAA8B;AAG9B,MAAa,QAAQ;IACF,QAAQ,CAAQ;IAChB,OAAO,CAAS;IAChB,SAAS,CAAoB;IACtC,MAAM,GAAqB,IAAI,CAAA;IAEvC,YAAoB,QAAgB,EAAE,OAAgB,EAAE,SAA6B;QACnF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAEM,KAAK,CAAC,IAAI,CAChB,IAAS,EAAE,KAAiB,EAAE,UAA2B;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;QAEzD,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,SAAS,CAAA;QAEpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAE9D,IAAI,KAAK,YAAY,KAAK;YACxB,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAEhC,MAAM,OAAO,GAAyB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;QAErD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;YACvE,OAAO,CAAC,OAAO,KAAK,IAAI,OAAO,EAAE,CAAA;YACjC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;YAC7D,OAAO,KAAK,CAAC,QAAQ,CAAA;QACvB,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,IAAI,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,SAAS,CAAA;QAEpC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;IACzC,CAAC;CACF;AAvCD,4BAuCC;AAED,MAAa,gBAAgB;IACV,OAAO,CAAS;IAEjC,YAAoB,OAAgB;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAEM,MAAM,CAAE,MAAyB,EAAE,OAAgB;QACxD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;YAC9B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAA;QAE5D,MAAM,OAAO,GAAG,iBAAO,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACpD,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,SAAS,CAAA;QAC1E,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,EAAE,SAAS,CAAA;QAE1E,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;YACpD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;QAElE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAE7D,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;IAClE,CAAC;CACF;AAtBD,4CAsBC;AAED,MAAM,SAAS,GAAG,IAAI,CAAA"}
@@ -46,8 +46,9 @@ class Factory {
46
46
  }
47
47
  service() {
48
48
  const debug = process.env.TOA_EXPOSITION_DEBUG === '1';
49
+ const trace = process.env.TOA_EXPOSITION_TRACE === '1';
49
50
  const broadcast = this.boot.bindings.broadcast(CHANNEL);
50
- const server = HTTP_1.Server.create({ methods: RTD_1.syntax.verbs, debug });
51
+ const server = HTTP_1.Server.create({ methods: RTD_1.syntax.verbs, debug, trace });
51
52
  const remotes = new Remotes_1.Remotes(this.boot);
52
53
  const node = root.resolve();
53
54
  const methods = new Endpoint_1.EndpointsFactory(remotes);
@@ -55,9 +56,10 @@ class Factory {
55
56
  const interception = new Interception_1.Interception(directives_1.interceptors);
56
57
  const tree = new RTD_1.Tree(node, methods, directives);
57
58
  const composition = new Composition_1.Composition(this.boot);
58
- const gateway = new Gateway_1.Gateway(broadcast, server, tree, interception);
59
+ const gateway = new Gateway_1.Gateway(broadcast, tree, interception);
59
60
  gateway.depends(remotes);
60
61
  gateway.depends(composition);
62
+ server.attach(gateway.process.bind(gateway));
61
63
  server.depends(gateway);
62
64
  return server;
63
65
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Factory.js","sourceRoot":"","sources":["../source/Factory.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,uCAAmC;AACnC,uCAAmC;AACnC,+BAAoC;AACpC,iCAA+B;AAC/B,yCAA4D;AAC5D,6CAAqD;AACrD,2CAAgE;AAChE,+CAA2C;AAC3C,6CAA8B;AAC9B,iDAA6C;AAG7C,MAAa,OAAO;IACD,IAAI,CAAY;IAEjC,YAAoB,IAAgB;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAEM,MAAM,CAAE,OAAgB,EAAE,IAAiB;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;QAEnE,OAAO,IAAI,eAAM,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IAC7C,CAAC;IAEM,OAAO;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG,CAAA;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QACvD,MAAM,MAAM,GAAG,aAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,YAAM,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QAC9D,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAC3B,MAAM,OAAO,GAAG,IAAI,2BAAgB,CAAC,OAAO,CAAC,CAAA;QAC7C,MAAM,UAAU,GAAG,IAAI,6BAAiB,CAAC,qBAAQ,EAAE,OAAO,CAAC,CAAA;QAC3D,MAAM,YAAY,GAAG,IAAI,2BAAY,CAAC,yBAAY,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,IAAI,UAAI,CAAuB,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;QAEtE,MAAM,WAAW,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;QAElE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACxB,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAC5B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAEvB,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAjCD,0BAiCC;AAED,MAAM,OAAO,GAAG,YAAY,CAAA"}
1
+ {"version":3,"file":"Factory.js","sourceRoot":"","sources":["../source/Factory.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAiC;AACjC,uCAAmC;AACnC,uCAAmC;AACnC,+BAAoC;AACpC,iCAA+B;AAC/B,yCAA4D;AAC5D,6CAAqD;AACrD,2CAAgE;AAChE,+CAA2C;AAC3C,6CAA8B;AAC9B,iDAA6C;AAI7C,MAAa,OAAO;IACD,IAAI,CAAY;IAEjC,YAAoB,IAAgB;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAEM,MAAM,CAAE,OAAgB,EAAE,IAAiB;QAChD,MAAM,SAAS,GAAc,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;QAE9E,OAAO,IAAI,eAAM,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IAC7C,CAAC;IAEM,OAAO;QACZ,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG,CAAA;QACtD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG,CAAA;QACtD,MAAM,SAAS,GAAc,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAClE,MAAM,MAAM,GAAG,aAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,YAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QACrE,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAA;QAC3B,MAAM,OAAO,GAAG,IAAI,2BAAgB,CAAC,OAAO,CAAC,CAAA;QAC7C,MAAM,UAAU,GAAG,IAAI,6BAAiB,CAAC,qBAAQ,EAAE,OAAO,CAAC,CAAA;QAC3D,MAAM,YAAY,GAAG,IAAI,2BAAY,CAAC,yBAAY,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,IAAI,UAAI,CAAuB,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;QAEtE,MAAM,WAAW,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,OAAO,GAAG,IAAI,iBAAO,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;QAE1D,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACxB,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAE5B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;QAC5C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAEvB,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AApCD,0BAoCC;AAED,MAAM,OAAO,GAAG,YAAY,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { type bindings, Connector } from '@toa.io/core';
2
2
  import * as http from './HTTP';
3
- import type { Interceptor } from './Interception';
3
+ import type { Interception } from './Interception';
4
4
  import type { Tree } from './RTD';
5
5
  import type { Label } from './discovery';
6
6
  import type { Endpoint } from './Endpoint';
@@ -9,14 +9,13 @@ export declare class Gateway extends Connector {
9
9
  private readonly broadcast;
10
10
  private readonly tree;
11
11
  private readonly interceptor;
12
- private readonly server;
13
- constructor(broadcast: Broadcast, server: http.Server, tree: Tree<Endpoint, Directives>, interception: Interceptor);
12
+ constructor(broadcast: Broadcast, tree: Tree<Endpoint, Directives>, interception: Interception);
13
+ process(context: http.Context): Promise<http.OutgoingMessage>;
14
14
  protected open(): Promise<void>;
15
15
  protected dispose(): void;
16
- private process;
17
16
  private call;
17
+ private query;
18
18
  private discover;
19
19
  private merge;
20
20
  }
21
- type Broadcast = bindings.Broadcast<Label>;
22
- export {};
21
+ export type Broadcast = bindings.Broadcast<Label>;
@@ -31,57 +31,62 @@ 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
+ // eslint-disable-next-line max-len
35
+ constructor(broadcast, tree, interception) {
37
36
  super();
38
37
  this.broadcast = broadcast;
39
38
  this.tree = tree;
40
39
  this.interceptor = interception;
41
- this.server = server;
42
40
  this.depends(broadcast);
43
- // this.depends(server)
44
- server.attach(this.process.bind(this));
45
41
  }
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);
42
+ async process(context) {
43
+ const interception = await context.timing.capture('gate:intercept', this.interceptor.intercept(context));
55
44
  if (interception !== null)
56
45
  return interception;
57
- const match = this.tree.match(request.path);
46
+ const match = this.tree.match(context.url.pathname);
58
47
  if (match === null)
59
48
  throw new http.NotFound();
60
49
  const { node, parameters } = match;
61
- if (!(request.method in node.methods))
50
+ if (!(context.request.method in node.methods))
62
51
  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);
52
+ const method = node.methods[context.request.method];
53
+ const interruption = await context.timing.capture('gate:preflight', method.directives.preflight(context, parameters));
54
+ const response = interruption ??
55
+ await context.timing.capture('gate:call', this.call(method, context, parameters));
56
+ await context.timing.capture('gate:settle', method.directives.settle(context, response));
67
57
  return response;
68
58
  }
69
- async call(method, request, parameters) {
70
- if (request.path[request.path.length - 1] !== '/')
59
+ async open() {
60
+ await this.discover();
61
+ console.info('Gateway has started and is awaiting resource branches.');
62
+ }
63
+ dispose() {
64
+ console.info('Gateway is closed.');
65
+ }
66
+ async call(method, context, parameters) {
67
+ if (context.url.pathname[context.url.pathname.length - 1] !== '/')
71
68
  throw new http.NotFound('Trailing slash is required.');
72
- if (request.encoder === null)
69
+ if (context.encoder === null)
73
70
  throw new http.NotAcceptable();
74
71
  if (method.endpoint === null)
75
72
  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)
73
+ const body = await context.body();
74
+ const query = this.query(context);
75
+ return await method.endpoint
76
+ .call(body, query, parameters)
81
77
  .catch(exceptions_1.rethrow);
82
- if (reply instanceof Error)
83
- throw new http.Conflict(reply);
84
- return { body: reply };
78
+ }
79
+ query(context) {
80
+ const query = Object.fromEntries(context.url.searchParams);
81
+ const etag = context.request.headers['if-match'];
82
+ if (etag !== undefined) {
83
+ const match = etag.match(ETAG);
84
+ if (match === null)
85
+ throw new http.BadRequest('Invalid ETag.');
86
+ else
87
+ query.version = parseInt(match.groups.version);
88
+ }
89
+ return query;
85
90
  }
86
91
  async discover() {
87
92
  await this.broadcast.receive('expose', this.merge.bind(this));
@@ -99,4 +104,5 @@ class Gateway extends core_1.Connector {
99
104
  }
100
105
  }
101
106
  exports.Gateway = Gateway;
107
+ const ETAG = /^"(?<version>\d{1,32})"$/;
102
108
  //# sourceMappingURL=Gateway.js.map
@@ -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
+ }