@toa.io/extensions.exposition 1.0.0-alpha.23 → 1.0.0-alpha.231

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 (816) hide show
  1. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -1
  2. package/components/identity.basic/manifest.toa.yaml +71 -11
  3. package/components/identity.basic/operations/add.d.ts +3 -0
  4. package/components/identity.basic/operations/add.js +16 -0
  5. package/components/identity.basic/operations/add.js.map +1 -0
  6. package/components/identity.basic/operations/authenticate.js +7 -4
  7. package/components/identity.basic/operations/authenticate.js.map +1 -1
  8. package/components/identity.basic/operations/check.d.ts +7 -0
  9. package/components/identity.basic/operations/check.js +15 -0
  10. package/components/identity.basic/operations/check.js.map +1 -0
  11. package/components/identity.basic/operations/incept.d.ts +3 -2
  12. package/components/identity.basic/operations/incept.js +16 -3
  13. package/components/identity.basic/operations/incept.js.map +1 -1
  14. package/components/identity.basic/operations/transit.d.ts +2 -2
  15. package/components/identity.basic/operations/transit.js +9 -6
  16. package/components/identity.basic/operations/transit.js.map +1 -1
  17. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  18. package/components/identity.basic/operations/types.d.ts +14 -6
  19. package/components/identity.basic/source/add.ts +14 -0
  20. package/components/identity.basic/source/authenticate.ts +8 -4
  21. package/components/identity.basic/source/check.ts +20 -0
  22. package/components/identity.basic/source/incept.ts +21 -5
  23. package/components/identity.basic/source/transit.ts +12 -10
  24. package/components/identity.basic/source/types.ts +15 -6
  25. package/components/identity.federation/manifest.toa.yaml +63 -38
  26. package/components/identity.federation/operations/authenticate.d.ts +16 -3
  27. package/components/identity.federation/operations/authenticate.js +25 -16
  28. package/components/identity.federation/operations/authenticate.js.map +1 -1
  29. package/components/identity.federation/operations/decode.d.ts +3 -0
  30. package/components/identity.federation/operations/decode.js +12 -0
  31. package/components/identity.federation/operations/decode.js.map +1 -0
  32. package/components/identity.federation/operations/incept.d.ts +5 -5
  33. package/components/identity.federation/operations/incept.js +13 -5
  34. package/components/identity.federation/operations/incept.js.map +1 -1
  35. package/components/identity.federation/operations/lib/Configuration.d.ts +39 -0
  36. package/components/identity.federation/operations/lib/Configuration.js +3 -0
  37. package/components/identity.federation/operations/lib/Configuration.js.map +1 -0
  38. package/components/identity.federation/operations/lib/Ctx.d.ts +6 -0
  39. package/{transpiled/directives/vary/embeddings/Embedding.js → components/identity.federation/operations/lib/Ctx.js} +1 -1
  40. package/components/identity.federation/operations/lib/Ctx.js.map +1 -0
  41. package/components/identity.federation/operations/lib/Payload.d.ts +5 -0
  42. package/components/identity.federation/operations/lib/Payload.js +3 -0
  43. package/components/identity.federation/operations/lib/Payload.js.map +1 -0
  44. package/components/identity.federation/operations/lib/decode.d.ts +3 -0
  45. package/components/identity.federation/operations/lib/{assertions-as-values.js → decode.js} +19 -19
  46. package/components/identity.federation/operations/lib/decode.js.map +1 -0
  47. package/components/identity.federation/operations/lib/discovery.d.ts +4 -0
  48. package/components/identity.federation/operations/lib/discovery.js +49 -0
  49. package/components/identity.federation/operations/lib/discovery.js.map +1 -0
  50. package/components/identity.federation/operations/lib/errors.d.ts +11 -0
  51. package/components/identity.federation/operations/lib/errors.js +15 -0
  52. package/components/identity.federation/operations/lib/errors.js.map +1 -0
  53. package/components/identity.federation/operations/lib/exchange.d.ts +3 -0
  54. package/components/identity.federation/operations/lib/exchange.js +107 -0
  55. package/components/identity.federation/operations/lib/exchange.js.map +1 -0
  56. package/components/identity.federation/operations/lib/index.d.ts +3 -0
  57. package/components/identity.federation/operations/lib/index.js +8 -0
  58. package/components/identity.federation/operations/lib/index.js.map +1 -0
  59. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  60. package/components/identity.federation/operations/types/Scheme.d.ts +1 -0
  61. package/components/identity.federation/operations/types/Scheme.js +3 -0
  62. package/components/identity.federation/operations/types/Scheme.js.map +1 -0
  63. package/components/identity.federation/operations/types/configuration.d.ts +20 -0
  64. package/components/identity.federation/operations/types/configuration.js +3 -0
  65. package/components/identity.federation/operations/types/configuration.js.map +1 -0
  66. package/components/identity.federation/operations/types/context.d.ts +36 -0
  67. package/components/identity.federation/operations/types/context.js +3 -0
  68. package/components/identity.federation/operations/types/context.js.map +1 -0
  69. package/components/identity.federation/operations/types/entity.d.ts +6 -0
  70. package/components/identity.federation/operations/types/entity.js +3 -0
  71. package/components/identity.federation/operations/types/entity.js.map +1 -0
  72. package/components/identity.federation/operations/types/index.d.ts +4 -0
  73. package/components/identity.federation/operations/types/index.js +21 -0
  74. package/components/identity.federation/operations/types/index.js.map +1 -0
  75. package/components/identity.federation/source/authenticate.ts +43 -21
  76. package/components/identity.federation/source/decode.ts +10 -0
  77. package/components/identity.federation/source/incept.ts +20 -11
  78. package/components/identity.federation/source/lib/Configuration.ts +39 -0
  79. package/components/identity.federation/source/lib/Ctx.ts +7 -0
  80. package/components/identity.federation/source/lib/Payload.ts +6 -0
  81. package/components/identity.federation/source/lib/decode.ts +28 -0
  82. package/components/identity.federation/source/lib/discovery.ts +30 -0
  83. package/components/identity.federation/source/lib/errors.ts +12 -0
  84. package/components/identity.federation/source/lib/exchange.ts +116 -0
  85. package/components/identity.federation/source/lib/index.ts +3 -0
  86. package/components/identity.federation/source/types/Scheme.ts +1 -0
  87. package/components/identity.federation/source/types/configuration.ts +21 -0
  88. package/components/identity.federation/source/types/context.ts +40 -0
  89. package/components/identity.federation/source/types/entity.ts +6 -0
  90. package/components/identity.federation/source/types/index.ts +4 -0
  91. package/components/identity.federation/tsconfig.json +5 -4
  92. package/components/identity.keys/manifest.toa.yaml +57 -0
  93. package/components/identity.keys/operations/create.d.ts +22 -0
  94. package/components/identity.keys/operations/create.js +16 -0
  95. package/components/identity.keys/operations/create.js.map +1 -0
  96. package/components/identity.keys/operations/tsconfig.tsbuildinfo +1 -0
  97. package/components/identity.keys/source/create.ts +35 -0
  98. package/components/identity.keys/tsconfig.json +9 -0
  99. package/components/identity.otp/manifest.toa.yaml +69 -0
  100. package/components/identity.otp/operations/authenticate.d.ts +12 -0
  101. package/components/identity.otp/operations/authenticate.js +31 -0
  102. package/components/identity.otp/operations/authenticate.js.map +1 -0
  103. package/components/identity.otp/operations/issue.d.ts +12 -0
  104. package/components/identity.otp/operations/issue.js +22 -0
  105. package/components/identity.otp/operations/issue.js.map +1 -0
  106. package/components/identity.otp/operations/lib/Context.d.ts +13 -0
  107. package/components/identity.otp/operations/lib/Context.js +3 -0
  108. package/components/identity.otp/operations/lib/Context.js.map +1 -0
  109. package/components/identity.otp/operations/lib/Entity.d.ts +6 -0
  110. package/components/identity.otp/operations/lib/Entity.js +3 -0
  111. package/components/identity.otp/operations/lib/Entity.js.map +1 -0
  112. package/components/identity.otp/operations/lib/index.d.ts +1 -0
  113. package/components/identity.otp/operations/lib/index.js +3 -0
  114. package/components/identity.otp/operations/lib/index.js.map +1 -0
  115. package/components/identity.otp/operations/tsconfig.tsbuildinfo +1 -0
  116. package/components/identity.otp/source/authenticate.ts +48 -0
  117. package/components/identity.otp/source/issue.ts +34 -0
  118. package/components/identity.otp/source/lib/Context.ts +14 -0
  119. package/components/identity.otp/source/lib/Entity.ts +6 -0
  120. package/components/identity.otp/source/lib/index.ts +1 -0
  121. package/components/identity.otp/tsconfig.json +9 -0
  122. package/components/identity.passkeys/manifest.toa.yaml +276 -0
  123. package/components/identity.passkeys/operations/authenticate.d.ts +16 -0
  124. package/components/identity.passkeys/operations/authenticate.js +34 -0
  125. package/components/identity.passkeys/operations/authenticate.js.map +1 -0
  126. package/components/identity.passkeys/operations/challenge.d.ts +35 -0
  127. package/components/identity.passkeys/operations/challenge.js +73 -0
  128. package/components/identity.passkeys/operations/challenge.js.map +1 -0
  129. package/components/identity.passkeys/operations/create.d.ts +19 -0
  130. package/components/identity.passkeys/operations/create.js +58 -0
  131. package/components/identity.passkeys/operations/create.js.map +1 -0
  132. package/components/identity.passkeys/operations/delete.d.ts +8 -0
  133. package/components/identity.passkeys/operations/delete.js +12 -0
  134. package/components/identity.passkeys/operations/delete.js.map +1 -0
  135. package/components/identity.passkeys/operations/lib/const.d.ts +1 -0
  136. package/components/identity.passkeys/operations/lib/const.js +5 -0
  137. package/components/identity.passkeys/operations/lib/const.js.map +1 -0
  138. package/components/identity.passkeys/operations/list.d.ts +7 -0
  139. package/components/identity.passkeys/operations/list.js +15 -0
  140. package/components/identity.passkeys/operations/list.js.map +1 -0
  141. package/components/identity.passkeys/operations/tsconfig.tsbuildinfo +1 -0
  142. package/components/identity.passkeys/operations/types/Configuration.d.ts +6 -0
  143. package/components/identity.passkeys/operations/types/Configuration.js +3 -0
  144. package/components/identity.passkeys/operations/types/Configuration.js.map +1 -0
  145. package/components/identity.passkeys/operations/types/Context.d.ts +15 -0
  146. package/components/identity.passkeys/operations/types/Context.js +3 -0
  147. package/components/identity.passkeys/operations/types/Context.js.map +1 -0
  148. package/components/identity.passkeys/operations/types/Passkey.d.ts +13 -0
  149. package/components/identity.passkeys/operations/types/Passkey.js +3 -0
  150. package/components/identity.passkeys/operations/types/Passkey.js.map +1 -0
  151. package/components/identity.passkeys/operations/types/index.d.ts +2 -0
  152. package/components/identity.passkeys/operations/types/index.js +3 -0
  153. package/components/identity.passkeys/operations/types/index.js.map +1 -0
  154. package/components/identity.passkeys/operations/use.d.ts +16 -0
  155. package/components/identity.passkeys/operations/use.js +57 -0
  156. package/components/identity.passkeys/operations/use.js.map +1 -0
  157. package/components/identity.passkeys/source/authenticate.ts +48 -0
  158. package/components/identity.passkeys/source/challenge.ts +115 -0
  159. package/components/identity.passkeys/source/create.ts +77 -0
  160. package/components/identity.passkeys/source/delete.ts +15 -0
  161. package/components/identity.passkeys/source/lib/const.ts +1 -0
  162. package/components/identity.passkeys/source/list.ts +17 -0
  163. package/components/identity.passkeys/source/types/Configuration.ts +6 -0
  164. package/components/identity.passkeys/source/types/Context.ts +16 -0
  165. package/components/identity.passkeys/source/types/Passkey.ts +14 -0
  166. package/components/identity.passkeys/source/types/index.ts +2 -0
  167. package/components/identity.passkeys/source/use.ts +75 -0
  168. package/components/identity.passkeys/tsconfig.json +9 -0
  169. package/components/identity.roles/manifest.toa.yaml +4 -2
  170. package/components/identity.roles/operations/grant.js +2 -2
  171. package/components/identity.roles/operations/grant.js.map +1 -1
  172. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  173. package/components/identity.roles/source/grant.ts +2 -2
  174. package/components/identity.tokens/manifest.toa.yaml +93 -13
  175. package/components/identity.tokens/operations/authenticate.d.ts +2 -2
  176. package/components/identity.tokens/operations/authenticate.js +13 -12
  177. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  178. package/components/identity.tokens/operations/decrypt.d.ts +13 -3
  179. package/components/identity.tokens/operations/decrypt.js +65 -18
  180. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  181. package/components/identity.tokens/operations/encrypt.d.ts +3 -3
  182. package/components/identity.tokens/operations/encrypt.js +24 -8
  183. package/components/identity.tokens/operations/encrypt.js.map +1 -1
  184. package/components/identity.tokens/operations/issue.d.ts +24 -0
  185. package/components/identity.tokens/operations/issue.js +59 -0
  186. package/components/identity.tokens/operations/issue.js.map +1 -0
  187. package/components/identity.tokens/operations/lib/index.d.ts +2 -0
  188. package/components/identity.tokens/operations/lib/index.js +19 -0
  189. package/components/identity.tokens/operations/lib/index.js.map +1 -0
  190. package/components/identity.tokens/operations/lib/pad.d.ts +1 -0
  191. package/components/identity.tokens/operations/lib/pad.js +5 -0
  192. package/components/identity.tokens/operations/lib/pad.js.map +1 -0
  193. package/components/identity.tokens/operations/lib/types.d.ts +75 -0
  194. package/components/identity.tokens/operations/lib/types.js.map +1 -0
  195. package/components/identity.tokens/operations/revoke.d.ts +2 -2
  196. package/components/identity.tokens/operations/revoke.js.map +1 -1
  197. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  198. package/components/identity.tokens/source/authenticate.test.ts +13 -7
  199. package/components/identity.tokens/source/authenticate.ts +15 -14
  200. package/components/identity.tokens/source/decrypt.test.ts +29 -16
  201. package/components/identity.tokens/source/decrypt.ts +94 -20
  202. package/components/identity.tokens/source/encrypt.test.ts +48 -13
  203. package/components/identity.tokens/source/encrypt.ts +36 -12
  204. package/components/identity.tokens/source/issue.ts +82 -0
  205. package/components/identity.tokens/source/lib/index.ts +2 -0
  206. package/components/identity.tokens/source/lib/pad.ts +1 -0
  207. package/components/identity.tokens/source/lib/paseto.test.ts +16 -0
  208. package/components/identity.tokens/source/{types.ts → lib/types.ts} +38 -7
  209. package/components/identity.tokens/source/revoke.ts +2 -2
  210. package/components/octets.storage/manifest.toa.yaml +13 -5
  211. package/components/octets.storage/operations/get.js +3 -3
  212. package/components/octets.storage/operations/head.js +7 -0
  213. package/components/octets.storage/operations/put.js +135 -0
  214. package/documentation/access.md +78 -27
  215. package/documentation/authorities.md +6 -11
  216. package/documentation/components.md +114 -39
  217. package/documentation/dev.md +30 -0
  218. package/documentation/flow.md +44 -0
  219. package/documentation/identity.md +115 -5
  220. package/documentation/introspection.md +82 -0
  221. package/documentation/io.md +42 -2
  222. package/documentation/map.md +115 -0
  223. package/documentation/notes/desync.jpg +0 -0
  224. package/documentation/notes/peers.md +59 -0
  225. package/documentation/notes/throttling.md +82 -0
  226. package/documentation/octets.md +122 -69
  227. package/documentation/passkeys.md +4 -0
  228. package/documentation/protocol.md +11 -4
  229. package/documentation/query.md +51 -4
  230. package/documentation/tree.md +13 -0
  231. package/features/access.feature +67 -2
  232. package/features/auth.assert.feature +57 -0
  233. package/features/auth.claims.feature +170 -0
  234. package/features/auth.incept.feature +120 -0
  235. package/features/auth.input.feature +59 -0
  236. package/features/auth.issue.feature +32 -0
  237. package/features/authorities.basic.feature +4 -3
  238. package/features/authorities.feature +3 -3
  239. package/features/authorities.federation.feature +20 -20
  240. package/features/authorities.tokens.feature +1 -2
  241. package/features/body.feature +27 -0
  242. package/features/cache.feature +92 -3
  243. package/features/cors.feature +28 -7
  244. package/features/debug.feature +34 -0
  245. package/features/dev.feature +87 -0
  246. package/features/dynamic.feature +44 -0
  247. package/features/errors.feature +17 -5
  248. package/features/etag.feature +134 -1
  249. package/features/flow.feature +148 -0
  250. package/features/identity.basic.feature +120 -6
  251. package/features/identity.feature +11 -4
  252. package/features/identity.federation.feature +122 -42
  253. package/features/identity.otp.feature +101 -0
  254. package/features/identity.roles.feature +52 -3
  255. package/features/identity.tokens.feature +1 -99
  256. package/features/identtiy.tokens.custom.feature +247 -0
  257. package/features/interruptions.feature +19 -0
  258. package/features/introspection.feature +153 -0
  259. package/features/io.feature +0 -1
  260. package/features/io.throttle.feature +40 -0
  261. package/features/map.feature +356 -0
  262. package/features/methods.feature +47 -0
  263. package/features/octets.cloudinary.feature +223 -0
  264. package/features/octets.download.feature +189 -0
  265. package/features/octets.entries.feature +8 -58
  266. package/features/octets.feature +58 -65
  267. package/features/octets.head.feature +40 -0
  268. package/features/octets.location.feature +83 -0
  269. package/features/octets.meta.feature +62 -15
  270. package/features/octets.workflows.feature +332 -67
  271. package/features/passkeys.feature +66 -0
  272. package/features/probes.feature +14 -0
  273. package/features/{queries.feature → query.feature} +134 -2
  274. package/features/realtime.feature +34 -0
  275. package/features/response.feature +29 -0
  276. package/features/routes.feature +86 -2
  277. package/features/server.feature +21 -0
  278. package/features/steps/.env.example +5 -0
  279. package/features/steps/Captures.ts +12 -0
  280. package/features/steps/Common.ts +4 -0
  281. package/features/steps/Gateway.ts +3 -1
  282. package/features/steps/HTTP.ts +27 -3
  283. package/features/steps/IDP.ts +334 -0
  284. package/features/steps/Identity.ts +51 -0
  285. package/features/steps/OTP.ts +39 -0
  286. package/features/steps/Parameters.ts +88 -2
  287. package/features/steps/Realtime.ts +151 -0
  288. package/features/steps/Workspace.ts +1 -2
  289. package/features/steps/components/echo/manifest.toa.yaml +17 -0
  290. package/features/steps/components/echo/operations/echo.js +7 -0
  291. package/features/steps/components/echo/operations/parameters.js +7 -0
  292. package/features/steps/components/echo/operations/ping.js +7 -0
  293. package/features/steps/components/echo/operations/unwrap.js +7 -0
  294. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  295. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  296. package/features/steps/components/greeter/manifest.toa.yaml +0 -1
  297. package/features/steps/components/octets.tester/manifest.toa.yaml +26 -3
  298. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  299. package/features/steps/components/octets.tester/operations/bar.js +0 -1
  300. package/features/steps/components/octets.tester/operations/baz.js +1 -1
  301. package/features/steps/components/octets.tester/operations/echo.js +1 -1
  302. package/features/steps/components/octets.tester/operations/foo.js +2 -2
  303. package/features/steps/components/octets.tester/operations/id.js +7 -0
  304. package/features/steps/components/octets.tester/operations/identity.js +7 -0
  305. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  306. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  307. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  308. package/features/steps/components/pots/manifest.toa.yaml +15 -4
  309. package/features/steps/components/sequences/manifest.toa.yaml +0 -1
  310. package/features/steps/components/users/manifest.toa.yaml +4 -2
  311. package/features/steps/components/users/operations/create.js +15 -0
  312. package/features/steps/components/users.properties/manifest.toa.yaml +0 -1
  313. package/features/streams.feature +4 -0
  314. package/features/timestamps.feature +41 -0
  315. package/features/timing.feature +1 -1
  316. package/package.json +34 -21
  317. package/schemas/annotation.cos.yaml +7 -0
  318. package/schemas/io/throttle.cos.yaml +36 -0
  319. package/schemas/method.cos.yaml +2 -1
  320. package/schemas/node.cos.yaml +2 -0
  321. package/schemas/octets/put.cos.yaml +28 -0
  322. package/schemas/query.cos.yaml +7 -10
  323. package/schemas/querystring.cos.yaml +1 -0
  324. package/source/Annotation.ts +3 -0
  325. package/source/Branch.ts +1 -0
  326. package/source/Composition.ts +0 -6
  327. package/source/Context.ts +1 -0
  328. package/source/Directive.test.ts +5 -3
  329. package/source/Directive.ts +30 -6
  330. package/source/Endpoint.ts +88 -23
  331. package/source/Factory.ts +15 -3
  332. package/source/Gateway.ts +76 -14
  333. package/source/HTTP/Context.ts +40 -8
  334. package/source/HTTP/Server.ts +173 -48
  335. package/source/HTTP/Timing.ts +1 -1
  336. package/source/HTTP/exceptions.ts +30 -12
  337. package/source/HTTP/formats/index.ts +4 -5
  338. package/source/HTTP/formats/json.ts +2 -4
  339. package/source/HTTP/formats/msgpack.ts +0 -1
  340. package/source/HTTP/formats/text.ts +2 -4
  341. package/source/HTTP/formats/yaml.ts +2 -3
  342. package/source/HTTP/messages.test.ts +70 -7
  343. package/source/HTTP/messages.ts +99 -19
  344. package/source/Introspection.ts +11 -0
  345. package/source/Mapping.ts +69 -21
  346. package/source/Query.test.ts +3 -3
  347. package/source/Query.ts +130 -33
  348. package/source/RTD/Context.ts +1 -1
  349. package/source/RTD/Directives.ts +4 -0
  350. package/source/RTD/Endpoint.ts +3 -0
  351. package/source/RTD/Method.ts +16 -0
  352. package/source/RTD/Node.ts +30 -15
  353. package/source/RTD/Route.ts +12 -5
  354. package/source/RTD/Tree.ts +7 -5
  355. package/source/RTD/factory.ts +4 -1
  356. package/source/RTD/segment.ts +2 -0
  357. package/source/RTD/syntax/parse.test.ts +1 -1
  358. package/source/RTD/syntax/parse.ts +37 -24
  359. package/source/RTD/syntax/types.ts +9 -4
  360. package/source/Remotes.ts +7 -6
  361. package/source/Tenant.ts +6 -12
  362. package/source/deployment.ts +14 -8
  363. package/source/directives/auth/Anonymous.ts +3 -3
  364. package/source/directives/auth/Anyone.ts +13 -0
  365. package/source/directives/auth/Assert.ts +35 -0
  366. package/source/directives/auth/Authorization.ts +58 -22
  367. package/source/directives/auth/Delegate.ts +9 -5
  368. package/source/directives/auth/Echo.ts +16 -6
  369. package/source/directives/auth/Federation.ts +84 -0
  370. package/source/directives/auth/Id.ts +1 -1
  371. package/source/directives/auth/Incept.ts +76 -24
  372. package/source/directives/auth/Input.ts +71 -0
  373. package/source/directives/auth/Role.test.ts +2 -3
  374. package/source/directives/auth/Role.ts +6 -11
  375. package/source/directives/auth/Rule.ts +3 -6
  376. package/source/directives/auth/Scheme.ts +5 -5
  377. package/source/directives/auth/create.ts +11 -0
  378. package/source/directives/auth/schemes.ts +5 -2
  379. package/source/directives/auth/split.ts +1 -1
  380. package/source/directives/auth/types.ts +12 -7
  381. package/source/directives/cache/Cache.ts +20 -7
  382. package/source/directives/cache/Control.ts +16 -16
  383. package/source/directives/cors/CORS.ts +9 -9
  384. package/source/directives/dev/Development.ts +14 -7
  385. package/source/directives/dev/Faulty.ts +26 -0
  386. package/source/directives/dev/Sleep.ts +55 -0
  387. package/source/directives/dev/types.ts +1 -1
  388. package/source/directives/flow/Compose.ts +92 -0
  389. package/source/directives/flow/Fetch.ts +86 -0
  390. package/source/directives/flow/Flow.ts +42 -0
  391. package/source/directives/flow/index.ts +3 -0
  392. package/source/directives/flow/types.ts +7 -0
  393. package/source/directives/index.ts +3 -2
  394. package/source/directives/io/Directive.ts +5 -2
  395. package/source/directives/io/IO.ts +18 -6
  396. package/source/directives/io/Input.ts +9 -6
  397. package/source/directives/io/Output.ts +6 -5
  398. package/source/directives/io/Throttle.ts +32 -0
  399. package/source/directives/io/lib/throttle/Configuration.test.ts +40 -0
  400. package/source/directives/io/lib/throttle/Configuration.ts +58 -0
  401. package/source/directives/io/lib/throttle/Interval.ts +31 -0
  402. package/source/directives/io/lib/throttle/Keys.ts +40 -0
  403. package/source/directives/io/lib/throttle/Quota.ts +22 -0
  404. package/source/directives/io/lib/throttle/Quotas.test.ts +136 -0
  405. package/source/directives/io/lib/throttle/Quotas.ts +83 -0
  406. package/source/directives/io/lib/throttle/components/Component.ts +5 -0
  407. package/source/directives/io/lib/throttle/components/IP.ts +40 -0
  408. package/source/directives/io/lib/throttle/components/Path.ts +8 -0
  409. package/source/directives/io/lib/throttle/components/index.ts +13 -0
  410. package/source/directives/io/lib/throttle/conditions/Condition.ts +5 -0
  411. package/source/directives/io/lib/throttle/conditions/Status.ts +17 -0
  412. package/source/directives/io/lib/throttle/conditions/index.ts +11 -0
  413. package/source/directives/io/lib/throttle/index.ts +2 -0
  414. package/source/directives/io/schemas.test.ts +9 -0
  415. package/source/directives/io/schemas.ts +3 -0
  416. package/source/directives/map/Authority.ts +15 -0
  417. package/source/directives/map/Buffer.ts +15 -0
  418. package/source/directives/map/Claims.ts +58 -0
  419. package/source/directives/map/Directive.ts +4 -0
  420. package/source/directives/map/Headers.ts +38 -0
  421. package/source/directives/map/Language.ts +42 -0
  422. package/source/directives/map/Languages.ts +11 -0
  423. package/source/directives/map/Map.ts +63 -0
  424. package/source/directives/map/Mapping.ts +19 -0
  425. package/source/directives/{vary → map}/Properties.ts +2 -4
  426. package/source/directives/map/Segments.ts +33 -0
  427. package/source/directives/map/index.ts +3 -0
  428. package/source/directives/octets/Context.ts +3 -2
  429. package/source/directives/octets/Delete.ts +22 -19
  430. package/source/directives/octets/Get.ts +96 -0
  431. package/source/directives/octets/Octets.ts +10 -12
  432. package/source/directives/octets/Put.ts +138 -0
  433. package/source/directives/octets/Workflow.ts +9 -3
  434. package/source/directives/octets/bytes.test.ts +30 -0
  435. package/source/directives/octets/bytes.ts +18 -0
  436. package/source/directives/octets/schemas.ts +4 -8
  437. package/source/directives/octets/types.ts +2 -0
  438. package/source/directives/octets/workflows/Execution.ts +62 -8
  439. package/source/directives/octets/workflows/Workflow.ts +18 -7
  440. package/source/directives/octets/workflows/index.ts +1 -1
  441. package/source/exceptions.ts +16 -4
  442. package/source/manifest.ts +10 -11
  443. package/source/root.ts +16 -1
  444. package/transpiled/Annotation.d.ts +2 -0
  445. package/transpiled/Branch.d.ts +1 -0
  446. package/transpiled/Composition.d.ts +0 -1
  447. package/transpiled/Composition.js +0 -4
  448. package/transpiled/Composition.js.map +1 -1
  449. package/transpiled/Context.d.ts +1 -0
  450. package/transpiled/Directive.d.ts +3 -0
  451. package/transpiled/Directive.js +24 -6
  452. package/transpiled/Directive.js.map +1 -1
  453. package/transpiled/Endpoint.d.ts +6 -4
  454. package/transpiled/Endpoint.js +63 -15
  455. package/transpiled/Endpoint.js.map +1 -1
  456. package/transpiled/Factory.d.ts +1 -1
  457. package/transpiled/Factory.js +11 -2
  458. package/transpiled/Factory.js.map +1 -1
  459. package/transpiled/Gateway.d.ts +3 -0
  460. package/transpiled/Gateway.js +57 -12
  461. package/transpiled/Gateway.js.map +1 -1
  462. package/transpiled/HTTP/Context.d.ts +13 -2
  463. package/transpiled/HTTP/Context.js +26 -6
  464. package/transpiled/HTTP/Context.js.map +1 -1
  465. package/transpiled/HTTP/Server.d.ts +9 -3
  466. package/transpiled/HTTP/Server.js +135 -38
  467. package/transpiled/HTTP/Server.js.map +1 -1
  468. package/transpiled/HTTP/Timing.js.map +1 -1
  469. package/transpiled/HTTP/exceptions.d.ts +16 -7
  470. package/transpiled/HTTP/exceptions.js +34 -16
  471. package/transpiled/HTTP/exceptions.js.map +1 -1
  472. package/transpiled/HTTP/formats/index.d.ts +2 -2
  473. package/transpiled/HTTP/formats/index.js +3 -3
  474. package/transpiled/HTTP/formats/index.js.map +1 -1
  475. package/transpiled/HTTP/formats/json.d.ts +2 -2
  476. package/transpiled/HTTP/formats/json.js +3 -4
  477. package/transpiled/HTTP/formats/json.js.map +1 -1
  478. package/transpiled/HTTP/formats/msgpack.d.ts +1 -1
  479. package/transpiled/HTTP/formats/msgpack.js.map +1 -1
  480. package/transpiled/HTTP/formats/text.d.ts +2 -2
  481. package/transpiled/HTTP/formats/text.js +3 -4
  482. package/transpiled/HTTP/formats/text.js.map +1 -1
  483. package/transpiled/HTTP/formats/yaml.d.ts +2 -2
  484. package/transpiled/HTTP/formats/yaml.js +3 -4
  485. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  486. package/transpiled/HTTP/messages.d.ts +4 -1
  487. package/transpiled/HTTP/messages.js +74 -13
  488. package/transpiled/HTTP/messages.js.map +1 -1
  489. package/transpiled/Introspection.d.ts +9 -0
  490. package/transpiled/Introspection.js +3 -0
  491. package/transpiled/Introspection.js.map +1 -0
  492. package/transpiled/Mapping.d.ts +11 -2
  493. package/transpiled/Mapping.js +51 -19
  494. package/transpiled/Mapping.js.map +1 -1
  495. package/transpiled/Query.d.ts +12 -1
  496. package/transpiled/Query.js +93 -28
  497. package/transpiled/Query.js.map +1 -1
  498. package/transpiled/RTD/Context.d.ts +1 -1
  499. package/transpiled/RTD/Directives.d.ts +3 -0
  500. package/transpiled/RTD/Endpoint.d.ts +1 -0
  501. package/transpiled/RTD/Method.d.ts +4 -0
  502. package/transpiled/RTD/Method.js +11 -0
  503. package/transpiled/RTD/Method.js.map +1 -1
  504. package/transpiled/RTD/Node.d.ts +4 -1
  505. package/transpiled/RTD/Node.js +23 -12
  506. package/transpiled/RTD/Node.js.map +1 -1
  507. package/transpiled/RTD/Route.d.ts +2 -1
  508. package/transpiled/RTD/Route.js +7 -3
  509. package/transpiled/RTD/Route.js.map +1 -1
  510. package/transpiled/RTD/Tree.d.ts +2 -1
  511. package/transpiled/RTD/Tree.js +3 -0
  512. package/transpiled/RTD/Tree.js.map +1 -1
  513. package/transpiled/RTD/factory.js +4 -1
  514. package/transpiled/RTD/factory.js.map +1 -1
  515. package/transpiled/RTD/segment.d.ts +1 -0
  516. package/transpiled/RTD/segment.js +2 -0
  517. package/transpiled/RTD/segment.js.map +1 -1
  518. package/transpiled/RTD/syntax/parse.js +34 -22
  519. package/transpiled/RTD/syntax/parse.js.map +1 -1
  520. package/transpiled/RTD/syntax/types.d.ts +8 -3
  521. package/transpiled/RTD/syntax/types.js +1 -1
  522. package/transpiled/RTD/syntax/types.js.map +1 -1
  523. package/transpiled/Remotes.d.ts +4 -4
  524. package/transpiled/Remotes.js +6 -5
  525. package/transpiled/Remotes.js.map +1 -1
  526. package/transpiled/Tenant.d.ts +5 -4
  527. package/transpiled/Tenant.js +2 -7
  528. package/transpiled/Tenant.js.map +1 -1
  529. package/transpiled/deployment.js +9 -3
  530. package/transpiled/deployment.js.map +1 -1
  531. package/transpiled/directives/auth/Anonymous.d.ts +2 -2
  532. package/transpiled/directives/auth/Anonymous.js +2 -2
  533. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  534. package/transpiled/directives/auth/Anyone.d.ts +6 -0
  535. package/transpiled/directives/auth/Anyone.js +14 -0
  536. package/transpiled/directives/auth/Anyone.js.map +1 -0
  537. package/transpiled/directives/auth/Assert.d.ts +7 -0
  538. package/transpiled/directives/auth/Assert.js +57 -0
  539. package/transpiled/directives/auth/Assert.js.map +1 -0
  540. package/transpiled/directives/auth/Authorization.d.ts +4 -3
  541. package/transpiled/directives/auth/Authorization.js +48 -21
  542. package/transpiled/directives/auth/Authorization.js.map +1 -1
  543. package/transpiled/directives/auth/Delegate.d.ts +5 -4
  544. package/transpiled/directives/auth/Delegate.js +7 -3
  545. package/transpiled/directives/auth/Delegate.js.map +1 -1
  546. package/transpiled/directives/auth/Echo.d.ts +4 -4
  547. package/transpiled/directives/auth/Echo.js +11 -4
  548. package/transpiled/directives/auth/Echo.js.map +1 -1
  549. package/transpiled/directives/auth/Federation.d.ts +16 -0
  550. package/transpiled/directives/auth/Federation.js +57 -0
  551. package/transpiled/directives/auth/Federation.js.map +1 -0
  552. package/transpiled/directives/auth/Id.d.ts +1 -1
  553. package/transpiled/directives/auth/Id.js.map +1 -1
  554. package/transpiled/directives/auth/Incept.d.ts +8 -5
  555. package/transpiled/directives/auth/Incept.js +57 -19
  556. package/transpiled/directives/auth/Incept.js.map +1 -1
  557. package/transpiled/directives/auth/Input.d.ts +13 -0
  558. package/transpiled/directives/auth/Input.js +49 -0
  559. package/transpiled/directives/auth/Input.js.map +1 -0
  560. package/transpiled/directives/auth/Role.d.ts +1 -1
  561. package/transpiled/directives/auth/Role.js +4 -6
  562. package/transpiled/directives/auth/Role.js.map +1 -1
  563. package/transpiled/directives/auth/Rule.d.ts +2 -4
  564. package/transpiled/directives/auth/Rule.js +2 -2
  565. package/transpiled/directives/auth/Rule.js.map +1 -1
  566. package/transpiled/directives/auth/Scheme.d.ts +2 -2
  567. package/transpiled/directives/auth/Scheme.js +4 -4
  568. package/transpiled/directives/auth/Scheme.js.map +1 -1
  569. package/transpiled/directives/auth/create.d.ts +2 -0
  570. package/transpiled/directives/auth/create.js +14 -0
  571. package/transpiled/directives/auth/create.js.map +1 -0
  572. package/transpiled/directives/auth/schemes.d.ts +2 -1
  573. package/transpiled/directives/auth/schemes.js +5 -2
  574. package/transpiled/directives/auth/schemes.js.map +1 -1
  575. package/transpiled/directives/auth/split.js +1 -1
  576. package/transpiled/directives/auth/split.js.map +1 -1
  577. package/transpiled/directives/auth/types.d.ts +10 -7
  578. package/transpiled/directives/cache/Cache.d.ts +3 -3
  579. package/transpiled/directives/cache/Cache.js +15 -4
  580. package/transpiled/directives/cache/Cache.js.map +1 -1
  581. package/transpiled/directives/cache/Control.d.ts +2 -2
  582. package/transpiled/directives/cache/Control.js +12 -12
  583. package/transpiled/directives/cache/Control.js.map +1 -1
  584. package/transpiled/directives/cors/CORS.js +7 -7
  585. package/transpiled/directives/cors/CORS.js.map +1 -1
  586. package/transpiled/directives/dev/Development.d.ts +1 -1
  587. package/transpiled/directives/dev/Development.js +15 -7
  588. package/transpiled/directives/dev/Development.js.map +1 -1
  589. package/transpiled/directives/dev/Faulty.d.ts +8 -0
  590. package/transpiled/directives/dev/Faulty.js +26 -0
  591. package/transpiled/directives/dev/Faulty.js.map +1 -0
  592. package/transpiled/directives/dev/Sleep.d.ts +9 -0
  593. package/transpiled/directives/dev/Sleep.js +48 -0
  594. package/transpiled/directives/dev/Sleep.js.map +1 -0
  595. package/transpiled/directives/dev/types.d.ts +1 -1
  596. package/transpiled/directives/flow/Compose.d.ts +9 -0
  597. package/transpiled/directives/flow/Compose.js +94 -0
  598. package/transpiled/directives/flow/Compose.js.map +1 -0
  599. package/transpiled/directives/flow/Fetch.d.ts +12 -0
  600. package/transpiled/directives/flow/Fetch.js +58 -0
  601. package/transpiled/directives/flow/Fetch.js.map +1 -0
  602. package/transpiled/directives/flow/Flow.d.ts +10 -0
  603. package/transpiled/directives/flow/Flow.js +33 -0
  604. package/transpiled/directives/flow/Flow.js.map +1 -0
  605. package/transpiled/directives/flow/index.d.ts +2 -0
  606. package/transpiled/directives/flow/index.js +6 -0
  607. package/transpiled/directives/flow/index.js.map +1 -0
  608. package/transpiled/directives/flow/types.d.ts +6 -0
  609. package/transpiled/directives/flow/types.js.map +1 -0
  610. package/transpiled/directives/index.js +3 -2
  611. package/transpiled/directives/index.js.map +1 -1
  612. package/transpiled/directives/io/Directive.d.ts +5 -2
  613. package/transpiled/directives/io/IO.d.ts +4 -2
  614. package/transpiled/directives/io/IO.js +14 -4
  615. package/transpiled/directives/io/IO.js.map +1 -1
  616. package/transpiled/directives/io/Input.d.ts +1 -1
  617. package/transpiled/directives/io/Input.js +5 -3
  618. package/transpiled/directives/io/Input.js.map +1 -1
  619. package/transpiled/directives/io/Output.d.ts +1 -1
  620. package/transpiled/directives/io/Output.js +3 -3
  621. package/transpiled/directives/io/Output.js.map +1 -1
  622. package/transpiled/directives/io/Throttle.d.ts +11 -0
  623. package/transpiled/directives/io/Throttle.js +51 -0
  624. package/transpiled/directives/io/Throttle.js.map +1 -0
  625. package/transpiled/directives/io/lib/throttle/Configuration.d.ts +23 -0
  626. package/transpiled/directives/io/lib/throttle/Configuration.js +27 -0
  627. package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -0
  628. package/transpiled/directives/io/lib/throttle/Interval.d.ts +9 -0
  629. package/transpiled/directives/io/lib/throttle/Interval.js +31 -0
  630. package/transpiled/directives/io/lib/throttle/Interval.js.map +1 -0
  631. package/transpiled/directives/io/lib/throttle/Keys.d.ts +12 -0
  632. package/transpiled/directives/io/lib/throttle/Keys.js +34 -0
  633. package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -0
  634. package/transpiled/directives/io/lib/throttle/Quota.d.ts +8 -0
  635. package/transpiled/directives/io/lib/throttle/Quota.js +22 -0
  636. package/transpiled/directives/io/lib/throttle/Quota.js.map +1 -0
  637. package/transpiled/directives/io/lib/throttle/Quotas.d.ts +26 -0
  638. package/transpiled/directives/io/lib/throttle/Quotas.js +61 -0
  639. package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -0
  640. package/transpiled/directives/io/lib/throttle/components/Component.d.ts +4 -0
  641. package/transpiled/directives/io/lib/throttle/components/Component.js +3 -0
  642. package/transpiled/directives/io/lib/throttle/components/Component.js.map +1 -0
  643. package/transpiled/directives/io/lib/throttle/components/IP.d.ts +6 -0
  644. package/transpiled/directives/io/lib/throttle/components/IP.js +33 -0
  645. package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -0
  646. package/transpiled/directives/io/lib/throttle/components/Path.d.ts +5 -0
  647. package/transpiled/directives/io/lib/throttle/components/Path.js +10 -0
  648. package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -0
  649. package/transpiled/directives/io/lib/throttle/components/index.d.ts +5 -0
  650. package/transpiled/directives/io/lib/throttle/components/index.js +10 -0
  651. package/transpiled/directives/io/lib/throttle/components/index.js.map +1 -0
  652. package/transpiled/directives/io/lib/throttle/conditions/Condition.d.ts +4 -0
  653. package/transpiled/directives/io/lib/throttle/conditions/Condition.js +3 -0
  654. package/transpiled/directives/io/lib/throttle/conditions/Condition.js.map +1 -0
  655. package/transpiled/directives/io/lib/throttle/conditions/Status.d.ts +7 -0
  656. package/transpiled/directives/io/lib/throttle/conditions/Status.js +19 -0
  657. package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -0
  658. package/transpiled/directives/io/lib/throttle/conditions/index.d.ts +5 -0
  659. package/transpiled/directives/io/lib/throttle/conditions/index.js +8 -0
  660. package/transpiled/directives/io/lib/throttle/conditions/index.js.map +1 -0
  661. package/transpiled/directives/io/lib/throttle/index.d.ts +2 -0
  662. package/transpiled/directives/io/lib/throttle/index.js +8 -0
  663. package/transpiled/directives/io/lib/throttle/index.js.map +1 -0
  664. package/transpiled/directives/io/schemas.d.ts +2 -0
  665. package/transpiled/directives/io/schemas.js +2 -1
  666. package/transpiled/directives/io/schemas.js.map +1 -1
  667. package/transpiled/directives/map/Authority.d.ts +6 -0
  668. package/transpiled/directives/map/Authority.js +19 -0
  669. package/transpiled/directives/map/Authority.js.map +1 -0
  670. package/transpiled/directives/map/Buffer.d.ts +6 -0
  671. package/transpiled/directives/map/Buffer.js +19 -0
  672. package/transpiled/directives/map/Buffer.js.map +1 -0
  673. package/transpiled/directives/map/Claims.d.ts +10 -0
  674. package/transpiled/directives/map/Claims.js +44 -0
  675. package/transpiled/directives/map/Claims.js.map +1 -0
  676. package/transpiled/directives/map/Directive.d.ts +3 -0
  677. package/transpiled/directives/map/Directive.js.map +1 -0
  678. package/transpiled/directives/map/Headers.d.ts +7 -0
  679. package/transpiled/directives/map/Headers.js +34 -0
  680. package/transpiled/directives/map/Headers.js.map +1 -0
  681. package/transpiled/directives/map/Language.d.ts +10 -0
  682. package/transpiled/directives/map/Language.js +38 -0
  683. package/transpiled/directives/map/Language.js.map +1 -0
  684. package/transpiled/directives/map/Languages.d.ts +4 -0
  685. package/transpiled/directives/map/Languages.js +17 -0
  686. package/transpiled/directives/map/Languages.js.map +1 -0
  687. package/transpiled/directives/map/Map.d.ts +13 -0
  688. package/transpiled/directives/map/Map.js +48 -0
  689. package/transpiled/directives/map/Map.js.map +1 -0
  690. package/transpiled/directives/map/Mapping.d.ts +13 -0
  691. package/transpiled/directives/map/Mapping.js +13 -0
  692. package/transpiled/directives/map/Mapping.js.map +1 -0
  693. package/transpiled/directives/{vary → map}/Properties.d.ts +2 -2
  694. package/transpiled/directives/{vary → map}/Properties.js +1 -3
  695. package/transpiled/directives/map/Properties.js.map +1 -0
  696. package/transpiled/directives/map/Segments.d.ts +6 -0
  697. package/transpiled/directives/map/Segments.js +30 -0
  698. package/transpiled/directives/map/Segments.js.map +1 -0
  699. package/transpiled/directives/map/index.d.ts +2 -0
  700. package/transpiled/directives/map/index.js +6 -0
  701. package/transpiled/directives/map/index.js.map +1 -0
  702. package/transpiled/directives/octets/Context.js +4 -24
  703. package/transpiled/directives/octets/Context.js.map +1 -1
  704. package/transpiled/directives/octets/Delete.js +15 -12
  705. package/transpiled/directives/octets/Delete.js.map +1 -1
  706. package/transpiled/directives/octets/{Fetch.d.ts → Get.d.ts} +5 -6
  707. package/transpiled/directives/octets/{Fetch.js → Get.js} +34 -30
  708. package/transpiled/directives/octets/Get.js.map +1 -0
  709. package/transpiled/directives/octets/Octets.js +9 -10
  710. package/transpiled/directives/octets/Octets.js.map +1 -1
  711. package/transpiled/directives/octets/{Store.d.ts → Put.d.ts} +8 -2
  712. package/transpiled/directives/octets/{Store.js → Put.js} +33 -27
  713. package/transpiled/directives/octets/Put.js.map +1 -0
  714. package/transpiled/directives/octets/Workflow.js +7 -2
  715. package/transpiled/directives/octets/Workflow.js.map +1 -1
  716. package/transpiled/directives/octets/bytes.d.ts +1 -0
  717. package/transpiled/directives/octets/bytes.js +21 -0
  718. package/transpiled/directives/octets/bytes.js.map +1 -0
  719. package/transpiled/directives/octets/schemas.d.ts +4 -8
  720. package/transpiled/directives/octets/schemas.js +3 -6
  721. package/transpiled/directives/octets/schemas.js.map +1 -1
  722. package/transpiled/directives/octets/types.d.ts +2 -0
  723. package/transpiled/directives/octets/workflows/Execution.d.ts +7 -1
  724. package/transpiled/directives/octets/workflows/Execution.js +44 -9
  725. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  726. package/transpiled/directives/octets/workflows/Workflow.d.ts +8 -3
  727. package/transpiled/directives/octets/workflows/Workflow.js +10 -4
  728. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  729. package/transpiled/directives/octets/workflows/index.d.ts +1 -1
  730. package/transpiled/directives/octets/workflows/index.js.map +1 -1
  731. package/transpiled/exceptions.js +11 -2
  732. package/transpiled/exceptions.js.map +1 -1
  733. package/transpiled/manifest.js +10 -11
  734. package/transpiled/manifest.js.map +1 -1
  735. package/transpiled/root.js +16 -1
  736. package/transpiled/root.js.map +1 -1
  737. package/transpiled/tsconfig.tsbuildinfo +1 -1
  738. package/components/identity.federation/operations/lib/assertions-as-values.d.ts +0 -4
  739. package/components/identity.federation/operations/lib/assertions-as-values.js.map +0 -1
  740. package/components/identity.federation/operations/lib/jwt.d.ts +0 -20
  741. package/components/identity.federation/operations/lib/jwt.js +0 -136
  742. package/components/identity.federation/operations/lib/jwt.js.map +0 -1
  743. package/components/identity.federation/operations/schemas.d.ts +0 -63
  744. package/components/identity.federation/operations/schemas.js +0 -9
  745. package/components/identity.federation/operations/schemas.js.map +0 -1
  746. package/components/identity.federation/operations/types.d.ts +0 -56
  747. package/components/identity.federation/operations/types.js.map +0 -1
  748. package/components/identity.federation/source/lib/assertions-as-values.ts +0 -19
  749. package/components/identity.federation/source/lib/jwt.test.ts +0 -56
  750. package/components/identity.federation/source/lib/jwt.ts +0 -171
  751. package/components/identity.federation/source/schemas.ts +0 -65
  752. package/components/identity.federation/source/types.ts +0 -62
  753. package/components/identity.tokens/operations/types.d.ts +0 -46
  754. package/components/identity.tokens/operations/types.js.map +0 -1
  755. package/components/octets.storage/operations/fetch.js +0 -46
  756. package/components/octets.storage/operations/list.js +0 -7
  757. package/components/octets.storage/operations/store.js +0 -11
  758. package/documentation/vary.md +0 -69
  759. package/features/steps/IdP.ts +0 -154
  760. package/features/steps/components/octets.tester/operations/diversify.js +0 -14
  761. package/features/vary.feature +0 -252
  762. package/schemas/octets/context.cos.yaml +0 -1
  763. package/schemas/octets/fetch.cos.yaml +0 -3
  764. package/schemas/octets/permute.cos.yaml +0 -1
  765. package/schemas/octets/store.cos.yaml +0 -3
  766. package/source/directives/octets/Fetch.ts +0 -100
  767. package/source/directives/octets/List.ts +0 -72
  768. package/source/directives/octets/Store.ts +0 -126
  769. package/source/directives/vary/Directive.ts +0 -7
  770. package/source/directives/vary/Embed.ts +0 -68
  771. package/source/directives/vary/Vary.ts +0 -50
  772. package/source/directives/vary/embeddings/Authority.ts +0 -8
  773. package/source/directives/vary/embeddings/Embedding.ts +0 -7
  774. package/source/directives/vary/embeddings/Header.ts +0 -32
  775. package/source/directives/vary/embeddings/Language.ts +0 -31
  776. package/source/directives/vary/embeddings/Parameter.ts +0 -14
  777. package/source/directives/vary/embeddings/index.ts +0 -13
  778. package/source/directives/vary/index.ts +0 -3
  779. package/transpiled/directives/octets/Fetch.js.map +0 -1
  780. package/transpiled/directives/octets/List.d.ts +0 -16
  781. package/transpiled/directives/octets/List.js +0 -74
  782. package/transpiled/directives/octets/List.js.map +0 -1
  783. package/transpiled/directives/octets/Store.js.map +0 -1
  784. package/transpiled/directives/vary/Directive.d.ts +0 -6
  785. package/transpiled/directives/vary/Directive.js.map +0 -1
  786. package/transpiled/directives/vary/Embed.d.ts +0 -11
  787. package/transpiled/directives/vary/Embed.js +0 -51
  788. package/transpiled/directives/vary/Embed.js.map +0 -1
  789. package/transpiled/directives/vary/Properties.js.map +0 -1
  790. package/transpiled/directives/vary/Vary.d.ts +0 -10
  791. package/transpiled/directives/vary/Vary.js +0 -36
  792. package/transpiled/directives/vary/Vary.js.map +0 -1
  793. package/transpiled/directives/vary/embeddings/Authority.d.ts +0 -5
  794. package/transpiled/directives/vary/embeddings/Authority.js +0 -10
  795. package/transpiled/directives/vary/embeddings/Authority.js.map +0 -1
  796. package/transpiled/directives/vary/embeddings/Embedding.d.ts +0 -6
  797. package/transpiled/directives/vary/embeddings/Embedding.js.map +0 -1
  798. package/transpiled/directives/vary/embeddings/Header.d.ts +0 -7
  799. package/transpiled/directives/vary/embeddings/Header.js +0 -28
  800. package/transpiled/directives/vary/embeddings/Header.js.map +0 -1
  801. package/transpiled/directives/vary/embeddings/Language.d.ts +0 -7
  802. package/transpiled/directives/vary/embeddings/Language.js +0 -28
  803. package/transpiled/directives/vary/embeddings/Language.js.map +0 -1
  804. package/transpiled/directives/vary/embeddings/Parameter.d.ts +0 -7
  805. package/transpiled/directives/vary/embeddings/Parameter.js +0 -14
  806. package/transpiled/directives/vary/embeddings/Parameter.js.map +0 -1
  807. package/transpiled/directives/vary/embeddings/index.d.ts +0 -5
  808. package/transpiled/directives/vary/embeddings/index.js +0 -14
  809. package/transpiled/directives/vary/embeddings/index.js.map +0 -1
  810. package/transpiled/directives/vary/index.d.ts +0 -2
  811. package/transpiled/directives/vary/index.js +0 -6
  812. package/transpiled/directives/vary/index.js.map +0 -1
  813. /package/components/{identity.federation/operations → identity.tokens/operations/lib}/types.js +0 -0
  814. /package/schemas/octets/{list.cos.yaml → get.cos.yaml} +0 -0
  815. /package/{components/identity.tokens/operations → transpiled/directives/flow}/types.js +0 -0
  816. /package/transpiled/directives/{vary → map}/Directive.js +0 -0
