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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. package/components/context.toa.yaml +2 -2
  2. package/components/identity.bans/manifest.toa.yaml +15 -7
  3. package/components/identity.bans/operations/transit.d.ts +14 -0
  4. package/components/identity.bans/operations/transit.js +11 -0
  5. package/components/identity.bans/operations/transit.js.map +1 -0
  6. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
  7. package/components/identity.bans/source/transit.ts +21 -0
  8. package/components/identity.bans/tsconfig.json +9 -0
  9. package/components/identity.basic/manifest.toa.yaml +21 -10
  10. package/components/identity.basic/operations/authenticate.d.ts +5 -1
  11. package/components/identity.basic/operations/authenticate.js +5 -2
  12. package/components/identity.basic/operations/authenticate.js.map +1 -1
  13. package/components/identity.basic/operations/incept.d.ts +12 -0
  14. package/components/identity.basic/operations/incept.js +26 -0
  15. package/components/identity.basic/operations/incept.js.map +1 -0
  16. package/components/identity.basic/operations/transit.d.ts +4 -4
  17. package/components/identity.basic/operations/transit.js +5 -3
  18. package/components/identity.basic/operations/transit.js.map +1 -1
  19. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  20. package/components/identity.basic/operations/types.d.ts +8 -4
  21. package/components/identity.basic/source/authenticate.ts +16 -5
  22. package/components/identity.basic/source/incept.ts +38 -0
  23. package/components/identity.basic/source/transit.ts +8 -6
  24. package/components/identity.basic/source/types.ts +8 -4
  25. package/components/identity.federation/manifest.toa.yaml +32 -16
  26. package/components/identity.federation/operations/authenticate.d.ts +2 -2
  27. package/components/identity.federation/operations/authenticate.js +4 -11
  28. package/components/identity.federation/operations/authenticate.js.map +1 -1
  29. package/components/identity.federation/operations/incept.d.ts +11 -0
  30. package/components/identity.federation/operations/{create.js → incept.js} +6 -7
  31. package/components/identity.federation/operations/incept.js.map +1 -0
  32. package/components/identity.federation/operations/lib/jwt.d.ts +5 -5
  33. package/components/identity.federation/operations/lib/jwt.js +25 -12
  34. package/components/identity.federation/operations/lib/jwt.js.map +1 -1
  35. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  36. package/components/identity.federation/operations/types/configuration.d.ts +14 -0
  37. package/components/identity.federation/operations/types/configuration.js +3 -0
  38. package/components/identity.federation/operations/types/configuration.js.map +1 -0
  39. package/components/identity.federation/operations/{types.d.ts → types/context.d.ts} +15 -7
  40. package/components/identity.federation/operations/types/context.js +3 -0
  41. package/components/identity.federation/operations/types/context.js.map +1 -0
  42. package/components/identity.federation/operations/types/entity.d.ts +6 -0
  43. package/components/identity.federation/operations/types/entity.js +3 -0
  44. package/components/identity.federation/operations/types/entity.js.map +1 -0
  45. package/components/identity.federation/operations/types/index.d.ts +3 -0
  46. package/components/identity.federation/operations/types/index.js +20 -0
  47. package/components/identity.federation/operations/types/index.js.map +1 -0
  48. package/components/identity.federation/source/authenticate.ts +6 -19
  49. package/components/identity.federation/source/{create.ts → incept.ts} +10 -9
  50. package/components/identity.federation/source/lib/jwt.test.ts +123 -4
  51. package/components/identity.federation/source/lib/jwt.ts +36 -16
  52. package/components/identity.federation/source/types/configuration.ts +15 -0
  53. package/components/identity.federation/source/{types.ts → types/context.ts} +17 -6
  54. package/components/identity.federation/source/types/entity.ts +6 -0
  55. package/components/identity.federation/source/types/index.ts +3 -0
  56. package/components/identity.federation/tsconfig.json +5 -4
  57. package/components/identity.roles/manifest.toa.yaml +18 -7
  58. package/components/identity.roles/operations/grant.d.ts +10 -0
  59. package/components/identity.roles/operations/grant.js +21 -0
  60. package/components/identity.roles/operations/grant.js.map +1 -0
  61. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  62. package/components/identity.roles/operations/lib/Entity.js +3 -0
  63. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  64. package/components/identity.roles/operations/list.d.ts +1 -4
  65. package/components/identity.roles/operations/list.js.map +1 -1
  66. package/components/identity.roles/operations/principal.d.ts +4 -6
  67. package/components/identity.roles/operations/principal.js +6 -1
  68. package/components/identity.roles/operations/principal.js.map +1 -1
  69. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  70. package/components/identity.roles/source/grant.ts +32 -0
  71. package/components/identity.roles/source/lib/Entity.ts +5 -0
  72. package/components/identity.roles/source/list.ts +2 -4
  73. package/components/identity.roles/source/principal.ts +10 -8
  74. package/components/identity.tokens/manifest.toa.yaml +19 -5
  75. package/components/identity.tokens/operations/authenticate.d.ts +2 -2
  76. package/components/identity.tokens/operations/authenticate.js +12 -5
  77. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  78. package/components/identity.tokens/operations/decrypt.js +1 -0
  79. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  80. package/components/identity.tokens/operations/encrypt.js +5 -1
  81. package/components/identity.tokens/operations/encrypt.js.map +1 -1
  82. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  83. package/components/identity.tokens/operations/types.d.ts +8 -2
  84. package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
  85. package/components/identity.tokens/source/authenticate.test.ts +11 -4
  86. package/components/identity.tokens/source/authenticate.ts +14 -6
  87. package/components/identity.tokens/source/decrypt.test.ts +5 -3
  88. package/components/identity.tokens/source/decrypt.ts +9 -8
  89. package/components/identity.tokens/source/encrypt.test.ts +26 -2
  90. package/components/identity.tokens/source/encrypt.ts +5 -1
  91. package/components/identity.tokens/source/types.ts +9 -2
  92. package/components/octets.storage/manifest.toa.yaml +6 -7
  93. package/components/octets.storage/operations/get.js +2 -2
  94. package/components/octets.storage/operations/store.js +113 -3
  95. package/documentation/access.md +75 -38
  96. package/documentation/authorities.md +49 -0
  97. package/documentation/cache.md +8 -1
  98. package/documentation/components.md +47 -22
  99. package/documentation/flow.md +31 -0
  100. package/documentation/identity.md +17 -22
  101. package/documentation/introspection.md +82 -0
  102. package/documentation/octets.md +81 -23
  103. package/documentation/protocol.md +3 -0
  104. package/documentation/query.md +29 -4
  105. package/documentation/require.md +15 -0
  106. package/documentation/tree.md +13 -0
  107. package/documentation/vary.md +14 -14
  108. package/features/access.feature +78 -46
  109. package/features/annotation.feature +1 -0
  110. package/features/auth.claim.feature +170 -0
  111. package/features/authorities.basic.feature +141 -0
  112. package/features/authorities.feature +32 -0
  113. package/features/authorities.federation.feature +100 -0
  114. package/features/authorities.tokens.feature +117 -0
  115. package/features/body.feature +3 -0
  116. package/features/cache.feature +109 -5
  117. package/features/cors.feature +6 -1
  118. package/features/debug.feature +34 -0
  119. package/features/directives.feature +3 -0
  120. package/features/dynamic.feature +4 -0
  121. package/features/errors.feature +20 -7
  122. package/features/etag.feature +31 -0
  123. package/features/flow.feature +45 -0
  124. package/features/identity.bans.feature +137 -0
  125. package/features/identity.basic.feature +125 -23
  126. package/features/identity.feature +7 -2
  127. package/features/identity.federation.feature +66 -11
  128. package/features/identity.roles.feature +250 -7
  129. package/features/identity.tokens.feature +54 -4
  130. package/features/introspection.feature +153 -0
  131. package/features/io.feature +38 -1
  132. package/features/methods.feature +47 -0
  133. package/features/octets.download.feature +189 -0
  134. package/features/octets.entries.feature +8 -1
  135. package/features/octets.feature +82 -54
  136. package/features/octets.meta.feature +3 -0
  137. package/features/octets.workflows.feature +239 -19
  138. package/features/probes.feature +14 -0
  139. package/features/{queries.feature → query.feature} +65 -2
  140. package/features/require.feature +67 -0
  141. package/features/response.feature +38 -3
  142. package/features/routes.feature +93 -2
  143. package/features/steps/Database.ts +17 -10
  144. package/features/steps/Gateway.ts +23 -6
  145. package/features/steps/IdP.ts +30 -25
  146. package/features/steps/Parameters.ts +1 -1
  147. package/features/steps/components/echo/manifest.toa.yaml +14 -1
  148. package/features/steps/components/echo/operations/identity.js +7 -0
  149. package/features/steps/components/echo/operations/parameters.js +7 -0
  150. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  151. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  152. package/features/steps/components/octets.tester/manifest.toa.yaml +22 -1
  153. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  154. package/features/steps/components/octets.tester/operations/baz.js +1 -2
  155. package/features/steps/components/octets.tester/operations/diversify.js +3 -1
  156. package/features/steps/components/octets.tester/operations/foo.js +2 -2
  157. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  158. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  159. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  160. package/features/steps/components/pots/manifest.toa.yaml +14 -3
  161. package/features/steps/components/users/manifest.toa.yaml +0 -1
  162. package/features/steps/components/users.properties/manifest.toa.yaml +1 -1
  163. package/features/streams.feature +1 -0
  164. package/features/timing.feature +27 -1
  165. package/features/vary.feature +71 -0
  166. package/package.json +22 -14
  167. package/readme.md +19 -14
  168. package/schemas/annotation.cos.yaml +1 -1
  169. package/schemas/method.cos.yaml +1 -1
  170. package/schemas/node.cos.yaml +1 -0
  171. package/schemas/octets/store.cos.yaml +25 -3
  172. package/schemas/query.cos.yaml +4 -10
  173. package/source/Annotation.ts +3 -3
  174. package/source/Composition.ts +2 -2
  175. package/source/Directive.ts +4 -5
  176. package/source/Endpoint.ts +48 -12
  177. package/source/Factory.ts +10 -11
  178. package/source/Gateway.ts +49 -20
  179. package/source/HTTP/Context.ts +24 -2
  180. package/source/HTTP/Server.ts +51 -44
  181. package/source/HTTP/exceptions.ts +13 -1
  182. package/source/HTTP/formats/index.ts +3 -3
  183. package/source/HTTP/messages.test.ts +39 -2
  184. package/source/HTTP/messages.ts +7 -3
  185. package/source/Introspection.ts +11 -0
  186. package/source/Mapping.ts +63 -21
  187. package/source/Query.test.ts +3 -3
  188. package/source/Query.ts +117 -33
  189. package/source/RTD/Endpoint.ts +3 -0
  190. package/source/RTD/Method.ts +16 -0
  191. package/source/RTD/Node.ts +29 -13
  192. package/source/RTD/Route.ts +5 -4
  193. package/source/RTD/factory.ts +5 -2
  194. package/source/RTD/syntax/parse.ts +37 -24
  195. package/source/RTD/syntax/types.ts +6 -4
  196. package/source/Remotes.ts +2 -9
  197. package/source/Tenant.ts +0 -8
  198. package/source/deployment.ts +32 -22
  199. package/source/directives/auth/Authorization.ts +37 -14
  200. package/source/directives/auth/Delegate.ts +42 -0
  201. package/source/directives/auth/Federation.ts +84 -0
  202. package/source/directives/auth/Incept.ts +4 -3
  203. package/source/directives/auth/Role.test.ts +53 -6
  204. package/source/directives/auth/Role.ts +22 -14
  205. package/source/directives/auth/split.ts +1 -1
  206. package/source/directives/auth/types.ts +1 -1
  207. package/source/directives/cache/Cache.ts +13 -6
  208. package/source/directives/cache/Control.ts +42 -16
  209. package/source/directives/cors/CORS.ts +1 -1
  210. package/source/directives/dev/Development.ts +1 -1
  211. package/source/directives/flow/Fetch.ts +88 -0
  212. package/source/directives/flow/Flow.ts +34 -0
  213. package/source/directives/flow/index.ts +3 -0
  214. package/source/directives/flow/types.ts +6 -0
  215. package/source/directives/index.ts +3 -1
  216. package/source/directives/io/Input.ts +4 -4
  217. package/source/directives/io/Output.ts +1 -1
  218. package/source/directives/octets/Context.ts +7 -5
  219. package/source/directives/octets/Delete.ts +4 -2
  220. package/source/directives/octets/Directive.ts +10 -0
  221. package/source/directives/octets/Fetch.ts +15 -13
  222. package/source/directives/octets/List.ts +9 -7
  223. package/source/directives/octets/Octets.ts +4 -5
  224. package/source/directives/octets/Store.ts +34 -12
  225. package/source/directives/octets/Workflow.ts +10 -3
  226. package/source/directives/octets/bytes.test.ts +30 -0
  227. package/source/directives/octets/bytes.ts +18 -0
  228. package/source/directives/octets/schemas.ts +4 -6
  229. package/source/directives/octets/types.ts +0 -7
  230. package/source/directives/octets/workflows/Execution.ts +59 -8
  231. package/source/directives/octets/workflows/Workflow.ts +2 -1
  232. package/source/directives/require/Directive.ts +5 -0
  233. package/source/directives/require/Headers.ts +20 -0
  234. package/source/directives/require/Require.ts +28 -0
  235. package/source/directives/require/index.ts +3 -0
  236. package/source/directives/vary/Directive.ts +2 -1
  237. package/source/directives/vary/Embed.ts +14 -8
  238. package/source/directives/vary/Vary.ts +6 -4
  239. package/source/directives/vary/embeddings/Authority.ts +8 -0
  240. package/source/directives/vary/embeddings/Embedding.ts +2 -1
  241. package/source/directives/vary/embeddings/Parameter.ts +14 -0
  242. package/source/directives/vary/embeddings/index.ts +6 -4
  243. package/source/exceptions.ts +22 -11
  244. package/source/manifest.ts +10 -11
  245. package/source/schemas.ts +1 -1
  246. package/transpiled/Annotation.d.ts +3 -3
  247. package/transpiled/Composition.js +2 -2
  248. package/transpiled/Composition.js.map +1 -1
  249. package/transpiled/Directive.js +4 -4
  250. package/transpiled/Directive.js.map +1 -1
  251. package/transpiled/Endpoint.d.ts +6 -4
  252. package/transpiled/Endpoint.js +28 -4
  253. package/transpiled/Endpoint.js.map +1 -1
  254. package/transpiled/Factory.d.ts +1 -1
  255. package/transpiled/Factory.js +9 -8
  256. package/transpiled/Factory.js.map +1 -1
  257. package/transpiled/Gateway.d.ts +2 -0
  258. package/transpiled/Gateway.js +36 -12
  259. package/transpiled/Gateway.js.map +1 -1
  260. package/transpiled/HTTP/Context.d.ts +8 -1
  261. package/transpiled/HTTP/Context.js +15 -2
  262. package/transpiled/HTTP/Context.js.map +1 -1
  263. package/transpiled/HTTP/Server.d.ts +13 -2
  264. package/transpiled/HTTP/Server.js +38 -36
  265. package/transpiled/HTTP/Server.js.map +1 -1
  266. package/transpiled/HTTP/exceptions.d.ts +7 -1
  267. package/transpiled/HTTP/exceptions.js +13 -1
  268. package/transpiled/HTTP/exceptions.js.map +1 -1
  269. package/transpiled/HTTP/formats/index.js +3 -3
  270. package/transpiled/HTTP/formats/index.js.map +1 -1
  271. package/transpiled/HTTP/messages.d.ts +1 -0
  272. package/transpiled/HTTP/messages.js +9 -3
  273. package/transpiled/HTTP/messages.js.map +1 -1
  274. package/transpiled/Introspection.d.ts +9 -0
  275. package/transpiled/Introspection.js +3 -0
  276. package/transpiled/Introspection.js.map +1 -0
  277. package/transpiled/Mapping.d.ts +10 -2
  278. package/transpiled/Mapping.js +48 -19
  279. package/transpiled/Mapping.js.map +1 -1
  280. package/transpiled/Query.d.ts +10 -1
  281. package/transpiled/Query.js +83 -30
  282. package/transpiled/Query.js.map +1 -1
  283. package/transpiled/RTD/Endpoint.d.ts +1 -0
  284. package/transpiled/RTD/Method.d.ts +4 -0
  285. package/transpiled/RTD/Method.js +11 -0
  286. package/transpiled/RTD/Method.js.map +1 -1
  287. package/transpiled/RTD/Node.d.ts +4 -1
  288. package/transpiled/RTD/Node.js +23 -12
  289. package/transpiled/RTD/Node.js.map +1 -1
  290. package/transpiled/RTD/Route.d.ts +1 -1
  291. package/transpiled/RTD/Route.js +0 -1
  292. package/transpiled/RTD/Route.js.map +1 -1
  293. package/transpiled/RTD/factory.js +5 -2
  294. package/transpiled/RTD/factory.js.map +1 -1
  295. package/transpiled/RTD/syntax/parse.js +34 -22
  296. package/transpiled/RTD/syntax/parse.js.map +1 -1
  297. package/transpiled/RTD/syntax/types.d.ts +5 -3
  298. package/transpiled/RTD/syntax/types.js +1 -1
  299. package/transpiled/RTD/syntax/types.js.map +1 -1
  300. package/transpiled/Remotes.d.ts +2 -4
  301. package/transpiled/Remotes.js +0 -5
  302. package/transpiled/Remotes.js.map +1 -1
  303. package/transpiled/Tenant.d.ts +0 -1
  304. package/transpiled/Tenant.js +0 -6
  305. package/transpiled/Tenant.js.map +1 -1
  306. package/transpiled/deployment.d.ts +1 -1
  307. package/transpiled/deployment.js +28 -20
  308. package/transpiled/deployment.js.map +1 -1
  309. package/transpiled/directives/auth/Authorization.js +26 -10
  310. package/transpiled/directives/auth/Authorization.js.map +1 -1
  311. package/transpiled/directives/auth/Delegate.d.ts +10 -0
  312. package/transpiled/directives/auth/Delegate.js +34 -0
  313. package/transpiled/directives/auth/Delegate.js.map +1 -0
  314. package/transpiled/directives/auth/Federation.d.ts +16 -0
  315. package/transpiled/directives/auth/Federation.js +57 -0
  316. package/transpiled/directives/auth/Federation.js.map +1 -0
  317. package/transpiled/directives/auth/Incept.js +4 -3
  318. package/transpiled/directives/auth/Incept.js.map +1 -1
  319. package/transpiled/directives/auth/Role.d.ts +4 -1
  320. package/transpiled/directives/auth/Role.js +20 -14
  321. package/transpiled/directives/auth/Role.js.map +1 -1
  322. package/transpiled/directives/auth/split.js +1 -1
  323. package/transpiled/directives/auth/split.js.map +1 -1
  324. package/transpiled/directives/cache/Cache.d.ts +3 -3
  325. package/transpiled/directives/cache/Cache.js +10 -4
  326. package/transpiled/directives/cache/Cache.js.map +1 -1
  327. package/transpiled/directives/cache/Control.d.ts +2 -1
  328. package/transpiled/directives/cache/Control.js +29 -12
  329. package/transpiled/directives/cache/Control.js.map +1 -1
  330. package/transpiled/directives/cors/CORS.js +1 -1
  331. package/transpiled/directives/cors/CORS.js.map +1 -1
  332. package/transpiled/directives/dev/Development.js +1 -1
  333. package/transpiled/directives/dev/Development.js.map +1 -1
  334. package/transpiled/directives/flow/Fetch.d.ts +13 -0
  335. package/transpiled/directives/flow/Fetch.js +59 -0
  336. package/transpiled/directives/flow/Fetch.js.map +1 -0
  337. package/transpiled/directives/flow/Flow.d.ts +10 -0
  338. package/transpiled/directives/flow/Flow.js +27 -0
  339. package/transpiled/directives/flow/Flow.js.map +1 -0
  340. package/transpiled/directives/flow/index.d.ts +2 -0
  341. package/transpiled/directives/flow/index.js +6 -0
  342. package/transpiled/directives/flow/index.js.map +1 -0
  343. package/transpiled/directives/flow/types.d.ts +5 -0
  344. package/transpiled/directives/flow/types.js.map +1 -0
  345. package/transpiled/directives/index.js +3 -1
  346. package/transpiled/directives/index.js.map +1 -1
  347. package/transpiled/directives/io/Input.js +2 -2
  348. package/transpiled/directives/io/Input.js.map +1 -1
  349. package/transpiled/directives/io/Output.js.map +1 -1
  350. package/transpiled/directives/octets/Context.d.ts +3 -3
  351. package/transpiled/directives/octets/Context.js +8 -26
  352. package/transpiled/directives/octets/Context.js.map +1 -1
  353. package/transpiled/directives/octets/Delete.d.ts +3 -2
  354. package/transpiled/directives/octets/Delete.js +3 -1
  355. package/transpiled/directives/octets/Delete.js.map +1 -1
  356. package/transpiled/directives/octets/Directive.d.ts +8 -0
  357. package/transpiled/directives/octets/Directive.js +8 -0
  358. package/transpiled/directives/octets/Directive.js.map +1 -0
  359. package/transpiled/directives/octets/Fetch.d.ts +6 -5
  360. package/transpiled/directives/octets/Fetch.js +11 -9
  361. package/transpiled/directives/octets/Fetch.js.map +1 -1
  362. package/transpiled/directives/octets/List.d.ts +6 -5
  363. package/transpiled/directives/octets/List.js +6 -4
  364. package/transpiled/directives/octets/List.js.map +1 -1
  365. package/transpiled/directives/octets/Octets.d.ts +2 -1
  366. package/transpiled/directives/octets/Octets.js +2 -4
  367. package/transpiled/directives/octets/Octets.js.map +1 -1
  368. package/transpiled/directives/octets/Store.d.ts +9 -3
  369. package/transpiled/directives/octets/Store.js +20 -8
  370. package/transpiled/directives/octets/Store.js.map +1 -1
  371. package/transpiled/directives/octets/Workflow.d.ts +3 -2
  372. package/transpiled/directives/octets/Workflow.js +9 -2
  373. package/transpiled/directives/octets/Workflow.js.map +1 -1
  374. package/transpiled/directives/octets/bytes.d.ts +1 -0
  375. package/transpiled/directives/octets/bytes.js +21 -0
  376. package/transpiled/directives/octets/bytes.js.map +1 -0
  377. package/transpiled/directives/octets/schemas.d.ts +4 -6
  378. package/transpiled/directives/octets/schemas.js +1 -3
  379. package/transpiled/directives/octets/schemas.js.map +1 -1
  380. package/transpiled/directives/octets/types.d.ts +0 -5
  381. package/transpiled/directives/octets/workflows/Execution.d.ts +5 -1
  382. package/transpiled/directives/octets/workflows/Execution.js +43 -9
  383. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  384. package/transpiled/directives/octets/workflows/Workflow.js +2 -1
  385. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  386. package/transpiled/directives/require/Directive.d.ts +4 -0
  387. package/transpiled/directives/require/Directive.js +3 -0
  388. package/transpiled/directives/require/Directive.js.map +1 -0
  389. package/transpiled/directives/require/Headers.d.ts +7 -0
  390. package/transpiled/directives/require/Headers.js +19 -0
  391. package/transpiled/directives/require/Headers.js.map +1 -0
  392. package/transpiled/directives/require/Require.d.ts +9 -0
  393. package/transpiled/directives/require/Require.js +27 -0
  394. package/transpiled/directives/require/Require.js.map +1 -0
  395. package/transpiled/directives/require/index.d.ts +2 -0
  396. package/transpiled/directives/require/index.js +6 -0
  397. package/transpiled/directives/require/index.js.map +1 -0
  398. package/transpiled/directives/vary/Directive.d.ts +2 -1
  399. package/transpiled/directives/vary/Embed.d.ts +2 -1
  400. package/transpiled/directives/vary/Embed.js +8 -6
  401. package/transpiled/directives/vary/Embed.js.map +1 -1
  402. package/transpiled/directives/vary/Vary.d.ts +2 -2
  403. package/transpiled/directives/vary/Vary.js +3 -3
  404. package/transpiled/directives/vary/Vary.js.map +1 -1
  405. package/transpiled/directives/vary/embeddings/Authority.d.ts +5 -0
  406. package/transpiled/directives/vary/embeddings/Authority.js +10 -0
  407. package/transpiled/directives/vary/embeddings/Authority.js.map +1 -0
  408. package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
  409. package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
  410. package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
  411. package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
  412. package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
  413. package/transpiled/directives/vary/embeddings/index.js +8 -4
  414. package/transpiled/directives/vary/embeddings/index.js.map +1 -1
  415. package/transpiled/exceptions.d.ts +3 -2
  416. package/transpiled/exceptions.js +13 -7
  417. package/transpiled/exceptions.js.map +1 -1
  418. package/transpiled/manifest.js +10 -11
  419. package/transpiled/manifest.js.map +1 -1
  420. package/transpiled/schemas.d.ts +1 -1
  421. package/transpiled/schemas.js +2 -2
  422. package/transpiled/schemas.js.map +1 -1
  423. package/transpiled/tsconfig.tsbuildinfo +1 -1
  424. package/tsconfig.json +9 -7
  425. package/components/identity.basic/operations/create.d.ts +0 -10
  426. package/components/identity.basic/operations/create.js +0 -10
  427. package/components/identity.basic/operations/create.js.map +0 -1
  428. package/components/identity.basic/source/create.ts +0 -18
  429. package/components/identity.federation/operations/create.d.ts +0 -10
  430. package/components/identity.federation/operations/create.js.map +0 -1
  431. package/components/identity.federation/operations/schemas.d.ts +0 -59
  432. package/components/identity.federation/operations/schemas.js +0 -9
  433. package/components/identity.federation/operations/schemas.js.map +0 -1
  434. package/components/identity.federation/operations/types.js.map +0 -1
  435. package/components/identity.federation/source/schemas.ts +0 -61
  436. package/components/octets.storage/operations/permute.js +0 -7
  437. package/schemas/octets/context.cos.yaml +0 -1
  438. package/source/HTTP/Server.test.ts +0 -126
  439. package/source/directives/octets/Permute.ts +0 -43
  440. package/transpiled/directives/octets/Permute.d.ts +0 -10
  441. package/transpiled/directives/octets/Permute.js +0 -56
  442. package/transpiled/directives/octets/Permute.js.map +0 -1
  443. /package/{components/identity.federation/operations → transpiled/directives/flow}/types.js +0 -0
