@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
@@ -107,50 +107,61 @@ describe('read', () => {
107
107
  })
108
108
 
109
109
  it('should not offer a form as a reply encoding', () => {
110
- assert.ok(!types.includes('application/x-www-form-urlencoded'),
111
- 'a form is read and never written')
110
+ assert.ok(
111
+ !types.includes('application/x-www-form-urlencoded'),
112
+ 'a form is read and never written'
113
+ )
112
114
  })
113
115
 
114
116
  it('should output correct mulitpart format', async () => {
115
- const response = new class extends PassThrough {
117
+ const response = new (class extends PassThrough {
116
118
  public readonly headers = new Headers()
117
119
 
118
- public setHeader (key: string, value: string): this {
120
+ public setHeader(key: string, value: string): this {
119
121
  this.headers.set(key, value)
120
122
 
121
123
  return this
122
124
  }
123
- }()
125
+ })()
124
126
 
125
127
  const context = { encoder: formats['text/plain'] } as unknown as Context
126
- const message = { body: Readable.from(['Hello', 'New', 'World']) } as unknown as OutgoingMessage
128
+ const message = {
129
+ body: Readable.from(['Hello', 'New', 'World'])
130
+ } as unknown as OutgoingMessage
127
131
 
128
132
  const framed = multipart(message, context, response as unknown as http.ServerResponse)
129
133
 
130
134
  const result = await streamConsumers.text(framed)
131
135
 
132
- assert.strictEqual(result, [
133
- '--cut',
134
- '',
135
- 'ACK',
136
- '--cut',
137
- '',
138
- 'Hello',
139
- '--cut',
140
- '',
141
- 'New',
142
- '--cut',
143
- '',
144
- 'World',
145
- '--cut',
146
- '',
147
- 'FIN',
148
- '--cut--'].join('\r\n'))
136
+ assert.strictEqual(
137
+ result,
138
+ [
139
+ '--cut',
140
+ '',
141
+ 'ACK',
142
+ '--cut',
143
+ '',
144
+ 'Hello',
145
+ '--cut',
146
+ '',
147
+ 'New',
148
+ '--cut',
149
+ '',
150
+ 'World',
151
+ '--cut',
152
+ '',
153
+ 'FIN',
154
+ '--cut--'
155
+ ].join('\r\n')
156
+ )
149
157
  })
150
158
  })
151
159
 