@@ -1,14 +1,20 @@
1
1
  import assert from 'node:assert'
2
2
  import { match } from 'matchacho'
3
+ import { console } from 'openspan'
4
+ import { minimatch } from 'minimatch'
3
5
  import * as http from '../../HTTP'
4
6
  import { Anonymous } from './Anonymous'
5
7
  import { Id } from './Id'
6
8
  import { Role } from './Role'
7
9
  import { Rule } from './Rule'
8
10
  import { Incept } from './Incept'
11
+ import { Assert } from './Assert'
9
12
  import { Echo } from './Echo'
10
13
  import { Scheme } from './Scheme'
11
14
  import { Delegate } from './Delegate'
15
+ import { Federation } from './Federation'
16
+ import { Anyone } from './Anyone'
17
+ import { Input, type Declaration } from './Input'
12
18
  import { split } from './split'
13
19
  import { PRIMARY, PROVIDERS } from './schemes'
14
20
  import type { Output } from '../../io'
@@ -22,7 +28,7 @@ import type {
22
28
  Discovery,
23
29
  Extension,
24
30
  Identity,
25
- Input,
31
+ Context,
26
32
  Remote,
27
33
  Schemes
28
34
  } from './types'
@@ -39,7 +45,7 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
39
45
 
40
46
  public create (name: string, value: any, remotes: Remotes): Directive {
41
47
  assert.ok(name in constructors,
42
- `Directive 'auth:${name}' is not implemented.`)
48
+ `Directive 'auth:${name}' is not implemented`)
43
49
 