@@ -4,56 +4,82 @@ import type { AuthenticatedContext, Directive } from './types'
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
 
13
+ public static disabled (headers: Headers): boolean {
14
+ const value = headers.get('cache-control')
15
+
16
+ if (value === null)
17
+ return false
18
+
19
+ const directives = mask(value)
20
+
21
+ return (directives & NO_STORE) === NO_STORE
22
+ }
23
+
12
24
  public set (context: AuthenticatedContext, headers: Headers): void {
13
25
  if (!['GET', 'HEAD', 'OPTIONS'].includes(context.request.method))
14
26
  return
15
27
 
16
28
  this.cache ??= this.resolve(context)
17
29
 
30
+ if (Control.disabled(headers))
31
+ return
32
+
18
33
  headers.set('cache-control', this.cache)
34
+
35
+ if (this.vary !== null)
36
+ headers.append('vary', 'authorization')
19
37
  }
20
38
 
21
39
  protected resolve (request: AuthenticatedContext): string {
22
40
  if (request.identity === null)
23
41
  return this.value
24
42
 
25
- const directives = this.mask()
43
+ const directives = mask(this.value)
44
+
45
+ if ((directives & PRIVATE) === PRIVATE)
46
+ this.vary = true
26
47
 
27
48
  if ((directives & (PUBLIC | NO_CACHE)) === PUBLIC)
28
49
  return 'no-cache, ' + this.value
29
50
 
30
- if ((directives & (PUBLIC | PRIVATE)) === 0)
51
+ if ((directives & (PUBLIC | PRIVATE)) === 0) {
52
+ this.vary = true
53
+
31
54
  return 'private, ' + this.value
55
+ }
32
56
 
33
57
  return this.value
34
58
  }
