@toa.io/extensions.exposition 1.0.0-alpha.27 → 1.0.0-alpha.270

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 (912) hide show
  1. package/CHANGELOG.md +177 -0
  2. package/components/exposition.octets/manifest.toa.yaml +29 -0
  3. package/components/exposition.octets/operations/get.js +7 -0
  4. package/components/exposition.octets/operations/head.js +7 -0
  5. package/components/exposition.octets/operations/put.js +135 -0
  6. package/components/exposition.stash/manifest.toa.yaml +21 -0
  7. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -1
  8. package/components/identity.basic/manifest.toa.yaml +93 -11
  9. package/components/identity.basic/operations/add.d.ts +3 -0
  10. package/components/identity.basic/operations/add.js +17 -0
  11. package/components/identity.basic/operations/add.js.map +1 -0
  12. package/components/identity.basic/operations/authenticate.js +2 -2
  13. package/components/identity.basic/operations/authenticate.js.map +1 -1
  14. package/components/identity.basic/operations/check.d.ts +7 -0
  15. package/components/identity.basic/operations/check.js +15 -0
  16. package/components/identity.basic/operations/check.js.map +1 -0
  17. package/components/identity.basic/operations/delete.d.ts +7 -0
  18. package/components/identity.basic/operations/delete.js +11 -0
  19. package/components/identity.basic/operations/delete.js.map +1 -0
  20. package/components/identity.basic/operations/incept.d.ts +1 -1
  21. package/components/identity.basic/operations/incept.js +9 -3
  22. package/components/identity.basic/operations/incept.js.map +1 -1
  23. package/components/identity.basic/operations/info.d.ts +10 -0
  24. package/components/identity.basic/operations/info.js +11 -0
  25. package/components/identity.basic/operations/info.js.map +1 -0
  26. package/components/identity.basic/operations/transit.d.ts +2 -2
  27. package/components/identity.basic/operations/transit.js +11 -7
  28. package/components/identity.basic/operations/transit.js.map +1 -1
  29. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  30. package/components/identity.basic/operations/types.d.ts +18 -7
  31. package/components/identity.basic/source/add.ts +15 -0
  32. package/components/identity.basic/source/authenticate.ts +2 -2
  33. package/components/identity.basic/source/check.ts +20 -0
  34. package/components/identity.basic/source/delete.ts +15 -0
  35. package/components/identity.basic/source/incept.ts +10 -4
  36. package/components/identity.basic/source/info.ts +19 -0
  37. package/components/identity.basic/source/transit.ts +14 -11
  38. package/components/identity.basic/source/types.ts +20 -7
  39. package/components/identity.credentials/manifest.toa.yaml +57 -0
  40. package/components/identity.credentials/operations/list.d.ts +51 -0
  41. package/components/identity.credentials/operations/list.js +32 -0
  42. package/components/identity.credentials/operations/list.js.map +1 -0
  43. package/components/identity.credentials/operations/tsconfig.tsbuildinfo +1 -0
  44. package/components/identity.credentials/source/list.test.ts +47 -0
  45. package/components/identity.credentials/source/list.ts +87 -0
  46. package/components/identity.credentials/tsconfig.json +7 -0
  47. package/components/identity.federation/events/principal.js +2 -2
  48. package/components/identity.federation/manifest.toa.yaml +110 -40
  49. package/components/identity.federation/operations/authenticate.d.ts +16 -3
  50. package/components/identity.federation/operations/authenticate.js +24 -16
  51. package/components/identity.federation/operations/authenticate.js.map +1 -1
  52. package/components/identity.federation/operations/create.d.ts +8 -0
  53. package/components/identity.federation/operations/create.js +27 -0
  54. package/components/identity.federation/operations/create.js.map +1 -0
  55. package/components/identity.federation/operations/decode.d.ts +3 -0
  56. package/components/identity.federation/operations/decode.js +13 -0
  57. package/components/identity.federation/operations/decode.js.map +1 -0
  58. package/components/identity.federation/operations/delete.d.ts +8 -0
  59. package/components/identity.federation/operations/delete.js +11 -0
  60. package/components/identity.federation/operations/delete.js.map +1 -0
  61. package/components/identity.federation/operations/incept.d.ts +6 -6
  62. package/components/identity.federation/operations/incept.js +5 -9
  63. package/components/identity.federation/operations/incept.js.map +1 -1
  64. package/components/identity.federation/operations/lib/Configuration.d.ts +39 -0
  65. package/components/identity.federation/operations/lib/Configuration.js +3 -0
  66. package/components/identity.federation/operations/lib/Configuration.js.map +1 -0
  67. package/components/identity.federation/operations/lib/Ctx.d.ts +8 -0
  68. package/{transpiled/directives/vary/embeddings/Embedding.js → components/identity.federation/operations/lib/Ctx.js} +1 -1
  69. package/components/identity.federation/operations/lib/Ctx.js.map +1 -0
  70. package/components/identity.federation/operations/lib/Payload.d.ts +5 -0
  71. package/components/identity.federation/operations/lib/Payload.js +3 -0
  72. package/components/identity.federation/operations/lib/Payload.js.map +1 -0
  73. package/components/identity.federation/operations/lib/decode.d.ts +3 -0
  74. package/components/identity.federation/operations/lib/decode.js +22 -0
  75. package/components/identity.federation/operations/lib/decode.js.map +1 -0
  76. package/components/identity.federation/operations/lib/discovery.d.ts +5 -0
  77. package/components/identity.federation/operations/lib/discovery.js +39 -0
  78. package/components/identity.federation/operations/lib/discovery.js.map +1 -0
  79. package/components/identity.federation/operations/lib/errors.d.ts +11 -0
  80. package/components/identity.federation/operations/lib/errors.js +15 -0
  81. package/components/identity.federation/operations/lib/errors.js.map +1 -0
  82. package/components/identity.federation/operations/lib/exchange.d.ts +3 -0
  83. package/components/identity.federation/operations/lib/exchange.js +108 -0
  84. package/components/identity.federation/operations/lib/exchange.js.map +1 -0
  85. package/components/identity.federation/operations/lib/index.d.ts +4 -0
  86. package/components/identity.federation/operations/lib/index.js +10 -0
  87. package/components/identity.federation/operations/lib/index.js.map +1 -0
  88. package/components/identity.federation/operations/lib/jose.d.ts +41 -0
  89. package/components/identity.federation/operations/lib/{assertions-as-values.js → jose.js} +4 -22
  90. package/components/identity.federation/operations/lib/jose.js.map +1 -0
  91. package/components/identity.federation/operations/lib/resolve.d.ts +3 -0
  92. package/components/identity.federation/operations/lib/resolve.js +17 -0
  93. package/components/identity.federation/operations/lib/resolve.js.map +1 -0
  94. package/components/identity.federation/operations/list.d.ts +7 -0
  95. package/components/identity.federation/operations/list.js +15 -0
  96. package/components/identity.federation/operations/list.js.map +1 -0
  97. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  98. package/components/identity.federation/operations/types/Scheme.d.ts +1 -0
  99. package/components/identity.federation/operations/types/Scheme.js +3 -0
  100. package/components/identity.federation/operations/types/Scheme.js.map +1 -0
  101. package/components/identity.federation/operations/types/configuration.d.ts +20 -0
  102. package/components/identity.federation/operations/types/configuration.js +3 -0
  103. package/components/identity.federation/operations/types/configuration.js.map +1 -0
  104. package/components/identity.federation/operations/types/context.d.ts +35 -0
  105. package/components/identity.federation/operations/types/context.js +3 -0
  106. package/components/identity.federation/operations/types/context.js.map +1 -0
  107. package/components/identity.federation/operations/types/entity.d.ts +9 -0
  108. package/components/identity.federation/operations/types/entity.js +3 -0
  109. package/components/identity.federation/operations/types/entity.js.map +1 -0
  110. package/components/identity.federation/operations/types/index.d.ts +4 -0
  111. package/components/identity.federation/operations/types/index.js +21 -0
  112. package/components/identity.federation/operations/types/index.js.map +1 -0
  113. package/components/identity.federation/source/authenticate.ts +41 -21
  114. package/components/identity.federation/source/create.ts +39 -0
  115. package/components/identity.federation/source/decode.ts +11 -0
  116. package/components/identity.federation/source/delete.ts +16 -0
  117. package/components/identity.federation/source/incept.ts +9 -17
  118. package/components/identity.federation/source/lib/Configuration.ts +39 -0
  119. package/components/identity.federation/source/lib/Ctx.ts +9 -0
  120. package/components/identity.federation/source/lib/Payload.ts +6 -0
  121. package/components/identity.federation/source/lib/decode.ts +27 -0
  122. package/components/identity.federation/source/lib/discovery.test.ts +45 -0
  123. package/components/identity.federation/source/lib/discovery.ts +49 -0
  124. package/components/identity.federation/source/lib/errors.ts +12 -0
  125. package/components/identity.federation/source/lib/exchange.ts +116 -0
  126. package/components/identity.federation/source/lib/index.ts +4 -0
  127. package/components/identity.federation/source/lib/jose.d.ts +1 -0
  128. package/components/identity.federation/source/lib/jose.js +5 -0
  129. package/components/identity.federation/source/lib/resolve.ts +17 -0
  130. package/components/identity.federation/source/list.test.ts +22 -0
  131. package/components/identity.federation/source/list.ts +17 -0
  132. package/components/identity.federation/source/types/Scheme.ts +1 -0
  133. package/components/identity.federation/source/types/configuration.ts +21 -0
  134. package/components/identity.federation/source/types/context.ts +38 -0
  135. package/components/identity.federation/source/types/entity.ts +9 -0
  136. package/components/identity.federation/source/types/index.ts +4 -0
  137. package/components/identity.federation/tsconfig.json +1 -3
  138. package/components/identity.keys/manifest.toa.yaml +58 -0
  139. package/components/identity.keys/operations/create.d.ts +22 -0
  140. package/components/identity.keys/operations/create.js +16 -0
  141. package/components/identity.keys/operations/create.js.map +1 -0
  142. package/components/identity.keys/operations/tsconfig.tsbuildinfo +1 -0
  143. package/components/identity.keys/source/create.ts +35 -0
  144. package/components/identity.keys/tsconfig.json +9 -0
  145. package/components/identity.otp/manifest.toa.yaml +69 -0
  146. package/components/identity.otp/operations/authenticate.d.ts +12 -0
  147. package/components/identity.otp/operations/authenticate.js +31 -0
  148. package/components/identity.otp/operations/authenticate.js.map +1 -0
  149. package/components/identity.otp/operations/issue.d.ts +12 -0
  150. package/components/identity.otp/operations/issue.js +22 -0
  151. package/components/identity.otp/operations/issue.js.map +1 -0
  152. package/components/identity.otp/operations/lib/Context.d.ts +13 -0
  153. package/components/identity.otp/operations/lib/Context.js +3 -0
  154. package/components/identity.otp/operations/lib/Context.js.map +1 -0
  155. package/components/identity.otp/operations/lib/Entity.d.ts +6 -0
  156. package/components/identity.otp/operations/lib/Entity.js +3 -0
  157. package/components/identity.otp/operations/lib/Entity.js.map +1 -0
  158. package/components/identity.otp/operations/lib/index.d.ts +1 -0
  159. package/components/identity.otp/operations/lib/index.js +3 -0
  160. package/components/identity.otp/operations/lib/index.js.map +1 -0
  161. package/components/identity.otp/operations/tsconfig.tsbuildinfo +1 -0
  162. package/components/identity.otp/source/authenticate.ts +48 -0
  163. package/components/identity.otp/source/issue.ts +34 -0
  164. package/components/identity.otp/source/lib/Context.ts +14 -0
  165. package/components/identity.otp/source/lib/Entity.ts +6 -0
  166. package/components/identity.otp/source/lib/index.ts +1 -0
  167. package/components/identity.otp/tsconfig.json +9 -0
  168. package/components/identity.passkeys/manifest.toa.yaml +276 -0
  169. package/components/identity.passkeys/operations/authenticate.d.ts +16 -0
  170. package/components/identity.passkeys/operations/authenticate.js +34 -0
  171. package/components/identity.passkeys/operations/authenticate.js.map +1 -0
  172. package/components/identity.passkeys/operations/challenge.d.ts +35 -0
  173. package/components/identity.passkeys/operations/challenge.js +73 -0
  174. package/components/identity.passkeys/operations/challenge.js.map +1 -0
  175. package/components/identity.passkeys/operations/create.d.ts +19 -0
  176. package/components/identity.passkeys/operations/create.js +58 -0
  177. package/components/identity.passkeys/operations/create.js.map +1 -0
  178. package/components/identity.passkeys/operations/delete.d.ts +8 -0
  179. package/components/identity.passkeys/operations/delete.js +12 -0
  180. package/components/identity.passkeys/operations/delete.js.map +1 -0
  181. package/components/identity.passkeys/operations/lib/const.d.ts +1 -0
  182. package/components/identity.passkeys/operations/lib/const.js +5 -0
  183. package/components/identity.passkeys/operations/lib/const.js.map +1 -0
  184. package/components/identity.passkeys/operations/list.d.ts +7 -0
  185. package/components/identity.passkeys/operations/list.js +15 -0
  186. package/components/identity.passkeys/operations/list.js.map +1 -0
  187. package/components/identity.passkeys/operations/tsconfig.tsbuildinfo +1 -0
  188. package/components/identity.passkeys/operations/types/Configuration.d.ts +6 -0
  189. package/components/identity.passkeys/operations/types/Configuration.js +3 -0
  190. package/components/identity.passkeys/operations/types/Configuration.js.map +1 -0
  191. package/components/identity.passkeys/operations/types/Context.d.ts +15 -0
  192. package/components/identity.passkeys/operations/types/Context.js +3 -0
  193. package/components/identity.passkeys/operations/types/Context.js.map +1 -0
  194. package/components/identity.passkeys/operations/types/Passkey.d.ts +13 -0
  195. package/components/identity.passkeys/operations/types/Passkey.js +3 -0
  196. package/components/identity.passkeys/operations/types/Passkey.js.map +1 -0
  197. package/components/identity.passkeys/operations/types/index.d.ts +2 -0
  198. package/components/identity.passkeys/operations/types/index.js +3 -0
  199. package/components/identity.passkeys/operations/types/index.js.map +1 -0
  200. package/components/identity.passkeys/operations/use.d.ts +16 -0
  201. package/components/identity.passkeys/operations/use.js +57 -0
  202. package/components/identity.passkeys/operations/use.js.map +1 -0
  203. package/components/identity.passkeys/source/authenticate.ts +48 -0
  204. package/components/identity.passkeys/source/challenge.ts +115 -0
  205. package/components/identity.passkeys/source/create.ts +77 -0
  206. package/components/identity.passkeys/source/delete.ts +15 -0
  207. package/components/identity.passkeys/source/lib/const.ts +1 -0
  208. package/components/identity.passkeys/source/list.ts +17 -0
  209. package/components/identity.passkeys/source/types/Configuration.ts +6 -0
  210. package/components/identity.passkeys/source/types/Context.ts +16 -0
  211. package/components/identity.passkeys/source/types/Passkey.ts +14 -0
  212. package/components/identity.passkeys/source/types/index.ts +2 -0
  213. package/components/identity.passkeys/source/use.ts +75 -0
  214. package/components/identity.passkeys/tsconfig.json +9 -0
  215. package/components/identity.roles/manifest.toa.yaml +4 -2
  216. package/components/identity.roles/operations/grant.js +2 -2
  217. package/components/identity.roles/operations/grant.js.map +1 -1
  218. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  219. package/components/identity.roles/receivers/identity.federation.principal.js +6 -0
  220. package/components/identity.roles/source/grant.ts +2 -2
  221. package/components/identity.tokens/manifest.toa.yaml +110 -13
  222. package/components/identity.tokens/operations/authenticate.d.ts +2 -2
  223. package/components/identity.tokens/operations/authenticate.js +13 -12
  224. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  225. package/components/identity.tokens/operations/decrypt.d.ts +15 -3
  226. package/components/identity.tokens/operations/decrypt.js +115 -20
  227. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  228. package/components/identity.tokens/operations/encrypt.d.ts +3 -3
  229. package/components/identity.tokens/operations/encrypt.js +30 -13
  230. package/components/identity.tokens/operations/encrypt.js.map +1 -1
  231. package/components/identity.tokens/operations/issue.d.ts +24 -0
  232. package/components/identity.tokens/operations/issue.js +59 -0
  233. package/components/identity.tokens/operations/issue.js.map +1 -0
  234. package/components/identity.tokens/operations/lib/index.d.ts +3 -0
  235. package/components/identity.tokens/operations/lib/index.js +22 -0
  236. package/components/identity.tokens/operations/lib/index.js.map +1 -0
  237. package/components/identity.tokens/operations/lib/jose.d.ts +41 -0
  238. package/components/identity.tokens/operations/lib/jose.js +27 -0
  239. package/components/identity.tokens/operations/lib/jose.js.map +1 -0
  240. package/components/identity.tokens/operations/lib/key.d.ts +1 -0
  241. package/components/identity.tokens/operations/lib/key.js +11 -0
  242. package/components/identity.tokens/operations/lib/key.js.map +1 -0
  243. package/components/identity.tokens/operations/lib/pad.d.ts +1 -0
  244. package/components/identity.tokens/operations/lib/pad.js +5 -0
  245. package/components/identity.tokens/operations/lib/pad.js.map +1 -0
  246. package/components/identity.tokens/operations/lib/types.d.ts +84 -0
  247. package/components/identity.tokens/operations/lib/types.js.map +1 -0
  248. package/components/identity.tokens/operations/revoke.d.ts +2 -2
  249. package/components/identity.tokens/operations/revoke.js.map +1 -1
  250. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  251. package/components/identity.tokens/source/authenticate.test.ts +14 -7
  252. package/components/identity.tokens/source/authenticate.ts +15 -14
  253. package/components/identity.tokens/source/decrypt.test.ts +90 -16
  254. package/components/identity.tokens/source/decrypt.ts +152 -20
  255. package/components/identity.tokens/source/encrypt.test.ts +75 -13
  256. package/components/identity.tokens/source/encrypt.ts +42 -16
  257. package/components/identity.tokens/source/issue.ts +82 -0
  258. package/components/identity.tokens/source/lib/index.ts +3 -0
  259. package/components/identity.tokens/source/lib/jose.d.ts +1 -0
  260. package/components/identity.tokens/source/lib/jose.js +5 -0
  261. package/components/identity.tokens/source/lib/key.ts +8 -0
  262. package/components/identity.tokens/source/lib/pad.ts +1 -0
  263. package/components/identity.tokens/source/lib/paseto.test.ts +16 -0
  264. package/components/identity.tokens/source/lib/types.ts +97 -0
  265. package/components/identity.tokens/source/revoke.ts +2 -2
  266. package/{components/context.toa.yaml → context.toa.yaml} +6 -2
  267. package/cucumber.js +1 -1
  268. package/documentation/access.md +78 -27
  269. package/documentation/authorities.md +6 -11
  270. package/documentation/components.md +174 -56
  271. package/documentation/credentials.md +88 -0
  272. package/documentation/dev.md +30 -0
  273. package/documentation/flow.md +44 -0
  274. package/documentation/identity.md +125 -14
  275. package/documentation/introspection.md +82 -0
  276. package/documentation/io.md +73 -2
  277. package/documentation/map.md +115 -0
  278. package/documentation/notes/desync.jpg +0 -0
  279. package/documentation/notes/peers.md +59 -0
  280. package/documentation/notes/throttling.md +122 -0
  281. package/documentation/octets.md +122 -69
  282. package/documentation/passkeys.md +5 -0
  283. package/documentation/protocol.md +11 -4
  284. package/documentation/query.md +43 -0
  285. package/documentation/tracing.md +70 -0
  286. package/documentation/tree.md +13 -0
  287. package/features/access.feature +123 -3
  288. package/features/auth.assert.feature +57 -0
  289. package/features/auth.claims.feature +170 -0
  290. package/features/auth.incept.feature +120 -0
  291. package/features/auth.input.feature +59 -0
  292. package/features/authorities.feature +3 -3
  293. package/features/authorities.federation.feature +20 -20
  294. package/features/authorities.tokens.feature +1 -2
  295. package/features/body.feature +27 -0
  296. package/features/cache.feature +97 -8
  297. package/features/cors.feature +29 -8
  298. package/features/credentials.feature +106 -0
  299. package/features/dev.feature +87 -0
  300. package/features/dynamic.feature +82 -1
  301. package/features/errors.feature +17 -5
  302. package/features/etag.feature +223 -1
  303. package/features/flow.feature +148 -0
  304. package/features/identity.basic.feature +136 -7
  305. package/features/identity.feature +11 -4
  306. package/features/identity.federation.feature +210 -33
  307. package/features/identity.otp.feature +101 -0
  308. package/features/identity.roles.feature +53 -4
  309. package/features/identity.tokens.feature +4 -102
  310. package/features/identtiy.tokens.custom.feature +246 -0
  311. package/features/interruptions.feature +19 -0
  312. package/features/introspection.feature +153 -0
  313. package/features/introspection.map.feature +92 -0
  314. package/features/io.feature +0 -1
  315. package/features/io.throttle.feature +165 -0
  316. package/features/map.feature +357 -0
  317. package/features/methods.feature +47 -0
  318. package/features/octets.cloudinary.feature +226 -0
  319. package/features/octets.download.feature +190 -0
  320. package/features/octets.entries.feature +13 -61
  321. package/features/octets.feature +52 -70
  322. package/features/octets.head.feature +40 -0
  323. package/features/octets.location.feature +83 -0
  324. package/features/octets.meta.feature +63 -16
  325. package/features/octets.workflows.feature +333 -68
  326. package/features/passkeys.feature +66 -0
  327. package/features/probes.feature +1 -1
  328. package/features/query.feature +101 -0
  329. package/features/realtime.feature +34 -0
  330. package/features/response.feature +29 -0
  331. package/features/routes.feature +85 -0
  332. package/features/server.feature +21 -0
  333. package/features/steps/.env.example +5 -0
  334. package/features/steps/Captures.ts +12 -0
  335. package/features/steps/Common.ts +4 -0
  336. package/features/steps/Components.ts +14 -0
  337. package/features/steps/Database.ts +6 -2
  338. package/features/steps/Gateway.ts +51 -5
  339. package/features/steps/HTTP.ts +27 -3
  340. package/features/steps/IDP.ts +334 -0
  341. package/features/steps/Identity.ts +51 -0
  342. package/features/steps/OTP.ts +39 -0
  343. package/features/steps/Parameters.ts +94 -2
  344. package/features/steps/Realtime.ts +151 -0
  345. package/features/steps/Workspace.ts +1 -2
  346. package/features/steps/components/audit/manifest.toa.yaml +13 -0
  347. package/features/steps/components/audit/operations/record.js +9 -0
  348. package/features/steps/components/echo/manifest.toa.yaml +17 -0
  349. package/features/steps/components/echo/operations/echo.js +7 -0
  350. package/features/steps/components/echo/operations/parameters.js +7 -0
  351. package/features/steps/components/echo/operations/ping.js +7 -0
  352. package/features/steps/components/echo/operations/unwrap.js +7 -0
  353. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  354. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  355. package/features/steps/components/greeter/manifest.toa.yaml +0 -1
  356. package/features/steps/components/notify/manifest.toa.yaml +13 -0
  357. package/features/steps/components/notify/operations/send.js +9 -0
  358. package/features/steps/components/octets.tester/manifest.toa.yaml +26 -3
  359. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  360. package/features/steps/components/octets.tester/operations/bar.js +0 -1
  361. package/features/steps/components/octets.tester/operations/baz.js +1 -1
  362. package/features/steps/components/octets.tester/operations/echo.js +1 -1
  363. package/features/steps/components/octets.tester/operations/foo.js +2 -2
  364. package/features/steps/components/octets.tester/operations/id.js +7 -0
  365. package/features/steps/components/octets.tester/operations/identity.js +7 -0
  366. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  367. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  368. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  369. package/features/steps/components/orders/manifest.toa.yaml +15 -0
  370. package/features/steps/components/orders/operations/create.js +9 -0
  371. package/features/steps/components/pots/manifest.toa.yaml +15 -4
  372. package/features/steps/components/pricing/manifest.toa.yaml +7 -0
  373. package/features/steps/components/pricing/operations/quote.js +7 -0
  374. package/features/steps/components/sequences/manifest.toa.yaml +0 -1
  375. package/features/steps/components/users/manifest.toa.yaml +4 -2
  376. package/features/steps/components/users/operations/create.js +15 -0
  377. package/features/steps/components/users.properties/manifest.toa.yaml +0 -1
  378. package/features/steps/map.ts +26 -0
  379. package/features/streams.feature +4 -0
  380. package/features/timestamps.feature +41 -0
  381. package/features/timing.feature +2 -22
  382. package/features/tracing.feature +123 -0
  383. package/package.json +35 -24
  384. package/readme.md +25 -1
  385. package/schemas/annotation.cos.yaml +12 -1
  386. package/schemas/io/throttle.cos.yaml +42 -0
  387. package/schemas/method.cos.yaml +2 -1
  388. package/schemas/node.cos.yaml +2 -0
  389. package/schemas/octets/put.cos.yaml +28 -0
  390. package/schemas/query.cos.yaml +7 -10
  391. package/schemas/querystring.cos.yaml +1 -0
  392. package/source/Annotation.ts +3 -1
  393. package/source/Branch.ts +1 -0
  394. package/source/Composition.ts +0 -6
  395. package/source/Context.ts +4 -1
  396. package/source/Directive.test.ts +80 -10
  397. package/source/Directive.ts +88 -15
  398. package/source/Endpoint.ts +113 -25
  399. package/source/Factory.ts +47 -3
  400. package/source/Gateway.ts +188 -13
  401. package/source/HTTP/Context.ts +65 -23
  402. package/source/HTTP/Server.ts +217 -48
  403. package/source/HTTP/Timing.ts +1 -12
  404. package/source/HTTP/exceptions.ts +38 -14
  405. package/source/HTTP/formats/index.ts +4 -5
  406. package/source/HTTP/formats/json.ts +2 -4
  407. package/source/HTTP/formats/msgpack.ts +0 -1
  408. package/source/HTTP/formats/text.ts +2 -4
  409. package/source/HTTP/formats/yaml.test.ts +9 -0
  410. package/source/HTTP/formats/yaml.ts +4 -4
  411. package/source/HTTP/messages.test.ts +70 -7
  412. package/source/HTTP/messages.ts +134 -19
  413. package/source/Interception.ts +8 -0
  414. package/source/Introspection.ts +11 -0
  415. package/source/Mapping.ts +63 -20
  416. package/source/Query.test.ts +3 -3
  417. package/source/Query.ts +107 -17
  418. package/source/RTD/Context.ts +4 -1
  419. package/source/RTD/Directives.ts +14 -1
  420. package/source/RTD/Endpoint.ts +3 -0
  421. package/source/RTD/Method.ts +16 -0
  422. package/source/RTD/Node.ts +65 -23
  423. package/source/RTD/Route.ts +19 -9
  424. package/source/RTD/Tree.ts +39 -9
  425. package/source/RTD/expiration.test.ts +78 -0
  426. package/source/RTD/factory.ts +30 -2
  427. package/source/RTD/segment.ts +2 -0
  428. package/source/RTD/syntax/parse.test.ts +1 -1
  429. package/source/RTD/syntax/parse.ts +37 -24
  430. package/source/RTD/syntax/types.ts +9 -4
  431. package/source/Remotes.test.ts +11 -3
  432. package/source/Remotes.ts +11 -7
  433. package/source/Tenant.ts +39 -12
  434. package/source/const.ts +1 -0
  435. package/source/deployment.ts +21 -13
  436. package/source/directives/auth/Anonymous.ts +3 -3
  437. package/source/directives/auth/Anyone.ts +13 -0
  438. package/source/directives/auth/Assert.ts +35 -0
  439. package/source/directives/auth/Authorization.ts +84 -22
  440. package/source/directives/auth/Delegate.ts +9 -5
  441. package/source/directives/auth/Echo.ts +16 -6
  442. package/source/directives/auth/Federation.ts +84 -0
  443. package/source/directives/auth/Id.ts +1 -1
  444. package/source/directives/auth/Incept.ts +75 -23
  445. package/source/directives/auth/Input.ts +71 -0
  446. package/source/directives/auth/Role.test.ts +2 -3
  447. package/source/directives/auth/Role.ts +6 -11
  448. package/source/directives/auth/Rule.ts +3 -6
  449. package/source/directives/auth/Scheme.ts +5 -5
  450. package/source/directives/auth/create.ts +11 -0
  451. package/source/directives/auth/schemes.ts +5 -2
  452. package/source/directives/auth/split.ts +1 -1
  453. package/source/directives/auth/types.ts +12 -7
  454. package/source/directives/cache/Cache.ts +20 -7
  455. package/source/directives/cache/Control.ts +16 -16
  456. package/source/directives/cors/CORS.ts +35 -18
  457. package/source/directives/dev/Development.ts +14 -7
  458. package/source/directives/dev/Faulty.ts +26 -0
  459. package/source/directives/dev/Sleep.ts +55 -0
  460. package/source/directives/dev/types.ts +1 -1
  461. package/source/directives/flow/Compose.ts +92 -0
  462. package/source/directives/flow/Fetch.ts +86 -0
  463. package/source/directives/flow/Flow.ts +42 -0
  464. package/source/directives/flow/index.ts +3 -0
  465. package/source/directives/flow/types.ts +7 -0
  466. package/source/directives/index.ts +3 -2
  467. package/source/directives/io/Directive.ts +9 -3
  468. package/source/directives/io/IO.ts +38 -10
  469. package/source/directives/io/Input.ts +17 -10
  470. package/source/directives/io/Output.ts +18 -9
  471. package/source/directives/io/Throttle.ts +31 -0
  472. package/source/directives/io/lib/throttle/Configuration.test.ts +60 -0
  473. package/source/directives/io/lib/throttle/Configuration.ts +63 -0
  474. package/source/directives/io/lib/throttle/Keys.ts +41 -0
  475. package/source/directives/io/lib/throttle/Quotas.test.ts +382 -0
  476. package/source/directives/io/lib/throttle/Quotas.ts +183 -0
  477. package/source/directives/io/lib/throttle/Sync.test.ts +153 -0
  478. package/source/directives/io/lib/throttle/Sync.ts +99 -0
  479. package/source/directives/io/lib/throttle/components/Component.ts +6 -0
  480. package/source/directives/io/lib/throttle/components/IP.ts +40 -0
  481. package/source/directives/io/lib/throttle/components/Identity.ts +19 -0
  482. package/source/directives/io/lib/throttle/components/Path.ts +8 -0
  483. package/source/directives/io/lib/throttle/components/Route.ts +19 -0
  484. package/source/directives/io/lib/throttle/components/Segment.ts +19 -0
  485. package/source/directives/io/lib/throttle/components/index.ts +19 -0
  486. package/source/directives/io/lib/throttle/conditions/Condition.ts +5 -0
  487. package/source/directives/io/lib/throttle/conditions/Status.ts +17 -0
  488. package/source/directives/io/lib/throttle/conditions/index.ts +11 -0
  489. package/source/directives/io/lib/throttle/index.ts +3 -0
  490. package/source/directives/io/schemas.test.ts +31 -0
  491. package/source/directives/io/schemas.ts +3 -0
  492. package/source/directives/map/Authority.ts +15 -0
  493. package/source/directives/map/Buffer.ts +15 -0
  494. package/source/directives/map/Claims.ts +58 -0
  495. package/source/directives/map/Directive.ts +4 -0
  496. package/source/directives/map/Headers.ts +38 -0
  497. package/source/directives/map/Language.ts +42 -0
  498. package/source/directives/map/Languages.ts +11 -0
  499. package/source/directives/map/Map.ts +63 -0
  500. package/source/directives/map/Mapping.ts +19 -0
  501. package/source/directives/{vary → map}/Properties.ts +2 -4
  502. package/source/directives/map/Segments.ts +33 -0
  503. package/source/directives/map/index.ts +3 -0
  504. package/source/directives/octets/Context.ts +3 -2
  505. package/source/directives/octets/Delete.ts +22 -19
  506. package/source/directives/octets/Get.ts +96 -0
  507. package/source/directives/octets/Octets.ts +11 -13
  508. package/source/directives/octets/Put.ts +138 -0
  509. package/source/directives/octets/Workflow.ts +9 -3
  510. package/source/directives/octets/bytes.test.ts +30 -0
  511. package/source/directives/octets/bytes.ts +18 -0
  512. package/source/directives/octets/schemas.ts +4 -8
  513. package/source/directives/octets/types.ts +2 -0
  514. package/source/directives/octets/workflows/Execution.ts +64 -8
  515. package/source/directives/octets/workflows/Workflow.ts +18 -7
  516. package/source/directives/octets/workflows/index.ts +1 -1
  517. package/source/exceptions.ts +16 -4
  518. package/source/manifest.ts +10 -11
  519. package/source/root.ts +16 -1
  520. package/transpiled/Annotation.d.ts +2 -1
  521. package/transpiled/Branch.d.ts +1 -0
  522. package/transpiled/Composition.d.ts +0 -1
  523. package/transpiled/Composition.js +0 -4
  524. package/transpiled/Composition.js.map +1 -1
  525. package/transpiled/Context.d.ts +2 -1
  526. package/transpiled/Directive.d.ts +8 -1
  527. package/transpiled/Directive.js +65 -14
  528. package/transpiled/Directive.js.map +1 -1
  529. package/transpiled/Endpoint.d.ts +8 -4
  530. package/transpiled/Endpoint.js +78 -19
  531. package/transpiled/Endpoint.js.map +1 -1
  532. package/transpiled/Factory.d.ts +1 -1
  533. package/transpiled/Factory.js +36 -2
  534. package/transpiled/Factory.js.map +1 -1
  535. package/transpiled/Gateway.d.ts +24 -0
  536. package/transpiled/Gateway.js +138 -13
  537. package/transpiled/Gateway.js.map +1 -1
  538. package/transpiled/HTTP/Context.d.ts +7 -3
  539. package/transpiled/HTTP/Context.js +51 -20
  540. package/transpiled/HTTP/Context.js.map +1 -1
  541. package/transpiled/HTTP/Server.d.ts +9 -4
  542. package/transpiled/HTTP/Server.js +170 -38
  543. package/transpiled/HTTP/Server.js.map +1 -1
  544. package/transpiled/HTTP/Timing.d.ts +0 -2
  545. package/transpiled/HTTP/Timing.js +0 -8
  546. package/transpiled/HTTP/Timing.js.map +1 -1
  547. package/transpiled/HTTP/exceptions.d.ts +21 -9
  548. package/transpiled/HTTP/exceptions.js +40 -18
  549. package/transpiled/HTTP/exceptions.js.map +1 -1
  550. package/transpiled/HTTP/formats/index.d.ts +2 -2
  551. package/transpiled/HTTP/formats/index.js +3 -3
  552. package/transpiled/HTTP/formats/index.js.map +1 -1
  553. package/transpiled/HTTP/formats/json.d.ts +2 -2
  554. package/transpiled/HTTP/formats/json.js +3 -4
  555. package/transpiled/HTTP/formats/json.js.map +1 -1
  556. package/transpiled/HTTP/formats/msgpack.d.ts +1 -1
  557. package/transpiled/HTTP/formats/msgpack.js.map +1 -1
  558. package/transpiled/HTTP/formats/text.d.ts +2 -2
  559. package/transpiled/HTTP/formats/text.js +3 -4
  560. package/transpiled/HTTP/formats/text.js.map +1 -1
  561. package/transpiled/HTTP/formats/yaml.d.ts +2 -2
  562. package/transpiled/HTTP/formats/yaml.js +5 -5
  563. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  564. package/transpiled/HTTP/messages.d.ts +6 -1
  565. package/transpiled/HTTP/messages.js +118 -13
  566. package/transpiled/HTTP/messages.js.map +1 -1
  567. package/transpiled/Interception.d.ts +2 -0
  568. package/transpiled/Interception.js +4 -0
  569. package/transpiled/Interception.js.map +1 -1
  570. package/transpiled/Introspection.d.ts +9 -0
  571. package/transpiled/Introspection.js +3 -0
  572. package/transpiled/Introspection.js.map +1 -0
  573. package/transpiled/Mapping.d.ts +11 -2
  574. package/transpiled/Mapping.js +47 -18
  575. package/transpiled/Mapping.js.map +1 -1
  576. package/transpiled/Query.d.ts +11 -1
  577. package/transpiled/Query.js +78 -14
  578. package/transpiled/Query.js.map +1 -1
  579. package/transpiled/RTD/Context.d.ts +3 -1
  580. package/transpiled/RTD/Directives.d.ts +11 -1
  581. package/transpiled/RTD/Endpoint.d.ts +1 -0
  582. package/transpiled/RTD/Method.d.ts +4 -0
  583. package/transpiled/RTD/Method.js +11 -0
  584. package/transpiled/RTD/Method.js.map +1 -1
  585. package/transpiled/RTD/Node.d.ts +13 -2
  586. package/transpiled/RTD/Node.js +46 -17
  587. package/transpiled/RTD/Node.js.map +1 -1
  588. package/transpiled/RTD/Route.d.ts +5 -4
  589. package/transpiled/RTD/Route.js +10 -4
  590. package/transpiled/RTD/Route.js.map +1 -1
  591. package/transpiled/RTD/Tree.d.ts +8 -1
  592. package/transpiled/RTD/Tree.js +29 -3
  593. package/transpiled/RTD/Tree.js.map +1 -1
  594. package/transpiled/RTD/factory.d.ts +1 -0
  595. package/transpiled/RTD/factory.js +24 -3
  596. package/transpiled/RTD/factory.js.map +1 -1
  597. package/transpiled/RTD/segment.d.ts +1 -0
  598. package/transpiled/RTD/segment.js +2 -0
  599. package/transpiled/RTD/segment.js.map +1 -1
  600. package/transpiled/RTD/syntax/parse.js +34 -22
  601. package/transpiled/RTD/syntax/parse.js.map +1 -1
  602. package/transpiled/RTD/syntax/types.d.ts +8 -3
  603. package/transpiled/RTD/syntax/types.js +1 -1
  604. package/transpiled/RTD/syntax/types.js.map +1 -1
  605. package/transpiled/Remotes.d.ts +4 -4
  606. package/transpiled/Remotes.js +9 -6
  607. package/transpiled/Remotes.js.map +1 -1
  608. package/transpiled/Tenant.d.ts +9 -4
  609. package/transpiled/Tenant.js +26 -7
  610. package/transpiled/Tenant.js.map +1 -1
  611. package/transpiled/const.d.ts +1 -0
  612. package/transpiled/const.js +5 -0
  613. package/transpiled/const.js.map +1 -0
  614. package/transpiled/deployment.js +17 -11
  615. package/transpiled/deployment.js.map +1 -1
  616. package/transpiled/directives/auth/Anonymous.d.ts +2 -2
  617. package/transpiled/directives/auth/Anonymous.js +2 -2
  618. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  619. package/transpiled/directives/auth/Anyone.d.ts +6 -0
  620. package/transpiled/directives/auth/Anyone.js +14 -0
  621. package/transpiled/directives/auth/Anyone.js.map +1 -0
  622. package/transpiled/directives/auth/Assert.d.ts +7 -0
  623. package/transpiled/directives/auth/Assert.js +57 -0
  624. package/transpiled/directives/auth/Assert.js.map +1 -0
  625. package/transpiled/directives/auth/Authorization.d.ts +5 -3
  626. package/transpiled/directives/auth/Authorization.js +67 -21
  627. package/transpiled/directives/auth/Authorization.js.map +1 -1
  628. package/transpiled/directives/auth/Delegate.d.ts +5 -4
  629. package/transpiled/directives/auth/Delegate.js +7 -3
  630. package/transpiled/directives/auth/Delegate.js.map +1 -1
  631. package/transpiled/directives/auth/Echo.d.ts +4 -4
  632. package/transpiled/directives/auth/Echo.js +11 -4
  633. package/transpiled/directives/auth/Echo.js.map +1 -1
  634. package/transpiled/directives/auth/Federation.d.ts +16 -0
  635. package/transpiled/directives/auth/Federation.js +57 -0
  636. package/transpiled/directives/auth/Federation.js.map +1 -0
  637. package/transpiled/directives/auth/Id.d.ts +1 -1
  638. package/transpiled/directives/auth/Id.js.map +1 -1
  639. package/transpiled/directives/auth/Incept.d.ts +8 -5
  640. package/transpiled/directives/auth/Incept.js +56 -18
  641. package/transpiled/directives/auth/Incept.js.map +1 -1
  642. package/transpiled/directives/auth/Input.d.ts +13 -0
  643. package/transpiled/directives/auth/Input.js +49 -0
  644. package/transpiled/directives/auth/Input.js.map +1 -0
  645. package/transpiled/directives/auth/Role.d.ts +1 -1
  646. package/transpiled/directives/auth/Role.js +4 -6
  647. package/transpiled/directives/auth/Role.js.map +1 -1
  648. package/transpiled/directives/auth/Rule.d.ts +2 -4
  649. package/transpiled/directives/auth/Rule.js +2 -2
  650. package/transpiled/directives/auth/Rule.js.map +1 -1
  651. package/transpiled/directives/auth/Scheme.d.ts +2 -2
  652. package/transpiled/directives/auth/Scheme.js +4 -4
  653. package/transpiled/directives/auth/Scheme.js.map +1 -1
  654. package/transpiled/directives/auth/create.d.ts +2 -0
  655. package/transpiled/directives/auth/create.js +14 -0
  656. package/transpiled/directives/auth/create.js.map +1 -0
  657. package/transpiled/directives/auth/schemes.d.ts +2 -1
  658. package/transpiled/directives/auth/schemes.js +5 -2
  659. package/transpiled/directives/auth/schemes.js.map +1 -1
  660. package/transpiled/directives/auth/split.js +1 -1
  661. package/transpiled/directives/auth/split.js.map +1 -1
  662. package/transpiled/directives/auth/types.d.ts +10 -7
  663. package/transpiled/directives/cache/Cache.d.ts +3 -3
  664. package/transpiled/directives/cache/Cache.js +15 -4
  665. package/transpiled/directives/cache/Cache.js.map +1 -1
  666. package/transpiled/directives/cache/Control.d.ts +2 -2
  667. package/transpiled/directives/cache/Control.js +12 -12
  668. package/transpiled/directives/cache/Control.js.map +1 -1
  669. package/transpiled/directives/cors/CORS.d.ts +8 -1
  670. package/transpiled/directives/cors/CORS.js +30 -16
  671. package/transpiled/directives/cors/CORS.js.map +1 -1
  672. package/transpiled/directives/dev/Development.d.ts +1 -1
  673. package/transpiled/directives/dev/Development.js +15 -7
  674. package/transpiled/directives/dev/Development.js.map +1 -1
  675. package/transpiled/directives/dev/Faulty.d.ts +8 -0
  676. package/transpiled/directives/dev/Faulty.js +26 -0
  677. package/transpiled/directives/dev/Faulty.js.map +1 -0
  678. package/transpiled/directives/dev/Sleep.d.ts +9 -0
  679. package/transpiled/directives/dev/Sleep.js +48 -0
  680. package/transpiled/directives/dev/Sleep.js.map +1 -0
  681. package/transpiled/directives/dev/types.d.ts +1 -1
  682. package/transpiled/directives/flow/Compose.d.ts +9 -0
  683. package/transpiled/directives/flow/Compose.js +94 -0
  684. package/transpiled/directives/flow/Compose.js.map +1 -0
  685. package/transpiled/directives/flow/Fetch.d.ts +12 -0
  686. package/transpiled/directives/flow/Fetch.js +58 -0
  687. package/transpiled/directives/flow/Fetch.js.map +1 -0
  688. package/transpiled/directives/flow/Flow.d.ts +10 -0
  689. package/transpiled/directives/flow/Flow.js +33 -0
  690. package/transpiled/directives/flow/Flow.js.map +1 -0
  691. package/transpiled/directives/flow/index.d.ts +2 -0
  692. package/transpiled/directives/flow/index.js +6 -0
  693. package/transpiled/directives/flow/index.js.map +1 -0
  694. package/transpiled/directives/flow/types.d.ts +6 -0
  695. package/transpiled/directives/flow/types.js.map +1 -0
  696. package/transpiled/directives/index.js +3 -2
  697. package/transpiled/directives/index.js.map +1 -1
  698. package/transpiled/directives/io/Directive.d.ts +8 -3
  699. package/transpiled/directives/io/IO.d.ts +14 -4
  700. package/transpiled/directives/io/IO.js +28 -7
  701. package/transpiled/directives/io/IO.js.map +1 -1
  702. package/transpiled/directives/io/Input.d.ts +2 -2
  703. package/transpiled/directives/io/Input.js +13 -7
  704. package/transpiled/directives/io/Input.js.map +1 -1
  705. package/transpiled/directives/io/Output.d.ts +3 -1
  706. package/transpiled/directives/io/Output.js +12 -6
  707. package/transpiled/directives/io/Output.js.map +1 -1
  708. package/transpiled/directives/io/Throttle.d.ts +11 -0
  709. package/transpiled/directives/io/Throttle.js +49 -0
  710. package/transpiled/directives/io/Throttle.js.map +1 -0
  711. package/transpiled/directives/io/lib/throttle/Configuration.d.ts +26 -0
  712. package/transpiled/directives/io/lib/throttle/Configuration.js +29 -0
  713. package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -0
  714. package/transpiled/directives/io/lib/throttle/Keys.d.ts +13 -0
  715. package/transpiled/directives/io/lib/throttle/Keys.js +31 -0
  716. package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -0
  717. package/transpiled/directives/io/lib/throttle/Quotas.d.ts +69 -0
  718. package/transpiled/directives/io/lib/throttle/Quotas.js +138 -0
  719. package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -0
  720. package/transpiled/directives/io/lib/throttle/Sync.d.ts +30 -0
  721. package/transpiled/directives/io/lib/throttle/Sync.js +76 -0
  722. package/transpiled/directives/io/lib/throttle/Sync.js.map +1 -0
  723. package/transpiled/directives/io/lib/throttle/components/Component.d.ts +5 -0
  724. package/transpiled/directives/io/lib/throttle/components/Component.js +3 -0
  725. package/transpiled/directives/io/lib/throttle/components/Component.js.map +1 -0
  726. package/transpiled/directives/io/lib/throttle/components/IP.d.ts +6 -0
  727. package/transpiled/directives/io/lib/throttle/components/IP.js +33 -0
  728. package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -0
  729. package/transpiled/directives/io/lib/throttle/components/Identity.d.ts +11 -0
  730. package/transpiled/directives/io/lib/throttle/components/Identity.js +16 -0
  731. package/transpiled/directives/io/lib/throttle/components/Identity.js.map +1 -0
  732. package/transpiled/directives/io/lib/throttle/components/Path.d.ts +5 -0
  733. package/transpiled/directives/io/lib/throttle/components/Path.js +10 -0
  734. package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -0
  735. package/transpiled/directives/io/lib/throttle/components/Route.d.ts +12 -0
  736. package/transpiled/directives/io/lib/throttle/components/Route.js +20 -0
  737. package/transpiled/directives/io/lib/throttle/components/Route.js.map +1 -0
  738. package/transpiled/directives/io/lib/throttle/components/Segment.d.ts +9 -0
  739. package/transpiled/directives/io/lib/throttle/components/Segment.js +20 -0
  740. package/transpiled/directives/io/lib/throttle/components/Segment.js.map +1 -0
  741. package/transpiled/directives/io/lib/throttle/components/index.d.ts +5 -0
  742. package/transpiled/directives/io/lib/throttle/components/index.js +16 -0
  743. package/transpiled/directives/io/lib/throttle/components/index.js.map +1 -0
  744. package/transpiled/directives/io/lib/throttle/conditions/Condition.d.ts +4 -0
  745. package/transpiled/directives/io/lib/throttle/conditions/Condition.js +3 -0
  746. package/transpiled/directives/io/lib/throttle/conditions/Condition.js.map +1 -0
  747. package/transpiled/directives/io/lib/throttle/conditions/Status.d.ts +7 -0
  748. package/transpiled/directives/io/lib/throttle/conditions/Status.js +19 -0
  749. package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -0
  750. package/transpiled/directives/io/lib/throttle/conditions/index.d.ts +5 -0
  751. package/transpiled/directives/io/lib/throttle/conditions/index.js +8 -0
  752. package/transpiled/directives/io/lib/throttle/conditions/index.js.map +1 -0
  753. package/transpiled/directives/io/lib/throttle/index.d.ts +3 -0
  754. package/transpiled/directives/io/lib/throttle/index.js +10 -0
  755. package/transpiled/directives/io/lib/throttle/index.js.map +1 -0
  756. package/transpiled/directives/io/schemas.d.ts +2 -0
  757. package/transpiled/directives/io/schemas.js +2 -1
  758. package/transpiled/directives/io/schemas.js.map +1 -1
  759. package/transpiled/directives/map/Authority.d.ts +6 -0
  760. package/transpiled/directives/map/Authority.js +19 -0
  761. package/transpiled/directives/map/Authority.js.map +1 -0
  762. package/transpiled/directives/map/Buffer.d.ts +6 -0
  763. package/transpiled/directives/map/Buffer.js +19 -0
  764. package/transpiled/directives/map/Buffer.js.map +1 -0
  765. package/transpiled/directives/map/Claims.d.ts +10 -0
  766. package/transpiled/directives/map/Claims.js +44 -0
  767. package/transpiled/directives/map/Claims.js.map +1 -0
  768. package/transpiled/directives/map/Directive.d.ts +3 -0
  769. package/transpiled/directives/map/Directive.js.map +1 -0
  770. package/transpiled/directives/map/Headers.d.ts +7 -0
  771. package/transpiled/directives/map/Headers.js +34 -0
  772. package/transpiled/directives/map/Headers.js.map +1 -0
  773. package/transpiled/directives/map/Language.d.ts +10 -0
  774. package/transpiled/directives/map/Language.js +38 -0
  775. package/transpiled/directives/map/Language.js.map +1 -0
  776. package/transpiled/directives/map/Languages.d.ts +4 -0
  777. package/transpiled/directives/map/Languages.js +17 -0
  778. package/transpiled/directives/map/Languages.js.map +1 -0
  779. package/transpiled/directives/map/Map.d.ts +13 -0
  780. package/transpiled/directives/map/Map.js +48 -0
  781. package/transpiled/directives/map/Map.js.map +1 -0
  782. package/transpiled/directives/map/Mapping.d.ts +13 -0
  783. package/transpiled/directives/map/Mapping.js +13 -0
  784. package/transpiled/directives/map/Mapping.js.map +1 -0
  785. package/transpiled/directives/{vary → map}/Properties.d.ts +2 -2
  786. package/transpiled/directives/{vary → map}/Properties.js +1 -3
  787. package/transpiled/directives/map/Properties.js.map +1 -0
  788. package/transpiled/directives/map/Segments.d.ts +6 -0
  789. package/transpiled/directives/map/Segments.js +30 -0
  790. package/transpiled/directives/map/Segments.js.map +1 -0
  791. package/transpiled/directives/map/index.d.ts +2 -0
  792. package/transpiled/directives/map/index.js +6 -0
  793. package/transpiled/directives/map/index.js.map +1 -0
  794. package/transpiled/directives/octets/Context.js +4 -24
  795. package/transpiled/directives/octets/Context.js.map +1 -1
  796. package/transpiled/directives/octets/Delete.js +15 -12
  797. package/transpiled/directives/octets/Delete.js.map +1 -1
  798. package/transpiled/directives/octets/{Fetch.d.ts → Get.d.ts} +5 -6
  799. package/transpiled/directives/octets/{Fetch.js → Get.js} +34 -30
  800. package/transpiled/directives/octets/Get.js.map +1 -0
  801. package/transpiled/directives/octets/Octets.js +10 -11
  802. package/transpiled/directives/octets/Octets.js.map +1 -1
  803. package/transpiled/directives/octets/{Store.d.ts → Put.d.ts} +8 -2
  804. package/transpiled/directives/octets/{Store.js → Put.js} +33 -27
  805. package/transpiled/directives/octets/Put.js.map +1 -0
  806. package/transpiled/directives/octets/Workflow.js +7 -2
  807. package/transpiled/directives/octets/Workflow.js.map +1 -1
  808. package/transpiled/directives/octets/bytes.d.ts +1 -0
  809. package/transpiled/directives/octets/bytes.js +21 -0
  810. package/transpiled/directives/octets/bytes.js.map +1 -0
  811. package/transpiled/directives/octets/schemas.d.ts +4 -8
  812. package/transpiled/directives/octets/schemas.js +3 -6
  813. package/transpiled/directives/octets/schemas.js.map +1 -1
  814. package/transpiled/directives/octets/types.d.ts +2 -0
  815. package/transpiled/directives/octets/workflows/Execution.d.ts +7 -1
  816. package/transpiled/directives/octets/workflows/Execution.js +46 -9
  817. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  818. package/transpiled/directives/octets/workflows/Workflow.d.ts +8 -3
  819. package/transpiled/directives/octets/workflows/Workflow.js +10 -4
  820. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  821. package/transpiled/directives/octets/workflows/index.d.ts +1 -1
  822. package/transpiled/directives/octets/workflows/index.js.map +1 -1
  823. package/transpiled/exceptions.js +11 -2
  824. package/transpiled/exceptions.js.map +1 -1
  825. package/transpiled/manifest.js +10 -11
  826. package/transpiled/manifest.js.map +1 -1
  827. package/transpiled/root.js +16 -1
  828. package/transpiled/root.js.map +1 -1
  829. package/transpiled/tsconfig.tsbuildinfo +1 -1
  830. package/components/identity.federation/operations/lib/assertions-as-values.d.ts +0 -4
  831. package/components/identity.federation/operations/lib/assertions-as-values.js.map +0 -1
  832. package/components/identity.federation/operations/lib/jwt.d.ts +0 -20
  833. package/components/identity.federation/operations/lib/jwt.js +0 -136
  834. package/components/identity.federation/operations/lib/jwt.js.map +0 -1
  835. package/components/identity.federation/operations/schemas.d.ts +0 -63
  836. package/components/identity.federation/operations/schemas.js +0 -9
  837. package/components/identity.federation/operations/schemas.js.map +0 -1
  838. package/components/identity.federation/operations/types.d.ts +0 -56
  839. package/components/identity.federation/operations/types.js.map +0 -1
  840. package/components/identity.federation/source/lib/assertions-as-values.ts +0 -19
  841. package/components/identity.federation/source/lib/jwt.test.ts +0 -56
  842. package/components/identity.federation/source/lib/jwt.ts +0 -171
  843. package/components/identity.federation/source/schemas.ts +0 -65
  844. package/components/identity.federation/source/types.ts +0 -62
  845. package/components/identity.tokens/operations/types.d.ts +0 -46
  846. package/components/identity.tokens/operations/types.js.map +0 -1
  847. package/components/identity.tokens/source/types.ts +0 -55
  848. package/components/octets.storage/manifest.toa.yaml +0 -21
  849. package/components/octets.storage/operations/fetch.js +0 -46
  850. package/components/octets.storage/operations/get.js +0 -7
  851. package/components/octets.storage/operations/list.js +0 -7
  852. package/components/octets.storage/operations/store.js +0 -11
  853. package/documentation/vary.md +0 -69
  854. package/features/steps/IdP.ts +0 -154
  855. package/features/steps/components/octets.tester/operations/diversify.js +0 -14
  856. package/features/vary.feature +0 -252
  857. package/schemas/octets/context.cos.yaml +0 -1
  858. package/schemas/octets/fetch.cos.yaml +0 -3
  859. package/schemas/octets/permute.cos.yaml +0 -1
  860. package/schemas/octets/store.cos.yaml +0 -3
  861. package/source/directives/octets/Fetch.ts +0 -100
  862. package/source/directives/octets/List.ts +0 -72
  863. package/source/directives/octets/Store.ts +0 -126
  864. package/source/directives/vary/Directive.ts +0 -7
  865. package/source/directives/vary/Embed.ts +0 -68
  866. package/source/directives/vary/Vary.ts +0 -50
  867. package/source/directives/vary/embeddings/Authority.ts +0 -8
  868. package/source/directives/vary/embeddings/Embedding.ts +0 -7
  869. package/source/directives/vary/embeddings/Header.ts +0 -32
  870. package/source/directives/vary/embeddings/Language.ts +0 -31
  871. package/source/directives/vary/embeddings/Parameter.ts +0 -14
  872. package/source/directives/vary/embeddings/index.ts +0 -13
  873. package/source/directives/vary/index.ts +0 -3
  874. package/transpiled/directives/octets/Fetch.js.map +0 -1
  875. package/transpiled/directives/octets/List.d.ts +0 -16
  876. package/transpiled/directives/octets/List.js +0 -74
  877. package/transpiled/directives/octets/List.js.map +0 -1
  878. package/transpiled/directives/octets/Store.js.map +0 -1
  879. package/transpiled/directives/vary/Directive.d.ts +0 -6
  880. package/transpiled/directives/vary/Directive.js.map +0 -1
  881. package/transpiled/directives/vary/Embed.d.ts +0 -11
  882. package/transpiled/directives/vary/Embed.js +0 -51
  883. package/transpiled/directives/vary/Embed.js.map +0 -1
  884. package/transpiled/directives/vary/Properties.js.map +0 -1
  885. package/transpiled/directives/vary/Vary.d.ts +0 -10
  886. package/transpiled/directives/vary/Vary.js +0 -36
  887. package/transpiled/directives/vary/Vary.js.map +0 -1
  888. package/transpiled/directives/vary/embeddings/Authority.d.ts +0 -5
  889. package/transpiled/directives/vary/embeddings/Authority.js +0 -10
  890. package/transpiled/directives/vary/embeddings/Authority.js.map +0 -1
  891. package/transpiled/directives/vary/embeddings/Embedding.d.ts +0 -6
  892. package/transpiled/directives/vary/embeddings/Embedding.js.map +0 -1
  893. package/transpiled/directives/vary/embeddings/Header.d.ts +0 -7
  894. package/transpiled/directives/vary/embeddings/Header.js +0 -28
  895. package/transpiled/directives/vary/embeddings/Header.js.map +0 -1
  896. package/transpiled/directives/vary/embeddings/Language.d.ts +0 -7
  897. package/transpiled/directives/vary/embeddings/Language.js +0 -28
  898. package/transpiled/directives/vary/embeddings/Language.js.map +0 -1
  899. package/transpiled/directives/vary/embeddings/Parameter.d.ts +0 -7
  900. package/transpiled/directives/vary/embeddings/Parameter.js +0 -14
  901. package/transpiled/directives/vary/embeddings/Parameter.js.map +0 -1
  902. package/transpiled/directives/vary/embeddings/index.d.ts +0 -5
  903. package/transpiled/directives/vary/embeddings/index.js +0 -14
  904. package/transpiled/directives/vary/embeddings/index.js.map +0 -1
  905. package/transpiled/directives/vary/index.d.ts +0 -2
  906. package/transpiled/directives/vary/index.js +0 -6
  907. package/transpiled/directives/vary/index.js.map +0 -1
  908. /package/components/{octets.storage → exposition.octets}/operations/delete.js +0 -0
  909. /package/components/{identity.federation/operations → identity.tokens/operations/lib}/types.js +0 -0
  910. /package/schemas/octets/{list.cos.yaml → get.cos.yaml} +0 -0
  911. /package/{components/identity.tokens/operations → transpiled/directives/flow}/types.js +0 -0
  912. /package/transpiled/directives/{vary → map}/Directive.js +0 -0
