@toa.io/extensions.exposition 1.0.0-alpha.6 → 1.0.0-alpha.60

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 (427) hide show
  1. package/components/context.toa.yaml +2 -2
  2. package/components/identity.bans/manifest.toa.yaml +15 -7
  3. package/components/identity.bans/operations/transit.d.ts +14 -0
  4. package/components/identity.bans/operations/transit.js +11 -0
  5. package/components/identity.bans/operations/transit.js.map +1 -0
  6. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
  7. package/components/identity.bans/source/transit.ts +21 -0
  8. package/components/identity.bans/tsconfig.json +9 -0
  9. package/components/identity.basic/manifest.toa.yaml +21 -10
  10. package/components/identity.basic/operations/authenticate.d.ts +5 -1
  11. package/components/identity.basic/operations/authenticate.js +5 -2
  12. package/components/identity.basic/operations/authenticate.js.map +1 -1
  13. package/components/identity.basic/operations/incept.d.ts +12 -0
  14. package/components/identity.basic/operations/incept.js +26 -0
  15. package/components/identity.basic/operations/incept.js.map +1 -0
  16. package/components/identity.basic/operations/transit.d.ts +4 -4
  17. package/components/identity.basic/operations/transit.js +5 -3
  18. package/components/identity.basic/operations/transit.js.map +1 -1
  19. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  20. package/components/identity.basic/operations/types.d.ts +8 -4
  21. package/components/identity.basic/source/authenticate.ts +16 -5
  22. package/components/identity.basic/source/incept.ts +38 -0
  23. package/components/identity.basic/source/transit.ts +8 -6
  24. package/components/identity.basic/source/types.ts +8 -4
  25. package/components/identity.federation/manifest.toa.yaml +32 -16
  26. package/components/identity.federation/operations/authenticate.d.ts +2 -2
  27. package/components/identity.federation/operations/authenticate.js +4 -11
  28. package/components/identity.federation/operations/authenticate.js.map +1 -1
  29. package/components/identity.federation/operations/incept.d.ts +11 -0
  30. package/components/identity.federation/operations/{create.js → incept.js} +6 -7
  31. package/components/identity.federation/operations/incept.js.map +1 -0
  32. package/components/identity.federation/operations/lib/jwt.d.ts +5 -5
  33. package/components/identity.federation/operations/lib/jwt.js +25 -12
  34. package/components/identity.federation/operations/lib/jwt.js.map +1 -1
  35. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  36. package/components/identity.federation/operations/types/configuration.d.ts +14 -0
  37. package/components/identity.federation/operations/types/configuration.js +3 -0
  38. package/components/identity.federation/operations/types/configuration.js.map +1 -0
  39. package/components/identity.federation/operations/{types.d.ts → types/context.d.ts} +15 -7
  40. package/components/identity.federation/operations/types/context.js +3 -0
  41. package/components/identity.federation/operations/types/context.js.map +1 -0
  42. package/components/identity.federation/operations/types/entity.d.ts +6 -0
  43. package/components/identity.federation/operations/types/entity.js +3 -0
  44. package/components/identity.federation/operations/types/entity.js.map +1 -0
  45. package/components/identity.federation/operations/types/index.d.ts +3 -0
  46. package/components/identity.federation/operations/types/index.js +20 -0
  47. package/components/identity.federation/operations/types/index.js.map +1 -0
  48. package/components/identity.federation/source/authenticate.ts +6 -19
  49. package/components/identity.federation/source/{create.ts → incept.ts} +10 -9
  50. package/components/identity.federation/source/lib/jwt.test.ts +123 -4
  51. package/components/identity.federation/source/lib/jwt.ts +36 -16
  52. package/components/identity.federation/source/types/configuration.ts +15 -0
  53. package/components/identity.federation/source/{types.ts → types/context.ts} +17 -6
  54. package/components/identity.federation/source/types/entity.ts +6 -0
  55. package/components/identity.federation/source/types/index.ts +3 -0
  56. package/components/identity.federation/tsconfig.json +5 -4
  57. package/components/identity.roles/manifest.toa.yaml +18 -7
  58. package/components/identity.roles/operations/grant.d.ts +10 -0
  59. package/components/identity.roles/operations/grant.js +21 -0
  60. package/components/identity.roles/operations/grant.js.map +1 -0
  61. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  62. package/components/identity.roles/operations/lib/Entity.js +3 -0
  63. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  64. package/components/identity.roles/operations/list.d.ts +1 -4
  65. package/components/identity.roles/operations/list.js.map +1 -1
  66. package/components/identity.roles/operations/principal.d.ts +4 -6
  67. package/components/identity.roles/operations/principal.js +6 -1
  68. package/components/identity.roles/operations/principal.js.map +1 -1
  69. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  70. package/components/identity.roles/source/grant.ts +32 -0
  71. package/components/identity.roles/source/lib/Entity.ts +5 -0
  72. package/components/identity.roles/source/list.ts +2 -4
  73. package/components/identity.roles/source/principal.ts +10 -8
  74. package/components/identity.tokens/manifest.toa.yaml +19 -5
  75. package/components/identity.tokens/operations/authenticate.d.ts +2 -2
  76. package/components/identity.tokens/operations/authenticate.js +12 -5
  77. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  78. package/components/identity.tokens/operations/decrypt.js +1 -0
  79. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  80. package/components/identity.tokens/operations/encrypt.js +5 -1
  81. package/components/identity.tokens/operations/encrypt.js.map +1 -1
  82. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  83. package/components/identity.tokens/operations/types.d.ts +8 -2
  84. package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
  85. package/components/identity.tokens/source/authenticate.test.ts +11 -4
  86. package/components/identity.tokens/source/authenticate.ts +14 -6
  87. package/components/identity.tokens/source/decrypt.test.ts +5 -3
  88. package/components/identity.tokens/source/decrypt.ts +9 -8
  89. package/components/identity.tokens/source/encrypt.test.ts +26 -2
  90. package/components/identity.tokens/source/encrypt.ts +5 -1
  91. package/components/identity.tokens/source/types.ts +9 -2
  92. package/components/octets.storage/manifest.toa.yaml +5 -7
  93. package/components/octets.storage/operations/store.js +105 -3
  94. package/documentation/access.md +75 -38
  95. package/documentation/authorities.md +49 -0
  96. package/documentation/cache.md +8 -1
  97. package/documentation/components.md +47 -22
  98. package/documentation/flow.md +31 -0
  99. package/documentation/identity.md +17 -22
  100. package/documentation/introspection.md +82 -0
  101. package/documentation/octets.md +64 -23
  102. package/documentation/protocol.md +3 -0
  103. package/documentation/query.md +29 -4
  104. package/documentation/require.md +15 -0
  105. package/documentation/tree.md +13 -0
  106. package/documentation/vary.md +14 -14
  107. package/features/access.feature +78 -46
  108. package/features/annotation.feature +1 -0
  109. package/features/auth.claim.feature +170 -0
  110. package/features/authorities.basic.feature +141 -0
  111. package/features/authorities.feature +32 -0
  112. package/features/authorities.federation.feature +100 -0
  113. package/features/authorities.tokens.feature +117 -0
  114. package/features/body.feature +3 -0
  115. package/features/cache.feature +109 -5
  116. package/features/cors.feature +5 -0
  117. package/features/debug.feature +34 -0
  118. package/features/directives.feature +3 -0
  119. package/features/dynamic.feature +4 -0
  120. package/features/errors.feature +20 -7
  121. package/features/etag.feature +31 -0
  122. package/features/flow.feature +45 -0
  123. package/features/identity.bans.feature +137 -0
  124. package/features/identity.basic.feature +125 -23
  125. package/features/identity.feature +7 -2
  126. package/features/identity.federation.feature +66 -11
  127. package/features/identity.roles.feature +250 -7
  128. package/features/identity.tokens.feature +54 -4
  129. package/features/introspection.feature +153 -0
  130. package/features/io.feature +38 -1
  131. package/features/octets.download.feature +117 -0
  132. package/features/octets.entries.feature +8 -1
  133. package/features/octets.feature +58 -64
  134. package/features/octets.meta.feature +3 -0
  135. package/features/octets.workflows.feature +239 -19
  136. package/features/probes.feature +14 -0
  137. package/features/{queries.feature → query.feature} +65 -2
  138. package/features/require.feature +67 -0
  139. package/features/response.feature +38 -3
  140. package/features/routes.feature +93 -2
  141. package/features/steps/Database.ts +17 -10
  142. package/features/steps/Gateway.ts +23 -6
  143. package/features/steps/IdP.ts +30 -25
  144. package/features/steps/components/echo/manifest.toa.yaml +14 -1
  145. package/features/steps/components/echo/operations/identity.js +7 -0
  146. package/features/steps/components/echo/operations/parameters.js +7 -0
  147. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  148. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  149. package/features/steps/components/octets.tester/manifest.toa.yaml +22 -1
  150. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  151. package/features/steps/components/octets.tester/operations/baz.js +1 -2
  152. package/features/steps/components/octets.tester/operations/diversify.js +3 -1
  153. package/features/steps/components/octets.tester/operations/foo.js +2 -2
  154. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  155. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  156. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  157. package/features/steps/components/pots/manifest.toa.yaml +14 -3
  158. package/features/steps/components/users/manifest.toa.yaml +0 -1
  159. package/features/steps/components/users.properties/manifest.toa.yaml +1 -1
  160. package/features/streams.feature +1 -0
  161. package/features/timing.feature +27 -1
  162. package/features/vary.feature +71 -0
  163. package/package.json +22 -14
  164. package/readme.md +19 -14
  165. package/schemas/annotation.cos.yaml +1 -1
  166. package/schemas/node.cos.yaml +1 -0
  167. package/schemas/octets/store.cos.yaml +1 -0
  168. package/schemas/query.cos.yaml +4 -10
  169. package/source/Annotation.ts +3 -3
  170. package/source/Composition.ts +2 -2
  171. package/source/Directive.ts +4 -5
  172. package/source/Endpoint.ts +48 -12
  173. package/source/Factory.ts +10 -11
  174. package/source/Gateway.ts +49 -20
  175. package/source/HTTP/Context.ts +24 -2
  176. package/source/HTTP/Server.ts +50 -43
  177. package/source/HTTP/exceptions.ts +7 -1
  178. package/source/HTTP/formats/index.ts +3 -3
  179. package/source/HTTP/messages.test.ts +39 -2
  180. package/source/HTTP/messages.ts +7 -3
  181. package/source/Introspection.ts +11 -0
  182. package/source/Mapping.ts +63 -21
  183. package/source/Query.test.ts +3 -3
  184. package/source/Query.ts +117 -33
  185. package/source/RTD/Endpoint.ts +3 -0
  186. package/source/RTD/Method.ts +16 -0
  187. package/source/RTD/Node.ts +29 -13
  188. package/source/RTD/Route.ts +5 -4
  189. package/source/RTD/factory.ts +5 -2
  190. package/source/RTD/syntax/parse.ts +37 -24
  191. package/source/RTD/syntax/types.ts +6 -4
  192. package/source/Remotes.ts +2 -9
  193. package/source/Tenant.ts +0 -8
  194. package/source/deployment.ts +32 -22
  195. package/source/directives/auth/Authorization.ts +37 -14
  196. package/source/directives/auth/Delegate.ts +42 -0
  197. package/source/directives/auth/Federation.ts +84 -0
  198. package/source/directives/auth/Incept.ts +4 -3
  199. package/source/directives/auth/Role.test.ts +53 -6
  200. package/source/directives/auth/Role.ts +22 -14
  201. package/source/directives/auth/split.ts +1 -1
  202. package/source/directives/auth/types.ts +1 -1
  203. package/source/directives/cache/Cache.ts +13 -6
  204. package/source/directives/cache/Control.ts +42 -16
  205. package/source/directives/dev/Development.ts +1 -1
  206. package/source/directives/flow/Fetch.ts +88 -0
  207. package/source/directives/flow/Flow.ts +34 -0
  208. package/source/directives/flow/index.ts +3 -0
  209. package/source/directives/flow/types.ts +6 -0
  210. package/source/directives/index.ts +3 -1
  211. package/source/directives/io/Input.ts +2 -2
  212. package/source/directives/octets/Context.ts +4 -3
  213. package/source/directives/octets/Delete.ts +4 -2
  214. package/source/directives/octets/Directive.ts +10 -0
  215. package/source/directives/octets/Fetch.ts +14 -12
  216. package/source/directives/octets/List.ts +9 -7
  217. package/source/directives/octets/Octets.ts +4 -5
  218. package/source/directives/octets/Store.ts +21 -8
  219. package/source/directives/octets/Workflow.ts +10 -3
  220. package/source/directives/octets/schemas.ts +4 -4
  221. package/source/directives/octets/types.ts +0 -7
  222. package/source/directives/octets/workflows/Execution.ts +59 -8
  223. package/source/directives/octets/workflows/Workflow.ts +2 -1
  224. package/source/directives/require/Directive.ts +5 -0
  225. package/source/directives/require/Headers.ts +20 -0
  226. package/source/directives/require/Require.ts +28 -0
  227. package/source/directives/require/index.ts +3 -0
  228. package/source/directives/vary/Directive.ts +2 -1
  229. package/source/directives/vary/Embed.ts +14 -8
  230. package/source/directives/vary/Vary.ts +6 -4
  231. package/source/directives/vary/embeddings/Authority.ts +8 -0
  232. package/source/directives/vary/embeddings/Embedding.ts +2 -1
  233. package/source/directives/vary/embeddings/Parameter.ts +14 -0
  234. package/source/directives/vary/embeddings/index.ts +6 -4
  235. package/source/exceptions.ts +22 -11
  236. package/source/manifest.ts +10 -11
  237. package/source/schemas.ts +1 -1
  238. package/transpiled/Annotation.d.ts +3 -3
  239. package/transpiled/Composition.js +2 -2
  240. package/transpiled/Composition.js.map +1 -1
  241. package/transpiled/Directive.js +4 -4
  242. package/transpiled/Directive.js.map +1 -1
  243. package/transpiled/Endpoint.d.ts +6 -4
  244. package/transpiled/Endpoint.js +28 -4
  245. package/transpiled/Endpoint.js.map +1 -1
  246. package/transpiled/Factory.d.ts +1 -1
  247. package/transpiled/Factory.js +9 -8
  248. package/transpiled/Factory.js.map +1 -1
  249. package/transpiled/Gateway.d.ts +2 -0
  250. package/transpiled/Gateway.js +36 -12
  251. package/transpiled/Gateway.js.map +1 -1
  252. package/transpiled/HTTP/Context.d.ts +8 -1
  253. package/transpiled/HTTP/Context.js +15 -2
  254. package/transpiled/HTTP/Context.js.map +1 -1
  255. package/transpiled/HTTP/Server.d.ts +13 -2
  256. package/transpiled/HTTP/Server.js +37 -35
  257. package/transpiled/HTTP/Server.js.map +1 -1
  258. package/transpiled/HTTP/exceptions.d.ts +4 -1
  259. package/transpiled/HTTP/exceptions.js +7 -1
  260. package/transpiled/HTTP/exceptions.js.map +1 -1
  261. package/transpiled/HTTP/formats/index.js +3 -3
  262. package/transpiled/HTTP/formats/index.js.map +1 -1
  263. package/transpiled/HTTP/messages.d.ts +1 -0
  264. package/transpiled/HTTP/messages.js +9 -3
  265. package/transpiled/HTTP/messages.js.map +1 -1
  266. package/transpiled/Introspection.d.ts +9 -0
  267. package/transpiled/Introspection.js +3 -0
  268. package/transpiled/Introspection.js.map +1 -0
  269. package/transpiled/Mapping.d.ts +10 -2
  270. package/transpiled/Mapping.js +48 -19
  271. package/transpiled/Mapping.js.map +1 -1
  272. package/transpiled/Query.d.ts +10 -1
  273. package/transpiled/Query.js +83 -30
  274. package/transpiled/Query.js.map +1 -1
  275. package/transpiled/RTD/Endpoint.d.ts +1 -0
  276. package/transpiled/RTD/Method.d.ts +4 -0
  277. package/transpiled/RTD/Method.js +11 -0
  278. package/transpiled/RTD/Method.js.map +1 -1
  279. package/transpiled/RTD/Node.d.ts +4 -1
  280. package/transpiled/RTD/Node.js +23 -12
  281. package/transpiled/RTD/Node.js.map +1 -1
  282. package/transpiled/RTD/Route.d.ts +1 -1
  283. package/transpiled/RTD/Route.js +0 -1
  284. package/transpiled/RTD/Route.js.map +1 -1
  285. package/transpiled/RTD/factory.js +5 -2
  286. package/transpiled/RTD/factory.js.map +1 -1
  287. package/transpiled/RTD/syntax/parse.js +34 -22
  288. package/transpiled/RTD/syntax/parse.js.map +1 -1
  289. package/transpiled/RTD/syntax/types.d.ts +5 -3
  290. package/transpiled/RTD/syntax/types.js +1 -1
  291. package/transpiled/RTD/syntax/types.js.map +1 -1
  292. package/transpiled/Remotes.d.ts +2 -4
  293. package/transpiled/Remotes.js +0 -5
  294. package/transpiled/Remotes.js.map +1 -1
  295. package/transpiled/Tenant.d.ts +0 -1
  296. package/transpiled/Tenant.js +0 -6
  297. package/transpiled/Tenant.js.map +1 -1
  298. package/transpiled/deployment.d.ts +1 -1
  299. package/transpiled/deployment.js +28 -20
  300. package/transpiled/deployment.js.map +1 -1
  301. package/transpiled/directives/auth/Authorization.js +26 -10
  302. package/transpiled/directives/auth/Authorization.js.map +1 -1
  303. package/transpiled/directives/auth/Delegate.d.ts +10 -0
  304. package/transpiled/directives/auth/Delegate.js +34 -0
  305. package/transpiled/directives/auth/Delegate.js.map +1 -0
  306. package/transpiled/directives/auth/Federation.d.ts +16 -0
  307. package/transpiled/directives/auth/Federation.js +57 -0
  308. package/transpiled/directives/auth/Federation.js.map +1 -0
  309. package/transpiled/directives/auth/Incept.js +4 -3
  310. package/transpiled/directives/auth/Incept.js.map +1 -1
  311. package/transpiled/directives/auth/Role.d.ts +4 -1
  312. package/transpiled/directives/auth/Role.js +20 -14
  313. package/transpiled/directives/auth/Role.js.map +1 -1
  314. package/transpiled/directives/auth/split.js +1 -1
  315. package/transpiled/directives/auth/split.js.map +1 -1
  316. package/transpiled/directives/cache/Cache.d.ts +3 -3
  317. package/transpiled/directives/cache/Cache.js +10 -4
  318. package/transpiled/directives/cache/Cache.js.map +1 -1
  319. package/transpiled/directives/cache/Control.d.ts +2 -1
  320. package/transpiled/directives/cache/Control.js +29 -12
  321. package/transpiled/directives/cache/Control.js.map +1 -1
  322. package/transpiled/directives/dev/Development.js +1 -1
  323. package/transpiled/directives/dev/Development.js.map +1 -1
  324. package/transpiled/directives/flow/Fetch.d.ts +13 -0
  325. package/transpiled/directives/flow/Fetch.js +59 -0
  326. package/transpiled/directives/flow/Fetch.js.map +1 -0
  327. package/transpiled/directives/flow/Flow.d.ts +10 -0
  328. package/transpiled/directives/flow/Flow.js +27 -0
  329. package/transpiled/directives/flow/Flow.js.map +1 -0
  330. package/transpiled/directives/flow/index.d.ts +2 -0
  331. package/transpiled/directives/flow/index.js +6 -0
  332. package/transpiled/directives/flow/index.js.map +1 -0
  333. package/transpiled/directives/flow/types.d.ts +5 -0
  334. package/transpiled/directives/flow/types.js.map +1 -0
  335. package/transpiled/directives/index.js +3 -1
  336. package/transpiled/directives/index.js.map +1 -1
  337. package/transpiled/directives/io/Input.js +2 -2
  338. package/transpiled/directives/io/Input.js.map +1 -1
  339. package/transpiled/directives/octets/Context.d.ts +3 -3
  340. package/transpiled/directives/octets/Context.js +4 -2
  341. package/transpiled/directives/octets/Context.js.map +1 -1
  342. package/transpiled/directives/octets/Delete.d.ts +3 -2
  343. package/transpiled/directives/octets/Delete.js +3 -1
  344. package/transpiled/directives/octets/Delete.js.map +1 -1
  345. package/transpiled/directives/octets/Directive.d.ts +8 -0
  346. package/transpiled/directives/octets/Directive.js +8 -0
  347. package/transpiled/directives/octets/Directive.js.map +1 -0
  348. package/transpiled/directives/octets/Fetch.d.ts +6 -5
  349. package/transpiled/directives/octets/Fetch.js +10 -8
  350. package/transpiled/directives/octets/Fetch.js.map +1 -1
  351. package/transpiled/directives/octets/List.d.ts +6 -5
  352. package/transpiled/directives/octets/List.js +6 -4
  353. package/transpiled/directives/octets/List.js.map +1 -1
  354. package/transpiled/directives/octets/Octets.d.ts +2 -1
  355. package/transpiled/directives/octets/Octets.js +2 -4
  356. package/transpiled/directives/octets/Octets.js.map +1 -1
  357. package/transpiled/directives/octets/Store.d.ts +6 -3
  358. package/transpiled/directives/octets/Store.js +12 -6
  359. package/transpiled/directives/octets/Store.js.map +1 -1
  360. package/transpiled/directives/octets/Workflow.d.ts +3 -2
  361. package/transpiled/directives/octets/Workflow.js +9 -2
  362. package/transpiled/directives/octets/Workflow.js.map +1 -1
  363. package/transpiled/directives/octets/schemas.d.ts +4 -4
  364. package/transpiled/directives/octets/schemas.js.map +1 -1
  365. package/transpiled/directives/octets/types.d.ts +0 -5
  366. package/transpiled/directives/octets/workflows/Execution.d.ts +5 -1
  367. package/transpiled/directives/octets/workflows/Execution.js +43 -9
  368. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  369. package/transpiled/directives/octets/workflows/Workflow.js +2 -1
  370. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  371. package/transpiled/directives/require/Directive.d.ts +4 -0
  372. package/transpiled/directives/require/Directive.js +3 -0
  373. package/transpiled/directives/require/Directive.js.map +1 -0
  374. package/transpiled/directives/require/Headers.d.ts +7 -0
  375. package/transpiled/directives/require/Headers.js +19 -0
  376. package/transpiled/directives/require/Headers.js.map +1 -0
  377. package/transpiled/directives/require/Require.d.ts +9 -0
  378. package/transpiled/directives/require/Require.js +27 -0
  379. package/transpiled/directives/require/Require.js.map +1 -0
  380. package/transpiled/directives/require/index.d.ts +2 -0
  381. package/transpiled/directives/require/index.js +6 -0
  382. package/transpiled/directives/require/index.js.map +1 -0
  383. package/transpiled/directives/vary/Directive.d.ts +2 -1
  384. package/transpiled/directives/vary/Embed.d.ts +2 -1
  385. package/transpiled/directives/vary/Embed.js +8 -6
  386. package/transpiled/directives/vary/Embed.js.map +1 -1
  387. package/transpiled/directives/vary/Vary.d.ts +2 -2
  388. package/transpiled/directives/vary/Vary.js +3 -3
  389. package/transpiled/directives/vary/Vary.js.map +1 -1
  390. package/transpiled/directives/vary/embeddings/Authority.d.ts +5 -0
  391. package/transpiled/directives/vary/embeddings/Authority.js +10 -0
  392. package/transpiled/directives/vary/embeddings/Authority.js.map +1 -0
  393. package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
  394. package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
  395. package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
  396. package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
  397. package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
  398. package/transpiled/directives/vary/embeddings/index.js +8 -4
  399. package/transpiled/directives/vary/embeddings/index.js.map +1 -1
  400. package/transpiled/exceptions.d.ts +3 -2
  401. package/transpiled/exceptions.js +13 -7
  402. package/transpiled/exceptions.js.map +1 -1
  403. package/transpiled/manifest.js +10 -11
  404. package/transpiled/manifest.js.map +1 -1
  405. package/transpiled/schemas.d.ts +1 -1
  406. package/transpiled/schemas.js +2 -2
  407. package/transpiled/schemas.js.map +1 -1
  408. package/transpiled/tsconfig.tsbuildinfo +1 -1
  409. package/tsconfig.json +9 -7
  410. package/components/identity.basic/operations/create.d.ts +0 -10
  411. package/components/identity.basic/operations/create.js +0 -10
  412. package/components/identity.basic/operations/create.js.map +0 -1
  413. package/components/identity.basic/source/create.ts +0 -18
  414. package/components/identity.federation/operations/create.d.ts +0 -10
  415. package/components/identity.federation/operations/create.js.map +0 -1
  416. package/components/identity.federation/operations/schemas.d.ts +0 -59
  417. package/components/identity.federation/operations/schemas.js +0 -9
  418. package/components/identity.federation/operations/schemas.js.map +0 -1
  419. package/components/identity.federation/operations/types.js.map +0 -1
  420. package/components/identity.federation/source/schemas.ts +0 -61
  421. package/components/octets.storage/operations/permute.js +0 -7
  422. package/source/HTTP/Server.test.ts +0 -126
  423. package/source/directives/octets/Permute.ts +0 -43
  424. package/transpiled/directives/octets/Permute.d.ts +0 -10
  425. package/transpiled/directives/octets/Permute.js +0 -56
  426. package/transpiled/directives/octets/Permute.js.map +0 -1
  427. /package/{components/identity.federation/operations → transpiled/directives/flow}/types.js +0 -0
