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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) 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 +5 -1
  4. package/components/identity.basic/operations/authenticate.js +1 -2
  5. package/components/identity.basic/operations/authenticate.js.map +1 -1
  6. package/components/identity.basic/operations/transit.js.map +1 -1
  7. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  8. package/components/identity.basic/source/authenticate.ts +0 -1
  9. package/components/identity.federation/events/principal.js +22 -0
  10. package/components/identity.federation/manifest.toa.yaml +94 -0
  11. package/components/identity.federation/operations/authenticate.d.ts +3 -0
  12. package/components/identity.federation/operations/authenticate.js +20 -0
  13. package/components/identity.federation/operations/authenticate.js.map +1 -0
  14. package/components/identity.federation/operations/create.d.ts +10 -0
  15. package/components/identity.federation/operations/create.js +15 -0
  16. package/components/identity.federation/operations/create.js.map +1 -0
  17. package/components/identity.federation/operations/lib/assertions-as-values.d.ts +4 -0
  18. package/components/identity.federation/operations/lib/assertions-as-values.js +45 -0
  19. package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -0
  20. package/components/identity.federation/operations/lib/jwt.d.ts +20 -0
  21. package/components/identity.federation/operations/lib/jwt.js +136 -0
  22. package/components/identity.federation/operations/lib/jwt.js.map +1 -0
  23. package/components/identity.federation/operations/schemas.d.ts +59 -0
  24. package/components/identity.federation/operations/schemas.js +9 -0
  25. package/components/identity.federation/operations/schemas.js.map +1 -0
  26. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -0
  27. package/components/identity.federation/operations/types.d.ts +51 -0
  28. package/components/identity.federation/operations/types.js +3 -0
  29. package/components/identity.federation/operations/types.js.map +1 -0
  30. package/components/identity.federation/source/authenticate.ts +28 -0
  31. package/components/identity.federation/source/create.ts +26 -0
  32. package/components/identity.federation/source/lib/assertions-as-values.ts +19 -0
  33. package/components/identity.federation/source/lib/jwt.test.ts +56 -0
  34. package/components/identity.federation/source/lib/jwt.ts +171 -0
  35. package/components/identity.federation/source/schemas.ts +61 -0
  36. package/components/identity.federation/source/types.ts +56 -0
  37. package/components/identity.federation/tsconfig.json +9 -0
  38. package/components/identity.roles/manifest.toa.yaml +17 -5
  39. package/components/identity.roles/operations/grant.d.ts +10 -0
  40. package/components/identity.roles/operations/grant.js +20 -0
  41. package/components/identity.roles/operations/grant.js.map +1 -0
  42. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  43. package/components/identity.roles/operations/lib/Entity.js +3 -0
  44. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  45. package/components/identity.roles/operations/list.d.ts +1 -4
  46. package/components/identity.roles/operations/list.js.map +1 -1
  47. package/components/identity.roles/operations/principal.d.ts +4 -6
  48. package/components/identity.roles/operations/principal.js +6 -1
  49. package/components/identity.roles/operations/principal.js.map +1 -1
  50. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  51. package/components/identity.roles/source/grant.ts +31 -0
  52. package/components/identity.roles/source/lib/Entity.ts +5 -0
  53. package/components/identity.roles/source/list.ts +2 -4
  54. package/components/identity.roles/source/principal.ts +10 -8
  55. package/components/identity.tokens/manifest.toa.yaml +1 -1
  56. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  57. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  58. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  59. package/components/octets.storage/manifest.toa.yaml +1 -0
  60. package/components/octets.storage/operations/store.js +3 -3
  61. package/cucumber.js +0 -1
  62. package/documentation/access.md +11 -11
  63. package/documentation/components.md +48 -12
  64. package/documentation/identity.md +14 -7
  65. package/documentation/io.md +56 -0
  66. package/documentation/octets.md +102 -37
  67. package/documentation/protocol.md +21 -1
  68. package/documentation/query.md +51 -6
  69. package/documentation/tree.md +22 -4
  70. package/documentation/vary.md +69 -0
  71. package/features/access.feature +13 -2
  72. package/features/annotation.feature +1 -0
  73. package/features/body.feature +3 -1
  74. package/features/cache.feature +3 -0
  75. package/features/cors.feature +72 -0
  76. package/features/directives.feature +2 -0
  77. package/features/dynamic.feature +14 -7
  78. package/features/errors.feature +4 -3
  79. package/features/etag.feature +97 -0
  80. package/features/identity.basic.feature +68 -0
  81. package/features/identity.feature +19 -3
  82. package/features/identity.federation.feature +153 -0
  83. package/features/identity.roles.feature +151 -0
  84. package/features/identity.tokens.feature +3 -0
  85. package/features/io.feature +167 -0
  86. package/features/octets.entries.feature +123 -0
  87. package/features/octets.feature +4 -28
  88. package/features/octets.meta.feature +66 -0
  89. package/features/octets.workflows.feature +177 -4
  90. package/features/queries.feature +9 -1
  91. package/features/response.feature +68 -0
  92. package/features/routes.feature +54 -10
  93. package/features/steps/Captures.ts +6 -0
  94. package/features/steps/Components.ts +18 -6
  95. package/features/steps/Database.ts +1 -1
  96. package/features/steps/Gateway.ts +4 -2
  97. package/features/steps/HTTP.ts +34 -6
  98. package/features/steps/IdP.ts +149 -0
  99. package/features/steps/Parameters.ts +8 -2
  100. package/features/steps/Workspace.ts +5 -7
  101. package/features/steps/components/echo/manifest.toa.yaml +1 -0
  102. package/features/steps/components/echo/operations/error.js +11 -0
  103. package/features/steps/components/greeter/manifest.toa.yaml +1 -0
  104. package/features/steps/components/octets.tester/manifest.toa.yaml +4 -0
  105. package/features/steps/components/octets.tester/operations/concat.js +7 -0
  106. package/features/steps/components/octets.tester/operations/echo.js +7 -0
  107. package/features/steps/components/pots/manifest.toa.yaml +12 -3
  108. package/features/steps/components/sequences/manifest.toa.yaml +1 -0
  109. package/features/steps/components/users/manifest.toa.yaml +4 -0
  110. package/features/steps/components/users.properties/manifest.toa.yaml +14 -0
  111. package/features/steps/tsconfig.json +1 -1
  112. package/features/timing.feature +66 -0
  113. package/features/vary.feature +180 -0
  114. package/package.json +16 -20
  115. package/readme.md +7 -6
  116. package/schemas/annotation.cos.yaml +1 -0
  117. package/schemas/io/input.cos.yaml +3 -0
  118. package/schemas/io/message.cos.yaml +5 -0
  119. package/schemas/io/output.cos.yaml +5 -0
  120. package/schemas/octets/delete.cos.yaml +2 -1
  121. package/schemas/octets/list.cos.yaml +2 -1
  122. package/schemas/octets/workflow.cos.yaml +12 -0
  123. package/schemas/querystring.cos.yaml +1 -0
  124. package/source/Annotation.ts +1 -0
  125. package/source/Context.ts +6 -4
  126. package/source/Directive.test.ts +14 -8
  127. package/source/Directive.ts +26 -49
  128. package/source/Endpoint.ts +53 -6
  129. package/source/Factory.ts +23 -12
  130. package/source/Gateway.ts +45 -42
  131. package/source/HTTP/Context.ts +67 -0
  132. package/source/HTTP/Server.test.ts +61 -134
  133. package/source/HTTP/Server.ts +83 -87
  134. package/source/HTTP/Timing.ts +40 -0
  135. package/source/HTTP/formats/msgpack.ts +9 -6
  136. package/source/HTTP/formats/text.ts +1 -1
  137. package/source/HTTP/formats/yaml.ts +1 -1
  138. package/source/HTTP/index.ts +1 -0
  139. package/source/HTTP/messages.test.ts +27 -8
  140. package/source/HTTP/messages.ts +38 -42
  141. package/source/Interception.ts +24 -0
  142. package/source/Mapping.ts +7 -8
  143. package/source/RTD/Context.ts +7 -10
  144. package/source/RTD/Directives.ts +28 -4
  145. package/source/RTD/Endpoint.ts +6 -4
  146. package/source/RTD/Match.ts +2 -7
  147. package/source/RTD/Method.ts +7 -13
  148. package/source/RTD/Node.ts +13 -14
  149. package/source/RTD/Tree.ts +19 -15
  150. package/source/RTD/factory.ts +2 -5
  151. package/source/RTD/syntax/parse.ts +6 -6
  152. package/source/RTD/syntax/types.ts +1 -1
  153. package/source/deployment.ts +7 -2
  154. package/source/directives/auth/Anonymous.ts +3 -2
  155. package/source/directives/auth/{Family.ts → Authorization.ts} +39 -40
  156. package/source/directives/auth/Delegate.ts +32 -0
  157. package/source/directives/auth/Incept.ts +11 -6
  158. package/source/directives/auth/Role.ts +5 -3
  159. package/source/directives/auth/Rule.ts +2 -2
  160. package/source/directives/auth/Scheme.ts +2 -2
  161. package/source/directives/auth/index.ts +2 -2
  162. package/source/directives/auth/schemes.ts +2 -1
  163. package/source/directives/auth/types.ts +9 -6
  164. package/source/directives/cache/{Family.ts → Cache.ts} +6 -7
  165. package/source/directives/cache/Control.ts +5 -5
  166. package/source/directives/cache/index.ts +2 -2
  167. package/source/directives/cache/types.ts +2 -2
  168. package/source/directives/cors/CORS.ts +62 -0
  169. package/source/directives/cors/index.ts +3 -0
  170. package/source/directives/dev/{Family.ts → Development.ts} +4 -5
  171. package/source/directives/dev/Stub.ts +4 -4
  172. package/source/directives/dev/Throw.ts +4 -4
  173. package/source/directives/dev/index.ts +2 -2
  174. package/source/directives/dev/types.ts +1 -1
  175. package/source/directives/index.ts +11 -6
  176. package/source/directives/io/Directive.ts +11 -0
  177. package/source/directives/io/IO.ts +43 -0
  178. package/source/directives/io/Input.ts +50 -0
  179. package/source/directives/io/Message.ts +1 -0
  180. package/source/directives/io/Output.ts +69 -0
  181. package/source/directives/io/index.ts +3 -0
  182. package/source/directives/io/schemas.ts +12 -0
  183. package/source/directives/octets/Context.ts +6 -5
  184. package/source/directives/octets/Delete.ts +64 -11
  185. package/source/directives/octets/Directive.ts +10 -0
  186. package/source/directives/octets/Fetch.ts +44 -29
  187. package/source/directives/octets/List.ts +50 -10
  188. package/source/directives/octets/{Family.ts → Octets.ts} +14 -9
  189. package/source/directives/octets/Permute.ts +18 -11
  190. package/source/directives/octets/Store.ts +70 -102
  191. package/source/directives/octets/Workflow.ts +48 -0
  192. package/source/directives/octets/index.ts +2 -2
  193. package/source/directives/octets/schemas.test.ts +21 -0
  194. package/source/directives/octets/schemas.ts +13 -6
  195. package/source/directives/octets/types.ts +2 -8
  196. package/source/directives/octets/workflows/Execution.ts +76 -0
  197. package/source/directives/octets/workflows/Workflow.ts +37 -0
  198. package/source/directives/octets/workflows/index.ts +1 -0
  199. package/source/directives/vary/Directive.ts +6 -0
  200. package/source/directives/vary/Embed.ts +62 -0
  201. package/source/directives/vary/Properties.ts +17 -0
  202. package/source/directives/vary/Vary.ts +48 -0
  203. package/source/directives/vary/embeddings/Embedding.ts +6 -0
  204. package/source/directives/vary/embeddings/Header.ts +32 -0
  205. package/source/directives/vary/embeddings/Language.ts +31 -0
  206. package/source/directives/vary/embeddings/index.ts +11 -0
  207. package/source/directives/vary/index.ts +3 -0
  208. package/source/exceptions.ts +13 -9
  209. package/source/io.ts +4 -0
  210. package/source/manifest.test.ts +6 -14
  211. package/source/manifest.ts +9 -6
  212. package/source/root.ts +5 -0
  213. package/source/schemas.ts +7 -3
  214. package/transpiled/Annotation.d.ts +1 -0
  215. package/transpiled/Composition.js.map +1 -1
  216. package/transpiled/Context.d.ts +6 -4
  217. package/transpiled/Directive.d.ts +11 -25
  218. package/transpiled/Directive.js +17 -18
  219. package/transpiled/Directive.js.map +1 -1
  220. package/transpiled/Endpoint.d.ts +7 -5
  221. package/transpiled/Endpoint.js +58 -2
  222. package/transpiled/Endpoint.js.map +1 -1
  223. package/transpiled/Factory.d.ts +0 -1
  224. package/transpiled/Factory.js +14 -7
  225. package/transpiled/Factory.js.map +1 -1
  226. package/transpiled/Gateway.d.ts +7 -8
  227. package/transpiled/Gateway.js +25 -25
  228. package/transpiled/Gateway.js.map +1 -1
  229. package/transpiled/HTTP/Context.d.ts +24 -0
  230. package/transpiled/HTTP/Context.js +47 -0
  231. package/transpiled/HTTP/Context.js.map +1 -0
  232. package/transpiled/HTTP/Server.d.ts +10 -7
  233. package/transpiled/HTTP/Server.js +80 -70
  234. package/transpiled/HTTP/Server.js.map +1 -1
  235. package/transpiled/HTTP/Timing.d.ts +10 -0
  236. package/transpiled/HTTP/Timing.js +29 -0
  237. package/transpiled/HTTP/Timing.js.map +1 -0
  238. package/transpiled/HTTP/formats/msgpack.d.ts +2 -2
  239. package/transpiled/HTTP/formats/msgpack.js +8 -29
  240. package/transpiled/HTTP/formats/msgpack.js.map +1 -1
  241. package/transpiled/HTTP/formats/text.d.ts +3 -1
  242. package/transpiled/HTTP/formats/text.js.map +1 -1
  243. package/transpiled/HTTP/formats/yaml.js +1 -1
  244. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  245. package/transpiled/HTTP/index.d.ts +1 -0
  246. package/transpiled/HTTP/index.js +1 -0
  247. package/transpiled/HTTP/index.js.map +1 -1
  248. package/transpiled/HTTP/messages.d.ts +7 -16
  249. package/transpiled/HTTP/messages.js +28 -25
  250. package/transpiled/HTTP/messages.js.map +1 -1
  251. package/transpiled/Interception.d.ts +9 -0
  252. package/transpiled/Interception.js +19 -0
  253. package/transpiled/Interception.js.map +1 -0
  254. package/transpiled/Mapping.js +7 -7
  255. package/transpiled/Mapping.js.map +1 -1
  256. package/transpiled/Query.js.map +1 -1
  257. package/transpiled/RTD/Context.d.ts +7 -6
  258. package/transpiled/RTD/Directives.d.ts +19 -4
  259. package/transpiled/RTD/Endpoint.d.ts +6 -4
  260. package/transpiled/RTD/Match.d.ts +2 -4
  261. package/transpiled/RTD/Method.d.ts +7 -7
  262. package/transpiled/RTD/Method.js.map +1 -1
  263. package/transpiled/RTD/Node.d.ts +4 -6
  264. package/transpiled/RTD/Node.js +2 -1
  265. package/transpiled/RTD/Node.js.map +1 -1
  266. package/transpiled/RTD/Route.js.map +1 -1
  267. package/transpiled/RTD/Tree.d.ts +6 -6
  268. package/transpiled/RTD/Tree.js +5 -0
  269. package/transpiled/RTD/Tree.js.map +1 -1
  270. package/transpiled/RTD/factory.d.ts +2 -4
  271. package/transpiled/RTD/factory.js.map +1 -1
  272. package/transpiled/RTD/syntax/parse.js +1 -1
  273. package/transpiled/RTD/syntax/parse.js.map +1 -1
  274. package/transpiled/RTD/syntax/types.js +1 -1
  275. package/transpiled/RTD/syntax/types.js.map +1 -1
  276. package/transpiled/deployment.js +6 -2
  277. package/transpiled/deployment.js.map +1 -1
  278. package/transpiled/directives/auth/Anonymous.js +3 -4
  279. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  280. package/transpiled/directives/auth/{Family.d.ts → Authorization.d.ts} +4 -5
  281. package/transpiled/directives/auth/{Family.js → Authorization.js} +22 -13
  282. package/transpiled/directives/auth/Authorization.js.map +1 -0
  283. package/transpiled/directives/auth/Delegate.d.ts +8 -0
  284. package/transpiled/directives/auth/Delegate.js +27 -0
  285. package/transpiled/directives/auth/Delegate.js.map +1 -0
  286. package/transpiled/directives/auth/Incept.d.ts +1 -1
  287. package/transpiled/directives/auth/Incept.js +11 -6
  288. package/transpiled/directives/auth/Incept.js.map +1 -1
  289. package/transpiled/directives/auth/Role.js +5 -3
  290. package/transpiled/directives/auth/Role.js.map +1 -1
  291. package/transpiled/directives/auth/Rule.d.ts +2 -2
  292. package/transpiled/directives/auth/Rule.js.map +1 -1
  293. package/transpiled/directives/auth/Scheme.js +2 -2
  294. package/transpiled/directives/auth/Scheme.js.map +1 -1
  295. package/transpiled/directives/auth/index.d.ts +2 -2
  296. package/transpiled/directives/auth/index.js +4 -5
  297. package/transpiled/directives/auth/index.js.map +1 -1
  298. package/transpiled/directives/auth/schemes.js +2 -1
  299. package/transpiled/directives/auth/schemes.js.map +1 -1
  300. package/transpiled/directives/auth/types.d.ts +4 -4
  301. package/transpiled/directives/cache/Cache.d.ts +11 -0
  302. package/transpiled/directives/cache/{Family.js → Cache.js} +6 -4
  303. package/transpiled/directives/cache/Cache.js.map +1 -0
  304. package/transpiled/directives/cache/Control.d.ts +3 -3
  305. package/transpiled/directives/cache/Control.js +3 -3
  306. package/transpiled/directives/cache/Control.js.map +1 -1
  307. package/transpiled/directives/cache/index.d.ts +2 -2
  308. package/transpiled/directives/cache/index.js +4 -5
  309. package/transpiled/directives/cache/index.js.map +1 -1
  310. package/transpiled/directives/cache/types.d.ts +2 -2
  311. package/transpiled/directives/cors/CORS.d.ts +10 -0
  312. package/transpiled/directives/cors/CORS.js +51 -0
  313. package/transpiled/directives/cors/CORS.js.map +1 -0
  314. package/transpiled/directives/cors/index.d.ts +2 -0
  315. package/transpiled/directives/cors/index.js +6 -0
  316. package/transpiled/directives/cors/index.js.map +1 -0
  317. package/transpiled/directives/dev/Development.d.ts +9 -0
  318. package/transpiled/directives/dev/{Family.js → Development.js} +4 -2
  319. package/transpiled/directives/dev/Development.js.map +1 -0
  320. package/transpiled/directives/dev/Stub.d.ts +3 -3
  321. package/transpiled/directives/dev/Stub.js.map +1 -1
  322. package/transpiled/directives/dev/Throw.d.ts +3 -3
  323. package/transpiled/directives/dev/Throw.js.map +1 -1
  324. package/transpiled/directives/dev/index.d.ts +2 -2
  325. package/transpiled/directives/dev/index.js +4 -5
  326. package/transpiled/directives/dev/index.js.map +1 -1
  327. package/transpiled/directives/dev/types.d.ts +1 -1
  328. package/transpiled/directives/index.d.ts +4 -2
  329. package/transpiled/directives/index.js +10 -9
  330. package/transpiled/directives/index.js.map +1 -1
  331. package/transpiled/directives/io/Directive.d.ts +8 -0
  332. package/transpiled/directives/io/Directive.js +3 -0
  333. package/transpiled/directives/io/Directive.js.map +1 -0
  334. package/transpiled/directives/io/IO.d.ts +9 -0
  335. package/transpiled/directives/io/IO.js +33 -0
  336. package/transpiled/directives/io/IO.js.map +1 -0
  337. package/transpiled/directives/io/Input.d.ts +11 -0
  338. package/transpiled/directives/io/Input.js +63 -0
  339. package/transpiled/directives/io/Input.js.map +1 -0
  340. package/transpiled/directives/io/Message.d.ts +1 -0
  341. package/transpiled/directives/io/Message.js +3 -0
  342. package/transpiled/directives/io/Message.js.map +1 -0
  343. package/transpiled/directives/io/Output.d.ts +13 -0
  344. package/transpiled/directives/io/Output.js +76 -0
  345. package/transpiled/directives/io/Output.js.map +1 -0
  346. package/transpiled/directives/io/index.d.ts +2 -0
  347. package/transpiled/directives/io/index.js +6 -0
  348. package/transpiled/directives/io/index.js.map +1 -0
  349. package/transpiled/directives/io/schemas.d.ts +7 -0
  350. package/transpiled/directives/io/schemas.js +14 -0
  351. package/transpiled/directives/io/schemas.js.map +1 -0
  352. package/transpiled/directives/octets/Context.d.ts +5 -5
  353. package/transpiled/directives/octets/Context.js +4 -2
  354. package/transpiled/directives/octets/Context.js.map +1 -1
  355. package/transpiled/directives/octets/Delete.d.ts +15 -5
  356. package/transpiled/directives/octets/Delete.js +45 -8
  357. package/transpiled/directives/octets/Delete.js.map +1 -1
  358. package/transpiled/directives/octets/Directive.d.ts +8 -0
  359. package/transpiled/directives/octets/Directive.js +8 -0
  360. package/transpiled/directives/octets/Directive.js.map +1 -0
  361. package/transpiled/directives/octets/Fetch.d.ts +9 -9
  362. package/transpiled/directives/octets/Fetch.js +36 -21
  363. package/transpiled/directives/octets/Fetch.js.map +1 -1
  364. package/transpiled/directives/octets/List.d.ts +11 -5
  365. package/transpiled/directives/octets/List.js +34 -7
  366. package/transpiled/directives/octets/List.js.map +1 -1
  367. package/transpiled/directives/octets/Octets.d.ts +12 -0
  368. package/transpiled/directives/octets/{Family.js → Octets.js} +12 -6
  369. package/transpiled/directives/octets/Octets.js.map +1 -0
  370. package/transpiled/directives/octets/Permute.d.ts +5 -4
  371. package/transpiled/directives/octets/Permute.js +15 -8
  372. package/transpiled/directives/octets/Permute.js.map +1 -1
  373. package/transpiled/directives/octets/Store.d.ts +14 -23
  374. package/transpiled/directives/octets/Store.js +41 -70
  375. package/transpiled/directives/octets/Store.js.map +1 -1
  376. package/transpiled/directives/octets/Workflow.d.ts +15 -0
  377. package/transpiled/directives/octets/Workflow.js +59 -0
  378. package/transpiled/directives/octets/Workflow.js.map +1 -0
  379. package/transpiled/directives/octets/index.d.ts +2 -2
  380. package/transpiled/directives/octets/index.js +4 -5
  381. package/transpiled/directives/octets/index.js.map +1 -1
  382. package/transpiled/directives/octets/schemas.d.ts +13 -6
  383. package/transpiled/directives/octets/schemas.js +2 -1
  384. package/transpiled/directives/octets/schemas.js.map +1 -1
  385. package/transpiled/directives/octets/types.d.ts +2 -6
  386. package/transpiled/directives/octets/workflows/Execution.d.ts +25 -0
  387. package/transpiled/directives/octets/workflows/Execution.js +54 -0
  388. package/transpiled/directives/octets/workflows/Execution.js.map +1 -0
  389. package/transpiled/directives/octets/workflows/Workflow.d.ts +12 -0
  390. package/transpiled/directives/octets/workflows/Workflow.js +25 -0
  391. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -0
  392. package/transpiled/directives/octets/workflows/index.d.ts +1 -0
  393. package/transpiled/directives/octets/workflows/index.js +6 -0
  394. package/transpiled/directives/octets/workflows/index.js.map +1 -0
  395. package/transpiled/directives/vary/Directive.d.ts +5 -0
  396. package/transpiled/directives/vary/Directive.js +3 -0
  397. package/transpiled/directives/vary/Directive.js.map +1 -0
  398. package/transpiled/directives/vary/Embed.d.ts +10 -0
  399. package/transpiled/directives/vary/Embed.js +49 -0
  400. package/transpiled/directives/vary/Embed.js.map +1 -0
  401. package/transpiled/directives/vary/Properties.d.ts +9 -0
  402. package/transpiled/directives/vary/Properties.js +16 -0
  403. package/transpiled/directives/vary/Properties.js.map +1 -0
  404. package/transpiled/directives/vary/Vary.d.ts +10 -0
  405. package/transpiled/directives/vary/Vary.js +36 -0
  406. package/transpiled/directives/vary/Vary.js.map +1 -0
  407. package/transpiled/directives/vary/embeddings/Embedding.d.ts +5 -0
  408. package/transpiled/directives/vary/embeddings/Embedding.js +3 -0
  409. package/transpiled/directives/vary/embeddings/Embedding.js.map +1 -0
  410. package/transpiled/directives/vary/embeddings/Header.d.ts +7 -0
  411. package/transpiled/directives/vary/embeddings/Header.js +28 -0
  412. package/transpiled/directives/vary/embeddings/Header.js.map +1 -0
  413. package/transpiled/directives/vary/embeddings/Language.d.ts +7 -0
  414. package/transpiled/directives/vary/embeddings/Language.js +28 -0
  415. package/transpiled/directives/vary/embeddings/Language.js.map +1 -0
  416. package/transpiled/directives/vary/embeddings/index.d.ts +5 -0
  417. package/transpiled/directives/vary/embeddings/index.js +10 -0
  418. package/transpiled/directives/vary/embeddings/index.js.map +1 -0
  419. package/transpiled/directives/vary/index.d.ts +2 -0
  420. package/transpiled/directives/vary/index.js +6 -0
  421. package/transpiled/directives/vary/index.js.map +1 -0
  422. package/transpiled/exceptions.js +7 -7
  423. package/transpiled/exceptions.js.map +1 -1
  424. package/transpiled/io.d.ts +3 -0
  425. package/transpiled/io.js +3 -0
  426. package/transpiled/io.js.map +1 -0
  427. package/transpiled/manifest.js +10 -5
  428. package/transpiled/manifest.js.map +1 -1
  429. package/transpiled/root.js +5 -0
  430. package/transpiled/root.js.map +1 -1
  431. package/transpiled/schemas.d.ts +7 -3
  432. package/transpiled/schemas.js.map +1 -1
  433. package/transpiled/tsconfig.tsbuildinfo +1 -1
  434. package/source/HTTP/Server.fixtures.ts +0 -41
  435. package/transpiled/HTTP/Server.fixtures.d.ts +0 -11
  436. package/transpiled/HTTP/Server.fixtures.js +0 -32
  437. package/transpiled/HTTP/Server.fixtures.js.map +0 -1
  438. package/transpiled/directives/auth/Family.js.map +0 -1
  439. package/transpiled/directives/cache/Family.d.ts +0 -12
  440. package/transpiled/directives/cache/Family.js.map +0 -1
  441. package/transpiled/directives/dev/Family.d.ts +0 -10
  442. package/transpiled/directives/dev/Family.js.map +0 -1
  443. package/transpiled/directives/octets/Family.d.ts +0 -12
  444. package/transpiled/directives/octets/Family.js.map +0 -1
