@toa.io/extensions.exposition 1.0.0-alpha.14 → 1.0.0-alpha.143

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