@toa.io/extensions.exposition 1.0.0-alpha.3 → 1.0.0-alpha.31

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 (431) hide show
  1. package/components/context.toa.yaml +2 -2
  2. package/components/identity.bans/manifest.toa.yaml +15 -6
  3. package/components/identity.bans/operations/transit.d.ts +14 -0
  4. package/components/identity.bans/operations/transit.js +11 -0
  5. package/components/identity.bans/operations/transit.js.map +1 -0
  6. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
  7. package/components/identity.bans/source/transit.ts +21 -0
  8. package/components/identity.bans/tsconfig.json +9 -0
  9. package/components/identity.basic/manifest.toa.yaml +21 -8
  10. package/components/identity.basic/operations/authenticate.d.ts +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 +20 -0
  15. package/components/identity.basic/operations/incept.js.map +1 -0
  16. package/components/identity.basic/operations/transit.d.ts +3 -3
  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 +2 -0
  21. package/components/identity.basic/source/authenticate.ts +16 -5
  22. package/components/identity.basic/source/incept.ts +32 -0
  23. package/components/identity.basic/source/transit.ts +7 -5
  24. package/components/identity.basic/source/types.ts +2 -0
  25. package/components/identity.federation/manifest.toa.yaml +28 -17
  26. package/components/identity.federation/operations/authenticate.d.ts +2 -2
  27. package/components/identity.federation/operations/authenticate.js +6 -5
  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 +4 -5
  33. package/components/identity.federation/operations/lib/jwt.js +3 -3
  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 +15 -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} +8 -3
  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.js → types/entity.js} +1 -1
  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 +10 -9
  49. package/components/identity.federation/source/{create.ts → incept.ts} +10 -9
  50. package/components/identity.federation/source/lib/jwt.test.ts +2 -2
  51. package/components/identity.federation/source/lib/jwt.ts +7 -8
  52. package/components/identity.federation/source/types/configuration.ts +16 -0
  53. package/components/identity.federation/source/{types.ts → types/context.ts} +9 -4
  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 +2 -2
  57. package/components/identity.roles/manifest.toa.yaml +18 -5
  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 -4
  75. package/components/identity.tokens/operations/authenticate.d.ts +2 -2
  76. package/components/identity.tokens/operations/authenticate.js +10 -4
  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 +12 -5
  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 +0 -6
  93. package/components/octets.storage/operations/store.js +1 -1
  94. package/documentation/access.md +27 -16
  95. package/documentation/authorities.md +53 -0
  96. package/documentation/cache.md +8 -1
  97. package/documentation/components.md +52 -27
  98. package/documentation/identity.md +17 -22
  99. package/documentation/io.md +56 -0
  100. package/documentation/protocol.md +3 -0
  101. package/documentation/query.md +57 -8
  102. package/documentation/require.md +15 -0
  103. package/documentation/tree.md +22 -4
  104. package/documentation/vary.md +14 -14
  105. package/entity.json +0 -0
  106. package/features/access.feature +83 -56
  107. package/features/annotation.feature +2 -0
  108. package/features/authorities.basic.feature +141 -0
  109. package/features/authorities.feature +32 -0
  110. package/features/authorities.federation.feature +99 -0
  111. package/features/authorities.tokens.feature +118 -0
  112. package/features/body.feature +5 -1
  113. package/features/cache.feature +78 -5
  114. package/features/cors.feature +6 -2
  115. package/features/debug.feature +34 -0
  116. package/features/directives.feature +5 -0
  117. package/features/dynamic.feature +18 -7
  118. package/features/errors.feature +19 -5
  119. package/features/etag.feature +103 -0
  120. package/features/identity.bans.feature +137 -0
  121. package/features/identity.basic.feature +137 -14
  122. package/features/identity.feature +7 -2
  123. package/features/identity.federation.feature +61 -8
  124. package/features/identity.roles.feature +220 -4
  125. package/features/identity.tokens.feature +114 -4
  126. package/features/io.feature +205 -0
  127. package/features/octets.entries.feature +11 -1
  128. package/features/octets.feature +60 -64
  129. package/features/octets.meta.feature +7 -3
  130. package/features/octets.workflows.feature +14 -0
  131. package/features/probes.feature +14 -0
  132. package/features/{queries.feature → query.feature} +50 -3
  133. package/features/require.feature +67 -0
  134. package/features/response.feature +12 -3
  135. package/features/routes.feature +25 -12
  136. package/features/steps/Database.ts +17 -10
  137. package/features/steps/Gateway.ts +24 -4
  138. package/features/steps/IdP.ts +28 -23
  139. package/features/steps/components/echo/manifest.toa.yaml +5 -0
  140. package/features/steps/components/echo/operations/identity.js +7 -0
  141. package/features/steps/components/greeter/manifest.toa.yaml +1 -0
  142. package/features/steps/components/octets.tester/manifest.toa.yaml +1 -0
  143. package/features/steps/components/pots/manifest.toa.yaml +12 -3
  144. package/features/steps/components/sequences/manifest.toa.yaml +1 -0
  145. package/features/steps/components/users.properties/manifest.toa.yaml +2 -1
  146. package/features/streams.feature +1 -0
  147. package/features/timing.feature +69 -0
  148. package/features/vary.feature +105 -3
  149. package/package.json +12 -14
  150. package/readme.md +19 -13
  151. package/schemas/annotation.cos.yaml +2 -1
  152. package/schemas/io/input.cos.yaml +3 -0
  153. package/schemas/io/message.cos.yaml +5 -0
  154. package/schemas/io/output.cos.yaml +5 -0
  155. package/schemas/querystring.cos.yaml +1 -0
  156. package/source/Annotation.ts +3 -2
  157. package/source/Context.ts +6 -4
  158. package/source/Directive.test.ts +7 -7
  159. package/source/Directive.ts +19 -46
  160. package/source/Endpoint.ts +55 -6
  161. package/source/Factory.ts +17 -9
  162. package/source/Gateway.ts +38 -53
  163. package/source/HTTP/Context.ts +89 -0
  164. package/source/HTTP/Server.ts +99 -121
  165. package/source/HTTP/Timing.ts +40 -0
  166. package/source/HTTP/exceptions.ts +7 -1
  167. package/source/HTTP/index.ts +1 -0
  168. package/source/HTTP/messages.test.ts +27 -8
  169. package/source/HTTP/messages.ts +32 -48
  170. package/source/Mapping.ts +12 -8
  171. package/source/Query.test.ts +1 -1
  172. package/source/Query.ts +35 -24
  173. package/source/RTD/Context.ts +7 -10
  174. package/source/RTD/Directives.ts +28 -4
  175. package/source/RTD/Endpoint.ts +6 -4
  176. package/source/RTD/Match.ts +2 -7
  177. package/source/RTD/Method.ts +7 -13
  178. package/source/RTD/Node.ts +13 -14
  179. package/source/RTD/Tree.ts +17 -16
  180. package/source/RTD/factory.ts +3 -6
  181. package/source/Tenant.ts +0 -8
  182. package/source/deployment.ts +33 -17
  183. package/source/directives/auth/Anonymous.ts +3 -2
  184. package/source/directives/auth/Authorization.ts +34 -21
  185. package/source/directives/auth/Delegate.ts +35 -0
  186. package/source/directives/auth/Incept.ts +13 -7
  187. package/source/directives/auth/Role.test.ts +53 -6
  188. package/source/directives/auth/Role.ts +27 -17
  189. package/source/directives/auth/Scheme.ts +2 -2
  190. package/source/directives/auth/types.ts +1 -1
  191. package/source/directives/cache/Cache.ts +5 -5
  192. package/source/directives/cache/Control.ts +48 -22
  193. package/source/directives/cache/types.ts +1 -1
  194. package/source/directives/cors/CORS.ts +18 -10
  195. package/source/directives/dev/Development.ts +4 -4
  196. package/source/directives/index.ts +6 -4
  197. package/source/directives/io/Directive.ts +11 -0
  198. package/source/directives/io/IO.ts +43 -0
  199. package/source/directives/io/Input.ts +50 -0
  200. package/source/directives/io/Message.ts +1 -0
  201. package/source/directives/io/Output.ts +69 -0
  202. package/source/directives/io/index.ts +3 -0
  203. package/source/directives/io/schemas.ts +12 -0
  204. package/source/directives/octets/Context.ts +5 -4
  205. package/source/directives/octets/Delete.ts +23 -11
  206. package/source/directives/octets/Directive.ts +10 -0
  207. package/source/directives/octets/Fetch.ts +33 -17
  208. package/source/directives/octets/List.ts +18 -8
  209. package/source/directives/octets/Octets.ts +9 -9
  210. package/source/directives/octets/Store.ts +29 -19
  211. package/source/directives/octets/Workflow.ts +12 -5
  212. package/source/directives/octets/types.ts +0 -7
  213. package/source/directives/octets/workflows/Workflow.ts +2 -2
  214. package/source/directives/require/Directive.ts +5 -0
  215. package/source/directives/require/Headers.ts +20 -0
  216. package/source/directives/require/Require.ts +28 -0
  217. package/source/directives/require/index.ts +3 -0
  218. package/source/directives/vary/Directive.ts +2 -1
  219. package/source/directives/vary/Embed.ts +14 -8
  220. package/source/directives/vary/Vary.ts +8 -6
  221. package/source/directives/vary/embeddings/Authority.ts +8 -0
  222. package/source/directives/vary/embeddings/Embedding.ts +2 -1
  223. package/source/directives/vary/embeddings/Header.ts +9 -7
  224. package/source/directives/vary/embeddings/Language.ts +2 -2
  225. package/source/directives/vary/embeddings/Parameter.ts +14 -0
  226. package/source/directives/vary/embeddings/index.ts +6 -4
  227. package/source/exceptions.ts +22 -11
  228. package/source/io.ts +2 -2
  229. package/source/root.ts +5 -0
  230. package/source/schemas.ts +1 -1
  231. package/transpiled/Annotation.d.ts +3 -2
  232. package/transpiled/Context.d.ts +6 -4
  233. package/transpiled/Directive.d.ts +8 -21
  234. package/transpiled/Directive.js +11 -14
  235. package/transpiled/Directive.js.map +1 -1
  236. package/transpiled/Endpoint.d.ts +7 -5
  237. package/transpiled/Endpoint.js +60 -2
  238. package/transpiled/Endpoint.js.map +1 -1
  239. package/transpiled/Factory.js +11 -4
  240. package/transpiled/Factory.js.map +1 -1
  241. package/transpiled/Gateway.d.ts +4 -8
  242. package/transpiled/Gateway.js +25 -35
  243. package/transpiled/Gateway.js.map +1 -1
  244. package/transpiled/HTTP/Context.d.ts +31 -0
  245. package/transpiled/HTTP/Context.js +60 -0
  246. package/transpiled/HTTP/Context.js.map +1 -0
  247. package/transpiled/HTTP/Server.d.ts +21 -9
  248. package/transpiled/HTTP/Server.js +98 -100
  249. package/transpiled/HTTP/Server.js.map +1 -1
  250. package/transpiled/HTTP/Timing.d.ts +10 -0
  251. package/transpiled/HTTP/Timing.js +29 -0
  252. package/transpiled/HTTP/Timing.js.map +1 -0
  253. package/transpiled/HTTP/exceptions.d.ts +4 -1
  254. package/transpiled/HTTP/exceptions.js +7 -1
  255. package/transpiled/HTTP/exceptions.js.map +1 -1
  256. package/transpiled/HTTP/index.d.ts +1 -0
  257. package/transpiled/HTTP/index.js +1 -0
  258. package/transpiled/HTTP/index.js.map +1 -1
  259. package/transpiled/HTTP/messages.d.ts +7 -21
  260. package/transpiled/HTTP/messages.js +24 -26
  261. package/transpiled/HTTP/messages.js.map +1 -1
  262. package/transpiled/Mapping.js +11 -8
  263. package/transpiled/Mapping.js.map +1 -1
  264. package/transpiled/Query.d.ts +1 -0
  265. package/transpiled/Query.js +21 -20
  266. package/transpiled/Query.js.map +1 -1
  267. package/transpiled/RTD/Context.d.ts +7 -6
  268. package/transpiled/RTD/Directives.d.ts +19 -4
  269. package/transpiled/RTD/Endpoint.d.ts +6 -4
  270. package/transpiled/RTD/Match.d.ts +2 -4
  271. package/transpiled/RTD/Method.d.ts +7 -7
  272. package/transpiled/RTD/Method.js.map +1 -1
  273. package/transpiled/RTD/Node.d.ts +4 -6
  274. package/transpiled/RTD/Node.js +2 -1
  275. package/transpiled/RTD/Node.js.map +1 -1
  276. package/transpiled/RTD/Tree.d.ts +6 -6
  277. package/transpiled/RTD/Tree.js +4 -1
  278. package/transpiled/RTD/Tree.js.map +1 -1
  279. package/transpiled/RTD/factory.d.ts +2 -4
  280. package/transpiled/RTD/factory.js +1 -1
  281. package/transpiled/RTD/factory.js.map +1 -1
  282. package/transpiled/Tenant.d.ts +0 -1
  283. package/transpiled/Tenant.js +0 -6
  284. package/transpiled/Tenant.js.map +1 -1
  285. package/transpiled/deployment.d.ts +1 -1
  286. package/transpiled/deployment.js +28 -15
  287. package/transpiled/deployment.js.map +1 -1
  288. package/transpiled/directives/auth/Anonymous.js +3 -4
  289. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  290. package/transpiled/directives/auth/Authorization.d.ts +2 -3
  291. package/transpiled/directives/auth/Authorization.js +18 -11
  292. package/transpiled/directives/auth/Authorization.js.map +1 -1
  293. package/transpiled/directives/auth/Delegate.d.ts +8 -0
  294. package/transpiled/directives/auth/Delegate.js +29 -0
  295. package/transpiled/directives/auth/Delegate.js.map +1 -0
  296. package/transpiled/directives/auth/Incept.d.ts +1 -1
  297. package/transpiled/directives/auth/Incept.js +13 -7
  298. package/transpiled/directives/auth/Incept.js.map +1 -1
  299. package/transpiled/directives/auth/Role.d.ts +4 -1
  300. package/transpiled/directives/auth/Role.js +25 -17
  301. package/transpiled/directives/auth/Role.js.map +1 -1
  302. package/transpiled/directives/auth/Scheme.js +2 -2
  303. package/transpiled/directives/auth/Scheme.js.map +1 -1
  304. package/transpiled/directives/cache/Cache.d.ts +3 -3
  305. package/transpiled/directives/cache/Cache.js +3 -3
  306. package/transpiled/directives/cache/Cache.js.map +1 -1
  307. package/transpiled/directives/cache/Control.d.ts +5 -4
  308. package/transpiled/directives/cache/Control.js +32 -15
  309. package/transpiled/directives/cache/Control.js.map +1 -1
  310. package/transpiled/directives/cache/types.d.ts +1 -1
  311. package/transpiled/directives/cors/CORS.d.ts +2 -3
  312. package/transpiled/directives/cors/CORS.js +17 -10
  313. package/transpiled/directives/cors/CORS.js.map +1 -1
  314. package/transpiled/directives/dev/Development.d.ts +3 -3
  315. package/transpiled/directives/dev/Development.js +1 -1
  316. package/transpiled/directives/dev/Development.js.map +1 -1
  317. package/transpiled/directives/index.d.ts +2 -2
  318. package/transpiled/directives/index.js +5 -3
  319. package/transpiled/directives/index.js.map +1 -1
  320. package/transpiled/directives/io/Directive.d.ts +8 -0
  321. package/transpiled/directives/io/Directive.js +3 -0
  322. package/transpiled/directives/io/Directive.js.map +1 -0
  323. package/transpiled/directives/io/IO.d.ts +9 -0
  324. package/transpiled/directives/io/IO.js +33 -0
  325. package/transpiled/directives/io/IO.js.map +1 -0
  326. package/transpiled/directives/io/Input.d.ts +11 -0
  327. package/transpiled/directives/{octets/Permute.js → io/Input.js} +33 -21
  328. package/transpiled/directives/io/Input.js.map +1 -0
  329. package/transpiled/directives/io/Message.d.ts +1 -0
  330. package/transpiled/directives/io/Message.js +3 -0
  331. package/transpiled/directives/io/Message.js.map +1 -0
  332. package/transpiled/directives/io/Output.d.ts +13 -0
  333. package/transpiled/directives/io/Output.js +76 -0
  334. package/transpiled/directives/io/Output.js.map +1 -0
  335. package/transpiled/directives/io/index.d.ts +2 -0
  336. package/transpiled/directives/io/index.js +6 -0
  337. package/transpiled/directives/io/index.js.map +1 -0
  338. package/transpiled/directives/io/schemas.d.ts +7 -0
  339. package/transpiled/directives/io/schemas.js +14 -0
  340. package/transpiled/directives/io/schemas.js.map +1 -0
  341. package/transpiled/directives/octets/Context.d.ts +4 -4
  342. package/transpiled/directives/octets/Context.js +4 -2
  343. package/transpiled/directives/octets/Context.js.map +1 -1
  344. package/transpiled/directives/octets/Delete.d.ts +4 -3
  345. package/transpiled/directives/octets/Delete.js +22 -10
  346. package/transpiled/directives/octets/Delete.js.map +1 -1
  347. package/transpiled/directives/octets/Directive.d.ts +8 -0
  348. package/transpiled/directives/octets/Directive.js +8 -0
  349. package/transpiled/directives/octets/Directive.js.map +1 -0
  350. package/transpiled/directives/octets/Fetch.d.ts +4 -3
  351. package/transpiled/directives/octets/Fetch.js +31 -15
  352. package/transpiled/directives/octets/Fetch.js.map +1 -1
  353. package/transpiled/directives/octets/List.d.ts +4 -3
  354. package/transpiled/directives/octets/List.js +16 -7
  355. package/transpiled/directives/octets/List.js.map +1 -1
  356. package/transpiled/directives/octets/Octets.d.ts +4 -4
  357. package/transpiled/directives/octets/Octets.js +5 -5
  358. package/transpiled/directives/octets/Octets.js.map +1 -1
  359. package/transpiled/directives/octets/Store.d.ts +4 -3
  360. package/transpiled/directives/octets/Store.js +20 -13
  361. package/transpiled/directives/octets/Store.js.map +1 -1
  362. package/transpiled/directives/octets/Workflow.d.ts +4 -3
  363. package/transpiled/directives/octets/Workflow.js +11 -4
  364. package/transpiled/directives/octets/Workflow.js.map +1 -1
  365. package/transpiled/directives/octets/types.d.ts +0 -5
  366. package/transpiled/directives/octets/workflows/Workflow.d.ts +1 -1
  367. package/transpiled/directives/octets/workflows/Workflow.js +2 -2
  368. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  369. package/transpiled/directives/require/Directive.d.ts +4 -0
  370. package/transpiled/directives/require/Directive.js +3 -0
  371. package/transpiled/directives/require/Directive.js.map +1 -0
  372. package/transpiled/directives/require/Headers.d.ts +7 -0
  373. package/transpiled/directives/require/Headers.js +19 -0
  374. package/transpiled/directives/require/Headers.js.map +1 -0
  375. package/transpiled/directives/require/Require.d.ts +9 -0
  376. package/transpiled/directives/require/Require.js +27 -0
  377. package/transpiled/directives/require/Require.js.map +1 -0
  378. package/transpiled/directives/require/index.d.ts +2 -0
  379. package/transpiled/directives/require/index.js +6 -0
  380. package/transpiled/directives/require/index.js.map +1 -0
  381. package/transpiled/directives/vary/Directive.d.ts +2 -1
  382. package/transpiled/directives/vary/Embed.d.ts +2 -1
  383. package/transpiled/directives/vary/Embed.js +8 -6
  384. package/transpiled/directives/vary/Embed.js.map +1 -1
  385. package/transpiled/directives/vary/Vary.d.ts +3 -3
  386. package/transpiled/directives/vary/Vary.js +4 -4
  387. package/transpiled/directives/vary/Vary.js.map +1 -1
  388. package/transpiled/directives/vary/embeddings/Authority.d.ts +5 -0
  389. package/transpiled/directives/vary/embeddings/Authority.js +10 -0
  390. package/transpiled/directives/vary/embeddings/Authority.js.map +1 -0
  391. package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
  392. package/transpiled/directives/vary/embeddings/Header.js +9 -7
  393. package/transpiled/directives/vary/embeddings/Header.js.map +1 -1
  394. package/transpiled/directives/vary/embeddings/Language.js +2 -2
  395. package/transpiled/directives/vary/embeddings/Language.js.map +1 -1
  396. package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
  397. package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
  398. package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
  399. package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
  400. package/transpiled/directives/vary/embeddings/index.js +8 -4
  401. package/transpiled/directives/vary/embeddings/index.js.map +1 -1
  402. package/transpiled/exceptions.d.ts +3 -2
  403. package/transpiled/exceptions.js +13 -7
  404. package/transpiled/exceptions.js.map +1 -1
  405. package/transpiled/io.d.ts +2 -2
  406. package/transpiled/root.js +5 -0
  407. package/transpiled/root.js.map +1 -1
  408. package/transpiled/schemas.d.ts +1 -1
  409. package/transpiled/schemas.js +2 -2
  410. package/transpiled/schemas.js.map +1 -1
  411. package/transpiled/tsconfig.tsbuildinfo +1 -1
  412. package/components/identity.basic/operations/create.d.ts +0 -10
  413. package/components/identity.basic/operations/create.js +0 -10
  414. package/components/identity.basic/operations/create.js.map +0 -1
  415. package/components/identity.basic/source/create.ts +0 -18
  416. package/components/identity.federation/operations/create.d.ts +0 -10
  417. package/components/identity.federation/operations/create.js.map +0 -1
  418. package/components/identity.federation/operations/schemas.d.ts +0 -59
  419. package/components/identity.federation/operations/schemas.js +0 -9
  420. package/components/identity.federation/operations/schemas.js.map +0 -1
  421. package/components/identity.federation/operations/types.js.map +0 -1
  422. package/components/identity.federation/source/schemas.ts +0 -61
  423. package/components/octets.storage/operations/permute.js +0 -7
  424. package/source/HTTP/Server.fixtures.ts +0 -40
  425. package/source/HTTP/Server.test.ts +0 -126
  426. package/source/directives/octets/Permute.ts +0 -37
  427. package/transpiled/HTTP/Server.fixtures.d.ts +0 -10
  428. package/transpiled/HTTP/Server.fixtures.js +0 -31
  429. package/transpiled/HTTP/Server.fixtures.js.map +0 -1
  430. package/transpiled/directives/octets/Permute.d.ts +0 -10
  431. package/transpiled/directives/octets/Permute.js.map +0 -1
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,14 +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 !== undefined)
45
- schemas.annotaion.validate(annotation)
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
+
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
+ })
46
60
 
