@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
@@ -10,7 +10,7 @@ import type { Remotes } from '../../Remotes.js'
10
10
  import type { Constructor, Directive } from './Directive.js'
11
11
  import type { Introspection } from '../../Introspection.js'
12
12
  import { ATOM_GROUP } from '../../const.js'
13
- import type { extensions } from '@toa.io/core'
13
+ import type { extensions } from '@toa.io/core/types'
14
14
 
15
15
  export class IO implements DirectiveFamily<Directive> {
16
16
  public readonly name = 'io'
@@ -21,12 +21,17 @@ export class IO implements DirectiveFamily<Directive> {
21
21
  /** Throttling reconciles through the atom of the gateways, one for every directive. */
22
22
  private sync: Sync | null = null
23
23
 
24
- public mount (host: extensions.Host): void {
24
+ public mount(host: extensions.Host): void {
25
25
  this.host = host
26
26
  }
27
27
 
28
28
  // eslint-disable-next-line max-params
29
- public create (name: string, value: unknown, remotes: Remotes, route: string): Directive {
29
+ public create(
30
+ name: string,
31
+ value: unknown,
32
+ remotes: Remotes,
33
+ route: string
34
+ ): Directive {
30
35
  if (!(name in constructors))
31
36
  throw new Error(`Directive 'io:${name}' is not implemented`)
32
37
 
@@ -34,14 +39,16 @@ export class IO implements DirectiveFamily<Directive> {
34
39
 
35
40
  Directive.validate(value)
36
41
 
37
- if (name === 'throttle')
38
- this.sync ??= new Sync(this.host.atom(ATOM_GROUP))
42
+ if (name === 'throttle') this.sync ??= new Sync(this.host.atom(ATOM_GROUP))
39
43
 
40
44
  return new Directive(value, this.sync!, route)
41
45
  }
42
46
 
43
- public precall (directives: Directive[], context: http.Context,
44
- parameters: Parameter[]): null {
47
+ public precall(
48
+ directives: Directive[],
49
+ context: http.Context,
50
+ parameters: Parameter[]
51
+ ): null {
45
52
  let restricted = false
46
53
 
47
54
  for (const directive of directives) {
@@ -50,8 +57,7 @@ export class IO implements DirectiveFamily<Directive> {
50
57
  directive.precall(context, parameters)
51
58
  }
52
59
 
53
- if (!restricted)
54
- DENIAL.precall(context, parameters)
60
+ if (!restricted) DENIAL.precall(context, parameters)
55
61
 
56
62
  return null
57
63
  }
@@ -60,16 +66,18 @@ export class IO implements DirectiveFamily<Directive> {
60
66
  * What a whitelist admits is what the schema states. Without an `io:output` the reply is
61
67
  * dropped before it is sent, so there is no output to describe at all.
62
68
  */
63
- public explain (directives: Directive[], _: http.Context,
64
- introspection: Introspection): Introspection {
69
+ public explain(
70
+ directives: Directive[],
71
+ _: http.Context,
72
+ introspection: Introspection
73
+ ): Introspection {
65
74
  let restricted = false
66
75
 
67
76
  for (const directive of directives) {
68
77
  if (directive instanceof Input)
69
78
  introspection.input = restrict(introspection.input, directive.allowed)
70
79
 
71
- if (!(directive instanceof Output))
72
- continue
80
+ if (!(directive instanceof Output)) continue
73
81
 
74
82
  restricted = true
75
83
 
@@ -77,16 +85,17 @@ export class IO implements DirectiveFamily<Directive> {
77
85
  introspection.output = restrict(introspection.output, directive.allowed)
78
86
  }
79
87
 
80
- if (!restricted)
81
- delete introspection.output
88
+ if (!restricted) delete introspection.output
82
89
 
83
90
  return introspection
84
91
  }
85
92
 
86
- public settle (directives: Directive[], context: http.Context,
87
- output: http.OutgoingMessage): void {
88
- for (const directive of directives)
89
- directive.settle?.(context, output)
93
+ public settle(
94
+ directives: Directive[],
95
+ context: http.Context,
96
+ output: http.OutgoingMessage
97
+ ): void {
98
+ for (const directive of directives) directive.settle?.(context, output)
90
99
  }
91
100
 
92
101
  /**
@@ -94,7 +103,7 @@ export class IO implements DirectiveFamily<Directive> {
94
103
  * factory disposes every route it made — so this runs once per route at shutdown,
95
104
  * and disposing an already stopped ticker is what makes that harmless.
96
105
  */
97
- public dispose (): void {
106
+ public dispose(): void {
98
107
  this.sync?.dispose()
99
108
  }
100
109
  }
@@ -8,15 +8,15 @@ export class Input implements Directive {
8
8
  /** what a client may send, which is therefore what the input schema states */
9
9
  public readonly allowed: Set<string>
10
10
 
11
- public constructor (permissions: Permissions) {
11
+ public constructor(permissions: Permissions) {
12
12
  this.allowed = new Set(permissions)
13
13
  }
14
14
 
15
- public static validate (permissions: unknown): asserts permissions is Permissions {
16
- schemas.input.validate<Permissions>(permissions, 'Incorrect \'io:input\' format')
15
+ public static validate(permissions: unknown): asserts permissions is Permissions {
16
+ schemas.input.validate<Permissions>(permissions, "Incorrect 'io:input' format")
17
17
  }
18
18
 
19
- public precall (context: Context): void {
19
+ public precall(context: Context): void {
20
20
  // Restrictions are on what the client sent, so the check goes to the front of the
21
21
  // pipeline whatever order the families ran in: `auth:delegate` embeds the identity
22
22
  // and `map:*` assigns mapped properties, and those additions are the server's own,
@@ -24,9 +24,8 @@ export class Input implements Directive {
24
24
  context.pipelines.body.unshift((body) => this.check(body))
25
25
  }
26
26
 
27
- private check (body: unknown): Message | Message[] | undefined {
28
- if (body === undefined)
29
- return body
27
+ private check(body: unknown): Message | Message[] | undefined {
28
+ if (body === undefined) return body
30
29
 
31
30
  try {
32
31
  schemas.message.validate<Message | Message[]>(body)
@@ -36,21 +35,19 @@ export class Input implements Directive {
36
35
 
37
36
  const property = this.violation(body)
38
37
 
39
- if (property !== undefined)
40
- throw new BadRequest(`Unexpected input: ${property}`)
38
+ if (property !== undefined) throw new BadRequest(`Unexpected input: ${property}`)
41
39
 
42
40
  return body
43
41
  }
44
42
 
45
- private violation (value: Message | Message[]): string | undefined {
43
+ private violation(value: Message | Message[]): string | undefined {
46
44
  if (!Array.isArray(value))
47
45
  return Object.keys(value).find((key) => !this.allowed.has(key))
48
46
 
49
47
  for (const item of value) {
50
48
  const property = this.violation(item)
51
49
 
52
- if (property !== undefined)
53
- return property
50
+ if (property !== undefined) return property
54
51
  }
55
52
  }
56
53
  }
@@ -15,28 +15,24 @@ export class Output implements Directive {
15
15
  private readonly omitted: boolean = true
16
16
  private readonly permissions: string[] = []
17
17
 
18
- public constructor (permissions: Permissions) {
18
+ public constructor(permissions: Permissions) {
19
19
  if (typeof permissions === 'boolean')
20
- if (permissions)
21
- this.disabled = true
22
- else
23
- this.omitted = false
24
-
25
- else
26
- this.permissions = permissions
20
+ if (permissions) this.disabled = true
21
+ else this.omitted = false
22
+ else this.permissions = permissions
27
23
 
28
24
  this.allowed = new Set(this.permissions)
29
25
  }
30
26
 
31
- public static validate (permissions: unknown): asserts permissions is Permissions {
32
- schemas.output.validate(permissions, 'Incorrect \'io:output\' format')
27
+ public static validate(permissions: unknown): asserts permissions is Permissions {
28
+ schemas.output.validate(permissions, "Incorrect 'io:output' format")
33
29
  }
34
30
 
35
- public precall (context: Context): void {
31
+ public precall(context: Context): void {
36
32
  context.pipelines.response.push(this.restriction(context))
37
33
  }
38
34
 
39
- private restriction (context: Context) {
35
+ private restriction(context: Context) {
40
36
  return (message: OutgoingMessage): void => {
41
37
  // what the gateway built is its own — a code and a message — and a restriction has
42
38
  // nothing to say about it; everything else is a reply the operation returned, and is
@@ -45,37 +41,38 @@ export class Output implements Directive {
45
41
  const stream = message.body instanceof Stream
46
42
  const none = message.body === undefined || message.body === null
47
43
 
48
- if (this.disabled || error || stream || none)
49
- return
44
+ if (this.disabled || error || stream || none) return
50
45
 
51
46
  if (typeof message.body !== 'object' || this.permissions.length === 0) {
52
47
  if (this.omitted)
53
- console.warn('Permissions for \'io:output\' are not specified properly, response omitted',
54
- { path: context.url.pathname })
48
+ console.warn(
49
+ "Permissions for 'io:output' are not specified properly, response omitted",
50
+ { path: context.url.pathname }
51
+ )
55
52
 
56
53
  delete message.body
57
54
 
58
55
  return
59
56
  }
60
57
 
61
- schemas.message.validate<Message>(message.body,
62
- '\'io:output\' expects response to be an object or array of objects')
58
+ schemas.message.validate<Message>(
59
+ message.body,
60
+ "'io:output' expects response to be an object or array of objects"
61
+ )
63
62
 
64
63
  if (Array.isArray(message.body))
65
64
  message.body = message.body.map((entity) => this.fit(entity as Message))
66
- else
67
- message.body = this.fit(message.body)
65
+ else message.body = this.fit(message.body)
68
66
  }
69
67
  }
70
68
 
71
69
  /** Runs per entity of a collection, hence the set and the absence of intermediates. */
72
- private fit (message: Message): Message {
70
+ private fit(message: Message): Message {
73
71
  const output: Message = {}
74
72
 
75
73
  // the keys of the entity, so that the response keeps the order it was built in
76
74
  for (const key of Object.keys(message))
77
- if (this.allowed.has(key))
78
- output[key] = message[key]
75
+ if (this.allowed.has(key)) output[key] = message[key]
79
76
 
80
77
  return output
81
78
  }
@@ -8,8 +8,11 @@ import type { OutgoingMessage } from '../../HTTP/index.js'
8
8
 
9
9
  const status = new Status('status')
10
10
 
11
- function context (): Context {
12
- return { pipelines: { body: [], response: [] }, url: { pathname: '/' } } as unknown as Context
11
+ function context(): Context {
12
+ return {
13
+ pipelines: { body: [], response: [] },
14
+ url: { pathname: '/' }
15
+ } as unknown as Context
13
16
  }
14
17
 
15
18
  it('should take the status from the property and remove it', () => {
@@ -55,8 +58,7 @@ it('should have a reply it named the status of restricted, whatever that status
55
58
 
56
59
  status.settle(ctx, response)
57
60
 
58
- for (const transform of ctx.pipelines.response)
59
- transform(response)
61
+ for (const transform of ctx.pipelines.response) transform(response)
60
62
 
61
63
  assert.equal(response.status, stated)
62
64
  assert.deepEqual(response.body, { code: 'SplxlO', error: 'invalid_grant' })
@@ -76,9 +78,11 @@ it('should leave a failure the gateway built alone, on such a route too', () =>
76
78
  body: { code: 'NOT_FOUND', message: 'nope' }
77
79
  }
78
80
 
79
- for (const transform of ctx.pipelines.response)
80
- transform(response)
81
+ for (const transform of ctx.pipelines.response) transform(response)
81
82
 
82
- assert.deepEqual(response.body, { code: 'NOT_FOUND', message: 'nope' },
83
- 'a code and a message are not what a restriction has anything to say about')
83
+ assert.deepEqual(
84
+ response.body,
85
+ { code: 'NOT_FOUND', message: 'nope' },
86
+ 'a code and a message are not what a restriction has anything to say about'
87
+ )
84
88
  })
@@ -15,28 +15,29 @@ import type * as http from '../../HTTP/index.js'
15
15
  export class Status implements Directive {
16
16
  private readonly property: string
17
17
 
18
- public constructor (property: unknown) {
18
+ public constructor(property: unknown) {
19
19
  this.property = property as string
20
20
  }
21
21
 
22
- public static validate (value: unknown): asserts value is string {
22
+ public static validate(value: unknown): asserts value is string {
23
23
  assert.ok(typeof value === 'string', '`io:status` must be a string')
24
24
  }
25
25
 
26
- public precall (): void {
26
+ public precall(): void {
27
27
  // nothing to do until the operation has answered
28
28
  }
29
29
 
30
- public settle (_: unknown, response: http.OutgoingMessage): void {
30
+ public settle(_: unknown, response: http.OutgoingMessage): void {
31
31
  const body: unknown = response.body
32
32
 
33
- if (body === null || typeof body !== 'object' || !(this.property in body))
34
- return
33
+ if (body === null || typeof body !== 'object' || !(this.property in body)) return
35
34
 
36
35
  const value: unknown = (body as Record<string, unknown>)[this.property]
37
36
 
38
- assert.ok(typeof value === 'number',
39
- `\`io:status\` expects '${this.property}' to be a number`)
37
+ assert.ok(
38
+ typeof value === 'number',
39
+ `\`io:status\` expects '${this.property}' to be a number`
40
+ )
40
41
 
41
42
  response.status = value
42
43
 
@@ -8,24 +8,23 @@ import type { Directive } from './Directive.js'
8
8
  export class Throttle implements Directive {
9
9
  private readonly quotas: Quotas
10
10
 
11
- public constructor (declaration: Declaration, sync: Sync, route: string) {
11
+ public constructor(declaration: Declaration, sync: Sync, route: string) {
12
12
  this.quotas = Quotas.create(parse(declaration), route)
13
13
 
14
14
  sync.register(this.quotas)
15
15
  }
16
16
 
17
- public static validate (declaration: unknown): asserts declaration is Declaration {
18
- schemas.throttle.validate(declaration, 'Incorrect \'io:throttle\' format')
17
+ public static validate(declaration: unknown): asserts declaration is Declaration {
18
+ schemas.throttle.validate(declaration, "Incorrect 'io:throttle' format")
19
19
  }
20
20
 
21
- public precall (context: http.Context, parameters: Parameter[]): void {
21
+ public precall(context: http.Context, parameters: Parameter[]): void {
22
22
  const retry = this.quotas.check(context, parameters)
23
23
 
24
- if (retry > 0)
25
- throw new TooManyRequests(retry)
24
+ if (retry > 0) throw new TooManyRequests(retry)
26
25
  }
27
26
 
28
- public settle (context: http.Context, output: http.OutgoingMessage): void {
27
+ public settle(context: http.Context, output: http.OutgoingMessage): void {
29
28
  this.quotas.use(context, output)
30
29
  }
31
30
  }
@@ -22,23 +22,29 @@ it('should convert key', () => {
22
22
  })
23
23
 
24
24
  it('should convert condition', () => {
25
- assert.partialDeepStrictEqual(parse({ key: ['ip', 'path'], condition: { status: '404' }, ...rest }), {
26
- condition: [
27
- {
28
- method: 'status',
29
- options: '404'
30
- }
31
- ]
32
- })
25
+ assert.partialDeepStrictEqual(
26
+ parse({ key: ['ip', 'path'], condition: { status: '404' }, ...rest }),
27
+ {
28
+ condition: [
29
+ {
30
+ method: 'status',
31
+ options: '404'
32
+ }
33
+ ]
34
+ }
35
+ )
33
36
 
34
- assert.partialDeepStrictEqual(parse({ key: 'ip', condition: { status: '404' }, ...rest }), {
35
- condition: [
36
- {
37
- method: 'status',
38
- options: '404'
39
- }
40
- ]
41
- })
37
+ assert.partialDeepStrictEqual(
38
+ parse({ key: 'ip', condition: { status: '404' }, ...rest }),
39
+ {
40
+ condition: [
41
+ {
42
+ method: 'status',
43
+ options: '404'
44
+ }
45
+ ]
46
+ }
47
+ )
42
48
  })
43
49
 
44
50
  it('should convert a key component that takes an argument', () => {
@@ -53,11 +59,14 @@ it('should convert a key component that takes an argument', () => {
53
59
  })
54
60
 
55
61
  it('should convert a mixed key', () => {
56
- assert.partialDeepStrictEqual(parse({ key: ['route', { segment: 'id' }, 'identity'], ...rest }), {
57
- key: [
58
- { method: 'route' },
59
- { method: 'segment', options: 'id' },
60
- { method: 'identity' }
61
- ]
62
- })
62
+ assert.partialDeepStrictEqual(
63
+ parse({ key: ['route', { segment: 'id' }, 'identity'], ...rest }),
64
+ {
65
+ key: [
66
+ { method: 'route' },
67
+ { method: 'segment', options: 'id' },
68
+ { method: 'identity' }
69
+ ]
70
+ }
71
+ )
63
72
  })
@@ -21,7 +21,7 @@ type KeyEntry = KeyComponentMethod | { segment: string }
21
21
  type KeyDeclaration = KeyEntry | KeyEntry[]
22
22
 
23
23
  type ConditionDeclaration =
24
- Record<KeyConditionMethod, unknown>
24
+ | Record<KeyConditionMethod, unknown>
25
25
  | Array<Record<KeyConditionMethod, unknown>>
26
26
 
27
27
  export interface Declaration extends Omit<Configuration, 'key' | 'condition'> {
@@ -29,7 +29,7 @@ export interface Declaration extends Omit<Configuration, 'key' | 'condition'> {
29
29
  condition?: ConditionDeclaration
30
30
  }
31
31
 
32
- export function parse (declaration: Declaration): Configuration {
32
+ export function parse(declaration: Declaration): Configuration {
33
33
  const { key, condition, requests, interval } = declaration
34
34
 
35
35
  return {
@@ -40,24 +40,29 @@ export function parse (declaration: Declaration): Configuration {
40
40
  }
41
41
  }
42
42
 
43
- function mapKey (declaration: KeyDeclaration): KeyComponent[] {
43
+ function mapKey(declaration: KeyDeclaration): KeyComponent[] {
44
44
  const entries = Array.isArray(declaration) ? declaration : [declaration]
45
45
 
46
46
  // a bare `path`, or `segment: id` for the ones that take an argument
47
47
  return entries.flatMap((entry): KeyComponent[] =>
48
48
  typeof entry === 'string'
49
49
  ? [{ method: entry }]
50
- : Object.entries(entry).map(([method, options]) =>
51
- ({ method: method as KeyComponentMethod, options })))
50
+ : Object.entries(entry).map(([method, options]) => ({
51
+ method: method as KeyComponentMethod,
52
+ options
53
+ }))
54
+ )
52
55
  }
53
56
 
54
- function mapCondition (declaration?: ConditionDeclaration): KeyCondition[] | undefined {
55
- if (declaration === undefined)
56
- return
57
+ function mapCondition(declaration?: ConditionDeclaration): KeyCondition[] | undefined {
58
+ if (declaration === undefined) return
57
59
 
58
60
  // reduce to a single object, then map entries to rules
59
61
  const conditions = Array.isArray(declaration) ? declaration : [declaration]
60
62
  const single = conditions.reduce((acc, condition) => ({ ...acc, ...condition }), {})
61
63
 
62
- return Object.entries(single).map(([method, options]) => ({ method, options })) as KeyCondition[]
64
+ return Object.entries(single).map(([method, options]) => ({
65
+ method,
66
+ options
67
+ })) as KeyCondition[]
63
68
  }
@@ -11,30 +11,35 @@ export class Keys {
11
11
  private readonly components: Component[]
12
12
  private readonly conditions?: Condition[]
13
13
 
14
- public constructor (components: Component[], conditions?: Condition[]) {
14
+ public constructor(components: Component[], conditions?: Condition[]) {
15
15
  this.components = components
16
16
  this.conditions = conditions
17
17
  }
18
18
 
19
- public static create (componentRules: KeyComponent[], conditionRules?: KeyCondition[],
20
- route: string = ''): Keys {
21
- const components = componentRules.map((rule) =>
22
- new Components[rule.method](rule.options, route))
19
+ public static create(
20
+ componentRules: KeyComponent[],
21
+ conditionRules?: KeyCondition[],
22
+ route: string = ''
23
+ ): Keys {
24
+ const components = componentRules.map(
25
+ (rule) => new Components[rule.method](rule.options, route)
26
+ )
23
27
 
24
- const conditions = conditionRules?.map((rule) => new Conditions[rule.method](rule.options))
28
+ const conditions = conditionRules?.map(
29
+ (rule) => new Conditions[rule.method](rule.options)
30
+ )
25
31
 
26
32
  return new this(components, conditions)
27
33
  }
28
34
 
29
35
  /** The key of the request, or nothing when a component cannot key it. */
30
- public get (context: Context, parameters: Parameter[] = NONE): string | undefined {
36
+ public get(context: Context, parameters: Parameter[] = NONE): string | undefined {
31
37
  const hash = createHash('sha256')
32
38
 
33
39
  for (const component of this.components) {
34
40
  const part = component.get(context, parameters)
35
41
 
36
- if (part === undefined)
37
- return
42
+ if (part === undefined) return
38
43
 
39
44
  hash.update(part)
40
45
  }
@@ -42,7 +47,7 @@ export class Keys {
42
47
  return hash.digest('hex')
43
48
  }
44
49
 
45
- public matches (input: Context, output: Output): boolean {
50
+ public matches(input: Context, output: Output): boolean {
46
51
  return this.conditions?.some((condition) => !condition.match(input, output)) !== true
47
52
  }
48
53
  }
@@ -77,8 +77,7 @@ describe('retry', () => {
77
77
  quotas = Quotas.create(createConfiguration({ requests: 10, interval: 1000 }))
78
78
  context = createContext()
79
79
 
80
- for (let i = 0; i < 10; i++)
81
- quotas.check(context, [])
80
+ for (let i = 0; i < 10; i++) quotas.check(context, [])
82
81
 
83
82
  // an emission here is a tenth of a second, and `Retry-After` counts in whole ones
84
83
  assert.strictEqual(quotas.check(context, []), 1)
@@ -237,14 +236,16 @@ describe('ip', () => {
237
236
 
238
237
  const context = createContext({})
239
238
 
240
- for (let i = 0; i < 5; i++)
241
- assert.strictEqual(quotas.check(context, []), 0)
239
+ for (let i = 0; i < 5; i++) assert.strictEqual(quotas.check(context, []), 0)
242
240
  })
243
241
  })
244
242
 
245
243
  describe('route', () => {
246
244
  it('should key on the route, not on the path it came in on', () => {
247
- quotas = Quotas.create(createConfiguration({ key: [{ method: 'route' }] }), '/users/:id')
245
+ quotas = Quotas.create(
246
+ createConfiguration({ key: [{ method: 'route' }] }),
247
+ '/users/:id'
248
+ )
248
249
 
249
250
  const one = createContext({ url: new URL('http://localhost/users/1/') })
250
251
  const two = createContext({ url: new URL('http://localhost/users/2/') })
@@ -258,8 +259,14 @@ describe('route', () => {
258
259
  })
259
260
 
260
261
  it('should have separate quotas per route', () => {
261
- const users = Quotas.create(createConfiguration({ key: [{ method: 'route' }] }), '/users/:id')
262
- const posts = Quotas.create(createConfiguration({ key: [{ method: 'route' }] }), '/posts/:id')
262
+ const users = Quotas.create(
263
+ createConfiguration({ key: [{ method: 'route' }] }),
264
+ '/users/:id'
265
+ )
266
+ const posts = Quotas.create(
267
+ createConfiguration({ key: [{ method: 'route' }] }),
268
+ '/posts/:id'
269
+ )
263
270
 
264
271
  context = createContext({ url: new URL('http://localhost/users/1/') })
265
272
 
@@ -323,7 +330,9 @@ describe('identity', () => {
323
330
  describe('status', () => {
324
331
  beforeEach(() => {
325
332
  context = createContext()
326
- configuration = createConfiguration({ condition: [{ method: 'status', options: 404 }] })
333
+ configuration = createConfiguration({
334
+ condition: [{ method: 'status', options: 404 }]
335
+ })
327
336
  quotas = Quotas.create(configuration)
328
337
  })
329
338
 
@@ -356,7 +365,9 @@ describe('status', () => {
356
365
  it('should charge the key checking saw, which settling cannot recompute', () => {
357
366
  const keys = [{ method: 'segment' as const, options: 'id' }]
358
367
 
359
- quotas = Quotas.create(createConfiguration({ key: keys, condition: configuration.condition }))
368
+ quotas = Quotas.create(
369
+ createConfiguration({ key: keys, condition: configuration.condition })
370
+ )
360
371
 
361
372
  const one = createContext()
362
373
  const two = createContext()
@@ -373,23 +384,28 @@ describe('status', () => {
373
384
  })
374
385
  })
375
386
 
376
- function flush (now: number = Date.now(), ...of: Quotas[]): Batch[] {
387
+ function flush(now: number = Date.now(), ...of: Quotas[]): Batch[] {
377
388
  const batch: Batch[] = []
378
389
 
379
- for (const one of of.length === 0 ? [quotas] : of)
380
- one.flush(now, batch)
390
+ for (const one of of.length === 0 ? [quotas] : of) one.flush(now, batch)
381
391
 
382
392
  return batch
383
393
  }
384
394
 
385
- function createConfiguration (properties?: Partial<Configuration>): Configuration {
386
- return Object.assign({ key: [{ method: 'path' }], requests: 2, interval: 100 }, properties)
395
+ function createConfiguration(properties?: Partial<Configuration>): Configuration {
396
+ return Object.assign(
397
+ { key: [{ method: 'path' }], requests: 2, interval: 100 },
398
+ properties
399
+ )
387
400
  }
388
401
 
389
- function createContext (properties?: any): Context {
390
- return Object.assign({ url: new URL('http://localhost/') }, properties) as unknown as Context
402
+ function createContext(properties?: any): Context {
403
+ return Object.assign(
404
+ { url: new URL('http://localhost/') },
405
+ properties
406
+ ) as unknown as Context
391
407
  }
392
408
 
393
- async function timeout (ms: number): Promise<void> {
409
+ async function timeout(ms: number): Promise<void> {
394
410
  await setTimeout(ms * 1.2)
395
411
  }