@@ -1,11 +1,11 @@
1
1
  import { type Call, type Observation, type Query } from '@toa.io/types';
2
- import type { Schemas } from './schemas';
2
+ import type { Entity } from './entity';
3
+ import type { Configuration } from './configuration';
3
4
  export interface Context {
4
5
  local: {
5
- observe: Observation<Entity & {
6
- id: string;
7
- }>;
6
+ observe: Observation<Entity>;
8
7
  transit: Call<TransitOutput, TransitInput>;
8
+ ensure: Call<EnsureOutput>;
9
9
  };
10
10
  remote: {
11
11
  identity: {
@@ -14,16 +14,19 @@ export interface Context {
14
14
  };
15
15
  };
16
16
  };
17
- configuration: Required<Schemas>['configuration'];
17
+ configuration: Configuration;
18
18
  }
19
- export type Entity = Required<Schemas>['entity'];
20
19
  export interface TransitInput {
20
+ readonly authority: string;
21
21
  readonly iss: string;
22
22
  readonly sub: string;
23
23
  }
24
24
  export interface TransitOutput {
25
25
  id: string;
26
26
  }
27
+ export interface EnsureOutput {
28
+ id: string;
29
+ }
27
30
  interface IdentityTokensRevokeInput {
28
31
  query: Query;
29
32
  }