44
50
  const Class = constructors[name]
45
51
 
@@ -49,36 +55,41 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
49
55
  return match(Class,
50
56
  Role, () => new Role(value as string | string[], this.discovery.roles),
51
57
  Rule, () => new Rule(value as Record<string, string>, this.create.bind(this)),
58
+ Input, () => new Input(value as Declaration[], this.create.bind(this)),
52
59
  Incept, () => new Incept(value as string, this.discovery),
60
+ Delegate, () => new Delegate(value as string, this.discovery.roles),
53
61
  () => new Class(value))
54
62
  }
55
63
 
56
64
  public async preflight (directives: Directive[],
57
- input: Input,
65
+ context: Context,
58
66
  parameters: Parameter[]): Promise<Output> {
59
- const identity = await this.resolve(input.authority, input.request.headers.authorization)
60
-
61
- input.identity = identity
67
+ context.identity = await this.resolve(context.authority, context.request.headers.authorization)
68
+ directives.sort((a, b) => (a.priority ?? 1) - (b.priority ?? 1))
62
69
 
63
70
  for (const directive of directives) {
64
- const allow = await directive.authorize(identity, input, parameters)
71
+ const allow = await directive.authorize(context.identity, context, parameters)
65
72
 
66
73
  if (allow)
67
- return directive.reply?.(identity) ?? null
74
+ if (this.permitted(context))
75
+ return directive.reply?.(context) ?? null
76
+ else
77
+ throw new http.Forbidden()
68
78
  }
69
79
 
70
- if (identity === null)
80
+ if (context.identity === null)
71
81
  throw new http.Unauthorized()
72
82
  else
73
83
  throw new http.Forbidden()
74
84
  }
