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

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 (443) 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 +6 -7
  93. package/components/octets.storage/operations/get.js +2 -2
  94. package/components/octets.storage/operations/store.js +113 -3
  95. package/documentation/access.md +75 -38
  96. package/documentation/authorities.md +49 -0
  97. package/documentation/cache.md +8 -1
  98. package/documentation/components.md +47 -22
  99. package/documentation/flow.md +31 -0
  100. package/documentation/identity.md +17 -22
  101. package/documentation/introspection.md +82 -0
  102. package/documentation/octets.md +81 -23
  103. package/documentation/protocol.md +3 -0
  104. package/documentation/query.md +29 -4
  105. package/documentation/require.md +15 -0
  106. package/documentation/tree.md +13 -0
  107. package/documentation/vary.md +14 -14
  108. package/features/access.feature +78 -46
  109. package/features/annotation.feature +1 -0
  110. package/features/auth.claim.feature +170 -0
  111. package/features/authorities.basic.feature +141 -0
  112. package/features/authorities.feature +32 -0
  113. package/features/authorities.federation.feature +100 -0
  114. package/features/authorities.tokens.feature +117 -0
  115. package/features/body.feature +3 -0
  116. package/features/cache.feature +109 -5
  117. package/features/cors.feature +6 -1
  118. package/features/debug.feature +34 -0
  119. package/features/directives.feature +3 -0
  120. package/features/dynamic.feature +4 -0
  121. package/features/errors.feature +20 -7
  122. package/features/etag.feature +31 -0
  123. package/features/flow.feature +45 -0
  124. package/features/identity.bans.feature +137 -0
  125. package/features/identity.basic.feature +125 -23
  126. package/features/identity.feature +7 -2
  127. package/features/identity.federation.feature +66 -11
  128. package/features/identity.roles.feature +250 -7
  129. package/features/identity.tokens.feature +54 -4
  130. package/features/introspection.feature +153 -0
  131. package/features/io.feature +38 -1
  132. package/features/methods.feature +47 -0
  133. package/features/octets.download.feature +189 -0
  134. package/features/octets.entries.feature +8 -1
  135. package/features/octets.feature +82 -54
  136. package/features/octets.meta.feature +3 -0
  137. package/features/octets.workflows.feature +239 -19
  138. package/features/probes.feature +14 -0
  139. package/features/{queries.feature → query.feature} +65 -2
  140. package/features/require.feature +67 -0
  141. package/features/response.feature +38 -3
  142. package/features/routes.feature +93 -2
  143. package/features/steps/Database.ts +17 -10
  144. package/features/steps/Gateway.ts +23 -6
  145. package/features/steps/IdP.ts +30 -25
  146. package/features/steps/Parameters.ts +1 -1
  147. package/features/steps/components/echo/manifest.toa.yaml +14 -1
  148. package/features/steps/components/echo/operations/identity.js +7 -0
  149. package/features/steps/components/echo/operations/parameters.js +7 -0
  150. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  151. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  152. package/features/steps/components/octets.tester/manifest.toa.yaml +22 -1
  153. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  154. package/features/steps/components/octets.tester/operations/baz.js +1 -2
  155. package/features/steps/components/octets.tester/operations/diversify.js +3 -1
  156. package/features/steps/components/octets.tester/operations/foo.js +2 -2
  157. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  158. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  159. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  160. package/features/steps/components/pots/manifest.toa.yaml +14 -3
  161. package/features/steps/components/users/manifest.toa.yaml +0 -1
  162. package/features/steps/components/users.properties/manifest.toa.yaml +1 -1
  163. package/features/streams.feature +1 -0
  164. package/features/timing.feature +27 -1
  165. package/features/vary.feature +71 -0
  166. package/package.json +22 -14
  167. package/readme.md +19 -14
  168. package/schemas/annotation.cos.yaml +1 -1
  169. package/schemas/method.cos.yaml +1 -1
  170. package/schemas/node.cos.yaml +1 -0
  171. package/schemas/octets/store.cos.yaml +25 -3
  172. package/schemas/query.cos.yaml +4 -10
  173. package/source/Annotation.ts +3 -3
  174. package/source/Composition.ts +2 -2
  175. package/source/Directive.ts +4 -5
  176. package/source/Endpoint.ts +48 -12
  177. package/source/Factory.ts +10 -11
  178. package/source/Gateway.ts +49 -20
  179. package/source/HTTP/Context.ts +24 -2
  180. package/source/HTTP/Server.ts +51 -44
  181. package/source/HTTP/exceptions.ts +13 -1
  182. package/source/HTTP/formats/index.ts +3 -3
  183. package/source/HTTP/messages.test.ts +39 -2
  184. package/source/HTTP/messages.ts +7 -3
  185. package/source/Introspection.ts +11 -0
  186. package/source/Mapping.ts +63 -21
  187. package/source/Query.test.ts +3 -3
  188. package/source/Query.ts +117 -33
  189. package/source/RTD/Endpoint.ts +3 -0
  190. package/source/RTD/Method.ts +16 -0
  191. package/source/RTD/Node.ts +29 -13
  192. package/source/RTD/Route.ts +5 -4
  193. package/source/RTD/factory.ts +5 -2
  194. package/source/RTD/syntax/parse.ts +37 -24
  195. package/source/RTD/syntax/types.ts +6 -4
  196. package/source/Remotes.ts +2 -9
  197. package/source/Tenant.ts +0 -8
  198. package/source/deployment.ts +32 -22
  199. package/source/directives/auth/Authorization.ts +37 -14
  200. package/source/directives/auth/Delegate.ts +42 -0
  201. package/source/directives/auth/Federation.ts +84 -0
  202. package/source/directives/auth/Incept.ts +4 -3
  203. package/source/directives/auth/Role.test.ts +53 -6
  204. package/source/directives/auth/Role.ts +22 -14
  205. package/source/directives/auth/split.ts +1 -1
  206. package/source/directives/auth/types.ts +1 -1
  207. package/source/directives/cache/Cache.ts +13 -6
  208. package/source/directives/cache/Control.ts +42 -16
  209. package/source/directives/cors/CORS.ts +1 -1
  210. package/source/directives/dev/Development.ts +1 -1
  211. package/source/directives/flow/Fetch.ts +88 -0
  212. package/source/directives/flow/Flow.ts +34 -0
  213. package/source/directives/flow/index.ts +3 -0
  214. package/source/directives/flow/types.ts +6 -0
  215. package/source/directives/index.ts +3 -1
  216. package/source/directives/io/Input.ts +4 -4
  217. package/source/directives/io/Output.ts +1 -1
  218. package/source/directives/octets/Context.ts +7 -5
  219. package/source/directives/octets/Delete.ts +4 -2
  220. package/source/directives/octets/Directive.ts +10 -0
  221. package/source/directives/octets/Fetch.ts +15 -13
  222. package/source/directives/octets/List.ts +9 -7
  223. package/source/directives/octets/Octets.ts +4 -5
  224. package/source/directives/octets/Store.ts +34 -12
  225. package/source/directives/octets/Workflow.ts +10 -3
  226. package/source/directives/octets/bytes.test.ts +30 -0
  227. package/source/directives/octets/bytes.ts +18 -0
  228. package/source/directives/octets/schemas.ts +4 -6
  229. package/source/directives/octets/types.ts +0 -7
  230. package/source/directives/octets/workflows/Execution.ts +59 -8
  231. package/source/directives/octets/workflows/Workflow.ts +2 -1
  232. package/source/directives/require/Directive.ts +5 -0
  233. package/source/directives/require/Headers.ts +20 -0
  234. package/source/directives/require/Require.ts +28 -0
  235. package/source/directives/require/index.ts +3 -0
  236. package/source/directives/vary/Directive.ts +2 -1
  237. package/source/directives/vary/Embed.ts +14 -8
  238. package/source/directives/vary/Vary.ts +6 -4
  239. package/source/directives/vary/embeddings/Authority.ts +8 -0
  240. package/source/directives/vary/embeddings/Embedding.ts +2 -1
  241. package/source/directives/vary/embeddings/Parameter.ts +14 -0
  242. package/source/directives/vary/embeddings/index.ts +6 -4
  243. package/source/exceptions.ts +22 -11
  244. package/source/manifest.ts +10 -11
  245. package/source/schemas.ts +1 -1
  246. package/transpiled/Annotation.d.ts +3 -3
  247. package/transpiled/Composition.js +2 -2
  248. package/transpiled/Composition.js.map +1 -1
  249. package/transpiled/Directive.js +4 -4
  250. package/transpiled/Directive.js.map +1 -1
  251. package/transpiled/Endpoint.d.ts +6 -4
  252. package/transpiled/Endpoint.js +28 -4
  253. package/transpiled/Endpoint.js.map +1 -1
  254. package/transpiled/Factory.d.ts +1 -1
  255. package/transpiled/Factory.js +9 -8
  256. package/transpiled/Factory.js.map +1 -1
  257. package/transpiled/Gateway.d.ts +2 -0
  258. package/transpiled/Gateway.js +36 -12
  259. package/transpiled/Gateway.js.map +1 -1
  260. package/transpiled/HTTP/Context.d.ts +8 -1
  261. package/transpiled/HTTP/Context.js +15 -2
  262. package/transpiled/HTTP/Context.js.map +1 -1
  263. package/transpiled/HTTP/Server.d.ts +13 -2
  264. package/transpiled/HTTP/Server.js +38 -36
  265. package/transpiled/HTTP/Server.js.map +1 -1
  266. package/transpiled/HTTP/exceptions.d.ts +7 -1
  267. package/transpiled/HTTP/exceptions.js +13 -1
  268. package/transpiled/HTTP/exceptions.js.map +1 -1
  269. package/transpiled/HTTP/formats/index.js +3 -3
  270. package/transpiled/HTTP/formats/index.js.map +1 -1
  271. package/transpiled/HTTP/messages.d.ts +1 -0
  272. package/transpiled/HTTP/messages.js +9 -3
  273. package/transpiled/HTTP/messages.js.map +1 -1
  274. package/transpiled/Introspection.d.ts +9 -0
  275. package/transpiled/Introspection.js +3 -0
  276. package/transpiled/Introspection.js.map +1 -0
  277. package/transpiled/Mapping.d.ts +10 -2
  278. package/transpiled/Mapping.js +48 -19
  279. package/transpiled/Mapping.js.map +1 -1
  280. package/transpiled/Query.d.ts +10 -1
  281. package/transpiled/Query.js +83 -30
  282. package/transpiled/Query.js.map +1 -1
  283. package/transpiled/RTD/Endpoint.d.ts +1 -0
  284. package/transpiled/RTD/Method.d.ts +4 -0
  285. package/transpiled/RTD/Method.js +11 -0
  286. package/transpiled/RTD/Method.js.map +1 -1
  287. package/transpiled/RTD/Node.d.ts +4 -1
  288. package/transpiled/RTD/Node.js +23 -12
  289. package/transpiled/RTD/Node.js.map +1 -1
  290. package/transpiled/RTD/Route.d.ts +1 -1
  291. package/transpiled/RTD/Route.js +0 -1
  292. package/transpiled/RTD/Route.js.map +1 -1
  293. package/transpiled/RTD/factory.js +5 -2
  294. package/transpiled/RTD/factory.js.map +1 -1
  295. package/transpiled/RTD/syntax/parse.js +34 -22
  296. package/transpiled/RTD/syntax/parse.js.map +1 -1
  297. package/transpiled/RTD/syntax/types.d.ts +5 -3
  298. package/transpiled/RTD/syntax/types.js +1 -1
  299. package/transpiled/RTD/syntax/types.js.map +1 -1
  300. package/transpiled/Remotes.d.ts +2 -4
  301. package/transpiled/Remotes.js +0 -5
  302. package/transpiled/Remotes.js.map +1 -1
  303. package/transpiled/Tenant.d.ts +0 -1
  304. package/transpiled/Tenant.js +0 -6
  305. package/transpiled/Tenant.js.map +1 -1
  306. package/transpiled/deployment.d.ts +1 -1
  307. package/transpiled/deployment.js +28 -20
  308. package/transpiled/deployment.js.map +1 -1
  309. package/transpiled/directives/auth/Authorization.js +26 -10
  310. package/transpiled/directives/auth/Authorization.js.map +1 -1
  311. package/transpiled/directives/auth/Delegate.d.ts +10 -0
  312. package/transpiled/directives/auth/Delegate.js +34 -0
  313. package/transpiled/directives/auth/Delegate.js.map +1 -0
  314. package/transpiled/directives/auth/Federation.d.ts +16 -0
  315. package/transpiled/directives/auth/Federation.js +57 -0
  316. package/transpiled/directives/auth/Federation.js.map +1 -0
  317. package/transpiled/directives/auth/Incept.js +4 -3
  318. package/transpiled/directives/auth/Incept.js.map +1 -1
  319. package/transpiled/directives/auth/Role.d.ts +4 -1
  320. package/transpiled/directives/auth/Role.js +20 -14
  321. package/transpiled/directives/auth/Role.js.map +1 -1
  322. package/transpiled/directives/auth/split.js +1 -1
  323. package/transpiled/directives/auth/split.js.map +1 -1
  324. package/transpiled/directives/cache/Cache.d.ts +3 -3
  325. package/transpiled/directives/cache/Cache.js +10 -4
  326. package/transpiled/directives/cache/Cache.js.map +1 -1
  327. package/transpiled/directives/cache/Control.d.ts +2 -1
  328. package/transpiled/directives/cache/Control.js +29 -12
  329. package/transpiled/directives/cache/Control.js.map +1 -1
  330. package/transpiled/directives/cors/CORS.js +1 -1
  331. package/transpiled/directives/cors/CORS.js.map +1 -1
  332. package/transpiled/directives/dev/Development.js +1 -1
  333. package/transpiled/directives/dev/Development.js.map +1 -1
  334. package/transpiled/directives/flow/Fetch.d.ts +13 -0
  335. package/transpiled/directives/flow/Fetch.js +59 -0
  336. package/transpiled/directives/flow/Fetch.js.map +1 -0
  337. package/transpiled/directives/flow/Flow.d.ts +10 -0
  338. package/transpiled/directives/flow/Flow.js +27 -0
  339. package/transpiled/directives/flow/Flow.js.map +1 -0
  340. package/transpiled/directives/flow/index.d.ts +2 -0
  341. package/transpiled/directives/flow/index.js +6 -0
  342. package/transpiled/directives/flow/index.js.map +1 -0
  343. package/transpiled/directives/flow/types.d.ts +5 -0
  344. package/transpiled/directives/flow/types.js.map +1 -0
  345. package/transpiled/directives/index.js +3 -1
  346. package/transpiled/directives/index.js.map +1 -1
  347. package/transpiled/directives/io/Input.js +2 -2
  348. package/transpiled/directives/io/Input.js.map +1 -1
  349. package/transpiled/directives/io/Output.js.map +1 -1
  350. package/transpiled/directives/octets/Context.d.ts +3 -3
  351. package/transpiled/directives/octets/Context.js +8 -26
  352. package/transpiled/directives/octets/Context.js.map +1 -1
  353. package/transpiled/directives/octets/Delete.d.ts +3 -2
  354. package/transpiled/directives/octets/Delete.js +3 -1
  355. package/transpiled/directives/octets/Delete.js.map +1 -1
  356. package/transpiled/directives/octets/Directive.d.ts +8 -0
  357. package/transpiled/directives/octets/Directive.js +8 -0
  358. package/transpiled/directives/octets/Directive.js.map +1 -0
  359. package/transpiled/directives/octets/Fetch.d.ts +6 -5
  360. package/transpiled/directives/octets/Fetch.js +11 -9
  361. package/transpiled/directives/octets/Fetch.js.map +1 -1
  362. package/transpiled/directives/octets/List.d.ts +6 -5
  363. package/transpiled/directives/octets/List.js +6 -4
  364. package/transpiled/directives/octets/List.js.map +1 -1
  365. package/transpiled/directives/octets/Octets.d.ts +2 -1
  366. package/transpiled/directives/octets/Octets.js +2 -4
  367. package/transpiled/directives/octets/Octets.js.map +1 -1
  368. package/transpiled/directives/octets/Store.d.ts +9 -3
  369. package/transpiled/directives/octets/Store.js +20 -8
  370. package/transpiled/directives/octets/Store.js.map +1 -1
  371. package/transpiled/directives/octets/Workflow.d.ts +3 -2
  372. package/transpiled/directives/octets/Workflow.js +9 -2
  373. package/transpiled/directives/octets/Workflow.js.map +1 -1
  374. package/transpiled/directives/octets/bytes.d.ts +1 -0
  375. package/transpiled/directives/octets/bytes.js +21 -0
  376. package/transpiled/directives/octets/bytes.js.map +1 -0
  377. package/transpiled/directives/octets/schemas.d.ts +4 -6
  378. package/transpiled/directives/octets/schemas.js +1 -3
  379. package/transpiled/directives/octets/schemas.js.map +1 -1
  380. package/transpiled/directives/octets/types.d.ts +0 -5
  381. package/transpiled/directives/octets/workflows/Execution.d.ts +5 -1
  382. package/transpiled/directives/octets/workflows/Execution.js +43 -9
  383. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  384. package/transpiled/directives/octets/workflows/Workflow.js +2 -1
  385. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  386. package/transpiled/directives/require/Directive.d.ts +4 -0
  387. package/transpiled/directives/require/Directive.js +3 -0
  388. package/transpiled/directives/require/Directive.js.map +1 -0
  389. package/transpiled/directives/require/Headers.d.ts +7 -0
  390. package/transpiled/directives/require/Headers.js +19 -0
  391. package/transpiled/directives/require/Headers.js.map +1 -0
  392. package/transpiled/directives/require/Require.d.ts +9 -0
  393. package/transpiled/directives/require/Require.js +27 -0
  394. package/transpiled/directives/require/Require.js.map +1 -0
  395. package/transpiled/directives/require/index.d.ts +2 -0
  396. package/transpiled/directives/require/index.js +6 -0
  397. package/transpiled/directives/require/index.js.map +1 -0
  398. package/transpiled/directives/vary/Directive.d.ts +2 -1
  399. package/transpiled/directives/vary/Embed.d.ts +2 -1
  400. package/transpiled/directives/vary/Embed.js +8 -6
  401. package/transpiled/directives/vary/Embed.js.map +1 -1
  402. package/transpiled/directives/vary/Vary.d.ts +2 -2
  403. package/transpiled/directives/vary/Vary.js +3 -3
  404. package/transpiled/directives/vary/Vary.js.map +1 -1
  405. package/transpiled/directives/vary/embeddings/Authority.d.ts +5 -0
  406. package/transpiled/directives/vary/embeddings/Authority.js +10 -0
  407. package/transpiled/directives/vary/embeddings/Authority.js.map +1 -0
  408. package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
  409. package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
  410. package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
  411. package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
  412. package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
  413. package/transpiled/directives/vary/embeddings/index.js +8 -4
  414. package/transpiled/directives/vary/embeddings/index.js.map +1 -1
  415. package/transpiled/exceptions.d.ts +3 -2
  416. package/transpiled/exceptions.js +13 -7
  417. package/transpiled/exceptions.js.map +1 -1
  418. package/transpiled/manifest.js +10 -11
  419. package/transpiled/manifest.js.map +1 -1
  420. package/transpiled/schemas.d.ts +1 -1
  421. package/transpiled/schemas.js +2 -2
  422. package/transpiled/schemas.js.map +1 -1
  423. package/transpiled/tsconfig.tsbuildinfo +1 -1
  424. package/tsconfig.json +9 -7
  425. package/components/identity.basic/operations/create.d.ts +0 -10
  426. package/components/identity.basic/operations/create.js +0 -10
  427. package/components/identity.basic/operations/create.js.map +0 -1
  428. package/components/identity.basic/source/create.ts +0 -18
  429. package/components/identity.federation/operations/create.d.ts +0 -10
  430. package/components/identity.federation/operations/create.js.map +0 -1
  431. package/components/identity.federation/operations/schemas.d.ts +0 -59
  432. package/components/identity.federation/operations/schemas.js +0 -9
  433. package/components/identity.federation/operations/schemas.js.map +0 -1
  434. package/components/identity.federation/operations/types.js.map +0 -1
  435. package/components/identity.federation/source/schemas.ts +0 -61
  436. package/components/octets.storage/operations/permute.js +0 -7
  437. package/schemas/octets/context.cos.yaml +0 -1
  438. package/source/HTTP/Server.test.ts +0 -126
  439. package/source/directives/octets/Permute.ts +0 -43
  440. package/transpiled/directives/octets/Permute.d.ts +0 -10
  441. package/transpiled/directives/octets/Permute.js +0 -56
  442. package/transpiled/directives/octets/Permute.js.map +0 -1
  443. /package/{components/identity.federation/operations → transpiled/directives/flow}/types.js +0 -0
