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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (547) hide show
  1. package/components/context.toa.yaml +12 -0
  2. package/components/identity.bans/manifest.toa.yaml +2 -1
  3. package/components/identity.basic/manifest.toa.yaml +6 -2
  4. package/components/identity.basic/operations/authenticate.d.ts +9 -0
  5. package/components/identity.basic/operations/authenticate.js +24 -0
  6. package/components/identity.basic/operations/authenticate.js.map +1 -0
  7. package/components/identity.basic/operations/create.d.ts +10 -0
  8. package/components/identity.basic/operations/create.js +10 -0
  9. package/components/identity.basic/operations/create.js.map +1 -0
  10. package/components/identity.basic/operations/transit.d.ts +12 -0
  11. package/components/identity.basic/operations/transit.js +53 -0
  12. package/components/identity.basic/operations/transit.js.map +1 -0
  13. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -0
  14. package/components/identity.basic/operations/types.d.ts +38 -0
  15. package/components/identity.basic/operations/types.js +3 -0
  16. package/components/identity.basic/operations/types.js.map +1 -0
  17. package/components/identity.basic/source/authenticate.ts +0 -1
  18. package/components/identity.federation/events/principal.js +22 -0
  19. package/components/identity.federation/manifest.toa.yaml +94 -0
  20. package/components/identity.federation/operations/authenticate.d.ts +3 -0
  21. package/components/identity.federation/operations/authenticate.js +20 -0
  22. package/components/identity.federation/operations/authenticate.js.map +1 -0
  23. package/components/identity.federation/operations/create.d.ts +10 -0
  24. package/components/identity.federation/operations/create.js +15 -0
  25. package/components/identity.federation/operations/create.js.map +1 -0
  26. package/components/identity.federation/operations/lib/assertions-as-values.d.ts +4 -0
  27. package/components/identity.federation/operations/lib/assertions-as-values.js +45 -0
  28. package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -0
  29. package/components/identity.federation/operations/lib/jwt.d.ts +20 -0
  30. package/components/identity.federation/operations/lib/jwt.js +136 -0
  31. package/components/identity.federation/operations/lib/jwt.js.map +1 -0
  32. package/components/identity.federation/operations/schemas.d.ts +59 -0
  33. package/components/identity.federation/operations/schemas.js +9 -0
  34. package/components/identity.federation/operations/schemas.js.map +1 -0
  35. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -0
  36. package/components/identity.federation/operations/types.d.ts +51 -0
  37. package/components/identity.federation/operations/types.js +3 -0
  38. package/components/identity.federation/operations/types.js.map +1 -0
  39. package/components/identity.federation/source/authenticate.ts +28 -0
  40. package/components/identity.federation/source/create.ts +26 -0
  41. package/components/identity.federation/source/lib/assertions-as-values.ts +19 -0
  42. package/components/identity.federation/source/lib/jwt.test.ts +56 -0
  43. package/components/identity.federation/source/lib/jwt.ts +171 -0
  44. package/components/identity.federation/source/schemas.ts +61 -0
  45. package/components/identity.federation/source/types.ts +56 -0
  46. package/components/identity.federation/tsconfig.json +9 -0
  47. package/components/identity.roles/manifest.toa.yaml +18 -5
  48. package/components/identity.roles/operations/grant.d.ts +10 -0
  49. package/components/identity.roles/operations/grant.js +20 -0
  50. package/components/identity.roles/operations/grant.js.map +1 -0
  51. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  52. package/components/identity.roles/operations/lib/Entity.js +3 -0
  53. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  54. package/components/identity.roles/operations/list.d.ts +2 -0
  55. package/components/identity.roles/operations/list.js +8 -0
  56. package/components/identity.roles/operations/list.js.map +1 -0
  57. package/components/identity.roles/operations/principal.d.ts +13 -0
  58. package/components/identity.roles/operations/principal.js +13 -0
  59. package/components/identity.roles/operations/principal.js.map +1 -0
  60. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -0
  61. package/components/identity.roles/source/grant.ts +31 -0
  62. package/components/identity.roles/source/lib/Entity.ts +5 -0
  63. package/components/identity.roles/source/list.ts +2 -4
  64. package/components/identity.roles/source/principal.ts +10 -8
  65. package/components/identity.tokens/manifest.toa.yaml +1 -1
  66. package/components/identity.tokens/operations/authenticate.d.ts +9 -0
  67. package/components/identity.tokens/operations/authenticate.js +32 -0
  68. package/components/identity.tokens/operations/authenticate.js.map +1 -0
  69. package/components/identity.tokens/operations/decrypt.d.ts +3 -0
  70. package/components/identity.tokens/operations/decrypt.js +32 -0
  71. package/components/identity.tokens/operations/decrypt.js.map +1 -0
  72. package/components/identity.tokens/operations/encrypt.d.ts +8 -0
  73. package/components/identity.tokens/operations/encrypt.js +22 -0
  74. package/components/identity.tokens/operations/encrypt.js.map +1 -0
  75. package/components/identity.tokens/operations/revoke.d.ts +2 -0
  76. package/components/identity.tokens/operations/revoke.js +8 -0
  77. package/components/identity.tokens/operations/revoke.js.map +1 -0
  78. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -0
  79. package/components/identity.tokens/operations/types.d.ts +40 -0
  80. package/components/identity.tokens/operations/types.js +3 -0
  81. package/components/identity.tokens/operations/types.js.map +1 -0
  82. package/components/octets.storage/manifest.toa.yaml +1 -0
  83. package/components/octets.storage/operations/store.js +3 -3
  84. package/cucumber.js +0 -1
  85. package/documentation/access.md +11 -11
  86. package/documentation/components.md +49 -13
  87. package/documentation/identity.md +14 -7
  88. package/documentation/io.md +56 -0
  89. package/documentation/octets.md +105 -40
  90. package/documentation/protocol.md +21 -1
  91. package/documentation/query.md +51 -6
  92. package/documentation/tree.md +22 -4
  93. package/documentation/vary.md +69 -0
  94. package/features/access.feature +13 -2
  95. package/features/annotation.feature +1 -0
  96. package/features/body.feature +3 -1
  97. package/features/cache.feature +3 -0
  98. package/features/cors.feature +72 -0
  99. package/features/directives.feature +2 -0
  100. package/features/dynamic.feature +14 -7
  101. package/features/errors.feature +4 -3
  102. package/features/etag.feature +97 -0
  103. package/features/identity.basic.feature +68 -0
  104. package/features/identity.feature +19 -3
  105. package/features/identity.federation.feature +197 -0
  106. package/features/identity.roles.feature +151 -0
  107. package/features/identity.tokens.feature +3 -0
  108. package/features/io.feature +167 -0
  109. package/features/octets.entries.feature +123 -0
  110. package/features/octets.feature +4 -28
  111. package/features/octets.meta.feature +66 -0
  112. package/features/octets.workflows.feature +177 -4
  113. package/features/queries.feature +9 -1
  114. package/features/response.feature +68 -0
  115. package/features/routes.feature +54 -10
  116. package/features/steps/Captures.ts +6 -0
  117. package/features/steps/Components.ts +18 -6
  118. package/features/steps/Database.ts +1 -1
  119. package/features/steps/Gateway.ts +4 -2
  120. package/features/steps/HTTP.ts +40 -87
  121. package/features/steps/IdP.ts +149 -0
  122. package/features/steps/Parameters.ts +8 -2
  123. package/features/steps/Workspace.ts +5 -7
  124. package/features/steps/components/echo/manifest.toa.yaml +1 -0
  125. package/features/steps/components/echo/operations/error.js +11 -0
  126. package/features/steps/components/greeter/manifest.toa.yaml +1 -0
  127. package/features/steps/components/octets.tester/manifest.toa.yaml +4 -0
  128. package/features/steps/components/octets.tester/operations/concat.js +7 -0
  129. package/features/steps/components/octets.tester/operations/echo.js +7 -0
  130. package/features/steps/components/pots/manifest.toa.yaml +12 -3
  131. package/features/steps/components/sequences/manifest.toa.yaml +1 -0
  132. package/features/steps/components/users/manifest.toa.yaml +4 -0
  133. package/features/steps/components/users.properties/manifest.toa.yaml +14 -0
  134. package/features/steps/tsconfig.json +1 -1
  135. package/features/timing.feature +66 -0
  136. package/features/vary.feature +180 -0
  137. package/package.json +16 -20
  138. package/readme.md +7 -6
  139. package/schemas/annotation.cos.yaml +1 -0
  140. package/schemas/io/input.cos.yaml +3 -0
  141. package/schemas/io/message.cos.yaml +5 -0
  142. package/schemas/io/output.cos.yaml +5 -0
  143. package/schemas/octets/delete.cos.yaml +2 -1
  144. package/schemas/octets/list.cos.yaml +2 -1
  145. package/schemas/octets/workflow.cos.yaml +12 -0
  146. package/schemas/querystring.cos.yaml +1 -0
  147. package/source/Annotation.ts +1 -0
  148. package/source/Context.ts +6 -4
  149. package/source/Directive.test.ts +14 -8
  150. package/source/Directive.ts +26 -49
  151. package/source/Endpoint.ts +53 -6
  152. package/source/Factory.ts +23 -12
  153. package/source/Gateway.ts +45 -42
  154. package/source/HTTP/Context.ts +67 -0
  155. package/source/HTTP/Server.test.ts +61 -134
  156. package/source/HTTP/Server.ts +96 -87
  157. package/source/HTTP/Timing.ts +40 -0
  158. package/source/HTTP/formats/msgpack.ts +9 -6
  159. package/source/HTTP/formats/text.ts +1 -1
  160. package/source/HTTP/formats/yaml.ts +1 -1
  161. package/source/HTTP/index.ts +1 -0
  162. package/source/HTTP/messages.test.ts +27 -8
  163. package/source/HTTP/messages.ts +38 -42
  164. package/source/Interception.ts +24 -0
  165. package/source/Mapping.ts +7 -8
  166. package/source/RTD/Context.ts +7 -10
  167. package/source/RTD/Directives.ts +28 -4
  168. package/source/RTD/Endpoint.ts +6 -4
  169. package/source/RTD/Match.ts +2 -7
  170. package/source/RTD/Method.ts +7 -13
  171. package/source/RTD/Node.ts +13 -14
  172. package/source/RTD/Tree.ts +19 -15
  173. package/source/RTD/factory.ts +2 -5
  174. package/source/RTD/syntax/parse.ts +6 -6
  175. package/source/RTD/syntax/types.ts +1 -1
  176. package/source/deployment.ts +7 -2
  177. package/source/directives/auth/Anonymous.ts +3 -2
  178. package/source/directives/auth/{Family.ts → Authorization.ts} +39 -40
  179. package/source/directives/auth/Delegate.ts +32 -0
  180. package/source/directives/auth/Incept.ts +11 -6
  181. package/source/directives/auth/Role.ts +5 -3
  182. package/source/directives/auth/Rule.ts +2 -2
  183. package/source/directives/auth/Scheme.ts +2 -2
  184. package/source/directives/auth/index.ts +2 -2
  185. package/source/directives/auth/schemes.ts +2 -1
  186. package/source/directives/auth/types.ts +9 -6
  187. package/source/directives/cache/{Family.ts → Cache.ts} +6 -7
  188. package/source/directives/cache/Control.ts +5 -5
  189. package/source/directives/cache/index.ts +2 -2
  190. package/source/directives/cache/types.ts +2 -2
  191. package/source/directives/cors/CORS.ts +62 -0
  192. package/source/directives/cors/index.ts +3 -0
  193. package/source/directives/dev/{Family.ts → Development.ts} +4 -5
  194. package/source/directives/dev/Stub.ts +4 -4
  195. package/source/directives/dev/Throw.ts +4 -4
  196. package/source/directives/dev/index.ts +2 -2
  197. package/source/directives/dev/types.ts +1 -1
  198. package/source/directives/index.ts +11 -6
  199. package/source/directives/io/Directive.ts +11 -0
  200. package/source/directives/io/IO.ts +43 -0
  201. package/source/directives/io/Input.ts +50 -0
  202. package/source/directives/io/Message.ts +1 -0
  203. package/source/directives/io/Output.ts +69 -0
  204. package/source/directives/io/index.ts +3 -0
  205. package/source/directives/io/schemas.ts +12 -0
  206. package/source/directives/octets/Context.ts +6 -5
  207. package/source/directives/octets/Delete.ts +64 -11
  208. package/source/directives/octets/Directive.ts +10 -0
  209. package/source/directives/octets/Fetch.ts +44 -29
  210. package/source/directives/octets/List.ts +50 -10
  211. package/source/directives/octets/{Family.ts → Octets.ts} +14 -9
  212. package/source/directives/octets/Permute.ts +18 -11
  213. package/source/directives/octets/Store.ts +70 -102
  214. package/source/directives/octets/Workflow.ts +48 -0
  215. package/source/directives/octets/index.ts +2 -2
  216. package/source/directives/octets/schemas.test.ts +21 -0
  217. package/source/directives/octets/schemas.ts +13 -6
  218. package/source/directives/octets/types.ts +2 -8
  219. package/source/directives/octets/workflows/Execution.ts +76 -0
  220. package/source/directives/octets/workflows/Workflow.ts +37 -0
  221. package/source/directives/octets/workflows/index.ts +1 -0
  222. package/source/directives/vary/Directive.ts +6 -0
  223. package/source/directives/vary/Embed.ts +62 -0
  224. package/source/directives/vary/Properties.ts +17 -0
  225. package/source/directives/vary/Vary.ts +48 -0
  226. package/source/directives/vary/embeddings/Embedding.ts +6 -0
  227. package/source/directives/vary/embeddings/Header.ts +32 -0
  228. package/source/directives/vary/embeddings/Language.ts +31 -0
  229. package/source/directives/vary/embeddings/index.ts +11 -0
  230. package/source/directives/vary/index.ts +3 -0
  231. package/source/exceptions.ts +13 -9
  232. package/source/io.ts +4 -0
  233. package/source/manifest.test.ts +6 -14
  234. package/source/manifest.ts +9 -6
  235. package/source/root.ts +5 -0
  236. package/source/schemas.ts +7 -3
  237. package/transpiled/Annotation.d.ts +8 -0
  238. package/transpiled/Annotation.js +3 -0
  239. package/transpiled/Annotation.js.map +1 -0
  240. package/transpiled/Branch.d.ts +7 -0
  241. package/transpiled/Branch.js +3 -0
  242. package/transpiled/Branch.js.map +1 -0
  243. package/transpiled/Composition.d.ts +14 -0
  244. package/transpiled/Composition.js +43 -0
  245. package/transpiled/Composition.js.map +1 -0
  246. package/transpiled/Context.d.ts +7 -0
  247. package/transpiled/Context.js +3 -0
  248. package/transpiled/Context.js.map +1 -0
  249. package/transpiled/Directive.d.ts +18 -0
  250. package/transpiled/Directive.js +75 -0
  251. package/transpiled/Directive.js.map +1 -0
  252. package/transpiled/Endpoint.d.ts +22 -0
  253. package/transpiled/Endpoint.js +101 -0
  254. package/transpiled/Endpoint.js.map +1 -0
  255. package/transpiled/Factory.d.ts +9 -0
  256. package/transpiled/Factory.js +73 -0
  257. package/transpiled/Factory.js.map +1 -0
  258. package/transpiled/Gateway.d.ts +18 -0
  259. package/transpiled/Gateway.js +92 -0
  260. package/transpiled/Gateway.js.map +1 -0
  261. package/transpiled/HTTP/Context.d.ts +24 -0
  262. package/transpiled/HTTP/Context.js +47 -0
  263. package/transpiled/HTTP/Context.js.map +1 -0
  264. package/transpiled/HTTP/Server.d.ts +25 -0
  265. package/transpiled/HTTP/Server.js +141 -0
  266. package/transpiled/HTTP/Server.js.map +1 -0
  267. package/transpiled/HTTP/Timing.d.ts +10 -0
  268. package/transpiled/HTTP/Timing.js +29 -0
  269. package/transpiled/HTTP/Timing.js.map +1 -0
  270. package/transpiled/HTTP/exceptions.d.ts +34 -0
  271. package/transpiled/HTTP/exceptions.js +71 -0
  272. package/transpiled/HTTP/exceptions.js.map +1 -0
  273. package/transpiled/HTTP/formats/index.d.ts +10 -0
  274. package/transpiled/HTTP/formats/index.js +38 -0
  275. package/transpiled/HTTP/formats/index.js.map +1 -0
  276. package/transpiled/HTTP/formats/json.d.ts +6 -0
  277. package/transpiled/HTTP/formats/json.js +17 -0
  278. package/transpiled/HTTP/formats/json.js.map +1 -0
  279. package/transpiled/HTTP/formats/msgpack.d.ts +6 -0
  280. package/transpiled/HTTP/formats/msgpack.js +17 -0
  281. package/transpiled/HTTP/formats/msgpack.js.map +1 -0
  282. package/transpiled/HTTP/formats/text.d.ts +8 -0
  283. package/transpiled/HTTP/formats/text.js +15 -0
  284. package/transpiled/HTTP/formats/text.js.map +1 -0
  285. package/transpiled/HTTP/formats/yaml.d.ts +6 -0
  286. package/transpiled/HTTP/formats/yaml.js +41 -0
  287. package/transpiled/HTTP/formats/yaml.js.map +1 -0
  288. package/transpiled/HTTP/index.d.ts +4 -0
  289. package/transpiled/HTTP/index.js +21 -0
  290. package/transpiled/HTTP/index.js.map +1 -0
  291. package/transpiled/HTTP/messages.d.ts +19 -0
  292. package/transpiled/HTTP/messages.js +73 -0
  293. package/transpiled/HTTP/messages.js.map +1 -0
  294. package/transpiled/Interception.d.ts +9 -0
  295. package/transpiled/Interception.js +19 -0
  296. package/transpiled/Interception.js.map +1 -0
  297. package/transpiled/Mapping.d.ts +8 -0
  298. package/transpiled/Mapping.js +38 -0
  299. package/transpiled/Mapping.js.map +1 -0
  300. package/transpiled/Query.d.ts +13 -0
  301. package/transpiled/Query.js +107 -0
  302. package/transpiled/Query.js.map +1 -0
  303. package/transpiled/RTD/Context.d.ts +12 -0
  304. package/transpiled/RTD/Context.js +3 -0
  305. package/transpiled/RTD/Context.js.map +1 -0
  306. package/transpiled/RTD/Directives.d.ts +22 -0
  307. package/transpiled/RTD/Directives.js +3 -0
  308. package/transpiled/RTD/Directives.js.map +1 -0
  309. package/transpiled/RTD/Endpoint.d.ts +11 -0
  310. package/transpiled/RTD/Endpoint.js +3 -0
  311. package/transpiled/RTD/Endpoint.js.map +1 -0
  312. package/transpiled/RTD/Match.d.ts +9 -0
  313. package/transpiled/RTD/Match.js +3 -0
  314. package/transpiled/RTD/Match.js.map +1 -0
  315. package/transpiled/RTD/Method.d.ts +9 -0
  316. package/transpiled/RTD/Method.js +16 -0
  317. package/transpiled/RTD/Method.js.map +1 -0
  318. package/transpiled/RTD/Node.d.ts +19 -0
  319. package/transpiled/RTD/Node.js +62 -0
  320. package/transpiled/RTD/Node.js.map +1 -0
  321. package/transpiled/RTD/Route.d.ts +14 -0
  322. package/transpiled/RTD/Route.js +49 -0
  323. package/transpiled/RTD/Route.js.map +1 -0
  324. package/transpiled/RTD/Tree.d.ts +14 -0
  325. package/transpiled/RTD/Tree.js +45 -0
  326. package/transpiled/RTD/Tree.js.map +1 -0
  327. package/transpiled/RTD/factory.d.ts +4 -0
  328. package/transpiled/RTD/factory.js +36 -0
  329. package/transpiled/RTD/factory.js.map +1 -0
  330. package/transpiled/RTD/index.d.ts +8 -0
  331. package/transpiled/RTD/index.js +38 -0
  332. package/transpiled/RTD/index.js.map +1 -0
  333. package/transpiled/RTD/segment.d.ts +8 -0
  334. package/transpiled/RTD/segment.js +25 -0
  335. package/transpiled/RTD/segment.js.map +1 -0
  336. package/transpiled/RTD/syntax/index.d.ts +2 -0
  337. package/transpiled/RTD/syntax/index.js +19 -0
  338. package/transpiled/RTD/syntax/index.js.map +1 -0
  339. package/transpiled/RTD/syntax/parse.d.ts +4 -0
  340. package/transpiled/RTD/syntax/parse.js +128 -0
  341. package/transpiled/RTD/syntax/parse.js.map +1 -0
  342. package/transpiled/RTD/syntax/types.d.ts +41 -0
  343. package/transpiled/RTD/syntax/types.js +5 -0
  344. package/transpiled/RTD/syntax/types.js.map +1 -0
  345. package/transpiled/Remotes.d.ts +9 -0
  346. package/transpiled/Remotes.js +25 -0
  347. package/transpiled/Remotes.js.map +1 -0
  348. package/transpiled/Tenant.d.ts +13 -0
  349. package/transpiled/Tenant.js +34 -0
  350. package/transpiled/Tenant.js.map +1 -0
  351. package/transpiled/deployment.d.ts +3 -0
  352. package/transpiled/deployment.js +71 -0
  353. package/transpiled/deployment.js.map +1 -0
  354. package/transpiled/directives/auth/Anonymous.d.ts +6 -0
  355. package/transpiled/directives/auth/Anonymous.js +16 -0
  356. package/transpiled/directives/auth/Anonymous.js.map +1 -0
  357. package/transpiled/directives/auth/Authorization.d.ts +19 -0
  358. package/transpiled/directives/auth/Authorization.js +127 -0
  359. package/transpiled/directives/auth/Authorization.js.map +1 -0
  360. package/transpiled/directives/auth/Delegate.d.ts +8 -0
  361. package/transpiled/directives/auth/Delegate.js +27 -0
  362. package/transpiled/directives/auth/Delegate.js.map +1 -0
  363. package/transpiled/directives/auth/Echo.d.ts +6 -0
  364. package/transpiled/directives/auth/Echo.js +13 -0
  365. package/transpiled/directives/auth/Echo.js.map +1 -0
  366. package/transpiled/directives/auth/Id.d.ts +7 -0
  367. package/transpiled/directives/auth/Id.js +17 -0
  368. package/transpiled/directives/auth/Id.js.map +1 -0
  369. package/transpiled/directives/auth/Incept.d.ts +10 -0
  370. package/transpiled/directives/auth/Incept.js +63 -0
  371. package/transpiled/directives/auth/Incept.js.map +1 -0
  372. package/transpiled/directives/auth/Role.d.ts +11 -0
  373. package/transpiled/directives/auth/Role.js +46 -0
  374. package/transpiled/directives/auth/Role.js.map +1 -0
  375. package/transpiled/directives/auth/Rule.d.ts +9 -0
  376. package/transpiled/directives/auth/Rule.js +22 -0
  377. package/transpiled/directives/auth/Rule.js.map +1 -0
  378. package/transpiled/directives/auth/Scheme.d.ts +7 -0
  379. package/transpiled/directives/auth/Scheme.js +47 -0
  380. package/transpiled/directives/auth/Scheme.js.map +1 -0
  381. package/transpiled/directives/auth/index.d.ts +2 -0
  382. package/transpiled/directives/auth/index.js +6 -0
  383. package/transpiled/directives/auth/index.js.map +1 -0
  384. package/transpiled/directives/auth/schemes.d.ts +3 -0
  385. package/transpiled/directives/auth/schemes.js +10 -0
  386. package/transpiled/directives/auth/schemes.js.map +1 -0
  387. package/transpiled/directives/auth/split.d.ts +2 -0
  388. package/transpiled/directives/auth/split.js +38 -0
  389. package/transpiled/directives/auth/split.js.map +1 -0
  390. package/transpiled/directives/auth/types.d.ts +31 -0
  391. package/transpiled/directives/auth/types.js +3 -0
  392. package/transpiled/directives/auth/types.js.map +1 -0
  393. package/transpiled/directives/cache/Cache.d.ts +11 -0
  394. package/transpiled/directives/cache/Cache.js +28 -0
  395. package/transpiled/directives/cache/Cache.js.map +1 -0
  396. package/transpiled/directives/cache/Control.d.ts +9 -0
  397. package/transpiled/directives/cache/Control.js +42 -0
  398. package/transpiled/directives/cache/Control.js.map +1 -0
  399. package/transpiled/directives/cache/Exact.d.ts +4 -0
  400. package/transpiled/directives/cache/Exact.js +11 -0
  401. package/transpiled/directives/cache/Exact.js.map +1 -0
  402. package/transpiled/directives/cache/index.d.ts +2 -0
  403. package/transpiled/directives/cache/index.js +6 -0
  404. package/transpiled/directives/cache/index.js.map +1 -0
  405. package/transpiled/directives/cache/types.d.ts +7 -0
  406. package/transpiled/directives/cache/types.js +3 -0
  407. package/transpiled/directives/cache/types.js.map +1 -0
  408. package/transpiled/directives/cors/CORS.d.ts +10 -0
  409. package/transpiled/directives/cors/CORS.js +51 -0
  410. package/transpiled/directives/cors/CORS.js.map +1 -0
  411. package/transpiled/directives/cors/index.d.ts +2 -0
  412. package/transpiled/directives/cors/index.js +6 -0
  413. package/transpiled/directives/cors/index.js.map +1 -0
  414. package/transpiled/directives/dev/Development.d.ts +9 -0
  415. package/transpiled/directives/dev/Development.js +29 -0
  416. package/transpiled/directives/dev/Development.js.map +1 -0
  417. package/transpiled/directives/dev/Stub.d.ts +7 -0
  418. package/transpiled/directives/dev/Stub.js +14 -0
  419. package/transpiled/directives/dev/Stub.js.map +1 -0
  420. package/transpiled/directives/dev/Throw.d.ts +7 -0
  421. package/transpiled/directives/dev/Throw.js +14 -0
  422. package/transpiled/directives/dev/Throw.js.map +1 -0
  423. package/transpiled/directives/dev/index.d.ts +2 -0
  424. package/transpiled/directives/dev/index.js +6 -0
  425. package/transpiled/directives/dev/index.js.map +1 -0
  426. package/transpiled/directives/dev/types.d.ts +4 -0
  427. package/transpiled/directives/dev/types.js +3 -0
  428. package/transpiled/directives/dev/types.js.map +1 -0
  429. package/transpiled/directives/index.d.ts +4 -0
  430. package/transpiled/directives/index.js +13 -0
  431. package/transpiled/directives/index.js.map +1 -0
  432. package/transpiled/directives/io/Directive.d.ts +8 -0
  433. package/transpiled/directives/io/Directive.js +3 -0
  434. package/transpiled/directives/io/Directive.js.map +1 -0
  435. package/transpiled/directives/io/IO.d.ts +9 -0
  436. package/transpiled/directives/io/IO.js +33 -0
  437. package/transpiled/directives/io/IO.js.map +1 -0
  438. package/transpiled/directives/io/Input.d.ts +11 -0
  439. package/transpiled/directives/io/Input.js +63 -0
  440. package/transpiled/directives/io/Input.js.map +1 -0
  441. package/transpiled/directives/io/Message.d.ts +1 -0
  442. package/transpiled/directives/io/Message.js +3 -0
  443. package/transpiled/directives/io/Message.js.map +1 -0
  444. package/transpiled/directives/io/Output.d.ts +13 -0
  445. package/transpiled/directives/io/Output.js +76 -0
  446. package/transpiled/directives/io/Output.js.map +1 -0
  447. package/transpiled/directives/io/index.d.ts +2 -0
  448. package/transpiled/directives/io/index.js +6 -0
  449. package/transpiled/directives/io/index.js.map +1 -0
  450. package/transpiled/directives/io/schemas.d.ts +7 -0
  451. package/transpiled/directives/io/schemas.js +14 -0
  452. package/transpiled/directives/io/schemas.js.map +1 -0
  453. package/transpiled/directives/octets/Context.d.ts +8 -0
  454. package/transpiled/directives/octets/Context.js +42 -0
  455. package/transpiled/directives/octets/Context.js.map +1 -0
  456. package/transpiled/directives/octets/Delete.d.ts +20 -0
  457. package/transpiled/directives/octets/Delete.js +84 -0
  458. package/transpiled/directives/octets/Delete.js.map +1 -0
  459. package/transpiled/directives/octets/Directive.d.ts +8 -0
  460. package/transpiled/directives/octets/Directive.js +8 -0
  461. package/transpiled/directives/octets/Directive.js.map +1 -0
  462. package/transpiled/directives/octets/Fetch.d.ts +18 -0
  463. package/transpiled/directives/octets/Fetch.js +92 -0
  464. package/transpiled/directives/octets/Fetch.js.map +1 -0
  465. package/transpiled/directives/octets/List.d.ts +16 -0
  466. package/transpiled/directives/octets/List.js +74 -0
  467. package/transpiled/directives/octets/List.js.map +1 -0
  468. package/transpiled/directives/octets/Octets.d.ts +12 -0
  469. package/transpiled/directives/octets/Octets.js +55 -0
  470. package/transpiled/directives/octets/Octets.js.map +1 -0
  471. package/transpiled/directives/octets/Permute.d.ts +11 -0
  472. package/transpiled/directives/octets/Permute.js +58 -0
  473. package/transpiled/directives/octets/Permute.js.map +1 -0
  474. package/transpiled/directives/octets/Store.d.ts +24 -0
  475. package/transpiled/directives/octets/Store.js +95 -0
  476. package/transpiled/directives/octets/Store.js.map +1 -0
  477. package/transpiled/directives/octets/Workflow.d.ts +15 -0
  478. package/transpiled/directives/octets/Workflow.js +59 -0
  479. package/transpiled/directives/octets/Workflow.js.map +1 -0
  480. package/transpiled/directives/octets/index.d.ts +2 -0
  481. package/transpiled/directives/octets/index.js +6 -0
  482. package/transpiled/directives/octets/index.js.map +1 -0
  483. package/transpiled/directives/octets/schemas.d.ts +13 -0
  484. package/transpiled/directives/octets/schemas.js +18 -0
  485. package/transpiled/directives/octets/schemas.js.map +1 -0
  486. package/transpiled/directives/octets/types.d.ts +5 -0
  487. package/transpiled/directives/octets/types.js +3 -0
  488. package/transpiled/directives/octets/types.js.map +1 -0
  489. package/transpiled/directives/octets/workflows/Execution.d.ts +25 -0
  490. package/transpiled/directives/octets/workflows/Execution.js +54 -0
  491. package/transpiled/directives/octets/workflows/Execution.js.map +1 -0
  492. package/transpiled/directives/octets/workflows/Workflow.d.ts +12 -0
  493. package/transpiled/directives/octets/workflows/Workflow.js +25 -0
  494. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -0
  495. package/transpiled/directives/octets/workflows/index.d.ts +1 -0
  496. package/transpiled/directives/octets/workflows/index.js +6 -0
  497. package/transpiled/directives/octets/workflows/index.js.map +1 -0
  498. package/transpiled/directives/vary/Directive.d.ts +5 -0
  499. package/transpiled/directives/vary/Directive.js +3 -0
  500. package/transpiled/directives/vary/Directive.js.map +1 -0
  501. package/transpiled/directives/vary/Embed.d.ts +10 -0
  502. package/transpiled/directives/vary/Embed.js +49 -0
  503. package/transpiled/directives/vary/Embed.js.map +1 -0
  504. package/transpiled/directives/vary/Properties.d.ts +9 -0
  505. package/transpiled/directives/vary/Properties.js +16 -0
  506. package/transpiled/directives/vary/Properties.js.map +1 -0
  507. package/transpiled/directives/vary/Vary.d.ts +10 -0
  508. package/transpiled/directives/vary/Vary.js +36 -0
  509. package/transpiled/directives/vary/Vary.js.map +1 -0
  510. package/transpiled/directives/vary/embeddings/Embedding.d.ts +5 -0
  511. package/transpiled/directives/vary/embeddings/Embedding.js +3 -0
  512. package/transpiled/directives/vary/embeddings/Embedding.js.map +1 -0
  513. package/transpiled/directives/vary/embeddings/Header.d.ts +7 -0
  514. package/transpiled/directives/vary/embeddings/Header.js +28 -0
  515. package/transpiled/directives/vary/embeddings/Header.js.map +1 -0
  516. package/transpiled/directives/vary/embeddings/Language.d.ts +7 -0
  517. package/transpiled/directives/vary/embeddings/Language.js +28 -0
  518. package/transpiled/directives/vary/embeddings/Language.js.map +1 -0
  519. package/transpiled/directives/vary/embeddings/index.d.ts +5 -0
  520. package/transpiled/directives/vary/embeddings/index.js +10 -0
  521. package/transpiled/directives/vary/embeddings/index.js.map +1 -0
  522. package/transpiled/directives/vary/index.d.ts +2 -0
  523. package/transpiled/directives/vary/index.js +6 -0
  524. package/transpiled/directives/vary/index.js.map +1 -0
  525. package/transpiled/discovery.d.ts +1 -0
  526. package/transpiled/discovery.js +3 -0
  527. package/transpiled/discovery.js.map +1 -0
  528. package/transpiled/exceptions.d.ts +2 -0
  529. package/transpiled/exceptions.js +39 -0
  530. package/transpiled/exceptions.js.map +1 -0
  531. package/transpiled/index.d.ts +5 -0
  532. package/transpiled/index.js +12 -0
  533. package/transpiled/index.js.map +1 -0
  534. package/transpiled/io.d.ts +3 -0
  535. package/transpiled/io.js +3 -0
  536. package/transpiled/io.js.map +1 -0
  537. package/transpiled/manifest.d.ts +3 -0
  538. package/transpiled/manifest.js +66 -0
  539. package/transpiled/manifest.js.map +1 -0
  540. package/transpiled/root.d.ts +2 -0
  541. package/transpiled/root.js +44 -0
  542. package/transpiled/root.js.map +1 -0
  543. package/transpiled/schemas.d.ts +7 -0
  544. package/transpiled/schemas.js +14 -0
  545. package/transpiled/schemas.js.map +1 -0
  546. package/transpiled/tsconfig.tsbuildinfo +1 -0
  547. package/source/HTTP/Server.fixtures.ts +0 -41