75
85
 
76
86
  public async settle (directives: Directive[],
77
- request: Input,
87
+ context: Context,
78
88
  response: http.OutgoingMessage): Promise<void> {
79
- for (const directive of directives) await directive.settle?.(request, response)
89
+ await Promise.all(directives.map(async (directive) =>
90
+ directive.settle?.(context, response)))
80
91
 
81
- const identity = request.identity
92
+ const identity = context.identity
82
93
 
83
94
  if (identity === null)
84
95
  return
@@ -86,21 +97,22 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
86
97
  if (identity.scheme === PRIMARY && !identity.refresh)
87
98
  return
88
99
 
89
- // Role directive may have already set the value
90
- if (identity.roles === undefined)
91
- await Role.set(identity, this.discovery.roles)
100
+ if (await this.banned(identity))
101
+ throw new http.Unauthorized()
92
102
 
103
+ // Role directive may have already set the value
104
+ identity.roles ??= await Role.get(identity, this.discovery.roles)
93
105
  this.tokens ??= await this.discovery.tokens
94
106
 
95
107
  const token = await this.tokens.invoke<string>('encrypt', {
96
- input: { authority: request.authority, identity }
108
+ input: { authority: context.authority, identity }
97
109
  })
98
110
 
99
111
  const authorization = `Token ${token}`
100
112
 
101
113
  response.headers ??= new Headers()
102
114
  response.headers.set('authorization', authorization)
103
- response.headers.append('cache-control', 'no-store')
115
+ response.headers.set('cache-control', 'no-store')
104
116
  }