package/source/Tenant.ts CHANGED
@@ -25,14 +25,6 @@ export class Tenant extends Connector {
25
25
  public override async open (): Promise<void> {
26
26
  await this.expose()
27
27
  await this.broadcast.receive('ping', this.expose.bind(this))
28
-
29
- console.info('Exposition Tenant for ' +
30
- `'${this.branch.namespace}.${this.branch.component}' has started.`)
31
- }
32
-
33
- public override async dispose (): Promise<void> {
34
- console.info('Exposition Tenant for ' +
35
- `'${this.branch.namespace}.${this.branch.component}' has been stopped.`)
36
28
  }
37
29
 
38
30
  private async expose (): Promise<void> {
@@ -1,3 +1,4 @@
1
+ import assert from 'node:assert'
1
2
  import { type Dependency, type Service } from '@toa.io/operations'
2
3
  import { encode } from '@toa.io/generic'
3
4
  import { type Annotation } from './Annotation'
@@ -5,26 +6,29 @@ import * as schemas from './schemas'
5
6
  import { shortcuts } from './Directive'
6
7
  import { components } from './Composition'
7
8
  import { parse } from './RTD/syntax'
9
+ import { DELAY, PORT } from './HTTP/Server'
10
+
11
+ export function deployment (_: unknown, annotation?: Annotation): Dependency {
12
+ assert.ok(annotation !== undefined, 'Exposition context annotation is required')
13
+ schemas.annotation.validate(annotation)
8
14
 
9
- export function deployment (_: unknown, annotation: Annotation | undefined): Dependency {
10
15
  const labels = components().labels
11
16
 
12
17
  const service: Service = {
13
18
  group: 'exposition',
14
19
  name: 'gateway',
15
- port: 8000,
20
+ port: PORT,
16
21
  // eslint-disable-next-line @typescript-eslint/no-var-requires
17
22
  version: require('../package.json').version,
18
23
  variables: [],
19
- components: labels
20
- }
21
-
22
- if (annotation?.host !== undefined)
23
- service.ingress = {
24
- host: annotation.host,
25
- class: annotation.class,
26
- annotations: annotation.annotations
24
+ components: labels,
25
+ ingress: { hosts: [] },
26
+ probe: {
27
+ path: '/.ready',
28
+ port: PORT,
29
+ delay: DELAY
27
30
  }
31
+ }
28
32
 
29
33
  if (annotation?.['/'] !== undefined) {
30
34
  const tree = parse(annotation['/'], shortcuts)
@@ -35,20 +39,26 @@ export function deployment (_: unknown, annotation: Annotation | undefined): Dep
35
39
  })
36
40
  }
37
41
 
38
- if (annotation?.debug === true)
39
- service.variables.push({
40
- name: 'TOA_EXPOSITION_DEBUG',
41
- value: '1'
42
- })
42
+ const { debug, trace, authorities } = annotation
43
43
 
44
- if (annotation?.trace === true)
45
- service.variables.push({
46
- name: 'TOA_EXPOSITION_TRACE',
47
- value: '1'
48
- })
44
+ service.ingress.hosts = Object.values(authorities)
45
+ service.ingress.class = annotation.class
46
+ service.ingress.annotations = annotation.annotations
47
+
48
+ const properties: Properties = { authorities }
49
49
 
50
- if (annotation !== undefined)
51
- schemas.annotaion.validate(annotation)
50
+ if (debug === true)
51
+ properties.debug = true
52
+
53
+ if (trace === true)
54
+ properties.trace = true
55
+
56
+ service.variables.push({
57
+ name: 'TOA_EXPOSITION_PROPERTIES',
58
+ value: encode(properties)
59
+ })
52
60
 
53
61
  return { services: [service] }
54
62
  }
63
+
64
+ type Properties = Pick<Annotation, 'authorities' | 'debug' | 'trace'>
@@ -7,8 +7,10 @@ import { Role } from './Role'
7
7
  import { Rule } from './Rule'
8
8
  import { Incept } from './Incept'
9
9
  import { Echo } from './Echo'
10
- import { split } from './split'
11
10
  import { Scheme } from './Scheme'
11
+ import { Delegate } from './Delegate'
12
+ import { Federation } from './Federation'
13
+ import { split } from './split'
12
14
  import { PRIMARY, PROVIDERS } from './schemes'
13
15
  import type { Output } from '../../io'
14
16
  import type { Component } from '@toa.io/core'
@@ -38,7 +40,7 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
38
40
 
39
41
  public create (name: string, value: any, remotes: Remotes): Directive {
40
42
  assert.ok(name in constructors,
41
- `Directive '${name}' is not provided by the '${this.name}' family.`)
43
+ `Directive 'auth:${name}' is not implemented.`)
42
44
 
43
45
  const Class = constructors[name]
44
46
 
@@ -49,13 +51,22 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
49
51
  Role, () => new Role(value as string | string[], this.discovery.roles),
50
52
  Rule, () => new Rule(value as Record<string, string>, this.create.bind(this)),
51
53
  Incept, () => new Incept(value as string, this.discovery),
54
+ Delegate, () => new Delegate(value as string, this.discovery.roles),
52
55
  () => new Class(value))