@@ -0,0 +1,50 @@
1
+ import { BadRequest } from '../../HTTP'
2
+ import * as schemas from './schemas'
3
+ import type { Message } from './Message'
4
+ import type { Directive } from './Directive'
5
+ import type { Input as Context } from '../../io'
6
+
7
+ export class Input implements Directive {
8
+ private readonly permissions: Permissions
9
+
10
+ public constructor (permissions: Permissions) {
11
+ this.permissions = permissions
12
+ }
13
+
14
+ public static validate (permissions: unknown): asserts permissions is Permissions {
15
+ schemas.input.validate(permissions, 'Incorrect \'io:input\' format')
16
+ }
17
+
18
+ public attach (context: Context): void {
19
+ context.pipelines.body.push((body) => this.check(body))
20
+ }
21
+
22
+ private check (body: unknown): unknown {
23
+ try {
24
+ schemas.message.validate(body)
25
+ } catch {
26
+ throw new BadRequest('Invalid request body.')
27
+ }
28
+
29
+ const property = this.violation(body)
30
+
31
+ if (property !== undefined)
32
+ throw new BadRequest(`Unexpected input: ${property}.`)
33
+
34
+ return body
35
+ }
36
+
37
+ private violation (value: Message | Message[]): string | undefined {
38
+ if (!Array.isArray(value))
39
+ return Object.keys(value).find((key) => !this.permissions.includes(key))
40
+
41
+ for (const item of value) {
42
+ const property = this.violation(item)
43
+
44
+ if (property !== undefined)
45
+ return property
46
+ }
47
+ }
48
+ }
49
+
50
+ export type Permissions = string[]
@@ -0,0 +1 @@
1
+ export type Message = Record<string, unknown>
@@ -0,0 +1,69 @@
1
+ import { Stream } from 'node:stream'
2
+ import * as schemas from './schemas'
3
+ import type { Message } from './Message'
4
+ import type { Directive } from './Directive'
5
+ import type { Input as Context } from '../../io'
6
+ import type { OutgoingMessage } from '../../HTTP'
7
+
8
+ export class Output implements Directive {
9
+ private readonly disabled: boolean = false
10
+ private readonly omitted: boolean = true
11
+ private readonly permissions: string[] = []
12
+
13
+ public constructor (permissions: Permissions) {
14
+ if (typeof permissions === 'boolean')
15
+ if (permissions)
16
+ this.disabled = true
17
+ else
18
+ this.omitted = false
19
+
20
+ else
21
+ this.permissions = permissions
22
+ }
23
+
24
+ public static validate (permissions: unknown): asserts permissions is Permissions {
25
+ schemas.output.validate(permissions, 'Incorrect \'io:output\' format')
26
+ }
27
+
28
+ public attach (context: Context): void {
29
+ context.pipelines.response.push(this.restriction(context))
30
+ }
31
+
32
+ private restriction (context: Context) {
33
+ return (message: OutgoingMessage): void => {
34
+ const error = message.status !== undefined && message.status >= 300
35
+ const stream = message.body instanceof Stream
36
+ const none = message.body === undefined || message.body === null
37
+
38
+ if (this.disabled || error || stream || none)
39
+ return
40
+
41
+ if (typeof message.body !== 'object' || this.permissions.length === 0) {
42
+ if (this.omitted)
43
+ console.warn('Permissions for \'io:output\' are not specified properly ' +
44
+ `(${context.request.url}). Response omitted.`)
45
+
46
+ delete message.body
47
+
48
+ return
49
+ }
50
+
51
+ schemas.message.validate(message.body,
52
+ '\'io:output\' expects response to be an object or array of objects')
53
+
54
+ if (Array.isArray(message.body))
55
+ message.body = message.body.map((entity) => this.fit(entity))
56
+ else
57
+ message.body = this.fit(message.body)
58
+ }
59
+ }
60
+
61
+ private fit (message: Message): Message | undefined {
62
+ const entries = Object.entries(message)
63
+ .filter(([key]) => this.permissions.includes(key))
64
+
65
+ return Object.fromEntries(entries)
66
+ }
67
+ }
68
+
69
+ export type Permissions = string[] | boolean
@@ -0,0 +1,3 @@
1
+ import { IO } from './IO'
2
+
3
+ export const io = new IO()
@@ -0,0 +1,12 @@
1
+ import { resolve } from 'node:path'
2
+ import schemas, { type Schema } from '@toa.io/schemas'
3
+ import type { Permissions as InputPermissions } from './Input'
4
+ import type { Permissions as OutputPermissions } from './Output'
5
+ import type { Message } from './Message'
6
+
7
+ const path = resolve(__dirname, '../../../schemas/io')
8
+ const namespace = schemas.namespace(path)
9
+
10
+ export const message: Schema<Message | Message[]> = namespace.schema('message')
11
+ export const input: Schema<InputPermissions> = namespace.schema('input')
12
+ export const output: Schema<OutputPermissions> = namespace.schema('output')
@@ -1,18 +1,19 @@
1
1
  import * as schemas from './schemas'