105
117
 
106
118
  private async resolve (authority: string, authorization: string | undefined): Promise<Identity | null> {
@@ -110,19 +122,27 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
110
122
  const [scheme, credentials] = split(authorization)
111
123
  const provider = PROVIDERS[scheme]
112
124
 
113
- if (!(provider in this.discovery))
114
- throw new http.Unauthorized(`Unknown authentication scheme '${scheme}'.`)
125
+ if (provider === undefined)
126
+ throw new http.Unauthorized(`Unknown authentication scheme '${scheme}'`)
115
127
 
116
128
  this.schemes[scheme] ??= await this.discovery[provider]
117
129
 
118
130
  const result = await this.schemes[scheme].invoke<AuthenticationResult>('authenticate', {
119
131
  input: {
132
+ scheme,
120
133
  authority,
121
134
  credentials
122
135
  }
123
136
  })
124
137
 
125
- if (result instanceof Error) return null
138
+ if (result instanceof Error) {
139
+ const code: string | unknown = (result as unknown as { code: string }).code
140
+
141
+ if (typeof code === 'string')
142
+ console.info('Authentication failed', { code })
143
+
144
+ return null
145
+ }
126
146
 
127
147
  const identity = result.identity
128
148
 
@@ -134,6 +154,18 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
134
154
  return identity
135
155
  }