@@ -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()
@@ -1,29 +1,31 @@
1
- import { Readable } from 'node:stream'
2
- import { posix } from 'node:path'
1
+ import { PassThrough } from 'node:stream'
3
2
  import { match } from 'matchacho'
4
- import { promex } from '@toa.io/generic'
5
3
  import { BadRequest, UnsupportedMediaType } from '../../HTTP'
4
+ import { cors } from '../cors'
6
5
  import * as schemas from './schemas'
7
- import type { Maybe } from '@toa.io/types'
6
+ import { Workflow } from './workflows'
7
+ import { Directive } from './Directive'
8
+ import type { Readable } from 'stream'
9
+ import type { Parameter } from '../../RTD'
10
+ import type { Unit } from './workflows'
8
11
  import type { Entry } from '@toa.io/extensions.storages'
9
12
  import type { Remotes } from '../../Remotes'
10
13
  import type { ErrorType } from 'error-value'
11
14
  import type { Component } from '@toa.io/core'
12
- import type { Output } from '../../Directive'
13
- import type { Directive, Input } from './types'
15
+ import type { Output } from '../../io'
16
+ import type { Input } from './types'
14
17
 
15
- export class Store implements Directive {
18
+ export class Store extends Directive {
16
19
  public readonly targeted = false
17
20
 
18
- private readonly accept: string | undefined
19
- private readonly workflow: Workflow | undefined
21
+ private readonly accept?: string
22
+ private readonly workflow?: Workflow
20
23
  private readonly discovery: Record<string, Promise<Component>> = {}
21
- private readonly remotes: Remotes
22
- private readonly components: Record<string, Component> = {}
23
24
  private storage: Component | null = null
24
25
 
25
26
  public constructor
26
27
  (options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
28
+ super()
27
29
  schemas.store.validate(options)
28
30
 
29
31
  this.accept = match(options?.accept,
@@ -31,34 +33,60 @@ export class Store implements Directive {
31
33
  Array, (types: string[]) => types.join(','),
32
34
  undefined)
33
35
 
34
- this.workflow = match(options?.workflow,
35
- Array, (units: Unit[]) => units,
36
- Object, (unit: Unit) => [unit],
37
- undefined)
36
+ if (options?.workflow !== undefined)
37
+ this.workflow = new Workflow(options.workflow, remotes)
38
38
 
39
39
  this.discovery.storage = discovery
40
- this.remotes = remotes
40
+
41
+ cors.allow('content-meta')
41
42
  }
42
43
 
43
- public async apply (storage: string, request: Input): Promise<Output> {
44
+ public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
44
45
  this.storage ??= await this.discovery.storage
45
46
 
46
- const input = { storage, request, accept: this.accept }
47
- const entry = await this.storage.invoke('store', { input })
47
+ const request: StoreRequest = {
48
+ input: {
49
+ storage,
50
+ request: input.request
51
+ }
52
+ }
53
+
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)
48
63
 
49
64
  return match<Output>(entry,
50
65
  Error, (error: ErrorType) => this.throw(error),
51
- () => this.reply(request, storage, entry))
66
+ () => this.reply(input, storage, entry, parameters))
52
67
  }
53
68
 
54
- private reply (request: Input, storage: string, entry: Entry): Output {
69
+ // eslint-disable-next-line max-params
70
+ private reply (input: Input, storage: string, entry: Entry, parameters: Parameter[]): Output {
55
71
  const body = this.workflow === undefined
56
72
  ? entry
57
- : Readable.from(this.execute(request, storage, entry))
73
+ : this.execute(input, storage, entry, parameters)
58
74
 
59
75
  return { body }
60
76
  }
61
77
 
78
+ // eslint-disable-next-line max-params
79
+ private execute
80
+ (input: Input, storage: string, entry: Entry, parameters: Parameter[]): Readable {
81
+ const stream = new PassThrough({ objectMode: true })
82
+
83
+ stream.push(entry)
84
+
85
+ this.workflow!.execute(input, storage, entry, parameters).pipe(stream)
86
+
87
+ return stream
88
+ }
89
+
62
90
  private throw (error: ErrorType): never {
63
91
  throw match(error.code,
64
92
  'NOT_ACCEPTABLE', () => new UnsupportedMediaType(),
@@ -66,93 +94,33 @@ export class Store implements Directive {
66
94
  error)
67
95
  }
68
96
 
69
- /* eslint-disable no-useless-return, max-depth */
70
-
71
- /**
72
- * Execute workflow units sequentially, steps within a unit in parallel.
73
- * Yield results as soon as they come.
74
- *
75
- * If you need to change this, it may take a while.
76
- */
77
- private async * execute (request: Input, storage: string, entry: Entry): AsyncGenerator {
78
- yield entry
79
-
80
- const path = posix.join(request.path, entry.id)
81
- let interrupted = false
82
-
83
- for (const unit of this.workflow as Workflow) {
84
- if (interrupted)
85
- break
86
-
87
- const steps = Object.keys(unit)
88
-
89
- // unit result promises queue
90
- const results = Array.from(steps, promex<unknown>)
91
- let next = 0
92
-
93
- // execute steps in parallel
94
- for (const step of steps)
95
- // these promises are indirectly awaited in the yield loop
96
- void (async () => {
97
- const endpoint = unit[step]
98
- const context: Context = { storage, path, entry }
99
- const result = await this.call(endpoint, context)
100
-
101
- if (interrupted)
102
- return
103
-
104
- // as a result is received, resolve the next promise from the queue
105
- const promise = results[next++]
106
-
107
- if (result instanceof Error) {
108
- interrupted = true
109
- promise.resolve({ error: { step, ...result } })
110
-
111
- // cancel pending promises
112
- results[next].resolve(null)
113
- } else
114
- promise.resolve({ [step]: result ?? null })
115
- })().catch((e) => results[next].reject(e))
116
-
117
- // yield results from the queue as they come
118
- for (const promise of results) {
119
- const result = await promise
120
-
121
- if (result === null) // canceled promise
122
- break
123
- else
124
- yield result
125
- }
126
- }
127
- }
128
-
129
- private async call (endpoint: string, context: Context): Promise<Maybe<unknown>> {
130
- const [operation, component, namespace = 'default'] = endpoint.split('.').reverse()
131
- const key = `${namespace}.${component}`
97
+ private parseMeta (value: string | string[]): Record<string, string> {
98
+ if (Array.isArray(value))
99
+ value = value.join(',')
132
100
 
133
- this.components[key] ??= await this.discover(key, namespace, component)
101
+ const meta: Record<string, string> = {}
134
102
 
135
- return await this.components[key].invoke(operation, { input: context })
136
- }
103
+ for (const pair of value.split(',')) {
104
+ const eq = pair.indexOf('=')
105
+ const key = (eq === -1 ? pair : pair.slice(0, eq)).trim()
137
106
 
138
- private async discover (key: string, namespace: string, component: string): Promise<Component> {
139
- if (this.discovery[key] === undefined)
140
- this.discovery[key] = this.remotes.discover(namespace, component)
107
+ meta[key] = eq === -1 ? 'true' : pair.slice(eq + 1).trim()
108
+ }
141
109
 
142
- return await this.discovery[key]
110
+ return meta
143
111
  }
144
112
  }
145
113
 
146
- type Unit = Record<string, string>
147
- type Workflow = Unit[]
148
-
149
- interface Options {
150
- accept: string | string[]
151
- workflow: Workflow | Unit
114
+ export interface Options {
115
+ accept?: string | string[]
116
+ workflow?: Unit[] | Unit
152
117
  }
153
118
 
154
- interface Context {
155
- storage: string
156
- path: string
157
- entry: Entry
119
+ interface StoreRequest {
120
+ input: {
121
+ storage: string
122
+ request: Input['request']
123
+ accept?: string
124
+ meta?: Record<string, string>
125
+ }
158
126
  }
@@ -0,0 +1,48 @@
1
+ import { NotFound } from '../../HTTP'
2
+ import * as schemas from './schemas'
3
+ import { Workflow } from './workflows'
4
+ import { Directive } from './Directive'
5
+ import type { Unit } from './workflows'
6
+ import type { Input } from './types'
7
+ import type { Component } from '@toa.io/core'
8
+ import type { Output } from '../../io'
9
+ import type { Remotes } from '../../Remotes'
10
+ import type { Maybe } from '@toa.io/types'
11
+ import type { Entry } from '@toa.io/extensions.storages'
12
+ import type { Parameter } from '../../RTD'
13
+
14
+ export class WorkflowDirective extends Directive {
15
+ public readonly targeted = true
16
+
17
+ private readonly workflow: Workflow
18
+ private readonly discovery: Promise<Component>
19
+ private storage: Component | null = null
20
+
21
+ public constructor (units: Unit[] | Unit, discovery: Promise<Component>, remotes: Remotes) {
22
+ super()
23
+ schemas.workflow.validate(units)
24
+
25
+ this.workflow = new Workflow(units, remotes)
26
+ this.discovery = discovery
27
+ }
28
+
29
+ public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
30
+ this.storage ??= await this.discovery
31
+
32
+ const entry = await this.storage.invoke<Maybe<Entry>>('get',
33
+ {
34
+ input: {
35
+ storage,
36
+ path: input.request.url
37
+ }
38
+ })
39
+
40
+ if (entry instanceof Error)
41
+ throw new NotFound()
42
+
43
+ return {
44
+ status: 202,
45
+ body: this.workflow.execute(input, storage, entry, parameters)
46
+ }
47
+ }
48
+ }
@@ -1,3 +1,3 @@
1
- import Family from './Family'
1
+ import { Octets } from './Octets'
2
2
 
3
- export = Family
3
+ export const octets = new Octets()
@@ -0,0 +1,21 @@
1
+ import * as schemas from './schemas'
2
+
3
+ describe('workflow', () => {
4
+ const ok = [
5
+ { echo: 'hello world' },
6
+ [{ echo: 'hello world' }, { ok: 'ok' }]
7
+ ]
8
+
9
+ const oh = [
10
+ { echo: [] },
11
+ { echo: 'hello world', ok: { not: 'ok' } }
12
+ ]
13
+
14
+ it.each(ok)('should be valid', (workflow) => {
15
+ expect(() => schemas.workflow.validate(workflow)).not.toThrow()
16
+ })
17
+
18
+ it.each(oh)('should not be valid', (workflow) => {
19
+ expect(() => schemas.workflow.validate(workflow)).toThrow()
20
+ })
21
+ })
@@ -1,12 +1,19 @@
1
1
  import { resolve } from 'node:path'
2
2
  import schemas from '@toa.io/schemas'
3
+ import type { Permissions as FetchPermissions } from './Fetch'
4
+ import type { Permissions as ListPermissions } from './List'
5
+ import type { Options as StoreOptions } from './Store'
6
+ import type { Options as DeleteOptions } from './Delete'
7
+ import type { Schema } from '@toa.io/schemas'
8
+ import type { Unit } from './workflows'
3
9
 
4
10
  const path = resolve(__dirname, '../../../schemas/octets')
5
11
  const namespace = schemas.namespace(path)
6
12
 
7
- export const context = namespace.schema('context')
8
- export const store = namespace.schema('store')
9
- export const fetch = namespace.schema('fetch')
10
- export const remove = namespace.schema('delete')
11
- export const list = namespace.schema('list')
12
- export const permute = namespace.schema('permute')
13
+ export const context: Schema<string> = namespace.schema('context')
14
+ export const store: Schema<StoreOptions | null> = namespace.schema('store')
15
+ export const fetch: Schema<FetchPermissions | null> = namespace.schema('fetch')
16
+ export const remove: Schema<DeleteOptions | null> = namespace.schema('delete')
17
+ export const list: Schema<ListPermissions | null> = namespace.schema('list')
18
+ export const permute: Schema<null> = namespace.schema('permute')
19
+ export const workflow: Schema<Unit[] | Unit> = namespace.schema('workflow')
@@ -1,13 +1,7 @@
1
- import type * as directive from '../../Directive'
2
-
3
- export interface Directive {
4
- readonly targeted: boolean
5
-
6
- apply: (storage: string, input: Input) => directive.Output | Promise<directive.Output>
7
- }
1
+ import type * as io from '../../io'
8
2
 
9
3
  export interface Extension {
10
4
  octets?: string
11
5
  }
12
6
 
13
- export type Input = directive.Input & Extension
7
+ export type Input = io.Input & Extension