@toa.io/extensions.exposition 1.0.0-alpha.0 → 1.0.0-alpha.100

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 (700) hide show
  1. package/components/context.toa.yaml +12 -0
  2. package/components/identity.bans/manifest.toa.yaml +15 -6
  3. package/components/identity.bans/operations/transit.d.ts +14 -0
  4. package/components/identity.bans/operations/transit.js +11 -0
  5. package/components/identity.bans/operations/transit.js.map +1 -0
  6. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
  7. package/components/identity.bans/source/transit.ts +21 -0
  8. package/components/identity.bans/tsconfig.json +9 -0
  9. package/components/identity.basic/manifest.toa.yaml +21 -8
  10. package/components/identity.basic/operations/authenticate.d.ts +13 -0
  11. package/components/identity.basic/operations/authenticate.js +27 -0
  12. package/components/identity.basic/operations/authenticate.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 +12 -0
  17. package/components/identity.basic/operations/transit.js +55 -0
  18. package/components/identity.basic/operations/transit.js.map +1 -0
  19. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -0
  20. package/components/identity.basic/operations/types.d.ts +42 -0
  21. package/components/identity.basic/operations/types.js +3 -0
  22. package/components/identity.basic/operations/types.js.map +1 -0
  23. package/components/identity.basic/source/authenticate.ts +16 -6
  24. package/components/identity.basic/source/incept.ts +38 -0
  25. package/components/identity.basic/source/transit.ts +11 -9
  26. package/components/identity.basic/source/types.ts +8 -4
  27. package/components/identity.federation/events/principal.js +22 -0
  28. package/components/identity.federation/manifest.toa.yaml +119 -0
  29. package/components/identity.federation/operations/authenticate.d.ts +14 -0
  30. package/components/identity.federation/operations/authenticate.js +20 -0
  31. package/components/identity.federation/operations/authenticate.js.map +1 -0
  32. package/components/identity.federation/operations/incept.d.ts +11 -0
  33. package/components/identity.federation/operations/incept.js +14 -0
  34. package/components/identity.federation/operations/incept.js.map +1 -0
  35. package/components/identity.federation/operations/lib/assertions-as-values.d.ts +4 -0
  36. package/components/identity.federation/operations/lib/assertions-as-values.js +47 -0
  37. package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -0
  38. package/components/identity.federation/operations/lib/get.d.ts +1 -0
  39. package/components/identity.federation/operations/lib/get.js +64 -0
  40. package/components/identity.federation/operations/lib/get.js.map +1 -0
  41. package/components/identity.federation/operations/lib/jwt.d.ts +19 -0
  42. package/components/identity.federation/operations/lib/jwt.js +140 -0
  43. package/components/identity.federation/operations/lib/jwt.js.map +1 -0
  44. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -0
  45. package/components/identity.federation/operations/types/configuration.d.ts +15 -0
  46. package/components/identity.federation/operations/types/configuration.js +3 -0
  47. package/components/identity.federation/operations/types/configuration.js.map +1 -0
  48. package/components/identity.federation/operations/types/context.d.ts +49 -0
  49. package/components/identity.federation/operations/types/context.js +3 -0
  50. package/components/identity.federation/operations/types/context.js.map +1 -0
  51. package/components/identity.federation/operations/types/entity.d.ts +6 -0
  52. package/components/identity.federation/operations/types/entity.js +3 -0
  53. package/components/identity.federation/operations/types/entity.js.map +1 -0
  54. package/components/identity.federation/operations/types/index.d.ts +3 -0
  55. package/components/identity.federation/operations/types/index.js +20 -0
  56. package/components/identity.federation/operations/types/index.js.map +1 -0
  57. package/components/identity.federation/source/authenticate.ts +36 -0
  58. package/components/identity.federation/source/incept.ts +26 -0
  59. package/components/identity.federation/source/lib/assertions-as-values.ts +22 -0
  60. package/components/identity.federation/source/lib/get.ts +82 -0
  61. package/components/identity.federation/source/lib/jwt.test.ts +179 -0
  62. package/components/identity.federation/source/lib/jwt.ts +178 -0
  63. package/components/identity.federation/source/types/configuration.ts +16 -0
  64. package/components/identity.federation/source/types/context.ts +55 -0
  65. package/components/identity.federation/source/types/entity.ts +6 -0
  66. package/components/identity.federation/source/types/index.ts +3 -0
  67. package/components/identity.federation/tsconfig.json +10 -0
  68. package/components/identity.roles/manifest.toa.yaml +18 -5
  69. package/components/identity.roles/operations/grant.d.ts +10 -0
  70. package/components/identity.roles/operations/grant.js +21 -0
  71. package/components/identity.roles/operations/grant.js.map +1 -0
  72. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  73. package/components/identity.roles/operations/lib/Entity.js +3 -0
  74. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  75. package/components/identity.roles/operations/list.d.ts +2 -0
  76. package/components/identity.roles/operations/list.js +8 -0
  77. package/components/identity.roles/operations/list.js.map +1 -0
  78. package/components/identity.roles/operations/principal.d.ts +13 -0
  79. package/components/identity.roles/operations/principal.js +13 -0
  80. package/components/identity.roles/operations/principal.js.map +1 -0
  81. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -0
  82. package/components/identity.roles/source/grant.ts +32 -0
  83. package/components/identity.roles/source/lib/Entity.ts +5 -0
  84. package/components/identity.roles/source/list.ts +2 -4
  85. package/components/identity.roles/source/principal.ts +10 -8
  86. package/components/identity.tokens/manifest.toa.yaml +18 -4
  87. package/components/identity.tokens/operations/authenticate.d.ts +9 -0
  88. package/components/identity.tokens/operations/authenticate.js +39 -0
  89. package/components/identity.tokens/operations/authenticate.js.map +1 -0
  90. package/components/identity.tokens/operations/decrypt.d.ts +3 -0
  91. package/components/identity.tokens/operations/decrypt.js +33 -0
  92. package/components/identity.tokens/operations/decrypt.js.map +1 -0
  93. package/components/identity.tokens/operations/encrypt.d.ts +8 -0
  94. package/components/identity.tokens/operations/encrypt.js +26 -0
  95. package/components/identity.tokens/operations/encrypt.js.map +1 -0
  96. package/components/identity.tokens/operations/revoke.d.ts +2 -0
  97. package/components/identity.tokens/operations/revoke.js +8 -0
  98. package/components/identity.tokens/operations/revoke.js.map +1 -0
  99. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -0
  100. package/components/identity.tokens/operations/types.d.ts +46 -0
  101. package/components/identity.tokens/operations/types.js +3 -0
  102. package/components/identity.tokens/operations/types.js.map +1 -0
  103. package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
  104. package/components/identity.tokens/source/authenticate.test.ts +11 -4
  105. package/components/identity.tokens/source/authenticate.ts +14 -6
  106. package/components/identity.tokens/source/decrypt.test.ts +5 -3
  107. package/components/identity.tokens/source/decrypt.ts +9 -8
  108. package/components/identity.tokens/source/encrypt.test.ts +26 -2
  109. package/components/identity.tokens/source/encrypt.ts +5 -1
  110. package/components/identity.tokens/source/types.ts +9 -2
  111. package/components/octets.storage/manifest.toa.yaml +10 -10
  112. package/components/octets.storage/operations/get.js +3 -3
  113. package/components/octets.storage/operations/head.js +7 -0
  114. package/components/octets.storage/operations/put.js +132 -0
  115. package/cucumber.js +0 -1
  116. package/documentation/access.md +80 -38
  117. package/documentation/authorities.md +48 -0
  118. package/documentation/cache.md +8 -1
  119. package/documentation/components.md +93 -24
  120. package/documentation/flow.md +44 -0
  121. package/documentation/identity.md +34 -23
  122. package/documentation/introspection.md +82 -0
  123. package/documentation/io.md +56 -0
  124. package/documentation/map.md +73 -0
  125. package/documentation/octets.md +162 -65
  126. package/documentation/protocol.md +34 -4
  127. package/documentation/query.md +79 -9
  128. package/documentation/require.md +15 -0
  129. package/documentation/tree.md +35 -4
  130. package/features/access.feature +141 -49
  131. package/features/annotation.feature +2 -0
  132. package/features/auth.claims.feature +170 -0
  133. package/features/authorities.basic.feature +141 -0
  134. package/features/authorities.feature +32 -0
  135. package/features/authorities.federation.feature +100 -0
  136. package/features/authorities.tokens.feature +117 -0
  137. package/features/body.feature +5 -1
  138. package/features/cache.feature +112 -5
  139. package/features/cors.feature +78 -0
  140. package/features/debug.feature +34 -0
  141. package/features/directives.feature +5 -0
  142. package/features/dynamic.feature +62 -7
  143. package/features/errors.feature +36 -10
  144. package/features/etag.feature +205 -0
  145. package/features/flow.feature +96 -0
  146. package/features/identity.bans.feature +137 -0
  147. package/features/identity.basic.feature +146 -21
  148. package/features/identity.feature +37 -9
  149. package/features/identity.federation.feature +268 -0
  150. package/features/identity.roles.feature +251 -7
  151. package/features/identity.tokens.feature +57 -4
  152. package/features/introspection.feature +153 -0
  153. package/features/io.feature +204 -0
  154. package/features/map.feature +241 -0
  155. package/features/methods.feature +47 -0
  156. package/features/octets.cloudinary.feature +68 -0
  157. package/features/octets.download.feature +189 -0
  158. package/features/octets.entries.feature +81 -0
  159. package/features/octets.feature +85 -133
  160. package/features/octets.head.feature +40 -0
  161. package/features/octets.meta.feature +116 -0
  162. package/features/octets.workflows.feature +391 -34
  163. package/features/probes.feature +14 -0
  164. package/features/{queries.feature → query.feature} +86 -3
  165. package/features/realtime.feature +34 -0
  166. package/features/require.feature +67 -0
  167. package/features/response.feature +103 -0
  168. package/features/routes.feature +145 -10
  169. package/features/server.feature +21 -0
  170. package/features/steps/.env.example +3 -0
  171. package/features/steps/Captures.ts +6 -0
  172. package/features/steps/Components.ts +18 -6
  173. package/features/steps/Database.ts +17 -10
  174. package/features/steps/Gateway.ts +25 -6
  175. package/features/steps/HTTP.ts +40 -87
  176. package/features/steps/IdP.ts +155 -0
  177. package/features/steps/Parameters.ts +51 -2
  178. package/features/steps/Realtime.ts +151 -0
  179. package/features/steps/Workspace.ts +5 -7
  180. package/features/steps/components/echo/manifest.toa.yaml +14 -0
  181. package/features/steps/components/echo/operations/error.js +11 -0
  182. package/features/steps/components/echo/operations/identity.js +7 -0
  183. package/features/steps/components/echo/operations/parameters.js +7 -0
  184. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  185. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  186. package/features/steps/components/greeter/manifest.toa.yaml +1 -0
  187. package/features/steps/components/octets.tester/manifest.toa.yaml +26 -2
  188. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  189. package/features/steps/components/octets.tester/operations/bar.js +0 -1
  190. package/features/steps/components/octets.tester/operations/baz.js +0 -2
  191. package/features/steps/components/octets.tester/operations/concat.js +7 -0
  192. package/features/steps/components/octets.tester/operations/echo.js +7 -0
  193. package/features/steps/components/octets.tester/operations/foo.js +1 -2
  194. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  195. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  196. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  197. package/features/steps/components/pots/manifest.toa.yaml +26 -6
  198. package/features/steps/components/sequences/manifest.toa.yaml +1 -0
  199. package/features/steps/components/users/manifest.toa.yaml +3 -0
  200. package/features/steps/components/users.properties/manifest.toa.yaml +14 -0
  201. package/features/steps/tsconfig.json +1 -1
  202. package/features/streams.feature +5 -0
  203. package/features/timing.feature +69 -0
  204. package/package.json +25 -20
  205. package/readme.md +19 -13
  206. package/schemas/annotation.cos.yaml +2 -1
  207. package/schemas/io/input.cos.yaml +3 -0
  208. package/schemas/io/message.cos.yaml +5 -0
  209. package/schemas/io/output.cos.yaml +5 -0
  210. package/schemas/method.cos.yaml +1 -1
  211. package/schemas/node.cos.yaml +2 -0
  212. package/schemas/octets/delete.cos.yaml +2 -1
  213. package/schemas/octets/{fetch.cos.yaml → get.cos.yaml} +0 -1
  214. package/schemas/octets/put.cos.yaml +25 -0
  215. package/schemas/octets/workflow.cos.yaml +12 -0
  216. package/schemas/query.cos.yaml +4 -10
  217. package/schemas/querystring.cos.yaml +1 -0
  218. package/source/Annotation.ts +3 -2
  219. package/source/Branch.ts +1 -0
  220. package/source/Composition.ts +0 -6
  221. package/source/Context.ts +7 -4
  222. package/source/Directive.test.ts +14 -8
  223. package/source/Directive.ts +30 -52
  224. package/source/Endpoint.ts +105 -16
  225. package/source/Factory.ts +37 -17
  226. package/source/Gateway.ts +94 -42
  227. package/source/HTTP/Context.ts +90 -0
  228. package/source/HTTP/Server.ts +115 -92
  229. package/source/HTTP/Timing.ts +40 -0
  230. package/source/HTTP/exceptions.ts +13 -1
  231. package/source/HTTP/formats/index.ts +3 -3
  232. package/source/HTTP/formats/msgpack.ts +9 -6
  233. package/source/HTTP/formats/text.ts +1 -1
  234. package/source/HTTP/formats/yaml.ts +1 -1
  235. package/source/HTTP/index.ts +1 -0
  236. package/source/HTTP/messages.test.ts +71 -9
  237. package/source/HTTP/messages.ts +66 -46
  238. package/source/Interception.ts +24 -0
  239. package/source/Introspection.ts +11 -0
  240. package/source/Mapping.ts +69 -23
  241. package/source/Query.test.ts +3 -3
  242. package/source/Query.ts +123 -33
  243. package/source/RTD/Context.ts +8 -11
  244. package/source/RTD/Directives.ts +28 -4
  245. package/source/RTD/Endpoint.ts +9 -4
  246. package/source/RTD/Match.ts +2 -7
  247. package/source/RTD/Method.ts +23 -13
  248. package/source/RTD/Node.ts +37 -22
  249. package/source/RTD/Route.ts +5 -4
  250. package/source/RTD/Tree.ts +20 -16
  251. package/source/RTD/factory.ts +7 -7
  252. package/source/RTD/syntax/parse.test.ts +1 -1
  253. package/source/RTD/syntax/parse.ts +41 -28
  254. package/source/RTD/syntax/types.ts +6 -4
  255. package/source/Remotes.ts +7 -6
  256. package/source/Tenant.ts +6 -20
  257. package/source/deployment.ts +35 -20
  258. package/source/directives/auth/Anonymous.ts +3 -2
  259. package/source/directives/auth/Anyone.ts +13 -0
  260. package/source/directives/auth/Authorization.ts +170 -0
  261. package/source/directives/auth/Delegate.ts +42 -0
  262. package/source/directives/auth/Echo.ts +19 -5
  263. package/source/directives/auth/Federation.ts +84 -0
  264. package/source/directives/auth/Incept.ts +14 -8
  265. package/source/directives/auth/Role.test.ts +53 -6
  266. package/source/directives/auth/Role.ts +27 -17
  267. package/source/directives/auth/Rule.ts +2 -2
  268. package/source/directives/auth/Scheme.ts +3 -3
  269. package/source/directives/auth/index.ts +2 -2
  270. package/source/directives/auth/schemes.ts +2 -1
  271. package/source/directives/auth/split.ts +1 -1
  272. package/source/directives/auth/types.ts +10 -7
  273. package/source/directives/cache/Cache.ts +42 -0
  274. package/source/directives/cache/Control.ts +47 -21
  275. package/source/directives/cache/index.ts +2 -2
  276. package/source/directives/cache/types.ts +2 -2
  277. package/source/directives/cors/CORS.ts +63 -0
  278. package/source/directives/cors/index.ts +3 -0
  279. package/source/directives/dev/{Family.ts → Development.ts} +5 -6
  280. package/source/directives/dev/Stub.ts +4 -4
  281. package/source/directives/dev/Throw.ts +4 -4
  282. package/source/directives/dev/index.ts +2 -2
  283. package/source/directives/dev/types.ts +1 -1
  284. package/source/directives/flow/Compose.ts +68 -0
  285. package/source/directives/flow/Fetch.ts +86 -0
  286. package/source/directives/flow/Flow.ts +42 -0
  287. package/source/directives/flow/index.ts +3 -0
  288. package/source/directives/flow/types.ts +7 -0
  289. package/source/directives/index.ts +13 -6
  290. package/source/directives/io/Directive.ts +11 -0
  291. package/source/directives/io/IO.ts +43 -0
  292. package/source/directives/io/Input.ts +50 -0
  293. package/source/directives/io/Message.ts +1 -0
  294. package/source/directives/io/Output.ts +70 -0
  295. package/source/directives/io/index.ts +3 -0
  296. package/source/directives/io/schemas.ts +12 -0
  297. package/source/directives/map/Authority.ts +15 -0
  298. package/source/directives/map/Claims.ts +37 -0
  299. package/source/directives/map/Directive.ts +4 -0
  300. package/source/directives/map/Headers.ts +38 -0
  301. package/source/directives/map/Language.ts +42 -0
  302. package/source/directives/map/Languages.ts +11 -0
  303. package/source/directives/map/Map.ts +56 -0
  304. package/source/directives/map/Mapping.ts +13 -0
  305. package/source/directives/map/Properties.ts +15 -0
  306. package/source/directives/map/Segments.ts +26 -0
  307. package/source/directives/map/index.ts +3 -0
  308. package/source/directives/octets/Context.ts +9 -7
  309. package/source/directives/octets/Delete.ts +65 -12
  310. package/source/directives/octets/Directive.ts +10 -0
  311. package/source/directives/octets/Get.ts +86 -0
  312. package/source/directives/octets/{Family.ts → Octets.ts} +22 -20
  313. package/source/directives/octets/Put.ts +142 -0
  314. package/source/directives/octets/Workflow.ts +48 -0
  315. package/source/directives/octets/bytes.test.ts +30 -0
  316. package/source/directives/octets/bytes.ts +18 -0
  317. package/source/directives/octets/index.ts +2 -2
  318. package/source/directives/octets/schemas.test.ts +21 -0
  319. package/source/directives/octets/schemas.ts +9 -6
  320. package/source/directives/octets/types.ts +2 -8
  321. package/source/directives/octets/workflows/Execution.ts +128 -0
  322. package/source/directives/octets/workflows/Workflow.ts +37 -0
  323. package/source/directives/octets/workflows/index.ts +1 -0
  324. package/source/directives/require/Directive.ts +5 -0
  325. package/source/directives/require/Headers.ts +20 -0
  326. package/source/directives/require/Require.ts +28 -0
  327. package/source/directives/require/index.ts +3 -0
  328. package/source/exceptions.ts +23 -11
  329. package/source/io.ts +4 -0
  330. package/source/manifest.test.ts +6 -14
  331. package/source/manifest.ts +18 -16
  332. package/source/root.ts +5 -0
  333. package/source/schemas.ts +7 -3
  334. package/transpiled/Annotation.d.ts +8 -0
  335. package/transpiled/Annotation.js +3 -0
  336. package/transpiled/Annotation.js.map +1 -0
  337. package/transpiled/Branch.d.ts +8 -0
  338. package/transpiled/Branch.js +3 -0
  339. package/transpiled/Branch.js.map +1 -0
  340. package/transpiled/Composition.d.ts +13 -0
  341. package/transpiled/Composition.js +39 -0
  342. package/transpiled/Composition.js.map +1 -0
  343. package/transpiled/Context.d.ts +8 -0
  344. package/transpiled/Context.js +3 -0
  345. package/transpiled/Context.js.map +1 -0
  346. package/transpiled/Directive.d.ts +18 -0
  347. package/transpiled/Directive.js +77 -0
  348. package/transpiled/Directive.js.map +1 -0
  349. package/transpiled/Endpoint.d.ts +24 -0
  350. package/transpiled/Endpoint.js +131 -0
  351. package/transpiled/Endpoint.js.map +1 -0
  352. package/transpiled/Factory.d.ts +10 -0
  353. package/transpiled/Factory.js +81 -0
  354. package/transpiled/Factory.js.map +1 -0
  355. package/transpiled/Gateway.d.ts +21 -0
  356. package/transpiled/Gateway.js +132 -0
  357. package/transpiled/Gateway.js.map +1 -0
  358. package/transpiled/HTTP/Context.d.ts +31 -0
  359. package/transpiled/HTTP/Context.js +61 -0
  360. package/transpiled/HTTP/Context.js.map +1 -0
  361. package/transpiled/HTTP/Server.d.ts +36 -0
  362. package/transpiled/HTTP/Server.js +148 -0
  363. package/transpiled/HTTP/Server.js.map +1 -0
  364. package/transpiled/HTTP/Timing.d.ts +10 -0
  365. package/transpiled/HTTP/Timing.js +29 -0
  366. package/transpiled/HTTP/Timing.js.map +1 -0
  367. package/transpiled/HTTP/exceptions.d.ts +40 -0
  368. package/transpiled/HTTP/exceptions.js +83 -0
  369. package/transpiled/HTTP/exceptions.js.map +1 -0
  370. package/transpiled/HTTP/formats/index.d.ts +10 -0
  371. package/transpiled/HTTP/formats/index.js +38 -0
  372. package/transpiled/HTTP/formats/index.js.map +1 -0
  373. package/transpiled/HTTP/formats/json.d.ts +6 -0
  374. package/transpiled/HTTP/formats/json.js +17 -0
  375. package/transpiled/HTTP/formats/json.js.map +1 -0
  376. package/transpiled/HTTP/formats/msgpack.d.ts +6 -0
  377. package/transpiled/HTTP/formats/msgpack.js +17 -0
  378. package/transpiled/HTTP/formats/msgpack.js.map +1 -0
  379. package/transpiled/HTTP/formats/text.d.ts +8 -0
  380. package/transpiled/HTTP/formats/text.js +15 -0
  381. package/transpiled/HTTP/formats/text.js.map +1 -0
  382. package/transpiled/HTTP/formats/yaml.d.ts +6 -0
  383. package/transpiled/HTTP/formats/yaml.js +41 -0
  384. package/transpiled/HTTP/formats/yaml.js.map +1 -0
  385. package/transpiled/HTTP/index.d.ts +4 -0
  386. package/transpiled/HTTP/index.js +21 -0
  387. package/transpiled/HTTP/index.js.map +1 -0
  388. package/transpiled/HTTP/messages.d.ts +20 -0
  389. package/transpiled/HTTP/messages.js +96 -0
  390. package/transpiled/HTTP/messages.js.map +1 -0
  391. package/transpiled/Interception.d.ts +9 -0
  392. package/transpiled/Interception.js +19 -0
  393. package/transpiled/Interception.js.map +1 -0
  394. package/transpiled/Introspection.d.ts +9 -0
  395. package/transpiled/Introspection.js +3 -0
  396. package/transpiled/Introspection.js.map +1 -0
  397. package/transpiled/Mapping.d.ts +17 -0
  398. package/transpiled/Mapping.js +69 -0
  399. package/transpiled/Mapping.js.map +1 -0
  400. package/transpiled/Query.d.ts +22 -0
  401. package/transpiled/Query.js +164 -0
  402. package/transpiled/Query.js.map +1 -0
  403. package/transpiled/RTD/Context.d.ts +12 -0
  404. package/transpiled/RTD/Context.js +3 -0
  405. package/transpiled/RTD/Context.js.map +1 -0
  406. package/transpiled/RTD/Directives.d.ts +22 -0
  407. package/transpiled/RTD/Directives.js +3 -0
  408. package/transpiled/RTD/Directives.js.map +1 -0
  409. package/transpiled/RTD/Endpoint.d.ts +12 -0
  410. package/transpiled/RTD/Endpoint.js +3 -0
  411. package/transpiled/RTD/Endpoint.js.map +1 -0
  412. package/transpiled/RTD/Match.d.ts +9 -0
  413. package/transpiled/RTD/Match.js +3 -0
  414. package/transpiled/RTD/Match.js.map +1 -0
  415. package/transpiled/RTD/Method.d.ts +13 -0
  416. package/transpiled/RTD/Method.js +27 -0
  417. package/transpiled/RTD/Method.js.map +1 -0
  418. package/transpiled/RTD/Node.d.ts +22 -0
  419. package/transpiled/RTD/Node.js +73 -0
  420. package/transpiled/RTD/Node.js.map +1 -0
  421. package/transpiled/RTD/Route.d.ts +14 -0
  422. package/transpiled/RTD/Route.js +48 -0
  423. package/transpiled/RTD/Route.js.map +1 -0
  424. package/transpiled/RTD/Tree.d.ts +14 -0
  425. package/transpiled/RTD/Tree.js +45 -0
  426. package/transpiled/RTD/Tree.js.map +1 -0
  427. package/transpiled/RTD/factory.d.ts +4 -0
  428. package/transpiled/RTD/factory.js +39 -0
  429. package/transpiled/RTD/factory.js.map +1 -0
  430. package/transpiled/RTD/index.d.ts +8 -0
  431. package/transpiled/RTD/index.js +38 -0
  432. package/transpiled/RTD/index.js.map +1 -0
  433. package/transpiled/RTD/segment.d.ts +8 -0
  434. package/transpiled/RTD/segment.js +25 -0
  435. package/transpiled/RTD/segment.js.map +1 -0
  436. package/transpiled/RTD/syntax/index.d.ts +2 -0
  437. package/transpiled/RTD/syntax/index.js +19 -0
  438. package/transpiled/RTD/syntax/index.js.map +1 -0
  439. package/transpiled/RTD/syntax/parse.d.ts +4 -0
  440. package/transpiled/RTD/syntax/parse.js +140 -0
  441. package/transpiled/RTD/syntax/parse.js.map +1 -0
  442. package/transpiled/RTD/syntax/types.d.ts +43 -0
  443. package/transpiled/RTD/syntax/types.js +5 -0
  444. package/transpiled/RTD/syntax/types.js.map +1 -0
  445. package/transpiled/Remotes.d.ts +9 -0
  446. package/transpiled/Remotes.js +26 -0
  447. package/transpiled/Remotes.js.map +1 -0
  448. package/transpiled/Tenant.d.ts +13 -0
  449. package/transpiled/Tenant.js +23 -0
  450. package/transpiled/Tenant.js.map +1 -0
  451. package/transpiled/deployment.d.ts +3 -0
  452. package/transpiled/deployment.js +79 -0
  453. package/transpiled/deployment.js.map +1 -0
  454. package/transpiled/directives/auth/Anonymous.d.ts +6 -0
  455. package/transpiled/directives/auth/Anonymous.js +16 -0
  456. package/transpiled/directives/auth/Anonymous.js.map +1 -0
  457. package/transpiled/directives/auth/Anyone.d.ts +6 -0
  458. package/transpiled/directives/auth/Anyone.js +14 -0
  459. package/transpiled/directives/auth/Anyone.js.map +1 -0
  460. package/transpiled/directives/auth/Authorization.d.ts +19 -0
  461. package/transpiled/directives/auth/Authorization.js +141 -0
  462. package/transpiled/directives/auth/Authorization.js.map +1 -0
  463. package/transpiled/directives/auth/Delegate.d.ts +10 -0
  464. package/transpiled/directives/auth/Delegate.js +34 -0
  465. package/transpiled/directives/auth/Delegate.js.map +1 -0
  466. package/transpiled/directives/auth/Echo.d.ts +7 -0
  467. package/transpiled/directives/auth/Echo.js +23 -0
  468. package/transpiled/directives/auth/Echo.js.map +1 -0
  469. package/transpiled/directives/auth/Federation.d.ts +16 -0
  470. package/transpiled/directives/auth/Federation.js +57 -0
  471. package/transpiled/directives/auth/Federation.js.map +1 -0
  472. package/transpiled/directives/auth/Id.d.ts +7 -0
  473. package/transpiled/directives/auth/Id.js +17 -0
  474. package/transpiled/directives/auth/Id.js.map +1 -0
  475. package/transpiled/directives/auth/Incept.d.ts +10 -0
  476. package/transpiled/directives/auth/Incept.js +64 -0
  477. package/transpiled/directives/auth/Incept.js.map +1 -0
  478. package/transpiled/directives/auth/Role.d.ts +14 -0
  479. package/transpiled/directives/auth/Role.js +52 -0
  480. package/transpiled/directives/auth/Role.js.map +1 -0
  481. package/transpiled/directives/auth/Rule.d.ts +9 -0
  482. package/transpiled/directives/auth/Rule.js +22 -0
  483. package/transpiled/directives/auth/Rule.js.map +1 -0
  484. package/transpiled/directives/auth/Scheme.d.ts +7 -0
  485. package/transpiled/directives/auth/Scheme.js +47 -0
  486. package/transpiled/directives/auth/Scheme.js.map +1 -0
  487. package/transpiled/directives/auth/index.d.ts +2 -0
  488. package/transpiled/directives/auth/index.js +6 -0
  489. package/transpiled/directives/auth/index.js.map +1 -0
  490. package/transpiled/directives/auth/schemes.d.ts +3 -0
  491. package/transpiled/directives/auth/schemes.js +10 -0
  492. package/transpiled/directives/auth/schemes.js.map +1 -0
  493. package/transpiled/directives/auth/split.d.ts +2 -0
  494. package/transpiled/directives/auth/split.js +38 -0
  495. package/transpiled/directives/auth/split.js.map +1 -0
  496. package/transpiled/directives/auth/types.d.ts +31 -0
  497. package/transpiled/directives/auth/types.js +3 -0
  498. package/transpiled/directives/auth/types.js.map +1 -0
  499. package/transpiled/directives/cache/Cache.d.ts +11 -0
  500. package/transpiled/directives/cache/Cache.js +34 -0
  501. package/transpiled/directives/cache/Cache.js.map +1 -0
  502. package/transpiled/directives/cache/Control.d.ts +10 -0
  503. package/transpiled/directives/cache/Control.js +59 -0
  504. package/transpiled/directives/cache/Control.js.map +1 -0
  505. package/transpiled/directives/cache/Exact.d.ts +4 -0
  506. package/transpiled/directives/cache/Exact.js +11 -0
  507. package/transpiled/directives/cache/Exact.js.map +1 -0
  508. package/transpiled/directives/cache/index.d.ts +2 -0
  509. package/transpiled/directives/cache/index.js +6 -0
  510. package/transpiled/directives/cache/index.js.map +1 -0
  511. package/transpiled/directives/cache/types.d.ts +7 -0
  512. package/transpiled/directives/cache/types.js +3 -0
  513. package/transpiled/directives/cache/types.js.map +1 -0
  514. package/transpiled/directives/cors/CORS.d.ts +10 -0
  515. package/transpiled/directives/cors/CORS.js +52 -0
  516. package/transpiled/directives/cors/CORS.js.map +1 -0
  517. package/transpiled/directives/cors/index.d.ts +2 -0
  518. package/transpiled/directives/cors/index.js +6 -0
  519. package/transpiled/directives/cors/index.js.map +1 -0
  520. package/transpiled/directives/dev/Development.d.ts +9 -0
  521. package/transpiled/directives/dev/Development.js +29 -0
  522. package/transpiled/directives/dev/Development.js.map +1 -0
  523. package/transpiled/directives/dev/Stub.d.ts +7 -0
  524. package/transpiled/directives/dev/Stub.js +14 -0
  525. package/transpiled/directives/dev/Stub.js.map +1 -0
  526. package/transpiled/directives/dev/Throw.d.ts +7 -0
  527. package/transpiled/directives/dev/Throw.js +14 -0
  528. package/transpiled/directives/dev/Throw.js.map +1 -0
  529. package/transpiled/directives/dev/index.d.ts +2 -0
  530. package/transpiled/directives/dev/index.js +6 -0
  531. package/transpiled/directives/dev/index.js.map +1 -0
  532. package/transpiled/directives/dev/types.d.ts +4 -0
  533. package/transpiled/directives/dev/types.js +3 -0
  534. package/transpiled/directives/dev/types.js.map +1 -0
  535. package/transpiled/directives/flow/Compose.d.ts +8 -0
  536. package/transpiled/directives/flow/Compose.js +74 -0
  537. package/transpiled/directives/flow/Compose.js.map +1 -0
  538. package/transpiled/directives/flow/Fetch.d.ts +12 -0
  539. package/transpiled/directives/flow/Fetch.js +58 -0
  540. package/transpiled/directives/flow/Fetch.js.map +1 -0
  541. package/transpiled/directives/flow/Flow.d.ts +10 -0
  542. package/transpiled/directives/flow/Flow.js +33 -0
  543. package/transpiled/directives/flow/Flow.js.map +1 -0
  544. package/transpiled/directives/flow/index.d.ts +2 -0
  545. package/transpiled/directives/flow/index.js +6 -0
  546. package/transpiled/directives/flow/index.js.map +1 -0
  547. package/transpiled/directives/flow/types.d.ts +6 -0
  548. package/transpiled/directives/flow/types.js +3 -0
  549. package/transpiled/directives/flow/types.js.map +1 -0
  550. package/transpiled/directives/index.d.ts +4 -0
  551. package/transpiled/directives/index.js +15 -0
  552. package/transpiled/directives/index.js.map +1 -0
  553. package/transpiled/directives/io/Directive.d.ts +8 -0
  554. package/transpiled/directives/io/Directive.js +3 -0
  555. package/transpiled/directives/io/Directive.js.map +1 -0
  556. package/transpiled/directives/io/IO.d.ts +9 -0
  557. package/transpiled/directives/io/IO.js +33 -0
  558. package/transpiled/directives/io/IO.js.map +1 -0
  559. package/transpiled/directives/io/Input.d.ts +11 -0
  560. package/transpiled/directives/io/Input.js +63 -0
  561. package/transpiled/directives/io/Input.js.map +1 -0
  562. package/transpiled/directives/io/Message.d.ts +1 -0
  563. package/transpiled/directives/io/Message.js +3 -0
  564. package/transpiled/directives/io/Message.js.map +1 -0
  565. package/transpiled/directives/io/Output.d.ts +13 -0
  566. package/transpiled/directives/io/Output.js +76 -0
  567. package/transpiled/directives/io/Output.js.map +1 -0
  568. package/transpiled/directives/io/index.d.ts +2 -0
  569. package/transpiled/directives/io/index.js +6 -0
  570. package/transpiled/directives/io/index.js.map +1 -0
  571. package/transpiled/directives/io/schemas.d.ts +7 -0
  572. package/transpiled/directives/io/schemas.js +14 -0
  573. package/transpiled/directives/io/schemas.js.map +1 -0
  574. package/transpiled/directives/map/Authority.d.ts +6 -0
  575. package/transpiled/directives/map/Authority.js +19 -0
  576. package/transpiled/directives/map/Authority.js.map +1 -0
  577. package/transpiled/directives/map/Claims.d.ts +6 -0
  578. package/transpiled/directives/map/Claims.js +29 -0
  579. package/transpiled/directives/map/Claims.js.map +1 -0
  580. package/transpiled/directives/map/Directive.d.ts +3 -0
  581. package/transpiled/directives/map/Directive.js +3 -0
  582. package/transpiled/directives/map/Directive.js.map +1 -0
  583. package/transpiled/directives/map/Headers.d.ts +7 -0
  584. package/transpiled/directives/map/Headers.js +34 -0
  585. package/transpiled/directives/map/Headers.js.map +1 -0
  586. package/transpiled/directives/map/Language.d.ts +10 -0
  587. package/transpiled/directives/map/Language.js +38 -0
  588. package/transpiled/directives/map/Language.js.map +1 -0
  589. package/transpiled/directives/map/Languages.d.ts +4 -0
  590. package/transpiled/directives/map/Languages.js +17 -0
  591. package/transpiled/directives/map/Languages.js.map +1 -0
  592. package/transpiled/directives/map/Map.d.ts +11 -0
  593. package/transpiled/directives/map/Map.js +44 -0
  594. package/transpiled/directives/map/Map.js.map +1 -0
  595. package/transpiled/directives/map/Mapping.d.ts +8 -0
  596. package/transpiled/directives/map/Mapping.js +11 -0
  597. package/transpiled/directives/map/Mapping.js.map +1 -0
  598. package/transpiled/directives/map/Properties.d.ts +9 -0
  599. package/transpiled/directives/map/Properties.js +14 -0
  600. package/transpiled/directives/map/Properties.js.map +1 -0
  601. package/transpiled/directives/map/Segments.d.ts +6 -0
  602. package/transpiled/directives/map/Segments.js +25 -0
  603. package/transpiled/directives/map/Segments.js.map +1 -0
  604. package/transpiled/directives/map/index.d.ts +2 -0
  605. package/transpiled/directives/map/index.js +6 -0
  606. package/transpiled/directives/map/index.js.map +1 -0
  607. package/transpiled/directives/octets/Context.d.ts +8 -0
  608. package/transpiled/directives/octets/Context.js +22 -0
  609. package/transpiled/directives/octets/Context.js.map +1 -0
  610. package/transpiled/directives/octets/Delete.d.ts +20 -0
  611. package/transpiled/directives/octets/Delete.js +84 -0
  612. package/transpiled/directives/octets/Delete.js.map +1 -0
  613. package/transpiled/directives/octets/Directive.d.ts +8 -0
  614. package/transpiled/directives/octets/Directive.js +8 -0
  615. package/transpiled/directives/octets/Directive.js.map +1 -0
  616. package/transpiled/directives/octets/Get.d.ts +17 -0
  617. package/transpiled/directives/octets/Get.js +88 -0
  618. package/transpiled/directives/octets/Get.js.map +1 -0
  619. package/transpiled/directives/octets/Octets.d.ts +12 -0
  620. package/transpiled/directives/octets/Octets.js +52 -0
  621. package/transpiled/directives/octets/Octets.js.map +1 -0
  622. package/transpiled/directives/octets/Put.d.ts +29 -0
  623. package/transpiled/directives/octets/Put.js +102 -0
  624. package/transpiled/directives/octets/Put.js.map +1 -0
  625. package/transpiled/directives/octets/Workflow.d.ts +15 -0
  626. package/transpiled/directives/octets/Workflow.js +59 -0
  627. package/transpiled/directives/octets/Workflow.js.map +1 -0
  628. package/transpiled/directives/octets/bytes.d.ts +1 -0
  629. package/transpiled/directives/octets/bytes.js +21 -0
  630. package/transpiled/directives/octets/bytes.js.map +1 -0
  631. package/transpiled/directives/octets/index.d.ts +2 -0
  632. package/transpiled/directives/octets/index.js +6 -0
  633. package/transpiled/directives/octets/index.js.map +1 -0
  634. package/transpiled/directives/octets/schemas.d.ts +9 -0
  635. package/transpiled/directives/octets/schemas.js +15 -0
  636. package/transpiled/directives/octets/schemas.js.map +1 -0
  637. package/transpiled/directives/octets/types.d.ts +5 -0
  638. package/transpiled/directives/octets/types.js +3 -0
  639. package/transpiled/directives/octets/types.js.map +1 -0
  640. package/transpiled/directives/octets/workflows/Execution.d.ts +29 -0
  641. package/transpiled/directives/octets/workflows/Execution.js +89 -0
  642. package/transpiled/directives/octets/workflows/Execution.js.map +1 -0
  643. package/transpiled/directives/octets/workflows/Workflow.d.ts +12 -0
  644. package/transpiled/directives/octets/workflows/Workflow.js +26 -0
  645. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -0
  646. package/transpiled/directives/octets/workflows/index.d.ts +1 -0
  647. package/transpiled/directives/octets/workflows/index.js +6 -0
  648. package/transpiled/directives/octets/workflows/index.js.map +1 -0
  649. package/transpiled/directives/require/Directive.d.ts +4 -0
  650. package/transpiled/directives/require/Directive.js +3 -0
  651. package/transpiled/directives/require/Directive.js.map +1 -0
  652. package/transpiled/directives/require/Headers.d.ts +7 -0
  653. package/transpiled/directives/require/Headers.js +19 -0
  654. package/transpiled/directives/require/Headers.js.map +1 -0
  655. package/transpiled/directives/require/Require.d.ts +9 -0
  656. package/transpiled/directives/require/Require.js +27 -0
  657. package/transpiled/directives/require/Require.js.map +1 -0
  658. package/transpiled/directives/require/index.d.ts +2 -0
  659. package/transpiled/directives/require/index.js +6 -0
  660. package/transpiled/directives/require/index.js.map +1 -0
  661. package/transpiled/discovery.d.ts +1 -0
  662. package/transpiled/discovery.js +3 -0
  663. package/transpiled/discovery.js.map +1 -0
  664. package/transpiled/exceptions.d.ts +3 -0
  665. package/transpiled/exceptions.js +46 -0
  666. package/transpiled/exceptions.js.map +1 -0
  667. package/transpiled/index.d.ts +5 -0
  668. package/transpiled/index.js +12 -0
  669. package/transpiled/index.js.map +1 -0
  670. package/transpiled/io.d.ts +3 -0
  671. package/transpiled/io.js +3 -0
  672. package/transpiled/io.js.map +1 -0
  673. package/transpiled/manifest.d.ts +3 -0
  674. package/transpiled/manifest.js +65 -0
  675. package/transpiled/manifest.js.map +1 -0
  676. package/transpiled/root.d.ts +2 -0
  677. package/transpiled/root.js +44 -0
  678. package/transpiled/root.js.map +1 -0
  679. package/transpiled/schemas.d.ts +7 -0
  680. package/transpiled/schemas.js +14 -0
  681. package/transpiled/schemas.js.map +1 -0
  682. package/transpiled/tsconfig.tsbuildinfo +1 -0
  683. package/components/identity.basic/source/create.ts +0 -18
  684. package/components/octets.storage/operations/fetch.js +0 -46
  685. package/components/octets.storage/operations/list.js +0 -7
  686. package/components/octets.storage/operations/permute.js +0 -7
  687. package/components/octets.storage/operations/store.js +0 -11
  688. package/features/steps/components/octets.tester/operations/diversify.js +0 -14
  689. package/schemas/octets/context.cos.yaml +0 -1
  690. package/schemas/octets/list.cos.yaml +0 -1
  691. package/schemas/octets/permute.cos.yaml +0 -1
  692. package/schemas/octets/store.cos.yaml +0 -3
  693. package/source/HTTP/Server.fixtures.ts +0 -41
  694. package/source/HTTP/Server.test.ts +0 -199
  695. package/source/directives/auth/Family.ts +0 -148
  696. package/source/directives/cache/Family.ts +0 -36
  697. package/source/directives/octets/Fetch.ts +0 -85
  698. package/source/directives/octets/List.ts +0 -32
  699. package/source/directives/octets/Permute.ts +0 -37
  700. package/source/directives/octets/Store.ts +0 -158
