@toa.io/extensions.exposition 1.0.0-alpha.284 → 1.0.0-alpha.286

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 (620) hide show
  1. package/components/exposition.octets/operations/delete.js +1 -1
  2. package/components/exposition.octets/operations/get.js +5 -2
  3. package/components/exposition.octets/operations/head.js +1 -1
  4. package/components/exposition.octets/operations/put.js +29 -37
  5. package/components/exposition.octets/types/toa.d.ts +1 -1
  6. package/components/identity.bans/manifest.toa.yaml +12 -13
  7. package/components/identity.bans/migrations/0001-system-properties.yaml +14 -0
  8. package/components/identity.bans/operations/transit.js +1 -1
  9. package/components/identity.bans/source/transit.ts +1 -1
  10. package/components/identity.bans/tsconfig.tsbuildinfo +1 -1
  11. package/components/identity.bans/types/toa.d.ts +5 -5
  12. package/components/identity.basic/events/principal.js +3 -1
  13. package/components/identity.basic/manifest.toa.yaml +17 -23
  14. package/components/identity.basic/migrations/0001-system-properties.yaml +14 -0
  15. package/components/identity.basic/migrations/0002-indexes.yaml +13 -0
  16. package/components/identity.basic/operations/add.js +1 -1
  17. package/components/identity.basic/operations/authenticate.js +2 -2
  18. package/components/identity.basic/operations/check.js +4 -2
  19. package/components/identity.basic/operations/delete.js +1 -1
  20. package/components/identity.basic/operations/incept.js +1 -1
  21. package/components/identity.basic/operations/info.js +1 -1
  22. package/components/identity.basic/operations/lib/credentials.js +1 -1
  23. package/components/identity.basic/operations/transit.js +7 -8
  24. package/components/identity.basic/source/add.ts +5 -2
  25. package/components/identity.basic/source/authenticate.ts +11 -13
  26. package/components/identity.basic/source/check.ts +9 -6
  27. package/components/identity.basic/source/delete.ts +4 -1
  28. package/components/identity.basic/source/incept.ts +13 -10
  29. package/components/identity.basic/source/info.ts +4 -1
  30. package/components/identity.basic/source/lib/credentials.ts +2 -3
  31. package/components/identity.basic/source/transit.ts +27 -21
  32. package/components/identity.basic/tsconfig.tsbuildinfo +1 -1
  33. package/components/identity.basic/types/index.d.ts +7 -3
  34. package/components/identity.basic/types/toa.d.ts +5 -5
  35. package/components/identity.clients/manifest.toa.yaml +36 -40
  36. package/components/identity.clients/migrations/0001-system-properties.yaml +14 -0
  37. package/components/identity.clients/migrations/0002-indexes.yaml +4 -0
  38. package/components/identity.clients/operations/describe.js +1 -1
  39. package/components/identity.clients/operations/lib/canonical.js +1 -1
  40. package/components/identity.clients/operations/lib/cimd.js +3 -2
  41. package/components/identity.clients/operations/lib/redirect.js +7 -4
  42. package/components/identity.clients/operations/register.js +2 -2
  43. package/components/identity.clients/source/describe.ts +6 -8
  44. package/components/identity.clients/source/lib/Context.ts +6 -3
  45. package/components/identity.clients/source/lib/Entity.ts +1 -1
  46. package/components/identity.clients/source/lib/canonical.ts +1 -1
  47. package/components/identity.clients/source/lib/cimd.test.ts +8 -6
  48. package/components/identity.clients/source/lib/cimd.ts +24 -19
  49. package/components/identity.clients/source/lib/redirect.test.ts +8 -2
  50. package/components/identity.clients/source/lib/redirect.ts +12 -8
  51. package/components/identity.clients/source/register.ts +18 -18
  52. package/components/identity.clients/tsconfig.tsbuildinfo +1 -1
  53. package/components/identity.clients/types/toa.d.ts +5 -5
  54. package/components/identity.credentials/manifest.toa.yaml +4 -4
  55. package/components/identity.credentials/operations/list.js +8 -4
  56. package/components/identity.credentials/source/list.test.ts +39 -20
  57. package/components/identity.credentials/source/list.ts +12 -8
  58. package/components/identity.credentials/tsconfig.tsbuildinfo +1 -1
  59. package/components/identity.credentials/types/toa.d.ts +2 -2
  60. package/components/identity.federation/manifest.toa.yaml +23 -32
  61. package/components/identity.federation/migrations/0001-system-properties.yaml +14 -0
  62. package/components/identity.federation/migrations/0002-indexes.yaml +25 -0
  63. package/components/identity.federation/operations/authenticate.js +4 -2
  64. package/components/identity.federation/operations/create.js +2 -2
  65. package/components/identity.federation/operations/decode.js +1 -1
  66. package/components/identity.federation/operations/delete.js +1 -1
  67. package/components/identity.federation/operations/incept.js +1 -1
  68. package/components/identity.federation/operations/lib/decode.js +1 -1
  69. package/components/identity.federation/operations/lib/discovery.js +2 -2
  70. package/components/identity.federation/operations/lib/exchange.js +8 -4
  71. package/components/identity.federation/operations/lib/principal.js +1 -1
  72. package/components/identity.federation/operations/lib/resolve.js +1 -1
  73. package/components/identity.federation/operations/list.js +2 -2
  74. package/components/identity.federation/source/authenticate.ts +19 -17
  75. package/components/identity.federation/source/create.ts +6 -7
  76. package/components/identity.federation/source/decode.ts +4 -1
  77. package/components/identity.federation/source/delete.ts +4 -1
  78. package/components/identity.federation/source/incept.ts +2 -3
  79. package/components/identity.federation/source/lib/decode.ts +4 -7
  80. package/components/identity.federation/source/lib/discovery.test.ts +15 -5
  81. package/components/identity.federation/source/lib/discovery.ts +10 -9
  82. package/components/identity.federation/source/lib/exchange.ts +18 -15
  83. package/components/identity.federation/source/lib/jose.d.ts +1 -1
  84. package/components/identity.federation/source/lib/principal.ts +5 -3
  85. package/components/identity.federation/source/lib/resolve.ts +5 -1
  86. package/components/identity.federation/source/list.test.ts +26 -10
  87. package/components/identity.federation/source/list.ts +5 -2
  88. package/components/identity.federation/source/types/context.ts +5 -2
  89. package/components/identity.federation/source/types/entity.ts +2 -2
  90. package/components/identity.federation/tsconfig.tsbuildinfo +1 -1
  91. package/components/identity.federation/types/toa.d.ts +5 -5
  92. package/components/identity.grants/manifest.toa.yaml +27 -31
  93. package/components/identity.grants/migrations/0001-system-properties.yaml +14 -0
  94. package/components/identity.grants/migrations/0002-indexes.yaml +5 -0
  95. package/components/identity.grants/operations/authorize.js +1 -1
  96. package/components/identity.grants/operations/exchange.js +5 -2
  97. package/components/identity.grants/operations/lib/code.js +1 -1
  98. package/components/identity.grants/operations/lib/identify.js +1 -1
  99. package/components/identity.grants/operations/list.js +1 -1
  100. package/components/identity.grants/operations/revoke.js +3 -2
  101. package/components/identity.grants/source/authorize.ts +27 -19
  102. package/components/identity.grants/source/exchange.ts +15 -11
  103. package/components/identity.grants/source/lib/code.ts +20 -8
  104. package/components/identity.grants/source/lib/identify.ts +1 -1
  105. package/components/identity.grants/source/list.ts +2 -2
  106. package/components/identity.grants/source/revoke.ts +9 -7
  107. package/components/identity.grants/tsconfig.tsbuildinfo +1 -1
  108. package/components/identity.grants/types/index.d.ts +3 -3
  109. package/components/identity.grants/types/toa.d.ts +5 -5
  110. package/components/identity.keys/manifest.toa.yaml +18 -23
  111. package/components/identity.keys/migrations/0001-system-properties.yaml +14 -0
  112. package/components/identity.keys/migrations/0002-indexes.yaml +4 -0
  113. package/components/identity.keys/operations/create.js +1 -1
  114. package/components/identity.keys/operations/disable.js +1 -1
  115. package/components/identity.keys/operations/revoke.js +1 -1
  116. package/components/identity.keys/source/create.ts +2 -3
  117. package/components/identity.keys/source/disable.ts +1 -1
  118. package/components/identity.keys/source/revoke.ts +2 -2
  119. package/components/identity.keys/tsconfig.tsbuildinfo +1 -1
  120. package/components/identity.keys/types/toa.d.ts +5 -5
  121. package/components/identity.otp/manifest.toa.yaml +16 -24
  122. package/components/identity.otp/migrations/0001-system-properties.yaml +14 -0
  123. package/components/identity.otp/migrations/0002-indexes.yaml +5 -0
  124. package/components/identity.otp/operations/authenticate.js +1 -1
  125. package/components/identity.otp/operations/issue.js +1 -1
  126. package/components/identity.otp/source/authenticate.ts +4 -7
  127. package/components/identity.otp/source/issue.ts +1 -1
  128. package/components/identity.otp/source/lib/Context.ts +1 -1
  129. package/components/identity.otp/tsconfig.tsbuildinfo +1 -1
  130. package/components/identity.otp/types/toa.d.ts +5 -5
  131. package/components/identity.passkeys/manifest.toa.yaml +45 -53
  132. package/components/identity.passkeys/migrations/0001-system-properties.yaml +14 -0
  133. package/components/identity.passkeys/migrations/0002-indexes.yaml +11 -0
  134. package/components/identity.passkeys/operations/authenticate.js +1 -1
  135. package/components/identity.passkeys/operations/challenge.js +6 -3
  136. package/components/identity.passkeys/operations/create.js +1 -1
  137. package/components/identity.passkeys/operations/delete.js +1 -1
  138. package/components/identity.passkeys/operations/list.js +1 -1
  139. package/components/identity.passkeys/operations/use.js +1 -1
  140. package/components/identity.passkeys/source/authenticate.ts +3 -4
  141. package/components/identity.passkeys/source/challenge.ts +29 -25
  142. package/components/identity.passkeys/source/create.ts +8 -6
  143. package/components/identity.passkeys/source/delete.ts +4 -1
  144. package/components/identity.passkeys/source/list.ts +4 -1
  145. package/components/identity.passkeys/source/types/Context.ts +1 -1
  146. package/components/identity.passkeys/source/use.ts +12 -10
  147. package/components/identity.passkeys/tsconfig.tsbuildinfo +1 -1
  148. package/components/identity.passkeys/types/toa.d.ts +5 -5
  149. package/components/identity.roles/manifest.toa.yaml +12 -16
  150. package/components/identity.roles/migrations/0001-system-properties.yaml +14 -0
  151. package/components/identity.roles/migrations/0002-indexes.yaml +8 -0
  152. package/components/identity.roles/operations/grant.js +1 -1
  153. package/components/identity.roles/operations/list.js +1 -1
  154. package/components/identity.roles/operations/principal.js +2 -2
  155. package/components/identity.roles/source/grant.ts +7 -6
  156. package/components/identity.roles/source/list.ts +1 -1
  157. package/components/identity.roles/source/principal.ts +5 -7
  158. package/components/identity.roles/tsconfig.tsbuildinfo +1 -1
  159. package/components/identity.roles/types/toa.d.ts +5 -5
  160. package/components/identity.tokens/manifest.toa.yaml +17 -15
  161. package/components/identity.tokens/migrations/0001-system-properties.yaml +14 -0
  162. package/components/identity.tokens/operations/authenticate.js +2 -2
  163. package/components/identity.tokens/operations/decrypt.js +11 -5
  164. package/components/identity.tokens/operations/encrypt.js +2 -2
  165. package/components/identity.tokens/operations/issue.js +2 -4
  166. package/components/identity.tokens/operations/lib/form.js +1 -1
  167. package/components/identity.tokens/operations/lib/key.js +1 -1
  168. package/components/identity.tokens/operations/revoke.js +1 -1
  169. package/components/identity.tokens/source/authenticate.test.ts +22 -16
  170. package/components/identity.tokens/source/authenticate.ts +7 -10
  171. package/components/identity.tokens/source/decrypt.test.ts +62 -29
  172. package/components/identity.tokens/source/decrypt.ts +30 -27
  173. package/components/identity.tokens/source/encrypt.test.ts +21 -16
  174. package/components/identity.tokens/source/encrypt.ts +8 -11
  175. package/components/identity.tokens/source/issue.test.ts +4 -2
  176. package/components/identity.tokens/source/issue.ts +6 -8
  177. package/components/identity.tokens/source/lib/form.ts +5 -9
  178. package/components/identity.tokens/source/lib/jose.d.ts +1 -1
  179. package/components/identity.tokens/source/lib/key.ts +1 -1
  180. package/components/identity.tokens/source/lib/paseto.test.ts +17 -6
  181. package/components/identity.tokens/source/revoke.ts +1 -1
  182. package/components/identity.tokens/tsconfig.tsbuildinfo +1 -1
  183. package/components/identity.tokens/types/index.d.ts +13 -4
  184. package/components/identity.tokens/types/toa.d.ts +5 -5
  185. package/context.toa.yaml +2 -2
  186. package/cucumber.mjs +3 -0
  187. package/documentation/access.md +4 -3
  188. package/documentation/cache.md +17 -3
  189. package/documentation/components.md +2 -2
  190. package/documentation/credentials.md +2 -2
  191. package/documentation/identity.md +7 -9
  192. package/documentation/map.md +2 -2
  193. package/documentation/mcp.md +23 -17
  194. package/documentation/notes/peers.md +1 -1
  195. package/documentation/notes/throttling.md +1 -1
  196. package/documentation/octets.md +4 -4
  197. package/documentation/protocol.md +3 -3
  198. package/documentation/query.md +14 -8
  199. package/documentation/rpc.md +45 -31
  200. package/documentation/tracing.md +3 -3
  201. package/documentation/tree.md +1 -1
  202. package/features/auth.assert.feature +2 -2
  203. package/features/auth.bearer.feature +1 -1
  204. package/features/auth.claims.feature +5 -5
  205. package/features/auth.incept.feature +2 -2
  206. package/features/authorities.federation.feature +1 -1
  207. package/features/configuration.feature +3 -4
  208. package/features/credentials.feature +9 -9
  209. package/features/dev.feature +1 -0
  210. package/features/dynamic.feature +1 -0
  211. package/features/errors.feature +21 -0
  212. package/features/etag.feature +0 -86
  213. package/features/identity.bans.feature +3 -3
  214. package/features/identity.basic.feature +9 -9
  215. package/features/identity.federation.feature +11 -11
  216. package/features/identity.tokens.custom.feature +5 -5
  217. package/features/identity.tokens.feature +2 -2
  218. package/features/interruptions.feature +1 -0
  219. package/features/introspection.map.feature +4 -4
  220. package/features/io.throttle.feature +1 -0
  221. package/features/map.feature +2 -2
  222. package/features/mcp.feature +32 -28
  223. package/features/oauth.grants.feature +1 -1
  224. package/features/octets.cloudinary.feature +1 -1
  225. package/features/octets.download.feature +1 -0
  226. package/features/require.feature +1 -2
  227. package/features/rpc.feature +21 -21
  228. package/features/steps/Captures.ts +1 -1
  229. package/features/steps/Cloudinary.ts +1 -2
  230. package/features/steps/Common.ts +4 -5
  231. package/features/steps/Components.ts +17 -12
  232. package/features/steps/Database.ts +42 -23
  233. package/features/steps/Gateway.ts +55 -71
  234. package/features/steps/HTTP.ts +12 -15
  235. package/features/steps/IDP.ts +118 -94
  236. package/features/steps/Identity.ts +3 -3
  237. package/features/steps/OTP.ts +3 -3
  238. package/features/steps/Parameters.ts +20 -10
  239. package/features/steps/Probe.ts +9 -7
  240. package/features/steps/Realtime.ts +40 -22
  241. package/features/steps/Workspace.ts +10 -7
  242. package/features/steps/components/audit/operations/record.js +1 -1
  243. package/features/steps/components/echo/operations/affect.js +1 -1
  244. package/features/steps/components/echo/operations/compute.js +1 -1
  245. package/features/steps/components/echo/operations/echo.js +1 -1
  246. package/features/steps/components/echo/operations/error.js +1 -1
  247. package/features/steps/components/echo/operations/identity.js +1 -1
  248. package/features/steps/components/echo/operations/parameters.js +1 -1
  249. package/features/steps/components/echo/operations/ping.js +1 -1
  250. package/features/steps/components/echo/operations/unwrap.js +1 -1
  251. package/features/steps/components/greeter/operations/greet.js +1 -1
  252. package/features/steps/components/notify/operations/send.js +1 -1
  253. package/features/steps/components/octets.tester/operations/authority.js +1 -1
  254. package/features/steps/components/octets.tester/operations/bar.js +1 -1
  255. package/features/steps/components/octets.tester/operations/baz.js +1 -1
  256. package/features/steps/components/octets.tester/operations/concat.js +1 -1
  257. package/features/steps/components/octets.tester/operations/echo.js +1 -1
  258. package/features/steps/components/octets.tester/operations/err.js +1 -1
  259. package/features/steps/components/octets.tester/operations/foo.js +1 -1
  260. package/features/steps/components/octets.tester/operations/id.js +1 -1
  261. package/features/steps/components/octets.tester/operations/identity.js +1 -1
  262. package/features/steps/components/octets.tester/operations/redirect.js +6 -4
  263. package/features/steps/components/octets.tester/operations/yex.js +1 -1
  264. package/features/steps/components/octets.tester/operations/yield.js +1 -1
  265. package/features/steps/components/orders/manifest.toa.yaml +10 -12
  266. package/features/steps/components/orders/operations/create.js +4 -2
  267. package/features/steps/components/pots/manifest.toa.yaml +15 -20
  268. package/features/steps/components/pots/migrations/0002-indexes.yaml +4 -0
  269. package/features/steps/components/pricing/operations/quote.js +1 -1
  270. package/features/steps/components/sequences/manifest.toa.yaml +0 -1
  271. package/features/steps/components/sequences/operations/numbers.js +1 -1
  272. package/features/steps/components/sequences/operations/tokens.js +3 -3
  273. package/features/steps/components/users/manifest.toa.yaml +3 -5
  274. package/features/steps/components/users/operations/create.js +1 -1
  275. package/features/steps/components/users.properties/manifest.toa.yaml +5 -6
  276. package/features/steps/map.ts +2 -2
  277. package/features/timestamps.feature +1 -1
  278. package/package.json +7 -7
  279. package/readme.md +11 -11
  280. package/schemas/annotation.cos.yaml +1 -3
  281. package/schemas/method.cos.yaml +2 -0
  282. package/source/Branch.test.ts +2 -2
  283. package/source/Branch.ts +3 -5
  284. package/source/Composition.ts +5 -5
  285. package/source/Directive.test.ts +38 -20
  286. package/source/Directive.ts +61 -47
  287. package/source/Endpoint.test.ts +1 -1
  288. package/source/Endpoint.ts +27 -92
  289. package/source/Factory.ts +26 -12
  290. package/source/Gateway.ts +87 -76
  291. package/source/HTTP/Context.ts +23 -30
  292. package/source/HTTP/Probe.ts +7 -9
  293. package/source/HTTP/Server.ts +88 -69
  294. package/source/HTTP/Timing.ts +6 -21
  295. package/source/HTTP/address.test.ts +8 -2
  296. package/source/HTTP/address.ts +2 -3
  297. package/source/HTTP/exceptions.ts +20 -18
  298. package/source/HTTP/formats/form.ts +1 -1
  299. package/source/HTTP/formats/json.ts +2 -2
  300. package/source/HTTP/formats/msgpack.ts +3 -4
  301. package/source/HTTP/formats/text.ts +2 -2
  302. package/source/HTTP/formats/yaml.test.ts +4 -1
  303. package/source/HTTP/formats/yaml.ts +14 -11
  304. package/source/HTTP/messages.test.ts +38 -28
  305. package/source/HTTP/messages.ts +44 -98
  306. package/source/Interception.ts +3 -4
  307. package/source/Introspection.ts +29 -14
  308. package/source/MCP/Server.ts +114 -54
  309. package/source/MCP/discover.ts +6 -7
  310. package/source/MCP/errors.ts +7 -8
  311. package/source/MCP/schema.test.ts +9 -3
  312. package/source/MCP/schema.ts +12 -16
  313. package/source/MCP/tools.ts +33 -27
  314. package/source/MCP/types.ts +4 -1
  315. package/source/Mapping.ts +25 -27
  316. package/source/Query.ts +58 -44
  317. package/source/RPC/Context.ts +8 -11
  318. package/source/RPC/Dispatcher.ts +46 -26
  319. package/source/RPC/errors.test.ts +41 -16
  320. package/source/RPC/errors.ts +9 -10
  321. package/source/RPC/names.test.ts +51 -32
  322. package/source/RPC/names.ts +26 -32
  323. package/source/RTD/Directives.ts +21 -10
  324. package/source/RTD/Endpoint.ts +4 -1
  325. package/source/RTD/Method.ts +8 -6
  326. package/source/RTD/Node.ts +32 -34
  327. package/source/RTD/Route.ts +18 -21
  328. package/source/RTD/Tree.ts +18 -18
  329. package/source/RTD/factory.ts +13 -16
  330. package/source/RTD/segment.ts +12 -10
  331. package/source/RTD/syntax/parse.test.ts +12 -6
  332. package/source/RTD/syntax/parse.ts +30 -26
  333. package/source/RTD/syntax/types.ts +17 -1
  334. package/source/RTD/walk.test.ts +64 -27
  335. package/source/Remotes.test.ts +25 -4
  336. package/source/Remotes.ts +9 -4
  337. package/source/Tenant.ts +12 -12
  338. package/source/deployment.ts +20 -20
  339. package/source/directives/auth/Anonymous.test.ts +8 -2
  340. package/source/directives/auth/Anonymous.ts +5 -8
  341. package/source/directives/auth/Anyone.ts +3 -3
  342. package/source/directives/auth/Assert.ts +10 -10
  343. package/source/directives/auth/Authorization.ts +83 -69
  344. package/source/directives/auth/Delegate.test.ts +2 -2
  345. package/source/directives/auth/Delegate.ts +8 -10
  346. package/source/directives/auth/Echo.ts +5 -8
  347. package/source/directives/auth/Federation.ts +30 -21
  348. package/source/directives/auth/Id.ts +7 -4
  349. package/source/directives/auth/Incept.ts +32 -26
  350. package/source/directives/auth/Input.ts +36 -20
  351. package/source/directives/auth/Role.test.ts +49 -23
  352. package/source/directives/auth/Role.ts +29 -22
  353. package/source/directives/auth/Rule.ts +13 -8
  354. package/source/directives/auth/Scheme.ts +7 -7
  355. package/source/directives/auth/create.ts +1 -1
  356. package/source/directives/auth/schemes.ts +1 -1
  357. package/source/directives/auth/split.ts +2 -3
  358. package/source/directives/auth/types.ts +5 -2
  359. package/source/directives/cache/Cache.ts +44 -9
  360. package/source/directives/cache/Control.ts +25 -26
  361. package/source/directives/cache/Exact.ts +1 -1
  362. package/source/directives/cache/etag.ts +38 -0
  363. package/source/directives/cors/CORS.ts +9 -7
  364. package/source/directives/dev/Development.ts +3 -4
  365. package/source/directives/dev/Faulty.ts +11 -6
  366. package/source/directives/dev/Sleep.ts +5 -7
  367. package/source/directives/dev/Stub.ts +2 -2
  368. package/source/directives/dev/Throw.ts +2 -2
  369. package/source/directives/flow/Compose.ts +26 -20
  370. package/source/directives/flow/Fetch.ts +15 -15
  371. package/source/directives/flow/Flow.ts +9 -8
  372. package/source/directives/index.ts +11 -2
  373. package/source/directives/io/IO.ts +29 -20
  374. package/source/directives/io/Input.ts +9 -12
  375. package/source/directives/io/Output.ts +20 -23
  376. package/source/directives/io/Status.test.ts +12 -8
  377. package/source/directives/io/Status.ts +9 -8
  378. package/source/directives/io/Throttle.ts +6 -7
  379. package/source/directives/io/lib/throttle/Configuration.test.ts +32 -23
  380. package/source/directives/io/lib/throttle/Configuration.ts +14 -9
  381. package/source/directives/io/lib/throttle/Keys.ts +15 -10
  382. package/source/directives/io/lib/throttle/Quotas.test.ts +33 -17
  383. package/source/directives/io/lib/throttle/Quotas.ts +20 -26
  384. package/source/directives/io/lib/throttle/Sync.test.ts +14 -10
  385. package/source/directives/io/lib/throttle/Sync.ts +9 -12
  386. package/source/directives/io/lib/throttle/Warning.ts +3 -4
  387. package/source/directives/io/lib/throttle/components/IP.ts +4 -5
  388. package/source/directives/io/lib/throttle/components/Identity.ts +1 -1
  389. package/source/directives/io/lib/throttle/components/Path.ts +1 -1
  390. package/source/directives/io/lib/throttle/components/Route.ts +2 -2
  391. package/source/directives/io/lib/throttle/components/Segment.ts +2 -2
  392. package/source/directives/io/lib/throttle/conditions/Status.ts +2 -2
  393. package/source/directives/io/schemas.test.ts +12 -6
  394. package/source/directives/map/Authority.ts +2 -2
  395. package/source/directives/map/Buffer.ts +2 -2
  396. package/source/directives/map/Claims.ts +25 -20
  397. package/source/directives/map/Headers.ts +17 -13
  398. package/source/directives/map/Language.ts +8 -5
  399. package/source/directives/map/Languages.ts +9 -3
  400. package/source/directives/map/Map.ts +25 -12
  401. package/source/directives/map/Mapping.ts +9 -6
  402. package/source/directives/map/Properties.ts +1 -1
  403. package/source/directives/map/Segments.ts +22 -15
  404. package/source/directives/mcp/MCP.ts +14 -5
  405. package/source/directives/mcp/Tool.test.ts +42 -6
  406. package/source/directives/mcp/Tool.ts +38 -7
  407. package/source/directives/oauth/Discovery.ts +7 -11
  408. package/source/directives/oauth/documents.ts +11 -14
  409. package/source/directives/octets/Context.ts +6 -3
  410. package/source/directives/octets/Delete.ts +33 -25
  411. package/source/directives/octets/Directive.ts +5 -1
  412. package/source/directives/octets/Get.ts +13 -21
  413. package/source/directives/octets/Octets.ts +20 -15
  414. package/source/directives/octets/Put.ts +62 -27
  415. package/source/directives/octets/Workflow.ts +18 -12
  416. package/source/directives/octets/bytes.ts +1 -1
  417. package/source/directives/octets/schemas.test.ts +8 -14
  418. package/source/directives/octets/workflows/Execution.ts +19 -21
  419. package/source/directives/octets/workflows/Workflow.ts +10 -7
  420. package/source/directives/require/Headers.ts +3 -4
  421. package/source/directives/require/Require.ts +3 -4
  422. package/source/exceptions.ts +19 -12
  423. package/source/index.ts +1 -1
  424. package/source/manifest.test.ts +4 -1
  425. package/source/manifest.ts +19 -13
  426. package/source/octets.d.ts +1 -1
  427. package/source/root.ts +3 -2
  428. package/source/schemas.test.ts +17 -3
  429. package/transpiled/Branch.js.map +1 -1
  430. package/transpiled/Composition.js.map +1 -1
  431. package/transpiled/Directive.js +6 -2
  432. package/transpiled/Directive.js.map +1 -1
  433. package/transpiled/Endpoint.d.ts +0 -2
  434. package/transpiled/Endpoint.js +11 -52
  435. package/transpiled/Endpoint.js.map +1 -1
  436. package/transpiled/Factory.d.ts +2 -1
  437. package/transpiled/Factory.js +1 -0
  438. package/transpiled/Factory.js.map +1 -1
  439. package/transpiled/Gateway.d.ts +2 -1
  440. package/transpiled/Gateway.js +24 -15
  441. package/transpiled/Gateway.js.map +1 -1
  442. package/transpiled/HTTP/Context.d.ts +0 -3
  443. package/transpiled/HTTP/Context.js +7 -9
  444. package/transpiled/HTTP/Context.js.map +1 -1
  445. package/transpiled/HTTP/Probe.js.map +1 -1
  446. package/transpiled/HTTP/Server.js +19 -4
  447. package/transpiled/HTTP/Server.js.map +1 -1
  448. package/transpiled/HTTP/Timing.d.ts +1 -2
  449. package/transpiled/HTTP/Timing.js +2 -10
  450. package/transpiled/HTTP/Timing.js.map +1 -1
  451. package/transpiled/HTTP/address.js.map +1 -1
  452. package/transpiled/HTTP/exceptions.js.map +1 -1
  453. package/transpiled/HTTP/formats/form.js.map +1 -1
  454. package/transpiled/HTTP/formats/json.js.map +1 -1
  455. package/transpiled/HTTP/formats/msgpack.js.map +1 -1
  456. package/transpiled/HTTP/formats/text.js.map +1 -1
  457. package/transpiled/HTTP/formats/yaml.js +4 -1
  458. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  459. package/transpiled/HTTP/messages.d.ts +3 -2
  460. package/transpiled/HTTP/messages.js +1 -43
  461. package/transpiled/HTTP/messages.js.map +1 -1
  462. package/transpiled/Interception.js.map +1 -1
  463. package/transpiled/Introspection.d.ts +2 -0
  464. package/transpiled/Introspection.js +13 -2
  465. package/transpiled/Introspection.js.map +1 -1
  466. package/transpiled/MCP/Server.js +15 -4
  467. package/transpiled/MCP/Server.js.map +1 -1
  468. package/transpiled/MCP/discover.js.map +1 -1
  469. package/transpiled/MCP/errors.js.map +1 -1
  470. package/transpiled/MCP/schema.js +1 -1
  471. package/transpiled/MCP/schema.js.map +1 -1
  472. package/transpiled/MCP/tools.js +10 -6
  473. package/transpiled/MCP/tools.js.map +1 -1
  474. package/transpiled/MCP/types.d.ts +3 -1
  475. package/transpiled/Mapping.d.ts +2 -2
  476. package/transpiled/Mapping.js +3 -5
  477. package/transpiled/Mapping.js.map +1 -1
  478. package/transpiled/Query.d.ts +6 -2
  479. package/transpiled/Query.js +23 -8
  480. package/transpiled/Query.js.map +1 -1
  481. package/transpiled/RPC/Context.js +0 -7
  482. package/transpiled/RPC/Context.js.map +1 -1
  483. package/transpiled/RPC/Dispatcher.js +4 -1
  484. package/transpiled/RPC/Dispatcher.js.map +1 -1
  485. package/transpiled/RPC/errors.js.map +1 -1
  486. package/transpiled/RPC/names.d.ts +3 -2
  487. package/transpiled/RPC/names.js +1 -1
  488. package/transpiled/RPC/names.js.map +1 -1
  489. package/transpiled/RTD/Directives.d.ts +1 -1
  490. package/transpiled/RTD/Method.js +1 -3
  491. package/transpiled/RTD/Method.js.map +1 -1
  492. package/transpiled/RTD/Node.js +5 -4
  493. package/transpiled/RTD/Node.js.map +1 -1
  494. package/transpiled/RTD/Route.js +4 -1
  495. package/transpiled/RTD/Route.js.map +1 -1
  496. package/transpiled/RTD/Tree.js +1 -1
  497. package/transpiled/RTD/Tree.js.map +1 -1
  498. package/transpiled/RTD/factory.js.map +1 -1
  499. package/transpiled/RTD/segment.js.map +1 -1
  500. package/transpiled/RTD/syntax/parse.js.map +1 -1
  501. package/transpiled/RTD/syntax/types.d.ts +6 -0
  502. package/transpiled/RTD/syntax/types.js +10 -1
  503. package/transpiled/RTD/syntax/types.js.map +1 -1
  504. package/transpiled/Remotes.js.map +1 -1
  505. package/transpiled/Tenant.d.ts +1 -1
  506. package/transpiled/Tenant.js.map +1 -1
  507. package/transpiled/deployment.d.ts +3 -0
  508. package/transpiled/deployment.js +6 -1
  509. package/transpiled/deployment.js.map +1 -1
  510. package/transpiled/directives/auth/Anonymous.js +1 -3
  511. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  512. package/transpiled/directives/auth/Anyone.js.map +1 -1
  513. package/transpiled/directives/auth/Assert.js.map +1 -1
  514. package/transpiled/directives/auth/Authorization.js +7 -3
  515. package/transpiled/directives/auth/Authorization.js.map +1 -1
  516. package/transpiled/directives/auth/Delegate.js.map +1 -1
  517. package/transpiled/directives/auth/Echo.js +1 -3
  518. package/transpiled/directives/auth/Echo.js.map +1 -1
  519. package/transpiled/directives/auth/Federation.js +3 -7
  520. package/transpiled/directives/auth/Federation.js.map +1 -1
  521. package/transpiled/directives/auth/Id.js.map +1 -1
  522. package/transpiled/directives/auth/Incept.js +1 -1
  523. package/transpiled/directives/auth/Incept.js.map +1 -1
  524. package/transpiled/directives/auth/Input.js.map +1 -1
  525. package/transpiled/directives/auth/Role.js.map +1 -1
  526. package/transpiled/directives/auth/Rule.js.map +1 -1
  527. package/transpiled/directives/auth/Scheme.js +1 -2
  528. package/transpiled/directives/auth/Scheme.js.map +1 -1
  529. package/transpiled/directives/auth/create.js.map +1 -1
  530. package/transpiled/directives/auth/schemes.js.map +1 -1
  531. package/transpiled/directives/auth/split.js.map +1 -1
  532. package/transpiled/directives/auth/types.d.ts +3 -1
  533. package/transpiled/directives/cache/Cache.js +28 -2
  534. package/transpiled/directives/cache/Cache.js.map +1 -1
  535. package/transpiled/directives/cache/Control.js +1 -1
  536. package/transpiled/directives/cache/Control.js.map +1 -1
  537. package/transpiled/directives/cache/etag.d.ts +10 -0
  538. package/transpiled/directives/cache/etag.js +30 -0
  539. package/transpiled/directives/cache/etag.js.map +1 -0
  540. package/transpiled/directives/cors/CORS.js.map +1 -1
  541. package/transpiled/directives/dev/Development.js.map +1 -1
  542. package/transpiled/directives/dev/Faulty.js.map +1 -1
  543. package/transpiled/directives/dev/Sleep.js.map +1 -1
  544. package/transpiled/directives/dev/Stub.js.map +1 -1
  545. package/transpiled/directives/dev/Throw.js.map +1 -1
  546. package/transpiled/directives/flow/Compose.js +7 -3
  547. package/transpiled/directives/flow/Compose.js.map +1 -1
  548. package/transpiled/directives/flow/Fetch.js.map +1 -1
  549. package/transpiled/directives/flow/Flow.js.map +1 -1
  550. package/transpiled/directives/index.js +11 -1
  551. package/transpiled/directives/index.js.map +1 -1
  552. package/transpiled/directives/io/IO.d.ts +1 -1
  553. package/transpiled/directives/io/IO.js.map +1 -1
  554. package/transpiled/directives/io/Input.js +1 -1
  555. package/transpiled/directives/io/Input.js.map +1 -1
  556. package/transpiled/directives/io/Output.js +3 -3
  557. package/transpiled/directives/io/Output.js.map +1 -1
  558. package/transpiled/directives/io/Status.js.map +1 -1
  559. package/transpiled/directives/io/Throttle.js +1 -1
  560. package/transpiled/directives/io/Throttle.js.map +1 -1
  561. package/transpiled/directives/io/lib/throttle/Configuration.js +8 -2
  562. package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -1
  563. package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -1
  564. package/transpiled/directives/io/lib/throttle/Quotas.js +4 -3
  565. package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
  566. package/transpiled/directives/io/lib/throttle/Sync.d.ts +1 -1
  567. package/transpiled/directives/io/lib/throttle/Sync.js.map +1 -1
  568. package/transpiled/directives/io/lib/throttle/Warning.js.map +1 -1
  569. package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -1
  570. package/transpiled/directives/io/lib/throttle/components/Identity.js.map +1 -1
  571. package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -1
  572. package/transpiled/directives/io/lib/throttle/components/Route.js.map +1 -1
  573. package/transpiled/directives/io/lib/throttle/components/Segment.js.map +1 -1
  574. package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -1
  575. package/transpiled/directives/map/Authority.js.map +1 -1
  576. package/transpiled/directives/map/Buffer.js.map +1 -1
  577. package/transpiled/directives/map/Claims.js.map +1 -1
  578. package/transpiled/directives/map/Headers.js.map +1 -1
  579. package/transpiled/directives/map/Language.js.map +1 -1
  580. package/transpiled/directives/map/Languages.js.map +1 -1
  581. package/transpiled/directives/map/Map.js.map +1 -1
  582. package/transpiled/directives/map/Mapping.js.map +1 -1
  583. package/transpiled/directives/map/Properties.js.map +1 -1
  584. package/transpiled/directives/map/Segments.js.map +1 -1
  585. package/transpiled/directives/mcp/MCP.js +7 -1
  586. package/transpiled/directives/mcp/MCP.js.map +1 -1
  587. package/transpiled/directives/mcp/Tool.d.ts +6 -1
  588. package/transpiled/directives/mcp/Tool.js +16 -3
  589. package/transpiled/directives/mcp/Tool.js.map +1 -1
  590. package/transpiled/directives/oauth/Discovery.js.map +1 -1
  591. package/transpiled/directives/oauth/documents.js.map +1 -1
  592. package/transpiled/directives/octets/Context.js +1 -1
  593. package/transpiled/directives/octets/Context.js.map +1 -1
  594. package/transpiled/directives/octets/Delete.js.map +1 -1
  595. package/transpiled/directives/octets/Directive.js.map +1 -1
  596. package/transpiled/directives/octets/Get.js.map +1 -1
  597. package/transpiled/directives/octets/Octets.js +1 -1
  598. package/transpiled/directives/octets/Octets.js.map +1 -1
  599. package/transpiled/directives/octets/Put.js.map +1 -1
  600. package/transpiled/directives/octets/Workflow.js.map +1 -1
  601. package/transpiled/directives/octets/bytes.js.map +1 -1
  602. package/transpiled/directives/octets/workflows/Execution.js +1 -2
  603. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  604. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  605. package/transpiled/directives/require/Headers.js.map +1 -1
  606. package/transpiled/directives/require/Require.js.map +1 -1
  607. package/transpiled/exceptions.js.map +1 -1
  608. package/transpiled/index.d.ts +1 -1
  609. package/transpiled/index.js +1 -1
  610. package/transpiled/index.js.map +1 -1
  611. package/transpiled/manifest.js +5 -1
  612. package/transpiled/manifest.js.map +1 -1
  613. package/transpiled/root.js.map +1 -1
  614. package/tsconfig.tsbuildinfo +1 -1
  615. package/CHANGELOG.md +0 -541
  616. package/source/redact.test.ts +0 -27
  617. package/source/redact.ts +0 -21
  618. package/transpiled/redact.d.ts +0 -5
  619. package/transpiled/redact.js +0 -17
  620. package/transpiled/redact.js.map +0 -1