@@ -0,0 +1,97 @@
1
+ import type { Call, Maybe, Observation, telemetry } from '@toa.io/types'
2
+
3
+ export interface Context {
4
+ local: {
5
+ observe: Observation<Entity>
6
+ encrypt: Call<Maybe<string>, EncryptInput>
7
+ decrypt: Call<Maybe<DecryptOutput>, string>
8
+ }
9
+ remote: {
10
+ identity: {
11
+ keys: {
12
+ observe: Observation<CustomKey>
13
+ create: Call<Key>
14
+ }
15
+ roles: {
16
+ list: Call<string[]>
17
+ }
18
+ }
19
+ }
20
+ configuration: Configuration
21
+ logs: telemetry.Logs
22
+ }
23
+
24
+ export interface Configuration {
25
+ readonly keys: ConfiguredKey[]
26
+ readonly lifetime: number
27
+ readonly refresh: number
28
+ readonly cache: {
29
+ max: number
30
+ ttl: number
31
+ }
32
+ }
33
+
34
+ export interface ConfiguredKey extends Pick<Key, 'id' | 'key'> {
35
+ format?: 'jwe' | 'paseto'
36
+ }
37
+
38
+ export interface Entity {
39
+ revokedAt?: number
40
+ }
41
+
42
+ export interface Identity extends Record<string, any> {
43
+ id: string
44
+ roles: string[]
45
+ permissions?: Record<string, string[]>
46
+ }
47
+
48
+ export interface AuthenticateInput {
49
+ authority: string
50
+ credentials: string
51
+ }
52
+
53
+ export interface AuthenticateOutput {
54
+ identity: Identity
55
+ refresh: boolean
56
+ }
57
+
58
+ export interface EncryptInput {
59
+ authority: string
60
+ identity: Identity
61
+ lifetime?: number
62
+ scopes?: string[]
63
+ permissions?: Record<string, string[]>
64
+ key?: Key
65
+ }
66
+
67
+ export interface DecryptOutput {
68
+ iss: string
69
+ iat: string
70
+ exp?: string
71
+ identity: Identity
72
+ refresh: boolean
73
+ }
74
+
75
+ export interface Claims {
76
+ identity: Identity
77
+ iss: string
78
+ iat: string
79
+ exp?: string
80
+ }
81
+
82
+ export interface JWEClaims {
83
+ identity: Identity
84
+ iss: string
85
+ iat: number
86
+ exp?: number
87
+ }
88
+
89
+ export interface Key {
90
+ id: string
91
+ key: string
92
+ label: string
93
+ }
94
+
95
+ export interface CustomKey extends Key {
96
+ identity: string
97
+ }
@@ -1,5 +1,5 @@
1
- import { type Entity } from './types'
1
+ import type { Entity } from './lib'
2
2
 