@@ -15,28 +15,34 @@ export class Incept implements Directive {
15
15
  }
16
16
 
17
17
  public authorize (identity: Identity | null, input: Input): boolean {
18
- return identity === null && 'authorization' in input.headers
18
+ return identity === null && 'authorization' in input.request.headers
19
19
  }
20
20
 
21
- public async settle (request: Input, response: http.OutgoingMessage): Promise<void> {
21
+ public async settle (input: Input, response: http.OutgoingMessage): Promise<void> {
22
22
  const id = response.body?.[this.property]
23
23
 
24
24
  if (id === undefined)
25
25
  throw new http.Conflict('Identity inception has failed as the response body ' +
26
- ` does not contain the '${this.property}' property.`)
26
+ `does not contain the '${this.property}' property`)
27
27
 
28
- const [scheme, credentials] = split(request.headers.authorization as string)
28
+ const [scheme, credentials] = split(input.request.headers.authorization!)
29
29
  const provider = PROVIDERS[scheme]
30
30
 
31
31
  this.schemes[scheme] ??= await this.discovery[provider]
32
32
 
33
33
  const identity = await this.schemes[scheme]
34
- .invoke<Maybe<Identity>>('create', { input: { id, credentials } })
34
+ .invoke<Maybe<Identity>>('incept', {
35
+ input: {
36
+ authority: input.authority,
37
+ id,
38
+ credentials
39
+ }
40
+ })
35
41
 
36
42
  if (identity instanceof Error)
37
- throw new http.Conflict(identity)
43
+ throw new http.UnprocessableEntity(identity)
38
44
 
39
- request.identity = identity
40
- request.identity.scheme = scheme
45
+ input.identity = identity
46
+ input.identity.scheme = scheme
41
47
  }
