@toa.io/extensions.exposition 1.0.0-alpha.285 → 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 (611) 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 +16 -16
  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 +31 -21
  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/octets.cloudinary.feature +1 -1
  223. package/features/octets.download.feature +1 -0
  224. package/features/require.feature +1 -2
  225. package/features/steps/Captures.ts +1 -1
  226. package/features/steps/Cloudinary.ts +1 -2
  227. package/features/steps/Common.ts +4 -5
  228. package/features/steps/Components.ts +17 -12
  229. package/features/steps/Database.ts +42 -23
  230. package/features/steps/Gateway.ts +55 -72
  231. package/features/steps/HTTP.ts +12 -15
  232. package/features/steps/IDP.ts +118 -94
  233. package/features/steps/Identity.ts +3 -3
  234. package/features/steps/OTP.ts +3 -3
  235. package/features/steps/Parameters.ts +20 -10
  236. package/features/steps/Probe.ts +9 -7
  237. package/features/steps/Realtime.ts +40 -22
  238. package/features/steps/Workspace.ts +10 -7
  239. package/features/steps/components/audit/operations/record.js +1 -1
  240. package/features/steps/components/echo/operations/affect.js +1 -1
  241. package/features/steps/components/echo/operations/compute.js +1 -1
  242. package/features/steps/components/echo/operations/echo.js +1 -1
  243. package/features/steps/components/echo/operations/error.js +1 -1
  244. package/features/steps/components/echo/operations/identity.js +1 -1
  245. package/features/steps/components/echo/operations/parameters.js +1 -1
  246. package/features/steps/components/echo/operations/ping.js +1 -1
  247. package/features/steps/components/echo/operations/unwrap.js +1 -1
  248. package/features/steps/components/greeter/operations/greet.js +1 -1
  249. package/features/steps/components/notify/operations/send.js +1 -1
  250. package/features/steps/components/octets.tester/operations/authority.js +1 -1
  251. package/features/steps/components/octets.tester/operations/bar.js +1 -1
  252. package/features/steps/components/octets.tester/operations/baz.js +1 -1
  253. package/features/steps/components/octets.tester/operations/concat.js +1 -1
  254. package/features/steps/components/octets.tester/operations/echo.js +1 -1
  255. package/features/steps/components/octets.tester/operations/err.js +1 -1
  256. package/features/steps/components/octets.tester/operations/foo.js +1 -1
  257. package/features/steps/components/octets.tester/operations/id.js +1 -1
  258. package/features/steps/components/octets.tester/operations/identity.js +1 -1
  259. package/features/steps/components/octets.tester/operations/redirect.js +6 -4
  260. package/features/steps/components/octets.tester/operations/yex.js +1 -1
  261. package/features/steps/components/octets.tester/operations/yield.js +1 -1
  262. package/features/steps/components/orders/manifest.toa.yaml +10 -12
  263. package/features/steps/components/orders/operations/create.js +4 -2
  264. package/features/steps/components/pots/manifest.toa.yaml +15 -20
  265. package/features/steps/components/pots/migrations/0002-indexes.yaml +4 -0
  266. package/features/steps/components/pricing/operations/quote.js +1 -1
  267. package/features/steps/components/sequences/manifest.toa.yaml +0 -1
  268. package/features/steps/components/sequences/operations/numbers.js +1 -1
  269. package/features/steps/components/sequences/operations/tokens.js +3 -3
  270. package/features/steps/components/users/manifest.toa.yaml +3 -5
  271. package/features/steps/components/users/operations/create.js +1 -1
  272. package/features/steps/components/users.properties/manifest.toa.yaml +5 -6
  273. package/features/steps/map.ts +2 -2
  274. package/features/timestamps.feature +1 -1
  275. package/package.json +7 -7
  276. package/readme.md +11 -11
  277. package/schemas/annotation.cos.yaml +1 -3
  278. package/schemas/method.cos.yaml +2 -0
  279. package/source/Branch.test.ts +2 -2
  280. package/source/Branch.ts +3 -5
  281. package/source/Composition.ts +5 -5
  282. package/source/Directive.test.ts +38 -20
  283. package/source/Directive.ts +61 -47
  284. package/source/Endpoint.test.ts +1 -1
  285. package/source/Endpoint.ts +27 -92
  286. package/source/Factory.ts +26 -12
  287. package/source/Gateway.ts +87 -76
  288. package/source/HTTP/Context.ts +23 -30
  289. package/source/HTTP/Probe.ts +7 -9
  290. package/source/HTTP/Server.ts +88 -69
  291. package/source/HTTP/Timing.ts +6 -21
  292. package/source/HTTP/address.test.ts +8 -2
  293. package/source/HTTP/address.ts +2 -3
  294. package/source/HTTP/exceptions.ts +20 -18
  295. package/source/HTTP/formats/form.ts +1 -1
  296. package/source/HTTP/formats/json.ts +2 -2
  297. package/source/HTTP/formats/msgpack.ts +3 -4
  298. package/source/HTTP/formats/text.ts +2 -2
  299. package/source/HTTP/formats/yaml.test.ts +4 -1
  300. package/source/HTTP/formats/yaml.ts +14 -11
  301. package/source/HTTP/messages.test.ts +38 -28
  302. package/source/HTTP/messages.ts +44 -98
  303. package/source/Interception.ts +3 -4
  304. package/source/Introspection.ts +26 -14
  305. package/source/MCP/Server.ts +114 -54
  306. package/source/MCP/discover.ts +6 -7
  307. package/source/MCP/errors.ts +7 -8
  308. package/source/MCP/schema.test.ts +9 -3
  309. package/source/MCP/schema.ts +12 -16
  310. package/source/MCP/tools.ts +33 -28
  311. package/source/Mapping.ts +25 -27
  312. package/source/Query.ts +58 -44
  313. package/source/RPC/Context.ts +8 -11
  314. package/source/RPC/Dispatcher.ts +46 -26
  315. package/source/RPC/errors.test.ts +41 -16
  316. package/source/RPC/errors.ts +9 -10
  317. package/source/RPC/names.test.ts +35 -16
  318. package/source/RPC/names.ts +22 -29
  319. package/source/RTD/Directives.ts +21 -10
  320. package/source/RTD/Endpoint.ts +4 -1
  321. package/source/RTD/Method.ts +8 -6
  322. package/source/RTD/Node.ts +32 -34
  323. package/source/RTD/Route.ts +18 -21
  324. package/source/RTD/Tree.ts +18 -18
  325. package/source/RTD/factory.ts +13 -16
  326. package/source/RTD/segment.ts +12 -10
  327. package/source/RTD/syntax/parse.test.ts +12 -6
  328. package/source/RTD/syntax/parse.ts +30 -26
  329. package/source/RTD/syntax/types.ts +17 -1
  330. package/source/RTD/walk.test.ts +59 -22
  331. package/source/Remotes.test.ts +25 -4
  332. package/source/Remotes.ts +9 -4
  333. package/source/Tenant.ts +12 -12
  334. package/source/deployment.ts +20 -20
  335. package/source/directives/auth/Anonymous.test.ts +8 -2
  336. package/source/directives/auth/Anonymous.ts +5 -8
  337. package/source/directives/auth/Anyone.ts +3 -3
  338. package/source/directives/auth/Assert.ts +10 -10
  339. package/source/directives/auth/Authorization.ts +83 -69
  340. package/source/directives/auth/Delegate.test.ts +2 -2
  341. package/source/directives/auth/Delegate.ts +8 -10
  342. package/source/directives/auth/Echo.ts +5 -8
  343. package/source/directives/auth/Federation.ts +30 -21
  344. package/source/directives/auth/Id.ts +7 -4
  345. package/source/directives/auth/Incept.ts +32 -26
  346. package/source/directives/auth/Input.ts +36 -20
  347. package/source/directives/auth/Role.test.ts +49 -23
  348. package/source/directives/auth/Role.ts +29 -22
  349. package/source/directives/auth/Rule.ts +13 -8
  350. package/source/directives/auth/Scheme.ts +7 -7
  351. package/source/directives/auth/create.ts +1 -1
  352. package/source/directives/auth/schemes.ts +1 -1
  353. package/source/directives/auth/split.ts +2 -3
  354. package/source/directives/auth/types.ts +5 -2
  355. package/source/directives/cache/Cache.ts +44 -9
  356. package/source/directives/cache/Control.ts +25 -26
  357. package/source/directives/cache/Exact.ts +1 -1
  358. package/source/directives/cache/etag.ts +38 -0
  359. package/source/directives/cors/CORS.ts +9 -7
  360. package/source/directives/dev/Development.ts +3 -4
  361. package/source/directives/dev/Faulty.ts +11 -6
  362. package/source/directives/dev/Sleep.ts +5 -7
  363. package/source/directives/dev/Stub.ts +2 -2
  364. package/source/directives/dev/Throw.ts +2 -2
  365. package/source/directives/flow/Compose.ts +26 -20
  366. package/source/directives/flow/Fetch.ts +15 -15
  367. package/source/directives/flow/Flow.ts +9 -8
  368. package/source/directives/index.ts +11 -2
  369. package/source/directives/io/IO.ts +29 -20
  370. package/source/directives/io/Input.ts +9 -12
  371. package/source/directives/io/Output.ts +20 -23
  372. package/source/directives/io/Status.test.ts +12 -8
  373. package/source/directives/io/Status.ts +9 -8
  374. package/source/directives/io/Throttle.ts +6 -7
  375. package/source/directives/io/lib/throttle/Configuration.test.ts +32 -23
  376. package/source/directives/io/lib/throttle/Configuration.ts +14 -9
  377. package/source/directives/io/lib/throttle/Keys.ts +15 -10
  378. package/source/directives/io/lib/throttle/Quotas.test.ts +33 -17
  379. package/source/directives/io/lib/throttle/Quotas.ts +20 -26
  380. package/source/directives/io/lib/throttle/Sync.test.ts +14 -10
  381. package/source/directives/io/lib/throttle/Sync.ts +9 -12
  382. package/source/directives/io/lib/throttle/Warning.ts +3 -4
  383. package/source/directives/io/lib/throttle/components/IP.ts +4 -5
  384. package/source/directives/io/lib/throttle/components/Identity.ts +1 -1
  385. package/source/directives/io/lib/throttle/components/Path.ts +1 -1
  386. package/source/directives/io/lib/throttle/components/Route.ts +2 -2
  387. package/source/directives/io/lib/throttle/components/Segment.ts +2 -2
  388. package/source/directives/io/lib/throttle/conditions/Status.ts +2 -2
  389. package/source/directives/io/schemas.test.ts +12 -6
  390. package/source/directives/map/Authority.ts +2 -2
  391. package/source/directives/map/Buffer.ts +2 -2
  392. package/source/directives/map/Claims.ts +25 -20
  393. package/source/directives/map/Headers.ts +17 -13
  394. package/source/directives/map/Language.ts +8 -5
  395. package/source/directives/map/Languages.ts +9 -3
  396. package/source/directives/map/Map.ts +25 -12
  397. package/source/directives/map/Mapping.ts +9 -6
  398. package/source/directives/map/Properties.ts +1 -1
  399. package/source/directives/map/Segments.ts +22 -15
  400. package/source/directives/mcp/MCP.ts +9 -7
  401. package/source/directives/mcp/Tool.test.ts +21 -9
  402. package/source/directives/mcp/Tool.ts +23 -11
  403. package/source/directives/oauth/Discovery.ts +7 -11
  404. package/source/directives/oauth/documents.ts +11 -14
  405. package/source/directives/octets/Context.ts +6 -3
  406. package/source/directives/octets/Delete.ts +33 -25
  407. package/source/directives/octets/Directive.ts +5 -1
  408. package/source/directives/octets/Get.ts +13 -21
  409. package/source/directives/octets/Octets.ts +20 -15
  410. package/source/directives/octets/Put.ts +62 -27
  411. package/source/directives/octets/Workflow.ts +18 -12
  412. package/source/directives/octets/bytes.ts +1 -1
  413. package/source/directives/octets/schemas.test.ts +8 -14
  414. package/source/directives/octets/workflows/Execution.ts +19 -21
  415. package/source/directives/octets/workflows/Workflow.ts +10 -7
  416. package/source/directives/require/Headers.ts +3 -4
  417. package/source/directives/require/Require.ts +3 -4
  418. package/source/exceptions.ts +19 -12
  419. package/source/index.ts +1 -1
  420. package/source/manifest.test.ts +4 -1
  421. package/source/manifest.ts +19 -13
  422. package/source/octets.d.ts +1 -1
  423. package/source/root.ts +3 -2
  424. package/source/schemas.test.ts +17 -3
  425. package/transpiled/Branch.js.map +1 -1
  426. package/transpiled/Composition.js.map +1 -1
  427. package/transpiled/Directive.js +6 -2
  428. package/transpiled/Directive.js.map +1 -1
  429. package/transpiled/Endpoint.d.ts +0 -2
  430. package/transpiled/Endpoint.js +11 -52
  431. package/transpiled/Endpoint.js.map +1 -1
  432. package/transpiled/Factory.d.ts +2 -1
  433. package/transpiled/Factory.js +1 -0
  434. package/transpiled/Factory.js.map +1 -1
  435. package/transpiled/Gateway.d.ts +2 -1
  436. package/transpiled/Gateway.js +24 -15
  437. package/transpiled/Gateway.js.map +1 -1
  438. package/transpiled/HTTP/Context.d.ts +0 -3
  439. package/transpiled/HTTP/Context.js +7 -9
  440. package/transpiled/HTTP/Context.js.map +1 -1
  441. package/transpiled/HTTP/Probe.js.map +1 -1
  442. package/transpiled/HTTP/Server.js +19 -4
  443. package/transpiled/HTTP/Server.js.map +1 -1
  444. package/transpiled/HTTP/Timing.d.ts +1 -2
  445. package/transpiled/HTTP/Timing.js +2 -10
  446. package/transpiled/HTTP/Timing.js.map +1 -1
  447. package/transpiled/HTTP/address.js.map +1 -1
  448. package/transpiled/HTTP/exceptions.js.map +1 -1
  449. package/transpiled/HTTP/formats/form.js.map +1 -1
  450. package/transpiled/HTTP/formats/json.js.map +1 -1
  451. package/transpiled/HTTP/formats/msgpack.js.map +1 -1
  452. package/transpiled/HTTP/formats/text.js.map +1 -1
  453. package/transpiled/HTTP/formats/yaml.js +4 -1
  454. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  455. package/transpiled/HTTP/messages.d.ts +3 -2
  456. package/transpiled/HTTP/messages.js +1 -43
  457. package/transpiled/HTTP/messages.js.map +1 -1
  458. package/transpiled/Interception.js.map +1 -1
  459. package/transpiled/Introspection.js +13 -2
  460. package/transpiled/Introspection.js.map +1 -1
  461. package/transpiled/MCP/Server.js +15 -4
  462. package/transpiled/MCP/Server.js.map +1 -1
  463. package/transpiled/MCP/discover.js.map +1 -1
  464. package/transpiled/MCP/errors.js.map +1 -1
  465. package/transpiled/MCP/schema.js +1 -1
  466. package/transpiled/MCP/schema.js.map +1 -1
  467. package/transpiled/MCP/tools.js +10 -7
  468. package/transpiled/MCP/tools.js.map +1 -1
  469. package/transpiled/Mapping.d.ts +2 -2
  470. package/transpiled/Mapping.js +3 -5
  471. package/transpiled/Mapping.js.map +1 -1
  472. package/transpiled/Query.d.ts +6 -2
  473. package/transpiled/Query.js +23 -8
  474. package/transpiled/Query.js.map +1 -1
  475. package/transpiled/RPC/Context.js +0 -7
  476. package/transpiled/RPC/Context.js.map +1 -1
  477. package/transpiled/RPC/Dispatcher.js +4 -1
  478. package/transpiled/RPC/Dispatcher.js.map +1 -1
  479. package/transpiled/RPC/errors.js.map +1 -1
  480. package/transpiled/RPC/names.js.map +1 -1
  481. package/transpiled/RTD/Directives.d.ts +1 -1
  482. package/transpiled/RTD/Method.js +1 -3
  483. package/transpiled/RTD/Method.js.map +1 -1
  484. package/transpiled/RTD/Node.js +5 -4
  485. package/transpiled/RTD/Node.js.map +1 -1
  486. package/transpiled/RTD/Route.js +4 -1
  487. package/transpiled/RTD/Route.js.map +1 -1
  488. package/transpiled/RTD/Tree.js +1 -1
  489. package/transpiled/RTD/Tree.js.map +1 -1
  490. package/transpiled/RTD/factory.js.map +1 -1
  491. package/transpiled/RTD/segment.js.map +1 -1
  492. package/transpiled/RTD/syntax/parse.js.map +1 -1
  493. package/transpiled/RTD/syntax/types.d.ts +6 -0
  494. package/transpiled/RTD/syntax/types.js +10 -1
  495. package/transpiled/RTD/syntax/types.js.map +1 -1
  496. package/transpiled/Remotes.js.map +1 -1
  497. package/transpiled/Tenant.d.ts +1 -1
  498. package/transpiled/Tenant.js.map +1 -1
  499. package/transpiled/deployment.d.ts +3 -0
  500. package/transpiled/deployment.js +6 -1
  501. package/transpiled/deployment.js.map +1 -1
  502. package/transpiled/directives/auth/Anonymous.js +1 -3
  503. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  504. package/transpiled/directives/auth/Anyone.js.map +1 -1
  505. package/transpiled/directives/auth/Assert.js.map +1 -1
  506. package/transpiled/directives/auth/Authorization.js +7 -3
  507. package/transpiled/directives/auth/Authorization.js.map +1 -1
  508. package/transpiled/directives/auth/Delegate.js.map +1 -1
  509. package/transpiled/directives/auth/Echo.js +1 -3
  510. package/transpiled/directives/auth/Echo.js.map +1 -1
  511. package/transpiled/directives/auth/Federation.js +3 -7
  512. package/transpiled/directives/auth/Federation.js.map +1 -1
  513. package/transpiled/directives/auth/Id.js.map +1 -1
  514. package/transpiled/directives/auth/Incept.js +1 -1
  515. package/transpiled/directives/auth/Incept.js.map +1 -1
  516. package/transpiled/directives/auth/Input.js.map +1 -1
  517. package/transpiled/directives/auth/Role.js.map +1 -1
  518. package/transpiled/directives/auth/Rule.js.map +1 -1
  519. package/transpiled/directives/auth/Scheme.js +1 -2
  520. package/transpiled/directives/auth/Scheme.js.map +1 -1
  521. package/transpiled/directives/auth/create.js.map +1 -1
  522. package/transpiled/directives/auth/schemes.js.map +1 -1
  523. package/transpiled/directives/auth/split.js.map +1 -1
  524. package/transpiled/directives/auth/types.d.ts +3 -1
  525. package/transpiled/directives/cache/Cache.js +28 -2
  526. package/transpiled/directives/cache/Cache.js.map +1 -1
  527. package/transpiled/directives/cache/Control.js +1 -1
  528. package/transpiled/directives/cache/Control.js.map +1 -1
  529. package/transpiled/directives/cache/etag.d.ts +10 -0
  530. package/transpiled/directives/cache/etag.js +30 -0
  531. package/transpiled/directives/cache/etag.js.map +1 -0
  532. package/transpiled/directives/cors/CORS.js.map +1 -1
  533. package/transpiled/directives/dev/Development.js.map +1 -1
  534. package/transpiled/directives/dev/Faulty.js.map +1 -1
  535. package/transpiled/directives/dev/Sleep.js.map +1 -1
  536. package/transpiled/directives/dev/Stub.js.map +1 -1
  537. package/transpiled/directives/dev/Throw.js.map +1 -1
  538. package/transpiled/directives/flow/Compose.js +7 -3
  539. package/transpiled/directives/flow/Compose.js.map +1 -1
  540. package/transpiled/directives/flow/Fetch.js.map +1 -1
  541. package/transpiled/directives/flow/Flow.js.map +1 -1
  542. package/transpiled/directives/index.js +11 -1
  543. package/transpiled/directives/index.js.map +1 -1
  544. package/transpiled/directives/io/IO.d.ts +1 -1
  545. package/transpiled/directives/io/IO.js.map +1 -1
  546. package/transpiled/directives/io/Input.js +1 -1
  547. package/transpiled/directives/io/Input.js.map +1 -1
  548. package/transpiled/directives/io/Output.js +3 -3
  549. package/transpiled/directives/io/Output.js.map +1 -1
  550. package/transpiled/directives/io/Status.js.map +1 -1
  551. package/transpiled/directives/io/Throttle.js +1 -1
  552. package/transpiled/directives/io/Throttle.js.map +1 -1
  553. package/transpiled/directives/io/lib/throttle/Configuration.js +8 -2
  554. package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -1
  555. package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -1
  556. package/transpiled/directives/io/lib/throttle/Quotas.js +4 -3
  557. package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
  558. package/transpiled/directives/io/lib/throttle/Sync.d.ts +1 -1
  559. package/transpiled/directives/io/lib/throttle/Sync.js.map +1 -1
  560. package/transpiled/directives/io/lib/throttle/Warning.js.map +1 -1
  561. package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -1
  562. package/transpiled/directives/io/lib/throttle/components/Identity.js.map +1 -1
  563. package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -1
  564. package/transpiled/directives/io/lib/throttle/components/Route.js.map +1 -1
  565. package/transpiled/directives/io/lib/throttle/components/Segment.js.map +1 -1
  566. package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -1
  567. package/transpiled/directives/map/Authority.js.map +1 -1
  568. package/transpiled/directives/map/Buffer.js.map +1 -1
  569. package/transpiled/directives/map/Claims.js.map +1 -1
  570. package/transpiled/directives/map/Headers.js.map +1 -1
  571. package/transpiled/directives/map/Language.js.map +1 -1
  572. package/transpiled/directives/map/Languages.js.map +1 -1
  573. package/transpiled/directives/map/Map.js.map +1 -1
  574. package/transpiled/directives/map/Mapping.js.map +1 -1
  575. package/transpiled/directives/map/Properties.js.map +1 -1
  576. package/transpiled/directives/map/Segments.js.map +1 -1
  577. package/transpiled/directives/mcp/MCP.js +1 -1
  578. package/transpiled/directives/mcp/MCP.js.map +1 -1
  579. package/transpiled/directives/mcp/Tool.js +3 -1
  580. package/transpiled/directives/mcp/Tool.js.map +1 -1
  581. package/transpiled/directives/oauth/Discovery.js.map +1 -1
  582. package/transpiled/directives/oauth/documents.js.map +1 -1
  583. package/transpiled/directives/octets/Context.js +1 -1
  584. package/transpiled/directives/octets/Context.js.map +1 -1
  585. package/transpiled/directives/octets/Delete.js.map +1 -1
  586. package/transpiled/directives/octets/Directive.js.map +1 -1
  587. package/transpiled/directives/octets/Get.js.map +1 -1
  588. package/transpiled/directives/octets/Octets.js +1 -1
  589. package/transpiled/directives/octets/Octets.js.map +1 -1
  590. package/transpiled/directives/octets/Put.js.map +1 -1
  591. package/transpiled/directives/octets/Workflow.js.map +1 -1
  592. package/transpiled/directives/octets/bytes.js.map +1 -1
  593. package/transpiled/directives/octets/workflows/Execution.js +1 -2
  594. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  595. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  596. package/transpiled/directives/require/Headers.js.map +1 -1
  597. package/transpiled/directives/require/Require.js.map +1 -1
  598. package/transpiled/exceptions.js.map +1 -1
  599. package/transpiled/index.d.ts +1 -1
  600. package/transpiled/index.js +1 -1
  601. package/transpiled/index.js.map +1 -1
  602. package/transpiled/manifest.js +5 -1
  603. package/transpiled/manifest.js.map +1 -1
  604. package/transpiled/root.js.map +1 -1
  605. package/tsconfig.tsbuildinfo +1 -1
  606. package/CHANGELOG.md +0 -552
  607. package/source/redact.test.ts +0 -27
  608. package/source/redact.ts +0 -21
  609. package/transpiled/redact.d.ts +0 -5
  610. package/transpiled/redact.js +0 -17
  611. package/transpiled/redact.js.map +0 -1