3
- export function transition (_: never, object: Entity): void {
3
+ export function transition (_: unknown, object: Entity): void {
4
4
  object.revokedAt = Date.now()
5
5
  }
@@ -1,7 +1,6 @@
1
1
  # used for development only
2
2
 
3
3
  name: exposition
4
- packages: '*'
5
4
  registry: localhost
6
5
 
7
6
  amqp: amqp://localhost
@@ -9,7 +8,12 @@ mongodb: mongodb://localhost
9
8
 
10
9
  configuration:
11
10
  identity.tokens:
12
- key0: k3.local.pIZT8-9Fa6U_QtfQHOSStfGtmyzPINyKQq2Xk-hd7vA
11
+ keys:
12
+ - id: key0
13
+ key: sTxL6qVOadKkUJwh3FveU53XgTEo3Sdfg7k2FfiIKfs
14
+ - id: legacy0
15
+ key: k3.local.pIZT8-9Fa6U_QtfQHOSStfGtmyzPINyKQq2Xk-hd7vA
16
+ format: paseto
13
17
 
14
18
  identity.federation:
15
19
  trust:
package/cucumber.js CHANGED
@@ -1,6 +1,6 @@
1
1
  module.exports = {
2
2
  default: {
3
- requireModule: ['ts-node/register'],
3
+ requireModule: ['ts-node/register/transpile-only'],
4
4
  require: ['./features/**/*.ts'],
5
5
  failFast: true
6
6
  }
@@ -25,7 +25,11 @@ responds with an authorization error.
25
25
  Grants access if its value is `true` and no credentials were provided[^1].
26
26
 
27
27
  [^1]: Credentials in the request make the
28
- response [non-cachable](https://datatracker.ietf.org/doc/html/rfc7234#section-3).
28
+ response [non-cacheable](https://datatracker.ietf.org/doc/html/rfc7234#section-3).
29
+
30
+ ### `anyone`
31
+
32
+ Grants access if its value is `true` and valid credentials were provided.
29
33
 
30
34
  ### `id`
31
35
 
@@ -37,11 +41,8 @@ the directive's value.
37
41
  Given the Route declaration and corresponding HTTP request:
38
42
 
39
43
  ```yaml
40
- # context.toa.yaml
41
-
42
- exposition:
43
- /users/:user-id:
44
- id: "user-id"
44
+ /users/:user-id:
45
+ id: "user-id"
45
46
  ```
46
47
 
47
48
  ```http
@@ -57,11 +58,8 @@ is `87480f2bd88048518c529d7957475ecd`.
57
58
  Grants access if resolved Identity has a role matching the directive's value or one of its values.
58
59
 
59
60
  ```yaml
60
- # context.toa.yaml
61
-
62
- exposition:
63
- /code:
64
- role: [developer, reviewer]
61
+ /code:
62
+ role: [developer, reviewer]
65
63
  ```
66
64
 
67
65
  Access will be granted if the resolved Identity has a role that matches `developer` or `reviewer`.
@@ -73,11 +71,50 @@ Read [Roles](#roles) section for more details.
73
71
  The `role` directive can be used with a placeholder in the route.
74
72
 
75
73
  ```yaml
76
- # context.toa.yaml
74
+ /:org-id:
75
+ role: app:{org-id}:moderator
76
+ ```
77
77
 
78
- exposition:
79
- /:org-id:
80
- role: app:{org-id}:moderator
78
+ ### `claims`
79
+
80
+ Grants access if `Bearer` authentication scheme is used
81
+ and the Token's claims matches the specified values.
82
+
83
+ ```yaml
84
+ /:
85
+ auth:claims:
86
+ iss: https://id.example.com
87
+ sub: someone
88
+ aud: stars
89
+ ```
90
+
91
+ > If OIDC token claim contains `aud`
92
+ > as [an array](https://openid.net/specs/openid-connect-core-1_0.html#IDTokenValidation), the
93
+ > directive will match if at least one value.
94
+
95
+ At least one property is required.
96
+
97
+ Values may refer to the Route parameters or the request authority:
98
+
99
+ ```yaml
100
+ /secrets/:org-id:
101
+ auth:claims:
102
+ iss: https://id.org.com
103
+ sub: /:org-id
104
+ aud: :authority
105
+ ```
106
+
107
+ An expression `:domain` will match if the domain in the value of `iss` matches the request
108
+ authority, excluding the most specific subdomain.
109
+
110
+ Issuer `https://accounts.example.com` matches request authorities `images.example.com`
111
+ and `sub.images.example.com`, but not `images.another.com`.
112
+
113
+ ```yaml
114
+ /images/:user-id:
115
+ auth:claims:
116
+ iss: :domain
117
+ sub: /:org-id
81
118
  ```
82
119
 
83
120
  ### `rule`
@@ -88,17 +125,34 @@ directives grant access. The value of the `rule` directive can be a single Rule
88
125
  #### Example
89
126
 
90
127
  ```yaml
91
- # context.toa.yaml
92
-
93
- exposition:
94
- /commits/:user-id:
95
- rule:
96
- id: user-id
97
- role: developer
128
+ /commits/:user-id:
129
+ rule:
130
+ id: user-id
131
+ role: developer
98
132
  ```
99
133
 
100
134
  Access will be granted if an Identity matches a `user-id` placeholder and has a Role of `developer`.
101
135
 
136
+ ### `input`
137
+
138
+ Restricts access based on the request body (which must be an object).
139
+
140
+ ```yaml
141
+ /commits/:id:
142
+ PUT:
143
+ auth:role: [developer, reviewer]
144
+ auth:input:
145
+ - prop: approved
146
+ role: reviewer
147
+ - prop: message
148
+ role: developer
149
+ ```
150
+
151
+ The example above restricts access to the `approved` property of the request body to the identity
152
+ with the `reviewer` role, and the `message` property to the identity with the `developer` role.
153
+
154
+ > `auth:input` directive does not grant access by itself.
155
+
102
156
  ### `delegate`
103
157
 
104
158
  Embeds the value of the current Identity into the request body as a property named after the value
@@ -124,11 +178,8 @@ directive.
124
178
  #### Example
125
179
 
126
180
  ```yaml
127
- # context.toa.yaml
128
-
129
- /exposition:
130
- /commits/:user-id:
131
- role: developer:senior
181
+ /commits/:user-id:
182
+ role: developer:senior
132
183
  ```
133
184
 
134
185
  The example above defines a `role` directive with the specified `developer:senior` Role Scope.
@@ -17,16 +17,9 @@ exposition:
17
17
  two: the.two.com
18
18
  ```
19
19
 
20
- ## Ingress
20
+ ## Mappings
21
21
 
22
- Each host in the authority definition is used to create a Kubernetes Ingress resource.
23
-
24
- > If the application is accessed with the `:authority` that does not match the authority definition,
25
- > the response with `404` status code is returned.
26
-
27
- ## Embedding
28
-
29
- To pass the requested authority to the operation call, [`vary:embed` directive](vary.md#embeddings)
22
+ To pass the requested authority to the operation call, [`map:authority` directive](map.md#authority)
30
23
  can be used.
31
24
 
32
25
  ```yaml
@@ -35,11 +28,13 @@ can be used.
35
28
  exposition:
36
29
  /:
37
30
  GET:
38
- vary:embed:
39
- app: authority
31
+ map:authority: hostname
40
32
  endpoint: observe
41
33
  ```
42
34
 
35
+ If the value of the `authority` pseudo-header is not present in the `authorities` definition,
36
+ then the value is embedded as is.
37
+
43
38
  ## Identity
44
39
 
45
40
  Credentials stored or issued by the [authentication system](identity.md) are associated with an
@@ -5,6 +5,9 @@ configured in the same
5
5
  way as if they were a part of the Context. Resources exposed by the components
6
6
  are [isolated](tree.md#directives).
7
7
 
8
+ See [Persistent credentials](credentials.md) for the centralized Basic, federation, and passkey
9
+ management API.
10
+
8
11
  ## Basic credentials
9
12
 
10
13
  The `identity.basic` component stores basic credentials.
@@ -74,6 +77,12 @@ username: string
74
77
  password: string
75
78
  ```
76
79
 
80
+ Returns `201 Created` if the Identity is created,
81
+ or `422 Unprocessable Entity` with one of the error codes:
82
+
83
+ - `INVALID_USERNAME` - `username` does not match constraints
84
+ - `INVALID_PASSWORD` - `password` does not match constraints
85
+
77
86
  Access is [anonymous](access.md#anonymous).
78
87
 
79
88
  #### `/identity/basic/:id/`
@@ -89,6 +98,23 @@ password?: string
89
98
 
90
99
  Access requires basic credentials of the modified Identity or `system:identity:basic` role.
91
100
 
101
+ <code>POST</code> Incept new basic credentials. Request body is as follows:
102
+
103
+ ```yaml
104
+ username: string
105
+ password: string
106
+ ```
107
+
108
+ Identity should not have associated basic credentials. Access requires any credentials of the Identity.
109
+
110
+ #### `/identity/basic/usernames/:username/`
111
+
112
+ <code>GET</code> Check if the username is available.
113
+
114
+ `username` must be Base64 URL encoded.
115
+
116
+ Returns empty response with status `204` if the username is already taken or `404` if it is available.
117
+
92
118
  ## Identity federation (OpenID connect)
93
119
 
94
120
  The `identity.federation` component manages OpenID Connect federated identities.
@@ -102,8 +128,10 @@ the [component manifest](../components/identity.federation/manifest.toa.yaml).
102
128
  No federated tokens are accepted by default until at least one entry is added to the `trust`
103
129
  configuration.
104
130
 
105
- Toa supports either asymmetric RS256 or symmetric HS256 / HS384 / HS512 tokens with pre-shared
106
- secrets.
131
+ Issuer metadata is loaded from `<iss>/.well-known/openid-configuration`; signing keys are then
132
+ loaded from its `jwks_uri`. These requests, including Authorization Code token exchange, use the
133
+ built-in `context.fetch`, so they participate in standard HTTP telemetry and connection pooling.
134
+ JWKS resolvers are cached per fetch instance and issuer.
107
135
 
108
136
  ```yaml
109
137
  # context.toa.yaml
@@ -116,15 +144,13 @@ configuration:
116
144
  - https://github.com/tinovyatkin
117
145
  - https://github.com/temich
118
146
 
119
- - issuer: some.private.issuer
120
- secrets:
121
- HS256:
122
- k1: <secret-to-be-used-for-hs256>
147
+ - iss: https://accounts.google.com
148
+ aud: <GOOGLE_CLIENT_ID>
123
149
  ```
124
150
 
125
- ## Stateless tokens
151
+ ## Local tokens
126
152
 
127
- The `identity.tokens` component manages stateless authentication tokens.
153
+ The `identity.tokens` component manages local authentication tokens.
128
154
 
129
155
  These tokens carry the information required to authenticate the Identity and authorize access.
130
156
 
@@ -143,21 +169,109 @@ authorization: Token ...
143
169
  cache-control: no-store
144
170
  ```
145
171
 
172
+ ### Custom tokens
173
+
174
+ Custom tokens can be issued with a specific set of permissions and scopes for the own Identity or by
175
+ an Identity with the `system:identity:tokens` role.
176
+
177
+ Tokens are issued with custom secret keys and are not subject to [token rotation](#token-rotation).
178
+ To invalidate a custom token, its secret key must be deleted.
179
+
180
+ Custom tokens have no `refresh` period, that is, never become obsolete and never refreshed.
181
+
182
+ ```
183
+ POST /identity/tokens/<identity>/
184
+ host: nex.toa.io
185
+ authorization: ...
186
+ accept: application/yaml
187
+ content-type: application/yaml
188
+
189
+ lifetime: 3600
190
+ label: CI deployment token
191
+ scopes: [app:developer]
192
+ permissions:
193
+ /users/fc8e66dd/: [GET, PUT]
194
+ /posts/fc8e66dd/**/comments/: [*]
195
+ ```
196
+
197
+ ```
198
+ 201 Created
199
+ content-type: application/yaml
200
+
201
+ kid: <key-id>
202
+ exp: <unix-time-ms>
203
+ token: <token>
204
+ ```
205
+
206
+ - `lifetime`: Issued token will be valid for this period
207
+ (default is specified in [the configuration](#token-rotation)).
208
+ The value of `0` means the token will not expire, which is supported, but
209
+ **strongly not recommended** for production environments.
210
+ - `label`: Required human-readable name used when listing and revoking issued tokens.
211
+ - `scopes`: Issued token will assume only specified [role scopes](access.md#roles).
212
+ - `permissions`: Issued token will have permissions to access only specified resources and methods.
213
+ Supports [glob patterns](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html)
214
+ and a wildcard method.
215
+
216
+ > `roles` and `permissions` are additional restrictions applied on top of the Identity’s inherent
217
+ > privileges.
218
+
219
+ ### Custom token invalidation
220
+
221
+ Custom tokens can be invalidated by deleting the secret key used to issue them.
222
+ This can be done by the Identity that issued the token or by an Identity with
223
+ the `system:identity:keys` role.
224
+
225
+ ```
226
+ DELETE /identity/keys/<identity>/<key.id>/
227
+ authorization: ...
228
+ ```
229
+
230
+ The key `id` is returned as `kid` when the token is issued, is visible in the JWE protected header,
231
+ and can also be obtained by listing issued token keys. The secret key itself is never returned by
232
+ the listing endpoint.
233
+
234
+ ```
235
+ GET /identity/keys/<identity>/
236
+ authorization: ...
237
+ ```
238
+
239
+ The listing returns `id`, `label`, optional `expires`, and `_created`. Deletion prevents new cache
240
+ lookups from finding the key. A runtime that already cached it can continue accepting the token for
241
+ up to `identity.tokens.cache.ttl` milliseconds (10 minutes by default).
242
+
243
+ Both listing and deletion require credentials of the owning Identity or the
244
+ `system:identity:keys` role. Key creation is internal to `identity.tokens`; there is no public
245
+ endpoint that returns a stored secret.
246
+
146
247
  ### Token encryption
147
248
 
148
- Issued tokens are encrypted
149
- with [PASETO V3 encryption](https://github.com/panva/paseto/blob/main/docs/README.md#v3encryptpayload-key-options)
150
- using the `key0` configuration value as a secret.
249
+ Issued tokens are compact JWE tokens encrypted with direct symmetric encryption. Their protected
250
+ header is `{ alg: 'dir', enc: 'A256GCM', typ: 'JWT', kid: <key id> }`. Keys are configured in one
251
+ `keys` array. The first entry whose `format` is `jwe` or omitted is the active issuance key.
252
+ Keys are 256-bit secrets encoded with base64url and can be generated with `toa key`.
253
+
254
+ The optional `format` is `jwe` by default. Entries with `format: paseto` contain legacy PASETO
255
+ V3.local secrets and are used only to read old tokens. Legacy tokens are always marked for refresh;
256
+ only JWE tokens are issued.
257
+ The `format` property is transitional and can be removed together with the PASETO entries after the
258
+ legacy compatibility window ends.
151
259
 
152
260
  ```yaml
153
261
  # context.toa.yaml
154
262
 
155
263
  configuration:
156
264
  identity.tokens:
157
- key0: $TOKEN_ENCRYPTION_KEY
265
+ keys:
266
+ - id: 2026q3
267
+ key: $IDENTITY_TOKENS_ENCRYPTION_KEY0
268
+ - id: legacy
269
+ key: $IDENTITY_TOKENS_KEY0
270
+ format: paseto
158
271
  ```
159
272
 
160
- The `key0` configuration value is required.
273
+ At least one JWE entry is required. PASETO entries are required only while previously issued legacy
274
+ tokens must remain readable.
161
275
 
162
276
  > Valid secret key may be generated using the [`toa key` command](/runtime/cli/readme.md#key).
163
277
 
@@ -190,73 +304,63 @@ configuration:
190
304
 
191
305
  All currently issued tokens of an Identity are revoked when:
192
306
 
193
- 1. Basic credentials associated with the Identity are [modified](#identitybasicid).
307
+ 1. [Basic credentials](#basic-credentials) associated with the Identity are modified.
194
308
  2. Identity is [banned](#banned-identities).
195
309
 
196
310
  Token revocation takes effect once the `refresh` period of the currently issued tokens has expired.
197
311
 
198
312
  ### Secret rotation
199
313
 
200
- Tokens are always encrypted using the `key0` configuration value, and they will be decrypted by
201
- attempting both
202
- the `key0` and `key1` values in order.
203
-
204
- `key0` is considered the "current key," and `key1` is considered the "previous key."
205
-
206
- ```yaml
207
- # context.toa.yaml
314
+ Tokens are always encrypted using the first JWE entry of the `keys` array and decrypted by the
315
+ entry in the corresponding format branch whose `id` matches the token's `kid`.
208
316
 
209
- configuration:
210
- identity.tokens:
211
- key0: $TOKEN_ENCRYPTION_KEY_2023Q3
212
- key1: $TOKEN_ENCRYPTION_KEY_2023Q2
213
- ```
317
+ Rotation uses array order rather than object property order: index `0` is active for issuance and
318
+ the remaining entries are decrypt-only. Use the staged procedure below so every runtime knows the
319
+ new key before it becomes active.
214
320
 
215
- Secret rotation is performed by adding a new key as the `key0` value and moving the existing `key0`
216
- to the `key1` value.
321
+ Old keys must remain configured until every token issued with them has expired. In the default
322
+ configuration this means retaining them for at least `lifetime` (30 days) after making a new key
323
+ active. The shorter `refresh` interval only controls replacement during active client use and is
324
+ not a safe removal window for clients that remain idle.
217
325
 
218
- When rolling out the new secret key, there will be a period of time when the new key is deployed to
219
- some Exposition
220
- instances. During this time, these instances will start using the new key to encrypt tokens, while
221
- other instances will
222
- continue using the current key and will not be able to decrypt tokens encrypted with the new key.
223
-
224
- To address this issue, the `key1` configuration value may be used as a "transient key."
225
-
226
- The secret rotation is a 2-step process:
227
-
228
- > The process **must not** be performed earlier than the `lifetime` period since the last rotation,
229
- > as it may invalidate
230
- > tokens before they expire. Therefore, it is guaranteed that there are no valid tokens issued with
231
- > the current `key1`
232
- > value.
233
-
234
- 1. Deploy the new secret key to all Exposition instances as `key1`. This enables all instances to
235
- decrypt tokens
236
- encrypted with the new key while still using the current key for encryption.
326
+ > Let's say you are adding a new secret key each quarter: `2024Q1`, `2024Q2` and so on.
327
+ > The old key `2024Q1` must be removed only after the maximum lifetime of tokens issued with it has
328
+ > elapsed.
237
329
 
238
330
  ```yaml
239
331
  # context.toa.yaml
240
332
 
241
333
  configuration:
242
334
  identity.tokens:
243
- key0: $TOKEN_ENCRYPTION_KEY_2023Q3
244
- key1: $TOKEN_ENCRYPTION_KEY_2023Q4
335
+ keys:
336
+ - id: 2026q3
337
+ key: $TOKEN_ENCRYPTION_KEY_2026Q3
338
+ - id: 2026q4
339
+ key: $TOKEN_ENCRYPTION_KEY_2026Q4
245
340
  ```
246
341
 
247
- 2. Move the new secret key from `key1` to `key0`, and move the current key from `key0` to `key1`.
248
- During this rollout,
249
- all instances can decrypt tokens encrypted with both the new key and the current key.
342
+ 1. First deploy both keys everywhere with the current key at index `0`, as shown above.
343
+ 2. In an atomic rollout, move the new entry to index `0` and keep the current entry after it.
344
+ All instances can then decrypt tokens encrypted with both the new key and the current key.
250
345
 
251
346
  ```yaml
252
347
  # context.toa.yaml
253
348
 
254
349
  configuration:
255
350
  identity.tokens:
256
- key0: $TOKEN_ENCRYPTION_KEY_2023Q4
257
- key1: $TOKEN_ENCRYPTION_KEY_2023Q3
351
+ keys:
352
+ - id: 2026q4
353
+ key: $TOKEN_ENCRYPTION_KEY_2026Q4
354
+ - id: 2026q3
355
+ key: $TOKEN_ENCRYPTION_KEY_2026Q3
258
356
  ```
259
357
 
358
+ 3. Remove `2026q3` only after its last possible token has expired.
359
+
360
+ The PASETO-to-JWE runtime migration must also be atomic: legacy runtimes cannot decrypt newly
361
+ issued JWE tokens. Keep every `format: paseto` entry until its last token has expired;
362
+ `toa key --format paseto` exists only for maintaining those legacy secrets.
363
+
260
364
  ### Token resources
261
365
 
262
366
  `/identity/tokens/`
@@ -297,7 +401,7 @@ Role Scopes (see [Role Hierarchies](access.md#hierarchies)).
297
401
 
298
402
  The `identity.bans` component manages banned identities.
299
403
  A banned identity will fail to authenticate with any associated credentials
300
- (except [tokens](#stateless-tokens) within the `refresh` period).
404
+ (except [tokens](#local-tokens) within the `refresh` period).
301
405
 
302
406
  ```http
303
407
  PUT /identity/bans/:id/
@@ -329,3 +433,17 @@ roles:
329
433
  - developer
330
434
  - system:identity:roles
331
435
  ```
436
+
437
+ When no credentials are provided, transient Identity is created.
438
+
439
+ ```http
440
+ GET /identity/
441
+ accept: application/yaml
442
+ ```
443
+
444
+ ```
445
+ 201 Created
446
+
447
+ id: 332017649c814649b25ee466c1fe4534
448
+ roles: []
449
+ ```