42
48
  }
@@ -2,6 +2,7 @@ import { type Component } from '@toa.io/core'
2
2
  import { generate } from 'randomstring'
3
3
  import { Role } from './Role'
4
4
  import { type Identity } from './types'
5
+ import type { Parameter } from '../../RTD'
5
6
 
6
7
  const remote = {
7
8
  invoke: jest.fn()
@@ -16,16 +17,26 @@ beforeEach(() => {
16
17
  it('should return false if not matched', async () => {
17
18
  const roles = ['admin', 'user']
18
19
  const directive = new Role(roles, discovery)
19
- const identity: Identity = { id: generate(), scheme: '', refresh: false }
20
+
21
+ const identity: Identity = {
22
+ id: generate(),
23
+ scheme: '',
24
+ refresh: false
25
+ }
20
26
 
21
27
  remote.invoke.mockResolvedValueOnce(['guest'])
22
28
 
23
- const result = await directive.authorize(identity)
29
+ const result = await directive.authorize(identity, undefined, [])
24
30
 
25
31
  expect(result).toBe(false)
26
32
 
27
33
  expect(remote.invoke)
28
- .toBeCalledWith('list', { query: { criteria: `identity==${identity.id}`, limit: 1024 } })
34
+ .toBeCalledWith('list', {
35
+ query: {
36
+ criteria: `identity==${identity.id}`,
37
+ limit: 1024
38
+ }
39
+ })
29
40
  })
30
41
 
31
42
  it('should return true on exact match', async () => {
@@ -52,11 +63,47 @@ it('should return false on non-scope substring match', async () => {
52
63
  expect(result).toBe(false)
53
64
  })
54
65
 
55
- async function match (expected: string[], actual: string[]): Promise<boolean> {
66
+ it('should return true on match with parameters', async () => {
67
+ const result = await match(['app:{org}:reviews'],
68
+ ['app:29e54ae1:reviews'], [{
69
+ name: 'org',
70
+ value: '29e54ae1'
71
+ }])
72
+
73
+ expect(result).toBe(true)
74
+ })
75
+
76
+ it('should return true on match with parameters', async () => {
77
+ const result = await match(['app:{org}:reviews'],
78
+ ['app:29e54ae1:reviews'], [{
79
+ name: 'org',
80
+ value: '29e54ae1'
81
+ }])
82
+
83
+ expect(result).toBe(true)
84
+ })
85
+
86
+ it('should return false on mismatch with parameters', async () => {
87
+ const result = await match(['app:{org}:reviews'],
88
+ ['app:29e54ae1:reviews'], [{
89
+ name: 'org',
90
+ value: '88584c9b'
91
+ }])
92
+
93
+ expect(result).toBe(false)
94
+ })
95
+
96
+ async function match
97
+ (expected: string[], actual: string[], parameters: Parameter[] = []): Promise<boolean> {
56
98
  const directive = new Role(expected, discovery)
57
- const identity: Identity = { id: generate(), scheme: '', refresh: false }
99
+
100
+ const identity: Identity = {
101
+ id: generate(),
102
+ scheme: '',
103
+ refresh: false
104
+ }
58
105
 
59
106
  remote.invoke.mockResolvedValueOnce(actual)
60
107
 
61
- return await directive.authorize(identity)
108
+ return await directive.authorize(identity, undefined, parameters)
62
109
  }
@@ -1,56 +1,66 @@
1
+ import assert from 'node:assert'
1
2
  import { type Component, type Query } from '@toa.io/core'
2
3
  import { type Directive, type Identity } from './types'
4
+ import type { Parameter } from '../../RTD'
3
5
 
4
6
  export class Role implements Directive {
5
7
  public static remote: Component | null = null
6
8
  private readonly roles: string[]
7
9
  private readonly discovery: Promise<Component>
10
+ private readonly dynamic: boolean
8
11
 
9
12
  public constructor (roles: string | string[], discovery: Promise<Component>) {
10
13
  this.roles = typeof roles === 'string' ? [roles] : roles
11
14
  this.discovery = discovery
15
+ this.dynamic = this.roles.some((role) => role.includes('{'))
12
16
  }
13
17
 
14
18
  public static async set (identity: Identity, discovery: Promise<Component>): Promise<void> {
15
19
  this.remote ??= await discovery
16
20
 
17
- const query: Query = { criteria: `identity==${identity.id}`, limit: 1024 }
18
- const roles: string[] = await this.remote.invoke('list', { query })
21
+ const query: Query = {
22
+ criteria: `identity==${identity.id}`,
23
+ limit: 1024
24
+ }
19
25
 
20
- identity.roles = roles
26
+ identity.roles = await this.remote.invoke('list', { query })
21
27
  }
22
28
 
23
- public async authorize (identity: Identity | null): Promise<boolean> {
29
+ public async authorize
30
+ (identity: Identity | null, _: unknown, parameters: Parameter[]): Promise<boolean> {
24
31
  if (identity === null)
25
32
  return false
26
33
 
27
34
  await Role.set(identity, this.discovery)
28
35
 
29
- if (identity.roles === undefined)
36
+ if (identity.roles!.length === 0) // Role.set()
37
+
30
38
  return false
31
39
 
32
- return this.match(identity.roles)
40
+ return this.match(identity.roles!, parameters)
33
41
  }
34
42
 
35
- private match (roles: string[]): boolean {
43
+ private match (roles: string[], parameters: Parameter[]): boolean {
44
+ const required = this.dynamic ? this.substitute(parameters) : this.roles
45
+
36
46
  for (const role of roles) {
37
- const index = this.roles.findIndex((expected) => compare(expected, role))
47
+ const ok = required.some((expected) => expected === role || expected.startsWith(role + ':'))
38
48
 
39
- if (index !== -1)
49
+ if (ok)
40
50
  return true
41
51
  }
42
52
 
43
53
  return false
44
54
  }
45
- }
46
55
 
47
- function compare (expected: string, actual: string): boolean {
48
- const exp = expected.split(':')
49
- const act = actual.split(':')
56
+ private substitute (parameters: Parameter[]): string[] {
57
+ return this.roles.map((role) => role.replaceAll(/{(\w+)}/g, (_, key) => {
58
+ const value = parameters.find((parameter) => parameter.name === key)?.value
50
59
 
51
- for (let i = 0; i < act.length; i++)
52
- if (exp[i] !== act[i])
53
- return false
60
+ assert.ok(value !== undefined,
61
+ `Role '${role}' requires '${key}' route parameter`)
54
62
 
55
- return true
63
+ return value
64
+ }))
65
+ }
56
66
  }
@@ -1,5 +1,5 @@
1
1
  import { type Parameter } from '../../RTD'
2
- import { type Directive, type Identity } from './types'
2
+ import type { Input, Directive, Identity } from './types'
3
3
 
4
4
  export class Rule implements Directive {
5
5
  private readonly directives: Directive[] = []
@@ -13,7 +13,7 @@ export class Rule implements Directive {
13
13
  }
14
14
 
15
15
  public async authorize
16
- (identity: Identity | null, input: any, parameters: Parameter[]): Promise<boolean> {
16
+ (identity: Identity | null, input: Input, parameters: Parameter[]): Promise<boolean> {
17
17
  for (const directive of this.directives) {
18
18
  const authorized = await directive.authorize(identity, input, parameters)
19
19
 
@@ -12,14 +12,14 @@ export class Scheme implements Directive {
12
12
  }
13
13
 
14
14
  public authorize (_: Identity | null, input: Input): boolean {
15
- if (input.headers.authorization === undefined)
15
+ if (input.request.headers.authorization === undefined)
16
16
  return false
17
17
 
18
- const [scheme] = split(input.headers.authorization)
18
+ const [scheme] = split(input.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
  }
@@ -1,3 +1,3 @@
1
- import Family from './Family'
1
+ import { Authorization } from './Authorization'
2
2
 
3
- export = Family
3
+ export const authorization = new Authorization()
@@ -2,7 +2,8 @@ import { type Remote, type Scheme } from './types'
2
2
 
3
3
  export const PROVIDERS: Record<Scheme, Remote> = {
4
4
  basic: 'basic',
5
- token: 'tokens'
5
+ token: 'tokens',
6
+ bearer: 'federation'
6
7
  }
7
8
 
8
9
  export const PRIMARY: Scheme = 'token'
@@ -5,7 +5,7 @@ export function split (authorization: string): [Scheme, string] {
5
5
  const space = authorization.indexOf(' ')
6
6
 
7
7
  if (space === -1)
8
- throw new http.Unauthorized('Malformed authorization header.')
8
+ throw new http.Unauthorized('Malformed authorization header')
9
9
 
10
10
  const Scheme = authorization.slice(0, space)
11
11
  const scheme = Scheme.toLowerCase() as Scheme
@@ -2,11 +2,14 @@ import { type Component } from '@toa.io/core'
2
2
  import { type Maybe } from '@toa.io/types'
3
3
  import { type Parameter } from '../../RTD'
4
4
  import type * as http from '../../HTTP'
5
- import type * as directive from '../../Directive'
5
+ import type * as io from '../../io'
6
6
 
7
7
  export interface Directive {
8
- authorize: (identity: Identity | null, input: Input, parameters: Parameter[]) =>
9
- boolean | Promise<boolean>
8
+ authorize: (
9
+ identity: Identity | null,
10
+ input: Input,
11
+ parameters: Parameter[]
12
+ ) => boolean | Promise<boolean>
10
13
 
11
14
  reply?: (identity: Identity | null) => http.OutgoingMessage
12
15
 
@@ -15,7 +18,7 @@ export interface Directive {
15
18
 
16
19
  export interface Identity {
17
20
  readonly id: string
18
- scheme: string
21
+ scheme: string | null // null for transient identities
19
22
  roles?: string[]
20
23
  refresh: boolean
21
24
  }
@@ -28,10 +31,10 @@ export interface Ban {
28
31
  banned: boolean
29
32
  }
30
33
 
31
- export type Input = directive.Input & Extension
34
+ export type Input = io.Input & Extension
32
35
  export type AuthenticationResult = Maybe<{ identity: Identity, refresh: boolean }>
33
36
 
34
- export type Scheme = 'basic' | 'token'
35
- export type Remote = 'basic' | 'tokens' | 'roles' | 'bans'
37
+ export type Scheme = 'basic' | 'token' | 'bearer'
38
+ export type Remote = 'basic' | 'federation' | 'tokens' | 'roles' | 'bans'
36
39
  export type Discovery = Record<Remote, Promise<Component>>
37
40
  export type Schemes = Record<Scheme, Component>
@@ -0,0 +1,42 @@
1
+ import { Control } from './Control'
2
+ import { Exact } from './Exact'
3
+ import type { Output } from '../../io'
4
+ import type { AuthenticatedContext, Directive } from './types'
5
+ import type { DirectiveFamily } from '../../RTD'
6
+ import type * as http from '../../HTTP'
7
+
8
+ export class Cache implements DirectiveFamily<Directive> {
9
+ public readonly name: string = 'cache'
10
+ public readonly mandatory: boolean = true
11
+
12
+ public create (name: string, value: any): Directive {
13
+ const Class = constructors[name]
14
+
15
+ if (Class === undefined)
16
+ throw new Error(`Directive 'cache:${name}' is not implemented`)
17
+
18
+ return new Class(value)
19
+ }
20
+
21
+ public preflight (): Output {
22
+ return null
23
+ }
24
+
25
+ public async settle
26
+ (directives: Directive[], context: AuthenticatedContext, response: http.OutgoingMessage): Promise<void> {
27
+ const directive = directives[0]
28
+
29
+ response.headers ??= new Headers()
30
+
31
+ if (directive === undefined) {
32
+ if (context.identity !== null && !Control.disabled(response.headers))
33
+ response.headers.set('cache-control', 'private')
34
+ } else
35
+ directive.set(context, response.headers)
36
+ }
37
+ }
38
+
39
+ const constructors: Record<string, new (value: any) => Directive> = {
40
+ control: Control,
41
+ exact: Exact
42
+ }
@@ -1,59 +1,85 @@
1
1
  import { match } from 'matchacho'
2
- import type { AuthenticatedRequest, Directive } from './types'
2
+ import type { AuthenticatedContext, Directive } from './types'
3
3
 
4
4
  export class Control implements Directive {
5
5
  protected readonly value: string
6
6
  private cache: string | null = null
7
+ private vary: boolean = false
7
8
 
8
9
  public constructor (value: string) {
9
10
  this.value = value
10
11
  }
11
12
 
12
- public set (request: AuthenticatedRequest, headers: Headers): void {
13
- if (!['GET', 'HEAD', 'OPTIONS'].includes(request.method))
13
+ public static disabled (headers: Headers): boolean {
14
+ const value = headers.get('cache-control')
15
+
16
+ if (value === null)
17
+ return false
18
+
19
+ const directives = mask(value)
20
+
21
+ return (directives & NO_STORE) === NO_STORE
22
+ }
23
+
24
+ public set (context: AuthenticatedContext, headers: Headers): void {
25
+ if (!['GET', 'HEAD', 'OPTIONS'].includes(context.request.method))
14
26
  return
15
27
 
16
- this.cache ??= this.resolve(request)
28
+ this.cache ??= this.resolve(context)
29
+
30
+ if (Control.disabled(headers))
31
+ return
17
32
 
18
33
  headers.set('cache-control', this.cache)
34
+
35
+ if (this.vary !== null)
36
+ headers.append('vary', 'authorization')
19
37
  }
20
38
 
21
- protected resolve (request: AuthenticatedRequest): string {
39
+ protected resolve (request: AuthenticatedContext): string {
22
40
  if (request.identity === null)
23
41
  return this.value
24
42
 
25
- const directives = this.mask()
43
+ const directives = mask(this.value)
44
+
45
+ if ((directives & PRIVATE) === PRIVATE)
46
+ this.vary = true
26
47
 
27
48
  if ((directives & (PUBLIC | NO_CACHE)) === PUBLIC)
28
49
  return 'no-cache, ' + this.value
29
50
 
30
- if ((directives & (PUBLIC | PRIVATE)) === 0)
51
+ if ((directives & (PUBLIC | PRIVATE)) === 0) {
52
+ this.vary = true
53
+
31
54
  return 'private, ' + this.value
55
+ }
32
56
 
33
57
  return this.value
34
58
  }
59
+ }
35
60
 
36
- private mask (): number {
37
- const directives = this.value.match(DIRECTIVES_RX)
61
+ function mask (value: string): number {
62
+ const directives = value.match(DIRECTIVES_RX)
38
63
 
39
- if (directives === null)
40
- return 0
64
+ if (directives === null)
65
+ return 0
41
66
 
42
- let mask = 0
67
+ let mask = 0
43
68
 
44
- for (const directive of directives)
45
- mask |= match<number>(directive,
46
- 'private', PRIVATE,
47
- 'public', PUBLIC,
48
- 'no-cache', NO_CACHE,
49
- 0)
69
+ for (const directive of directives)
70
+ mask |= match<number>(directive,
71
+ 'private', PRIVATE,
72
+ 'public', PUBLIC,
73
+ 'no-cache', NO_CACHE,
74
+ 'no-store', NO_STORE,
75
+ 0)
50
76
 
51
- return mask
52
- }
77
+ return mask
53
78
  }
54
79
 
55
- const DIRECTIVES_RX = /\b(private|public|no-cache)\b/ig
80
+ const DIRECTIVES_RX = /\b(private|public|no-cache|no-store)\b/ig
56
81
 
57
82
  const PUBLIC = 1
58
83
  const PRIVATE = 2
59
84
  const NO_CACHE = 4
85
+ const NO_STORE = 8
@@ -1,3 +1,3 @@
1
- import Family from './Family'
1
+ import { Cache } from './Cache'
2
2
 
3
- export = Family
3
+ export const cache = new Cache()
@@ -1,9 +1,9 @@
1
- import { type Input } from '../../Directive'
1
+ import type { Input } from '../../io'
2
2
 
3
3
  export interface Directive {
4
4
  set: (input: Input, headers: Headers) => void
5
5
  }
6
6
 
7
- export interface AuthenticatedRequest extends Input {
7
+ export interface AuthenticatedContext extends Input {
8
8
  identity?: unknown | null
9
9
  }
@@ -0,0 +1,63 @@
1
+ import type { Input, Output } from '../../io'
2
+ import type { Interceptor } from '../../Interception'
3
+
4
+ export class CORS implements Interceptor {
5
+ public readonly name = 'cors'
6
+
7
+ private readonly requestHeaders = new Set<string>([
8
+ 'accept',
9
+ 'authorization',
10
+ 'content-type',
11
+ 'etag',
12
+ 'if-match',
13
+ 'if-none-match'
14
+ ])
15
+
16
+ private readonly headers = new Headers({
17
+ 'access-control-allow-methods': 'GET, POST, PUT, PATCH, DELETE, LOCK, UNLOCK',
18
+ 'access-control-allow-credentials': 'true',
19
+ 'access-control-allow-headers': Array.from(this.requestHeaders).join(', '),
20
+ 'access-control-max-age': '3600',
21
+ 'cache-control': 'max-age=3600',
22
+ vary: 'origin'
23
+ })
24
+
25
+ public intercept (input: Input): Output {
26
+ const origin = input.request.headers.origin
27
+
28
+ if (origin === undefined)
29
+ return null
30
+
31
+ if (input.request.method === 'OPTIONS')
32
+ return this.preflightResponse(origin)
33
+
34
+ input.pipelines.response.push((output) => {
35
+ output.headers ??= new Headers()
36
+ output.headers.set('access-control-allow-origin', origin)
37
+ output.headers.set('access-control-allow-credentials', 'true')
38
+ output.headers.set('access-control-expose-headers',
39
+ 'authorization, content-type, content-length, etag')
40
+
41
+ const method = input.request.method
42
+
43
+ if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS')
44
+ output.headers.append('vary', 'origin')
45
+ })
46
+
47
+ return null
48
+ }
49
+
50
+ public allow (header: string): void {
51
+ this.requestHeaders.add(header.toLowerCase())
52
+ this.headers.set('access-control-allow-headers', Array.from(this.requestHeaders).join(', '))
53
+ }
54
+
55
+ private preflightResponse (origin: string): Output {
56
+ this.headers.set('access-control-allow-origin', origin)
57
+
58
+ return {
59
+ status: 204,
60
+ headers: this.headers
61
+ }
62
+ }
63
+ }
@@ -0,0 +1,3 @@
1
+ import { CORS } from './CORS'
2
+
3
+ export const cors = new CORS()
@@ -1,17 +1,18 @@
1
- import { type Input, type Output, type Family } from '../../Directive'
2
1
  import { Stub } from './Stub'
3
2
  import { Throw } from './Throw'
4
3
  import { type Directive } from './types'
4
+ import type { Input, Output } from '../../io'
5
+ import type { DirectiveFamily } from '../../RTD'
5
6
 
6
- class Development implements Family<Directive> {
7
+ export class Development implements DirectiveFamily<Directive> {
7
8
  public readonly name: string = 'dev'
8
9
  public readonly mandatory: boolean = false
9
10
 
10
- public create (name: string, value: any): Directive {
11
+ public create (name: string, value: unknown): Directive {
11
12
  const Class = constructors[name]
12
13
 
13
14
  if (Class === undefined)
14
- throw new Error(`Directive '${name}' is not provided by the '${this.name}' family.`)
15
+ throw new Error(`Directive 'dev:${name}' is not implemented`)
15
16
 
16
17
  return new Class(value)
17
18
  }
@@ -32,5 +33,3 @@ const constructors: Record<string, new (value: any) => Directive> = {
32
33
  stub: Stub,
33
34
  throw: Throw
34
35
  }
35
-
36
- export = new Development()
@@ -1,10 +1,10 @@
1
- import { type Output } from '../../Directive'
2
- import { type Directive } from './types'
1
+ import type { Output } from '../../io'
2
+ import type { Directive } from './types'
3
3
 
4
4
  export class Stub implements Directive {
5
- private readonly value: any
5
+ private readonly value: unknown
6
6
 
7
- public constructor (value: any) {
7
+ public constructor (value: unknown) {
8
8
  this.value = value
9
9
  }
10
10
 
@@ -1,10 +1,10 @@
1
- import { type Output } from '../../Directive'
2
- import { type Directive } from './types'
1
+ import type { Output } from '../../io'
2
+ import type { Directive } from './types'
3
3
 
4
4
  export class Throw implements Directive {
5
- private readonly message: any
5
+ private readonly message: string
6
6
 
7
- public constructor (message: any) {
7
+ public constructor (message: string) {
8
8
  this.message = message
9
9
  }
10
10
 
@@ -1,3 +1,3 @@
1
- import Family from './Family'
1
+ import { Development } from './Development'
2
2
 
3
- export = Family
3
+ export const dev = new Development()
@@ -1,4 +1,4 @@
1
- import { type Input, type Output } from '../../Directive'
1
+ import type { Input, Output } from '../../io'
2
2
 
3
3
  export interface Directive {
4
4
  apply: (input: Input) => Output