47
61
  return { services: [service] }
48
62
  }
63
+
64
+ type Properties = Pick<Annotation, 'authorities' | 'debug' | 'trace'>
@@ -8,7 +8,8 @@ export class Anonymous implements Directive {
8
8
  }
9
9
 
10
10
  public authorize (_: any, input: Input): boolean {
11
- if ('authorization' in input.headers) return false
12
- else return this.allow
11
+ return 'authorization' in input.request.headers
12
+ ? false
13
+ : this.allow
13
14
  }
14
15
  }
@@ -7,14 +7,14 @@ 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 { split } from './split'
12
13
  import { PRIMARY, PROVIDERS } from './schemes'
13
14
  import type { Output } from '../../io'
14
15
  import type { Component } from '@toa.io/core'
15
16
  import type { Remotes } from '../../Remotes'
16
- import type { Family } from '../../Directive'
17
- import type { Parameter } from '../../RTD'
17
+ import type { Parameter, DirectiveFamily } from '../../RTD'
18
18
  import type {
19
19
  AuthenticationResult,
20
20
  Ban,
@@ -27,7 +27,7 @@ import type {
27
27
  Schemes
28
28
  } from './types'
29
29
 
30
- export class Authorization implements Family<Directive, Extension> {
30
+ export class Authorization implements DirectiveFamily<Directive, Extension> {
31
31
  public readonly depends: string[] = ['Vary']
32
32
  public readonly name: string = 'auth'
33
33
  public readonly mandatory: boolean = true
@@ -38,10 +38,10 @@ export class Authorization implements Family<Directive, Extension> {
38
38
  private bans: Component | null = null
39
39
 
40
40
  public create (name: string, value: any, remotes: Remotes): Directive {
41
- assert.ok(name in CLASSES,
42
- `Directive '${name}' is not provided by the '${this.name}' family.`)
41
+ assert.ok(name in constructors,
42
+ `Directive 'auth:${name}' is not implemented.`)
43
43
 
44
- const Class = CLASSES[name]
44
+ const Class = constructors[name]
45
45
 
46
46
  for (const name of REMOTES)
47
47
  this.discovery[name] ??= remotes.discover('identity', name)
@@ -56,7 +56,7 @@ export class Authorization implements Family<Directive, Extension> {
56
56
  public async preflight (directives: Directive[],
57
57
  input: Input,
58
58
  parameters: Parameter[]): Promise<Output> {
59
- const identity = await this.resolve(input.headers.authorization)
59
+ const identity = await this.resolve(input.authority, input.request.headers.authorization)
60
60
 
61
61
  input.identity = identity
62
62
 
@@ -67,8 +67,10 @@ export class Authorization implements Family<Directive, Extension> {
67
67
  return directive.reply?.(identity) ?? null
68
68
  }
69
69
 
70
- if (identity === null) throw new http.Unauthorized()
71
- else throw new http.Forbidden()
70
+ if (identity === null)
71
+ throw new http.Unauthorized()
72
+ else
73
+ throw new http.Forbidden()
72
74
  }
73
75
 
74
76
  public async settle (directives: Directive[],
@@ -78,25 +80,32 @@ export class Authorization implements Family<Directive, Extension> {
78
80
 
79
81
  const identity = request.identity
80
82
 
81
- if (identity === null) return
83
+ if (identity === null)
84
+ return
82
85
 
83
- if (identity.scheme === PRIMARY && !identity.refresh) return
86
+ if (identity.scheme === PRIMARY && !identity.refresh)
87
+ return
84
88
 
85
89
  // Role directive may have already set the value
86
- if (identity.roles === undefined) await Role.set(identity, this.discovery.roles)
90
+ if (identity.roles === undefined)
91
+ await Role.set(identity, this.discovery.roles)
87
92
 
88
93
  this.tokens ??= await this.discovery.tokens
89
94
 
90
- const token = await this.tokens.invoke<string>('encrypt', { input: { identity } })
91
- const authorization = `Token ${token}`
95
+ const token = await this.tokens.invoke<string>('encrypt', {
96
+ input: { authority: request.authority, identity }
97
+ })
92
98
 
93
- if (response.headers === undefined) response.headers = new Headers()
99
+ const authorization = `Token ${token}`
94
100
 
101
+ response.headers ??= new Headers()
95
102
  response.headers.set('authorization', authorization)
103
+ response.headers.append('cache-control', 'no-store')
96
104
  }
97
105
 
98
- private async resolve (authorization: string | undefined): Promise<Identity | null> {
99
- if (authorization === undefined) return null
106
+ private async resolve (authority: string, authorization: string | undefined): Promise<Identity | null> {
107
+ if (authorization === undefined)
108
+ return null
100
109
 
101
110
  const [scheme, credentials] = split(authorization)
102
111
  const provider = PROVIDERS[scheme]
@@ -107,7 +116,10 @@ export class Authorization implements Family<Directive, Extension> {
107
116
  this.schemes[scheme] ??= await this.discovery[provider]
108
117
 
109
118
  const result = await this.schemes[scheme].invoke<AuthenticationResult>('authenticate', {
110
- input: credentials
119
+ input: {
120
+ authority,
121
+ credentials
122
+ }
111
123
  })
112
124
 
113
125
  if (result instanceof Error) return null
@@ -131,14 +143,15 @@ export class Authorization implements Family<Directive, Extension> {
131
143
  }
132
144
  }
133
145
 
134
- const CLASSES: Record<string, new (value: any, argument?: any) => Directive> = {
146
+ const constructors: Record<string, new (value: any, argument?: any) => Directive> = {
135
147
  anonymous: Anonymous,
136
148
  id: Id,
137
149
  role: Role,
138
150
  rule: Rule,
139
151
  incept: Incept,
140
152
  scheme: Scheme,
141
- echo: Echo
153
+ echo: Echo,
154
+ delegate: Delegate
142
155
  }
143
156
 
144
157
  const REMOTES: Remote[] = ['basic', 'federation', 'tokens', 'roles', 'bans']
@@ -0,0 +1,35 @@
1
+ import { BadRequest } from '../../HTTP'
2
+ import { type Directive, type Identity } from './types'
3
+ import type { Input } from '../../io'
4
+
5
+ export class Delegate implements Directive {
6
+ private readonly property: string
7
+
8
+ public constructor (property: string) {
9
+ this.property = property
10
+ }
11
+
12
+ public authorize (identity: Identity | null, context: Input): boolean {
13
+ if (identity === null)
14
+ return false
15
+
16
+ context.pipelines.body.push((body) => this.embed(body, identity))
17
+
18
+ return true
19
+ }
20
+
21
+ private embed (body: unknown, identity: Identity): Record<string, unknown> {
22
+ if (body === undefined)
23
+ body = {}
24
+
25
+ check(body)
26
+ body[this.property] = identity
27
+
28
+ return body
29
+ }
30
+ }
31
+
32
+ function check (body: unknown): asserts body is Record<string, unknown> {
33
+ if (typeof body !== 'object' || body === null)
34
+ throw new BadRequest('Invalid request body')
35
+ }
@@ -15,28 +15,34 @@ export class Incept implements Directive {
15
15
  }
16
16
 
17
17
  public authorize (identity: Identity | null, input: Input): boolean {
18
- return identity === null && 'authorization' in input.headers
18
+ return identity === null && 'authorization' in input.request.headers
19
19
  }
20
20
 
21
- public async settle (request: Input, response: http.OutgoingMessage): Promise<void> {
21
+ public async settle (input: Input, response: http.OutgoingMessage): Promise<void> {
22
22
  const id = response.body?.[this.property]
23
23
 
24
24
  if (id === undefined)
25
25
  throw new http.Conflict('Identity inception has failed as the response body ' +
26
26
  ` does not contain the '${this.property}' property.`)
27
27
 
28
- const [scheme, credentials] = split(request.headers.authorization!)
28
+ const [scheme, credentials] = split(input.request.headers.authorization!)
29
29
  const provider = PROVIDERS[scheme]
30
30
 
31
31
  this.schemes[scheme] ??= await this.discovery[provider]
32
32
 
33
33
  const identity = await this.schemes[scheme]
34
- .invoke<Maybe<Identity>>('create', { input: { id, credentials } })
34
+ .invoke<Maybe<Identity>>('incept', {
35
+ input: {
36
+ authority: input.authority,
37
+ id,
38
+ credentials
39
+ }
40
+ })
35
41
 
36
42
  if (identity instanceof Error)
37
- throw new http.Conflict(identity)
43
+ throw new http.UnprocessableEntity(identity)
38
44
 
39
- request.identity = identity
40
- request.identity.scheme = scheme
45
+ input.identity = identity
46
+ input.identity.scheme = scheme
41
47
  }
42
48
  }
@@ -2,6 +2,7 @@ import { type Component } from '@toa.io/core'
2
2
  import { generate } from 'randomstring'
3
3
  import { Role } from './Role'
4
4
  import { type Identity } from './types'
5
+ import type { Parameter } from '../../RTD'
5
6
 
6
7
  const remote = {
7
8
  invoke: jest.fn()
@@ -16,16 +17,26 @@ beforeEach(() => {
16
17
  it('should return false if not matched', async () => {
17
18
  const roles = ['admin', 'user']
18
19
  const directive = new Role(roles, discovery)
19
- const identity: Identity = { id: generate(), scheme: '', refresh: false }
20
+
21
+ const identity: Identity = {
22
+ id: generate(),
23
+ scheme: '',
24
+ refresh: false
25
+ }
20
26
 
21
27
  remote.invoke.mockResolvedValueOnce(['guest'])
22
28
 
23
- const result = await directive.authorize(identity)
29
+ const result = await directive.authorize(identity, undefined, [])
24
30
 
25
31
  expect(result).toBe(false)
26
32
 
27
33
  expect(remote.invoke)
28
- .toBeCalledWith('list', { query: { criteria: `identity==${identity.id}`, limit: 1024 } })
34
+ .toBeCalledWith('list', {
35
+ query: {
36
+ criteria: `identity==${identity.id}`,
37
+ limit: 1024
38
+ }
39
+ })
29
40
  })
30
41
 
31
42
  it('should return true on exact match', async () => {
@@ -52,11 +63,47 @@ it('should return false on non-scope substring match', async () => {
52
63
  expect(result).toBe(false)
53
64
  })
54
65
 
55
- async function match (expected: string[], actual: string[]): Promise<boolean> {
66
+ it('should return true on match with parameters', async () => {
67
+ const result = await match(['app:{org}:reviews'],
68
+ ['app:29e54ae1:reviews'], [{
69
+ name: 'org',
70
+ value: '29e54ae1'
71
+ }])
72
+
73
+ expect(result).toBe(true)
74
+ })
75
+
76
+ it('should return true on match with parameters', async () => {
77
+ const result = await match(['app:{org}:reviews'],
78
+ ['app:29e54ae1:reviews'], [{
79
+ name: 'org',
80
+ value: '29e54ae1'
81
+ }])
82
+
83
+ expect(result).toBe(true)
84
+ })
85
+
86
+ it('should return false on mismatch with parameters', async () => {
87
+ const result = await match(['app:{org}:reviews'],
88
+ ['app:29e54ae1:reviews'], [{
89
+ name: 'org',
90
+ value: '88584c9b'
91
+ }])
92
+
93
+ expect(result).toBe(false)
94
+ })
95
+
96
+ async function match
97
+ (expected: string[], actual: string[], parameters: Parameter[] = []): Promise<boolean> {
56
98
  const directive = new Role(expected, discovery)
57
- const identity: Identity = { id: generate(), scheme: '', refresh: false }
99
+
100
+ const identity: Identity = {
101
+ id: generate(),
102
+ scheme: '',
103
+ refresh: false
104
+ }
58
105
 
59
106
  remote.invoke.mockResolvedValueOnce(actual)
60
107
 
61
- return await directive.authorize(identity)
108
+ return await directive.authorize(identity, undefined, parameters)
62
109
  }
@@ -1,56 +1,66 @@
1
+ import assert from 'node:assert'
1
2
  import { type Component, type Query } from '@toa.io/core'
2
3
  import { type Directive, type Identity } from './types'
4
+ import type { Parameter } from '../../RTD'
3
5
 
4
6
  export class Role implements Directive {
5
7
  public static remote: Component | null = null
6
8
  private readonly roles: string[]
7
9
  private readonly discovery: Promise<Component>
10
+ private readonly dynamic: boolean
8
11
 
9
12
  public constructor (roles: string | string[], discovery: Promise<Component>) {
10
13
  this.roles = typeof roles === 'string' ? [roles] : roles
11
14
  this.discovery = discovery
15
+ this.dynamic = this.roles.some((role) => role.includes('{'))
12
16
  }
13
17
 
14
18
  public static async set (identity: Identity, discovery: Promise<Component>): Promise<void> {
15
19
  this.remote ??= await discovery
16
20
 
17
- const query: Query = { criteria: `identity==${identity.id}`, limit: 1024 }
18
- const roles: string[] = await this.remote.invoke('list', { query })
21
+ const query: Query = {
22
+ criteria: `identity==${identity.id}`,
23
+ limit: 1024
24
+ }
19
25
 
20
- identity.roles = roles
26
+ identity.roles = await this.remote.invoke('list', { query })
21
27
  }
22
28
 
23
- public async authorize (identity: Identity | null): Promise<boolean> {
29
+ public async authorize
30
+ (identity: Identity | null, _: unknown, parameters: Parameter[]): Promise<boolean> {
24
31
  if (identity === null)
25
32
  return false
26
33
 
27
34
  await Role.set(identity, this.discovery)
28
35
 
29
- if (identity.roles === undefined)
36
+ if (identity.roles!.length === 0) // Role.set()
37
+
30
38
  return false
31
39
 
32
- return this.match(identity.roles)
40
+ return this.match(identity.roles!, parameters)
33
41
  }
34
42
 
35
- private match (roles: string[]): boolean {
43
+ private match (roles: string[], parameters: Parameter[]): boolean {
44
+ const required = this.dynamic ? this.substitute(parameters) : this.roles
45
+
36
46
  for (const role of roles) {
37
- const index = this.roles.findIndex((expected) => compare(expected, role))
47
+ const ok = required.some((expected) => expected === role || expected.startsWith(role + ':'))
38
48
 
39
- if (index !== -1)
49
+ if (ok)
40
50
  return true
41
51
  }
42
52
 
43
53
  return false
44
54
  }
45
- }
46
55
 
47
- function compare (expected: string, actual: string): boolean {
48
- const exp = expected.split(':')
49
- const act = actual.split(':')
56
+ private substitute (parameters: Parameter[]): string[] {
57
+ return this.roles.map((role) => role.replaceAll(/{(\w+)}/g, (_, key) => {
58
+ const value = parameters.find((parameter) => parameter.name === key)?.value
50
59
 
51
- for (let i = 0; i < act.length; i++)
52
- if (exp[i] !== act[i])
53
- return false
60
+ assert.ok(value !== undefined,
61
+ `Role '${role}' requires '${key}' route parameter.`)
54
62
 
55
- return true
63
+ return value
64
+ }))
65
+ }
56
66
  }
@@ -12,10 +12,10 @@ export class Scheme implements Directive {
12
12
  }
13
13
 
14
14
  public authorize (_: Identity | null, input: Input): boolean {
15
- if (input.headers.authorization === undefined)
15
+ if (input.request.headers.authorization === undefined)
16
16
  return false
17
17
 
18
- const [scheme] = split(input.headers.authorization)
18
+ const [scheme] = split(input.request.headers.authorization)
19
19
 
20
20
  if (scheme !== this.scheme)
21
21
  throw new http.Forbidden(this.Scheme +
@@ -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
@@ -2,10 +2,10 @@ import { Control } from './Control'
2
2
  import { Exact } from './Exact'
3
3
  import type { Input, Output } from '../../io'
4
4
  import type { Directive } from './types'
5
- import type { Family } from '../../Directive'
5
+ import type { DirectiveFamily } from '../../RTD'
6
6
  import type * as http from '../../HTTP'
7
7
 
8
- export class Cache implements Family<Directive> {
8
+ export class Cache implements DirectiveFamily<Directive> {
9
9
  public readonly name: string = 'cache'
10
10
  public readonly mandatory: boolean = false
11
11
 
@@ -13,7 +13,7 @@ export class Cache implements Family<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,9 @@ export class Cache implements Family<Directive> {
23
23
  }
24
24
 
25
25
  public async settle
26
- (directives: Directive[], request: Input, response: http.OutgoingMessage): Promise<void> {
26
+ (directives: Directive[], input: Input, response: http.OutgoingMessage): Promise<void> {
27
27
  response.headers ??= new Headers()
28
- directives[0]?.set(request, response.headers)
28
+ directives[0]?.set(input, response.headers)
29
29
  }
30
30
  }
31
31
 
@@ -1,59 +1,85 @@
1
1
  import { match } from 'matchacho'
2
- import type { AuthenticatedRequest, Directive } from './types'
2
+ import type { AuthenticatedContext, Directive } from './types'
3
3
 
4
4
  export class Control implements Directive {
5
5
  protected readonly value: string
6
6
  private cache: string | null = null
7
+ private vary: boolean = false
7
8
 
8
9
  public constructor (value: string) {
9
10
  this.value = value
10
11
  }
11
12
 
12
- public set (request: AuthenticatedRequest, headers: Headers): void {
13
- if (!['GET', 'HEAD', 'OPTIONS'].includes(request.method))
13
+ public set (context: AuthenticatedContext, headers: Headers): void {
14
+ if (!['GET', 'HEAD', 'OPTIONS'].includes(context.request.method))
14
15
  return
15
16
 
16
- this.cache ??= this.resolve(request)
17
+ this.cache ??= this.resolve(context)
17
18
 
18
- headers.set('cache-control', this.cache)
19
+ if (this.disabled(headers))
20
+ return
21
+
22
+ headers.append('cache-control', this.cache)
23
+
24
+ if (this.vary !== null)
25
+ headers.append('vary', 'authorization')
19
26
  }
20
27
 
21
- protected resolve (request: AuthenticatedRequest): string {
28
+ protected resolve (request: AuthenticatedContext): string {
22
29
  if (request.identity === null)
23
30
  return this.value
24
31
 
25
- const directives = this.mask()
32
+ const directives = mask(this.value)
33
+
34
+ if ((directives & PRIVATE) === PRIVATE)
35
+ this.vary = true
26
36
 
27
37
  if ((directives & (PUBLIC | NO_CACHE)) === PUBLIC)
28
38
  return 'no-cache, ' + this.value
29
39
 
30
- if ((directives & (PUBLIC | PRIVATE)) === 0)
40
+ if ((directives & (PUBLIC | PRIVATE)) === 0) {
41
+ this.vary = true
42
+
31
43
  return 'private, ' + this.value
44
+ }
32
45
 
33
46
  return this.value
34
47
  }
35
48
 
36
- private mask (): number {
37
- const directives = this.value.match(DIRECTIVES_RX)
38
-
39
- if (directives === null)
40
- return 0
49
+ private disabled (headers: Headers): boolean {
50
+ const value = headers.get('cache-control')
41
51
 
42
- let mask = 0
52
+ if (value === null)
53
+ return false
43
54
 
44
- for (const directive of directives)
45
- mask |= match<number>(directive,
46
- 'private', PRIVATE,
47
- 'public', PUBLIC,
48
- 'no-cache', NO_CACHE,
49
- 0)
55
+ const directives = mask(value)
50
56
 
51
- return mask
57
+ return (directives & NO_STORE) === NO_STORE
52
58
  }
53
59
  }
54
60
 
55
- const DIRECTIVES_RX = /\b(private|public|no-cache)\b/ig
61
+ function mask (value: string): number {
62
+ const directives = value.match(DIRECTIVES_RX)
63
+
64
+ if (directives === null)
65
+ return 0
66
+
67
+ let mask = 0
68
+
69
+ for (const directive of directives)
70
+ mask |= match<number>(directive,
71
+ 'private', PRIVATE,
72
+ 'public', PUBLIC,
73
+ 'no-cache', NO_CACHE,
74
+ 'no-store', NO_STORE,
75
+ 0)
76
+
77
+ return mask
78
+ }
79
+
80
+ const DIRECTIVES_RX = /\b(private|public|no-cache|no-store)\b/ig
56
81
 
57
82
  const PUBLIC = 1
58
83
  const PRIVATE = 2
59
84
  const NO_CACHE = 4
85
+ const NO_STORE = 8
@@ -4,6 +4,6 @@ export interface Directive {
4
4
  set: (input: Input, headers: Headers) => void
5
5
  }
6
6
 
7
- export interface AuthenticatedRequest extends Input {
7
+ export interface AuthenticatedContext extends Input {
8
8
  identity?: unknown | null
9
9
  }