53
56
  }
54
57
 
55
58
  public async preflight (directives: Directive[],
56
59
  input: Input,
57
60
  parameters: Parameter[]): Promise<Output> {
58
- const identity = await this.resolve(input.request.headers.authorization)
61
+ /**
62
+ * Some authentication scheme providers may create identity during authentication;
63
+ * therefore, we need to skip the authentication process if the Incept directive is present.
64
+ *
65
+ * If the provided credentials already exist,
66
+ * the inception will cause a unique constraint violation on the settle stage.
67
+ */
68
+ const inception = directives.reduce((yes, directive) => yes || directive instanceof Incept, false)
69
+ const identity = inception ? null : await this.resolve(input.authority, input.request.headers.authorization)
59
70
 
60
71
  input.identity = identity
61
72
 
@@ -79,25 +90,31 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
79
90
 
80
91
  const identity = request.identity
81
92
 
82
- if (identity === null) return
93
+ if (identity === null)
94
+ return
83
95
 
84
- if (identity.scheme === PRIMARY && !identity.refresh) return
96
+ if (identity.scheme === PRIMARY && !identity.refresh)
97
+ return
85
98
 
86
99
  // Role directive may have already set the value
87
- if (identity.roles === undefined) await Role.set(identity, this.discovery.roles)
100
+ if (identity.roles === undefined)
101
+ await Role.set(identity, this.discovery.roles)
88
102
 
89
103
  this.tokens ??= await this.discovery.tokens
90
104
 
91
- const token = await this.tokens.invoke<string>('encrypt', { input: { identity } })
92
- const authorization = `Token ${token}`
105
+ const token = await this.tokens.invoke<string>('encrypt', {
106
+ input: { authority: request.authority, identity }
107
+ })
93
108
 
94
- if (response.headers === undefined) response.headers = new Headers()
109
+ const authorization = `Token ${token}`
95
110
 
111
+ response.headers ??= new Headers()
96
112
  response.headers.set('authorization', authorization)
97
113
  }
