@toa.io/extensions.exposition 1.0.0-alpha.21 → 1.0.0-alpha.210

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