@toa.io/extensions.exposition 1.0.0-alpha.9 → 1.0.0-alpha.90

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 (481) hide show
  1. package/components/context.toa.yaml +2 -2
  2. package/components/identity.bans/manifest.toa.yaml +14 -6
  3. package/components/identity.bans/operations/transit.d.ts +14 -0
  4. package/components/identity.bans/operations/transit.js +11 -0
  5. package/components/identity.bans/operations/transit.js.map +1 -0
  6. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
  7. package/components/identity.bans/source/transit.ts +21 -0
  8. package/components/identity.bans/tsconfig.json +9 -0
  9. package/components/identity.basic/manifest.toa.yaml +20 -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 +8 -6
  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 +11 -9
  24. package/components/identity.basic/source/types.ts +8 -4
  25. package/components/identity.federation/manifest.toa.yaml +32 -15
  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/assertions-as-values.js +4 -2
  33. package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -1
  34. package/components/identity.federation/operations/lib/jwt.d.ts +5 -5
  35. package/components/identity.federation/operations/lib/jwt.js +25 -12
  36. package/components/identity.federation/operations/lib/jwt.js.map +1 -1
  37. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  38. package/components/identity.federation/operations/types/configuration.d.ts +14 -0
  39. package/components/identity.federation/operations/types/configuration.js +3 -0
  40. package/components/identity.federation/operations/types/configuration.js.map +1 -0
  41. package/components/identity.federation/operations/{types.d.ts → types/context.d.ts} +15 -7
  42. package/components/identity.federation/operations/types/context.js +3 -0
  43. package/components/identity.federation/operations/types/context.js.map +1 -0
  44. package/components/identity.federation/operations/types/entity.d.ts +6 -0
  45. package/components/identity.federation/operations/types/entity.js +3 -0
  46. package/components/identity.federation/operations/types/entity.js.map +1 -0
  47. package/components/identity.federation/operations/types/index.d.ts +3 -0
  48. package/components/identity.federation/operations/types/index.js +20 -0
  49. package/components/identity.federation/operations/types/index.js.map +1 -0
  50. package/components/identity.federation/source/authenticate.ts +6 -19
  51. package/components/identity.federation/source/{create.ts → incept.ts} +10 -9
  52. package/components/identity.federation/source/lib/assertions-as-values.ts +5 -2
  53. package/components/identity.federation/source/lib/jwt.test.ts +123 -4
  54. package/components/identity.federation/source/lib/jwt.ts +36 -16
  55. package/components/identity.federation/source/types/configuration.ts +15 -0
  56. package/components/identity.federation/source/{types.ts → types/context.ts} +17 -6
  57. package/components/identity.federation/source/types/entity.ts +6 -0
  58. package/components/identity.federation/source/types/index.ts +3 -0
  59. package/components/identity.federation/tsconfig.json +5 -4
  60. package/components/identity.roles/manifest.toa.yaml +16 -6
  61. package/components/identity.roles/operations/grant.d.ts +10 -0
  62. package/components/identity.roles/operations/grant.js +21 -0
  63. package/components/identity.roles/operations/grant.js.map +1 -0
  64. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  65. package/components/identity.roles/operations/lib/Entity.js +3 -0
  66. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  67. package/components/identity.roles/operations/list.d.ts +1 -4
  68. package/components/identity.roles/operations/list.js.map +1 -1
  69. package/components/identity.roles/operations/principal.d.ts +4 -6
  70. package/components/identity.roles/operations/principal.js +6 -1
  71. package/components/identity.roles/operations/principal.js.map +1 -1
  72. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  73. package/components/identity.roles/source/grant.ts +32 -0
  74. package/components/identity.roles/source/lib/Entity.ts +5 -0
  75. package/components/identity.roles/source/list.ts +2 -4
  76. package/components/identity.roles/source/principal.ts +10 -8
  77. package/components/identity.tokens/manifest.toa.yaml +19 -4
  78. package/components/identity.tokens/operations/authenticate.d.ts +2 -2
  79. package/components/identity.tokens/operations/authenticate.js +12 -5
  80. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  81. package/components/identity.tokens/operations/decrypt.js +1 -0
  82. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  83. package/components/identity.tokens/operations/encrypt.js +5 -1
  84. package/components/identity.tokens/operations/encrypt.js.map +1 -1
  85. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  86. package/components/identity.tokens/operations/types.d.ts +8 -2
  87. package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
  88. package/components/identity.tokens/source/authenticate.test.ts +11 -4
  89. package/components/identity.tokens/source/authenticate.ts +14 -6
  90. package/components/identity.tokens/source/decrypt.test.ts +5 -3
  91. package/components/identity.tokens/source/decrypt.ts +9 -8
  92. package/components/identity.tokens/source/encrypt.test.ts +26 -2
  93. package/components/identity.tokens/source/encrypt.ts +5 -1
  94. package/components/identity.tokens/source/types.ts +9 -2
  95. package/components/octets.storage/manifest.toa.yaml +9 -11
  96. package/components/octets.storage/operations/get.js +3 -3
  97. package/components/octets.storage/operations/head.js +7 -0
  98. package/components/octets.storage/operations/put.js +121 -0
  99. package/documentation/access.md +75 -38
  100. package/documentation/authorities.md +49 -0
  101. package/documentation/cache.md +8 -1
  102. package/documentation/components.md +61 -22
  103. package/documentation/flow.md +31 -0
  104. package/documentation/identity.md +17 -22
  105. package/documentation/introspection.md +82 -0
  106. package/documentation/octets.md +95 -67
  107. package/documentation/protocol.md +13 -3
  108. package/documentation/query.md +29 -4
  109. package/documentation/require.md +15 -0
  110. package/documentation/tree.md +13 -0
  111. package/documentation/vary.md +14 -14
  112. package/features/access.feature +77 -46
  113. package/features/annotation.feature +1 -0
  114. package/features/auth.claim.feature +170 -0
  115. package/features/authorities.basic.feature +141 -0
  116. package/features/authorities.feature +32 -0
  117. package/features/authorities.federation.feature +100 -0
  118. package/features/authorities.tokens.feature +117 -0
  119. package/features/body.feature +2 -0
  120. package/features/cache.feature +109 -5
  121. package/features/cors.feature +6 -1
  122. package/features/debug.feature +34 -0
  123. package/features/directives.feature +3 -0
  124. package/features/dynamic.feature +48 -0
  125. package/features/errors.feature +32 -7
  126. package/features/etag.feature +108 -0
  127. package/features/flow.feature +45 -0
  128. package/features/identity.bans.feature +137 -0
  129. package/features/identity.basic.feature +97 -26
  130. package/features/identity.feature +18 -6
  131. package/features/identity.federation.feature +66 -11
  132. package/features/identity.roles.feature +250 -7
  133. package/features/identity.tokens.feature +54 -4
  134. package/features/introspection.feature +153 -0
  135. package/features/io.feature +38 -1
  136. package/features/methods.feature +47 -0
  137. package/features/{octets.meta.feature → octets.attributes.feature} +16 -12
  138. package/features/octets.cloudinary.feature +68 -0
  139. package/features/octets.download.feature +189 -0
  140. package/features/octets.entries.feature +13 -55
  141. package/features/octets.feature +83 -107
  142. package/features/octets.workflows.feature +242 -58
  143. package/features/probes.feature +14 -0
  144. package/features/{queries.feature → query.feature} +77 -2
  145. package/features/realtime.feature +34 -0
  146. package/features/require.feature +67 -0
  147. package/features/response.feature +38 -3
  148. package/features/routes.feature +93 -2
  149. package/features/server.feature +21 -0
  150. package/features/steps/.env.example +3 -0
  151. package/features/steps/Database.ts +16 -9
  152. package/features/steps/Gateway.ts +23 -6
  153. package/features/steps/IdP.ts +30 -25
  154. package/features/steps/Parameters.ts +45 -3
  155. package/features/steps/Realtime.ts +151 -0
  156. package/features/steps/components/echo/manifest.toa.yaml +14 -1
  157. package/features/steps/components/echo/operations/identity.js +7 -0
  158. package/features/steps/components/echo/operations/parameters.js +7 -0
  159. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  160. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  161. package/features/steps/components/octets.tester/manifest.toa.yaml +22 -2
  162. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  163. package/features/steps/components/octets.tester/operations/bar.js +0 -1
  164. package/features/steps/components/octets.tester/operations/baz.js +0 -2
  165. package/features/steps/components/octets.tester/operations/foo.js +1 -2
  166. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  167. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  168. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  169. package/features/steps/components/pots/manifest.toa.yaml +14 -3
  170. package/features/steps/components/users/manifest.toa.yaml +0 -1
  171. package/features/steps/components/users.properties/manifest.toa.yaml +1 -1
  172. package/features/streams.feature +5 -0
  173. package/features/timing.feature +4 -1
  174. package/features/vary.feature +71 -0
  175. package/package.json +23 -14
  176. package/readme.md +19 -14
  177. package/schemas/annotation.cos.yaml +1 -1
  178. package/schemas/method.cos.yaml +1 -1
  179. package/schemas/node.cos.yaml +2 -0
  180. package/schemas/octets/put.cos.yaml +25 -0
  181. package/schemas/query.cos.yaml +4 -10
  182. package/source/Annotation.ts +3 -3
  183. package/source/Branch.ts +1 -0
  184. package/source/Composition.ts +0 -6
  185. package/source/Context.ts +1 -0
  186. package/source/Directive.ts +4 -5
  187. package/source/Endpoint.ts +59 -17
  188. package/source/Factory.ts +22 -13
  189. package/source/Gateway.ts +64 -17
  190. package/source/HTTP/Context.ts +25 -2
  191. package/source/HTTP/Server.ts +57 -43
  192. package/source/HTTP/exceptions.ts +13 -1
  193. package/source/HTTP/formats/index.ts +3 -3
  194. package/source/HTTP/messages.test.ts +45 -2
  195. package/source/HTTP/messages.ts +29 -5
  196. package/source/Introspection.ts +11 -0
  197. package/source/Mapping.ts +68 -21
  198. package/source/Query.test.ts +3 -3
  199. package/source/Query.ts +123 -33
  200. package/source/RTD/Context.ts +1 -1
  201. package/source/RTD/Endpoint.ts +3 -0
  202. package/source/RTD/Method.ts +16 -0
  203. package/source/RTD/Node.ts +29 -13
  204. package/source/RTD/Route.ts +5 -4
  205. package/source/RTD/Tree.ts +2 -2
  206. package/source/RTD/factory.ts +5 -2
  207. package/source/RTD/syntax/parse.test.ts +1 -1
  208. package/source/RTD/syntax/parse.ts +37 -24
  209. package/source/RTD/syntax/types.ts +6 -4
  210. package/source/Remotes.ts +7 -6
  211. package/source/Tenant.ts +6 -20
  212. package/source/deployment.ts +33 -23
  213. package/source/directives/auth/Authorization.ts +44 -21
  214. package/source/directives/auth/Delegate.ts +42 -0
  215. package/source/directives/auth/Echo.ts +19 -5
  216. package/source/directives/auth/Federation.ts +84 -0
  217. package/source/directives/auth/Incept.ts +4 -3
  218. package/source/directives/auth/Role.test.ts +53 -6
  219. package/source/directives/auth/Role.ts +22 -14
  220. package/source/directives/auth/Scheme.ts +1 -1
  221. package/source/directives/auth/split.ts +1 -1
  222. package/source/directives/auth/types.ts +2 -2
  223. package/source/directives/cache/Cache.ts +13 -6
  224. package/source/directives/cache/Control.ts +42 -16
  225. package/source/directives/cors/CORS.ts +1 -1
  226. package/source/directives/dev/Development.ts +1 -1
  227. package/source/directives/flow/Fetch.ts +88 -0
  228. package/source/directives/flow/Flow.ts +34 -0
  229. package/source/directives/flow/index.ts +3 -0
  230. package/source/directives/flow/types.ts +6 -0
  231. package/source/directives/index.ts +3 -1
  232. package/source/directives/io/Input.ts +4 -4
  233. package/source/directives/io/Output.ts +5 -4
  234. package/source/directives/octets/Context.ts +3 -2
  235. package/source/directives/octets/Delete.ts +11 -11
  236. package/source/directives/octets/Get.ts +84 -0
  237. package/source/directives/octets/Octets.ts +7 -11
  238. package/source/directives/octets/{Store.ts → Put.ts} +36 -21
  239. package/source/directives/octets/Workflow.ts +1 -1
  240. package/source/directives/octets/bytes.test.ts +30 -0
  241. package/source/directives/octets/bytes.ts +18 -0
  242. package/source/directives/octets/schemas.ts +4 -8
  243. package/source/directives/octets/workflows/Execution.ts +60 -8
  244. package/source/directives/octets/workflows/Workflow.ts +4 -4
  245. package/source/directives/require/Directive.ts +5 -0
  246. package/source/directives/require/Headers.ts +20 -0
  247. package/source/directives/require/Require.ts +28 -0
  248. package/source/directives/require/index.ts +3 -0
  249. package/source/directives/vary/Directive.ts +2 -1
  250. package/source/directives/vary/Embed.ts +14 -8
  251. package/source/directives/vary/Vary.ts +6 -4
  252. package/source/directives/vary/embeddings/Authority.ts +8 -0
  253. package/source/directives/vary/embeddings/Embedding.ts +2 -1
  254. package/source/directives/vary/embeddings/Language.ts +2 -2
  255. package/source/directives/vary/embeddings/Parameter.ts +14 -0
  256. package/source/directives/vary/embeddings/index.ts +6 -4
  257. package/source/exceptions.ts +17 -11
  258. package/source/manifest.ts +10 -11
  259. package/source/root.ts +5 -5
  260. package/source/schemas.ts +1 -1
  261. package/transpiled/Annotation.d.ts +3 -3
  262. package/transpiled/Branch.d.ts +1 -0
  263. package/transpiled/Composition.d.ts +0 -1
  264. package/transpiled/Composition.js +0 -4
  265. package/transpiled/Composition.js.map +1 -1
  266. package/transpiled/Context.d.ts +1 -0
  267. package/transpiled/Directive.js +4 -4
  268. package/transpiled/Directive.js.map +1 -1
  269. package/transpiled/Endpoint.d.ts +6 -4
  270. package/transpiled/Endpoint.js +39 -9
  271. package/transpiled/Endpoint.js.map +1 -1
  272. package/transpiled/Factory.d.ts +3 -2
  273. package/transpiled/Factory.js +18 -10
  274. package/transpiled/Factory.js.map +1 -1
  275. package/transpiled/Gateway.d.ts +3 -0
  276. package/transpiled/Gateway.js +49 -10
  277. package/transpiled/Gateway.js.map +1 -1
  278. package/transpiled/HTTP/Context.d.ts +8 -1
  279. package/transpiled/HTTP/Context.js +16 -2
  280. package/transpiled/HTTP/Context.js.map +1 -1
  281. package/transpiled/HTTP/Server.d.ts +13 -2
  282. package/transpiled/HTTP/Server.js +43 -36
  283. package/transpiled/HTTP/Server.js.map +1 -1
  284. package/transpiled/HTTP/exceptions.d.ts +7 -1
  285. package/transpiled/HTTP/exceptions.js +13 -1
  286. package/transpiled/HTTP/exceptions.js.map +1 -1
  287. package/transpiled/HTTP/formats/index.js +3 -3
  288. package/transpiled/HTTP/formats/index.js.map +1 -1
  289. package/transpiled/HTTP/messages.d.ts +1 -0
  290. package/transpiled/HTTP/messages.js +28 -5
  291. package/transpiled/HTTP/messages.js.map +1 -1
  292. package/transpiled/Introspection.d.ts +9 -0
  293. package/transpiled/Introspection.js +3 -0
  294. package/transpiled/Introspection.js.map +1 -0
  295. package/transpiled/Mapping.d.ts +11 -2
  296. package/transpiled/Mapping.js +50 -19
  297. package/transpiled/Mapping.js.map +1 -1
  298. package/transpiled/Query.d.ts +10 -1
  299. package/transpiled/Query.js +87 -30
  300. package/transpiled/Query.js.map +1 -1
  301. package/transpiled/RTD/Context.d.ts +1 -1
  302. package/transpiled/RTD/Endpoint.d.ts +1 -0
  303. package/transpiled/RTD/Method.d.ts +4 -0
  304. package/transpiled/RTD/Method.js +11 -0
  305. package/transpiled/RTD/Method.js.map +1 -1
  306. package/transpiled/RTD/Node.d.ts +4 -1
  307. package/transpiled/RTD/Node.js +23 -12
  308. package/transpiled/RTD/Node.js.map +1 -1
  309. package/transpiled/RTD/Route.d.ts +1 -1
  310. package/transpiled/RTD/Route.js +0 -1
  311. package/transpiled/RTD/Route.js.map +1 -1
  312. package/transpiled/RTD/Tree.d.ts +1 -1
  313. package/transpiled/RTD/Tree.js.map +1 -1
  314. package/transpiled/RTD/factory.js +5 -2
  315. package/transpiled/RTD/factory.js.map +1 -1
  316. package/transpiled/RTD/syntax/parse.js +34 -22
  317. package/transpiled/RTD/syntax/parse.js.map +1 -1
  318. package/transpiled/RTD/syntax/types.d.ts +5 -3
  319. package/transpiled/RTD/syntax/types.js +1 -1
  320. package/transpiled/RTD/syntax/types.js.map +1 -1
  321. package/transpiled/Remotes.d.ts +4 -4
  322. package/transpiled/Remotes.js +6 -5
  323. package/transpiled/Remotes.js.map +1 -1
  324. package/transpiled/Tenant.d.ts +5 -5
  325. package/transpiled/Tenant.js +2 -13
  326. package/transpiled/Tenant.js.map +1 -1
  327. package/transpiled/deployment.d.ts +1 -1
  328. package/transpiled/deployment.js +28 -20
  329. package/transpiled/deployment.js.map +1 -1
  330. package/transpiled/directives/auth/Authorization.d.ts +1 -1
  331. package/transpiled/directives/auth/Authorization.js +32 -18
  332. package/transpiled/directives/auth/Authorization.js.map +1 -1
  333. package/transpiled/directives/auth/Delegate.d.ts +10 -0
  334. package/transpiled/directives/auth/Delegate.js +34 -0
  335. package/transpiled/directives/auth/Delegate.js.map +1 -0
  336. package/transpiled/directives/auth/Echo.d.ts +4 -3
  337. package/transpiled/directives/auth/Echo.js +13 -3
  338. package/transpiled/directives/auth/Echo.js.map +1 -1
  339. package/transpiled/directives/auth/Federation.d.ts +16 -0
  340. package/transpiled/directives/auth/Federation.js +57 -0
  341. package/transpiled/directives/auth/Federation.js.map +1 -0
  342. package/transpiled/directives/auth/Incept.js +4 -3
  343. package/transpiled/directives/auth/Incept.js.map +1 -1
  344. package/transpiled/directives/auth/Role.d.ts +4 -1
  345. package/transpiled/directives/auth/Role.js +20 -14
  346. package/transpiled/directives/auth/Role.js.map +1 -1
  347. package/transpiled/directives/auth/Scheme.js +1 -1
  348. package/transpiled/directives/auth/Scheme.js.map +1 -1
  349. package/transpiled/directives/auth/split.js +1 -1
  350. package/transpiled/directives/auth/split.js.map +1 -1
  351. package/transpiled/directives/auth/types.d.ts +1 -1
  352. package/transpiled/directives/cache/Cache.d.ts +3 -3
  353. package/transpiled/directives/cache/Cache.js +10 -4
  354. package/transpiled/directives/cache/Cache.js.map +1 -1
  355. package/transpiled/directives/cache/Control.d.ts +2 -1
  356. package/transpiled/directives/cache/Control.js +29 -12
  357. package/transpiled/directives/cache/Control.js.map +1 -1
  358. package/transpiled/directives/cors/CORS.js +1 -1
  359. package/transpiled/directives/cors/CORS.js.map +1 -1
  360. package/transpiled/directives/dev/Development.js +1 -1
  361. package/transpiled/directives/dev/Development.js.map +1 -1
  362. package/transpiled/directives/flow/Fetch.d.ts +13 -0
  363. package/transpiled/directives/flow/Fetch.js +59 -0
  364. package/transpiled/directives/flow/Fetch.js.map +1 -0
  365. package/transpiled/directives/flow/Flow.d.ts +10 -0
  366. package/transpiled/directives/flow/Flow.js +27 -0
  367. package/transpiled/directives/flow/Flow.js.map +1 -0
  368. package/transpiled/directives/flow/index.d.ts +2 -0
  369. package/transpiled/directives/flow/index.js +6 -0
  370. package/transpiled/directives/flow/index.js.map +1 -0
  371. package/transpiled/directives/flow/types.d.ts +5 -0
  372. package/transpiled/directives/flow/types.js.map +1 -0
  373. package/transpiled/directives/index.js +3 -1
  374. package/transpiled/directives/index.js.map +1 -1
  375. package/transpiled/directives/io/Input.js +2 -2
  376. package/transpiled/directives/io/Input.js.map +1 -1
  377. package/transpiled/directives/io/Output.js +2 -2
  378. package/transpiled/directives/io/Output.js.map +1 -1
  379. package/transpiled/directives/octets/Context.js +4 -24
  380. package/transpiled/directives/octets/Context.js.map +1 -1
  381. package/transpiled/directives/octets/Delete.js +8 -8
  382. package/transpiled/directives/octets/Delete.js.map +1 -1
  383. package/transpiled/directives/octets/{Fetch.d.ts → Get.d.ts} +5 -6
  384. package/transpiled/directives/octets/{Fetch.js → Get.js} +24 -29
  385. package/transpiled/directives/octets/Get.js.map +1 -0
  386. package/transpiled/directives/octets/Octets.js +7 -11
  387. package/transpiled/directives/octets/Octets.js.map +1 -1
  388. package/transpiled/directives/octets/{Store.d.ts → Put.d.ts} +7 -2
  389. package/transpiled/directives/octets/{Store.js → Put.js} +26 -19
  390. package/transpiled/directives/octets/Put.js.map +1 -0
  391. package/transpiled/directives/octets/Workflow.js +1 -1
  392. package/transpiled/directives/octets/Workflow.js.map +1 -1
  393. package/transpiled/directives/octets/bytes.d.ts +1 -0
  394. package/transpiled/directives/octets/bytes.js +21 -0
  395. package/transpiled/directives/octets/bytes.js.map +1 -0
  396. package/transpiled/directives/octets/schemas.d.ts +4 -8
  397. package/transpiled/directives/octets/schemas.js +3 -6
  398. package/transpiled/directives/octets/schemas.js.map +1 -1
  399. package/transpiled/directives/octets/workflows/Execution.d.ts +5 -1
  400. package/transpiled/directives/octets/workflows/Execution.js +44 -9
  401. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  402. package/transpiled/directives/octets/workflows/Workflow.d.ts +1 -1
  403. package/transpiled/directives/octets/workflows/Workflow.js +2 -1
  404. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  405. package/transpiled/directives/require/Directive.d.ts +4 -0
  406. package/transpiled/directives/require/Directive.js +3 -0
  407. package/transpiled/directives/require/Directive.js.map +1 -0
  408. package/transpiled/directives/require/Headers.d.ts +7 -0
  409. package/transpiled/directives/require/Headers.js +19 -0
  410. package/transpiled/directives/require/Headers.js.map +1 -0
  411. package/transpiled/directives/require/Require.d.ts +9 -0
  412. package/transpiled/directives/require/Require.js +27 -0
  413. package/transpiled/directives/require/Require.js.map +1 -0
  414. package/transpiled/directives/require/index.d.ts +2 -0
  415. package/transpiled/directives/require/index.js +6 -0
  416. package/transpiled/directives/require/index.js.map +1 -0
  417. package/transpiled/directives/vary/Directive.d.ts +2 -1
  418. package/transpiled/directives/vary/Embed.d.ts +2 -1
  419. package/transpiled/directives/vary/Embed.js +8 -6
  420. package/transpiled/directives/vary/Embed.js.map +1 -1
  421. package/transpiled/directives/vary/Vary.d.ts +2 -2
  422. package/transpiled/directives/vary/Vary.js +3 -3
  423. package/transpiled/directives/vary/Vary.js.map +1 -1
  424. package/transpiled/directives/vary/embeddings/Authority.d.ts +5 -0
  425. package/transpiled/directives/vary/embeddings/Authority.js +10 -0
  426. package/transpiled/directives/vary/embeddings/Authority.js.map +1 -0
  427. package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
  428. package/transpiled/directives/vary/embeddings/Language.js +2 -2
  429. package/transpiled/directives/vary/embeddings/Language.js.map +1 -1
  430. package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
  431. package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
  432. package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
  433. package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
  434. package/transpiled/directives/vary/embeddings/index.js +8 -4
  435. package/transpiled/directives/vary/embeddings/index.js.map +1 -1
  436. package/transpiled/exceptions.d.ts +3 -2
  437. package/transpiled/exceptions.js +10 -5
  438. package/transpiled/exceptions.js.map +1 -1
  439. package/transpiled/manifest.js +10 -11
  440. package/transpiled/manifest.js.map +1 -1
  441. package/transpiled/root.js +5 -5
  442. package/transpiled/root.js.map +1 -1
  443. package/transpiled/schemas.d.ts +1 -1
  444. package/transpiled/schemas.js +2 -2
  445. package/transpiled/schemas.js.map +1 -1
  446. package/transpiled/tsconfig.tsbuildinfo +1 -1
  447. package/tsconfig.json +8 -2
  448. package/components/identity.basic/operations/create.d.ts +0 -10
  449. package/components/identity.basic/operations/create.js +0 -10
  450. package/components/identity.basic/operations/create.js.map +0 -1
  451. package/components/identity.basic/source/create.ts +0 -18
  452. package/components/identity.federation/operations/create.d.ts +0 -10
  453. package/components/identity.federation/operations/create.js.map +0 -1
  454. package/components/identity.federation/operations/schemas.d.ts +0 -59
  455. package/components/identity.federation/operations/schemas.js +0 -9
  456. package/components/identity.federation/operations/schemas.js.map +0 -1
  457. package/components/identity.federation/operations/types.js.map +0 -1
  458. package/components/identity.federation/source/schemas.ts +0 -61
  459. package/components/octets.storage/operations/fetch.js +0 -46
  460. package/components/octets.storage/operations/list.js +0 -7
  461. package/components/octets.storage/operations/permute.js +0 -7
  462. package/components/octets.storage/operations/store.js +0 -11
  463. package/features/steps/components/octets.tester/operations/diversify.js +0 -14
  464. package/schemas/octets/context.cos.yaml +0 -1
  465. package/schemas/octets/fetch.cos.yaml +0 -3
  466. package/schemas/octets/permute.cos.yaml +0 -1
  467. package/schemas/octets/store.cos.yaml +0 -3
  468. package/source/HTTP/Server.test.ts +0 -126
  469. package/source/directives/octets/Fetch.ts +0 -100
  470. package/source/directives/octets/List.ts +0 -72
  471. package/source/directives/octets/Permute.ts +0 -44
  472. package/transpiled/directives/octets/Fetch.js.map +0 -1
  473. package/transpiled/directives/octets/List.d.ts +0 -16
  474. package/transpiled/directives/octets/List.js +0 -74
  475. package/transpiled/directives/octets/List.js.map +0 -1
  476. package/transpiled/directives/octets/Permute.d.ts +0 -11
  477. package/transpiled/directives/octets/Permute.js +0 -58
  478. package/transpiled/directives/octets/Permute.js.map +0 -1
  479. package/transpiled/directives/octets/Store.js.map +0 -1
  480. /package/schemas/octets/{list.cos.yaml → get.cos.yaml} +0 -0
  481. /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
  }