@@ -27,32 +27,35 @@ export class Server extends Connector {
27
27
 
28
28
  private process?: Processor
29
29
 
30
- private constructor (properties: Properties) {
30
+ private constructor(properties: Properties) {
31
31
  super()
32
32
 
33
33
  this.properties = properties
34
- this.authorities = new Map(Object.entries(properties.authorities).map(([key, value]) => [value, key]))
34
+ this.authorities = new Map(
35
+ Object.entries(properties.authorities).map(([key, value]) => [value, key])
36
+ )
35
37
  this.server = instantiate(properties.protocol)
36
38
  this.probe = new Probe(properties.probe)
37
39
 
38
40
  this.server.on('request', (req, res) =>
39
- this.listener(req as unknown as IncomingMessage, res as unknown as ServerResponse))
41
+ this.listener(req as unknown as IncomingMessage, res as unknown as ServerResponse)
42
+ )
40
43
 
41
44
  if (properties.protocol === 'h1') this.h1(this.server as http.Server)
42
45
  else this.h2(this.server as http2.Http2Server)
43
46
  }
44
47
 
45
- public static create (options: Options): Server {
48
+ public static create(options: Options): Server {
46
49
  const properties: Properties = { ...DEFAULTS, ...options }
47
50
 
48
51
  return new Server(properties)
49
52
  }
50
53
 
51
- public attach (process: Processor): void {
54
+ public attach(process: Processor): void {
52
55
  this.process = process
53
56
  }
54
57
 
55
- protected override async open (): Promise<void> {
58
+ protected override async open(): Promise<void> {
56
59
  // answers 503 from here; the gateway's dependencies have settled by the time `open` runs
57
60
  await this.probe.listen()
58
61
 
@@ -67,7 +70,7 @@ export class Server extends Connector {
67
70
  console.info('Ready')
68
71
  }
69
72
 
70
- protected override async close (): Promise<void> {
73
+ protected override async close(): Promise<void> {
71
74
  await this.probe.close()
72
75
 
73
76
  this.server.close()
@@ -75,8 +78,7 @@ export class Server extends Connector {
75
78
  // GOAWAY lets in-flight streams finish; `Http2Server` has no `closeIdleConnections`
76
79
  if (this.properties.protocol === 'h1')
77
80
  (this.server as http.Server).closeIdleConnections()
78
- else
79
- for (const session of this.sessions) session.close()
81
+ else for (const session of this.sessions) session.close()
80
82
 
81
83
  console.info('Stopped accepting new connections')
82
84
 
@@ -88,14 +90,13 @@ export class Server extends Connector {
88
90
 
89
91
  if (this.properties.protocol === 'h1')
90
92
  (this.server as http.Server).closeAllConnections()
91
- else
92
- for (const session of this.sessions) session.destroy()
93
+ else for (const session of this.sessions) session.destroy()
93
94
 
94
95
  console.info('Stopped')
95
96
  }
96
97
 
97
98
  /** A malformed HTTP/1.1 request has no framing to answer in, so the status line is written by hand. */
98
- private h1 (server: http.Server): void {
99
+ private h1(server: http.Server): void {
99
100
  server.on('clientError', (error, socket) => {
100
101
  console.warn('Client connection error', error)
101
102
 
@@ -105,7 +106,7 @@ export class Server extends Connector {
105
106
  }
106
107
 
107
108
  /** HTTP/2 has no `clientError`: failures surface per session, per stream, or per frame. */
108
- private h2 (server: http2.Http2Server): void {
109
+ private h2(server: http2.Http2Server): void {
109
110
  server.on('session', (session) => {
110
111
  this.sessions.add(session)
111
112
  session.on('close', () => this.sessions.delete(session))
@@ -120,12 +121,11 @@ export class Server extends Connector {
120
121
  })
121
122
  }
122
123
 
123
- private listener (request: IncomingMessage, response: ServerResponse): void {
124
+ private listener(request: IncomingMessage, response: ServerResponse): void {
124
125
  request.once('error', (error) => {
125
126
  console.warn('Request error', errorAttributes(request, error))
126
127
 
127
- if (!response.writableEnded)
128
- response.destroy()
128
+ if (!response.writableEnded) response.destroy()
129
129
  })
130
130
 
131
131
  // no listener on `request.socket`: under HTTP/2 it is the session's socket, shared by
@@ -134,7 +134,10 @@ export class Server extends Connector {
134
134
  const host = authorityOf(request)?.toLowerCase()
135
135
 
136
136
  if (host === undefined || !HOST.test(host)) {
137
- console.warn('Request without a valid authority', errorAttributes(request, new Error('Invalid authority')))
137
+ console.warn(
138
+ 'Request without a valid authority',
139
+ errorAttributes(request, new Error('Invalid authority'))
140
+ )
138
141
 
139
142
  response.writeHead(400).end()
140
143
 
@@ -168,53 +171,55 @@ export class Server extends Connector {
168
171
  // if the request carries no trace context, the trace starts here
169
172
  const remote = trace(request.headers)
170
173
 
171
- const processing = remote === null
172
- ? this.serve(request, response, authority, url)
173
- : run(remote, async () => await this.serve(request, response, authority, url))
174
+ const processing =
175
+ remote === null
176
+ ? this.serve(request, response, authority, url)
177
+ : run(remote, async () => await this.serve(request, response, authority, url))
174
178
 
175
179
  processing.catch((error) => {
176
180
  console.error('Request processing failed', error)
177
181
 
178
- if (!response.writableEnded)
179
- response.writeHead(500).end()
182
+ if (!response.writableEnded) response.writeHead(500).end()
180
183
  })
181
184
  }
182
185
 
183
186
  // eslint-disable-next-line max-params
184
- private async serve (request: IncomingMessage,
187
+ private async serve(
188
+ request: IncomingMessage,
185
189
  response: ServerResponse,
186
190
  authority: string,
187
- url: URL): Promise<void> {
188
- await console.span({
189
- name: `${request.method} ${request.url}`,
190
- kind: 'server',
191
- service: 'exposition',
192
- attributes: { method: request.method, url: request.url, authority }
193
- }, async () => {
194
- response.setHeader('ray', current()!.traceId)
195
-
196
- const context = new Context(authority, request, this.properties, url)
197
-
198
- await this.process!(context)
199
- .then(this.success(context, response))
200
- .catch(this.fail(context, response))
201
- .finally(() => request.removeAllListeners('error'))
202
- })
191
+ url: URL
192
+ ): Promise<void> {
193
+ await console.span(
194
+ {
195
+ name: `${request.method} ${request.url}`,
196
+ kind: 'server',
197
+ service: 'exposition',
198
+ attributes: { method: request.method, url: request.url, authority }
199
+ },
200
+ async () => {
201
+ response.setHeader('ray', current()!.traceId)
202
+
203
+ const context = new Context(authority, request, this.properties, url)
204
+
205
+ await this.process!(context)
206
+ .then(this.success(context, response))
207
+ .catch(this.fail(context, response))
208
+ .finally(() => request.removeAllListeners('error'))
209
+ }
210
+ )
203
211
  }
204
212
 
205
- private success (context: Context, response: ServerResponse) {
213
+ private success(context: Context, response: ServerResponse) {
206
214
  return async (message: OutgoingMessage) => {
207
215
  let status = message.status
208
216
 
209
217
  if (status === undefined)
210
- if (message.body === null)
211
- status = 404
212
- else if (context.request.method === 'POST')
213
- status = 201
218
+ if (message.body === null) status = 404
219
+ else if (context.request.method === 'POST') status = 201
214
220
  else if (message.body === undefined && context.request.method !== 'HEAD')
215
221
  status = 204
216
- else
217
- status = 200
222
+ else status = 200
218
223
 
219
224
  message.status = status
220
225
 
@@ -222,7 +227,7 @@ export class Server extends Connector {
222
227
  }
223
228
  }
224
229
 
225
- private fail (context: Context, response: ServerResponse) {
230
+ private fail(context: Context, response: ServerResponse) {
226
231
  return async (exception: Error) => {
227
232
  try {
228
233
  // Over HTTP/2 the reply is followed by RST_STREAM(NO_ERROR), which tells the client
@@ -234,26 +239,27 @@ export class Server extends Connector {
234
239
  const span = current()
235
240
 
236
241
  // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status
237
- if (status >= 500 && span !== undefined)
238
- span.status = 'error'
242
+ if (status >= 500 && span !== undefined) span.status = 'error'
239
243
 
240
244
  if (!response.writableEnded) {
241
245
  response.statusCode = status
242
246
 
243
- const message: OutgoingMessage = { status: response.statusCode, authentic: true }
247
+ const message: OutgoingMessage = {
248
+ status: response.statusCode,
249
+ authentic: true
250
+ }
244
251
 
245
252
  // eslint-disable-next-line max-depth
246
253
  if (exception instanceof Exception && exception.headers !== undefined)
247
254
  message.headers = exception.headers
248
255
 
249
256
  // eslint-disable-next-line max-depth
250
- if (context.encoder === null)
251
- message.body = undefined
257
+ if (context.encoder === null) message.body = undefined
252
258
  else if (exception instanceof ClientError || this.properties.debug)
253
259
  message.body =
254
260
  exception instanceof Exception
255
261
  ? exception.body
256
- : (this.properties.debug && exception.stack) ?? exception.message
262
+ : ((this.properties.debug && exception.stack) ?? exception.message)
257
263
 
258
264
  await write(context, response, message)
259
265
  }
@@ -271,9 +277,8 @@ export class Server extends Connector {
271
277
  }
272
278
  }
273
279
 
274
- function instantiate (protocol: Protocol): http.Server | http2.Http2Server {
275
- if (protocol === 'h1')
276
- return http.createServer()
280
+ function instantiate(protocol: Protocol): http.Server | http2.Http2Server {
281
+ if (protocol === 'h1') return http.createServer()
277
282
 
278
283
  return http2.createServer({
279
284
  // realtime pins one stream per subscription, and they all share a session
@@ -286,12 +291,12 @@ function instantiate (protocol: Protocol): http.Server | http2.Http2Server {
286
291
  * The authority the request is addressed to. HTTP/2 carries it in `:authority` and omits
287
292
  * `host` entirely, so reading `host` alone would leave every HTTP/2 request unattributed.
288
293
  */
289
- function authorityOf (request: IncomingMessage): string | undefined {
294
+ function authorityOf(request: IncomingMessage): string | undefined {
290
295
  return request.headers[':authority'] ?? request.headers.host
291
296
  }
292
297
 
293
298
  /** Parsing the URL is how a request is validated, so the `Context` is handed the result. */
294
- function parse (request: IncomingMessage, authority: string): URL | Error {
299
+ function parse(request: IncomingMessage, authority: string): URL | Error {
295
300
  try {
296
301
  return new URL(request.url, `https://${authority}`)
297
302
  } catch (error) {
@@ -300,7 +305,7 @@ function parse (request: IncomingMessage, authority: string): URL | Error {
300
305
  }
301
306
 
302
307
  // https://github.com/whatwg/fetch/issues/1254
303
- async function adam (request: IncomingMessage): Promise<void> {
308
+ async function adam(request: IncomingMessage): Promise<void> {
304
309
  const devnull = fs.createWriteStream(os.devNull)
305
310
 
306
311
  devnull.on('error', () => undefined)
@@ -309,18 +314,19 @@ async function adam (request: IncomingMessage): Promise<void> {
309
314
  await once(request, 'end')
310
315
  }
311
316
 
312
- function errorAttributes (request: IncomingMessage, error: Error & any): RequestErrorAttributes {
317
+ function errorAttributes(
318
+ request: IncomingMessage,
319
+ error: Error & any
320
+ ): RequestErrorAttributes {
313
321
  const attributes: RequestErrorAttributes = {
314
322
  path: request.url,
315
323
  method: request.method,
316
324
  name: error.name
317
325
  }
318
326
 
319
- if (typeof error.code === 'string')
320
- attributes.code = error.code
327
+ if (typeof error.code === 'string') attributes.code = error.code
321
328
 
322
- if (typeof error.stack === 'string')
323
- attributes.stack = error.stack
329
+ if (typeof error.stack === 'string') attributes.stack = error.stack
324
330
 
325
331
  return attributes
326
332
  }
@@ -341,12 +347,15 @@ const WINDOW = 1024 * 1024
341
347
  * The `ray` header adopts the trace by ID only and does not bypass sampling:
342
348
  * the sampling decision is made by the server.
343
349
  */
344
- function trace (headers: IncomingMessage['headers']): SpanContext | null {
345
- if (typeof headers.traceparent === 'string')
346
- return decode(headers.traceparent)
350
+ function trace(headers: IncomingMessage['headers']): SpanContext | null {
351
+ if (typeof headers.traceparent === 'string') return decode(headers.traceparent)
347
352
 
348
353
  // adopting a trace by ID does not bypass sampling
349
- if (typeof headers.ray === 'string' && RAY.test(headers.ray) && headers.ray !== ZERO_RAY)
354
+ if (
355
+ typeof headers.ray === 'string' &&
356
+ RAY.test(headers.ray) &&
357
+ headers.ray !== ZERO_RAY
358
+ )
350
359
  return { traceId: headers.ray.toLowerCase(), sampled: decide() }
351
360
 
352
361
  return null
@@ -362,7 +371,17 @@ const RAY = /^[\da-f]{32}$/i
362
371
  const ZERO_RAY = '0'.repeat(32)
363
372
 
364
373
  const DEFAULTS: Omit<Properties, 'authorities'> = {
365
- methods: new Set<string>(['OPTIONS', 'GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'LOCK', 'UNLOCK']),
374
+ methods: new Set<string>([
375
+ 'OPTIONS',
376
+ 'GET',
377
+ 'HEAD',
378
+ 'POST',
379
+ 'PUT',
380
+ 'PATCH',
381
+ 'DELETE',
382
+ 'LOCK',
383
+ 'UNLOCK'
384
+ ]),
366
385
  debug: false,
367
386
  port: PORT,
368
387
  drain: DRAIN * 1000,
@@ -1,29 +1,14 @@
1
1
  import { performance } from 'node:perf_hooks'
2
2
  import type { ServerResponse } from './types.js'
3
3
 
4
+ /** How long the request took, from received to written: one number, the header's. */
4
5
  export class Timing {
5
6
  private readonly start = performance.now()
6
- private readonly breakpoints: Breakpoint[] = []
7
7
 
8
- public async capture<T>(id: string, promise: Promise<T>): Promise<T> {
9
- const start = performance.now()
10
- const result = promise instanceof Promise ? await promise : promise
11
-
12
- this.breakpoints.push({ id, duration: performance.now() - start })
13
-
14
- return result
8
+ public append(response: ServerResponse): void {
9
+ response.setHeader(
10
+ 'server-timing',
11
+ `total;dur=${(performance.now() - this.start).toFixed(3)}`
12
+ )
15
13
  }
16
-
17
- public append (response: ServerResponse): void {
18
- this.breakpoints.push({ id: 'total', duration: performance.now() - this.start })
19
-
20
- for (const breakpoint of this.breakpoints)
21
- response.appendHeader('server-timing',
22
- `${breakpoint.id};dur=${breakpoint.duration.toFixed(3)}`)
23
- }
24
- }
25
-
26
- interface Breakpoint {
27
- id: string
28
- duration: number
29
14
  }
@@ -12,8 +12,14 @@ it('should be nothing without a header named', () => {
12
12
  })
13
13
 
14
14
  it('should be the last value of the named header', () => {
15
- assert.equal(address(request({ 'x-forwarded-for': '1.1.1.1, 2.2.2.2' }), 'x-forwarded-for'), '2.2.2.2')
16
- assert.equal(address(request({ 'cf-connecting-ip': '3.3.3.3' }), 'cf-connecting-ip'), '3.3.3.3')
15
+ assert.equal(
16
+ address(request({ 'x-forwarded-for': '1.1.1.1, 2.2.2.2' }), 'x-forwarded-for'),
17
+ '2.2.2.2'
18
+ )
19
+ assert.equal(
20
+ address(request({ 'cf-connecting-ip': '3.3.3.3' }), 'cf-connecting-ip'),
21
+ '3.3.3.3'
22
+ )
17
23
  })
18
24
 
19
25
  it('should be nothing when the named header is absent or empty', () => {
@@ -5,9 +5,8 @@ import type { IncomingMessage } from './types.js'
5
5
  * Of a header holding a list, the last value is the one the edge in front appended. The
6
6
  * connection's address is never it: behind an edge it is the edge's.
7
7
  */
8
- export function address (request: IncomingMessage, header?: string): string | undefined {
9
- if (header === undefined)
10
- return
8
+ export function address(request: IncomingMessage, header?: string): string | undefined {
9
+ if (header === undefined) return
11
10
 
12
11
  const value = request.headers[header]
13
12
  const raw = Array.isArray(value) ? value[value.length - 1] : value
@@ -5,7 +5,7 @@ export class Exception extends Error {
5
5
  /** Headers the status is not complete without, like `Retry-After` on a 429. */
6
6
  public readonly headers?: Headers
7
7
 
8
- protected constructor (status: number, body?: any, headers?: Headers) {
8
+ protected constructor(status: number, body?: any, headers?: Headers) {
9
9
  super()
10
10
  this.status = status
11
11
  this.body = body
@@ -13,85 +13,87 @@ export class Exception extends Error {
13
13
  }
14
14
  }
15
15
 
16
- export class ClientError extends Exception {
17
- }
16
+ export class ClientError extends Exception {}
18
17
 
19
18
  export class BadRequest extends ClientError {
20
- public constructor (body?: any) {
19
+ public constructor(body?: any) {
21
20
  super(400, body)
22
21
  }
23
22
  }
24
23
 
25
24
  export class Unauthorized extends ClientError {
26
- public constructor (body?: any) {
25
+ public constructor(body?: any) {
27
26
  super(401, body)
28
27
  }
29
28
  }
30
29
 
31
30
  export class Forbidden extends ClientError {
32
- public constructor (body?: any) {
31
+ public constructor(body?: any) {
33
32
  super(403, body)
34
33
  }
35
34
  }
36
35
 
37
36
  export class NotFound extends ClientError {
38
- public constructor (body?: any) {
37
+ public constructor(body?: any) {
39
38
  super(404, body)
40
39
  }
41
40
  }
42
41
 
43
42
  export class MethodNotAllowed extends ClientError {
44
- public constructor (headers?: Headers) {
43
+ public constructor(headers?: Headers) {
45
44
  super(405, undefined, headers)
46
45
  }
47
46
  }
48
47
 
49
48
  export class NotAcceptable extends ClientError {
50
- public constructor () {
49
+ public constructor() {
51
50
  super(406)
52
51
  }
53
52
  }
54
53
 
55
54
  export class Conflict extends ClientError {
56
- public constructor (body?: any) {
55
+ public constructor(body?: any) {
57
56
  super(409, body)
58
57
  }
59
58
  }
60
59
 
61
60
  export class PreconditionFailed extends ClientError {
62
- public constructor () {
61
+ public constructor() {
63
62
  super(412)
64
63
  }
65
64
  }
66
65
 
67
66
  export class RequestEntityTooLarge extends ClientError {
68
- public constructor (body?: any) {
67
+ public constructor(body?: any) {
69
68
  super(413, body)
70
69
  }
71
70
  }
72
71
 
73
72
  export class UnsupportedMediaType extends ClientError {
74
- public constructor () {
73
+ public constructor() {
75
74
  super(415)
76
75
  }
77
76
  }
78
77
 
79
78
  export class UnprocessableEntity extends ClientError {
80
- public constructor (body?: any) {
79
+ public constructor(body?: any) {
81
80
  super(422, body)
82
81
  }
83
82
  }
84
83
 
85
84
  export class TooManyRequests extends ClientError {
86
85
  /** @param retry Seconds until the request would be admitted. */
87
- public constructor (retry?: number) {
88
- super(429, undefined,
89
- retry === undefined ? undefined : new Headers({ 'retry-after': String(retry) }))
86
+ public constructor(retry?: number) {
87
+ super(
88
+ 429,
89
+ undefined,
90
+ retry === undefined ? undefined : new Headers({ 'retry-after': String(retry) })
91
+ )
90
92
  }
91
93
  }
92
94
 
93
95
  export class ServiceUnavailable extends Exception {
94
- public constructor (body?: any) {
96
+ public constructor(body?: any) {
95
97
  super(503, body)
96
98
  }
97
99
  }
@@ -7,7 +7,7 @@ export const type = 'application/x-www-form-urlencoded'
7
7
  * A name repeated in a form is a list, which is how a form says one — `URLSearchParams` keeps
8
8
  * every value, and a name given once stays the string it was written as.
9
9
  */
10
- export function decode (buffer: Buffer, charset = 'utf-8'): any {
10
+ export function decode(buffer: Buffer, charset = 'utf-8'): any {
11
11
  const params = new URLSearchParams(buffer.toString(charset as BufferEncoding))
12
12
  const value: Record<string, string | string[]> = {}
13
13
 
@@ -1,13 +1,13 @@
1
1
  export const type = 'application/json'
2
2
  export const multipart = 'multipart/json'
3
3
 
4
- export function decode (buffer: Buffer, charset = 'utf-8'): any {
4
+ export function decode(buffer: Buffer, charset = 'utf-8'): any {
5
5
  const text = buffer.toString(charset as BufferEncoding)
6
6
 
7
7
  return JSON.parse(text)
8
8
  }
9
9
 
10
- export function encode (value: any): Buffer {
10
+ export function encode(value: any): Buffer {
11
11
  const text = JSON.stringify(value)
12
12
 
13
13
  return Buffer.from(text)
@@ -1,12 +1,11 @@
1
1
  import { pack, unpack } from 'msgpackr'
2
2
 
3
- export function decode (buffer: Buffer): any {
3
+ export function decode(buffer: Buffer): any {
4
4
  return unpack(buffer)
5
5
  }
6
6
 
7
- export function encode (value: any): Buffer {
8
- if (typeof value === 'object' && value !== null)
9
- Object.setPrototypeOf(value, null)
7
+ export function encode(value: any): Buffer {
8
+ if (typeof value === 'object' && value !== null) Object.setPrototypeOf(value, null)
10
9
 
11
10
  return pack(value)
12
11
  }
@@ -1,10 +1,10 @@
1
1
  export const type = 'text/plain'
2
2
  export const multipart = 'multipart/text'
3
3
 
4
- export function decode (buffer: Buffer, charset = 'utf-8'): any {
4
+ export function decode(buffer: Buffer, charset = 'utf-8'): any {
5
5
  return buffer.toString(charset as BufferEncoding)
6
6
  }
7
7
 
8
- export function encode (value: { toString: () => string }): Buffer {
8
+ export function encode(value: { toString: () => string }): Buffer {
9
9
  return Buffer.from(value.toString())
10
10
  }
@@ -9,7 +9,10 @@ it('encodes error values as their public properties', () => {
9
9
  public override readonly message = 'Username is not meeting the requirements'
10
10
  })()
11
11
 
12
- assert.strictEqual(encode(value).toString(), 'code: INVALID_USERNAME\nmessage: Username is not meeting the requirements\n')
12
+ assert.strictEqual(
13
+ encode(value).toString(),
14
+ 'code: INVALID_USERNAME\nmessage: Username is not meeting the requirements\n'
15
+ )
13
16
  })
14
17
 
15
18
  it('writes a value the way its toJSON says', () => {
@@ -3,35 +3,38 @@ import { yaml } from '@toa.io/generic'
3
3
  export const type = 'application/yaml'
4
4
  export const multipart = 'multipart/yaml'
5
5
 
6
- export function decode (buffer: Buffer, charset = 'utf-8'): any {
6
+ export function decode(buffer: Buffer, charset = 'utf-8'): any {
7
7
  const text = buffer.toString(charset as BufferEncoding)
8
8
 
9
9
  return yaml.load(text)
10
10
  }
11
11
 
12
- export function encode (value: any): Buffer {
13
- const serializable = value instanceof Error ? Object.assign({}, value) : represent(value)
12
+ export function encode(value: any): Buffer {
13
+ const serializable =
14
+ value instanceof Error ? Object.assign({}, value) : represent(value)
14
15
  const text = yaml.dump(serializable, { lineWidth: -1, noRefs: true })
15
16
 
16
17
  return Buffer.from(text)
17
18
  }
18
19
 
19
20
  /** What says how it is to be written — a redacted secret — is written that way, as in JSON. */
20
- function represent (value: unknown): unknown {
21
- if (typeof value !== 'object' || value === null || value instanceof Date || Buffer.isBuffer(value))
21
+ function represent(value: unknown): unknown {
22
+ if (
23
+ typeof value !== 'object' ||
24
+ value === null ||
25
+ value instanceof Date ||
26
+ Buffer.isBuffer(value)
27
+ )
22
28
  return value
23
29
 
24
- if ('toJSON' in value && typeof value.toJSON === 'function')
25
- return value.toJSON()
30
+ if ('toJSON' in value && typeof value.toJSON === 'function') return value.toJSON()
26
31
 
27
- if (Array.isArray(value))
28
- return value.map(represent)
32
+ if (Array.isArray(value)) return value.map(represent)
29
33
 
30
34
  const object = value as Record<string, unknown>
31
35
  const represented: Record<string, unknown> = {}
32
36
 
33
- for (const key of Object.keys(object))
34
- represented[key] = represent(object[key])
37
+ for (const key of Object.keys(object)) represented[key] = represent(object[key])
35
38
 
36
39
  return represented
37
40
  }