136
156
 
157
+ private permitted (context: Context): boolean {
158
+ const permissions = context.identity?.permissions
159
+
160
+ if (permissions === undefined)
161
+ return true
162
+
163
+ return Object.entries(permissions).some(([pattern, methods]) => {
164
+ return methods.some((method) => method === '*' || method === context.request.method) &&
165
+ minimatch(context.request.url, pattern)
166
+ })
167
+ }
168
+
137
169
  private async banned (identity: Identity): Promise<boolean> {
138
170
  this.bans ??= await this.discovery.bans
139
171
 
@@ -145,13 +177,17 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
145
177
 
146
178
  const constructors: Record<string, new (value: any, argument?: any) => Directive> = {
147
179
  anonymous: Anonymous,
180
+ anyone: Anyone,
148
181
  id: Id,
149
182
  role: Role,
150
183
  rule: Rule,
151
184
  incept: Incept,
185
+ assert: Assert,
152
186
  scheme: Scheme,
153
187
  echo: Echo,
154
- delegate: Delegate
188
+ delegate: Delegate,
189
+ claims: Federation,
190
+ input: Input
155
191
  }
156
192
 
157
- const REMOTES: Remote[] = ['basic', 'federation', 'tokens', 'roles', 'bans']
193
+ const REMOTES: Remote[] = ['basic', 'federation', 'tokens', 'roles', 'bans', 'otp']
@@ -1,18 +1,22 @@
1
1
  import { BadRequest } from '../../HTTP'
2
- import { type Directive, type Identity } from './types'
3
- import type { Input } from '../../io'
2
+ import { Role } from './Role'
3
+ import type { Context, Directive, Identity } from './types'
4
+ import type { Component } from '@toa.io/core'
4
5
 
5
6
  export class Delegate implements Directive {
6
7
  private readonly property: string
8
+ private readonly discovery: Promise<Component>
7
9
 
8
- public constructor (property: string) {
10
+ public constructor (property: string, discovery: Promise<Component>) {
9
11
  this.property = property
12
+ this.discovery = discovery
10
13
  }
11
14
 
12
- public authorize (identity: Identity | null, context: Input): boolean {
15
+ public async authorize (identity: Identity | null, context: Context): Promise<boolean> {
13
16
  if (identity === null)
14
17
  return false
15
18
 
19
+ identity.roles ??= await Role.get(identity, this.discovery)
16
20
  context.pipelines.body.push((body) => this.embed(body, identity))
17
21
 
18
22
  return true
@@ -23,7 +27,7 @@ export class Delegate implements Directive {
23
27
  body = {}
24
28
 
25
29
  check(body)
26
- body[this.property] = identity
30
+ body[this.property] = structuredClone(identity)
27
31
 
28
32
  return body
29
33
  }
@@ -1,12 +1,22 @@
1
- import { type OutgoingMessage } from '../../HTTP'
2
- import { type Directive, type Identity } from './types'
1
+ import { create } from './create'
2
+ import type { OutgoingMessage } from '../../HTTP'
3
+ import type { Directive, Identity, Context } from './types'
3
4
 
4
5
  export class Echo implements Directive {
5
- public authorize (identity: Identity | null): boolean {
6
- return identity !== null
6
+ public authorize (identity: Identity | null, context: Context): boolean {
7
+ if (identity === null && 'authorization' in context.request.headers)
8
+ return false
9
+
10
+ context.identity ??= create()
11
+
12
+ return true
7
13
  }
8
14
 
9
- public reply (identity: Identity | null): OutgoingMessage {
10
- return { body: identity }
15
+ public reply (context: Context): OutgoingMessage {
16
+ const body = context.identity!
17
+
18
+ return body.scheme === null
19
+ ? { status: 201, body }
20
+ : { body }
11
21
  }
12
22
  }
@@ -0,0 +1,84 @@
1
+ import assert from 'node:assert'
2
+ import type { Directive, Identity, Context } from './types'
3
+ import type { Parameter } from '../../RTD'
4
+
5
+ export class Federation implements Directive {
6
+ private readonly matchers: Array<[keyof Claims, Matcher]>
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')
13
+ }
14
+
15
+ public authorize (identity: Identity | null, context: Context, parameters: Parameter[]): boolean {
16
+ if (identity === null || !('claims' in identity))
17
+ return false
18
+
19
+ const claims = (identity as FederatedIdentity).claims
20
+
21
+ for (const [key, match] of this.matchers)
22
+ if (!match(claims[key], context, parameters))
23
+ return false
24
+
25
+ return true
26
+ }
27
+ }
28
+
29
+ function toMatcher (expression: string): Matcher {
30
+ if (expression.startsWith(':')) {
31
+ const key = expression.slice(1) as 'authority'
32
+
33
+ if (key === 'authority')
34
+ return (value, context) => matches(value, context[key])
35
+
36
+ if (key === 'domain')
37
+ return (value, context) => {
38
+ return Array.isArray(value)
39
+ ? value.some((iss) => codomain(iss, context))
40
+ : codomain(value, context)
41
+ }
42
+
43
+ throw new Error('Unknown `auth:claims` syntax: ' + expression)
44
+ }
45
+
46
+ if (expression.startsWith('/:')) {
47
+ const name = expression.slice(2)
48
+
49
+ return (value, _, parameters) => parameters
50
+ .some((parameter) => parameter.name === name && matches(value, parameter.value))
51
+ }
52
+
53
+ return (value) => matches(value, expression)
54
+ }
55
+
56
+ function matches (value: string | string[], reference: string): boolean {
57
+ return Array.isArray(value)
58
+ ? value.includes(reference)
59
+ : value === reference
60
+ }
61
+
62
+ function codomain (iss: string, context: Context): boolean {
63
+ const hostname = new URL(iss).hostname
64
+ const dot = hostname.indexOf('.')
65
+ const basename = dot === -1 ? hostname : hostname.slice(dot)
66
+
67
+ return context.authority.slice(-basename.length) === basename
68
+ }
69
+
70
+ type Matcher = (value: string | string[], context: Context, parameters: Parameter[]) => boolean
71
+
72
+ interface Claims {
73
+ iss: string
74
+ sub: string
75
+ aud: string | string[]
76
+ }
77
+
78
+ interface Options extends Partial<Claims> {
79
+ iss: string
80
+ }
81
+
82
+ interface FederatedIdentity extends Identity {
83
+ claims: Claims
84
+ }
@@ -8,7 +8,7 @@ export class Id implements Directive {
8
8
  this.parameter = parameter
9
9
  }
10
10
 
11
- public authorize (identity: Identity | null, _: any, parameters: Parameter[]): boolean {
11
+ public authorize (identity: Identity | null, _: unknown, parameters: Parameter[]): boolean {
12
12
  if (identity === null)
13
13
  return false
14
14
 
@@ -1,48 +1,100 @@
1
- import { type Maybe } from '@toa.io/types'
1
+ import assert from 'node:assert'
2
+ import { console } from 'openspan'
2
3
  import * as http from '../../HTTP'
3
- import { type Directive, type Discovery, type Identity, type Input, type Schemes } from './types'
4
4
  import { split } from './split'
5
- import { PROVIDERS } from './schemes'
5
+ import { create } from './create'
6
+ import { PROVIDERS, INCEPTION } from './schemes'
7
+ import { Role } from './Role'
8
+ import type { Component } from '@toa.io/core'
9
+ import type { Maybe } from '@toa.io/types'
10
+ import type { Directive, Discovery, Identity, Context, Schemes, Ban } from './types'
6
11
 
7
12
  export class Incept implements Directive {
8
- private readonly property: string
9
- private readonly discovery: Discovery
10
- private readonly schemes: Schemes = {} as unknown as Schemes
13
+ private static readonly schemes: Schemes = {} as unknown as Schemes
14
+ private static discovery: Discovery
15
+ private static bans: Component | null = null
16
+
17
+ private readonly property: string | null
11
18
 
12
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')
22
+
13
23
  this.property = property
14
- this.discovery = discovery
24
+ Incept.discovery ??= discovery
15
25
  }
16
26
 
17
- public authorize (identity: Identity | null, input: Input): boolean {
18
- return identity === null && 'authorization' in input.request.headers
19
- }
27
+ public static async incept (context: Context, id: string): Promise<Identity> {
28
+ const [scheme, credentials] = split(context.request.headers.authorization!)
29
+ const provider = PROVIDERS[scheme]
20
30
 
21
- public async settle (input: Input, response: http.OutgoingMessage): Promise<void> {
22
- const id = response.body?.[this.property]
31
+ if (provider === undefined)
32
+ throw new http.BadRequest('Authentication scheme is not supported')
23
33
 
24
- if (id === undefined)
25
- throw new http.Conflict('Identity inception has failed as the response body ' +
26
- ` does not contain the '${this.property}' property.`)
34
+ if (!INCEPTION.includes(provider))
35
+ throw new http.Unauthorized()
27
36
 
28
- const [scheme, credentials] = split(input.request.headers.authorization!)
29
- const provider = PROVIDERS[scheme]
37
+ Incept.bans ??= await Incept.discovery.bans
38
+
39
+ const ban = await Incept.bans.invoke<Ban>('observe', { query: { id } })
30
40
 
31
- this.schemes[scheme] ??= await this.discovery[provider]
41
+ if (ban.banned)
42
+ throw new http.Unauthorized()
32
43
 
33
- const identity = await this.schemes[scheme]
34
- .invoke<Maybe<Identity>>('incept', {
44
+ Incept.schemes[scheme] ??= await Incept.discovery[provider]
45
+
46
+ const identity = await Incept.schemes[scheme].invoke<Maybe<Identity>>('incept', {
35
47
  input: {
36
- authority: input.authority,
48
+ scheme,
49
+ authority: context.authority,
37
50
  id,
38
51
  credentials
39
52
  }
40
53
  })
41
54
 
42
55
  if (identity instanceof Error)
43
- throw new http.Conflict(identity)
56
+ throw new http.UnprocessableEntity(identity)
57
+
58
+ identity.scheme = scheme
59
+ identity.roles = []
60
+
61
+ return identity
62
+ }
63
+
64
+ public authorize (identity: Identity | null): boolean {
65
+ return identity === null
66
+ }
67
+
68
+ public reply (context: Context): http.OutgoingMessage | null {
69
+ if (this.property !== null)
70
+ return null
71
+
72
+ const body = create(context.request.headers.authorization)
73
+
74
+ return { body }
75
+ }
76
+
77
+ public async settle (context: Context, response: http.OutgoingMessage): Promise<void> {
78
+ const id = response.body?.[this.property ?? 'id']
79
+
80
+ if (id === undefined) {
81
+ console.debug('Inception skipped: response does not contain expected property', {
82
+ property: this.property,
83
+ response
84
+ })
85
+
86
+ return
87
+ }
88
+
89
+ assert(typeof id === 'string', `Response body property "${this.property}" expected to be a string`)
90
+
91
+ if (context.request.headers.authorization !== undefined)
92
+ context.identity = await Incept.incept(context, id)
93
+ else {
94
+ const identity = { id, scheme: null, refresh: true }
95
+ const roles = await Role.get(identity, Incept.discovery.roles)
44
96
 
45
- input.identity = identity
46
- input.identity.scheme = scheme
97
+ context.identity = { ...identity, roles }
98
+ }
47
99
  }
48
100
  }
@@ -0,0 +1,71 @@
1
+ import { Forbidden } from '../../HTTP'
2
+ import type { Parameter } from '../../RTD'
3
+ import type { Context, Directive, Identity, Create } from './types'
4
+
5
+ export class Input implements Directive {
6
+ public priority = 0
7
+ private readonly statements: Statement[] = []
8
+
9
+ public constructor (declarations: Declaration[], create: Create) {
10
+ this.statements = declarations.map((declaration) => new Statement(declaration, create))
11
+ }
12
+
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
+
16
+ return false
17
+ }
18
+
19
+ // 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
30
+
31
+ return body
32
+ }
33
+ }
34
+
35
+ class Statement {
36
+ private readonly properties: string[]
37
+ private readonly directives: Directive[] = []
38
+
39
+ public constructor ({ prop, ...directives }: Declaration, create: Create) {
40
+ this.properties = typeof prop === 'string' ? [prop] : prop
41
+
42
+ for (const [name, value] of Object.entries(directives)) {
43
+ const directive = create(name, value)
44
+
45
+ this.directives.push(directive)
46
+ }
47
+ }
48
+
49
+ // eslint-disable-next-line max-params
50
+ public async check (identity: Identity | null, context: Context, parameters: Parameter[], body: Body): Promise<void> {
51
+ const match = this.properties.some((property) => property in body)
52
+
53
+ if (!match)
54
+ return
55
+
56
+ for (const directive of this.directives) {
57
+ const authorized = await directive.authorize(identity, context, parameters)
58
+
59
+ if (!authorized)
60
+ throw new Forbidden('Input property is not authorized')
61
+ }
62
+ }
63
+ }
64
+
65
+ export interface Declaration {
66
+ [key: Exclude<string, 'prop'>]: unknown
67
+
68
+ prop: string | string[]
69
+ }
70
+
71
+ type Body = Record<string, unknown>
@@ -31,7 +31,7 @@ it('should return false if not matched', async () => {
31
31
  expect(result).toBe(false)
32
32
 
33
33
  expect(remote.invoke)
34
- .toBeCalledWith('list', {
34
+ .toHaveBeenCalledWith('list', {
35
35
  query: {
36
36
  criteria: `identity==${identity.id}`,
37
37
  limit: 1024
@@ -93,8 +93,7 @@ it('should return false on mismatch with parameters', async () => {
93
93
  expect(result).toBe(false)
94
94
  })
95
95
 
96
- async function match
97
- (expected: string[], actual: string[], parameters: Parameter[] = []): Promise<boolean> {
96
+ async function match (expected: string[], actual: string[], parameters: Parameter[] = []): Promise<boolean> {
98
97
  const directive = new Role(expected, discovery)
99
98
 
100
99
  const identity: Identity = {
@@ -15,7 +15,7 @@ export class Role implements Directive {
15
15
  this.dynamic = this.roles.some((role) => role.includes('{'))
16
16
  }
17
17
 
18
- public static async set (identity: Identity, discovery: Promise<Component>): Promise<void> {
18
+ public static async get (identity: Identity, discovery: Promise<Component>): Promise<string[]> {
19
19
  this.remote ??= await discovery
20
20
 
21
21
  const query: Query = {
@@ -23,21 +23,16 @@ export class Role implements Directive {
23
23
  limit: 1024
24
24
  }
25
25
 
26
- identity.roles = await this.remote.invoke('list', { query })
26
+ return await this.remote.invoke('list', { query })
27
27
  }
28
28
 
29
- public async authorize
30
- (identity: Identity | null, _: unknown, parameters: Parameter[]): Promise<boolean> {
29
+ public async authorize (identity: Identity | null, _: unknown, parameters: Parameter[]): Promise<boolean> {
31
30
  if (identity === null)
32
31
  return false
33
32
 
34
- await Role.set(identity, this.discovery)
33
+ identity.roles ??= await Role.get(identity, this.discovery)
35
34
 
36
- if (identity.roles!.length === 0) // Role.set()
37
-
38
- return false
39
-
40
- return this.match(identity.roles!, parameters)
35
+ return this.match(identity.roles, parameters)
41
36
  }
42
37
 
43
38
  private match (roles: string[], parameters: Parameter[]): boolean {
@@ -58,7 +53,7 @@ export class Role implements Directive {
58
53
  const value = parameters.find((parameter) => parameter.name === key)?.value
59
54
 
60
55
  assert.ok(value !== undefined,
61
- `Role '${role}' requires '${key}' route parameter.`)
56
+ `Role '${role}' requires '${key}' route parameter`)
62
57
 
63
58
  return value
64
59
  }))
@@ -1,5 +1,5 @@
1
1
  import { type Parameter } from '../../RTD'
2
- import type { Input, Directive, Identity } from './types'
2
+ import type { Context, Directive, Identity, Create } from './types'
3
3
 
4
4
  export class Rule implements Directive {
5
5
  private readonly directives: Directive[] = []
@@ -12,10 +12,9 @@ export class Rule implements Directive {
12
12
  }
13
13
  }
14
14
 
15
- public async authorize
16
- (identity: Identity | null, input: Input, parameters: Parameter[]): Promise<boolean> {
15
+ public async authorize (identity: Identity | null, context: Context, parameters: Parameter[]): Promise<boolean> {
17
16
  for (const directive of this.directives) {
18
- const authorized = await directive.authorize(identity, input, parameters)
17
+ const authorized = await directive.authorize(identity, context, parameters)
19
18
 
20
19
  if (!authorized)
21
20
  return false
@@ -24,5 +23,3 @@ export class Rule implements Directive {
24
23
  return true
25
24
  }
26
25
  }
27
-
28
- type Create = (name: string, value: any, ...args: any[]) => Directive
@@ -1,5 +1,5 @@
1
1
  import * as http from '../../HTTP'
2
- import { type Directive, type Identity, type Input } from './types'
2
+ import { type Directive, type Identity, type Context } from './types'
3
3
  import { split } from './split'
4
4
 
5
5
  export class Scheme implements Directive {
@@ -11,15 +11,15 @@ export class Scheme implements Directive {
11
11
  this.Scheme = scheme[0].toUpperCase() + scheme.substring(1)
12
12
  }
13
13
 
14
- public authorize (_: Identity | null, input: Input): boolean {
15
- if (input.request.headers.authorization === undefined)
14
+ public authorize (_: Identity | null, context: Context): boolean {
15
+ if (context.request.headers.authorization === undefined)
16
16
  return false
17
17
 
18
- const [scheme] = split(input.request.headers.authorization)
18
+ const [scheme] = split(context.request.headers.authorization)
19
19
 
20
20
  if (scheme !== this.scheme)
21
21
  throw new http.Forbidden(this.Scheme +
22
- ' authentication scheme is required to access this resource.')
22
+ ' authentication scheme is required to access this resource')
23
23
 
24
24
  return false
25
25
  }
@@ -0,0 +1,11 @@
1
+ import { newid } from '@toa.io/generic'
2
+ import type { Identity } from './types'
3
+
4
+ export function create (credentials?: string): Identity {
5
+ return {
6
+ id: newid(),
7
+ scheme: credentials?.split(' ')[0] ?? null,
8
+ refresh: false,
9
+ roles: []
10
+ }
11
+ }