@@ -1,4 +1,5 @@
1
1
  import { Stream } from 'node:stream'
2
+ import { console } from 'openspan'
2
3
  import * as schemas from './schemas'
3
4
  import type { Message } from './Message'
4
5
  import type { Directive } from './Directive'
@@ -40,19 +41,19 @@ export class Output implements Directive {
40
41
 
41
42
  if (typeof message.body !== 'object' || this.permissions.length === 0) {
42
43
  if (this.omitted)
43
- console.warn('Permissions for \'io:output\' are not specified properly ' +
44
- `(${context.request.url}). Response omitted.`)
44
+ console.warn('Permissions for \'io:output\' are not specified properly, response omitted',
45
+ { path: context.url.pathname })
45
46
 
46
47
  delete message.body
47
48
 
48
49
  return
49
50
  }
50
51
 
51
- schemas.message.validate(message.body,
52
+ schemas.message.validate<Message>(message.body,
52
53
  '\'io:output\' expects response to be an object or array of objects')
53
54
 
54
55
  if (Array.isArray(message.body))
55
- message.body = message.body.map((entity) => this.fit(entity))
56
+ message.body = message.body.map((entity) => this.fit(entity as Message))
56
57
  else
57
58
  message.body = this.fit(message.body)
58
59
  }
@@ -1,4 +1,4 @@
1
- import * as schemas from './schemas'
1
+ import assert from 'node:assert'
2
2
  import { Directive } from './Directive'
3
3
  import type { Output } from '../../io'
4
4
 
@@ -8,7 +8,8 @@ export class Context extends Directive {
8
8
 
9
9
  public constructor (value: unknown) {
10
10
  super()
11
- schemas.context.validate(value)
11
+
12
+ assert.ok(typeof value === 'string', 'Directive \'octets:context\' must must be a string')
12
13
 
13
14
  this.storage = value
14
15
  }
@@ -32,20 +32,20 @@ export class Delete extends Directive {
32
32
  public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
33
33
  this.storage ??= await this.discovery
34
34
 
35
- const entry = await this.storage.invoke<Maybe<Entry>>('get',
36
- {
37
- input: {
38
- storage,
39
- path: input.request.url
40
- }
41
- })
42
-
43
- if (entry instanceof Error)
44
- throw new NotFound()
45
-
46
35
  const output: Output = {}
47
36
 
48
37
  if (this.workflow !== undefined) {
38
+ const entry = await this.storage.invoke<Maybe<Entry>>('head',
39
+ {
40
+ input: {
41
+ storage,
42
+ path: input.request.url
43
+ }
44
+ })
45
+
46
+ if (entry instanceof Error)
47
+ throw new NotFound()
48
+
49
49
  output.status = 202
50
50
  output.body = Readable.from(this.execute(input, storage, entry, parameters))
51
51
  } else
@@ -0,0 +1,84 @@
1
+ import { Forbidden, NotFound } from '../../HTTP'
2
+ import * as schemas from './schemas'
3
+ import { Directive } from './Directive'
4
+ import type { Maybe } from '@toa.io/types'
5
+ import type { Entry, Stream } from '@toa.io/extensions.storages'
6
+ import type { Component } from '@toa.io/core'
7
+ import type { Output } from '../../io'
8
+ import type { Input } from './types'
9
+
10
+ export class Get extends Directive {
11
+ public readonly targeted = true
12
+
13
+ private readonly options: Required<Options> = {
14
+ meta: false
15
+ }
16
+
17
+ private readonly discovery: Promise<Component>
18
+ private storage!: Component
19
+
20
+ public constructor (options: Options | null, discovery: Promise<Component>) {
21
+ super()
22
+
23
+ schemas.get.validate(options)
24
+ Object.assign(this.options, options)
25
+
26
+ this.discovery = discovery
27
+ }
28
+
29
+ public async apply (storage: string, input: Input): Promise<Output> {
30
+ this.storage ??= await this.discovery
31
+
32
+ if (input.subtype === 'octets.entry')
33
+ if (this.options.meta)
34
+ return this.head(storage, input)
35
+ else
36
+ throw new Forbidden('Metadata is not accessible')
37
+ else
38
+ return await this.get(storage, input)
39
+ }
40
+
41
+ private async get (storage: string, input: Input): Promise<Output> {
42
+ if ('if-none-match' in input.request.headers)
43
+ return { status: 304 }
44
+
45
+ const entry = await this.storage.invoke<Maybe<Stream>>('get', {
46
+ input: {
47
+ storage,
48
+ path: input.request.url
49
+ }
50
+ })
51
+
52
+ if (entry instanceof Error)
53
+ throw new NotFound()
54
+
55
+ const headers = new Headers({
56
+ 'content-type': entry.type,
57
+ 'content-length': entry.size.toString(),
58
+ etag: `"${entry.checksum}"`
59
+ })
60
+
61
+ return {
62
+ headers,
63
+ body: entry.stream
64
+ }
65
+ }
66
+
67
+ private async head (storage: string, input: Input): Promise<Output> {
68
+ const entry = await this.storage.invoke<Maybe<Entry>>('head', {
69
+ input: {
70
+ storage,
71
+ path: input.request.url
72
+ }
73
+ })
74
+
75
+ if (entry instanceof Error)
76
+ throw new NotFound()
77
+
78
+ return { body: entry }
79
+ }
80
+ }
81
+
82
+ export interface Options {
83
+ meta?: boolean
84
+ }
@@ -1,10 +1,8 @@
1
1
  import { NotFound } from '../../HTTP'
2
2
  import { Context } from './Context'
3
- import { Store } from './Store'
4
- import { Fetch } from './Fetch'
5
- import { List } from './List'
3
+ import { Put } from './Put'
4
+ import { Get } from './Get'
6
5
  import { Delete } from './Delete'
7
- import { Permute } from './Permute'
8
6
  import { WorkflowDirective } from './Workflow'
9
7
  import type { Directive } from './Directive'
10
8
  import type { Output } from '../../io'
@@ -23,7 +21,7 @@ export class Octets implements DirectiveFamily<Directive> {
23
21
  const Class = DIRECTIVES[name]
24
22
 
25
23
  if (Class === undefined)
26
- throw new Error(`Directive '${name}' is not provided by the '${this.name}' family.`)
24
+ throw new Error(`Directive 'octets:${name}' is not implemented.`)
27
25
 
28
26
  this.discovery ??= remotes.discover('octets', 'storage')
29
27
 
@@ -41,14 +39,14 @@ export class Octets implements DirectiveFamily<Directive> {
41
39
  else if (action === null)
42
40
  action = directive
43
41
  else
44
- throw new Error('Octets action is umbiguous.')
42
+ throw new Error('Octets action is ambiguous')
45
43
 
46
44
  if (action === null)
47
45
  return null
48
46
 
49
47
  // noinspection PointlessBooleanExpressionJS
50
48
  if (context === null)
51
- throw new Error('Octets context is not defined.')
49
+ throw new Error('Octets context is not defined')
52
50
 
53
51
  const targeted = input.request.url[input.request.url.length - 1] !== '/'
54
52
 
@@ -62,11 +60,9 @@ export class Octets implements DirectiveFamily<Directive> {
62
60
 
63
61
  const DIRECTIVES: Record<string, Constructor> = {
64
62
  context: Context,
65
- store: Store,
66
- fetch: Fetch,
67
- list: List,
63
+ put: Put,
64
+ get: Get,
68
65
  delete: Delete,
69
- permute: Permute,
70
66
  workflow: WorkflowDirective
71
67
  }
72
68
 
@@ -1,10 +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
7
  import { Directive } from './Directive'
8
+ import { toBytes } from './bytes'
8
9
  import type { Readable } from 'stream'
9
10
  import type { Parameter } from '../../RTD'
10
11
  import type { Unit } from './workflows'
@@ -15,10 +16,13 @@ import type { Component } from '@toa.io/core'
15
16
  import type { Output } from '../../io'
16
17
  import type { Input } from './types'
17
18
 
18
- export class Store extends Directive {
19
+ export class Put extends Directive {
19
20
  public readonly targeted = false
20
21
 
21
22
  private readonly accept?: string
23
+ private readonly limit: number
24
+ private readonly limitString: string
25
+ private readonly trust?: Array<string | RegExp>
22
26
  private readonly workflow?: Workflow
23
27
  private readonly discovery: Record<string, Promise<Component>> = {}
24
28
  private storage: Component | null = null
@@ -26,7 +30,8 @@ export class Store extends Directive {
26
30
  public constructor
27
31
  (options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
28
32
  super()
29
- schemas.store.validate(options)
33
+
34
+ schemas.put.validate<Options>(options)
30
35
 
31
36
  this.accept = match(options?.accept,
32
37
  String, (value: string) => value,
@@ -36,9 +41,16 @@ export class Store extends Directive {
36
41
  if (options?.workflow !== undefined)
37
42
  this.workflow = new Workflow(options.workflow, remotes)
38
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)
39
50
  this.discovery.storage = discovery
40
51
 
41
- cors.allow('content-meta')
52
+ cors.allow('content-attributes')
53
+ cors.allow('content-location')
42
54
  }
43
55
 
44
56
  public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
@@ -47,19 +59,14 @@ export class Store extends Directive {
47
59
  const request: StoreRequest = {
48
60
  input: {
49
61
  storage,
50
- request: input.request
62
+ request: input.request,
63
+ accept: this.accept,
64
+ limit: this.limit,
65
+ trust: this.trust
51
66
  }
52
67
  }
53
68
 
54
- const meta = input.request.headers['content-meta']
55
-
56
- if (this.accept !== undefined)
57
- request.input.accept = this.accept
58
-
59
- if (meta !== undefined)
60
- request.input.meta = this.parseMeta(meta)
61
-
62
- const entry = await this.storage.invoke<Entry>('store', request)
69
+ const entry = await this.storage.invoke<Entry>('put', request)
63
70
 
64
71
  return match<Output>(entry,
65
72
  Error, (error: ErrorType) => this.throw(error),
@@ -89,31 +96,37 @@ export class Store extends Directive {
89
96
 
90
97
  private throw (error: ErrorType): never {
91
98
  throw match(error.code,
92
- 'NOT_ACCEPTABLE', () => new UnsupportedMediaType(),
93
- 'TYPE_MISMATCH', () => new BadRequest(),
99
+ 'NOT_ACCEPTABLE', () => new http.UnsupportedMediaType(),
100
+ 'TYPE_MISMATCH', () => new http.BadRequest(),
101
+ 'LIMIT_EXCEEDED', () => new http.RequestEntityTooLarge(`Size limit is ${this.limitString}`),
102
+ 'LOCATION_UNTRUSTED', () => new http.Forbidden(error.message),
103
+ 'LOCATION_LENGTH', () => new http.BadRequest(error.message),
104
+ 'LOCATION_UNAVAILABLE', () => new http.NotFound(error.message),
94
105
  error)
95
106
  }
96
107
 
97
- private parseMeta (value: string | string[]): Record<string, string> {
108
+ private attributes (value: string | string[]): Record<string, string> {
98
109
  if (Array.isArray(value))
99
110
  value = value.join(',')
100
111
 
101
- const meta: Record<string, string> = {}
112
+ const attributes: Record<string, string> = {}
102
113
 
103
114
  for (const pair of value.split(',')) {
104
115
  const eq = pair.indexOf('=')
105
116
  const key = (eq === -1 ? pair : pair.slice(0, eq)).trim()
106
117
 
107
- meta[key] = eq === -1 ? 'true' : pair.slice(eq + 1).trim()
118
+ attributes[key] = eq === -1 ? 'true' : pair.slice(eq + 1).trim()
108
119
  }
109
120
 
110
- return meta
121
+ return attributes
111
122
  }
112
123
  }
113
124
 
114
125
  export interface Options {
115
126
  accept?: string | string[]
127
+ limit?: string
116
128
  workflow?: Unit[] | Unit
129
+ trust?: string[]
117
130
  }
118
131
 
119
132
  interface StoreRequest {
@@ -121,6 +134,8 @@ interface StoreRequest {
121
134
  storage: string
122
135
  request: Input['request']
123
136
  accept?: string
124
- meta?: Record<string, string>
137
+ limit?: number
138
+ trust?: Array<string | RegExp>
139
+ attributes?: Record<string, string>
125
140
  }
126
141
  }
@@ -29,7 +29,7 @@ export class WorkflowDirective extends Directive {
29
29
  public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
30
30
  this.storage ??= await this.discovery
31
31
 
32
- const entry = await this.storage.invoke<Maybe<Entry>>('get',
32
+ const entry = await this.storage.invoke<Maybe<Entry>>('head',
33
33
  {
34
34
  input: {
35
35
  storage,