@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
@@ -42,7 +42,7 @@ export class Quotas {
42
42
  */
43
43
  private readonly keyed = new WeakMap<Context, string>()
44
44
 
45
- public constructor (options: Options) {
45
+ public constructor(options: Options) {
46
46
  this.keys = options.keys
47
47
  this.conditional = options.conditional
48
48
  this.emission = options.interval / options.requests
@@ -50,12 +50,13 @@ export class Quotas {
50
50
  this.period = period(options.interval)
51
51
 
52
52
  // a key means one budget, so quotas that do not share one must not share a key
53
- this.prefix = options.name === undefined
54
- ? `t:${options.requests}:${options.interval}:`
55
- : `${options.name}:`
53
+ this.prefix =
54
+ options.name === undefined
55
+ ? `t:${options.requests}:${options.interval}:`
56
+ : `${options.name}:`
56
57
  }
57
58
 
58
- public static create (configuration: Configuration, route: string = ''): Quotas {
59
+ public static create(configuration: Configuration, route: string = ''): Quotas {
59
60
  const { requests, interval, condition } = configuration
60
61
  const keys = Keys.create(configuration.key, condition, route)
61
62
 
@@ -69,12 +70,11 @@ export class Quotas {
69
70
  * the same call that admits it; otherwise only the response can tell whether it counts,
70
71
  * and {@link use} charges once it can.
71
72
  */
72
- public check (context: Context, parameters: Parameter[]): number {
73
+ public check(context: Context, parameters: Parameter[]): number {
73
74
  const key = this.keys.get(context, parameters)
74
75
 
75
76
  // a request that cannot be keyed is not metered
76
- if (key === undefined)
77
- return 0
77
+ if (key === undefined) return 0
78
78
 
79
79
  this.keyed.set(context, key)
80
80
 
@@ -83,25 +83,21 @@ export class Quotas {
83
83
  const tat = Math.max(entry?.tat ?? now, now)
84
84
  const admit = tat + this.emission - this.capacity
85
85
 
86
- if (admit > now)
87
- return Math.ceil((admit - now) / 1000)
86
+ if (admit > now) return Math.ceil((admit - now) / 1000)
88
87
 
89
- if (!this.conditional)
90
- this.charge(key, entry, tat)
88
+ if (!this.conditional) this.charge(key, entry, tat)
91
89
 
92
90
  return 0
93
91
  }
94
92
 
95
93
  /** Charges what the condition accepts, once the response can be matched against it. */
96
- public use (input: Context, output: Output): void {
97
- if (!this.conditional || !this.keys.matches(input, output))
98
- return
94
+ public use(input: Context, output: Output): void {
95
+ if (!this.conditional || !this.keys.matches(input, output)) return
99
96
 
100
97
  // precall always runs first, and a request it refuses never reaches settle
101
98
  const key = this.keyed.get(input) ?? this.keys.get(input)
102
99
 
103
- if (key === undefined)
104
- return
100
+ if (key === undefined) return
105
101
 
106
102
  const now = Date.now()
107
103
  const entry = this.entries.get(key)
@@ -116,7 +112,7 @@ export class Quotas {
116
112
  * The debt is not cleared here but in {@link settled}, so a tick that fails to reach
117
113
  * Redis leaves it to be reported by the next one instead of losing it.
118
114
  */
119
- public flush (now: number, batch: Batch[]): void {
115
+ public flush(now: number, batch: Batch[]): void {
120
116
  for (const [key, entry] of this.entries) {
121
117
  const delta = Math.round(entry.debt)
122
118
 
@@ -127,18 +123,16 @@ export class Quotas {
127
123
  }
128
124
 
129
125
  // out of debt and with nothing left to report, a key says no more than an absent one
130
- if (entry.tat <= now)
131
- this.entries.delete(key)
126
+ if (entry.tat <= now) this.entries.delete(key)
132
127
  }
133
128
  }
134
129
 
135
130
  /** Takes the group's debt back, and clears what this process contributed to it. */
136
- public settled (reported: Batch, debt: number, now: number): void {
131
+ public settled(reported: Batch, debt: number, now: number): void {
137
132
  const entry = this.entries.get(reported.key)
138
133
 
139
134
  if (entry === undefined) {
140
- if (debt > 0)
141
- this.entries.set(reported.key, { tat: now + debt, debt: 0 })
135
+ if (debt > 0) this.entries.set(reported.key, { tat: now + debt, debt: 0 })
142
136
 
143
137
  return
144
138
  }
@@ -149,11 +143,11 @@ export class Quotas {
149
143
  entry.tat = Math.max(entry.tat, now + debt)
150
144
  }
151
145
 
152
- public name (key: string): string {
146
+ public name(key: string): string {
153
147
  return this.prefix + key
154
148
  }
155
149
 
156
- private charge (key: string, entry: Entry | undefined, tat: number): void {
150
+ private charge(key: string, entry: Entry | undefined, tat: number): void {
157
151
  if (entry === undefined)
158
152
  this.entries.set(key, { tat: tat + this.emission, debt: this.emission })
159
153
  else {
@@ -170,7 +164,7 @@ export class Quotas {
170
164
  * what it alone has spent — so it is worth doing an order of magnitude more often than
171
165
  * the interval, within reason on either end.
172
166
  */
173
- function period (interval: number): number {
167
+ function period(interval: number): number {
174
168
  return Math.min(Math.max(interval / 10, MIN_PERIOD), MAX_PERIOD)
175
169
  }
176
170
 
@@ -3,7 +3,7 @@ import assert from 'node:assert/strict'
3
3
 
4
4
  import { Sync } from './Sync.js'
5
5
  import { Quotas } from './Quotas.js'
6
- import type { atomicity } from '@toa.io/core'
6
+ import type { atomicity } from '@toa.io/core/types'
7
7
  import type { Configuration } from './Configuration.js'
8
8
  import type { Input as Context } from '../../../../io.js'
9
9
 
@@ -105,9 +105,11 @@ it('should clear what it reported', async () => {
105
105
  })
106
106
 
107
107
  it('should keep what it could not report, and keep serving', async () => {
108
- sync = new Sync(createStash(() => {
109
- throw new Error('Redis is unreachable')
110
- }))
108
+ sync = new Sync(
109
+ createStash(() => {
110
+ throw new Error('Redis is unreachable')
111
+ })
112
+ )
111
113
 
112
114
  const quotas = createQuotas()
113
115
 
@@ -122,7 +124,7 @@ it('should keep what it could not report, and keep serving', async () => {
122
124
  assert.strictEqual(quotas.check(context, []), 0)
123
125
  })
124
126
 
125
- async function tick (): Promise<void> {
127
+ async function tick(): Promise<void> {
126
128
  mock.timers.tick(250)
127
129
 
128
130
  // the reconciliation a tick starts is asynchronous, and node:test advances
@@ -130,18 +132,20 @@ async function tick (): Promise<void> {
130
132
  await new Promise((resolve) => process.nextTick(resolve))
131
133
  }
132
134
 
133
- function createQuotas (properties?: Partial<Configuration>): Quotas {
135
+ function createQuotas(properties?: Partial<Configuration>): Quotas {
134
136
  const configuration = { key: [{ method: 'path' as const }], requests: 2, interval: 100 }
135
137
 
136
138
  return Quotas.create(Object.assign(configuration, properties))
137
139
  }
138
140
 
139
- function createContext (properties?: any): Context {
140
- return Object.assign({ url: new URL('http://localhost/'), identity: { id: 'one' } },
141
- properties) as unknown as Context
141
+ function createContext(properties?: any): Context {
142
+ return Object.assign(
143
+ { url: new URL('http://localhost/'), identity: { id: 'one' } },
144
+ properties
145
+ ) as unknown as Context
142
146
  }
143
147
 
144
- function createStash (reply?: (deltas: number[]) => number[]): atomicity.Atom {
148
+ function createStash(reply?: (deltas: number[]) => number[]): atomicity.Atom {
145
149
  const atom = {
146
150
  meter: async (keys: string[], deltas: number[]): Promise<number[]> => {
147
151
  invocations.push({ keys, deltas })
@@ -1,6 +1,6 @@
1
1
  import { console } from 'openspan'
2
2
  import type { Quotas } from './Quotas.js'
3
- import type { atomicity } from '@toa.io/core'
3
+ import type { atomicity } from '@toa.io/core/types'
4
4
 
5
5
  /**
6
6
  * Reconciles every quota of the process with the other gateways, on one tick.
@@ -19,11 +19,11 @@ export class Sync {
19
19
  /** Ticks do not overlap: a slow round trip delays reconciling, it does not double it. */
20
20
  private reconciling = false
21
21
 
22
- public constructor (atom: atomicity.Atom) {
22
+ public constructor(atom: atomicity.Atom) {
23
23
  this.atom = atom
24
24
  }
25
25
 
26
- public register (quotas: Quotas): void {
26
+ public register(quotas: Quotas): void {
27
27
  this.quotas.push(quotas)
28
28
 
29
29
  // the shortest interval sets the pace, and reconciling the others more often than
@@ -35,7 +35,7 @@ export class Sync {
35
35
  }
36
36
  }
37
37
 
38
- public dispose (): void {
38
+ public dispose(): void {
39
39
  if (this.timer !== null) {
40
40
  clearInterval(this.timer)
41
41
 
@@ -43,7 +43,7 @@ export class Sync {
43
43
  }
44
44
  }
45
45
 
46
- private start (): void {
46
+ private start(): void {
47
47
  this.dispose()
48
48
 
49
49
  this.timer = setInterval(this.tick, this.period)
@@ -52,17 +52,14 @@ export class Sync {
52
52
  }
53
53
 
54
54
  private readonly tick = (): void => {
55
- if (this.reconciling)
56
- return
55
+ if (this.reconciling) return
57
56
 
58
57
  const now = Date.now()
59
58
  const batch: Batch[] = []
60
59
 
61
- for (const quotas of this.quotas)
62
- quotas.flush(now, batch)
60
+ for (const quotas of this.quotas) quotas.flush(now, batch)
63
61
 
64
- if (batch.length === 0)
65
- return
62
+ if (batch.length === 0) return
66
63
 
67
64
  this.reconciling = true
68
65
 
@@ -71,7 +68,7 @@ export class Sync {
71
68
  })
72
69
  }
73
70
 
74
- private async reconcile (batch: Batch[]): Promise<void> {
71
+ private async reconcile(batch: Batch[]): Promise<void> {
75
72
  try {
76
73
  const keys = batch.map((entry) => entry.quotas.name(entry.key))
77
74
  const deltas = batch.map((entry) => entry.delta)
@@ -9,16 +9,15 @@ export class Warning {
9
9
  private readonly interval: number
10
10
  private last = -Infinity
11
11
 
12
- public constructor (message: string, interval: number = INTERVAL) {
12
+ public constructor(message: string, interval: number = INTERVAL) {
13
13
  this.message = message
14
14
  this.interval = interval
15
15
  }
16
16
 
17
- public emit (attributes?: Record<string, unknown>): void {
17
+ public emit(attributes?: Record<string, unknown>): void {
18
18
  const now = Date.now()
19
19
 
20
- if (now - this.last < this.interval)
21
- return
20
+ if (now - this.last < this.interval) return
22
21
 
23
22
  this.last = now
24
23
 
@@ -12,20 +12,19 @@ import type { Component } from './Component.js'
12
12
  export class IP implements Component {
13
13
  private readonly warning: Warning
14
14
 
15
- public constructor (options: unknown, route: string) {
15
+ public constructor(options: unknown, route: string) {
16
16
  const subject = typeof options === 'string' ? options : throttle(route)
17
17
 
18
18
  this.warning = new Warning(`${subject} is not in effect: the request has no ip`)
19
19
  }
20
20
 
21
- public get (context: Context): string | undefined {
22
- if (context.ip === undefined)
23
- this.warning.emit()
21
+ public get(context: Context): string | undefined {
22
+ if (context.ip === undefined) this.warning.emit()
24
23
 
25
24
  return context.ip
26
25
  }
27
26
  }
28
27
 
29
- function throttle (route: string): string {
28
+ function throttle(route: string): string {
30
29
  return route === '' ? 'Throttle' : `Throttle of ${route}`
31
30
  }
@@ -8,7 +8,7 @@ import type { Component } from './Component.js'
8
8
  * that tells them apart.
9
9
  */
10
10
  export class Identity implements Component {
11
- public get (context: Input): string {
11
+ public get(context: Input): string {
12
12
  return (context as AuthenticatedContext).identity?.id ?? ''
13
13
  }
14
14
  }
@@ -2,7 +2,7 @@ import type { Context } from '../../../../../HTTP/index.js'
2
2
  import type { Component } from './Component.js'
3
3
 
4
4
  export class Path implements Component {
5
- public get (context: Context): string {
5
+ public get(context: Context): string {
6
6
  return context.url.pathname
7
7
  }
8
8
  }
@@ -9,11 +9,11 @@ import type { Component } from './Component.js'
9
9
  export class Route implements Component {
10
10
  private readonly route: string
11
11
 
12
- public constructor (_: unknown, route: string) {
12
+ public constructor(_: unknown, route: string) {
13
13
  this.route = route
14
14
  }
15
15
 
16
- public get (): string {
16
+ public get(): string {
17
17
  return this.route
18
18
  }
19
19
  }
@@ -7,13 +7,13 @@ import type { Component } from './Component.js'
7
7
  export class Segment implements Component {
8
8
  private readonly name: string
9
9
 
10
- public constructor (name: unknown) {
10
+ public constructor(name: unknown) {
11
11
  assert.ok(typeof name === 'string', 'Throttle segment must be a string')
12
12
 
13
13
  this.name = name
14
14
  }
15
15
 
16
- public get (_: Context, parameters: Parameter[]): string {
16
+ public get(_: Context, parameters: Parameter[]): string {
17
17
  return parameters.find(({ name }) => name === this.name)?.value ?? ''
18
18
  }
19
19
  }
@@ -5,13 +5,13 @@ import type { Condition } from './Condition.js'
5
5
  export class Status implements Condition {
6
6
  private readonly status: number
7
7
 
8
- public constructor (status: unknown) {
8
+ public constructor(status: unknown) {
9
9
  assert.ok(typeof status === 'number', 'Status must be a number')
10
10
 
11
11
  this.status = status
12
12
  }
13
13
 
14
- public match (input: Input, output: Output): boolean {
14
+ public match(input: Input, output: Output): boolean {
15
15
  return output?.status === this.status
16
16
  }
17
17
  }
@@ -14,16 +14,22 @@ describe('throttle', () => {
14
14
  for (const key of ['ip', 'path', 'route', 'identity'])
15
15
  assert.doesNotThrow(() => schemas.throttle.validate({ key, ...rest }))
16
16
 
17
- assert.doesNotThrow(() => schemas.throttle.validate({ key: { segment: 'id' }, ...rest }))
18
- assert.doesNotThrow(() => schemas.throttle.validate({
19
- key: ['route', { segment: 'id' }],
20
- ...rest
21
- }))
17
+ assert.doesNotThrow(() =>
18
+ schemas.throttle.validate({ key: { segment: 'id' }, ...rest })
19
+ )
20
+ assert.doesNotThrow(() =>
21
+ schemas.throttle.validate({
22
+ key: ['route', { segment: 'id' }],
23
+ ...rest
24
+ })
25
+ )
22
26
  })
23
27
 
24
28
  it('should reject an unknown key component', () => {
25
29
  assert.throws(() => schemas.throttle.validate({ key: 'header', ...rest }))
26
- assert.throws(() => schemas.throttle.validate({ key: { header: 'x-real-ip' }, ...rest }))
30
+ assert.throws(() =>
31
+ schemas.throttle.validate({ key: { header: 'x-real-ip' }, ...rest })
32
+ )
27
33
  })
28
34
 
29
35
  it('should reject a declaration it no longer honours', () => {
@@ -3,13 +3,13 @@ import { Mapping } from './Mapping.js'
3
3
  import type { Input } from '../../io.js'
4
4
 
5
5
  export class Authority extends Mapping<string> {
6
- public constructor (property: string) {
6
+ public constructor(property: string) {
7
7
  assert.ok(typeof property === 'string', '`map:authority` must be a string')
8
8
 
9
9
  super(property)
10
10
  }
11
11
 
12
- public properties (context: Input): Record<string, string> {
12
+ public properties(context: Input): Record<string, string> {
13
13
  return { [this.value]: context.authority }
14
14
  }
15
15
  }
@@ -3,13 +3,13 @@ import { Mapping } from './Mapping.js'
3
3
  import type { Input } from '../../io.js'
4
4
 
5
5
  export class BufferMapping extends Mapping<string> {
6
- public constructor (property: string) {
6
+ public constructor(property: string) {
7
7
  assert.ok(typeof property === 'string', '`map:buffer` must be a string')
8
8
 
9
9
  super(property)
10
10
  }
11
11
 
12
- public override async properties (context: Input): Promise<Record<string, string>> {
12
+ public override async properties(context: Input): Promise<Record<string, string>> {
13
13
  return { [this.value]: (await context.buffer()).toString('utf8') }
14
14
  }
15
15
  }
@@ -8,50 +8,55 @@ export class Claims extends Mapping<Record<string, string>> {
8
8
  private readonly discovery!: Promise<Component>
9
9
  private federation: Component | null = null
10
10
 
11
- public constructor (map: Record<string, string>, remotes: Remotes) {
11
+ public constructor(map: Record<string, string>, remotes: Remotes) {
12
12
  assert.ok(map.constructor === Object, '`map:claims` must be an object')
13
13
 
14
- assert.ok(Object.values(map).every((value) => typeof value === 'string'),
15
- '`map:claims ` must be an object with string values')
14
+ assert.ok(
15
+ Object.values(map).every((value) => typeof value === 'string'),
16
+ '`map:claims ` must be an object with string values'
17
+ )
16
18
 
17
19
  super(map, remotes)
18
20
 
19
21
  this.discovery = remotes.discover('identity', 'federation')
20
22
  }
21
23
 
22
- public override async properties (context: Input): Promise<Record<string, string> | null> {
24
+ public override async properties(
25
+ context: Input
26
+ ): Promise<Record<string, string> | null> {
23
27
  const authentication = context.request.headers.authorization
24
28
 
25
- if (authentication === undefined)
26
- return null
29
+ if (authentication === undefined) return null
27
30
 
28
31
  const claims = await this.claims(authentication)
29
32
 
30
- if (claims === null)
31
- return null
33
+ if (claims === null) return null
32
34
 
33
- return Object.entries(this.value).reduce((properties: Record<string, string>, [property, claim]) => {
34
- const value = claims[claim]
35
+ return Object.entries(this.value).reduce(
36
+ (properties: Record<string, string>, [property, claim]) => {
37
+ const value = claims[claim]
35
38
 
36
- if (value !== undefined)
37
- properties[property] = value
39
+ if (value !== undefined) properties[property] = value
38
40
 
39
- return properties
40
- }, {})
41
+ return properties
42
+ },
43
+ {}
44
+ )
41
45
  }
42
46
 
43
- private async claims (authentication: string): Promise<Record<string, string> | null> {
47
+ private async claims(authentication: string): Promise<Record<string, string> | null> {
44
48
  const [scheme, credentials] = authentication.split(' ')
45
49
 
46
- if (scheme !== 'Bearer' || credentials === undefined)
47
- return null
50
+ if (scheme !== 'Bearer' || credentials === undefined) return null
48
51
 
49
52
  this.federation ??= await this.discovery
50
53
 
51
- const claims = await this.federation.invoke<Record<string, string> | Error>('decode', { input: credentials })
54
+ const claims = await this.federation.invoke<Record<string, string> | Error>(
55
+ 'decode',
56
+ { input: credentials }
57
+ )
52
58
 
53
- if (claims instanceof Error)
54
- return null
59
+ if (claims instanceof Error) return null
55
60
 
56
61
  return claims
57
62
  }
@@ -15,11 +15,13 @@ const FORBIDDEN = new Set(['host', 'origin'])
15
15
  export class Headers extends Mapping<Record<string, string>> {
16
16
  private readonly headers: string[]
17
17
 
18
- public constructor (map: Record<string, string>) {
18
+ public constructor(map: Record<string, string>) {
19
19
  assert.ok(map.constructor === Object, '`map:headers` must be an object')
20
20
 
21
- assert.ok(Object.values(map).every((value) => typeof value === 'string'),
22
- '`map:headers` must be an object with string values')
21
+ assert.ok(
22
+ Object.values(map).every((value) => typeof value === 'string'),
23
+ '`map:headers` must be an object with string values'
24
+ )
23
25
 
24
26
  super(map)
25
27
 
@@ -27,7 +29,7 @@ export class Headers extends Mapping<Record<string, string>> {
27
29
  this.headers.forEach((header) => cors.allow(header))
28
30
  }
29
31
 
30
- public override explain (introspection: Introspection): void {
32
+ public override explain(introspection: Introspection): void {
31
33
  for (const [property, header] of Object.entries(this.value)) {
32
34
  const schema = take(introspection, property)
33
35
 
@@ -36,21 +38,23 @@ export class Headers extends Mapping<Record<string, string>> {
36
38
  }
37
39
  }
38
40
 
39
- public properties (context: Input): Record<string, string> {
41
+ public properties(context: Input): Record<string, string> {
40
42
  context.pipelines.response.push((response) => {
41
43
  response.headers ??= new global.Headers()
42
44
 
43
- for (const header of this.headers)
44
- response.headers.append('vary', header)
45
+ for (const header of this.headers) response.headers.append('vary', header)
45
46
  })
46
47
 
47
- return Object.entries(this.value).reduce((properties: Record<string, string>, [property, header]) => {
48
- const value = context.request.headers[header]
48
+ return Object.entries(this.value).reduce(
49
+ (properties: Record<string, string>, [property, header]) => {
50
+ const value = context.request.headers[header]
49
51
 
50
- if (value !== undefined)
51
- properties[property] = Array.isArray(value) ? value.join(', ') : value
52
+ if (value !== undefined)
53
+ properties[property] = Array.isArray(value) ? value.join(', ') : value
52
54
 
53
- return properties
54
- }, {})
55
+ return properties
56
+ },
57
+ {}
58
+ )
55
59
  }
56
60
  }
@@ -10,14 +10,18 @@ import type { Directive } from './Directive.js'
10
10
  export class Language extends Mapping<string> {
11
11
  private languages: string[] | null = null
12
12
 
13
- public constructor (property: string) {
13
+ public constructor(property: string) {
14
14
  assert.ok(typeof property === 'string', '`map:language` must be a string')
15
15
 
16
16
  cors.allow('accept-language')
17
17
  super(property)
18
18
  }
19
19
 
20
- public properties (context: Input, parameters: Parameter[], directives: Directive[]): Record<string, string> {
20
+ public properties(
21
+ context: Input,
22
+ parameters: Parameter[],
23
+ directives: Directive[]
24
+ ): Record<string, string> {
21
25
  this.languages ??= this.resolve(directives)
22
26
 
23
27
  const negotiator = new Negotiator(context.request)
@@ -32,10 +36,9 @@ export class Language extends Mapping<string> {
32
36
  return { [this.value]: language }
33
37
  }
34
38
 
35
- private resolve (directives: Directive[]): string[] {
39
+ private resolve(directives: Directive[]): string[] {
36
40
  for (const directive of directives)
37
- if (directive instanceof Languages)
38
- return directive.value
41
+ if (directive instanceof Languages) return directive.value
39
42
 
40
43
  throw new Error('Supported languages are not defined, add `map:languages` directive')
41
44
  }
@@ -2,9 +2,15 @@ import assert from 'node:assert'
2
2
  import { Property } from './Properties.js'
3
3
 
4
4
  export class Languages extends Property<'languages'> {
5
- public constructor (value: string[]) {
6
- assert.ok(Array.isArray(value) && value.length > 0, '`map:languages` must be a non-empty array of strings')
7
- assert.ok(value.every((language) => typeof language === 'string'), '`map:languages` must be an array of strings')
5
+ public constructor(value: string[]) {
6
+ assert.ok(
7
+ Array.isArray(value) && value.length > 0,
8
+ '`map:languages` must be a non-empty array of strings'
9
+ )
10
+ assert.ok(
11
+ value.every((language) => typeof language === 'string'),
12
+ '`map:languages` must be an array of strings'
13
+ )
8
14
 
9
15
  super('languages', value)
10
16
  }