98
114
 
99
- private async resolve (authorization: string | undefined): Promise<Identity | null> {
100
- if (authorization === undefined) return null
115
+ private async resolve (authority: string, authorization: string | undefined): Promise<Identity | null> {
116
+ if (authorization === undefined)
117
+ return null
101
118
 
102
119
  const [scheme, credentials] = split(authorization)
103
120
  const provider = PROVIDERS[scheme]
@@ -108,10 +125,14 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
108
125
  this.schemes[scheme] ??= await this.discovery[provider]
109
126
 
110
127
  const result = await this.schemes[scheme].invoke<AuthenticationResult>('authenticate', {
111
- input: credentials
128
+ input: {
129
+ authority,
130
+ credentials
131
+ }
112
132
  })
113
133
 
114
- if (result instanceof Error) return null
134
+ if (result instanceof Error)
135
+ return null
115
136
 
116
137
  const identity = result.identity
117
138
 
@@ -139,7 +160,9 @@ const constructors: Record<string, new (value: any, argument?: any) => Directive
139
160
  rule: Rule,
140
161
  incept: Incept,
141
162
  scheme: Scheme,
142
- echo: Echo
163
+ echo: Echo,
164
+ delegate: Delegate,
165
+ claim: Federation
143
166
  }
144
167
 
145
168
  const REMOTES: Remote[] = ['basic', 'federation', 'tokens', 'roles', 'bans']
@@ -0,0 +1,42 @@
1
+ import { BadRequest } from '../../HTTP'
2
+ import { type Directive, type Identity } from './types'
3
+ import { Role } from './Role'
4
+ import type { Component } from '@toa.io/core'
5
+ import type { Input } from '../../io'
6
+
7
+ export class Delegate implements Directive {
8
+ private readonly property: string
9
+ private readonly discovery: Promise<Component>
10
+
11
+ public constructor (property: string, discovery: Promise<Component>) {
12
+ this.property = property
13
+ this.discovery = discovery
14
+ }
15
+
16
+ public async authorize (identity: Identity | null, context: Input): Promise<boolean> {
17
+ if (identity === null)
18
+ return false
19
+
20
+ if (identity.roles === undefined)
21
+ await Role.set(identity, this.discovery)
22
+
23
+ context.pipelines.body.push((body) => this.embed(body, identity))
24
+
25
+ return true
26
+ }
27
+
28
+ private embed (body: unknown, identity: Identity): Record<string, unknown> {
29
+ if (body === undefined)
30
+ body = {}
31
+
32
+ check(body)
33
+ body[this.property] = structuredClone(identity)
34
+
35
+ return body
36
+ }
37
+ }
38
+
39
+ function check (body: unknown): asserts body is Record<string, unknown> {
40
+ if (typeof body !== 'object' || body === null)
41
+ throw new BadRequest('Invalid request body')
42
+ }
@@ -0,0 +1,84 @@
1
+ import assert from 'node:assert'
2
+ import type { Directive, Identity, Input } from './types'
3
+ import type { Parameter } from '../../RTD'
4
+
5
+ export class Federation implements Directive {
6
+ private readonly matchers: Array<[keyof Claim, Matcher]>
7
+
8
+ public constructor (options: Options) {
9
+ this.matchers = (Object.entries(options) as Array<[keyof Claim, string]>)
10
+ .map(([key, value]) => [key, toMatcher(value)])
11
+
12
+ assert.ok(this.matchers.length > 0, 'auth:claim requires at least one property defined')
13
+ }
14
+
15
+ public authorize (identity: Identity | null, context: Input, parameters: Parameter[]): boolean {
16
+ if (identity === null || !('claim' in identity))
17
+ return false
18
+
19
+ const claim = (identity as FederatedIdentity).claim
20
+
21
+ for (const [key, match] of this.matchers)
22
+ if (!match(claim[key], context, parameters))
23
+ return false
24
+
25
+ return true
26
+ }
27
+ }
28
+
29
+ function toMatcher (expression: string): Matcher {
30
+ if (expression.startsWith(':')) {
31
+ const key = expression.slice(1) as 'authority'
32
+
33
+ if (key === 'authority')
34
+ return (value, context) => matches(value, context[key])
35
+
36
+ if (key === 'domain')
37
+ return (value, context) => {
38
+ return Array.isArray(value)
39
+ ? value.some((iss) => codomain(iss, context))
40
+ : codomain(value, context)
41
+ }
42
+
43
+ throw new Error(`Unknown 'auth:claim' syntax: ${expression}`)
44
+ }
45
+
46
+ if (expression.startsWith('/:')) {
47
+ const name = expression.slice(2)
48
+
49
+ return (value, _, parameters) => parameters
50
+ .some((parameter) => parameter.name === name && matches(value, parameter.value))
51
+ }
52
+
53
+ return (value) => matches(value, expression)
54
+ }
55
+
56
+ function matches (value: string | string[], reference: string): boolean {
57
+ return Array.isArray(value)
58
+ ? value.includes(reference)
59
+ : value === reference
60
+ }
61
+
62
+ function codomain (iss: string, context: Input): boolean {
63
+ const hostname = new URL(iss).hostname
64
+ const dot = hostname.indexOf('.')
65
+ const basename = dot === -1 ? hostname : hostname.slice(dot)
66
+
67
+ return context.authority.slice(-basename.length) === basename
68
+ }
69
+
70
+ type Matcher = (value: string | string[], context: Input, parameters: Parameter[]) => boolean
71
+
72
+ interface Claim {
73
+ iss: string
74
+ sub: string
75
+ aud: string | string[]
76
+ }
77
+
78
+ interface Options extends Partial<Claim> {
79
+ iss: string
80
+ }
81
+
82
+ interface FederatedIdentity extends Identity {
83
+ claim: Claim
84
+ }
@@ -23,7 +23,7 @@ export class Incept implements Directive {
23
23
 
24
24
  if (id === undefined)
25
25
  throw new http.Conflict('Identity inception has failed as the response body ' +
26
- ` does not contain the '${this.property}' property.`)
26
+ `does not contain the '${this.property}' property.`)
27
27
 
28
28
  const [scheme, credentials] = split(input.request.headers.authorization!)
29
29
  const provider = PROVIDERS[scheme]
@@ -31,15 +31,16 @@ export class Incept implements Directive {
31
31
  this.schemes[scheme] ??= await this.discovery[provider]
32
32
 
33
33
  const identity = await this.schemes[scheme]
34
- .invoke<Maybe<Identity>>('create', {
34
+ .invoke<Maybe<Identity>>('incept', {
35
35
  input: {
36
+ authority: input.authority,
36
37
  id,
37
38
  credentials
38
39
  }
39
40
  })
40
41
 
41
42
  if (identity instanceof Error)
42
- throw new http.Conflict(identity)
43
+ throw new http.UnprocessableEntity(identity)
43
44
 
44
45
  input.identity = identity
45
46
  input.identity.scheme = scheme
@@ -2,6 +2,7 @@ import { type Component } from '@toa.io/core'
2
2
  import { generate } from 'randomstring'
3
3
  import { Role } from './Role'
4
4
  import { type Identity } from './types'
5
+ import type { Parameter } from '../../RTD'
5
6
 
6
7
  const remote = {
7
8
  invoke: jest.fn()
@@ -16,16 +17,26 @@ beforeEach(() => {
16
17
  it('should return false if not matched', async () => {
17
18
  const roles = ['admin', 'user']
18
19
  const directive = new Role(roles, discovery)
19
- const identity: Identity = { id: generate(), scheme: '', refresh: false }
20
+
21
+ const identity: Identity = {
22
+ id: generate(),
23
+ scheme: '',
24
+ refresh: false
25
+ }
20
26
 
21
27
  remote.invoke.mockResolvedValueOnce(['guest'])
22
28
 
23
- const result = await directive.authorize(identity)
29
+ const result = await directive.authorize(identity, undefined, [])
24
30
 
25
31
  expect(result).toBe(false)
26
32
 
27
33
  expect(remote.invoke)
28
- .toBeCalledWith('list', { query: { criteria: `identity==${identity.id}`, limit: 1024 } })
34
+ .toBeCalledWith('list', {
35
+ query: {
36
+ criteria: `identity==${identity.id}`,
37
+ limit: 1024
38
+ }
39
+ })
29
40
  })
30
41
 
31
42
  it('should return true on exact match', async () => {
@@ -52,11 +63,47 @@ it('should return false on non-scope substring match', async () => {
52
63
  expect(result).toBe(false)
53
64
  })
54
65
 
55
- async function match (expected: string[], actual: string[]): Promise<boolean> {
66
+ it('should return true on match with parameters', async () => {
67
+ const result = await match(['app:{org}:reviews'],
68
+ ['app:29e54ae1:reviews'], [{
69
+ name: 'org',
70
+ value: '29e54ae1'
71
+ }])
72
+
73
+ expect(result).toBe(true)
74
+ })
75
+
76
+ it('should return true on match with parameters', async () => {
77
+ const result = await match(['app:{org}:reviews'],
78
+ ['app:29e54ae1:reviews'], [{
79
+ name: 'org',
80
+ value: '29e54ae1'
81
+ }])
82
+
83
+ expect(result).toBe(true)
84
+ })
85
+
86
+ it('should return false on mismatch with parameters', async () => {
87
+ const result = await match(['app:{org}:reviews'],
88
+ ['app:29e54ae1:reviews'], [{
89
+ name: 'org',
90
+ value: '88584c9b'
91
+ }])
92
+
93
+ expect(result).toBe(false)
94
+ })
95
+
96
+ async function match
97
+ (expected: string[], actual: string[], parameters: Parameter[] = []): Promise<boolean> {
56
98
  const directive = new Role(expected, discovery)
57
- const identity: Identity = { id: generate(), scheme: '', refresh: false }
99
+
100
+ const identity: Identity = {
101
+ id: generate(),
102
+ scheme: '',
103
+ refresh: false
104
+ }
58
105
 
59
106
  remote.invoke.mockResolvedValueOnce(actual)
60
107
 
61
- return await directive.authorize(identity)
108
+ return await directive.authorize(identity, undefined, parameters)
62
109
  }
@@ -1,14 +1,18 @@
1
+ import assert from 'node:assert'
1
2
  import { type Component, type Query } from '@toa.io/core'
2
3
  import { type Directive, type Identity } from './types'
4
+ import type { Parameter } from '../../RTD'
3
5
 
4
6
  export class Role implements Directive {
5
7
  public static remote: Component | null = null
6
8
  private readonly roles: string[]
7
9
  private readonly discovery: Promise<Component>
10
+ private readonly dynamic: boolean
8
11
 
9
12
  public constructor (roles: string | string[], discovery: Promise<Component>) {
10
13
  this.roles = typeof roles === 'string' ? [roles] : roles
11
14
  this.discovery = discovery
15
+ this.dynamic = this.roles.some((role) => role.includes('{'))
12
16
  }
13
17
 
14
18
  public static async set (identity: Identity, discovery: Promise<Component>): Promise<void> {
@@ -22,37 +26,41 @@ export class Role implements Directive {
22
26
  identity.roles = await this.remote.invoke('list', { query })
23
27
  }
24
28
 
25
- public async authorize (identity: Identity | null): Promise<boolean> {
29
+ public async authorize
30
+ (identity: Identity | null, _: unknown, parameters: Parameter[]): Promise<boolean> {
26
31
  if (identity === null)
27
32
  return false
28
33
 
29
34
  await Role.set(identity, this.discovery)
30
35
 
31
- if (identity.roles === undefined)
36
+ if (identity.roles!.length === 0) // Role.set()
37
+
32
38
  return false
33
39
 
34
- return this.match(identity.roles)
40
+ return this.match(identity.roles!, parameters)
35
41
  }
36
42
 
37
- private match (roles: string[]): boolean {
43
+ private match (roles: string[], parameters: Parameter[]): boolean {
44
+ const required = this.dynamic ? this.substitute(parameters) : this.roles
45
+
38
46
  for (const role of roles) {
39
- const index = this.roles.findIndex((expected) => compare(expected, role))
47
+ const ok = required.some((expected) => expected === role || expected.startsWith(role + ':'))
40
48
 
41
- if (index !== -1)
49
+ if (ok)
42
50
  return true
43
51
  }
44
52
 
45
53
  return false
46
54
  }
47
- }
48
55
 
49
- function compare (expected: string, actual: string): boolean {
50
- const exp = expected.split(':')
51
- const act = actual.split(':')
56
+ private substitute (parameters: Parameter[]): string[] {
57
+ return this.roles.map((role) => role.replaceAll(/{(\w+)}/g, (_, key) => {
58
+ const value = parameters.find((parameter) => parameter.name === key)?.value
52
59
 
53
- for (let i = 0; i < act.length; i++)
54
- if (exp[i] !== act[i])
55
- return false
60
+ assert.ok(value !== undefined,
61
+ `Role '${role}' requires '${key}' route parameter.`)
56
62
 
57
- return true
63
+ return value
64
+ }))
65
+ }
58
66
  }
@@ -5,7 +5,7 @@ export function split (authorization: string): [Scheme, string] {
5
5
  const space = authorization.indexOf(' ')
6
6
 
7
7
  if (space === -1)
8
- throw new http.Unauthorized('Malformed authorization header.')
8
+ throw new http.Unauthorized('Malformed authorization header')
9
9
 
10
10
  const Scheme = authorization.slice(0, space)
11
11
  const scheme = Scheme.toLowerCase() as Scheme
@@ -8,7 +8,7 @@ export interface Directive {
8
8
  authorize: (
9
9
  identity: Identity | null,
10
10
  input: Input,
11
- parameters: Parameter[],
11
+ parameters: Parameter[]
12
12
  ) => boolean | Promise<boolean>
13
13
 
14
14
  reply?: (identity: Identity | null) => http.OutgoingMessage
@@ -1,19 +1,19 @@
1
1
  import { Control } from './Control'
2
2
  import { Exact } from './Exact'
3
- import type { Input, Output } from '../../io'
4
- import type { Directive } from './types'
3
+ import type { Output } from '../../io'
4
+ import type { AuthenticatedContext, Directive } from './types'
5
5
  import type { DirectiveFamily } from '../../RTD'
6
6
  import type * as http from '../../HTTP'
7
7
 
8
8
  export class Cache implements DirectiveFamily<Directive> {
9
9
  public readonly name: string = 'cache'
10
- public readonly mandatory: boolean = false
10
+ public readonly mandatory: boolean = true
11
11
 
12
12
  public create (name: string, value: any): Directive {
13
13
  const Class = constructors[name]
14
14
 
15
15
  if (Class === undefined)
16
- throw new Error(`Directive '${name}' is not provided by the '${this.name}' family.`)
16
+ throw new Error(`Directive 'cache:${name}' is not implemented.`)
17
17
 
18
18
  return new Class(value)
19
19
  }
@@ -23,9 +23,16 @@ export class Cache implements DirectiveFamily<Directive> {
23
23
  }
24
24
 
25
25
  public async settle
26
- (directives: Directive[], input: Input, response: http.OutgoingMessage): Promise<void> {
26
+ (directives: Directive[], context: AuthenticatedContext, response: http.OutgoingMessage): Promise<void> {
27
+ const directive = directives[0]
28
+
27
29
  response.headers ??= new Headers()
28
- directives[0]?.set(input, response.headers)
30
+
31
+ if (directive === undefined) {
32
+ if (context.identity !== null && !Control.disabled(response.headers))
33
+ response.headers.set('cache-control', 'private')
34
+ } else
35
+ directive.set(context, response.headers)
29
36
  }
30
37
  }
31
38