@@ -6,26 +6,26 @@ export class Scheme implements Directive {
6
6
  private readonly scheme: string
7
7
  private readonly Scheme: string
8
8
 
9
- public constructor (scheme: string) {
9
+ public constructor(scheme: string) {
10
10
  this.scheme = scheme.toLowerCase()
11
11
  this.Scheme = scheme[0].toUpperCase() + scheme.substring(1)
12
12
  }
13
13
 
14
- public authorize (_: Identity | null, context: Context): boolean {
15
- if (context.request.headers.authorization === undefined)
16
- return false
14
+ public authorize(_: Identity | null, context: Context): boolean {
15
+ if (context.request.headers.authorization === undefined) return false
17
16
 
18
17
  const [scheme] = split(context.request.headers.authorization)
19
18
 
20
19
  if (scheme !== this.scheme)
21
- throw new http.Forbidden(this.Scheme +
22
- ' authentication scheme is required to access this resource')
20
+ throw new http.Forbidden(
21
+ this.Scheme + ' authentication scheme is required to access this resource'
22
+ )
23
23
 
24
24
  return false
25
25
  }
26
26
 
27
27
  /** It admits nobody: it is there to refuse a scheme, not to authorize one. */
28
- public admits (): boolean {
28
+ public admits(): boolean {
29
29
  return false
30
30
  }
31
31
  }
@@ -1,7 +1,7 @@
1
1
  import { newid } from '@toa.io/generic'
2
2
  import type { Identity } from './types.js'
3
3
 
4
- export function create (credentials?: string): Identity {
4
+ export function create(credentials?: string): Identity {
5
5
  return {
6
6
  id: newid(),
7
7
  scheme: credentials?.split(' ')[0] ?? null,
@@ -21,7 +21,7 @@ export const PRIMARY: Remote = 'tokens'
21
21
  * The providers of a scheme, or nothing for a scheme that is not one — including a name a
22
22
  * plain object answers on its own, like `constructor`.
23
23
  */
24
- export function providers (scheme: string): Remote[] | undefined {
24
+ export function providers(scheme: string): Remote[] | undefined {
25
25
  return Object.hasOwn(PROVIDERS, scheme) ? PROVIDERS[scheme as Scheme] : undefined
26
26
  }
27
27
 
@@ -1,11 +1,10 @@
1
1
  import * as http from '../../HTTP/index.js'
2
2
  import { type Scheme } from './types.js'
3
3
 
4
- export function split (authorization: string): [Scheme, string] {
4
+ export function split(authorization: string): [Scheme, string] {
5
5
  const space = authorization.indexOf(' ')
6
6
 
7
- if (space === -1)
8
- throw new http.Unauthorized('Malformed authorization header')
7
+ if (space === -1) throw new http.Unauthorized('Malformed authorization header')
9
8
 
10
9
  const Scheme = authorization.slice(0, space)
11
10
  const scheme = Scheme.toLowerCase() as Scheme
@@ -1,5 +1,5 @@
1
1
  import { type Component } from '@toa.io/core'
2
- import { type Maybe } from '@toa.io/core'
2
+ import type { Maybe } from '@toa.io/core/types'
3
3
  import { type Parameter } from '../../RTD/index.js'
4
4
  import type { Introspection } from '../../Introspection.js'
5
5
  import type * as http from '../../HTTP/index.js'
@@ -55,6 +55,9 @@ export interface Extension {
55
55
 
56
56
  /** the error code the presented credentials were rejected with, when they were */
57
57
  rejection?: string
58
+
59
+ /** whether the identity was checked against the bans while being resolved */
60
+ vetted?: boolean
58
61
  }
59
62
 
60
63
  export interface Ban {
@@ -62,7 +65,7 @@ export interface Ban {
62
65
  }
63
66
 
64
67
  export type Context = io.Input & Extension
65
- export type AuthenticationResult = Maybe<{ identity: Identity, refresh: boolean }>
68
+ export type AuthenticationResult = Maybe<{ identity: Identity; refresh: boolean }>
66
69
 
67
70
  export type Scheme = 'basic' | 'token' | 'bearer' | 'code' | 'otp'
68
71
  export type Remote = 'basic' | 'federation' | 'tokens' | 'roles' | 'bans' | 'otp'
@@ -1,5 +1,6 @@
1
1
  import { Control } from './Control.js'
2
2
  import { Exact } from './Exact.js'
3
+ import { matches, tag } from './etag.js'
3
4
  import type { Output } from '../../io.js'
4
5
  import type { AuthenticatedContext, Directive } from './types.js'
5
6
  import type { DirectiveFamily } from '../../RTD/index.js'
@@ -9,7 +10,7 @@ export class Cache implements DirectiveFamily<Directive> {
9
10
  public readonly name: string = 'cache'
10
11
  public readonly mandatory: boolean = true
11
12
 
12
- public create (name: string, value: any): Directive {
13
+ public create(name: string, value: any): Directive {
13
14
  const Class = constructors[name]
14
15
 
15
16
  if (Class === undefined)
@@ -18,15 +19,23 @@ export class Cache implements DirectiveFamily<Directive> {
18
19
  return new Class(value)
19
20
  }
20
21
 
21
- public precall (): Output {
22
+ public precall(): Output {
22
23
  return null
23
24
  }
24
25
 
25
- public async settle (directives: Directive[], context: AuthenticatedContext, response: http.OutgoingMessage): Promise<void> {
26
+ public async settle(
27
+ directives: Directive[],
28
+ context: AuthenticatedContext,
29
+ response: http.OutgoingMessage
30
+ ): Promise<void> {
26
31
  const directive = directives[0]
32
+ const method = context.request.method
33
+ const safe = method === 'GET' || method === 'HEAD'
27
34
 
28
35
  response.headers ??= new Headers()
29
36
 
37
+ validate(context, response, response.headers, safe)
38
+
30
39
  // `cache:exact` sets what it is given, whatever the method: whether a reply may be
31
40
  // stored at all is not a question about the method's cacheability, and a token
32
41
  // endpoint answers a POST it must not have kept
@@ -36,21 +45,47 @@ export class Cache implements DirectiveFamily<Directive> {
36
45
  return
37
46
  }
38
47
 
39
- const method = context.request.method
40
-
41
- if (method !== 'GET' && method !== 'HEAD')
42
- return
48
+ if (!safe) return
43
49
 
44
50
  if (directive === undefined) {
45
51
  if (context.identity !== null && !Control.disabled(response.headers)) {
46
52
  response.headers.set('cache-control', 'private')
47
53
  response.headers.append('vary', 'authorization')
48
54
  }
49
- } else
50
- directive.set(context, response.headers)
55
+ } else directive.set(context, response.headers)
51
56
  }
52
57
  }
53
58
 
59
+ /**
60
+ * The validators a reply carries: the timestamp as `last-modified`, whatever the method, and
61
+ * on a safe one the version as its `etag`. A client that sends the tag back in `if-none-match`
62
+ * already has the representation and is told so, with the tag as it sent it. A reply without
63
+ * a version has no tag: nothing identifies it but its body, and hashing that on every reply
64
+ * is what a version is for.
65
+ */
66
+ // eslint-disable-next-line max-params
67
+ function validate(
68
+ context: AuthenticatedContext,
69
+ response: http.OutgoingMessage,
70
+ headers: Headers,
71
+ safe: boolean
72
+ ): void {
73
+ const { version, modified } = response
74
+
75
+ if (modified !== undefined)
76
+ headers.set('last-modified', new Date(modified).toUTCString())
77
+
78
+ if (version === undefined || !safe) return
79
+
80
+ const sent = context.request.headers['if-none-match']
81
+
82
+ if (sent !== undefined && matches(sent, version)) {
83
+ response.status = 304
84
+ response.body = undefined
85
+ headers.set('etag', sent)
86
+ } else headers.set('etag', tag(version))
87
+ }
88
+
54
89
  const constructors: Record<string, new (value: any) => Directive> = {
55
90
  control: Control,
56
91
  exact: Exact
@@ -6,44 +6,38 @@ export class Control implements Directive {
6
6
  private control: string | null = null
7
7
  private vary: boolean = false
8
8
 
9
- public constructor (value: string) {
9
+ public constructor(value: string) {
10
10
  this.value = value
11
11
  }
12
12
 
13
- public static disabled (headers: Headers): boolean {
13
+ public static disabled(headers: Headers): boolean {
14
14
  const value = headers.get('cache-control')
15
15
 
16
- if (value === null)
17
- return false
16
+ if (value === null) return false
18
17
 
19
18
  const directives = mask(value)
20
19
 
21
20
  return (directives & NO_STORE) === NO_STORE
22
21
  }
23
22
 
24
- public set (context: AuthenticatedContext, headers: Headers): void {
23
+ public set(context: AuthenticatedContext, headers: Headers): void {
25
24
  this.control ??= this.resolve(context)
26
25
 
27
- if (Control.disabled(headers))
28
- return
26
+ if (Control.disabled(headers)) return
29
27
 
30
28
  headers.set('cache-control', this.control)
31
29
 
32
- if (this.vary)
33
- headers.append('vary', 'authorization')
30
+ if (this.vary) headers.append('vary', 'authorization')
34
31
  }
35
32
 
36
- protected resolve (request: AuthenticatedContext): string {
37
- if (request.identity === null)
38
- return this.value
33
+ protected resolve(request: AuthenticatedContext): string {
34
+ if (request.identity === null) return this.value
39
35
 
40
36
  const directives = mask(this.value)
41
37
 
42
- if ((directives & PRIVATE) === PRIVATE)
43
- this.vary = true
38
+ if ((directives & PRIVATE) === PRIVATE) this.vary = true
44
39
 
45
- if ((directives & (PUBLIC | NO_CACHE)) === PUBLIC)
46
- return 'no-cache, ' + this.value
40
+ if ((directives & (PUBLIC | NO_CACHE)) === PUBLIC) return 'no-cache, ' + this.value
47
41
 
48
42
  if ((directives & (PUBLIC | PRIVATE)) === 0) {
49
43
  this.vary = true
@@ -55,26 +49,31 @@ export class Control implements Directive {
55
49
  }
56
50
  }
57
51
 
58
- function mask (value: string): number {
52
+ function mask(value: string): number {
59
53
  const directives = value.match(DIRECTIVES_RX)
60
54
 
61
- if (directives === null)
62
- return 0
55
+ if (directives === null) return 0
63
56
 
64
57
  let mask = 0
65
58
 
66
59
  for (const directive of directives)
67
- mask |= match<number>(directive,
68
- 'private', PRIVATE,
69
- 'public', PUBLIC,
70
- 'no-cache', NO_CACHE,
71
- 'no-store', NO_STORE,
72
- 0)
60
+ mask |= match<number>(
61
+ directive,
62
+ 'private',
63
+ PRIVATE,
64
+ 'public',
65
+ PUBLIC,
66
+ 'no-cache',
67
+ NO_CACHE,
68
+ 'no-store',
69
+ NO_STORE,
70
+ 0
71
+ )
73
72
 
74
73
  return mask
75
74
  }
76
75
 
77
- const DIRECTIVES_RX = /\b(private|public|no-cache|no-store)\b/ig
76
+ const DIRECTIVES_RX = /\b(private|public|no-cache|no-store)\b/gi
78
77
 
79
78
  const PUBLIC = 1
80
79
  const PRIVATE = 2
@@ -1,7 +1,7 @@
1
1
  import { Control } from './Control.js'
2
2
 
3
3
  export class Exact extends Control {
4
- protected override resolve (): string {
4
+ protected override resolve(): string {
5
5
  return this.value
6
6
  }
7
7
  }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * An entity tag is its version in quotes, `"3"`, or the same marked weak, `W/"3"`. A client
3
+ * sends one back in `if-match` and `if-none-match`; what it sent is compared here as a string
4
+ * and parsed only where a version is needed of it.
5
+ */
6
+ export function tag(version: number): string {
7
+ return `"${version}"`
8
+ }
9
+
10
+ /** Whether the tag a client sent names the version, strong or weak. */
11
+ export function matches(sent: string, version: number): boolean {
12
+ const strong = tag(version)
13
+
14
+ return sent === strong || sent === 'W/' + strong
15
+ }
16
+
17
+ /** The version a tag names, or nothing for a tag that is not one. */
18
+ export function parse(sent: string): number | null {
19
+ const strong = sent.startsWith('W/') ? sent.slice(2) : sent
20
+
21
+ if (
22
+ strong.length < 3 ||
23
+ strong.length > 34 ||
24
+ !strong.startsWith('"') ||
25
+ !strong.endsWith('"')
26
+ )
27
+ return null
28
+
29
+ const digits = strong.slice(1, -1)
30
+
31
+ for (let i = 0; i < digits.length; i++) {
32
+ const code = digits.charCodeAt(i)
33
+
34
+ if (code < 48 || code > 57) return null
35
+ }
36
+
37
+ return Number.parseInt(digits)
38
+ }
@@ -24,7 +24,7 @@ export class CORS implements Interceptor {
24
24
  vary: 'origin'
25
25
  })
26
26
 
27
- public intercept (input: Input): Output {
27
+ public intercept(input: Input): Output {
28
28
  const origin = input.request.headers.origin
29
29
 
30
30
  if (origin !== undefined && input.request.method === 'OPTIONS')
@@ -36,8 +36,10 @@ export class CORS implements Interceptor {
36
36
  if (origin !== undefined) {
37
37
  output.headers.set('access-control-allow-origin', origin)
38
38
  output.headers.set('access-control-allow-credentials', 'true')
39
- output.headers.set('access-control-expose-headers',
40
- 'authorization, content-type, content-length, date, etag, last-modified')
39
+ output.headers.set(
40
+ 'access-control-expose-headers',
41
+ 'authorization, content-type, content-length, date, etag, last-modified'
42
+ )
41
43
  }
42
44
 
43
45
  const method = input.request.method
@@ -49,12 +51,12 @@ export class CORS implements Interceptor {
49
51
  return null
50
52
  }
51
53
 
52
- public reset (): void {
54
+ public reset(): void {
53
55
  this.requestHeaders = new Set(REQUEST_HEADERS)
54
56
  this.headers.set('access-control-allow-headers', this.allowedHeaders())
55
57
  }
56
58
 
57
- public allow (header: string): void {
59
+ public allow(header: string): void {
58
60
  this.requestHeaders.add(header.toLowerCase())
59
61
  this.headers.set('access-control-allow-headers', this.allowedHeaders())
60
62
  }
@@ -64,11 +66,11 @@ export class CORS implements Interceptor {
64
66
  * fixed — an unsorted value would differ between otherwise identical processes,
65
67
  * and between one restart and the next.
66
68
  */
67
- private allowedHeaders (): string {
69
+ private allowedHeaders(): string {
68
70
  return Array.from(this.requestHeaders).sort().join(', ')
69
71
  }
70
72
 
71
- private preflightResponse (origin: string): Output {
73
+ private preflightResponse(origin: string): Output {
72
74
  this.headers.set('access-control-allow-origin', origin)
73
75
 
74
76
  return {
@@ -10,16 +10,15 @@ export class Development implements DirectiveFamily<Directive> {
10
10
  public readonly name: string = 'dev'
11
11
  public readonly mandatory: boolean = false
12
12
 
13
- public create (name: string, value: unknown): Directive {
13
+ public create(name: string, value: unknown): Directive {
14
14
  const Class = constructors[name]
15
15
 
16
- if (Class === undefined)
17
- throw new Error(`Directive 'dev:${name}' is not implemented`)
16
+ if (Class === undefined) throw new Error(`Directive 'dev:${name}' is not implemented`)
18
17
 
19
18
  return new Class(value)
20
19
  }
21
20
 
22
- public async precall (directives: Directive[], input: Input): Promise<Output> {
21
+ public async precall(directives: Directive[], input: Input): Promise<Output> {
23
22
  let output = null
24
23
 
25
24
  for (const directive of directives) {
@@ -8,18 +8,23 @@ export class Faulty implements Directive {
8
8
  private static readonly warned = false
9
9
  private readonly probability: number
10
10
 
11
- public constructor (probability: number) {
12
- assert.ok(typeof probability === 'number', '`dev:faulty` directive value must be a number')
13
- assert.ok(probability > 0 && probability <= 1, '`dev:faulty` directive value must be in the range (0, 1]')
11
+ public constructor(probability: number) {
12
+ assert.ok(
13
+ typeof probability === 'number',
14
+ '`dev:faulty` directive value must be a number'
15
+ )
16
+ assert.ok(
17
+ probability > 0 && probability <= 1,
18
+ '`dev:faulty` directive value must be in the range (0, 1]'
19
+ )
14
20
 
15
21
  this.probability = probability
16
22
 
17
23
  cors.allow('faulty')
18
24
  }
19
25
 
20
- public async apply (): Promise<Output> {
21
- if (Math.random() > this.probability)
22
- return null
26
+ public async apply(): Promise<Output> {
27
+ if (Math.random() > this.probability) return null
23
28
 
24
29
  throw new ServiceUnavailable()
25
30
  }
@@ -10,7 +10,7 @@ export class Sleep implements Directive {
10
10
  private static warned = false
11
11
  private readonly maximum: number
12
12
 
13
- public constructor (value: number) {
13
+ public constructor(value: number) {
14
14
  assert.ok(Number.isInteger(value), '`dev:sleep` directive value must be an integer')
15
15
 
16
16
  if (!Sleep.warned) {
@@ -22,11 +22,10 @@ export class Sleep implements Directive {
22
22
  this.maximum = value
23
23
  }
24
24
 
25
- public async apply (input: Input): Promise<Output> {
25
+ public async apply(input: Input): Promise<Output> {
26
26
  const value = input.request.headers.sleep as string | undefined
27
27
 
28
- if (value === undefined)
29
- return null
28
+ if (value === undefined) return null
30
29
 
31
30
  const [min, max] = this.parse(value)
32
31
 
@@ -40,12 +39,11 @@ export class Sleep implements Directive {
40
39
  return null
41
40
  }
42
41
 
43
- private parse (value: string): [number, number] {
42
+ private parse(value: string): [number, number] {
44
43
  try {
45
44
  const pair = JSON.parse(value) as [number, number]
46
45
 
47
- if (!Array.isArray(pair) || pair.length !== 2)
48
- throw new Error()
46
+ if (!Array.isArray(pair) || pair.length !== 2) throw new Error()
49
47
 
50
48
  return pair
51
49
  } catch {
@@ -4,11 +4,11 @@ import type { Directive } from './types.js'
4
4
  export class Stub implements Directive {
5
5
  private readonly value: unknown
6
6
 
7
- public constructor (value: unknown) {
7
+ public constructor(value: unknown) {
8
8
  this.value = value
9
9
  }
10
10
 
11
- public apply (): Output {
11
+ public apply(): Output {
12
12
  return { body: this.value }
13
13
  }
14
14
  }
@@ -4,11 +4,11 @@ import type { Directive } from './types.js'
4
4
  export class Throw implements Directive {
5
5
  private readonly message: string
6
6
 
7
- public constructor (message: string) {
7
+ public constructor(message: string) {
8
8
  this.message = message
9
9
  }
10
10
 
11
- public apply (): Output {
11
+ public apply(): Output {
12
12
  throw new Error(this.message)
13
13
  }
14
14
  }
@@ -9,11 +9,11 @@ import type { OutgoingMessage } from '../../HTTP/index.js'
9
9
  export class Compose implements Directive {
10
10
  private readonly expressions: Expression[]
11
11
 
12
- public constructor (composition: any) {
12
+ public constructor(composition: any) {
13
13
  this.expressions = build(composition)
14
14
  }
15
15
 
16
- public attach (context: Context): void {
16
+ public attach(context: Context): void {
17
17
  context.pipelines.response.push(async (message: OutgoingMessage) => {
18
18
  if (!(message.body instanceof Readable)) {
19
19
  console.warn('Response body is not a stream, skipping composition')
@@ -23,8 +23,11 @@ export class Compose implements Directive {
23
23
 
24
24
  assert.ok(message.body instanceof Readable, 'Response body is not a stream')
25
25
 
26
- // @ts-expect-error -- objectMode is not defined in the type definition
27
- assert.ok(message.body._readableState.objectMode, 'Response stream is not in object mode')
26
+ assert.ok(
27
+ // @ts-expect-error -- objectMode is not defined in the type definition
28
+ message.body._readableState.objectMode,
29
+ 'Response stream is not in object mode'
30
+ )
28
31
 
29
32
  const $ = await this.compose(message.body)
30
33
 
@@ -32,7 +35,7 @@ export class Compose implements Directive {
32
35
  })
33
36
  }
34
37
 
35
- private async compose (stream: Readable): Promise<unknown[]> {
38
+ private async compose(stream: Readable): Promise<unknown[]> {
36
39
  const $: unknown[] = []
37
40
 
38
41
  stream.on('data', (data) => $.push(data))
@@ -42,7 +45,7 @@ export class Compose implements Directive {
42
45
  return $
43
46
  }
44
47
 
45
- private execute ($: unknown[]): unknown {
48
+ private execute($: unknown[]): unknown {
46
49
  let exception: Error | undefined
47
50
 
48
51
  for (const expression of this.expressions)
@@ -57,36 +60,39 @@ export class Compose implements Directive {
57
60
  }
58
61
  }
59
62
 
60
- function build (composition: any): Expression[] {
63
+ function build(composition: any): Expression[] {
61
64
  return Array.isArray(composition)
62
65
  ? composition.map((variant) => compile(variant as object | string))
63
66
  : [compile(composition as object | string)]
64
67
  }
65
68
 
66
- function compile (composition: object | string): Expression {
67
- const text = typeof composition === 'string'
68
- ? `return ${composition}`
69
- : `return ${json(composition)}`
69
+ function compile(composition: object | string): Expression {
70
+ const text =
71
+ typeof composition === 'string'
72
+ ? `return ${composition}`
73
+ : `return ${json(composition)}`
70
74
 
71
75
  // eslint-disable-next-line @typescript-eslint/no-implied-eval,no-new-func
72
76
  return new Function('$', text) as Expression
73
77
  }
74
78
 
75
- function json (node: object | string): string {
79
+ function json(node: object | string): string {
76
80
  if (typeof node === 'string')
77
- if (node.startsWith('\\'))
78
- return `"${node}"`
79
- else
80
- return node
81
+ if (node.startsWith('\\')) return `"${node}"`
82
+ else return node
81
83
 
82
84
  if (Array.isArray(node))
83
85
  return `[${node.map((v) => json(v as object | string)).join(',')}]`
84
86
 
85
- if (node.constructor !== Object)
86
- return JSON.stringify(node)
87
+ if (node.constructor !== Object) return JSON.stringify(node)
87
88
 
88
- return '{' + Object.entries(node)
89
- .map(([key, value]) => `"${key}": ${json(value as object | string)}`).join(',') + '}'
89
+ return (
90
+ '{' +
91
+ Object.entries(node)
92
+ .map(([key, value]) => `"${key}": ${json(value as object | string)}`)
93
+ .join(',') +
94
+ '}'
95
+ )
90
96
  }
91
97
 
92
98
  type Expression = ($: unknown[]) => unknown