@toa.io/extensions.exposition 1.0.0-alpha.0 → 1.0.0-alpha.10

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 (547) hide show
  1. package/components/context.toa.yaml +12 -0
  2. package/components/identity.bans/manifest.toa.yaml +2 -1
  3. package/components/identity.basic/manifest.toa.yaml +6 -2
  4. package/components/identity.basic/operations/authenticate.d.ts +9 -0
  5. package/components/identity.basic/operations/authenticate.js +24 -0
  6. package/components/identity.basic/operations/authenticate.js.map +1 -0
  7. package/components/identity.basic/operations/create.d.ts +10 -0
  8. package/components/identity.basic/operations/create.js +10 -0
  9. package/components/identity.basic/operations/create.js.map +1 -0
  10. package/components/identity.basic/operations/transit.d.ts +12 -0
  11. package/components/identity.basic/operations/transit.js +53 -0
  12. package/components/identity.basic/operations/transit.js.map +1 -0
  13. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -0
  14. package/components/identity.basic/operations/types.d.ts +38 -0
  15. package/components/identity.basic/operations/types.js +3 -0
  16. package/components/identity.basic/operations/types.js.map +1 -0
  17. package/components/identity.basic/source/authenticate.ts +0 -1
  18. package/components/identity.federation/events/principal.js +22 -0
  19. package/components/identity.federation/manifest.toa.yaml +94 -0
  20. package/components/identity.federation/operations/authenticate.d.ts +3 -0
  21. package/components/identity.federation/operations/authenticate.js +20 -0
  22. package/components/identity.federation/operations/authenticate.js.map +1 -0
  23. package/components/identity.federation/operations/create.d.ts +10 -0
  24. package/components/identity.federation/operations/create.js +15 -0
  25. package/components/identity.federation/operations/create.js.map +1 -0
  26. package/components/identity.federation/operations/lib/assertions-as-values.d.ts +4 -0
  27. package/components/identity.federation/operations/lib/assertions-as-values.js +45 -0
  28. package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -0
  29. package/components/identity.federation/operations/lib/jwt.d.ts +20 -0
  30. package/components/identity.federation/operations/lib/jwt.js +136 -0
  31. package/components/identity.federation/operations/lib/jwt.js.map +1 -0
  32. package/components/identity.federation/operations/schemas.d.ts +59 -0
  33. package/components/identity.federation/operations/schemas.js +9 -0
  34. package/components/identity.federation/operations/schemas.js.map +1 -0
  35. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -0
  36. package/components/identity.federation/operations/types.d.ts +51 -0
  37. package/components/identity.federation/operations/types.js +3 -0
  38. package/components/identity.federation/operations/types.js.map +1 -0
  39. package/components/identity.federation/source/authenticate.ts +28 -0
  40. package/components/identity.federation/source/create.ts +26 -0
  41. package/components/identity.federation/source/lib/assertions-as-values.ts +19 -0
  42. package/components/identity.federation/source/lib/jwt.test.ts +56 -0
  43. package/components/identity.federation/source/lib/jwt.ts +171 -0
  44. package/components/identity.federation/source/schemas.ts +61 -0
  45. package/components/identity.federation/source/types.ts +56 -0
  46. package/components/identity.federation/tsconfig.json +9 -0
  47. package/components/identity.roles/manifest.toa.yaml +17 -5
  48. package/components/identity.roles/operations/grant.d.ts +10 -0
  49. package/components/identity.roles/operations/grant.js +20 -0
  50. package/components/identity.roles/operations/grant.js.map +1 -0
  51. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  52. package/components/identity.roles/operations/lib/Entity.js +3 -0
  53. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  54. package/components/identity.roles/operations/list.d.ts +2 -0
  55. package/components/identity.roles/operations/list.js +8 -0
  56. package/components/identity.roles/operations/list.js.map +1 -0
  57. package/components/identity.roles/operations/principal.d.ts +13 -0
  58. package/components/identity.roles/operations/principal.js +13 -0
  59. package/components/identity.roles/operations/principal.js.map +1 -0
  60. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -0
  61. package/components/identity.roles/source/grant.ts +31 -0
  62. package/components/identity.roles/source/lib/Entity.ts +5 -0
  63. package/components/identity.roles/source/list.ts +2 -4
  64. package/components/identity.roles/source/principal.ts +10 -8
  65. package/components/identity.tokens/manifest.toa.yaml +1 -1
  66. package/components/identity.tokens/operations/authenticate.d.ts +9 -0
  67. package/components/identity.tokens/operations/authenticate.js +32 -0
  68. package/components/identity.tokens/operations/authenticate.js.map +1 -0
  69. package/components/identity.tokens/operations/decrypt.d.ts +3 -0
  70. package/components/identity.tokens/operations/decrypt.js +32 -0
  71. package/components/identity.tokens/operations/decrypt.js.map +1 -0
  72. package/components/identity.tokens/operations/encrypt.d.ts +8 -0
  73. package/components/identity.tokens/operations/encrypt.js +22 -0
  74. package/components/identity.tokens/operations/encrypt.js.map +1 -0
  75. package/components/identity.tokens/operations/revoke.d.ts +2 -0
  76. package/components/identity.tokens/operations/revoke.js +8 -0
  77. package/components/identity.tokens/operations/revoke.js.map +1 -0
  78. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -0
  79. package/components/identity.tokens/operations/types.d.ts +40 -0
  80. package/components/identity.tokens/operations/types.js +3 -0
  81. package/components/identity.tokens/operations/types.js.map +1 -0
  82. package/components/octets.storage/manifest.toa.yaml +1 -0
  83. package/components/octets.storage/operations/store.js +3 -3
  84. package/cucumber.js +0 -1
  85. package/documentation/access.md +11 -11
  86. package/documentation/components.md +49 -13
  87. package/documentation/identity.md +14 -7
  88. package/documentation/io.md +56 -0
  89. package/documentation/octets.md +105 -40
  90. package/documentation/protocol.md +21 -1
  91. package/documentation/query.md +51 -6
  92. package/documentation/tree.md +22 -4
  93. package/documentation/vary.md +69 -0
  94. package/features/access.feature +13 -2
  95. package/features/annotation.feature +1 -0
  96. package/features/body.feature +3 -1
  97. package/features/cache.feature +3 -0
  98. package/features/cors.feature +72 -0
  99. package/features/directives.feature +2 -0
  100. package/features/dynamic.feature +14 -7
  101. package/features/errors.feature +4 -3
  102. package/features/etag.feature +97 -0
  103. package/features/identity.basic.feature +68 -0
  104. package/features/identity.feature +19 -3
  105. package/features/identity.federation.feature +153 -0
  106. package/features/identity.roles.feature +151 -0
  107. package/features/identity.tokens.feature +3 -0
  108. package/features/io.feature +167 -0
  109. package/features/octets.entries.feature +123 -0
  110. package/features/octets.feature +4 -28
  111. package/features/octets.meta.feature +66 -0
  112. package/features/octets.workflows.feature +177 -4
  113. package/features/queries.feature +9 -1
  114. package/features/response.feature +68 -0
  115. package/features/routes.feature +54 -10
  116. package/features/steps/Captures.ts +6 -0
  117. package/features/steps/Components.ts +18 -6
  118. package/features/steps/Database.ts +1 -1
  119. package/features/steps/Gateway.ts +4 -2
  120. package/features/steps/HTTP.ts +40 -87
  121. package/features/steps/IdP.ts +149 -0
  122. package/features/steps/Parameters.ts +8 -2
  123. package/features/steps/Workspace.ts +5 -7
  124. package/features/steps/components/echo/manifest.toa.yaml +1 -0
  125. package/features/steps/components/echo/operations/error.js +11 -0
  126. package/features/steps/components/greeter/manifest.toa.yaml +1 -0
  127. package/features/steps/components/octets.tester/manifest.toa.yaml +4 -0
  128. package/features/steps/components/octets.tester/operations/concat.js +7 -0
  129. package/features/steps/components/octets.tester/operations/echo.js +7 -0
  130. package/features/steps/components/pots/manifest.toa.yaml +12 -3
  131. package/features/steps/components/sequences/manifest.toa.yaml +1 -0
  132. package/features/steps/components/users/manifest.toa.yaml +4 -0
  133. package/features/steps/components/users.properties/manifest.toa.yaml +14 -0
  134. package/features/steps/tsconfig.json +1 -1
  135. package/features/timing.feature +66 -0
  136. package/features/vary.feature +180 -0
  137. package/package.json +16 -20
  138. package/readme.md +7 -6
  139. package/schemas/annotation.cos.yaml +1 -0
  140. package/schemas/io/input.cos.yaml +3 -0
  141. package/schemas/io/message.cos.yaml +5 -0
  142. package/schemas/io/output.cos.yaml +5 -0
  143. package/schemas/octets/delete.cos.yaml +2 -1
  144. package/schemas/octets/list.cos.yaml +2 -1
  145. package/schemas/octets/workflow.cos.yaml +12 -0
  146. package/schemas/querystring.cos.yaml +1 -0
  147. package/source/Annotation.ts +1 -0
  148. package/source/Context.ts +6 -4
  149. package/source/Directive.test.ts +14 -8
  150. package/source/Directive.ts +26 -49
  151. package/source/Endpoint.ts +53 -6
  152. package/source/Factory.ts +23 -12
  153. package/source/Gateway.ts +45 -42
  154. package/source/HTTP/Context.ts +67 -0
  155. package/source/HTTP/Server.test.ts +61 -134
  156. package/source/HTTP/Server.ts +96 -87
  157. package/source/HTTP/Timing.ts +40 -0
  158. package/source/HTTP/formats/msgpack.ts +9 -6
  159. package/source/HTTP/formats/text.ts +1 -1
  160. package/source/HTTP/formats/yaml.ts +1 -1
  161. package/source/HTTP/index.ts +1 -0
  162. package/source/HTTP/messages.test.ts +27 -8
  163. package/source/HTTP/messages.ts +38 -42
  164. package/source/Interception.ts +24 -0
  165. package/source/Mapping.ts +7 -8
  166. package/source/RTD/Context.ts +7 -10
  167. package/source/RTD/Directives.ts +28 -4
  168. package/source/RTD/Endpoint.ts +6 -4
  169. package/source/RTD/Match.ts +2 -7
  170. package/source/RTD/Method.ts +7 -13
  171. package/source/RTD/Node.ts +13 -14
  172. package/source/RTD/Tree.ts +19 -15
  173. package/source/RTD/factory.ts +2 -5
  174. package/source/RTD/syntax/parse.ts +6 -6
  175. package/source/RTD/syntax/types.ts +1 -1
  176. package/source/deployment.ts +7 -2
  177. package/source/directives/auth/Anonymous.ts +3 -2
  178. package/source/directives/auth/{Family.ts → Authorization.ts} +39 -40
  179. package/source/directives/auth/Delegate.ts +32 -0
  180. package/source/directives/auth/Incept.ts +11 -6
  181. package/source/directives/auth/Role.ts +5 -3
  182. package/source/directives/auth/Rule.ts +2 -2
  183. package/source/directives/auth/Scheme.ts +2 -2
  184. package/source/directives/auth/index.ts +2 -2
  185. package/source/directives/auth/schemes.ts +2 -1
  186. package/source/directives/auth/types.ts +9 -6
  187. package/source/directives/cache/{Family.ts → Cache.ts} +6 -7
  188. package/source/directives/cache/Control.ts +5 -5
  189. package/source/directives/cache/index.ts +2 -2
  190. package/source/directives/cache/types.ts +2 -2
  191. package/source/directives/cors/CORS.ts +62 -0
  192. package/source/directives/cors/index.ts +3 -0
  193. package/source/directives/dev/{Family.ts → Development.ts} +4 -5
  194. package/source/directives/dev/Stub.ts +4 -4
  195. package/source/directives/dev/Throw.ts +4 -4
  196. package/source/directives/dev/index.ts +2 -2
  197. package/source/directives/dev/types.ts +1 -1
  198. package/source/directives/index.ts +11 -6
  199. package/source/directives/io/Directive.ts +11 -0
  200. package/source/directives/io/IO.ts +43 -0
  201. package/source/directives/io/Input.ts +50 -0
  202. package/source/directives/io/Message.ts +1 -0
  203. package/source/directives/io/Output.ts +69 -0
  204. package/source/directives/io/index.ts +3 -0
  205. package/source/directives/io/schemas.ts +12 -0
  206. package/source/directives/octets/Context.ts +6 -5
  207. package/source/directives/octets/Delete.ts +64 -11
  208. package/source/directives/octets/Directive.ts +10 -0
  209. package/source/directives/octets/Fetch.ts +44 -29
  210. package/source/directives/octets/List.ts +50 -10
  211. package/source/directives/octets/{Family.ts → Octets.ts} +14 -9
  212. package/source/directives/octets/Permute.ts +18 -11
  213. package/source/directives/octets/Store.ts +70 -102
  214. package/source/directives/octets/Workflow.ts +48 -0
  215. package/source/directives/octets/index.ts +2 -2
  216. package/source/directives/octets/schemas.test.ts +21 -0
  217. package/source/directives/octets/schemas.ts +13 -6
  218. package/source/directives/octets/types.ts +2 -8
  219. package/source/directives/octets/workflows/Execution.ts +76 -0
  220. package/source/directives/octets/workflows/Workflow.ts +37 -0
  221. package/source/directives/octets/workflows/index.ts +1 -0
  222. package/source/directives/vary/Directive.ts +6 -0
  223. package/source/directives/vary/Embed.ts +62 -0
  224. package/source/directives/vary/Properties.ts +17 -0
  225. package/source/directives/vary/Vary.ts +48 -0
  226. package/source/directives/vary/embeddings/Embedding.ts +6 -0
  227. package/source/directives/vary/embeddings/Header.ts +32 -0
  228. package/source/directives/vary/embeddings/Language.ts +31 -0
  229. package/source/directives/vary/embeddings/index.ts +11 -0
  230. package/source/directives/vary/index.ts +3 -0
  231. package/source/exceptions.ts +13 -9
  232. package/source/io.ts +4 -0
  233. package/source/manifest.test.ts +6 -14
  234. package/source/manifest.ts +9 -6
  235. package/source/root.ts +5 -0
  236. package/source/schemas.ts +7 -3
  237. package/transpiled/Annotation.d.ts +8 -0
  238. package/transpiled/Annotation.js +3 -0
  239. package/transpiled/Annotation.js.map +1 -0
  240. package/transpiled/Branch.d.ts +7 -0
  241. package/transpiled/Branch.js +3 -0
  242. package/transpiled/Branch.js.map +1 -0
  243. package/transpiled/Composition.d.ts +14 -0
  244. package/transpiled/Composition.js +43 -0
  245. package/transpiled/Composition.js.map +1 -0
  246. package/transpiled/Context.d.ts +7 -0
  247. package/transpiled/Context.js +3 -0
  248. package/transpiled/Context.js.map +1 -0
  249. package/transpiled/Directive.d.ts +18 -0
  250. package/transpiled/Directive.js +75 -0
  251. package/transpiled/Directive.js.map +1 -0
  252. package/transpiled/Endpoint.d.ts +22 -0
  253. package/transpiled/Endpoint.js +101 -0
  254. package/transpiled/Endpoint.js.map +1 -0
  255. package/transpiled/Factory.d.ts +9 -0
  256. package/transpiled/Factory.js +73 -0
  257. package/transpiled/Factory.js.map +1 -0
  258. package/transpiled/Gateway.d.ts +18 -0
  259. package/transpiled/Gateway.js +92 -0
  260. package/transpiled/Gateway.js.map +1 -0
  261. package/transpiled/HTTP/Context.d.ts +24 -0
  262. package/transpiled/HTTP/Context.js +47 -0
  263. package/transpiled/HTTP/Context.js.map +1 -0
  264. package/transpiled/HTTP/Server.d.ts +25 -0
  265. package/transpiled/HTTP/Server.js +141 -0
  266. package/transpiled/HTTP/Server.js.map +1 -0
  267. package/transpiled/HTTP/Timing.d.ts +10 -0
  268. package/transpiled/HTTP/Timing.js +29 -0
  269. package/transpiled/HTTP/Timing.js.map +1 -0
  270. package/transpiled/HTTP/exceptions.d.ts +34 -0
  271. package/transpiled/HTTP/exceptions.js +71 -0
  272. package/transpiled/HTTP/exceptions.js.map +1 -0
  273. package/transpiled/HTTP/formats/index.d.ts +10 -0
  274. package/transpiled/HTTP/formats/index.js +38 -0
  275. package/transpiled/HTTP/formats/index.js.map +1 -0
  276. package/transpiled/HTTP/formats/json.d.ts +6 -0
  277. package/transpiled/HTTP/formats/json.js +17 -0
  278. package/transpiled/HTTP/formats/json.js.map +1 -0
  279. package/transpiled/HTTP/formats/msgpack.d.ts +6 -0
  280. package/transpiled/HTTP/formats/msgpack.js +17 -0
  281. package/transpiled/HTTP/formats/msgpack.js.map +1 -0
  282. package/transpiled/HTTP/formats/text.d.ts +8 -0
  283. package/transpiled/HTTP/formats/text.js +15 -0
  284. package/transpiled/HTTP/formats/text.js.map +1 -0
  285. package/transpiled/HTTP/formats/yaml.d.ts +6 -0
  286. package/transpiled/HTTP/formats/yaml.js +41 -0
  287. package/transpiled/HTTP/formats/yaml.js.map +1 -0
  288. package/transpiled/HTTP/index.d.ts +4 -0
  289. package/transpiled/HTTP/index.js +21 -0
  290. package/transpiled/HTTP/index.js.map +1 -0
  291. package/transpiled/HTTP/messages.d.ts +19 -0
  292. package/transpiled/HTTP/messages.js +73 -0
  293. package/transpiled/HTTP/messages.js.map +1 -0
  294. package/transpiled/Interception.d.ts +9 -0
  295. package/transpiled/Interception.js +19 -0
  296. package/transpiled/Interception.js.map +1 -0
  297. package/transpiled/Mapping.d.ts +8 -0
  298. package/transpiled/Mapping.js +38 -0
  299. package/transpiled/Mapping.js.map +1 -0
  300. package/transpiled/Query.d.ts +13 -0
  301. package/transpiled/Query.js +107 -0
  302. package/transpiled/Query.js.map +1 -0
  303. package/transpiled/RTD/Context.d.ts +12 -0
  304. package/transpiled/RTD/Context.js +3 -0
  305. package/transpiled/RTD/Context.js.map +1 -0
  306. package/transpiled/RTD/Directives.d.ts +22 -0
  307. package/transpiled/RTD/Directives.js +3 -0
  308. package/transpiled/RTD/Directives.js.map +1 -0
  309. package/transpiled/RTD/Endpoint.d.ts +11 -0
  310. package/transpiled/RTD/Endpoint.js +3 -0
  311. package/transpiled/RTD/Endpoint.js.map +1 -0
  312. package/transpiled/RTD/Match.d.ts +9 -0
  313. package/transpiled/RTD/Match.js +3 -0
  314. package/transpiled/RTD/Match.js.map +1 -0
  315. package/transpiled/RTD/Method.d.ts +9 -0
  316. package/transpiled/RTD/Method.js +16 -0
  317. package/transpiled/RTD/Method.js.map +1 -0
  318. package/transpiled/RTD/Node.d.ts +19 -0
  319. package/transpiled/RTD/Node.js +62 -0
  320. package/transpiled/RTD/Node.js.map +1 -0
  321. package/transpiled/RTD/Route.d.ts +14 -0
  322. package/transpiled/RTD/Route.js +49 -0
  323. package/transpiled/RTD/Route.js.map +1 -0
  324. package/transpiled/RTD/Tree.d.ts +14 -0
  325. package/transpiled/RTD/Tree.js +45 -0
  326. package/transpiled/RTD/Tree.js.map +1 -0
  327. package/transpiled/RTD/factory.d.ts +4 -0
  328. package/transpiled/RTD/factory.js +36 -0
  329. package/transpiled/RTD/factory.js.map +1 -0
  330. package/transpiled/RTD/index.d.ts +8 -0
  331. package/transpiled/RTD/index.js +38 -0
  332. package/transpiled/RTD/index.js.map +1 -0
  333. package/transpiled/RTD/segment.d.ts +8 -0
  334. package/transpiled/RTD/segment.js +25 -0
  335. package/transpiled/RTD/segment.js.map +1 -0
  336. package/transpiled/RTD/syntax/index.d.ts +2 -0
  337. package/transpiled/RTD/syntax/index.js +19 -0
  338. package/transpiled/RTD/syntax/index.js.map +1 -0
  339. package/transpiled/RTD/syntax/parse.d.ts +4 -0
  340. package/transpiled/RTD/syntax/parse.js +128 -0
  341. package/transpiled/RTD/syntax/parse.js.map +1 -0
  342. package/transpiled/RTD/syntax/types.d.ts +41 -0
  343. package/transpiled/RTD/syntax/types.js +5 -0
  344. package/transpiled/RTD/syntax/types.js.map +1 -0
  345. package/transpiled/Remotes.d.ts +9 -0
  346. package/transpiled/Remotes.js +25 -0
  347. package/transpiled/Remotes.js.map +1 -0
  348. package/transpiled/Tenant.d.ts +13 -0
  349. package/transpiled/Tenant.js +34 -0
  350. package/transpiled/Tenant.js.map +1 -0
  351. package/transpiled/deployment.d.ts +3 -0
  352. package/transpiled/deployment.js +71 -0
  353. package/transpiled/deployment.js.map +1 -0
  354. package/transpiled/directives/auth/Anonymous.d.ts +6 -0
  355. package/transpiled/directives/auth/Anonymous.js +16 -0
  356. package/transpiled/directives/auth/Anonymous.js.map +1 -0
  357. package/transpiled/directives/auth/Authorization.d.ts +19 -0
  358. package/transpiled/directives/auth/Authorization.js +127 -0
  359. package/transpiled/directives/auth/Authorization.js.map +1 -0
  360. package/transpiled/directives/auth/Delegate.d.ts +8 -0
  361. package/transpiled/directives/auth/Delegate.js +27 -0
  362. package/transpiled/directives/auth/Delegate.js.map +1 -0
  363. package/transpiled/directives/auth/Echo.d.ts +6 -0
  364. package/transpiled/directives/auth/Echo.js +13 -0
  365. package/transpiled/directives/auth/Echo.js.map +1 -0
  366. package/transpiled/directives/auth/Id.d.ts +7 -0
  367. package/transpiled/directives/auth/Id.js +17 -0
  368. package/transpiled/directives/auth/Id.js.map +1 -0
  369. package/transpiled/directives/auth/Incept.d.ts +10 -0
  370. package/transpiled/directives/auth/Incept.js +63 -0
  371. package/transpiled/directives/auth/Incept.js.map +1 -0
  372. package/transpiled/directives/auth/Role.d.ts +11 -0
  373. package/transpiled/directives/auth/Role.js +46 -0
  374. package/transpiled/directives/auth/Role.js.map +1 -0
  375. package/transpiled/directives/auth/Rule.d.ts +9 -0
  376. package/transpiled/directives/auth/Rule.js +22 -0
  377. package/transpiled/directives/auth/Rule.js.map +1 -0
  378. package/transpiled/directives/auth/Scheme.d.ts +7 -0
  379. package/transpiled/directives/auth/Scheme.js +47 -0
  380. package/transpiled/directives/auth/Scheme.js.map +1 -0
  381. package/transpiled/directives/auth/index.d.ts +2 -0
  382. package/transpiled/directives/auth/index.js +6 -0
  383. package/transpiled/directives/auth/index.js.map +1 -0
  384. package/transpiled/directives/auth/schemes.d.ts +3 -0
  385. package/transpiled/directives/auth/schemes.js +10 -0
  386. package/transpiled/directives/auth/schemes.js.map +1 -0
  387. package/transpiled/directives/auth/split.d.ts +2 -0
  388. package/transpiled/directives/auth/split.js +38 -0
  389. package/transpiled/directives/auth/split.js.map +1 -0
  390. package/transpiled/directives/auth/types.d.ts +31 -0
  391. package/transpiled/directives/auth/types.js +3 -0
  392. package/transpiled/directives/auth/types.js.map +1 -0
  393. package/transpiled/directives/cache/Cache.d.ts +11 -0
  394. package/transpiled/directives/cache/Cache.js +28 -0
  395. package/transpiled/directives/cache/Cache.js.map +1 -0
  396. package/transpiled/directives/cache/Control.d.ts +9 -0
  397. package/transpiled/directives/cache/Control.js +42 -0
  398. package/transpiled/directives/cache/Control.js.map +1 -0
  399. package/transpiled/directives/cache/Exact.d.ts +4 -0
  400. package/transpiled/directives/cache/Exact.js +11 -0
  401. package/transpiled/directives/cache/Exact.js.map +1 -0
  402. package/transpiled/directives/cache/index.d.ts +2 -0
  403. package/transpiled/directives/cache/index.js +6 -0
  404. package/transpiled/directives/cache/index.js.map +1 -0
  405. package/transpiled/directives/cache/types.d.ts +7 -0
  406. package/transpiled/directives/cache/types.js +3 -0
  407. package/transpiled/directives/cache/types.js.map +1 -0
  408. package/transpiled/directives/cors/CORS.d.ts +10 -0
  409. package/transpiled/directives/cors/CORS.js +51 -0
  410. package/transpiled/directives/cors/CORS.js.map +1 -0
  411. package/transpiled/directives/cors/index.d.ts +2 -0
  412. package/transpiled/directives/cors/index.js +6 -0
  413. package/transpiled/directives/cors/index.js.map +1 -0
  414. package/transpiled/directives/dev/Development.d.ts +9 -0
  415. package/transpiled/directives/dev/Development.js +29 -0
  416. package/transpiled/directives/dev/Development.js.map +1 -0
  417. package/transpiled/directives/dev/Stub.d.ts +7 -0
  418. package/transpiled/directives/dev/Stub.js +14 -0
  419. package/transpiled/directives/dev/Stub.js.map +1 -0
  420. package/transpiled/directives/dev/Throw.d.ts +7 -0
  421. package/transpiled/directives/dev/Throw.js +14 -0
  422. package/transpiled/directives/dev/Throw.js.map +1 -0
  423. package/transpiled/directives/dev/index.d.ts +2 -0
  424. package/transpiled/directives/dev/index.js +6 -0
  425. package/transpiled/directives/dev/index.js.map +1 -0
  426. package/transpiled/directives/dev/types.d.ts +4 -0
  427. package/transpiled/directives/dev/types.js +3 -0
  428. package/transpiled/directives/dev/types.js.map +1 -0
  429. package/transpiled/directives/index.d.ts +4 -0
  430. package/transpiled/directives/index.js +13 -0
  431. package/transpiled/directives/index.js.map +1 -0
  432. package/transpiled/directives/io/Directive.d.ts +8 -0
  433. package/transpiled/directives/io/Directive.js +3 -0
  434. package/transpiled/directives/io/Directive.js.map +1 -0
  435. package/transpiled/directives/io/IO.d.ts +9 -0
  436. package/transpiled/directives/io/IO.js +33 -0
  437. package/transpiled/directives/io/IO.js.map +1 -0
  438. package/transpiled/directives/io/Input.d.ts +11 -0
  439. package/transpiled/directives/io/Input.js +63 -0
  440. package/transpiled/directives/io/Input.js.map +1 -0
  441. package/transpiled/directives/io/Message.d.ts +1 -0
  442. package/transpiled/directives/io/Message.js +3 -0
  443. package/transpiled/directives/io/Message.js.map +1 -0
  444. package/transpiled/directives/io/Output.d.ts +13 -0
  445. package/transpiled/directives/io/Output.js +76 -0
  446. package/transpiled/directives/io/Output.js.map +1 -0
  447. package/transpiled/directives/io/index.d.ts +2 -0
  448. package/transpiled/directives/io/index.js +6 -0
  449. package/transpiled/directives/io/index.js.map +1 -0
  450. package/transpiled/directives/io/schemas.d.ts +7 -0
  451. package/transpiled/directives/io/schemas.js +14 -0
  452. package/transpiled/directives/io/schemas.js.map +1 -0
  453. package/transpiled/directives/octets/Context.d.ts +8 -0
  454. package/transpiled/directives/octets/Context.js +42 -0
  455. package/transpiled/directives/octets/Context.js.map +1 -0
  456. package/transpiled/directives/octets/Delete.d.ts +20 -0
  457. package/transpiled/directives/octets/Delete.js +84 -0
  458. package/transpiled/directives/octets/Delete.js.map +1 -0
  459. package/transpiled/directives/octets/Directive.d.ts +8 -0
  460. package/transpiled/directives/octets/Directive.js +8 -0
  461. package/transpiled/directives/octets/Directive.js.map +1 -0
  462. package/transpiled/directives/octets/Fetch.d.ts +18 -0
  463. package/transpiled/directives/octets/Fetch.js +92 -0
  464. package/transpiled/directives/octets/Fetch.js.map +1 -0
  465. package/transpiled/directives/octets/List.d.ts +16 -0
  466. package/transpiled/directives/octets/List.js +74 -0
  467. package/transpiled/directives/octets/List.js.map +1 -0
  468. package/transpiled/directives/octets/Octets.d.ts +12 -0
  469. package/transpiled/directives/octets/Octets.js +55 -0
  470. package/transpiled/directives/octets/Octets.js.map +1 -0
  471. package/transpiled/directives/octets/Permute.d.ts +11 -0
  472. package/transpiled/directives/octets/Permute.js +58 -0
  473. package/transpiled/directives/octets/Permute.js.map +1 -0
  474. package/transpiled/directives/octets/Store.d.ts +24 -0
  475. package/transpiled/directives/octets/Store.js +95 -0
  476. package/transpiled/directives/octets/Store.js.map +1 -0
  477. package/transpiled/directives/octets/Workflow.d.ts +15 -0
  478. package/transpiled/directives/octets/Workflow.js +59 -0
  479. package/transpiled/directives/octets/Workflow.js.map +1 -0
  480. package/transpiled/directives/octets/index.d.ts +2 -0
  481. package/transpiled/directives/octets/index.js +6 -0
  482. package/transpiled/directives/octets/index.js.map +1 -0
  483. package/transpiled/directives/octets/schemas.d.ts +13 -0
  484. package/transpiled/directives/octets/schemas.js +18 -0
  485. package/transpiled/directives/octets/schemas.js.map +1 -0
  486. package/transpiled/directives/octets/types.d.ts +5 -0
  487. package/transpiled/directives/octets/types.js +3 -0
  488. package/transpiled/directives/octets/types.js.map +1 -0
  489. package/transpiled/directives/octets/workflows/Execution.d.ts +25 -0
  490. package/transpiled/directives/octets/workflows/Execution.js +54 -0
  491. package/transpiled/directives/octets/workflows/Execution.js.map +1 -0
  492. package/transpiled/directives/octets/workflows/Workflow.d.ts +12 -0
  493. package/transpiled/directives/octets/workflows/Workflow.js +25 -0
  494. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -0
  495. package/transpiled/directives/octets/workflows/index.d.ts +1 -0
  496. package/transpiled/directives/octets/workflows/index.js +6 -0
  497. package/transpiled/directives/octets/workflows/index.js.map +1 -0
  498. package/transpiled/directives/vary/Directive.d.ts +5 -0
  499. package/transpiled/directives/vary/Directive.js +3 -0
  500. package/transpiled/directives/vary/Directive.js.map +1 -0
  501. package/transpiled/directives/vary/Embed.d.ts +10 -0
  502. package/transpiled/directives/vary/Embed.js +49 -0
  503. package/transpiled/directives/vary/Embed.js.map +1 -0
  504. package/transpiled/directives/vary/Properties.d.ts +9 -0
  505. package/transpiled/directives/vary/Properties.js +16 -0
  506. package/transpiled/directives/vary/Properties.js.map +1 -0
  507. package/transpiled/directives/vary/Vary.d.ts +10 -0
  508. package/transpiled/directives/vary/Vary.js +36 -0
  509. package/transpiled/directives/vary/Vary.js.map +1 -0
  510. package/transpiled/directives/vary/embeddings/Embedding.d.ts +5 -0
  511. package/transpiled/directives/vary/embeddings/Embedding.js +3 -0
  512. package/transpiled/directives/vary/embeddings/Embedding.js.map +1 -0
  513. package/transpiled/directives/vary/embeddings/Header.d.ts +7 -0
  514. package/transpiled/directives/vary/embeddings/Header.js +28 -0
  515. package/transpiled/directives/vary/embeddings/Header.js.map +1 -0
  516. package/transpiled/directives/vary/embeddings/Language.d.ts +7 -0
  517. package/transpiled/directives/vary/embeddings/Language.js +28 -0
  518. package/transpiled/directives/vary/embeddings/Language.js.map +1 -0
  519. package/transpiled/directives/vary/embeddings/index.d.ts +5 -0
  520. package/transpiled/directives/vary/embeddings/index.js +10 -0
  521. package/transpiled/directives/vary/embeddings/index.js.map +1 -0
  522. package/transpiled/directives/vary/index.d.ts +2 -0
  523. package/transpiled/directives/vary/index.js +6 -0
  524. package/transpiled/directives/vary/index.js.map +1 -0
  525. package/transpiled/discovery.d.ts +1 -0
  526. package/transpiled/discovery.js +3 -0
  527. package/transpiled/discovery.js.map +1 -0
  528. package/transpiled/exceptions.d.ts +2 -0
  529. package/transpiled/exceptions.js +39 -0
  530. package/transpiled/exceptions.js.map +1 -0
  531. package/transpiled/index.d.ts +5 -0
  532. package/transpiled/index.js +12 -0
  533. package/transpiled/index.js.map +1 -0
  534. package/transpiled/io.d.ts +3 -0
  535. package/transpiled/io.js +3 -0
  536. package/transpiled/io.js.map +1 -0
  537. package/transpiled/manifest.d.ts +3 -0
  538. package/transpiled/manifest.js +66 -0
  539. package/transpiled/manifest.js.map +1 -0
  540. package/transpiled/root.d.ts +2 -0
  541. package/transpiled/root.js +44 -0
  542. package/transpiled/root.js.map +1 -0
  543. package/transpiled/schemas.d.ts +7 -0
  544. package/transpiled/schemas.js +14 -0
  545. package/transpiled/schemas.js.map +1 -0
  546. package/transpiled/tsconfig.tsbuildinfo +1 -0
  547. package/source/HTTP/Server.fixtures.ts +0 -41
