@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
package/source/Factory.ts CHANGED
@@ -18,22 +18,24 @@ import * as http from './HTTP/index.js'
18
18
  import type { Branch } from './Branch.js'
19
19
  import type { syntax } from './RTD/index.js'
20
20
  import type { Broadcast } from './Gateway.js'
21
- import type { Connector, Locator, extensions } from '@toa.io/core'
21
+ import type { Connector, Locator } from '@toa.io/core'
22
+ import type { extensions } from '@toa.io/core/types'
22
23
 
23
24
  export class Factory implements extensions.Factory {
24
25
  private readonly host: Host
25
26
 
26
- public constructor (host: Host) {
27
+ public constructor(host: Host) {
27
28
  this.host = host
28
29
  }
29
30
 
30
- public async tenant (locator: Locator, node: syntax.Node): Promise<Connector> {
31
+ public async tenant(locator: Locator, node: syntax.Node): Promise<Connector> {
31
32
  const broadcast: Broadcast = await this.host.broadcast(CHANNEL, locator.id)
32
33
  const hash = createHash('sha256').update(JSON.stringify(node)).digest('hex')
33
34
 
34
35
  // no timestamp: the tenant stamps each announcement with its own start time
35
36
  const branch: Omit<Branch, 'timestamp'> = {
36
- namespace: locator.namespace,
37
+ // boot only ever hands a tenant a component's locator, which always has a namespace
38
+ namespace: locator.namespace!,
37
39
  component: locator.name,
38
40
  isolated: locator.namespace === 'identity',
39
41
  node,
@@ -43,9 +45,11 @@ export class Factory implements extensions.Factory {
43
45
  return new Tenant(broadcast, branch)
44
46
  }
45
47
 
46
- public async service (): Promise<Connector | null> {
47
- assert.ok(process.env.TOA_EXPOSITION_PROPERTIES,
48
- 'TOA_EXPOSITION_PROPERTIES is undefined')
48
+ public async service(): Promise<Connector | null> {
49
+ assert.ok(
50
+ process.env.TOA_EXPOSITION_PROPERTIES,
51
+ 'TOA_EXPOSITION_PROPERTIES is undefined'
52
+ )
49
53
 
50
54
  configureLogs()
51
55
 
@@ -62,7 +66,14 @@ export class Factory implements extensions.Factory {
62
66
  const composition = new Composition(this.host)
63
67
  const dispatcher = options.rpc === undefined ? null : new Dispatcher(options.rpc)
64
68
  const mcp = options.mcp === undefined ? null : new Model(options.mcp, tree)
65
- const gateway = new Gateway(broadcast, tree, interception, directives, dispatcher, mcp)
69
+ const gateway = new Gateway(
70
+ broadcast,
71
+ tree,
72
+ interception,
73
+ directives,
74
+ dispatcher,
75
+ mcp
76
+ )
66
77
 
67
78
  gateway.depends(remotes)
68
79
  gateway.depends(composition)
@@ -80,16 +91,19 @@ const CHANNEL = 'exposition'
80
91
  const LOGS_PREFIX = 'TOA_TELEMETRY_LOGS'
81
92
  const TRACES_ENV = 'TOA_TELEMETRY_TRACES'
82
93
 
83
- function configureLogs (): void {
94
+ function configureLogs(): void {
84
95
  const globEnv = process.env[LOGS_PREFIX]
85
96
  const level: LevelName = process.env.TOA_DEV === '1' ? 'trace' : 'info'
86
- const options = globEnv === undefined ? { level } : JSON.parse(globEnv) as { level?: LevelName }
97
+ const options =
98
+ globEnv === undefined ? { level } : (JSON.parse(globEnv) as { level?: LevelName })
87
99
 
88
100
  console.configure({ level: options.level ?? level })
89
101
 
90
102
  const tracesEnv = process.env[TRACES_ENV]
91
103
 
92
- traces(tracesEnv === undefined ? development() : JSON.parse(tracesEnv) as TracesOptions)
104
+ traces(
105
+ tracesEnv === undefined ? development() : (JSON.parse(tracesEnv) as TracesOptions)
106
+ )
93
107
  }
94
108
 
95
109
  /**
@@ -101,7 +115,7 @@ function configureLogs (): void {
101
115
  * The gateway boots without the telemetry extension, hence the copy of
102
116
  * `extensions/telemetry/source/extension.ts`.
103
117
  */
104
- function development (): TracesOptions {
118
+ function development(): TracesOptions {
105
119
  const local = process.env.TOA_DEV === '1' || process.env.TOA_BOOT_TRACE === '1'
106
120
 
107
121
  return local ? { exporters: { console: {} } } : {}
package/source/Gateway.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import assert from 'node:assert'
2
2
  import { setTimeout } from 'node:timers/promises'
3
3
  import { console } from 'openspan'
4
- import { type bindings, Connector } from '@toa.io/core'
4
+ import { Connector } from '@toa.io/core'
5
+ import type { bindings } from '@toa.io/core/types'
5
6
  import * as http from './HTTP/index.js'
6
7
  import { MCP, RPC } from './const.js'
7
8
  import { rethrow } from './exceptions.js'
@@ -9,7 +10,14 @@ import { decide } from './Branch.js'
9
10
  import type { Interception } from './Interception.js'
10
11
  import type { Dispatcher } from './RPC/index.js'
11
12
  import type { Server } from './MCP/index.js'
12
- import type { DirectiveFactory, Method, Node, Parameter, Tree, Match } from './RTD/index.js'
13
+ import type {
14
+ DirectiveFactory,
15
+ Method,
16
+ Node,
17
+ Parameter,
18
+ Tree,
19
+ Match
20
+ } from './RTD/index.js'
13
21
  import type { Label } from './discovery.js'
14
22
  import type { Branch, Exposed } from './Branch.js'
15
23
 
@@ -32,8 +40,14 @@ export class Gateway extends Connector {
32
40
  private resolveFirstMerge: (() => void) | null = null
33
41
 
34
42
  // eslint-disable-next-line max-params
35
- public constructor (broadcast: Broadcast, tree: Tree, interception: Interception,
36
- directives: DirectiveFactory, dispatcher: Dispatcher | null, mcp: Server | null) {
43
+ public constructor(
44
+ broadcast: Broadcast,
45
+ tree: Tree,
46
+ interception: Interception,
47
+ directives: DirectiveFactory,
48
+ dispatcher: Dispatcher | null,
49
+ mcp: Server | null
50
+ ) {
37
51
  super()
38
52
 
39
53
  this.broadcast = broadcast
@@ -46,22 +60,18 @@ export class Gateway extends Connector {
46
60
  this.depends(broadcast)
47
61
  }
48
62
 
49
- public async process (context: http.Context): Promise<http.OutgoingMessage> {
50
- const interception = await context.timing.capture('intercept',
51
- this.interceptor.intercept(context))
63
+ public async process(context: http.Context): Promise<http.OutgoingMessage> {
64
+ const interception = await this.interceptor.intercept(context)
52
65
 
53
- if (interception !== null)
54
- return interception
66
+ if (interception !== null) return interception
55
67
 
56
68
  // request-scoped, before anything is routed: this is where a credential is read
57
- await context.timing.capture('preflight',
58
- this.directives.preflight(context)).catch(rethrow)
69
+ await this.directives.preflight(context).catch(rethrow)
59
70
 
60
71
  const response = await this.endpoint(context)
61
72
 
62
73
  // request-scoped, on whatever is going back: this is where a credential is re-issued
63
- await context.timing.capture('depart',
64
- this.directives.depart(context, response)).catch(rethrow)
74
+ await this.directives.depart(context, response).catch(rethrow)
65
75
 
66
76
  return response
67
77
  }
@@ -70,14 +80,14 @@ export class Gateway extends Connector {
70
80
  * What answers the request: a pinned endpoint that makes calls of its own, or the route
71
81
  * the path names.
72
82
  */
73
- private async endpoint (context: http.Context): Promise<http.OutgoingMessage> {
83
+ private async endpoint(context: http.Context): Promise<http.OutgoingMessage> {
74
84
  const route: http.Processor = async (call) => await this.route(call)
75
85
 
76
86
  if (this.dispatcher !== null && context.url.pathname === RPC)
77
- return await context.timing.capture('rpc', this.dispatcher.dispatch(context, route))
87
+ return await this.dispatcher.dispatch(context, route)
78
88
 
79
89
  if (this.mcp !== null && context.url.pathname === MCP)
80
- return await context.timing.capture('mcp', this.mcp.process(context, route))
90
+ return await this.mcp.process(context, route)
81
91
 
82
92
  return await this.route(context)
83
93
  }
@@ -86,7 +96,7 @@ export class Gateway extends Connector {
86
96
  * One call: everything that needs a node. A request makes one of these, and a request
87
97
  * that carries several calls makes one per call.
88
98
  */
89
- private async route (context: http.Context): Promise<http.OutgoingMessage> {
99
+ private async route(context: http.Context): Promise<http.OutgoingMessage> {
90
100
  const { node, parameters } = this.match(context)
91
101
 
92
102
  if (context.request.method === 'OPTIONS')
@@ -94,39 +104,35 @@ export class Gateway extends Connector {
94
104
 
95
105
  let verb = context.request.method
96
106
 
97
- if (!(verb in node.methods) && verb === 'HEAD' && 'GET' in node.methods)
98
- verb = 'GET'
107
+ if (!(verb in node.methods) && verb === 'HEAD' && 'GET' in node.methods) verb = 'GET'
99
108
 
100
- if (!(verb in node.methods))
101
- throw new http.MethodNotAllowed()
109
+ if (!(verb in node.methods)) throw new http.MethodNotAllowed()
102
110
 
103
111
  const method = node.methods[verb]
104
112
 
105
- const interruption = await context.timing.capture('precall',
106
- method.directives.precall(context, parameters)).catch(rethrow)
113
+ const interruption = await method.directives
114
+ .precall(context, parameters)
115
+ .catch(rethrow)
116
+ const response = interruption ?? (await this.call(method, context, parameters))
107
117
 
108
- const response = interruption ??
109
- await context.timing.capture('call', this.call(method, context, parameters))
110
-
111
- await context.timing.capture('settle',
112
- method.directives.settle(context, response)).catch(rethrow)
118
+ await method.directives.settle(context, response).catch(rethrow)
113
119
 
114
120
  return response
115
121
  }
116
122
 
117
- protected override async open (): Promise<void> {
123
+ protected override async open(): Promise<void> {
118
124
  await this.discover()
119
125
 
120
126
  // what is served besides the tree, so that turning one on can be seen to have worked
121
127
  const pinned: string[] = []
122
128
 
123
- if (this.dispatcher !== null)
124
- pinned.push(RPC)
129
+ if (this.dispatcher !== null) pinned.push(RPC)
125
130
 
126
- if (this.mcp !== null)
127
- pinned.push(MCP)
131
+ if (this.mcp !== null) pinned.push(MCP)
128
132
 
129
- console.info('Gateway started', { endpoints: pinned.length === 0 ? 'none' : pinned.join(' ') })
133
+ console.info('Gateway started', {
134
+ endpoints: pinned.length === 0 ? 'none' : pinned.join(' ')
135
+ })
130
136
  }
131
137
 
132
138
  /**
@@ -135,17 +141,17 @@ export class Gateway extends Connector {
135
141
  * ticker firing in between calls an endpoint that has just been unbound, and reports the
136
142
  * refusal as a failure to reconcile.
137
143
  */
138
- protected override async close (): Promise<void> {
144
+ protected override async close(): Promise<void> {
139
145
  this.stopped = true
140
146
 
141
147
  this.tree.dispose()
142
148
  }
143
149
 
144
- protected override dispose (): void {
150
+ protected override dispose(): void {
145
151
  console.info('Gateway is closed')
146
152
  }
147
153
 
148
- private match (context: http.Context): Match {
154
+ private match(context: http.Context): Match {
149
155
  const match = this.tree.match(context.url.pathname)
150
156
 
151
157
  if (match === null) {
@@ -155,17 +161,15 @@ export class Gateway extends Connector {
155
161
  throw new http.NotFound('Route not found')
156
162
  }
157
163
 
158
- if (match.node.forward === null)
159
- return match
164
+ if (match.node.forward === null) return match
160
165
 
161
- const destination = match.node.forward.replace(/\/:([^/]+)/g,
162
- (_, name) => {
163
- const value = match.parameters.find((parameter) => parameter.name === name)?.value
166
+ const destination = match.node.forward.replace(/\/:([^/]+)/g, (_, name) => {
167
+ const value = match.parameters.find((parameter) => parameter.name === name)?.value
164
168
 
165
- assert.ok(value !== undefined, `Forwarded parameter '${name}' not found`)
169
+ assert.ok(value !== undefined, `Forwarded parameter '${name}' not found`)
166
170
 
167
- return `/${value}`
168
- })
171
+ return `/${value}`
172
+ })
169
173
 
170
174
  const forward = this.tree.match(destination)
171
175
 
@@ -174,23 +178,28 @@ export class Gateway extends Connector {
174
178
  return forward
175
179
  }
176
180
 
177
- private async call (method: Method, context: http.Context, parameters: Parameter[]): Promise<http.OutgoingMessage> {
181
+ private async call(
182
+ method: Method,
183
+ context: http.Context,
184
+ parameters: Parameter[]
185
+ ): Promise<http.OutgoingMessage> {
178
186
  if (context.url.pathname[context.url.pathname.length - 1] !== '/')
179
187
  throw new http.NotFound('Trailing slash is required')
180
188
 
181
- if (context.encoder === null)
182
- throw new http.NotAcceptable()
189
+ if (context.encoder === null) throw new http.NotAcceptable()
183
190
 
184
- if (method.endpoint === null)
185
- throw new http.MethodNotAllowed()
191
+ if (method.endpoint === null) throw new http.MethodNotAllowed()
186
192
 
187
- return await method.endpoint
193
+ return (await method.endpoint
188
194
  .call(context, parameters)
189
- .catch(rethrow) as http.OutgoingMessage
195
+ .catch(rethrow)) as http.OutgoingMessage
190
196
  }
191
197
 
192
- private async explain (context: http.Context, node: Node,
193
- parameters: Parameter[]): Promise<http.OutgoingMessage> {
198
+ private async explain(
199
+ context: http.Context,
200
+ node: Node,
201
+ parameters: Parameter[]
202
+ ): Promise<http.OutgoingMessage> {
194
203
  const body = await node.explain(context, parameters)
195
204
  const verbs = Object.keys(body)
196
205
 
@@ -201,7 +210,7 @@ export class Gateway extends Connector {
201
210
  return { body, headers: new Headers({ allow: verbs.join(', ') }) }
202
211
  }
203
212
 
204
- private async discover (): Promise<void> {
213
+ private async discover(): Promise<void> {
205
214
  const first = new Promise<void>((resolve) => {
206
215
  this.resolveFirstMerge = resolve
207
216
  })
@@ -217,43 +226,46 @@ export class Gateway extends Connector {
217
226
  * A single ping is enough only if every tenant is listening by then, which is
218
227
  * not the case while the deployment is still rolling out.
219
228
  */
220
- private async knock (): Promise<void> {
229
+ private async knock(): Promise<void> {
221
230
  for (const delay of KNOCK_DELAYS) {
222
- if (this.stopped)
223
- return
231
+ if (this.stopped) return
224
232
 
225
- if (delay > 0)
226
- await setTimeout(delay, undefined, { ref: false })
233
+ if (delay > 0) await setTimeout(delay, undefined, { ref: false })
227
234
 
228
235
  await this.ping()
229
236
  }
230
237
  }
231
238
 
232
- private async ping (): Promise<void> {
233
- if (this.stopped)
234
- return
239
+ private async ping(): Promise<void> {
240
+ if (this.stopped) return
235
241
 
236
242
  this.lastPing = Date.now()
237
243
 
238
- await this.broadcast.transmit<null>('ping', null)
239
- .catch((exception: Error) => console.error('Discovery ping failed',
240
- { message: exception.message }))
244
+ await this.broadcast
245
+ .transmit<null>('ping', null)
246
+ .catch((exception: Error) =>
247
+ console.error('Discovery ping failed', { message: exception.message })
248
+ )
241
249
  }
242
250
 
243
- private reping (): void {
244
- if (Date.now() - this.lastPing < PING_COOLDOWN)
245
- return
251
+ private reping(): void {
252
+ if (Date.now() - this.lastPing < PING_COOLDOWN) return
246
253
 
247
254
  void this.ping()
248
255
  }
249
256
 
250
- private async settled (first: Promise<void>): Promise<void> {
257
+ private async settled(first: Promise<void>): Promise<void> {
251
258
  const deadline = Date.now() + SETTLE_TIMEOUT
252
259
  const abort = new AbortController()
253
260
 
254
261
  // an uncancelled timer keeps the process alive long after the race is won
255
- await Promise.race([first, setTimeout(SETTLE_TIMEOUT, undefined, { signal: abort.signal })])
256
- .finally(() => { abort.abort() })
262
+ await Promise.race([
263
+ first,
264
+ setTimeout(SETTLE_TIMEOUT, undefined, { signal: abort.signal })
265
+ ])
266
+ .finally(() => {
267
+ abort.abort()
268
+ })
257
269
  .catch(() => {})
258
270
 
259
271
  if (this.lastMerge === 0) {
@@ -263,8 +275,7 @@ export class Gateway extends Connector {
263
275
  }
264
276
 
265
277
  while (Date.now() - this.lastMerge < this.quiet()) {
266
- if (Date.now() >= deadline)
267
- break
278
+ if (Date.now() >= deadline) break
268
279
 
269
280
  await setTimeout(SETTLE_POLL)
270
281
  }
@@ -277,13 +288,13 @@ export class Gateway extends Connector {
277
288
  * is enough; a rolling deployment brings them up seconds apart, and the window grows with
278
289
  * the widest gap seen so far to keep waiting for the ones still starting.
279
290
  */
280
- private quiet (): number {
291
+ private quiet(): number {
281
292
  const adaptive = this.widestGap * SETTLE_QUIET_FACTOR
282
293
 
283
294
  return Math.min(Math.max(adaptive, SETTLE_QUIET_MIN), SETTLE_QUIET_MAX)
284
295
  }
285
296
 
286
- private merge (branch: Branch): void {
297
+ private merge(branch: Branch): void {
287
298
  const id = branch.namespace + '.' + branch.component
288
299
 
289
300
  const attributes = {
@@ -1,4 +1,3 @@
1
- import crypto from 'node:crypto'
2
1
  import { buffer } from 'node:stream/consumers'
3
2
  import Negotiator from 'negotiator'
4
3
  import { console } from 'openspan'
@@ -10,7 +9,6 @@ import type { OutgoingMessage } from './messages.js'
10
9
  import type { IncomingMessage } from './types.js'
11
10
 
12
11
  export class Context {
13
- public readonly id: string
14
12
  public readonly authority: string
15
13
  public readonly request: IncomingMessage
16
14
 
@@ -20,7 +18,6 @@ export class Context {
20
18
  public readonly subtype: string | null = null
21
19
  public readonly encoder: Format | null = null
22
20
  public readonly timing: Timing
23
- public readonly debug: boolean
24
21
 
25
22
  /**
26
23
  * Whether this is a procedure a request made, rather than the request. What forks one
@@ -37,17 +34,19 @@ export class Context {
37
34
  private consumed = false
38
35
 
39
36
  // eslint-disable-next-line max-params
40
- public constructor (authority: string, request: IncomingMessage, properties: Properties,
41
- url: URL) {
37
+ public constructor(
38
+ authority: string,
39
+ request: IncomingMessage,
40
+ properties: Properties,
41
+ url: URL
42
+ ) {
42
43
  this.authority = authority
43
44
  this.request = request
44
45
  this.ip = address(request, properties.ip)
45
46
 
46
- this.id = crypto.randomUUID()
47
47
  // parsed by the server, which had to parse it anyway to know the request is valid
48
48
  this.url = url
49
49
  this.timing = new Timing()
50
- this.debug = properties.debug
51
50
  this.log(request)
52
51
 
53
52
  const accept = this.request.headers.accept
@@ -56,11 +55,7 @@ export class Context {
56
55
  const match = SUBTYPE.exec(accept)
57
56
 
58
57
  if (match !== null) {
59
- const {
60
- type,
61
- subtype,
62
- suffix
63
- } = match.groups!
58
+ const { type, subtype, suffix } = match.groups!
64
59
 
65
60
  this.request.headers.accept = `${type}/${suffix}`
66
61
  this.subtype = subtype
@@ -69,11 +64,10 @@ export class Context {
69
64
 
70
65
  const encoder = negotiate(this.request)
71
66
 
72
- if (encoder !== undefined)
73
- this.encoder = encoder
67
+ if (encoder !== undefined) this.encoder = encoder
74
68
  }
75
69
 
76
- public async buffer (): Promise<Buffer> {
70
+ public async buffer(): Promise<Buffer> {
77
71
  this.consumed = true
78
72
 
79
73
  return await buffer(this.request)
@@ -82,19 +76,21 @@ export class Context {
82
76
  public async body<T>(): Promise<T> {
83
77
  let value = this.consumed ? null : await read(this)
84
78
 
85
- for (const transform of this.pipelines.body)
86
- value = await transform(value)
79
+ for (const transform of this.pipelines.body) value = await transform(value)
87
80
 
88
81
  return value
89
82
  }
90
83
 
91
- private log (request: IncomingMessage): void {
92
- const headers = { ...request.headers }
84
+ private log(request: IncomingMessage): void {
85
+ // built only when the line is written, which at `info` it is not
86
+ console.debug('Received request', () => {
87
+ const headers = { ...request.headers }
93
88
 
94
- if (headers.authorization !== undefined)
95
- headers.authorization = SCHEME.exec(headers.authorization)?.[1] ?? '[malformed]'
89
+ if (headers.authorization !== undefined)
90
+ headers.authorization = SCHEME.exec(headers.authorization)?.[1] ?? '[malformed]'
96
91
 
97
- console.debug('Received request', { method: request.method, url: request.url, headers })
92
+ return { method: request.method, url: request.url, headers }
93
+ })
98
94
  }
99
95
  }
100
96
 
@@ -107,8 +103,6 @@ interface Pipelines {
107
103
  }
108
104
 
109
105
  interface Properties {
110
- debug: boolean
111
-
112
106
  /** the header the client address is read from; the connection's without one */
113
107
  ip?: string
114
108
  }
@@ -117,18 +111,16 @@ interface Properties {
117
111
  * Negotiation parses the header and sorts the candidates, and the value repeats:
118
112
  * clients send one of a handful of `accept` strings. Bounded, the header is theirs.
119
113
  */
120
- function negotiate (request: IncomingMessage): Format | undefined {
114
+ function negotiate(request: IncomingMessage): Format | undefined {
121
115
  const accept = request.headers.accept ?? ''
122
116
  const known = NEGOTIATED.get(accept)
123
117
 
124
- if (known !== undefined)
125
- return known === NONE ? undefined : known
118
+ if (known !== undefined) return known === NONE ? undefined : known
126
119
 
127
120
  const mediaType = new Negotiator(request).mediaType(types)
128
121
  const encoder = mediaType === undefined ? undefined : formats[mediaType]
129
122
 
130
- if (NEGOTIATED.size >= NEGOTIATED_LIMIT)
131
- NEGOTIATED.clear()
123
+ if (NEGOTIATED.size >= NEGOTIATED_LIMIT) NEGOTIATED.clear()
132
124
 
133
125
  NEGOTIATED.set(accept, encoder ?? NONE)
134
126
 
@@ -140,4 +132,5 @@ const NONE = Symbol('not acceptable') as unknown as Format
140
132
  const NEGOTIATED = new Map<string, Format>()
141
133
  const NEGOTIATED_LIMIT = 1024
142
134
 
143
- const SUBTYPE = /^(?<type>\w{1,32})\/(vnd\.toa\.(?<subtype>\S{1,32})\+)(?<suffix>\S{1,32})$/
135
+ const SUBTYPE =
136
+ /^(?<type>\w{1,32})\/(vnd\.toa\.(?<subtype>\S{1,32})\+)(?<suffix>\S{1,32})$/
@@ -21,14 +21,14 @@ export class Probe {
21
21
  private listening = false
22
22
  private skipped = false
23
23
 
24
- public constructor (port: number, path: string = PATH) {
24
+ public constructor(port: number, path: string = PATH) {
25
25
  this.port = port
26
26
  this.path = path
27
27
 
28
28
  this.server.on('request', (request, response) => this.listener(request, response))
29
29
  }
30
30
 
31
- public async listen (): Promise<void> {
31
+ public async listen(): Promise<void> {
32
32
  this.startedAt = Date.now()
33
33
 
34
34
  try {
@@ -59,7 +59,7 @@ export class Probe {
59
59
  }
60
60
 
61
61
  /** The gateway is listening and has routes: answer `200`. */
62
- public complete (): void {
62
+ public complete(): void {
63
63
  this.ready = true
64
64
 
65
65
  // the IPC signal is not tied to the probe: a process that gave up the shared port is
@@ -67,11 +67,10 @@ export class Probe {
67
67
  process.send?.('ready')
68
68
  }
69
69
 
70
- public async close (): Promise<void> {
70
+ public async close(): Promise<void> {
71
71
  this.ready = false
72
72
 
73
- if (!this.listening || this.skipped)
74
- return
73
+ if (!this.listening || this.skipped) return
75
74
 
76
75
  this.listening = false
77
76
 
@@ -81,15 +80,14 @@ export class Probe {
81
80
  await new Promise<void>((resolve) => this.server.close(() => resolve()))
82
81
  }
83
82
 
84
- private listener (request: http.IncomingMessage, response: http.ServerResponse): void {
83
+ private listener(request: http.IncomingMessage, response: http.ServerResponse): void {
85
84
  if (request.url !== this.path) {
86
85
  response.writeHead(404).end()
87
86
 
88
87
  return
89
88
  }
90
89
 
91
- if (this.ready)
92
- response.writeHead(200, { 'cache-control': 'no-store' }).end()
90
+ if (this.ready) response.writeHead(200, { 'cache-control': 'no-store' }).end()
93
91
  else {
94
92
  const remaining = Math.ceil((Date.now() - this.startedAt) / 1000).toString()
95
93