59
+ }
35
60
 
36
- private mask (): number {
37
- const directives = this.value.match(DIRECTIVES_RX)
61
+ function mask (value: string): number {
62
+ const directives = value.match(DIRECTIVES_RX)
38
63
 
39
- if (directives === null)
40
- return 0
64
+ if (directives === null)
65
+ return 0
41
66
 
42
- let mask = 0
67
+ let mask = 0
43
68
 
44
- for (const directive of directives)
45
- mask |= match<number>(directive,
46
- 'private', PRIVATE,
47
- 'public', PUBLIC,
48
- 'no-cache', NO_CACHE,
49
- 0)
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)
50
76
 
51
- return mask
52
- }
77
+ return mask
53
78
  }
54
79
 
55
- const DIRECTIVES_RX = /\b(private|public|no-cache)\b/ig
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
@@ -14,7 +14,7 @@ export class CORS implements Interceptor {
14
14
  ])
15
15
 
16
16
  private readonly headers = new Headers({
17
- 'access-control-allow-methods': 'GET, POST, PUT, PATCH, DELETE',
17
+ 'access-control-allow-methods': 'GET, POST, PUT, PATCH, DELETE, LOCK, UNLOCK',
18
18
  'access-control-allow-credentials': 'true',
19
19
  'access-control-allow-headers': Array.from(this.requestHeaders).join(', '),
20
20
  'access-control-max-age': '3600',
@@ -12,7 +12,7 @@ export class Development implements DirectiveFamily<Directive> {
12
12
  const Class = constructors[name]
13
13
 
14
14
  if (Class === undefined)
15
- throw new Error(`Directive '${name}' is not provided by the '${this.name}' family.`)
15
+ throw new Error(`Directive 'dev:${name}' is not implemented.`)
16
16
 
17
17
  return new Class(value)
18
18
  }
@@ -0,0 +1,88 @@
1
+ import { Readable } from 'node:stream'
2
+ import assert from 'node:assert'
3
+ import { match } from 'matchacho'
4
+ import { NotFound } from '../../HTTP'
5
+ import type { Directive } from './types'
6
+ import type { ReadableStream } from 'node:stream/web'
7
+ import type { Remotes } from '../../Remotes'
8
+ import type { Maybe } from '@toa.io/types'
9
+ import type { Component } from '@toa.io/core'
10
+ import type { Output } from '../../io'
11
+ import type { Input } from '../octets/types'
12
+ import type { Parameter } from '../../RTD'
13
+
14
+ export class Fetch implements Directive {
15
+ public readonly targeted = true
16
+
17
+ private readonly connecting: Promise<Component>
18
+ private remote: Component | null = null
19
+ private readonly operation: string
20
+
21
+ public constructor (endpoint: string, discovery: Remotes) {
22
+ assert.equal(typeof endpoint, 'string', '`flow:redirect` must be a string')
23
+
24
+ const [operation, name, namespace = 'default'] = endpoint.split('.').reverse()
25
+
26
+ this.operation = operation
27
+ this.connecting = discovery.discover(namespace, name)
28
+ }
29
+
30
+ public async apply (input: Input, parameters: Parameter[]): Promise<Output> {
31
+ if ('if-none-match' in input.request.headers)
32
+ return { status: 304 }
33
+
34
+ this.remote ??= await this.connecting
35
+
36
+ const request = await this.remote.invoke<Maybe<Request | string>>(this.operation, {
37
+ input: {
38
+ authority: input.authority,
39
+ path: input.request.url,
40
+ parameters: Object.fromEntries(parameters.map(({ name, value }) => [name, value]))
41
+ }
42
+ })
43
+
44
+ if (request instanceof Error)
45
+ throw new NotFound(request)
46
+
47
+ const { url, options } = match<Request>(request,
48
+ String, { url: request },
49
+ (request: Request): Request => ({
50
+ url: request.url,
51
+ options: {
52
+ method: request.options?.method ?? 'GET',
53
+ body: request.options?.body,
54
+ headers: request.options?.headers
55
+ }
56
+ }))
57
+
58
+ const response = await fetch(url, options)
59
+
60
+ if (!response.ok)
61
+ throw new NotFound()
62
+
63
+ const headers = new Headers()
64
+
65
+ for (const header of ['content-type', 'content-length', 'etag']) {
66
+ const value = response.headers.get(header)
67
+
68
+ if (value !== null)
69
+ headers.set(header, value)
70
+ }
71
+
72
+ return {
73
+ headers,
74
+ body: response.body === null ? null : Readable.fromWeb(response.body as ReadableStream)
75
+ }
76
+ }
77
+ }
78
+
79
+ interface Request {
80
+ url: string
81
+ options?: RequestOptions
82
+ }
83
+
84
+ interface RequestOptions {
85
+ method?: string
86
+ body?: string
87
+ headers?: Record<string, string>
88
+ }
@@ -0,0 +1,34 @@
1
+ import { Fetch } from './Fetch'
2
+ import type { Directive } from './types'
3
+ import type { Input, Output } from '../../io'
4
+ import type { DirectiveFamily, Parameter } from '../../RTD'
5
+ import type { Remotes } from '../../Remotes'
6
+
7
+ export class Flow implements DirectiveFamily<Directive> {
8
+ public readonly name: string = 'flow'
9
+ public readonly mandatory: boolean = false
10
+
11
+ public create (name: string, value: unknown, remotes: Remotes): Directive {
12
+ const Class = constructors[name]
13
+
14
+ if (Class === undefined)
15
+ throw new Error(`Directive '${this.name}:${name}' is not implemented.`)
16
+
17
+ return new Class(value, remotes)
18
+ }
19
+
20
+ public async preflight (directives: Directive[], input: Input, parameters: Parameter[]): Promise<Output> {
21
+ for (const directive of directives) {
22
+ const output = await directive.apply(input, parameters)
23
+
24
+ if (output !== null)
25
+ return output
26
+ }
27
+
28
+ return null
29
+ }
30
+ }
31
+
32
+ const constructors: Record<string, new (value: any, discovery: Remotes) => Directive> = {
33
+ fetch: Fetch
34
+ }
@@ -0,0 +1,3 @@
1
+ import { Flow } from './Flow'
2
+
3
+ export const flow = new Flow()
@@ -0,0 +1,6 @@
1
+ import type { Input, Output } from '../../io'
2
+ import type { Parameter } from '../../RTD'
3
+
4
+ export interface Directive {
5
+ apply: (input: Input, parameters: Parameter[]) => Promise<Output>
6
+ }
@@ -5,8 +5,10 @@ import { dev } from './dev'
5
5
  import { octets } from './octets'
6
6
  import { io } from './io'
7
7
  import { vary } from './vary'
8
+ import { req } from './require'
9
+ import { flow } from './flow'
8
10
  import type { DirectiveFamily } from '../RTD'
9
11
  import type { Interceptor } from '../Interception'
10
12
 
11
- export const families: DirectiveFamily[] = [authorization, io, cache, vary, octets, dev]
13
+ export const families: DirectiveFamily[] = [authorization, io, cache, vary, req, flow, octets, dev]
12
14
  export const interceptors: Interceptor[] = [cors]
@@ -12,7 +12,7 @@ export class Input implements Directive {
12
12
  }
13
13
 
14
14
  public static validate (permissions: unknown): asserts permissions is Permissions {
15
- schemas.input.validate(permissions, 'Incorrect \'io:input\' format')
15
+ schemas.input.validate<Permissions>(permissions, 'Incorrect \'io:input\' format')
16
16
  }
17
17
 
18
18
  public attach (context: Context): void {
@@ -21,15 +21,15 @@ export class Input implements Directive {
21
21
 
22
22
  private check (body: unknown): unknown {
23
23
  try {
24
- schemas.message.validate(body)
24
+ schemas.message.validate<Message | Message[]>(body)
25
25
  } catch {
26
- throw new BadRequest('Invalid request body.')
26
+ throw new BadRequest('Invalid request body')
27
27
  }
28
28
 
29
29
  const property = this.violation(body)
30
30
 
31
31
  if (property !== undefined)
32
- throw new BadRequest(`Unexpected input: ${property}.`)
32
+ throw new BadRequest(`Unexpected input: ${property}`)
33
33
 
34
34
  return body
35
35
  }
@@ -48,7 +48,7 @@ export class Output implements Directive {
48
48
  return
49
49
  }
50
50
 
51
- schemas.message.validate(message.body,
51
+ schemas.message.validate<Message>(message.body,
52
52
  '\'io:output\' expects response to be an object or array of objects')
53
53
 
54
54
  if (Array.isArray(message.body))
@@ -1,18 +1,20 @@
1
- import * as schemas from './schemas'
1
+ import assert from 'node:assert'
2
+ import { Directive } from './Directive'
2
3
  import type { Output } from '../../io'
3
- import type { Directive } from './types'
4
4
 
5
- export class Context implements Directive {
5
+ export class Context extends Directive {
6
6
  public readonly targeted = false
7
7
  public readonly storage: string
8
8
 
9
9
  public constructor (value: unknown) {
10
- schemas.context.validate(value)
10
+ super()
11
+
12
+ assert.ok(typeof value === 'string', 'Directive \'octets:context\' must must be a string')
11
13
 
12
14
  this.storage = value
13
15
  }
14
16
 
15
- public apply (): Output {
17
+ public async apply (): Promise<Output> {
16
18
  return null
17
19
  }
18
20
  }
@@ -2,16 +2,17 @@ import { Readable } from 'stream'
2
2
  import { NotFound } from '../../HTTP'
3
3
  import * as schemas from './schemas'
4
4
  import { Workflow } from './workflows'
5
+ import { Directive } from './Directive'
5
6
  import type { Parameter } from '../../RTD'
6
7
  import type { Unit } from './workflows'
7
8
  import type { Maybe } from '@toa.io/types'
8
9
  import type { Component } from '@toa.io/core'
9
10
  import type { Output } from '../../io'
10
- import type { Directive, Input } from './types'
11
+ import type { Input } from './types'
11
12
  import type { Remotes } from '../../Remotes'
12
13
  import type { Entry } from '@toa.io/extensions.storages'
13
14
 
14
- export class Delete implements Directive {
15
+ export class Delete extends Directive {
15
16
  public readonly targeted = true
16
17
 
17
18
  private readonly workflow?: Workflow
@@ -19,6 +20,7 @@ export class Delete implements Directive {
19
20
  private storage: Component | null = null
20
21
 
21
22
  public constructor (options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
23
+ super()
22
24
  schemas.remove.validate(options)
23
25
 
24
26
  if (options?.workflow !== undefined)
@@ -0,0 +1,10 @@
1
+ import type { Input } from './types'
2
+ import type { Parameter } from '../../RTD'
3
+ import type * as io from '../../io'
4
+
5
+ export abstract class Directive {
6
+ public readonly name = 'octets.' + this.constructor.name.toLowerCase()
7
+ public abstract readonly targeted: boolean
8
+
9
+ public abstract apply (storage: string, input: Input, parameters: Parameter[]): Promise<io.Output>
10
+ }
@@ -1,29 +1,31 @@
1
1
  import { posix } from 'node:path'
2
2
  import { Forbidden, NotFound } from '../../HTTP'
3
3
  import * as schemas from './schemas'
4
+ import { Directive } from './Directive'
5
+ import type { Readable } from 'node:stream'
4
6
  import type { Maybe } from '@toa.io/types'
5
7
  import type { Entry } from '@toa.io/extensions.storages'
6
- import type { Readable } from 'node:stream'
7
8
  import type { Component } from '@toa.io/core'
8
9
  import type { Output } from '../../io'
10
+ import type { Input } from './types'
9
11
 
10
- import type { Directive, Input } from './types'
11
-
12
- export class Fetch implements Directive {
12
+ export class Fetch extends Directive {
13
13
  public readonly targeted = true
14
14
 
15
- private readonly permissions: Required<Permissions> = {
15
+ private readonly options: Required<Options> = {
16
16
  blob: true,
17
17
  meta: false
18
18
  }
19
19
 
20
20
  private readonly discovery: Promise<Component>
21
- private storage: Component = null as unknown as Component
21
+ private storage!: Component
22
+
23
+ public constructor (options: Options | null, discovery: Promise<Component>) {
24
+ super()
22
25
 
23
- public constructor (permissions: Permissions | null, discovery: Promise<Component>) {
24
- schemas.fetch.validate(permissions)
26
+ schemas.fetch.validate(options)
27
+ Object.assign(this.options, options)
25
28
 
26
- Object.assign(this.permissions, permissions)
27
29
  this.discovery = discovery
28
30
  }
29
31
 
@@ -34,12 +36,12 @@ export class Fetch implements Directive {
34
36
  const metadata = input.subtype === 'octets.entry'
35
37
 
36
38
  if (!variant && metadata)
37
- if (this.permissions.meta)
39
+ if (this.options.meta)
38
40
  return this.get(storage, input)
39
41
  else
40
42
  throw new Forbidden('Metadata is not accessible.')
41
43
 
42
- if (!variant && !this.permissions.blob)
44
+ if (!variant && !this.options.blob)
43
45
  throw new Forbidden('BLOB variant must be specified.')
44
46
 
45
47
  return await this.fetch(storage, input)
@@ -62,7 +64,7 @@ export class Fetch implements Directive {
62
64
  const headers = new Headers({
63
65
  'content-type': result.type,
64
66
  'content-length': result.size.toString(),
65
- etag: result.checksum
67
+ etag: `"${result.checksum}"`
66
68
  })
67
69
 
68
70
  return {
@@ -86,7 +88,7 @@ export class Fetch implements Directive {
86
88
  }
87
89
  }
88
90
 
89
- export interface Permissions {
91
+ export interface Options {
90
92
  blob?: boolean
91
93
  meta?: boolean
92
94
  }
@@ -1,24 +1,26 @@
1
1
  import { posix } from 'node:path'
2
2
  import { Forbidden, NotFound } from '../../HTTP'
3
3
  import * as schemas from './schemas'
4
+ import { Directive } from './Directive'
4
5
  import type { Entry } from '@toa.io/extensions.storages'
5
6
  import type { Maybe } from '@toa.io/types'
6
7
  import type { Component } from '@toa.io/core'
7
8
  import type { Output } from '../../io'
8
9
 
9
- import type { Directive, Input } from './types'
10
+ import type { Input } from './types'
10
11
 
11
- export class List implements Directive {
12
+ export class List extends Directive {
12
13
  public readonly targeted = false
13
14
 
14
- private readonly permissions: Required<Permissions> = { meta: false }
15
+ private readonly options: Required<Options> = { meta: false }
15
16
  private readonly discovery: Promise<Component>
16
17
  private storage: Component | null = null
17
18
 
18
- public constructor (permissions: Permissions | null, discovery: Promise<Component>) {
19
+ public constructor (permissions: Options | null, discovery: Promise<Component>) {
20
+ super()
19
21
  schemas.list.validate(permissions)
20
22
 
21
- Object.assign(this.permissions, permissions)
23
+ Object.assign(this.options, permissions)
22
24
  this.discovery = discovery
23
25
  }
24
26
 
@@ -27,7 +29,7 @@ export class List implements Directive {
27
29
 
28
30
  const metadata = input.subtype === 'octets.entries'
29
31
 
30
- if (metadata && !this.permissions.meta)
32
+ if (metadata && !this.options.meta)
31
33
  throw new Forbidden('Metadata is not accessible.')
32
34
 
33
35
  const list = await this.storage.invoke<Maybe<string[]>>('list', {
@@ -65,6 +67,6 @@ export class List implements Directive {
65
67
  }
66
68
  }
67
69
 
68
- export interface Permissions {
70
+ export interface Options {
69
71
  meta?: boolean
70
72
  }
@@ -4,13 +4,13 @@ import { Store } from './Store'
4
4
  import { Fetch } from './Fetch'
5
5
  import { List } from './List'
6
6
  import { Delete } from './Delete'
7
- import { Permute } from './Permute'
8
7
  import { WorkflowDirective } from './Workflow'
8
+ import type { Directive } from './Directive'
9
9
  import type { Output } from '../../io'
10
10
  import type { Component } from '@toa.io/core'
11
11
  import type { Remotes } from '../../Remotes'
12
12
  import type { Parameter, DirectiveFamily } from '../../RTD'
13
- import type { Directive, Input } from './types'
13
+ import type { Input } from './types'
14
14
 
15
15
  export class Octets implements DirectiveFamily<Directive> {
16
16
  public readonly name: string = 'octets'
@@ -22,7 +22,7 @@ export class Octets implements DirectiveFamily<Directive> {
22
22
  const Class = DIRECTIVES[name]
23
23
 
24
24
  if (Class === undefined)
25
- throw new Error(`Directive '${name}' is not provided by the '${this.name}' family.`)
25
+ throw new Error(`Directive 'octets:${name}' is not implemented.`)
26
26
 
27
27
  this.discovery ??= remotes.discover('octets', 'storage')
28
28
 
@@ -55,7 +55,7 @@ export class Octets implements DirectiveFamily<Directive> {
55
55
  throw new NotFound(`Trailing slash is ${action.targeted ? 'redundant' : 'required'}.`)
56
56
 
57
57
  // noinspection JSObjectNullOrUndefined
58
- return action.apply(context.storage, input, parameters)
58
+ return await input.timing.capture(action.name, action.apply(context.storage, input, parameters))
59
59
  }
60
60
  }
61
61
 
@@ -65,7 +65,6 @@ const DIRECTIVES: Record<string, Constructor> = {
65
65
  fetch: Fetch,
66
66
  list: List,
67
67
  delete: Delete,
68
- permute: Permute,
69
68
  workflow: WorkflowDirective
70
69
  }
71
70
 
@@ -1,9 +1,11 @@
1
1
  import { PassThrough } from 'node:stream'
2
2
  import { match } from 'matchacho'
3
- import { BadRequest, UnsupportedMediaType } from '../../HTTP'
3
+ import * as http from '../../HTTP'
4
4
  import { cors } from '../cors'
5
5
  import * as schemas from './schemas'
6
6
  import { Workflow } from './workflows'
7
+ import { Directive } from './Directive'
8
+ import { toBytes } from './bytes'
7
9
  import type { Readable } from 'stream'
8
10
  import type { Parameter } from '../../RTD'
9
11
  import type { Unit } from './workflows'
@@ -12,19 +14,24 @@ import type { Remotes } from '../../Remotes'
12
14
  import type { ErrorType } from 'error-value'
13
15
  import type { Component } from '@toa.io/core'
14
16
  import type { Output } from '../../io'
15
- import type { Directive, Input } from './types'
17
+ import type { Input } from './types'
16
18
 
17
- export class Store implements Directive {
19
+ export class Store extends Directive {
18
20
  public readonly targeted = false
19
21
 
20
22
  private readonly accept?: string
23
+ private readonly limit: number
24
+ private readonly limitString: string
25
+ private readonly trust?: Array<string | RegExp>
21
26
  private readonly workflow?: Workflow
22
27
  private readonly discovery: Record<string, Promise<Component>> = {}
23
28
  private storage: Component | null = null
24
29
 
25
30
  public constructor
26
31
  (options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
27
- schemas.store.validate(options)
32
+ super()
33
+
34
+ schemas.store.validate<Options>(options)
28
35
 
29
36
  this.accept = match(options?.accept,
30
37
  String, (value: string) => value,
@@ -34,9 +41,16 @@ export class Store implements Directive {
34
41
  if (options?.workflow !== undefined)
35
42
  this.workflow = new Workflow(options.workflow, remotes)
36
43
 
44
+ if (options?.trust !== undefined)
45
+ this.trust = options.trust.map((value: string) =>
46
+ value.startsWith('/') ? new RegExp(value.slice(1, -1)) : value)
47
+
48
+ this.limitString = options?.limit ?? '64MiB'
49
+ this.limit = toBytes(this.limitString)
37
50
  this.discovery.storage = discovery
38
51
 
39
52
  cors.allow('content-meta')
53
+ cors.allow('content-location')
40
54
  }
41
55
 
42
56
  public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
@@ -45,17 +59,17 @@ export class Store implements Directive {
45
59
  const request: StoreRequest = {
46
60
  input: {
47
61
  storage,
48
- request: input.request
62
+ request: input.request,
63
+ accept: this.accept,
64
+ limit: this.limit,
65
+ trust: this.trust
49
66
  }
50
67
  }
51
68
 
52
69
  const meta = input.request.headers['content-meta']
53
70
 
54
- if (this.accept !== undefined)
55
- request.input.accept = this.accept
56
-
57
71
  if (meta !== undefined)
58
- request.input.meta = this.parseMeta(meta)
72
+ request.input.meta = this.meta(meta)
59
73
 
60
74
  const entry = await this.storage.invoke<Entry>('store', request)
61
75
 
@@ -87,12 +101,16 @@ export class Store implements Directive {
87
101
 
88
102
  private throw (error: ErrorType): never {
89
103
  throw match(error.code,
90
- 'NOT_ACCEPTABLE', () => new UnsupportedMediaType(),
91
- 'TYPE_MISMATCH', () => new BadRequest(),
104
+ 'NOT_ACCEPTABLE', () => new http.UnsupportedMediaType(),
105
+ 'TYPE_MISMATCH', () => new http.BadRequest(),
106
+ 'LIMIT_EXCEEDED', () => new http.RequestEntityTooLarge(`Size limit is ${this.limitString}`),
107
+ 'LOCATION_UNTRUSTED', () => new http.Forbidden(error.message),
108
+ 'LOCATION_LENGTH', () => new http.BadRequest(error.message),
109
+ 'LOCATION_UNAVAILABLE', () => new http.NotFound(error.message),
92
110
  error)
93
111
  }
94
112
 
95
- private parseMeta (value: string | string[]): Record<string, string> {
113
+ private meta (value: string | string[]): Record<string, string> {
96
114
  if (Array.isArray(value))
97
115
  value = value.join(',')
98
116
 
@@ -111,7 +129,9 @@ export class Store implements Directive {
111
129
 
112
130
  export interface Options {
113
131
  accept?: string | string[]
132
+ limit?: string
114
133
  workflow?: Unit[] | Unit
134
+ trust?: string[]
115
135
  }
116
136
 
117
137
  interface StoreRequest {
@@ -119,6 +139,8 @@ interface StoreRequest {
119
139
  storage: string
120
140
  request: Input['request']
121
141
  accept?: string
142
+ limit?: number
143
+ trust?: Array<string | RegExp>
122
144
  meta?: Record<string, string>
123
145
  }
124
146
  }