@@ -1,3 +1,4 @@
1
+ import assert from 'node:assert'
1
2
  import { match } from 'matchacho'
2
3
  import * as http from '../../HTTP'
3
4
  import { Anonymous } from './Anonymous'
@@ -6,13 +7,14 @@ import { Role } from './Role'
6
7
  import { Rule } from './Rule'
7
8
  import { Incept } from './Incept'
8
9
  import { Echo } from './Echo'
9
- import { split } from './split'
10
10
  import { Scheme } from './Scheme'
11
+ import { Delegate } from './Delegate'
12
+ import { split } from './split'
11
13
  import { PRIMARY, PROVIDERS } from './schemes'
14
+ import type { Output } from '../../io'
12
15
  import type { Component } from '@toa.io/core'
13
16
  import type { Remotes } from '../../Remotes'
14
- import type { Family, Output } from '../../Directive'
15
- import type { Parameter } from '../../RTD'
17
+ import type { Parameter, DirectiveFamily } from '../../RTD'
16
18
  import type {
17
19
  AuthenticationResult,
18
20
  Ban,
@@ -25,7 +27,8 @@ import type {
25
27
  Schemes
26
28
  } from './types'
27
29
 
28
- class Authorization implements Family<Directive, Extension> {
30
+ export class Authorization implements DirectiveFamily<Directive, Extension> {
31
+ public readonly depends: string[] = ['Vary']
29
32
  public readonly name: string = 'auth'
30
33
  public readonly mandatory: boolean = true
31
34
 
@@ -35,24 +38,25 @@ class Authorization implements Family<Directive, Extension> {
35
38
  private bans: Component | null = null
36
39
 
37
40
  public create (name: string, value: any, remotes: Remotes): Directive {
38
- const Class = CLASSES[name]
41
+ assert.ok(name in constructors,
42
+ `Directive '${name}' is not provided by the '${this.name}' family.`)
39
43
 
40
- if (Class === undefined)
41
- throw new Error(`Directive '${name}' is not provided by the '${this.name}' family.`)
44
+ const Class = constructors[name]
42
45
 
43
46
  for (const name of REMOTES)
44
47
  this.discovery[name] ??= remotes.discover('identity', name)
45
48
 
46
49
  return match(Class,
47
- Role, () => new Role(value, this.discovery.roles),
48
- Rule, () => new Rule(value, this.create.bind(this)),
49
- Incept, () => new Incept(value, this.discovery),
50
+ Role, () => new Role(value as string | string[], this.discovery.roles),
51
+ Rule, () => new Rule(value as Record<string, string>, this.create.bind(this)),
52
+ Incept, () => new Incept(value as string, this.discovery),
50
53
  () => new Class(value))
51
54
  }
52
55
 
53
- public async preflight
54
- (directives: Directive[], input: Input, parameters: Parameter[]): Promise<Output> {
55
- const identity = await this.resolve(input.headers.authorization)
56
+ public async preflight (directives: Directive[],
57
+ input: Input,
58
+ parameters: Parameter[]): Promise<Output> {
59
+ const identity = await this.resolve(input.request.headers.authorization)
56
60
 
57
61
  input.identity = identity
58
62
 
@@ -63,41 +67,38 @@ class Authorization implements Family<Directive, Extension> {
63
67
  return directive.reply?.(identity) ?? null
64
68
  }
65
69
 
66
- if (identity === null) throw new http.Unauthorized()
67
- else throw new http.Forbidden()
70
+ if (identity === null)
71
+ throw new http.Unauthorized()
72
+ else
73
+ throw new http.Forbidden()
68
74
  }
69
75
 
70
- public async settle
71
- (directives: Directive[], request: Input, response: http.OutgoingMessage): Promise<void> {
72
- for (const directive of directives)
73
- await directive.settle?.(request, response)
76
+ public async settle (directives: Directive[],
77
+ request: Input,
78
+ response: http.OutgoingMessage): Promise<void> {
79
+ for (const directive of directives) await directive.settle?.(request, response)
74
80
 
75
81
  const identity = request.identity
76
82
 
77
- if (identity === null)
78
- return
83
+ if (identity === null) return
79
84
 
80
- if (identity.scheme === PRIMARY && !identity.refresh)
81
- return
85
+ if (identity.scheme === PRIMARY && !identity.refresh) return
82
86
 
83
87
  // Role directive may have already set the value
84
- if (identity.roles === undefined)
85
- await Role.set(identity, this.discovery.roles)
88
+ if (identity.roles === undefined) await Role.set(identity, this.discovery.roles)
86
89
 
87
90
  this.tokens ??= await this.discovery.tokens
88
91
 
89
92
  const token = await this.tokens.invoke<string>('encrypt', { input: { identity } })
90
93
  const authorization = `Token ${token}`
91
94
 
92
- if (response.headers === undefined)
93
- response.headers = new Headers()
95
+ if (response.headers === undefined) response.headers = new Headers()
94
96
 
95
97
  response.headers.set('authorization', authorization)
96
98
  }
97
99
 
98
100
  private async resolve (authorization: string | undefined): Promise<Identity | null> {
99
- if (authorization === undefined)
100
- return null
101
+ if (authorization === undefined) return null
101
102
 
102
103
  const [scheme, credentials] = split(authorization)
103
104
  const provider = PROVIDERS[scheme]
@@ -107,16 +108,15 @@ class Authorization implements Family<Directive, Extension> {
107
108
 
108
109
  this.schemes[scheme] ??= await this.discovery[provider]
109
110
 
110
- const result = await this.schemes[scheme]
111
- .invoke<AuthenticationResult>('authenticate', { input: credentials })
111
+ const result = await this.schemes[scheme].invoke<AuthenticationResult>('authenticate', {
112
+ input: credentials
113
+ })
112
114
 
113
- if (result instanceof Error)
114
- return null
115
+ if (result instanceof Error) return null
115
116
 
116
117
  const identity = result.identity
117
118
 
118
- if (scheme !== PRIMARY && await this.banned(identity))
119
- throw new http.Unauthorized()
119
+ if (scheme !== PRIMARY && (await this.banned(identity))) throw new http.Unauthorized()
120
120
 
121
121
  identity.scheme = scheme
122
122
  identity.refresh = result.refresh
@@ -133,16 +133,15 @@ class Authorization implements Family<Directive, Extension> {
133
133
  }
134
134
  }
135
135
 
136
- const CLASSES: Record<string, new (value: any, argument?: any) => Directive> = {
136
+ const constructors: Record<string, new (value: any, argument?: any) => Directive> = {
137
137
  anonymous: Anonymous,
138
138
  id: Id,
139
139
  role: Role,
140
140
  rule: Rule,
141
141
  incept: Incept,
142
142
  scheme: Scheme,
143
- echo: Echo
143
+ echo: Echo,
144
+ delegate: Delegate
144
145
  }
145
146
 
146
- const REMOTES: Remote[] = ['basic', 'tokens', 'roles', 'bans']
147
-
148
- export = new Authorization()
147
+ const REMOTES: Remote[] = ['basic', 'federation', 'tokens', 'roles', 'bans']
@@ -0,0 +1,32 @@
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
+ check(body)
23
+ body[this.property] = identity
24
+
25
+ return body
26
+ }
27
+ }
28
+
29
+ function check (body: unknown): asserts body is Record<string, unknown> {
30
+ if (typeof body !== 'object' || body === null)
31
+ throw new BadRequest('Invalid request body.')
32
+ }
@@ -15,28 +15,33 @@ 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 as string)
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>>('create', {
35
+ input: {
36
+ id,
37
+ credentials
38
+ }
39
+ })
35
40
 
36
41
  if (identity instanceof Error)
37
42
  throw new http.Conflict(identity)
38
43
 
39
- request.identity = identity
40
- request.identity.scheme = scheme
44
+ input.identity = identity
45
+ input.identity.scheme = scheme
41
46
  }
42
47
  }
@@ -14,10 +14,12 @@ export class Role implements Directive {
14
14
  public static async set (identity: Identity, discovery: Promise<Component>): Promise<void> {
15
15
  this.remote ??= await discovery
16
16
 
17
- const query: Query = { criteria: `identity==${identity.id}`, limit: 1024 }
18
- const roles: string[] = await this.remote.invoke('list', { query })
17
+ const query: Query = {
18
+ criteria: `identity==${identity.id}`,
19
+ limit: 1024
20
+ }
19
21
 
20
- identity.roles = roles
22
+ identity.roles = await this.remote.invoke('list', { query })
21
23
  }
22
24
 
23
25
  public async authorize (identity: Identity | null): Promise<boolean> {
@@ -1,5 +1,5 @@
1
1
  import { type Parameter } from '../../RTD'
2
- import { type Directive, type Identity } from './types'
2
+ import type { Input, Directive, Identity } from './types'
3
3
 
4
4
  export class Rule implements Directive {
5
5
  private readonly directives: Directive[] = []
@@ -13,7 +13,7 @@ export class Rule implements Directive {
13
13
  }
14
14
 
15
15
  public async authorize
16
- (identity: Identity | null, input: any, parameters: Parameter[]): Promise<boolean> {
16
+ (identity: Identity | null, input: Input, parameters: Parameter[]): Promise<boolean> {
17
17
  for (const directive of this.directives) {
18
18
  const authorized = await directive.authorize(identity, input, parameters)
19
19
 
@@ -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 +
@@ -1,3 +1,3 @@
1
- import Family from './Family'
1
+ import { Authorization } from './Authorization'
2
2
 
3
- export = Family
3
+ export const authorization = new Authorization()
@@ -2,7 +2,8 @@ import { type Remote, type Scheme } from './types'
2
2
 
3
3
  export const PROVIDERS: Record<Scheme, Remote> = {
4
4
  basic: 'basic',
5
- token: 'tokens'
5
+ token: 'tokens',
6
+ bearer: 'federation'
6
7
  }
7
8
 
8
9
  export const PRIMARY: Scheme = 'token'
@@ -2,11 +2,14 @@ import { type Component } from '@toa.io/core'
2
2
  import { type Maybe } from '@toa.io/types'
3
3
  import { type Parameter } from '../../RTD'
4
4
  import type * as http from '../../HTTP'
5
- import type * as directive from '../../Directive'
5
+ import type * as io from '../../io'
6
6
 
7
7
  export interface Directive {
8
- authorize: (identity: Identity | null, input: Input, parameters: Parameter[]) =>
9
- boolean | Promise<boolean>
8
+ authorize: (
9
+ identity: Identity | null,
10
+ input: Input,
11
+ parameters: Parameter[],
12
+ ) => boolean | Promise<boolean>
10
13
 
11
14
  reply?: (identity: Identity | null) => http.OutgoingMessage
12
15
 
@@ -28,10 +31,10 @@ export interface Ban {
28
31
  banned: boolean
29
32
  }
30
33
 
31
- export type Input = directive.Input & Extension
34
+ export type Input = io.Input & Extension
32
35
  export type AuthenticationResult = Maybe<{ identity: Identity, refresh: boolean }>
33
36
 
34
- export type Scheme = 'basic' | 'token'
35
- export type Remote = 'basic' | 'tokens' | 'roles' | 'bans'
37
+ export type Scheme = 'basic' | 'token' | 'bearer'
38
+ export type Remote = 'basic' | 'federation' | 'tokens' | 'roles' | 'bans'
36
39
  export type Discovery = Record<Remote, Promise<Component>>
37
40
  export type Schemes = Record<Scheme, Component>
@@ -1,10 +1,11 @@
1
- import { type Input, type Output, type Family } from '../../Directive'
2
1
  import { Control } from './Control'
3
- import { type Directive } from './types'
4
2
  import { Exact } from './Exact'
3
+ import type { Input, Output } from '../../io'
4
+ import type { Directive } from './types'
5
+ import type { DirectiveFamily } from '../../RTD'
5
6
  import type * as http from '../../HTTP'
6
7
 
7
- class Cache implements Family<Directive> {
8
+ export class Cache implements DirectiveFamily<Directive> {
8
9
  public readonly name: string = 'cache'
9
10
  public readonly mandatory: boolean = false
10
11
 
@@ -22,9 +23,9 @@ class Cache implements Family<Directive> {
22
23
  }
23
24
 
24
25
  public async settle
25
- (directives: Directive[], request: Input, response: http.OutgoingMessage): Promise<void> {
26
+ (directives: Directive[], input: Input, response: http.OutgoingMessage): Promise<void> {
26
27
  response.headers ??= new Headers()
27
- directives[0]?.set(request, response.headers)
28
+ directives[0]?.set(input, response.headers)
28
29
  }
29
30
  }
30
31
 
@@ -32,5 +33,3 @@ const constructors: Record<string, new (value: any) => Directive> = {
32
33
  control: Control,
33
34
  exact: Exact
34
35
  }
35
-
36
- export = new Cache()
@@ -1,5 +1,5 @@
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
@@ -9,16 +9,16 @@ export class Control implements Directive {
9
9
  this.value = value
10
10
  }
11
11
 
12
- public set (request: AuthenticatedRequest, headers: Headers): void {
13
- if (!['GET', 'HEAD', 'OPTIONS'].includes(request.method))
12
+ public set (context: AuthenticatedContext, headers: Headers): void {
13
+ if (!['GET', 'HEAD', 'OPTIONS'].includes(context.request.method))
14
14
  return
15
15
 
16
- this.cache ??= this.resolve(request)
16
+ this.cache ??= this.resolve(context)
17
17
 
18
18
  headers.set('cache-control', this.cache)
19
19
  }
20
20
 
21
- protected resolve (request: AuthenticatedRequest): string {
21
+ protected resolve (request: AuthenticatedContext): string {
22
22
  if (request.identity === null)
23
23
  return this.value
24
24
 
@@ -1,3 +1,3 @@
1
- import Family from './Family'
1
+ import { Cache } from './Cache'
2
2
 
3
- export = Family
3
+ export const cache = new Cache()
@@ -1,9 +1,9 @@
1
- import { type Input } from '../../Directive'
1
+ import type { Input } from '../../io'
2
2
 
3
3
  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
  }
@@ -0,0 +1,62 @@
1
+ import type { Input, Output } from '../../io'
2
+ import type { Interceptor } from '../../Interception'
3
+
4
+ export class CORS implements Interceptor {
5
+ public readonly name = 'cors'
6
+
7
+ private readonly requestHeaders = new Set<string>([
8
+ 'accept',
9
+ 'authorization',
10
+ 'content-type',
11
+ 'etag',
12
+ 'if-match',
13
+ 'if-none-match'
14
+ ])
15
+
16
+ private readonly headers = new Headers({
17
+ 'access-control-allow-methods': 'GET, POST, PUT, PATCH, DELETE',
18
+ 'access-control-allow-credentials': 'true',
19
+ 'access-control-allow-headers': Array.from(this.requestHeaders).join(', '),
20
+ 'access-control-max-age': '3600',
21
+ 'cache-control': 'max-age=3600',
22
+ vary: 'origin'
23
+ })
24
+
25
+ public intercept (input: Input): Output {
26
+ const origin = input.request.headers.origin
27
+
28
+ if (origin === undefined)
29
+ return null
30
+
31
+ if (input.request.method === 'OPTIONS')
32
+ return this.preflightResponse(origin)
33
+
34
+ input.pipelines.response.push((output) => {
35
+ output.headers ??= new Headers()
36
+ output.headers.set('access-control-allow-origin', origin)
37
+ output.headers.set('access-control-expose-headers',
38
+ 'authorization, content-type, content-length, etag')
39
+
40
+ const method = input.request.method
41
+
42
+ if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS')
43
+ output.headers.append('vary', 'origin')
44
+ })
45
+
46
+ return null
47
+ }
48
+
49
+ public allow (header: string): void {
50
+ this.requestHeaders.add(header.toLowerCase())
51
+ this.headers.set('access-control-allow-headers', Array.from(this.requestHeaders).join(', '))
52
+ }
53
+
54
+ private preflightResponse (origin: string): Output {
55
+ this.headers.set('access-control-allow-origin', origin)
56
+
57
+ return {
58
+ status: 204,
59
+ headers: this.headers
60
+ }
61
+ }
62
+ }
@@ -0,0 +1,3 @@
1
+ import { CORS } from './CORS'
2
+
3
+ export const cors = new CORS()
@@ -1,13 +1,14 @@
1
- import { type Input, type Output, type Family } from '../../Directive'
2
1
  import { Stub } from './Stub'
3
2
  import { Throw } from './Throw'
4
3
  import { type Directive } from './types'
4
+ import type { Input, Output } from '../../io'
5
+ import type { DirectiveFamily } from '../../RTD'
5
6
 
6
- class Development implements Family<Directive> {
7
+ export class Development implements DirectiveFamily<Directive> {
7
8
  public readonly name: string = 'dev'
8
9
  public readonly mandatory: boolean = false
9
10
 
10
- public create (name: string, value: any): Directive {
11
+ public create (name: string, value: unknown): Directive {
11
12
  const Class = constructors[name]
12
13
 
13
14
  if (Class === undefined)
@@ -32,5 +33,3 @@ const constructors: Record<string, new (value: any) => Directive> = {
32
33
  stub: Stub,
33
34
  throw: Throw
34
35
  }
35
-
36
- export = new Development()
@@ -1,10 +1,10 @@
1
- import { type Output } from '../../Directive'
2
- import { type Directive } from './types'
1
+ import type { Output } from '../../io'
2
+ import type { Directive } from './types'
3
3
 
4
4
  export class Stub implements Directive {
5
- private readonly value: any
5
+ private readonly value: unknown
6
6
 
7
- public constructor (value: any) {
7
+ public constructor (value: unknown) {
8
8
  this.value = value
9
9
  }
10
10
 
@@ -1,10 +1,10 @@
1
- import { type Output } from '../../Directive'
2
- import { type Directive } from './types'
1
+ import type { Output } from '../../io'
2
+ import type { Directive } from './types'
3
3
 
4
4
  export class Throw implements Directive {
5
- private readonly message: any
5
+ private readonly message: string
6
6
 
7
- public constructor (message: any) {
7
+ public constructor (message: string) {
8
8
  this.message = message
9
9
  }
10
10
 
@@ -1,3 +1,3 @@
1
- import Family from './Family'
1
+ import { Development } from './Development'
2
2
 
3
- export = Family
3
+ export const dev = new Development()
@@ -1,4 +1,4 @@
1
- import { type Input, type Output } from '../../Directive'
1
+ import type { Input, Output } from '../../io'
2
2
 
3
3
  export interface Directive {
4
4
  apply: (input: Input) => Output
@@ -1,7 +1,12 @@
1
- import { type Family } from '../Directive'
2
- import Dev from './dev'
3
- import Auth from './auth'
4
- import Cache from './cache'
5
- import Octets from './octets'
1
+ import { authorization } from './auth'
2
+ import { cache } from './cache'
3
+ import { cors } from './cors'
4
+ import { dev } from './dev'
5
+ import { octets } from './octets'
6
+ import { io } from './io'
7
+ import { vary } from './vary'
8
+ import type { DirectiveFamily } from '../RTD'
9
+ import type { Interceptor } from '../Interception'
6
10
 
7
- export const families: Family[] = [Auth, Octets, Dev, Cache]
11
+ export const families: DirectiveFamily[] = [authorization, io, cache, vary, octets, dev]
12
+ export const interceptors: Interceptor[] = [cors]
@@ -0,0 +1,11 @@
1
+ import type { Input } from '../../io'
2
+
3
+ export interface Directive {
4
+ attach: (context: Input) => void
5
+ }
6
+
7
+ export interface Constructor {
8
+ validate: (value: unknown) => void
9
+
10
+ new (value: any): Directive
11
+ }
@@ -0,0 +1,43 @@
1
+ import { Output } from './Output'
2
+ import { Input } from './Input'
3
+ import type { Constructor, Directive } from './Directive'
4
+ import type { Input as Context } from '../../io'
5
+ import type { DirectiveFamily } from '../../RTD'
6
+
7
+ export class IO implements DirectiveFamily<Directive> {
8
+ public readonly name = 'io'
9
+ public readonly mandatory = true
10
+
11
+ public create (name: string, value: unknown): Directive {
12
+ if (!(name in constructors))
13
+ throw new Error(`Directive 'io:${name}' is not implemented.`)
14
+
15
+ const Directive = constructors[name]
16
+
17
+ Directive.validate(value)
18
+
19
+ return new Directive(value)
20
+ }
21
+
22
+ public preflight (directives: Directive[], context: Context): null {
23
+ let restricted = false
24
+
25
+ for (const directive of directives) {
26
+ restricted ||= directive instanceof Output
27
+
28
+ directive.attach(context)
29
+ }
30
+
31
+ if (!restricted)
32
+ DENIAL.attach(context)
33
+
34
+ return null
35
+ }
36
+ }
37
+
38
+ const constructors: Record<string, Constructor> = {
39
+ output: Output,
40
+ input: Input
41
+ }
42
+
43
+ const DENIAL: Output = new Output([])