152
- export function createContext (url: string, headers: Record<string, string> = {}, content: string | Buffer = ''):
153
- Context {
160
+ export function createContext(
161
+ url: string,
162
+ headers: Record<string, string> = {},
163
+ content: string | Buffer = ''
164
+ ): Context {
154
165
  const data = Buffer.isBuffer(content) ? content : Buffer.from(content)
155
166
  const stream = Readable.from(data)
156
167
  let consumed = false
@@ -163,8 +174,7 @@ Context {
163
174
  url: new URL(url, 'https://host.local'),
164
175
  timing: new Timing(),
165
176
  buffer: async () => {
166
- if (consumed)
167
- throw new Error('Request body already consumed')
177
+ if (consumed) throw new Error('Request body already consumed')
168
178
 
169
179
  consumed = true
170
180
 
@@ -175,7 +185,7 @@ Context {
175
185
  return mock as unknown as Context
176
186
  }
177
187
 
178
- function resetCalls (target = [], seen = new Set()) {
188
+ function resetCalls(target = [], seen = new Set()) {
179
189
  if (target === null || typeof target !== 'object' || seen.has(target)) return
180
190
 
181
191
  seen.add(target)
@@ -1,7 +1,6 @@
1
1
  import { readFileSync } from 'node:fs'
2
2
  import { Readable } from 'node:stream'
3
3
  import { pipeline } from 'node:stream/promises'
4
- import { createHash } from 'node:crypto'
5
4
  import * as contentType from 'content-type'
6
5
  import { console } from 'openspan'
7
6
  import { type Format, decoders } from './formats/index.js'
@@ -9,27 +8,28 @@ import { BadRequest, NotAcceptable, UnsupportedMediaType } from './exceptions.js
9
8
  import type { Context } from './Context.js'
10
9
  import type { ServerResponse } from './types.js'
11
10
 
12
- const server = `Exposition/${JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')).version}` +
11
+ const server =
12
+ `Exposition/${JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8')).version}` +
13
13
  ((process.env.TOA_CONTEXT === undefined ? '' : ` ${process.env.TOA_CONTEXT}`) +
14
14
  (process.env.TOA_ENV === undefined ? '' : `/${process.env.TOA_ENV}`))
15
15
 
16
- const pending = new Map<string, PendingStream>()
17
-
18
16
  /**
19
17
  * Applies what the request accumulated in `pipelines.response` — an `io:output` restriction,
20
18
  * a `vary` a `map` directive owes. Separate from `write` because a message is not always
21
19
  * written: one call of several produces a value the reply is assembled from.
22
20
  */
23
- export async function shape (context: Context, message: OutgoingMessage): Promise<void> {
24
- for (const transform of context.pipelines.response)
25
- await transform(message)
21
+ export async function shape(context: Context, message: OutgoingMessage): Promise<void> {
22
+ for (const transform of context.pipelines.response) await transform(message)
26
23
  }
27
24
 
28
- export async function write (context: Context, response: ServerResponse, message: OutgoingMessage): Promise<void> {
25
+ export async function write(
26
+ context: Context,
27
+ response: ServerResponse,
28
+ message: OutgoingMessage
29
+ ): Promise<void> {
29
30
  await shape(context, message)
30
31
 
31
- if (message?.status !== undefined)
32
- response.statusCode = message.status
32
+ if (message?.status !== undefined) response.statusCode = message.status
33
33
 
34
34
  response.setHeader('server', server)
35
35
  message.headers?.forEach((value, key) => response.setHeader(key, value))
@@ -42,24 +42,21 @@ export async function write (context: Context, response: ServerResponse, message
42
42
  }
43
43
 
44
44
  response.on('error', (exception: Error) =>
45
- console.warn('HTTP response error', { path: context.url.pathname, exception }))
45
+ console.warn('HTTP response error', { path: context.url.pathname, exception })
46
+ )
46
47
 
47
- if (message.body instanceof Readable)
48
- stream(message, context, response)
49
- else
50
- send(message, context, response)
48
+ if (message.body instanceof Readable) stream(message, context, response)
49
+ else send(message, context, response)
51
50
  }
52
51
 
53
- export async function read (context: Context): Promise<any> {
52
+ export async function read(context: Context): Promise<any> {
54
53
  const header = context.request.headers['content-type']
55
54
 
56
- if (header === undefined)
57
- return undefined
55
+ if (header === undefined) return undefined
58
56
 
59
57
  const { type, parameters } = contentType.parse(header)
60
58
 
61
- if (!(type in decoders))
62
- throw new UnsupportedMediaType()
59
+ if (!(type in decoders)) throw new UnsupportedMediaType()
63
60
 
64
61
  const format = decoders[type]
65
62
  const buf = await context.buffer()
@@ -76,56 +73,36 @@ export async function read (context: Context): Promise<any> {
76
73
  }
77
74
  }
78
75
 
79
- function send (message: OutgoingMessage, context: Context, response: ServerResponse): void {
76
+ function send(
77
+ message: OutgoingMessage,
78
+ context: Context,
79
+ response: ServerResponse
80
+ ): void {
80
81
  if (message.body === undefined || message.body === null) {
81
82
  // a HEAD reply carries no body but must still report the length a GET would
82
83
  // have returned, so a length already set by a directive is left alone
83
- if (!response.hasHeader('content-length'))
84
- response.setHeader('content-length', '0')
84
+ if (!response.hasHeader('content-length')) response.setHeader('content-length', '0')
85
85
 
86
86
  response.end()
87
87
 
88
88
  return
89
89
  }
90
90
 
91
- if (context.encoder === null)
92
- throw new NotAcceptable()
91
+ if (context.encoder === null) throw new NotAcceptable()
93
92
 
94
93
  const buf = context.encoder.encode(message.body)
95
94
 
96
- if (message.etag === true && conditional(context, response, buf))
97
- return
98
-
99
95
  response.setHeader('content-type', context.encoder.type)
100
96
  response.setHeader('content-length', buf.length.toString())
101
97
  response.appendHeader('vary', 'accept')
102
98
  response.end(buf)
103
99
  }
104
100
 
105
- /**
106
- * Tags a reply that carries no version with a hash of the body being sent, and answers
107
- * `304` when the client already has it. The tag is taken from the encoded body rather
108
- * than from a serialization of its own, so it identifies the representation — which is
109
- * what `vary` says.
110
- */
111
- function conditional (context: Context, response: ServerResponse, buf: Buffer): boolean {
112
- const etag = `"${createHash('sha256').update(buf).digest('hex')}"`
113
-
114
- response.setHeader('etag', etag)
115
-
116
- if (context.request.headers['if-none-match'] !== etag)
117
- return false
118
-
119
- response.setHeader('content-length', '0')
120
- response.appendHeader('vary', 'accept')
121
-
122
- response.statusCode = 304
123
- response.end()
124
-
125
- return true
126
- }
127
-
128
- function stream (message: OutgoingMessage, context: Context, response: ServerResponse): void {
101
+ function stream(
102
+ message: OutgoingMessage,
103
+ context: Context,
104
+ response: ServerResponse
105
+ ): void {
129
106
  const encoded = message.headers !== undefined && message.headers.has('content-type')
130
107
  const source: Readable = encoded ? message.body : multipart(message, context, response)
131
108
 
@@ -134,21 +111,21 @@ function stream (message: OutgoingMessage, context: Context, response: ServerRes
134
111
  //
135
112
  // `pipeline` carries an error to every stage and destroys them. `pipe` leaves the stages it
136
113
  // built behind, and an `error` on a stream nobody listens to is an uncaught exception.
137
- pipeline(source, response)
138
- .catch((exception: Error) =>
139
- console.warn('Message stream error', { path: context.url.pathname, exception }))
140
-
141
- if (context.debug)
142
- debugStream(context, response)
114
+ pipeline(source, response).catch((exception: Error) =>
115
+ console.warn('Message stream error', { path: context.url.pathname, exception })
116
+ )
143
117
  }
144
118
 
145
119
  /**
146
120
  * Frames an object stream as `multipart/*`: an `ACK` part, the parts themselves, then `FIN`.
147
121
  * The body is a `Readable`; `write` reached here by testing it.
148
122
  */
149
- export function multipart (message: OutgoingMessage, context: Context, response: ServerResponse): Readable {
150
- if (context.encoder === null)
151
- throw new NotAcceptable()
123
+ export function multipart(
124
+ message: OutgoingMessage,
125
+ context: Context,
126
+ response: ServerResponse
127
+ ): Readable {
128
+ if (context.encoder === null) throw new NotAcceptable()
152
129
 
153
130
  const encoder = context.encoder
154
131
 
@@ -157,7 +134,7 @@ export function multipart (message: OutgoingMessage, context: Context, response:
157
134
  return Readable.from(frames(message.body as Readable, encoder))
158
135
  }
159
136
 
160
- async function * frames (body: Readable, encoder: Format): AsyncGenerator<Buffer> {
137
+ async function* frames(body: Readable, encoder: Format): AsyncGenerator<Buffer> {
161
138
  yield Buffer.concat([CUT, CRLF, encoder.encode('ACK'), CRLF, CUT])
162
139
 
163
140
  for await (const part of body)
@@ -165,7 +142,8 @@ async function * frames (body: Readable, encoder: Format): AsyncGenerator<Buffer
165
142
  CRLF /* indicates no boundary headers */,
166
143
  encoder.encode(part),
167
144
  CRLF,
168
- CUT])
145
+ CUT
146
+ ])
169
147
 
170
148
  yield Buffer.concat([CRLF, encoder.encode('FIN'), CRLF, FINALCUT])
171
149
  }
@@ -175,41 +153,14 @@ const CUT = Buffer.from(`--${BOUNDARY}\r\n`)
175
153
  const CRLF = Buffer.from('\r\n')
176
154
  const FINALCUT = Buffer.from(`--${BOUNDARY}--`)
177
155
 
178
- const PENDING_DEBUG_INTERVAL = 30000
179
-
180
- let pendingInterval: NodeJS.Timeout | null = null
181
-
182
- function debugStream (context: Context, response: ServerResponse): void {
183
- const ctx = { method: context.request.method, path: context.url.pathname }
184
-
185
- console.debug('Stream opened', ctx)
186
- pending.set(context.id, ctx)
187
-
188
- response.on('close', () => {
189
- console.debug('Stream closed', ctx)
190
- pending.delete(context.id)
191
-
192
- if (pending.size === 0) {
193
- if (pendingInterval !== null)
194
- clearInterval(pendingInterval)
195
-
196
- pendingInterval = null
197
- }
198
- })
199
-
200
- if (pendingInterval === null)
201
- pendingInterval = setInterval(() =>
202
- console.debug('Pending streams', { size: pending.size }),
203
- PENDING_DEBUG_INTERVAL)
204
- }
205
-
206
156
  export interface OutgoingMessage {
207
157
  status?: number
208
158
  headers?: Headers
209
159
  body?: any
210
160
 
211
- /** tag the response with a hash of the encoded body, see `conditional` */
212
- etag?: boolean
161
+ /** what the reply carries for a cache to validate by; the `cache` family sets the headers */
162
+ version?: number
163
+ modified?: number | string
213
164
 
214
165
  /**
215
166
  * Built by the gateway rather than returned by an operation, as a request is `authentic`
@@ -231,8 +182,3 @@ export interface Query {
231
182
  limit?: string
232
183
  version?: number
233
184
  }
234
-
235
- interface PendingStream {
236
- method: string
237
- path: string
238
- }
@@ -4,7 +4,7 @@ import type { Input, Output } from './io.js'
4
4
  export class Interception implements Interceptor {
5
5
  private readonly interceptors: Interceptor[]
6
6
 
7
- public constructor (interceptors: Interceptor[], options: http.Options) {
7
+ public constructor(interceptors: Interceptor[], options: http.Options) {
8
8
  this.interceptors = interceptors
9
9
 
10
10
  // interceptors are module singletons, so a second gateway in one process —
@@ -15,12 +15,11 @@ export class Interception implements Interceptor {
15
15
  }
16
16
  }
17
17
 
18
- public async intercept (input: Input): Promise<Output> {
18
+ public async intercept(input: Input): Promise<Output> {
19
19
  for (const interceptor of this.interceptors) {
20
20
  const output = await interceptor.intercept(input)
21
21
 
22
- if (output !== null)
23
- return output
22
+ if (output !== null) return output
24
23
  }
25
24
 
26
25
  return null
@@ -8,6 +8,9 @@ export interface Introspection {
8
8
  * one sentence cannot be true of both. The operation's own is for the Introspection.
9
9
  */
10
10
  description?: string
11
+
12
+ /** what a person is shown where a client lists this method, which a name is not */
13
+ title?: string
11
14
  route?: Record<string, Schema>
12
15
  query?: Record<string, Schema>
13
16
 
@@ -30,28 +33,40 @@ export type Schema = Awaited<ReturnType<Remote['explain']>>['input']
30
33
  * The same, in the order the shape states — whatever order the families that filled it ran
31
34
  * in. What a resource says about itself is read, so it is written the way it is documented.
32
35
  */
33
- export function order (introspection: Introspection): Introspection {
36
+ export function order(introspection: Introspection): Introspection {
34
37
  const ordered: Introspection = {}
35
38
 
36
39
  for (const key of KEYS)
37
- if (introspection[key] !== undefined)
38
- (ordered[key] as unknown) = introspection[key]
40
+ if (introspection[key] !== undefined) (ordered[key] as unknown) = introspection[key]
39
41
 
40
42
  return ordered
41
43
  }
42
44
 
43
- const KEYS = ['description', 'route', 'query', 'headers', 'input', 'output', 'errors'] as const
45
+ const KEYS = [
46
+ 'title',
47
+ 'description',
48
+ 'route',
49
+ 'query',
50
+ 'headers',
51
+ 'input',
52
+ 'output',
53
+ 'errors'
54
+ ] as const
44
55
 
45
56
  /**
46
57
  * The schema of one input property, taken out of it: a property another family fills is
47
58
  * not the caller's to send, and what took it says where it comes from instead.
48
59
  */
49
- export function take (carrier: Carrier, property: string): Schema | undefined {
60
+ export function take(carrier: Carrier, property: string): Schema | undefined {
50
61
  const input = carrier.input as Shape | null | undefined
51
62
  const properties = input?.properties
52
63
 
53
- if (input === undefined || input === null || properties === undefined ||
54
- !(property in properties))
64
+ if (
65
+ input === undefined ||
66
+ input === null ||
67
+ properties === undefined ||
68
+ !(property in properties)
69
+ )
55
70
  return undefined
56
71
 
57
72
  const schema = properties[property]
@@ -69,23 +84,23 @@ export function take (carrier: Carrier, property: string): Schema | undefined {
69
84
  * describes an array. What is not an object of properties is left alone: a whitelist has
70
85
  * nothing to say about a string.
71
86
  */
72
- export function restrict (schema: Schema | undefined, allowed: Set<string>): Schema | undefined {
87
+ export function restrict(
88
+ schema: Schema | undefined,
89
+ allowed: Set<string>
90
+ ): Schema | undefined {
73
91
  const shape = schema as Shape | null | undefined
74
92
 
75
- if (shape === undefined || shape === null)
76
- return schema
93
+ if (shape === undefined || shape === null) return schema
77
94
 
78
95
  if (shape.items !== undefined)
79
96
  return { ...shape, items: restrict(shape.items, allowed) } as unknown as Schema
80
97
 
81
- if (shape.properties === undefined)
82
- return schema
98
+ if (shape.properties === undefined) return schema
83
99
 
84
100
  const properties: Record<string, Schema> = {}
85
101
 
86
102
  for (const [name, property] of Object.entries(shape.properties))
87
- if (allowed.has(name))
88
- properties[name] = property
103
+ if (allowed.has(name)) properties[name] = property
89
104
 
90
105
  const restricted: Shape = { ...shape, properties }
91
106