2
- import type { Output } from '../../Directive'
3
- import type { Directive } from './types'
2
+ import { Directive } from './Directive'
3
+ import type { Output } from '../../io'
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
- public constructor (value: any) {
9
+ public constructor (value: unknown) {
10
+ super()
10
11
  schemas.context.validate(value)
11
12
 
12
13
  this.storage = value
13
14
  }
14
15
 
15
- public apply (): Output {
16
+ public async apply (): Promise<Output> {
16
17
  return null
17
18
  }
18
19
  }
@@ -1,32 +1,85 @@
1
+ import { Readable } from 'stream'
1
2
  import { NotFound } from '../../HTTP'
2
3
  import * as schemas from './schemas'
4
+ import { Workflow } from './workflows'
5
+ import { Directive } from './Directive'
6
+ import type { Parameter } from '../../RTD'
7
+ import type { Unit } from './workflows'
3
8
  import type { Maybe } from '@toa.io/types'
4
9
  import type { Component } from '@toa.io/core'
5
- import type { Output } from '../../Directive'
10
+ import type { Output } from '../../io'
11
+ import type { Input } from './types'
12
+ import type { Remotes } from '../../Remotes'
13
+ import type { Entry } from '@toa.io/extensions.storages'
6
14
 
7
- import type { Directive, Input } from './types'
8
-
9
- export class Delete implements Directive {
15
+ export class Delete extends Directive {
10
16
  public readonly targeted = true
11
17
 
18
+ private readonly workflow?: Workflow
12
19
  private readonly discovery: Promise<Component>
13
20
  private storage: Component | null = null
14
21
 
15
- public constructor (value: null, discovery: Promise<Component>) {
16
- schemas.remove.validate(value)
22
+ public constructor (options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
23
+ super()
24
+ schemas.remove.validate(options)
25
+
26
+ if (options?.workflow !== undefined)
27
+ this.workflow = new Workflow(options.workflow, remotes)
17
28
 
18
29
  this.discovery = discovery
19
30
  }
20
31
 
21
- public async apply (storage: string, request: Input): Promise<Output> {
32
+ public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
22
33
  this.storage ??= await this.discovery
23
34
 
24
- const input = { storage, path: request.path }
25
- const error = await this.storage.invoke<Maybe<unknown>>('delete', { input })
35
+ const entry = await this.storage.invoke<Maybe<Entry>>('get',
36
+ {
37
+ input: {
38
+ storage,
39
+ path: input.request.url
40
+ }
41
+ })
26
42
 
27
- if (error instanceof Error)
43
+ if (entry instanceof Error)
28
44
  throw new NotFound()
29
45
 
30
- return {}
46
+ const output: Output = {}
47
+
48
+ if (this.workflow !== undefined) {
49
+ output.status = 202
50
+ output.body = Readable.from(this.execute(input, storage, entry, parameters))
51
+ } else
52
+ await this.delete(storage, input)
53
+
54
+ return output
55
+ }
56
+
57
+ private async delete (storage: string, input: Input): Promise<void> {
58
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
59
+ await this.storage!.invoke('delete',
60
+ {
61
+ input: {
62
+ storage,
63
+ path: input.request.url
64
+ }
65
+ })
31
66
  }
67
+
68
+ // eslint-disable-next-line max-params
69
+ private async * execute
70
+ (input: Input, storage: string, entry: Entry, parameters: Parameter[]): AsyncGenerator {
71
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
72
+ for await (const chunk of this.workflow!.execute(input, storage, entry, parameters)) {
73
+ yield chunk
74
+
75
+ if (typeof chunk === 'object' && chunk !== null && 'error' in chunk)
76
+ return
77
+ }
78
+
79
+ await this.delete(storage, input)
80
+ }
81
+ }
82
+
83
+ export interface Options {
84
+ workflow?: Unit[] | Unit
32
85
  }
@@ -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,49 +1,61 @@
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 { Maybe } from '@toa.io/types'
5
6
  import type { Entry } from '@toa.io/extensions.storages'
6
7
  import type { Readable } from 'node:stream'
7
8
  import type { Component } from '@toa.io/core'
8
- import type { Output } from '../../Directive'
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: Permissions = { blob: true, meta: false }
15
+ private readonly permissions: Required<Permissions> = {
16
+ blob: true,
17
+ meta: false
18
+ }
19
+
16
20
  private readonly discovery: Promise<Component>
17
21
  private storage: Component = null as unknown as Component
18
22
 
19
- public constructor (permissions: Partial<Permissions> | null, discovery: Promise<Component>) {
23
+ public constructor (permissions: Permissions | null, discovery: Promise<Component>) {
24
+ super()
20
25
  schemas.fetch.validate(permissions)
21
26
 
22
27
  Object.assign(this.permissions, permissions)
23
28
  this.discovery = discovery
24
29
  }
25
30
 
26
- public async apply (storage: string, request: Input): Promise<Output> {
31
+ public async apply (storage: string, input: Input): Promise<Output> {
27
32
  this.storage ??= await this.discovery
28
33
 
29
- if (request.url.slice(-5) === ':meta')
30
- return await this.get(storage, request)
31
- else
32
- return await this.fetch(storage, request)
33
- }
34
+ const variant = posix.basename(input.request.url).includes('.')
35
+ const metadata = input.subtype === 'octets.entry'
34
36
 
35
- private async fetch (storage: string, request: Input): Promise<Output> {
36
- const filename = posix.basename(request.url)
37
- const variant = filename.includes('.')
37
+ if (!variant && metadata)
38
+ if (this.permissions.meta)
39
+ return this.get(storage, input)
40
+ else
41
+ throw new Forbidden('Metadata is not accessible.')
38
42
 
39
43
  if (!variant && !this.permissions.blob)
40
44
  throw new Forbidden('BLOB variant must be specified.')
41
45
 
42
- if ('if-none-match' in request.headers)
46
+ return await this.fetch(storage, input)
47
+ }
48
+
49
+ private async fetch (storage: string, input: Input): Promise<Output> {
50
+ if ('if-none-match' in input.request.headers)
43
51
  return { status: 304 }
44
52
 
45
- const input = { storage, path: request.url }
46
- const result = await this.storage.invoke<Maybe<FetchResult>>('fetch', { input })
53
+ const result = await this.storage.invoke<Maybe<FetchResult>>('fetch', {
54
+ input: {
55
+ storage,
56
+ path: input.request.url
57
+ }
58
+ })
47
59
 
48
60
  if (result instanceof Error)
49
61
  throw new NotFound()
@@ -54,16 +66,19 @@ export class Fetch implements Directive {
54
66
  etag: result.checksum
55
67
  })
56
68
 
57
- return { headers, body: result.stream }
69
+ return {
70
+ headers,
71
+ body: result.stream
72
+ }
58
73
  }
59
74
 
60
- private async get (storage: string, request: Input): Promise<Output> {
61
- if (!this.permissions.meta)
62
- throw new Forbidden('Metadata is not accessible.')
63
-
64
- const path = request.url.slice(0, -5)
65
- const input = { storage, path }
66
- const entry = await this.storage.invoke<Maybe<Entry>>('get', { input })
75
+ private async get (storage: string, input: Input): Promise<Output> {
76
+ const entry = await this.storage.invoke<Maybe<Entry>>('get', {
77
+ input: {
78
+ storage,
79
+ path: input.request.url
80
+ }
81
+ })
67
82
 
68
83
  if (entry instanceof Error)
69
84
  throw new NotFound()
@@ -72,9 +87,9 @@ export class Fetch implements Directive {
72
87
  }
73
88
  }
74
89
 
75
- interface Permissions {
76
- blob: boolean
77
- meta: boolean
90
+ export interface Permissions {
91
+ blob?: boolean
92
+ meta?: boolean
78
93
  }
79
94
 
80
95
  interface FetchResult {
@@ -1,32 +1,72 @@
1
- import { NotFound } from '../../HTTP'
1
+ import { posix } from 'node:path'
2
+ import { Forbidden, NotFound } from '../../HTTP'
2
3
  import * as schemas from './schemas'
4
+ import { Directive } from './Directive'
5
+ import type { Entry } from '@toa.io/extensions.storages'
3
6
  import type { Maybe } from '@toa.io/types'
4
7
  import type { Component } from '@toa.io/core'
5
- import type { Output } from '../../Directive'
8
+ import type { Output } from '../../io'
6
9
 
7
- import type { Directive, Input } from './types'
10
+ import type { Input } from './types'
8
11
 
9
- export class List implements Directive {
12
+ export class List extends Directive {
10
13
  public readonly targeted = false
11
14
 
15
+ private readonly permissions: Required<Permissions> = { meta: false }
12
16
  private readonly discovery: Promise<Component>
13
17
  private storage: Component | null = null
14
18
 
15
- public constructor (value: null, discovery: Promise<Component>) {
16
- schemas.remove.validate(value)
19
+ public constructor (permissions: Permissions | null, discovery: Promise<Component>) {
20
+ super()
21
+ schemas.list.validate(permissions)
17
22
 
23
+ Object.assign(this.permissions, permissions)
18
24
  this.discovery = discovery
19
25
  }
20
26
 
21
- public async apply (storage: string, request: Input): Promise<Output> {
27
+ public async apply (storage: string, input: Input): Promise<Output> {
22
28
  this.storage ??= await this.discovery
23
29
 
24
- const input = { storage, path: request.path }
25
- const list = await this.storage.invoke<Maybe<unknown>>('list', { input })
30
+ const metadata = input.subtype === 'octets.entries'
31
+
32
+ if (metadata && !this.permissions.meta)
33
+ throw new Forbidden('Metadata is not accessible.')
34
+
35
+ const list = await this.storage.invoke<Maybe<string[]>>('list', {
36
+ input: {
37
+ storage,
38
+ path: input.request.url
39
+ }
40
+ })
26
41
 
27
42
  if (list instanceof Error)
28
43
  throw new NotFound()
29
44
 
30
- return { body: list }
45
+ const body = metadata
46
+ ? await this.expand(storage, input.request.url, list)
47
+ : list
48
+
49
+ return { body }
50
+ }
51
+
52
+ private async expand (storage: string, prefix: string, list: string[]):
53
+ Promise<Array<Maybe<Entry>>> {
54
+ const promises = list.map(async (id) => {
55
+ const path = posix.join(prefix, id)
56
+
57
+ const input = {
58
+ storage,
59
+ path
60
+ }
61
+
62
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- ensured in `apply`
63
+ return this.storage!.invoke<Maybe<Entry>>('get', { input })
64
+ })
65
+
66
+ return await Promise.all(promises)
31
67
  }
32
68
  }
69
+
70
+ export interface Permissions {
71
+ meta?: boolean
72
+ }
@@ -5,12 +5,15 @@ import { Fetch } from './Fetch'
5
5
  import { List } from './List'
6
6
  import { Delete } from './Delete'
7
7
  import { Permute } from './Permute'
8
+ import { WorkflowDirective } from './Workflow'
9
+ import type { Directive } from './Directive'
10
+ import type { Output } from '../../io'
8
11
  import type { Component } from '@toa.io/core'
9
12
  import type { Remotes } from '../../Remotes'
10
- import type { Output, Family } from '../../Directive'
11
- import type { Directive, Input } from './types'
13
+ import type { Parameter, DirectiveFamily } from '../../RTD'
14
+ import type { Input } from './types'
12
15
 
13
- class Octets implements Family<Directive> {
16
+ export class Octets implements DirectiveFamily<Directive> {
14
17
  public readonly name: string = 'octets'
15
18
  public readonly mandatory: boolean = false
16
19
 
@@ -27,7 +30,8 @@ class Octets implements Family<Directive> {
27
30
  return new Class(value, this.discovery, remotes)
28
31
  }
29
32
 
30
- public async preflight (directives: Directive[], input: Input): Promise<Output> {
33
+ public async preflight
34
+ (directives: Directive[], input: Input, parameters: Parameter[]): Promise<Output> {
31
35
  let context: Context | null = null
32
36
  let action: Directive | null = null
33
37
 
@@ -42,15 +46,17 @@ class Octets implements Family<Directive> {
42
46
  if (action === null)
43
47
  return null
44
48
 
49
+ // noinspection PointlessBooleanExpressionJS
45
50
  if (context === null)
46
51
  throw new Error('Octets context is not defined.')
47
52
 
48
- const targeted = input.path[input.path.length - 1] !== '/'
53
+ const targeted = input.request.url[input.request.url.length - 1] !== '/'
49
54
 
50
55
  if (targeted !== action.targeted)
51
56
  throw new NotFound(`Trailing slash is ${action.targeted ? 'redundant' : 'required'}.`)
52
57
 
53
- return await action.apply(context.storage, input)
58
+ // noinspection JSObjectNullOrUndefined
59
+ return await input.timing.capture(action.name, action.apply(context.storage, input, parameters))
54
60
  }
55
61
  }
56
62
 
@@ -60,9 +66,8 @@ const DIRECTIVES: Record<string, Constructor> = {
60
66
  fetch: Fetch,
61
67
  list: List,
62
68
  delete: Delete,
63
- permute: Permute
69
+ permute: Permute,
70
+ workflow: WorkflowDirective
64
71
  }
65
72
 
66
73
  type Constructor = new (value: any, discovery: Promise<Component>, remotes: Remotes) => Directive
67
-
68
- export = new Octets()
@@ -1,33 +1,40 @@
1
1
  import { NotAcceptable, NotFound } from '../../HTTP'
2
2
  import * as schemas from './schemas'
3
+ import { Directive } from './Directive'
3
4
  import type { Maybe } from '@toa.io/types'
4
5
  import type { Component } from '@toa.io/core'
5
- import type { Output } from '../../Directive'
6
+ import type { Output } from '../../io'
7
+ import type { Input } from './types'
6
8
 
7
- import type { Directive, Input } from './types'
8
-
9
- export class Permute implements Directive {
9
+ export class Permute extends Directive {
10
10
  public readonly targeted = false
11
11
 
12
12
  private readonly discovery: Promise<Component>
13
13
  private storage: Component | null = null
14
14
 
15
15
  public constructor (value: null, discovery: Promise<Component>) {
16
- schemas.remove.validate(value)
16
+ super()
17
+ schemas.permute.validate(value)
17
18
 
18
19
  this.discovery = discovery
19
20
  }
20
21
 
21
- public async apply (storage: string, request: Input): Promise<Output> {
22
+ public async apply (storage: string, input: Input): Promise<Output> {
22
23
  this.storage ??= await this.discovery
23
24
 
24
- if (request.encoder === null)
25
+ if (input.encoder === null)
25
26
  throw new NotAcceptable()
26
27
 
27
- const path = request.path
28
- const list = await request.parse()
29
- const input = { storage, path, list }
30
- const error = await this.storage.invoke<Maybe<unknown>>('permute', { input })
28
+ const path = input.request.url
29
+ const list = await input.body()
30
+
31
+ const error = await this.storage.invoke<Maybe<unknown>>('permute', {
32
+ input: {
33
+ storage,
34
+ path,
35
+ list
36
+ }
37
+ })
31
38
 
32
39
  if (error instanceof Error)
33
40
  throw new NotFound()