@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
@@ -9,14 +9,13 @@ export class Delegate implements Directive {
9
9
  private readonly property: string
10
10
  private readonly discovery: Promise<Component>
11
11
 
12
- public constructor (property: string, discovery: Promise<Component>) {
12
+ public constructor(property: string, discovery: Promise<Component>) {
13
13
  this.property = property
14
14
  this.discovery = discovery
15
15
  }
16
16
 
17
- public async authorize (identity: Identity | null, context: Context): Promise<boolean> {
18
- if (identity === null)
19
- return false
17
+ public async authorize(identity: Identity | null, context: Context): Promise<boolean> {
18
+ if (identity === null) return false
20
19
 
21
20
  identity.roles ??= await Role.get(identity, this.discovery)
22
21
  context.pipelines.body.push((body) => this.embed(body, identity))
@@ -25,20 +24,19 @@ export class Delegate implements Directive {
25
24
  }
26
25
 
27
26
  /** It admits whoever there is, and embedding the identity is the request's business. */
28
- public admits (identity: Identity | null): boolean {
27
+ public admits(identity: Identity | null): boolean {
29
28
  return identity !== null
30
29
  }
31
30
 
32
31
  /** The property it embeds is the identity's, so a caller has nothing to put there. */
33
- public describe (introspection: Introspection): Introspection {
32
+ public describe(introspection: Introspection): Introspection {
34
33
  take(introspection, this.property)
35
34
 
36
35
  return introspection
37
36
  }
38
37
 
39
- private embed (body: unknown, identity: Identity): Record<string, unknown> {
40
- if (body === undefined)
41
- body = {}
38
+ private embed(body: unknown, identity: Identity): Record<string, unknown> {
39
+ if (body === undefined) body = {}
42
40
 
43
41
  check(body)
44
42
  body[this.property] = structuredClone(identity)
@@ -47,7 +45,7 @@ export class Delegate implements Directive {
47
45
  }
48
46
  }
49
47
 
50
- function check (body: unknown): asserts body is Record<string, unknown> {
48
+ function check(body: unknown): asserts body is Record<string, unknown> {
51
49
  if (typeof body !== 'object' || body === null)
52
50
  throw new BadRequest('Invalid request body')
53
51
  }
@@ -3,9 +3,8 @@ import type { OutgoingMessage } from '../../HTTP/index.js'
3
3
  import type { Directive, Identity, Context } from './types.js'
4
4
 
5
5
  export class Echo implements Directive {
6
- public authorize (identity: Identity | null, context: Context): boolean {
7
- if (identity === null && 'authorization' in context.request.headers)
8
- return false
6
+ public authorize(identity: Identity | null, context: Context): boolean {
7
+ if (identity === null && 'authorization' in context.request.headers) return false
9
8
 
10
9
  context.identity ??= create()
11
10
 
@@ -13,15 +12,13 @@ export class Echo implements Directive {
13
12
  }
14
13
 
15
14
  /** What `authorize` answers, without inventing the identity it would go on to invent. */
16
- public admits (identity: Identity | null, context: Context): boolean {
15
+ public admits(identity: Identity | null, context: Context): boolean {
17
16
  return !(identity === null && 'authorization' in context.request.headers)
18
17
  }
19
18
 
20
- public reply (context: Context): OutgoingMessage {
19
+ public reply(context: Context): OutgoingMessage {
21
20
  const body = context.identity!
22
21
 
23
- return body.scheme === null
24
- ? { status: 201, body }
25
- : { body }
22
+ return body.scheme === null ? { status: 201, body } : { body }
26
23
  }
27
24
  }
@@ -5,33 +5,38 @@ import type { Parameter } from '../../RTD/index.js'
5
5
  export class Federation implements Directive {
6
6
  private readonly matchers: Array<[keyof Claims, Matcher]>
7
7
 
8
- public constructor (options: Options) {
9
- this.matchers = (Object.entries(options) as Array<[keyof Claims, string]>)
10
- .map(([key, value]) => [key, toMatcher(value)])
11
-
12
- assert.ok(this.matchers.length > 0, '`auth:claims` requires at least one property defined')
8
+ public constructor(options: Options) {
9
+ this.matchers = (Object.entries(options) as Array<[keyof Claims, string]>).map(
10
+ ([key, value]) => [key, toMatcher(value)]
11
+ )
12
+
13
+ assert.ok(
14
+ this.matchers.length > 0,
15
+ '`auth:claims` requires at least one property defined'
16
+ )
13
17
  }
14
18
 
15
- public authorize (identity: Identity | null, context: Context, parameters: Parameter[]): boolean {
16
- if (identity === null || !('claims' in identity))
17
- return false
19
+ public authorize(
20
+ identity: Identity | null,
21
+ context: Context,
22
+ parameters: Parameter[]
23
+ ): boolean {
24
+ if (identity === null || !('claims' in identity)) return false
18
25
 
19
26
  const claims = (identity as FederatedIdentity).claims
20
27
 
21
28
  for (const [key, match] of this.matchers)
22
- if (!match(claims[key], context, parameters))
23
- return false
29
+ if (!match(claims[key], context, parameters)) return false
24
30
 
25
31
  return true
26
32
  }
27
33
  }
28
34
 
29
- function toMatcher (expression: string): Matcher {
35
+ function toMatcher(expression: string): Matcher {
30
36
  if (expression.startsWith(':')) {
31
37
  const key = expression.slice(1) as 'authority'
32
38
 
33
- if (key === 'authority')
34
- return (value, context) => matches(value, context[key])
39
+ if (key === 'authority') return (value, context) => matches(value, context[key])
35
40
 
36
41
  if (key === 'domain')
37
42
  return (value, context) => {
@@ -46,20 +51,20 @@ function toMatcher (expression: string): Matcher {
46
51
  if (expression.startsWith('/:')) {
47
52
  const name = expression.slice(2)
48
53
 
49
- return (value, _, parameters) => parameters
50
- .some((parameter) => parameter.name === name && matches(value, parameter.value))
54
+ return (value, _, parameters) =>
55
+ parameters.some(
56
+ (parameter) => parameter.name === name && matches(value, parameter.value)
57
+ )
51
58
  }
52
59
 
53
60
  return (value) => matches(value, expression)
54
61
  }
55
62
 
56
- function matches (value: string | string[], reference: string): boolean {
57
- return Array.isArray(value)
58
- ? value.includes(reference)
59
- : value === reference
63
+ function matches(value: string | string[], reference: string): boolean {
64
+ return Array.isArray(value) ? value.includes(reference) : value === reference
60
65
  }
61
66
 
62
- function codomain (iss: string, context: Context): boolean {
67
+ function codomain(iss: string, context: Context): boolean {
63
68
  const hostname = new URL(iss).hostname
64
69
  const dot = hostname.indexOf('.')
65
70
  const basename = dot === -1 ? hostname : hostname.slice(dot)
@@ -67,7 +72,11 @@ function codomain (iss: string, context: Context): boolean {
67
72
  return context.authority.slice(-basename.length) === basename
68
73
  }
69
74
 
70
- type Matcher = (value: string | string[], context: Context, parameters: Parameter[]) => boolean
75
+ type Matcher = (
76
+ value: string | string[],
77
+ context: Context,
78
+ parameters: Parameter[]
79
+ ) => boolean
71
80
 
72
81
  interface Claims {
73
82
  iss: string
@@ -4,13 +4,16 @@ import { type Directive, type Identity } from './types.js'
4
4
  export class Id implements Directive {
5
5
  private readonly parameter: string
6
6
 
7
- public constructor (parameter: string) {
7
+ public constructor(parameter: string) {
8
8
  this.parameter = parameter
9
9
  }
10
10
 
11
- public authorize (identity: Identity | null, _: unknown, parameters: Parameter[]): boolean {
12
- if (identity === null)
13
- return false
11
+ public authorize(
12
+ identity: Identity | null,
13
+ _: unknown,
14
+ parameters: Parameter[]
15
+ ): boolean {
16
+ if (identity === null) return false
14
17
 
15
18
  const parameter = parameters.find((parameter) => parameter.name === this.parameter)
16
19
 
@@ -6,7 +6,7 @@ import { create } from './create.js'
6
6
  import { INCEPTION, UNKNOWN, providers as providersOf } from './schemes.js'
7
7
  import { Role } from './Role.js'
8
8
  import type { Component } from '@toa.io/core'
9
- import type { Maybe } from '@toa.io/core'
9
+ import type { Maybe } from '@toa.io/core/types'
10
10
  import type { Directive, Discovery, Identity, Context, Components, Ban } from './types.js'
11
11
 
12
12
  export class Incept implements Directive {
@@ -16,15 +16,17 @@ export class Incept implements Directive {
16
16
 
17
17
  private readonly property: string | null
18
18
 
19
- public constructor (property: string, discovery: Discovery) {
20
- assert.ok(property === null || typeof property === 'string',
21
- '`auth:incept` value must be a string or null')
19
+ public constructor(property: string, discovery: Discovery) {
20
+ assert.ok(
21
+ property === null || typeof property === 'string',
22
+ '`auth:incept` value must be a string or null'
23
+ )
22
24
 
23
25
  this.property = property
24
26
  Incept.discovery ??= discovery
25
27
  }
26
28
 
27
- public static async incept (context: Context, id: string): Promise<Identity> {
29
+ public static async incept(context: Context, id: string): Promise<Identity> {
28
30
  const [scheme, credentials] = split(context.request.headers.authorization!)
29
31
  const candidates = providersOf(scheme)
30
32
 
@@ -36,29 +38,29 @@ export class Incept implements Directive {
36
38
  // from a credential it would itself have to exist to hold
37
39
  const provider = candidates.find((candidate) => INCEPTION.includes(candidate))
38
40
 
39
- if (provider === undefined)
40
- throw new http.Unauthorized()
41
+ if (provider === undefined) throw new http.Unauthorized()
41
42
 
42
43
  Incept.bans ??= await Incept.discovery.bans
43
44
 
44
45
  const ban = await Incept.bans.invoke<Ban>('observe', { query: { id } })
45
46
 
46
- if (ban.banned)
47
- throw new http.Unauthorized()
47
+ if (ban.banned) throw new http.Unauthorized()
48
48
 
49
49
  Incept.components[provider] ??= await Incept.discovery[provider]
50
50
 
51
- const identity = await Incept.components[provider]!.invoke<Maybe<Identity>>('incept', {
52
- input: {
53
- scheme,
54
- authority: context.authority,
55
- id,
56
- credentials
51
+ const identity = await Incept.components[provider]!.invoke<Maybe<Identity>>(
52
+ 'incept',
53
+ {
54
+ input: {
55
+ scheme,
56
+ authority: context.authority,
57
+ id,
58
+ credentials
59
+ }
57
60
  }
58
- })
61
+ )
59
62
 
60
- if (identity instanceof Error)
61
- throw new http.UnprocessableEntity(identity)
63
+ if (identity instanceof Error) throw new http.UnprocessableEntity(identity)
62
64
 
63
65
  identity.scheme = scheme
64
66
 
@@ -68,24 +70,25 @@ export class Incept implements Directive {
68
70
  }
69
71
 
70
72
  /** Credentials that were rejected for any reason but being unknown are not incepted. */
71
- public static acceptable (context: Context): boolean {
72
- return context.request.headers.authorization === undefined || context.rejection === UNKNOWN
73
+ public static acceptable(context: Context): boolean {
74
+ return (
75
+ context.request.headers.authorization === undefined || context.rejection === UNKNOWN
76
+ )
73
77
  }
74
78
 
75
- public authorize (identity: Identity | null, context: Context): boolean {
79
+ public authorize(identity: Identity | null, context: Context): boolean {
76
80
  return identity === null && Incept.acceptable(context)
77
81
  }
78
82
 
79
- public reply (context: Context): http.OutgoingMessage | null {
80
- if (this.property !== null)
81
- return null
83
+ public reply(context: Context): http.OutgoingMessage | null {
84
+ if (this.property !== null) return null
82
85
 
83
86
  const body = create(context.request.headers.authorization)
84
87
 
85
88
  return { body }
86
89
  }
87
90
 
88
- public async settle (context: Context, response: http.OutgoingMessage): Promise<void> {
91
+ public async settle(context: Context, response: http.OutgoingMessage): Promise<void> {
89
92
  const id = response.body?.[this.property ?? 'id']
90
93
 
91
94
  if (id === undefined) {
@@ -97,7 +100,10 @@ export class Incept implements Directive {
97
100
  return
98
101
  }
99
102
 
100
- assert(typeof id === 'string', `Response body property "${this.property}" expected to be a string`)
103
+ assert(
104
+ typeof id === 'string',
105
+ `Response body property "${this.property}" expected to be a string`
106
+ )
101
107
 
102
108
  if (context.request.headers.authorization !== undefined)
103
109
  context.identity = await Incept.incept(context, id)
@@ -6,27 +6,40 @@ export class Input implements Directive {
6
6
  public priority = 0
7
7
  private readonly statements: Statement[] = []
8
8
 
9
- public constructor (declarations: Declaration[], create: Create) {
10
- this.statements = declarations.map((declaration) => new Statement(declaration, create))
9
+ public constructor(declarations: Declaration[], create: Create) {
10
+ this.statements = declarations.map(
11
+ (declaration) => new Statement(declaration, create)
12
+ )
11
13
  }
12
14
 
13
- public async authorize (identity: Identity | null, context: Context, parameters: Parameter[]): Promise<boolean> {
14
- context.pipelines.body.push(async (body) => this.check(identity, context, parameters, body))
15
+ public async authorize(
16
+ identity: Identity | null,
17
+ context: Context,
18
+ parameters: Parameter[]
19
+ ): Promise<boolean> {
20
+ context.pipelines.body.push(async (body) =>
21
+ this.check(identity, context, parameters, body)
22
+ )
15
23
 
16
24
  return false
17
25
  }
18
26
 
19
27
  // eslint-disable-next-line max-params
20
- private async check (identity: Identity | null, context: Context, parameters: Parameter[], body: unknown): Promise<unknown> {
21
- if (body === undefined || body === null || body.constructor !== Object)
22
- return body
23
-
24
- const settled = await Promise.allSettled(this.statements.map(async (statement) =>
25
- statement.check(identity, context, parameters, body as Body)))
26
-
27
- for (const result of settled)
28
- if (result.status === 'rejected')
29
- throw result.reason
28
+ private async check(
29
+ identity: Identity | null,
30
+ context: Context,
31
+ parameters: Parameter[],
32
+ body: unknown
33
+ ): Promise<unknown> {
34
+ if (body === undefined || body === null || body.constructor !== Object) return body
35
+
36
+ const settled = await Promise.allSettled(
37
+ this.statements.map(async (statement) =>
38
+ statement.check(identity, context, parameters, body as Body)
39
+ )
40
+ )
41
+
42
+ for (const result of settled) if (result.status === 'rejected') throw result.reason
30
43
 
31
44
  return body
32
45
  }
@@ -36,7 +49,7 @@ class Statement {
36
49
  private readonly properties: string[]
37
50
  private readonly directives: Directive[] = []
38
51
 
39
- public constructor ({ prop, ...directives }: Declaration, create: Create) {
52
+ public constructor({ prop, ...directives }: Declaration, create: Create) {
40
53
  this.properties = typeof prop === 'string' ? [prop] : prop
41
54
 
42
55
  for (const [name, value] of Object.entries(directives)) {
@@ -47,17 +60,20 @@ class Statement {
47
60
  }
48
61
 
49
62
  // eslint-disable-next-line max-params
50
- public async check (identity: Identity | null, context: Context, parameters: Parameter[], body: Body): Promise<void> {
63
+ public async check(
64
+ identity: Identity | null,
65
+ context: Context,
66
+ parameters: Parameter[],
67
+ body: Body
68
+ ): Promise<void> {
51
69
  const match = this.properties.some((property) => property in body)
52
70
 
53
- if (!match)
54
- return
71
+ if (!match) return
55
72
 
56
73
  for (const directive of this.directives) {
57
74
  const authorized = await directive.authorize(identity, context, parameters)
58
75
 
59
- if (!authorized)
60
- throw new Forbidden('Input property is not authorized')
76
+ if (!authorized) throw new Forbidden('Input property is not authorized')
61
77
  }
62
78
  }
63
79
  }
@@ -34,12 +34,19 @@ it('should return false if not matched', async () => {
34
34
 
35
35
  assert.strictEqual(result, false)
36
36
 
37
- assert.ok(remote.invoke.mock.calls.some((call: any) => call.arguments.length === 2 && isDeepStrictEqual(call.arguments[0], 'list') && isDeepStrictEqual(call.arguments[1], {
38
- query: {
39
- criteria: `identity=="${identity.id}"`,
40
- limit: 1024
41
- }
42
- })))
37
+ assert.ok(
38
+ remote.invoke.mock.calls.some(
39
+ (call: any) =>
40
+ call.arguments.length === 2 &&
41
+ isDeepStrictEqual(call.arguments[0], 'list') &&
42
+ isDeepStrictEqual(call.arguments[1], {
43
+ query: {
44
+ criteria: `identity=="${identity.id}"`,
45
+ limit: 1024
46
+ }
47
+ })
48
+ )
49
+ )
43
50
  })
44
51
 
45
52
  it('should return true on exact match', async () => {
@@ -67,36 +74,55 @@ it('should return false on non-scope substring match', async () => {
67
74
  })
68
75
 
69
76
  it('should return true on match with parameters', async () => {
70
- const result = await match(['app:{org}:reviews'],
71
- ['app:29e54ae1:reviews'], [{
72
- name: 'org',
73
- value: '29e54ae1'
74
- }])
77
+ const result = await match(
78
+ ['app:{org}:reviews'],
79
+ ['app:29e54ae1:reviews'],
80
+ [
81
+ {
82
+ name: 'org',
83
+ value: '29e54ae1'
84
+ }
85
+ ]
86
+ )
75
87
 
76
88
  assert.strictEqual(result, true)
77
89
  })
78
90
 
79
91
  it('should return true on match with parameters', async () => {
80
- const result = await match(['app:{org}:reviews'],
81
- ['app:29e54ae1:reviews'], [{
82
- name: 'org',
83
- value: '29e54ae1'
84
- }])
92
+ const result = await match(
93
+ ['app:{org}:reviews'],
94
+ ['app:29e54ae1:reviews'],
95
+ [
96
+ {
97
+ name: 'org',
98
+ value: '29e54ae1'
99
+ }
100
+ ]
101
+ )
85
102
 
86
103
  assert.strictEqual(result, true)
87
104
  })
88
105
 
89
106
  it('should return false on mismatch with parameters', async () => {
90
- const result = await match(['app:{org}:reviews'],
91
- ['app:29e54ae1:reviews'], [{
92
- name: 'org',
93
- value: '88584c9b'
94
- }])
107
+ const result = await match(
108
+ ['app:{org}:reviews'],
109
+ ['app:29e54ae1:reviews'],
110
+ [
111
+ {
112
+ name: 'org',
113
+ value: '88584c9b'
114
+ }
115
+ ]
116
+ )
95
117
 
96
118
  assert.strictEqual(result, false)
97
119
  })
98
120
 
99
- async function match (expected: string[], actual: string[], parameters: Parameter[] = []): Promise<boolean> {
121
+ async function match(
122
+ expected: string[],
123
+ actual: string[],
124
+ parameters: Parameter[] = []
125
+ ): Promise<boolean> {
100
126
  const directive = new Role(expected, discovery)
101
127
 
102
128
  const identity: Identity = {
@@ -110,7 +136,7 @@ async function match (expected: string[], actual: string[], parameters: Paramete
110
136
  return await directive.authorize(identity, undefined, parameters)
111
137
  }
112
138
 
113
- function resetCalls (target = [remote, discovery], seen = new Set()) {
139
+ function resetCalls(target = [remote, discovery], seen = new Set()) {
114
140
  if (target === null || typeof target !== 'object' || seen.has(target)) return
115
141
 
116
142
  seen.add(target)
@@ -1,6 +1,7 @@
1
1
  import assert from 'node:assert'
2
2
  import { quote } from '@toa.io/generic'
3
- import { type Component, type Query } from '@toa.io/core'
3
+ import { type Component } from '@toa.io/core'
4
+ import type { Query } from '@toa.io/core/types'
4
5
  import { type Directive, type Identity } from './types.js'
5
6
  import type { Parameter } from '../../RTD/index.js'
6
7
 
@@ -10,13 +11,16 @@ export class Role implements Directive {
10
11
  private readonly discovery: Promise<Component>
11
12
  private readonly dynamic: boolean
12
13
 
13
- public constructor (roles: string | string[], discovery: Promise<Component>) {
14
+ public constructor(roles: string | string[], discovery: Promise<Component>) {
14
15
  this.roles = typeof roles === 'string' ? [roles] : roles
15
16
  this.discovery = discovery
16
17
  this.dynamic = this.roles.some((role) => role.includes('{'))
17
18
  }
18
19
 
19
- public static async get (identity: Identity, discovery: Promise<Component>): Promise<string[]> {
20
+ public static async get(
21
+ identity: Identity,
22
+ discovery: Promise<Component>
23
+ ): Promise<string[]> {
20
24
  this.remote ??= await discovery
21
25
 
22
26
  const query: Query = {
@@ -27,9 +31,12 @@ export class Role implements Directive {
27
31
  return await this.remote.invoke('list', { query })
28
32
  }
29
33
 
30
- public async authorize (identity: Identity | null, _: unknown, parameters: Parameter[]): Promise<boolean> {
31
- if (identity === null)
32
- return false
34
+ public async authorize(
35
+ identity: Identity | null,
36
+ _: unknown,
37
+ parameters: Parameter[]
38
+ ): Promise<boolean> {
39
+ if (identity === null) return false
33
40
 
34
41
  identity.roles ??= await Role.get(identity, this.discovery)
35
42
 
@@ -37,39 +44,39 @@ export class Role implements Directive {
37
44
  }
38
45
 
39
46
  /** A role naming a route variable cannot be told from a description, which has no values. */
40
- public async admits (identity: Identity | null): Promise<boolean | undefined> {
41
- if (this.dynamic)
42
- return undefined
47
+ public async admits(identity: Identity | null): Promise<boolean | undefined> {
48
+ if (this.dynamic) return undefined
43
49
 
44
- if (identity === null)
45
- return false
50
+ if (identity === null) return false
46
51
 
47
52
  identity.roles ??= await Role.get(identity, this.discovery)
48
53
 
49
54
  return this.match(identity.roles, [])
50
55
  }
51
56
 
52
- private match (roles: string[], parameters: Parameter[]): boolean {
57
+ private match(roles: string[], parameters: Parameter[]): boolean {
53
58
  const required = this.dynamic ? this.substitute(parameters) : this.roles
54
59
 
55
60
  for (const role of roles) {
56
- const ok = required.some((expected) => expected === role || expected.startsWith(role + ':'))
61
+ const ok = required.some(
62
+ (expected) => expected === role || expected.startsWith(role + ':')
63
+ )
57
64
 
58
- if (ok)
59
- return true
65
+ if (ok) return true
60
66
  }
61
67
 
62
68
  return false
63
69
  }
64
70
 
65
- private substitute (parameters: Parameter[]): string[] {
66
- return this.roles.map((role) => role.replaceAll(/{(\w+)}/g, (_, key) => {
67
- const value = parameters.find((parameter) => parameter.name === key)?.value
71
+ private substitute(parameters: Parameter[]): string[] {
72
+ return this.roles.map((role) =>
73
+ role.replaceAll(/{(\w+)}/g, (_, key) => {
74
+ const value = parameters.find((parameter) => parameter.name === key)?.value
68
75
 
69
- assert.ok(value !== undefined,
70
- `Role '${role}' requires '${key}' route parameter`)
76
+ assert.ok(value !== undefined, `Role '${role}' requires '${key}' route parameter`)
71
77
 
72
- return value
73
- }))
78
+ return value
79
+ })
80
+ )
74
81
  }
75
82
  }
@@ -5,7 +5,7 @@ import type { Context, Directive, Identity, Create } from './types.js'
5
5
  export class Rule implements Directive {
6
6
  private readonly directives: Directive[] = []
7
7
 
8
- public constructor (directives: Record<string, any>, create: Create) {
8
+ public constructor(directives: Record<string, any>, create: Create) {
9
9
  for (const [name, value] of Object.entries(directives)) {
10
10
  const directive = create(name, value)
11
11
 
@@ -13,19 +13,22 @@ export class Rule implements Directive {
13
13
  }
14
14
  }
15
15
 
16
- public async authorize (identity: Identity | null, context: Context, parameters: Parameter[]): Promise<boolean> {
16
+ public async authorize(
17
+ identity: Identity | null,
18
+ context: Context,
19
+ parameters: Parameter[]
20
+ ): Promise<boolean> {
17
21
  for (const directive of this.directives) {
18
22
  const authorized = await directive.authorize(identity, context, parameters)
19
23
 
20
- if (!authorized)
21
- return false
24
+ if (!authorized) return false
22
25
  }
23
26
 
24
27
  return true
25
28
  }
26
29
 
27
30
  /** Whatever each of them makes of it, in the order they were declared. */
28
- public describe (introspection: Introspection): Introspection {
31
+ public describe(introspection: Introspection): Introspection {
29
32
  for (const directive of this.directives)
30
33
  introspection = directive.describe?.(introspection) ?? introspection
31
34
 
@@ -33,7 +36,10 @@ export class Rule implements Directive {
33
36
  }
34
37
 
35
38
  /** All of them, so one that refuses ends it and one that cannot tell leaves it untold. */
36
- public async admits (identity: Identity | null, context: Context): Promise<boolean | undefined> {
39
+ public async admits(
40
+ identity: Identity | null,
41
+ context: Context
42
+ ): Promise<boolean | undefined> {
37
43
  let untold = false
38
44
 
39
45
  for (const directive of this.directives) {
@@ -45,8 +51,7 @@ export class Rule implements Directive {
45
51
  continue
46
52
  }
47
53
 
48
- if (!admits)
49
- return false
54
+ if (!admits) return false
50
55
  }
51
56
 
52
57
  return untold ? undefined : true