@@ -38,14 +41,19 @@ export interface JwtHeader {
38
41
  export interface IdToken {
39
42
  iss: string;
40
43
  sub: string;
41
- aud: string;
44
+ aud: string | string[];
42
45
  exp: number;
43
46
  iat: number;
44
47
  nbf?: number;
45
48
  }
49
+ export interface AuthenticateInput {
50
+ authority: string;
51
+ credentials: string;
52
+ }
46
53
  export interface AuthenticateOutput {
47
54
  identity: {
48
55
  id: string;
56
+ claim: Pick<IdToken, 'iss' | 'sub' | 'aud'>;
49
57
  };
50
58
  }
51
59
  export {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../source/types/context.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export interface Entity {
2
+ id: string;
3
+ authority: string;
4
+ iss: string;
5
+ sub: string;
6
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity.js","sourceRoot":"","sources":["../../source/types/entity.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export * from './configuration';
2
+ export * from './context';
3
+ export * from './entity';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./configuration"), exports);
18
+ __exportStar(require("./context"), exports);
19
+ __exportStar(require("./entity"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../source/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAA+B;AAC/B,4CAAyB;AACzB,2CAAwB"}
@@ -1,27 +1,14 @@
1
1
  import { type Maybe } from '@toa.io/types'
2
- import { Err } from 'error-value'
3
2
  import { assertionsAsValues } from './lib/assertions-as-values.js'
4
- import {
5
- validateIdToken
6
- } from './lib/jwt'
7
- import type { Request } from '@toa.io/core'
8
- import type { AuthenticateOutput, Context } from './types'
3
+ import { validateIdToken } from './lib/jwt'
4
+ import type { AuthenticateInput, AuthenticateOutput, Context } from './types'
9
5
 
10
- async function authenticate (input: string,
6
+ async function authenticate ({ authority, credentials }: AuthenticateInput,
11
7
  context: Context): Promise<Maybe<AuthenticateOutput>> {
12
- const { iss, sub } = await validateIdToken(input, context.configuration.trust)
8
+ const { iss, sub, aud } = await validateIdToken(credentials, context.configuration.trust)
9
+ const { id } = await context.local.ensure({ entity: { authority, iss, sub } })
13
10
 
14
- const request: Request = { query: { criteria: `iss==${iss};sub==${sub}` } }
15
-
16
- let id = (await context.local.observe(request))?.id
17
-
18
- if (id === undefined) {
19
- if (context.configuration.explicit_identity_creation === true) return Err('NOT_FOUND')
20
-
21
- id = (await context.local.transit({ input: { iss, sub } })).id
22
- }
23
-
24
- return { identity: { id } }
11
+ return { identity: { id, claim: { iss, sub, aud } } }
25
12
  }
26
13
 
27
14
  // Exporting as a function returning assertion errors as values
@@ -3,24 +3,25 @@ import { validateIdToken } from './lib/jwt'
3
3
  import type { Request } from '@toa.io/core'
4
4
  import type { Context, Entity } from './types'
5
5
 
6
- async function create (input: CreateInput, context: Context): Promise<CreateOutput> {
6
+ async function incept (input: Input, context: Context): Promise<Output> {
7
7
  const { iss, sub } = await validateIdToken(input.credentials, context.configuration.trust)
8
8
 
9
- const request: Request = {
10
- input: { iss, sub } satisfies Omit<Entity, 'id'>,
11
- query: { id: input.id }
12
- }
9
+ const request: Request = { input: { authority: input.authority, iss, sub } satisfies Omit<Entity, 'id'> }
10
+
11
+ if (input.id !== undefined)
12
+ request.query = { id: input.id }
13
13
 
14
14
  return await context.local.transit(request)
15
15
  }
16
16
 
17
- interface CreateInput {
18
- id: string
17
+ interface Input {
18
+ authority: string
19
19
  credentials: string
20
+ id?: string
20
21
  }
21
22
 
22
- interface CreateOutput {
23
+ interface Output {
23
24
  id: string
24
25
  }
25
26
 
26
- export const effect = assertionsAsValues(create)
27
+ export const effect = assertionsAsValues(incept)
@@ -1,8 +1,58 @@
1
- /* eslint-disable max-len */
1
+ import * as http from 'node:http'
2
+
2
3
  /* eslint-disable @typescript-eslint/consistent-type-assertions */
3
- import { validateSignature, decodeJwt } from './jwt'
4
+ import { once } from 'node:events'
5
+ import { validateSignature, decodeJwt, validateJwtPayload, cachedFetch } from './jwt'
6
+ import type { AddressInfo } from 'node:net'
7
+ import type { IdToken, JwtHeader, Trust } from '../types'
4
8
 
5
9
  describe('jwt', () => {
10
+ describe('validateJwtPayload', () => {
11
+ const jwtHeader: JwtHeader = { alg: 'HS256', kid: 'k1' }
12
+
13
+ const trusted: Trust[] = [{
14
+ iss: 'test-iss',
15
+ aud: ['test-aud1', 'test-aud2'],
16
+ secrets: { [jwtHeader.alg]: { [jwtHeader.kid!]: 'test-secrete' } }
17
+ }]
18
+
19
+ const validJwtPayload: IdToken = {
20
+ iss: trusted[0].iss,
21
+ sub: 'test-sub',
22
+ iat: Date.now() / 1000,
23
+ exp: Date.now() / 1000 + 2000,
24
+ aud: trusted[0].aud![1]
25
+ }
26
+
27
+ describe('aud', () => {
28
+ test('throws without it', () => {
29
+ const { aud, ...noAudPayload } = validJwtPayload
30
+
31
+ expect(() => validateJwtPayload(noAudPayload, trusted, jwtHeader)).toThrow('Payload is missing aud')
32
+ })
33
+
34
+ test('passes with a single string', () => {
35
+ expect(validJwtPayload.aud).toEqual(expect.any(String))
36
+ expect(() => validateJwtPayload(validJwtPayload, trusted, jwtHeader)).not.toThrow()
37
+ })
38
+
39
+ test('passes with an array', () => {
40
+ const arrayAudPayload = { ...validJwtPayload, aud: trusted[0].aud }
41
+
42
+ expect(arrayAudPayload.aud).toEqual(expect.any(Array))
43
+ expect(() => validateJwtPayload(arrayAudPayload, trusted, jwtHeader)).not.toThrow()
44
+ })
45
+
46
+ test('throws with an array that does not intersects', () => {
47
+ const arrayAudPayload = { ...validJwtPayload, aud: ['boo', 'foo'] }
48
+
49
+ expect(arrayAudPayload.aud).toEqual(expect.any(Array))
50
+ expect(() => validateJwtPayload(arrayAudPayload, trusted, jwtHeader))
51
+ .toThrow('Unknown audiences: boo, foo')
52
+ })
53
+ })
54
+ })
55
+
6
56
  test('decode', () => {
7
57
  const { header, payload } = decodeJwt('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg')
8
58
 
@@ -22,7 +72,7 @@ describe('jwt', () => {
22
72
  signature: '4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg',
23
73
  trusted: [
24
74
  {
25
- issuer: 'test-issuer',
75
+ iss: 'test-issuer',
26
76
  secrets: {
27
77
  HS256: {
28
78
  k1: 'old-secret',
@@ -43,7 +93,7 @@ describe('jwt', () => {
43
93
  signature: 'signature',
44
94
  trusted: [
45
95
  {
46
- issuer: 'test-issuer',
96
+ iss: 'test-issuer',
47
97
  secrets: {
48
98
  HS256: {
49
99
  theKey: 'secret'
@@ -53,4 +103,73 @@ describe('jwt', () => {
53
103
  ]
54
104
  } as Parameters<typeof validateSignature>[0])).rejects.toThrow('Signature does not match')
55
105
  })
106
+
107
+ describe.skip('cachedFetch', () => {
108
+ let server: http.Server
109
+ // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
110
+ const handler = jest.fn<void, [http.IncomingMessage, http.ServerResponse]>()
111
+ let endpoint: string
112
+
113
+ beforeAll(async () => {
114
+ server = http.createServer(handler)
115
+
116
+ server.listen(0, 'localhost')
117
+ await once(server, 'listening')
118
+
119
+ const { address, port } = server.address() as AddressInfo
120
+
121
+ endpoint = `http://${address}:${port}`
122
+ })
123
+
124
+ afterEach(() => {
125
+ handler.mockReset()
126
+ })
127
+
128
+ afterAll(async () => {
129
+ server.close()
130
+ await once(server, 'close')
131
+ })
132
+
133
+ test('fetches only once', async () => {
134
+ handler.mockImplementationOnce((req, res) => {
135
+ res.writeHead(200, { 'content-type': 'application/json', 'cache-control': 'public, max-age=3600' })
136
+ res.end(JSON.stringify({ foo: 'bar' }))
137
+ }).mockImplementationOnce((req, res) => {
138
+ res.writeHead(500)
139
+ res.end()
140
+ })
141
+
142
+ const firstRequest = await cachedFetch(endpoint)
143
+
144
+ expect(firstRequest.ok).toBe(true)
145
+ await expect(firstRequest.json()).resolves.toEqual({ foo: 'bar' })
146
+
147
+ const secondRequest = await cachedFetch(endpoint)
148
+
149
+ expect(secondRequest.ok).toBe(true)
150
+ await expect(secondRequest.json()).resolves.toEqual({ foo: 'bar' })
151
+
152
+ expect(handler).toHaveBeenCalledTimes(1)
153
+ })
154
+
155
+ test('respects caching headers', async () => {
156
+ handler.mockImplementation((req, res) => {
157
+ res.writeHead(200, { 'content-type': 'application/json', 'cache-control': 'no-cache' })
158
+ res.end(JSON.stringify({ foo: 'bar' }))
159
+ })
160
+
161
+ const firstRequest = await cachedFetch(endpoint + '/no-cache')
162
+
163
+ expect(firstRequest.headers.get('cache-control')).toBe('no-cache')
164
+ expect(firstRequest.ok).toBe(true)
165
+ await expect(firstRequest.json()).resolves.toEqual({ foo: 'bar' })
166
+
167
+ const secondRequest = await cachedFetch(endpoint + '/no-cache')
168
+
169
+ expect(secondRequest.ok).toBe(true)
170
+ await expect(secondRequest.json()).resolves.toEqual({ foo: 'bar' })
171
+
172
+ expect(handler).toHaveBeenCalledTimes(2)
173
+ })
174
+ })
56
175
  })
@@ -1,7 +1,7 @@
1
1
  import crypto from 'node:crypto'
2
2
  import * as assert from 'node:assert'
3
- import { type JwtHeader, type IdToken } from '../types'
4
- import { type TrustConfiguration } from '../schemas'
3
+
4
+ import type { JwtHeader, IdToken, Trust } from '../types'
5
5
 
6
6
  export function decodeJwt (token: string): {
7
7
  header: unknown
@@ -27,7 +27,7 @@ export function validateJwtHeader (header: unknown): asserts header is JwtHeader
27
27
  }
28
28
 
29
29
  export function validateJwtPayload (payload: unknown,
30
- trusted: TrustConfiguration[] = [],
30
+ trusted: Trust[] = [],
31
31
  header: JwtHeader): asserts payload is IdToken {
32
32
  assert.ok(trusted.length > 0, 'No trusted issuers provided')
33
33
 
@@ -38,13 +38,22 @@ export function validateJwtPayload (payload: unknown,
38
38
  assert.ok('iss' in payload, 'Payload is missing iss')
39
39
  assert.ok(typeof payload.iss === 'string', 'Payload iss is not a string')
40
40
  assert.ok('aud' in payload, 'Payload is missing aud')
41
- assert.ok(typeof payload.aud === 'string', 'Payload aud is not a string')
41
+ assert.ok(typeof payload.aud === 'string' ||
42
+ (Array.isArray(payload.aud) && payload.aud.every((e): e is string => typeof e === 'string')),
43
+ 'Payload aud is not a string nor an array of strings')
44
+
45
+ const issuer = trusted.find((config) => config.iss === payload.iss)
46
+
47
+ assert.ok(issuer, `Unknown issuer: ${payload.iss}`)
42
48
 
43
- const issuer = trusted.find((config) => config.issuer === payload.iss)
49
+ if (Array.isArray(issuer.aud)) {
50
+ const tokenAud = payload.aud
44
51
 
45
- assert.ok(issuer !== undefined &&
46
- (issuer.audience === undefined || issuer.audience.some((a) => a === payload.aud),
47
- `Unknown issuer / audience: ${payload.iss} / ${payload.aud}`))
52
+ if (typeof tokenAud === 'string')
53
+ assert.ok(issuer.aud.some((a) => a === tokenAud), `Unknown audience: ${tokenAud}`)
54
+ else
55
+ assert.ok(issuer.aud.some((a) => tokenAud.includes(a)), `Unknown audiences: ${tokenAud.join(', ')}`)
56
+ }
48
57
 
49
58
  if (header.alg.startsWith('HS')) {
50
59
  const secrets = issuer.secrets
@@ -90,12 +99,12 @@ export async function validateSignature ({
90
99
  readonly payload: IdToken
91
100
  rawPayload: string
92
101
  signature: string
93
- trusted?: TrustConfiguration[]
102
+ trusted?: Trust[]
94
103
  }): Promise<void> {
95
104
  if (alg.startsWith('HS')) {
96
105
  // symmetric algorithm, issuer is validated at this point
97
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- `kid` is validated
98
- const secrets = trusted.find((c) => c.issuer === iss)!.secrets![alg]
106
+
107
+ const secrets = trusted.find((c) => c.iss === iss)!.secrets![alg]
99
108
  const secret = kid !== undefined ? secrets[kid] : Object.values(secrets)[0]
100
109
  const algorithm = alg.replace(/^HS(\d{3})$/, 'sha$1') // HS256 -> sha256
101
110
  const hmac = crypto.createHmac(algorithm, secret)
@@ -109,16 +118,14 @@ export async function validateSignature ({
109
118
  }
110
119
 
111
120
  // Getting issuer public keys
112
- const oidcRequest = await fetch(`${iss}/.well-known/openid-configuration`, {
113
- cache: 'default'
114
- })
121
+ const oidcRequest = await cachedFetch(`${iss}/.well-known/openid-configuration`)
115
122
 
116
123
  assert.ok(oidcRequest.ok,
117
124
  `Failed to fetch OpenID configuration: ${oidcRequest.statusText}`)
118
125
 
119
126
  const { jwks_uri: jwksUri } = (await oidcRequest.json()) as { jwks_uri: string }
120
127
 
121
- const jwkRequest = await fetch(jwksUri, { cache: 'default' })
128
+ const jwkRequest = await cachedFetch(jwksUri)
122
129
 
123
130
  assert.ok(jwkRequest.ok, `Failed to fetch issuer keys: ${jwkRequest.statusText}`)
124
131
 
@@ -153,7 +160,7 @@ export async function validateSignature ({
153
160
  }
154
161
 
155
162
  export async function validateIdToken (token: string,
156
- trusted?: TrustConfiguration[]): Promise<IdToken> {
163
+ trusted?: Trust[]): Promise<IdToken> {
157
164
  const { header, payload, rawHeader, rawPayload, signature } = decodeJwt(token)
158
165
 
159
166
  validateJwtHeader(header)
@@ -169,3 +176,16 @@ export async function validateIdToken (token: string,
169
176
 
170
177
  return payload
171
178
  }
179
+
180
+ // workaround for ultrafetch being ESM only
181
+ let _cachedFetch: typeof fetch | undefined
182
+
183
+ export async function cachedFetch (url: string, init?: RequestInit): Promise<Response> {
184
+ if (typeof _cachedFetch !== 'function') {
185
+ const { withCache } = await import('ultrafetch')
186
+
187
+ _cachedFetch = withCache(fetch)
188
+ }
189
+
190
+ return _cachedFetch(url, init)
191
+ }
@@ -0,0 +1,15 @@
1
+ export interface Configuration {
2
+ trust?: Trust[]
3
+ principal?: Principal
4
+ }
5
+
6
+ export interface Trust {
7
+ iss: string
8
+ aud?: [string, ...string[]]
9
+ secrets?: Record<string, Record<string, string>>
10
+ }
11
+
12
+ interface Principal {
13
+ iss: string
14
+ sub: string
15
+ }
@@ -1,10 +1,12 @@
1
1
  import { type Call, type Observation, type Query } from '@toa.io/types'
2
- import type { Schemas } from './schemas'
2
+ import type { Entity } from './entity'
3
+ import type { Configuration } from './configuration'
3
4
 
4
5
  export interface Context {
5
6
  local: {
6
- observe: Observation<Entity & { id: string }>
7
+ observe: Observation<Entity>
7
8
  transit: Call<TransitOutput, TransitInput>
9
+ ensure: Call<EnsureOutput>
8
10
  }
9
11
  remote: {
10
12
  identity: {
@@ -13,12 +15,11 @@ export interface Context {
13
15
  }
14
16
  }
15
17
  }
16
- configuration: Required<Schemas>['configuration']
18
+ configuration: Configuration
17
19
  }
18
20
 
19
- export type Entity = Required<Schemas>['entity']
20
-
21
21
  export interface TransitInput {
22
+ readonly authority: string
22
23
  readonly iss: string
23
24
  readonly sub: string
24
25
  }
@@ -27,6 +28,10 @@ export interface TransitOutput {
27
28
  id: string
28
29
  }
29
30
 
31
+ export interface EnsureOutput {
32
+ id: string
33
+ }
34
+
30
35
  interface IdentityTokensRevokeInput {
31
36
  query: Query
32
37
  }
@@ -43,14 +48,20 @@ export interface JwtHeader {
43
48
  export interface IdToken {
44
49
  iss: string
45
50
  sub: string
46
- aud: string
51
+ aud: string | string[]
47
52
  exp: number
48
53
  iat: number
49
54
  nbf?: number
50
55
  }
51
56
 
57
+ export interface AuthenticateInput {
58
+ authority: string
59
+ credentials: string
60
+ }
61
+
52
62
  export interface AuthenticateOutput {
53
63
  identity: {
54
64
  id: string
65
+ claim: Pick<IdToken, 'iss' | 'sub' | 'aud'>
55
66
  }
56
67
  }
@@ -0,0 +1,6 @@
1
+ export interface Entity {
2
+ id: string
3
+ authority: string
4
+ iss: string
5
+ sub: string
6
+ }
@@ -0,0 +1,3 @@
1
+ export * from './configuration'
2
+ export * from './context'
3
+ export * from './entity'
@@ -2,8 +2,9 @@
2
2
  "extends": "../../tsconfig.json",
3
3
  "compilerOptions": {
4
4
  "outDir": "./operations",
5
+ "module": "Node16",
6
+ "moduleResolution": "Node16",
7
+ "target": "ES2022"
5
8
  },
6
- "include": [
7
- "source"
8
- ]
9
- }
9
+ "include": ["source"]
10
+ }
@@ -1,18 +1,23 @@
1
1
  namespace: identity
2
2
  name: roles
3
- version: 0.0.0
4
3
 
5
4
  entity:
6
5
  schema:
7
6
  identity*: string
8
- role*: string
7
+ role*: /^[a-zA-Z0-9]{0,32}(:[a-zA-Z0-9]{0,32}){0,8}$/
8
+ grantor: string
9
+ unique:
10
+ role: [identity, role]
9
11
 
10
12
  operations:
11
- transit:
13
+ grant:
12
14
  query: false
13
15
  input:
14
- identity*: string
15
- role*: string
16
+ identity*: .
17
+ role*: .
18
+ grantor:
19
+ id: string
20
+ roles: [string]
16
21
  list:
17
22
  output: [string]
18
23
  principal:
@@ -21,13 +26,19 @@ operations:
21
26
 
22
27
  receivers:
23
28
  identity.basic.principal: principal
29
+ identity.federation.principal: principal
24
30
 
25
31
  exposition:
26
32
  isolated: true
27
33
  /:identity:
28
34
  auth:role: system:identity:roles
29
- POST: transit
35
+ POST:
36
+ io:output: [id, grantor]
37
+ auth:rule:
38
+ delegate: grantor
39
+ role: system:identity:roles:delegation
40
+ endpoint: grant
30
41
  GET:
31
- io:output: true
42
+ io:output: true # array of strings
32
43
  auth:id: identity
33
44
  endpoint: list
@@ -0,0 +1,10 @@
1
+ import type { Entity } from './lib/Entity';
2
+ export declare function transition(input: Input, object: Entity): Promise<Entity | Error>;
3
+ export interface Input {
4
+ identity: string;
5
+ role: string;
6
+ grantor?: {
7
+ id: string;
8
+ roles: string[];
9
+ };
10
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transition = void 0;
4
+ const error_value_1 = require("error-value");
5
+ async function transition(input, object) {
6
+ if (input.grantor === undefined)
7
+ return Object.assign(object, input);
8
+ if (!within('system:identity:roles', input.grantor.roles) &&
9
+ !within(input.role, input.grantor.roles))
10
+ return ERR_OUT_OF_SCOPE;
11
+ object.role = input.role;
12
+ object.identity = input.identity;
13
+ object.grantor = input.grantor.id;
14
+ return object;
15
+ }
16
+ exports.transition = transition;
17
+ function within(role, scopes) {
18
+ return scopes.some((scope) => role === scope || role.startsWith(scope + ':'));
19
+ }
20
+ const ERR_OUT_OF_SCOPE = (0, error_value_1.Err)('OUT_OF_SCOPE');
21
+ //# sourceMappingURL=grant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grant.js","sourceRoot":"","sources":["../source/grant.ts"],"names":[],"mappings":";;;AAAA,6CAAiC;AAG1B,KAAK,UAAU,UAAU,CAAE,KAAY,EAAE,MAAc;IAC5D,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAC7B,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAErC,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACvD,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,OAAO,gBAAgB,CAAA;IAEzB,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACxB,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAA;IAChC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAA;IAEjC,OAAO,MAAM,CAAA;AACf,CAAC;AAbD,gCAaC;AAED,SAAS,MAAM,CAAE,IAAY,EAAE,MAAgB;IAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAA;AAC/E,CAAC;AAED,MAAM,gBAAgB,GAAG,IAAA,iBAAG,EAAC,cAAc,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ export interface Entity {
2
+ identity: string;
3
+ role: string;
4
+ grantor?: string;
5
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Entity.js","sourceRoot":"","sources":["../../source/lib/Entity.ts"],"names":[],"mappings":""}
@@ -1,5 +1,2 @@
1
+ import type { Entity } from './lib/Entity';
1
2
  export declare function observation(_: unknown, objects: Entity[]): string[];
2
- interface Entity {
3
- role: string;
4
- }
5
- export {};
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../source/list.ts"],"names":[],"mappings":";;;AAAA,SAAgB,WAAW,CAAE,CAAU,EAAE,OAAiB;IACxD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;AACxC,CAAC;AAFD,kCAEC"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../source/list.ts"],"names":[],"mappings":";;;AAEA,SAAgB,WAAW,CAAE,CAAU,EAAE,OAAiB;IACxD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;AACxC,CAAC;AAFD,kCAEC"}