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

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 (601) hide show
  1. package/components/context.toa.yaml +2 -2
  2. package/components/identity.bans/manifest.toa.yaml +14 -6
  3. package/components/identity.bans/operations/transit.d.ts +14 -0
  4. package/components/identity.bans/operations/transit.js +11 -0
  5. package/components/identity.bans/operations/transit.js.map +1 -0
  6. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
  7. package/components/identity.bans/source/transit.ts +21 -0
  8. package/components/identity.bans/tsconfig.json +9 -0
  9. package/components/identity.basic/manifest.toa.yaml +28 -10
  10. package/components/identity.basic/operations/authenticate.d.ts +5 -1
  11. package/components/identity.basic/operations/authenticate.js +7 -4
  12. package/components/identity.basic/operations/authenticate.js.map +1 -1
  13. package/components/identity.basic/operations/incept.d.ts +12 -0
  14. package/components/identity.basic/operations/incept.js +26 -0
  15. package/components/identity.basic/operations/incept.js.map +1 -0
  16. package/components/identity.basic/operations/transit.d.ts +4 -4
  17. package/components/identity.basic/operations/transit.js +8 -6
  18. package/components/identity.basic/operations/transit.js.map +1 -1
  19. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  20. package/components/identity.basic/operations/types.d.ts +8 -4
  21. package/components/identity.basic/source/authenticate.ts +18 -7
  22. package/components/identity.basic/source/incept.ts +38 -0
  23. package/components/identity.basic/source/transit.ts +11 -9
  24. package/components/identity.basic/source/types.ts +8 -4
  25. package/components/identity.federation/manifest.toa.yaml +61 -19
  26. package/components/identity.federation/operations/authenticate.d.ts +13 -2
  27. package/components/identity.federation/operations/authenticate.js +10 -11
  28. package/components/identity.federation/operations/authenticate.js.map +1 -1
  29. package/components/identity.federation/operations/decode.d.ts +2 -0
  30. package/{transpiled/directives/octets/Permute.js → components/identity.federation/operations/decode.js} +7 -32
  31. package/components/identity.federation/operations/decode.js.map +1 -0
  32. package/components/identity.federation/operations/incept.d.ts +11 -0
  33. package/components/identity.federation/operations/incept.js +14 -0
  34. package/components/identity.federation/operations/incept.js.map +1 -0
  35. package/components/identity.federation/operations/lib/assertions-as-values.js +4 -2
  36. package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -1
  37. package/components/identity.federation/operations/lib/get.d.ts +1 -0
  38. package/components/identity.federation/operations/lib/get.js +64 -0
  39. package/components/identity.federation/operations/lib/get.js.map +1 -0
  40. package/components/identity.federation/operations/lib/jwt.d.ts +4 -5
  41. package/components/identity.federation/operations/lib/jwt.js +20 -16
  42. package/components/identity.federation/operations/lib/jwt.js.map +1 -1
  43. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  44. package/components/identity.federation/operations/types/configuration.d.ts +15 -0
  45. package/components/identity.federation/operations/types/configuration.js +3 -0
  46. package/components/identity.federation/operations/types/configuration.js.map +1 -0
  47. package/components/identity.federation/operations/{types.d.ts → types/context.d.ts} +11 -12
  48. package/{transpiled/directives/vary/embeddings/Embedding.js → components/identity.federation/operations/types/context.js} +1 -1
  49. package/components/identity.federation/operations/types/context.js.map +1 -0
  50. package/components/identity.federation/operations/types/entity.d.ts +6 -0
  51. package/components/identity.federation/operations/types/entity.js +3 -0
  52. package/components/identity.federation/operations/types/entity.js.map +1 -0
  53. package/components/identity.federation/operations/types/index.d.ts +3 -0
  54. package/components/identity.federation/operations/types/index.js +20 -0
  55. package/components/identity.federation/operations/types/index.js.map +1 -0
  56. package/components/identity.federation/source/authenticate.ts +24 -17
  57. package/components/identity.federation/source/decode.ts +9 -0
  58. package/components/identity.federation/source/incept.ts +26 -0
  59. package/components/identity.federation/source/lib/assertions-as-values.ts +5 -2
  60. package/components/identity.federation/source/lib/get.ts +82 -0
  61. package/components/identity.federation/source/lib/jwt.test.ts +127 -4
  62. package/components/identity.federation/source/lib/jwt.ts +26 -19
  63. package/components/identity.federation/source/types/configuration.ts +16 -0
  64. package/components/identity.federation/source/{types.ts → types/context.ts} +12 -12
  65. package/components/identity.federation/source/types/entity.ts +6 -0
  66. package/components/identity.federation/source/types/index.ts +3 -0
  67. package/components/identity.federation/tsconfig.json +5 -4
  68. package/components/identity.keys/manifest.toa.yaml +54 -0
  69. package/components/identity.keys/operations/create.d.ts +22 -0
  70. package/components/identity.keys/operations/create.js +16 -0
  71. package/components/identity.keys/operations/create.js.map +1 -0
  72. package/components/identity.keys/operations/tsconfig.tsbuildinfo +1 -0
  73. package/components/identity.keys/source/create.ts +35 -0
  74. package/components/identity.keys/tsconfig.json +9 -0
  75. package/components/identity.roles/manifest.toa.yaml +9 -7
  76. package/components/identity.roles/operations/grant.d.ts +1 -1
  77. package/components/identity.roles/operations/grant.js +8 -7
  78. package/components/identity.roles/operations/grant.js.map +1 -1
  79. package/components/identity.roles/operations/lib/Entity.d.ts +1 -1
  80. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  81. package/components/identity.roles/source/grant.ts +9 -8
  82. package/components/identity.roles/source/lib/Entity.ts +1 -1
  83. package/components/identity.tokens/manifest.toa.yaml +103 -9
  84. package/components/identity.tokens/operations/authenticate.d.ts +3 -3
  85. package/components/identity.tokens/operations/authenticate.js +20 -13
  86. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  87. package/components/identity.tokens/operations/decrypt.d.ts +12 -3
  88. package/components/identity.tokens/operations/decrypt.js +62 -17
  89. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  90. package/components/identity.tokens/operations/encrypt.d.ts +3 -3
  91. package/components/identity.tokens/operations/encrypt.js +26 -6
  92. package/components/identity.tokens/operations/encrypt.js.map +1 -1
  93. package/components/identity.tokens/operations/issue.d.ts +24 -0
  94. package/components/identity.tokens/operations/issue.js +58 -0
  95. package/components/identity.tokens/operations/issue.js.map +1 -0
  96. package/components/identity.tokens/operations/lib/index.d.ts +2 -0
  97. package/components/identity.tokens/operations/lib/index.js +19 -0
  98. package/components/identity.tokens/operations/lib/index.js.map +1 -0
  99. package/components/identity.tokens/operations/lib/pad.d.ts +1 -0
  100. package/components/identity.tokens/operations/lib/pad.js +5 -0
  101. package/components/identity.tokens/operations/lib/pad.js.map +1 -0
  102. package/components/identity.tokens/operations/lib/types.d.ts +74 -0
  103. package/components/identity.tokens/operations/lib/types.js.map +1 -0
  104. package/components/identity.tokens/operations/revoke.d.ts +2 -2
  105. package/components/identity.tokens/operations/revoke.js.map +1 -1
  106. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  107. package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
  108. package/components/identity.tokens/source/authenticate.test.ts +22 -9
  109. package/components/identity.tokens/source/authenticate.ts +23 -15
  110. package/components/identity.tokens/source/decrypt.test.ts +33 -18
  111. package/components/identity.tokens/source/decrypt.ts +91 -20
  112. package/components/identity.tokens/source/encrypt.test.ts +67 -12
  113. package/components/identity.tokens/source/encrypt.ts +37 -9
  114. package/components/identity.tokens/source/issue.ts +80 -0
  115. package/components/identity.tokens/source/lib/index.ts +2 -0
  116. package/components/identity.tokens/source/lib/pad.ts +1 -0
  117. package/components/identity.tokens/source/lib/paseto.test.ts +16 -0
  118. package/components/identity.tokens/source/lib/types.ts +85 -0
  119. package/components/identity.tokens/source/revoke.ts +2 -2
  120. package/components/octets.storage/manifest.toa.yaml +10 -11
  121. package/components/octets.storage/operations/get.js +3 -3
  122. package/components/octets.storage/operations/head.js +7 -0
  123. package/components/octets.storage/operations/put.js +132 -0
  124. package/documentation/access.md +91 -29
  125. package/documentation/authorities.md +48 -0
  126. package/documentation/cache.md +8 -1
  127. package/documentation/components.md +125 -54
  128. package/documentation/flow.md +44 -0
  129. package/documentation/identity.md +29 -22
  130. package/documentation/introspection.md +82 -0
  131. package/documentation/map.md +73 -0
  132. package/documentation/octets.md +100 -68
  133. package/documentation/protocol.md +14 -4
  134. package/documentation/query.md +29 -4
  135. package/documentation/require.md +15 -0
  136. package/documentation/tree.md +13 -0
  137. package/features/access.feature +129 -48
  138. package/features/annotation.feature +1 -0
  139. package/features/auth.claims.feature +171 -0
  140. package/features/auth.incept.feature +89 -0
  141. package/features/auth.input.feature +59 -0
  142. package/features/authorities.basic.feature +141 -0
  143. package/features/authorities.feature +32 -0
  144. package/features/authorities.federation.feature +100 -0
  145. package/features/authorities.tokens.feature +117 -0
  146. package/features/body.feature +2 -0
  147. package/features/cache.feature +109 -5
  148. package/features/cors.feature +8 -2
  149. package/features/debug.feature +34 -0
  150. package/features/directives.feature +3 -0
  151. package/features/dynamic.feature +48 -0
  152. package/features/errors.feature +32 -7
  153. package/features/etag.feature +109 -1
  154. package/features/flow.feature +96 -0
  155. package/features/identity.bans.feature +137 -0
  156. package/features/identity.basic.feature +85 -28
  157. package/features/identity.feature +18 -6
  158. package/features/identity.federation.feature +89 -18
  159. package/features/identity.roles.feature +112 -19
  160. package/features/identity.tokens.feature +13 -4
  161. package/features/identtiy.tokens.custom.feature +247 -0
  162. package/features/introspection.feature +153 -0
  163. package/features/io.feature +38 -1
  164. package/features/map.feature +305 -0
  165. package/features/methods.feature +47 -0
  166. package/features/octets.cloudinary.feature +68 -0
  167. package/features/octets.download.feature +189 -0
  168. package/features/octets.entries.feature +13 -55
  169. package/features/octets.feature +84 -108
  170. package/features/octets.head.feature +40 -0
  171. package/features/octets.meta.feature +65 -15
  172. package/features/octets.workflows.feature +242 -58
  173. package/features/probes.feature +14 -0
  174. package/features/{queries.feature → query.feature} +77 -2
  175. package/features/realtime.feature +34 -0
  176. package/features/require.feature +67 -0
  177. package/features/response.feature +38 -3
  178. package/features/routes.feature +93 -2
  179. package/features/server.feature +21 -0
  180. package/features/steps/.env.example +3 -0
  181. package/features/steps/Database.ts +16 -9
  182. package/features/steps/Gateway.ts +26 -7
  183. package/features/steps/IdP.ts +63 -25
  184. package/features/steps/Parameters.ts +44 -1
  185. package/features/steps/Realtime.ts +151 -0
  186. package/features/steps/components/echo/manifest.toa.yaml +14 -1
  187. package/features/steps/components/echo/operations/identity.js +7 -0
  188. package/features/steps/components/echo/operations/parameters.js +7 -0
  189. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  190. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  191. package/features/steps/components/greeter/manifest.toa.yaml +0 -1
  192. package/features/steps/components/octets.tester/manifest.toa.yaml +22 -3
  193. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  194. package/features/steps/components/octets.tester/operations/bar.js +0 -1
  195. package/features/steps/components/octets.tester/operations/baz.js +0 -2
  196. package/features/steps/components/octets.tester/operations/foo.js +1 -2
  197. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  198. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  199. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  200. package/features/steps/components/pots/manifest.toa.yaml +12 -4
  201. package/features/steps/components/sequences/manifest.toa.yaml +0 -1
  202. package/features/steps/components/users/manifest.toa.yaml +4 -3
  203. package/features/steps/components/users/operations/create.js +15 -0
  204. package/features/steps/components/users.properties/manifest.toa.yaml +1 -2
  205. package/features/streams.feature +5 -0
  206. package/features/timestamps.feature +41 -0
  207. package/features/timing.feature +4 -1
  208. package/package.json +25 -13
  209. package/readme.md +19 -14
  210. package/schemas/annotation.cos.yaml +1 -1
  211. package/schemas/method.cos.yaml +1 -1
  212. package/schemas/node.cos.yaml +2 -0
  213. package/schemas/octets/put.cos.yaml +25 -0
  214. package/schemas/query.cos.yaml +4 -10
  215. package/source/Annotation.ts +3 -3
  216. package/source/Branch.ts +1 -0
  217. package/source/Composition.ts +0 -6
  218. package/source/Context.ts +1 -0
  219. package/source/Directive.test.ts +1 -1
  220. package/source/Directive.ts +7 -6
  221. package/source/Endpoint.ts +69 -17
  222. package/source/Factory.ts +22 -13
  223. package/source/Gateway.ts +73 -19
  224. package/source/HTTP/Context.ts +31 -7
  225. package/source/HTTP/Server.ts +61 -47
  226. package/source/HTTP/exceptions.ts +13 -1
  227. package/source/HTTP/formats/index.ts +3 -3
  228. package/source/HTTP/messages.test.ts +45 -2
  229. package/source/HTTP/messages.ts +34 -8
  230. package/source/Introspection.ts +11 -0
  231. package/source/Mapping.ts +68 -21
  232. package/source/Query.test.ts +3 -3
  233. package/source/Query.ts +123 -33
  234. package/source/RTD/Context.ts +1 -1
  235. package/source/RTD/Endpoint.ts +3 -0
  236. package/source/RTD/Method.ts +16 -0
  237. package/source/RTD/Node.ts +29 -13
  238. package/source/RTD/Route.ts +5 -4
  239. package/source/RTD/Tree.ts +2 -2
  240. package/source/RTD/factory.ts +5 -2
  241. package/source/RTD/syntax/parse.test.ts +1 -1
  242. package/source/RTD/syntax/parse.ts +37 -24
  243. package/source/RTD/syntax/types.ts +6 -4
  244. package/source/Remotes.ts +7 -6
  245. package/source/Tenant.ts +6 -20
  246. package/source/deployment.ts +33 -23
  247. package/source/directives/auth/Anonymous.ts +3 -3
  248. package/source/directives/auth/Anyone.ts +13 -0
  249. package/source/directives/auth/Authorization.ts +65 -25
  250. package/source/directives/auth/Delegate.ts +13 -6
  251. package/source/directives/auth/Echo.ts +16 -6
  252. package/source/directives/auth/Federation.ts +84 -0
  253. package/source/directives/auth/Id.ts +1 -1
  254. package/source/directives/auth/Incept.ts +27 -12
  255. package/source/directives/auth/Input.ts +72 -0
  256. package/source/directives/auth/Role.test.ts +53 -6
  257. package/source/directives/auth/Role.ts +23 -19
  258. package/source/directives/auth/Rule.ts +3 -5
  259. package/source/directives/auth/Scheme.ts +5 -5
  260. package/source/directives/auth/create.ts +10 -0
  261. package/source/directives/auth/split.ts +1 -1
  262. package/source/directives/auth/types.ts +11 -6
  263. package/source/directives/cache/Cache.ts +13 -6
  264. package/source/directives/cache/Control.ts +42 -16
  265. package/source/directives/cors/CORS.ts +3 -2
  266. package/source/directives/dev/Development.ts +1 -1
  267. package/source/directives/flow/Compose.ts +68 -0
  268. package/source/directives/flow/Fetch.ts +86 -0
  269. package/source/directives/flow/Flow.ts +42 -0
  270. package/source/directives/flow/index.ts +3 -0
  271. package/source/directives/flow/types.ts +7 -0
  272. package/source/directives/index.ts +4 -2
  273. package/source/directives/io/IO.ts +1 -1
  274. package/source/directives/io/Input.ts +8 -5
  275. package/source/directives/io/Output.ts +5 -4
  276. package/source/directives/map/Authority.ts +15 -0
  277. package/source/directives/map/Claims.ts +58 -0
  278. package/source/directives/map/Directive.ts +4 -0
  279. package/source/directives/map/Headers.ts +38 -0
  280. package/source/directives/map/Language.ts +42 -0
  281. package/source/directives/map/Languages.ts +11 -0
  282. package/source/directives/map/Map.ts +61 -0
  283. package/source/directives/map/Mapping.ts +19 -0
  284. package/source/directives/{vary → map}/Properties.ts +2 -4
  285. package/source/directives/map/Segments.ts +26 -0
  286. package/source/directives/map/index.ts +3 -0
  287. package/source/directives/octets/Context.ts +3 -2
  288. package/source/directives/octets/Delete.ts +11 -11
  289. package/source/directives/octets/Get.ts +86 -0
  290. package/source/directives/octets/Octets.ts +9 -12
  291. package/source/directives/octets/{Store.ts → Put.ts} +36 -36
  292. package/source/directives/octets/Workflow.ts +1 -1
  293. package/source/directives/octets/bytes.test.ts +30 -0
  294. package/source/directives/octets/bytes.ts +18 -0
  295. package/source/directives/octets/schemas.ts +4 -8
  296. package/source/directives/octets/workflows/Execution.ts +60 -8
  297. package/source/directives/octets/workflows/Workflow.ts +4 -4
  298. package/source/directives/require/Directive.ts +5 -0
  299. package/source/directives/require/Headers.ts +20 -0
  300. package/source/directives/require/Require.ts +28 -0
  301. package/source/directives/require/index.ts +3 -0
  302. package/source/exceptions.ts +14 -6
  303. package/source/manifest.ts +10 -11
  304. package/source/root.ts +16 -1
  305. package/source/schemas.ts +1 -1
  306. package/transpiled/Annotation.d.ts +3 -3
  307. package/transpiled/Branch.d.ts +1 -0
  308. package/transpiled/Composition.d.ts +0 -1
  309. package/transpiled/Composition.js +0 -4
  310. package/transpiled/Composition.js.map +1 -1
  311. package/transpiled/Context.d.ts +1 -0
  312. package/transpiled/Directive.js +7 -5
  313. package/transpiled/Directive.js.map +1 -1
  314. package/transpiled/Endpoint.d.ts +6 -4
  315. package/transpiled/Endpoint.js +47 -9
  316. package/transpiled/Endpoint.js.map +1 -1
  317. package/transpiled/Factory.d.ts +3 -2
  318. package/transpiled/Factory.js +18 -10
  319. package/transpiled/Factory.js.map +1 -1
  320. package/transpiled/Gateway.d.ts +3 -0
  321. package/transpiled/Gateway.js +55 -12
  322. package/transpiled/Gateway.js.map +1 -1
  323. package/transpiled/HTTP/Context.d.ts +9 -2
  324. package/transpiled/HTTP/Context.js +20 -6
  325. package/transpiled/HTTP/Context.js.map +1 -1
  326. package/transpiled/HTTP/Server.d.ts +13 -2
  327. package/transpiled/HTTP/Server.js +47 -40
  328. package/transpiled/HTTP/Server.js.map +1 -1
  329. package/transpiled/HTTP/exceptions.d.ts +7 -1
  330. package/transpiled/HTTP/exceptions.js +13 -1
  331. package/transpiled/HTTP/exceptions.js.map +1 -1
  332. package/transpiled/HTTP/formats/index.js +3 -3
  333. package/transpiled/HTTP/formats/index.js.map +1 -1
  334. package/transpiled/HTTP/messages.d.ts +2 -1
  335. package/transpiled/HTTP/messages.js +32 -7
  336. package/transpiled/HTTP/messages.js.map +1 -1
  337. package/transpiled/Introspection.d.ts +9 -0
  338. package/transpiled/Introspection.js +3 -0
  339. package/transpiled/Introspection.js.map +1 -0
  340. package/transpiled/Mapping.d.ts +11 -2
  341. package/transpiled/Mapping.js +50 -19
  342. package/transpiled/Mapping.js.map +1 -1
  343. package/transpiled/Query.d.ts +10 -1
  344. package/transpiled/Query.js +87 -30
  345. package/transpiled/Query.js.map +1 -1
  346. package/transpiled/RTD/Context.d.ts +1 -1
  347. package/transpiled/RTD/Endpoint.d.ts +1 -0
  348. package/transpiled/RTD/Method.d.ts +4 -0
  349. package/transpiled/RTD/Method.js +11 -0
  350. package/transpiled/RTD/Method.js.map +1 -1
  351. package/transpiled/RTD/Node.d.ts +4 -1
  352. package/transpiled/RTD/Node.js +23 -12
  353. package/transpiled/RTD/Node.js.map +1 -1
  354. package/transpiled/RTD/Route.d.ts +1 -1
  355. package/transpiled/RTD/Route.js +0 -1
  356. package/transpiled/RTD/Route.js.map +1 -1
  357. package/transpiled/RTD/Tree.d.ts +1 -1
  358. package/transpiled/RTD/Tree.js.map +1 -1
  359. package/transpiled/RTD/factory.js +5 -2
  360. package/transpiled/RTD/factory.js.map +1 -1
  361. package/transpiled/RTD/syntax/parse.js +34 -22
  362. package/transpiled/RTD/syntax/parse.js.map +1 -1
  363. package/transpiled/RTD/syntax/types.d.ts +5 -3
  364. package/transpiled/RTD/syntax/types.js +1 -1
  365. package/transpiled/RTD/syntax/types.js.map +1 -1
  366. package/transpiled/Remotes.d.ts +4 -4
  367. package/transpiled/Remotes.js +6 -5
  368. package/transpiled/Remotes.js.map +1 -1
  369. package/transpiled/Tenant.d.ts +5 -5
  370. package/transpiled/Tenant.js +2 -13
  371. package/transpiled/Tenant.js.map +1 -1
  372. package/transpiled/deployment.d.ts +1 -1
  373. package/transpiled/deployment.js +28 -20
  374. package/transpiled/deployment.js.map +1 -1
  375. package/transpiled/directives/auth/Anonymous.d.ts +2 -2
  376. package/transpiled/directives/auth/Anonymous.js +2 -2
  377. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  378. package/transpiled/directives/auth/Anyone.d.ts +6 -0
  379. package/transpiled/directives/auth/Anyone.js +14 -0
  380. package/transpiled/directives/auth/Anyone.js.map +1 -0
  381. package/transpiled/directives/auth/Authorization.d.ts +4 -3
  382. package/transpiled/directives/auth/Authorization.js +49 -22
  383. package/transpiled/directives/auth/Authorization.js.map +1 -1
  384. package/transpiled/directives/auth/Delegate.d.ts +5 -4
  385. package/transpiled/directives/auth/Delegate.js +10 -4
  386. package/transpiled/directives/auth/Delegate.js.map +1 -1
  387. package/transpiled/directives/auth/Echo.d.ts +4 -4
  388. package/transpiled/directives/auth/Echo.js +11 -4
  389. package/transpiled/directives/auth/Echo.js.map +1 -1
  390. package/transpiled/directives/auth/Federation.d.ts +16 -0
  391. package/transpiled/directives/auth/Federation.js +57 -0
  392. package/transpiled/directives/auth/Federation.js.map +1 -0
  393. package/transpiled/directives/auth/Id.d.ts +1 -1
  394. package/transpiled/directives/auth/Id.js.map +1 -1
  395. package/transpiled/directives/auth/Incept.d.ts +4 -3
  396. package/transpiled/directives/auth/Incept.js +23 -10
  397. package/transpiled/directives/auth/Incept.js.map +1 -1
  398. package/transpiled/directives/auth/Input.d.ts +14 -0
  399. package/transpiled/directives/auth/Input.js +49 -0
  400. package/transpiled/directives/auth/Input.js.map +1 -0
  401. package/transpiled/directives/auth/Role.d.ts +5 -2
  402. package/transpiled/directives/auth/Role.js +22 -18
  403. package/transpiled/directives/auth/Role.js.map +1 -1
  404. package/transpiled/directives/auth/Rule.d.ts +2 -4
  405. package/transpiled/directives/auth/Rule.js +2 -2
  406. package/transpiled/directives/auth/Rule.js.map +1 -1
  407. package/transpiled/directives/auth/Scheme.d.ts +2 -2
  408. package/transpiled/directives/auth/Scheme.js +4 -4
  409. package/transpiled/directives/auth/Scheme.js.map +1 -1
  410. package/transpiled/directives/auth/create.d.ts +2 -0
  411. package/transpiled/directives/auth/create.js +12 -0
  412. package/transpiled/directives/auth/create.js.map +1 -0
  413. package/transpiled/directives/auth/split.js +1 -1
  414. package/transpiled/directives/auth/split.js.map +1 -1
  415. package/transpiled/directives/auth/types.d.ts +8 -5
  416. package/transpiled/directives/cache/Cache.d.ts +3 -3
  417. package/transpiled/directives/cache/Cache.js +10 -4
  418. package/transpiled/directives/cache/Cache.js.map +1 -1
  419. package/transpiled/directives/cache/Control.d.ts +2 -1
  420. package/transpiled/directives/cache/Control.js +29 -12
  421. package/transpiled/directives/cache/Control.js.map +1 -1
  422. package/transpiled/directives/cors/CORS.js +3 -2
  423. package/transpiled/directives/cors/CORS.js.map +1 -1
  424. package/transpiled/directives/dev/Development.js +1 -1
  425. package/transpiled/directives/dev/Development.js.map +1 -1
  426. package/transpiled/directives/flow/Compose.d.ts +8 -0
  427. package/transpiled/directives/flow/Compose.js +74 -0
  428. package/transpiled/directives/flow/Compose.js.map +1 -0
  429. package/transpiled/directives/flow/Fetch.d.ts +12 -0
  430. package/transpiled/directives/flow/Fetch.js +58 -0
  431. package/transpiled/directives/flow/Fetch.js.map +1 -0
  432. package/transpiled/directives/flow/Flow.d.ts +10 -0
  433. package/transpiled/directives/flow/Flow.js +33 -0
  434. package/transpiled/directives/flow/Flow.js.map +1 -0
  435. package/transpiled/directives/flow/index.d.ts +2 -0
  436. package/transpiled/directives/flow/index.js +6 -0
  437. package/transpiled/directives/flow/index.js.map +1 -0
  438. package/transpiled/directives/flow/types.d.ts +6 -0
  439. package/transpiled/directives/flow/types.js.map +1 -0
  440. package/transpiled/directives/index.js +4 -2
  441. package/transpiled/directives/index.js.map +1 -1
  442. package/transpiled/directives/io/IO.js +1 -1
  443. package/transpiled/directives/io/IO.js.map +1 -1
  444. package/transpiled/directives/io/Input.js +4 -2
  445. package/transpiled/directives/io/Input.js.map +1 -1
  446. package/transpiled/directives/io/Output.js +2 -2
  447. package/transpiled/directives/io/Output.js.map +1 -1
  448. package/transpiled/directives/map/Authority.d.ts +6 -0
  449. package/transpiled/directives/map/Authority.js +19 -0
  450. package/transpiled/directives/map/Authority.js.map +1 -0
  451. package/transpiled/directives/map/Claims.d.ts +10 -0
  452. package/transpiled/directives/map/Claims.js +44 -0
  453. package/transpiled/directives/map/Claims.js.map +1 -0
  454. package/transpiled/directives/map/Directive.d.ts +3 -0
  455. package/transpiled/directives/map/Directive.js.map +1 -0
  456. package/transpiled/directives/map/Headers.d.ts +7 -0
  457. package/transpiled/directives/map/Headers.js +34 -0
  458. package/transpiled/directives/map/Headers.js.map +1 -0
  459. package/transpiled/directives/map/Language.d.ts +10 -0
  460. package/transpiled/directives/map/Language.js +38 -0
  461. package/transpiled/directives/map/Language.js.map +1 -0
  462. package/transpiled/directives/map/Languages.d.ts +4 -0
  463. package/transpiled/directives/map/Languages.js +17 -0
  464. package/transpiled/directives/map/Languages.js.map +1 -0
  465. package/transpiled/directives/map/Map.d.ts +13 -0
  466. package/transpiled/directives/map/Map.js +46 -0
  467. package/transpiled/directives/map/Map.js.map +1 -0
  468. package/transpiled/directives/map/Mapping.d.ts +13 -0
  469. package/transpiled/directives/map/Mapping.js +13 -0
  470. package/transpiled/directives/map/Mapping.js.map +1 -0
  471. package/transpiled/directives/{vary → map}/Properties.d.ts +2 -2
  472. package/transpiled/directives/{vary → map}/Properties.js +1 -3
  473. package/transpiled/directives/map/Properties.js.map +1 -0
  474. package/transpiled/directives/map/Segments.d.ts +6 -0
  475. package/transpiled/directives/map/Segments.js +25 -0
  476. package/transpiled/directives/map/Segments.js.map +1 -0
  477. package/transpiled/directives/map/index.d.ts +2 -0
  478. package/transpiled/directives/map/index.js +6 -0
  479. package/transpiled/directives/map/index.js.map +1 -0
  480. package/transpiled/directives/octets/Context.js +4 -24
  481. package/transpiled/directives/octets/Context.js.map +1 -1
  482. package/transpiled/directives/octets/Delete.js +8 -8
  483. package/transpiled/directives/octets/Delete.js.map +1 -1
  484. package/transpiled/directives/octets/{Fetch.d.ts → Get.d.ts} +5 -6
  485. package/transpiled/directives/octets/{Fetch.js → Get.js} +25 -29
  486. package/transpiled/directives/octets/Get.js.map +1 -0
  487. package/transpiled/directives/octets/Octets.js +9 -12
  488. package/transpiled/directives/octets/Octets.js.map +1 -1
  489. package/transpiled/directives/octets/{Store.d.ts → Put.d.ts} +6 -2
  490. package/transpiled/directives/octets/{Store.js → Put.js} +22 -26
  491. package/transpiled/directives/octets/Put.js.map +1 -0
  492. package/transpiled/directives/octets/Workflow.js +1 -1
  493. package/transpiled/directives/octets/Workflow.js.map +1 -1
  494. package/transpiled/directives/octets/bytes.d.ts +1 -0
  495. package/transpiled/directives/octets/bytes.js +21 -0
  496. package/transpiled/directives/octets/bytes.js.map +1 -0
  497. package/transpiled/directives/octets/schemas.d.ts +4 -8
  498. package/transpiled/directives/octets/schemas.js +3 -6
  499. package/transpiled/directives/octets/schemas.js.map +1 -1
  500. package/transpiled/directives/octets/workflows/Execution.d.ts +5 -1
  501. package/transpiled/directives/octets/workflows/Execution.js +44 -9
  502. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  503. package/transpiled/directives/octets/workflows/Workflow.d.ts +1 -1
  504. package/transpiled/directives/octets/workflows/Workflow.js +2 -1
  505. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  506. package/transpiled/directives/require/Directive.d.ts +4 -0
  507. package/transpiled/directives/require/Directive.js +3 -0
  508. package/transpiled/directives/require/Directive.js.map +1 -0
  509. package/transpiled/directives/require/Headers.d.ts +7 -0
  510. package/transpiled/directives/require/Headers.js +19 -0
  511. package/transpiled/directives/require/Headers.js.map +1 -0
  512. package/transpiled/directives/require/Require.d.ts +9 -0
  513. package/transpiled/directives/require/Require.js +27 -0
  514. package/transpiled/directives/require/Require.js.map +1 -0
  515. package/transpiled/directives/require/index.d.ts +2 -0
  516. package/transpiled/directives/require/index.js +6 -0
  517. package/transpiled/directives/require/index.js.map +1 -0
  518. package/transpiled/exceptions.d.ts +3 -2
  519. package/transpiled/exceptions.js +8 -1
  520. package/transpiled/exceptions.js.map +1 -1
  521. package/transpiled/manifest.js +10 -11
  522. package/transpiled/manifest.js.map +1 -1
  523. package/transpiled/root.js +16 -1
  524. package/transpiled/root.js.map +1 -1
  525. package/transpiled/schemas.d.ts +1 -1
  526. package/transpiled/schemas.js +2 -2
  527. package/transpiled/schemas.js.map +1 -1
  528. package/transpiled/tsconfig.tsbuildinfo +1 -1
  529. package/components/identity.basic/operations/create.d.ts +0 -10
  530. package/components/identity.basic/operations/create.js +0 -10
  531. package/components/identity.basic/operations/create.js.map +0 -1
  532. package/components/identity.basic/source/create.ts +0 -18
  533. package/components/identity.federation/operations/create.d.ts +0 -10
  534. package/components/identity.federation/operations/create.js +0 -15
  535. package/components/identity.federation/operations/create.js.map +0 -1
  536. package/components/identity.federation/operations/schemas.d.ts +0 -59
  537. package/components/identity.federation/operations/schemas.js +0 -9
  538. package/components/identity.federation/operations/schemas.js.map +0 -1
  539. package/components/identity.federation/operations/types.js.map +0 -1
  540. package/components/identity.federation/source/create.ts +0 -26
  541. package/components/identity.federation/source/schemas.ts +0 -61
  542. package/components/identity.tokens/operations/types.d.ts +0 -40
  543. package/components/identity.tokens/operations/types.js.map +0 -1
  544. package/components/identity.tokens/source/types.ts +0 -48
  545. package/components/octets.storage/operations/fetch.js +0 -46
  546. package/components/octets.storage/operations/list.js +0 -7
  547. package/components/octets.storage/operations/permute.js +0 -7
  548. package/components/octets.storage/operations/store.js +0 -11
  549. package/documentation/vary.md +0 -69
  550. package/features/steps/components/octets.tester/operations/diversify.js +0 -14
  551. package/features/vary.feature +0 -180
  552. package/schemas/octets/context.cos.yaml +0 -1
  553. package/schemas/octets/fetch.cos.yaml +0 -3
  554. package/schemas/octets/permute.cos.yaml +0 -1
  555. package/schemas/octets/store.cos.yaml +0 -3
  556. package/source/HTTP/Server.test.ts +0 -126
  557. package/source/directives/octets/Fetch.ts +0 -100
  558. package/source/directives/octets/List.ts +0 -72
  559. package/source/directives/octets/Permute.ts +0 -44
  560. package/source/directives/vary/Directive.ts +0 -6
  561. package/source/directives/vary/Embed.ts +0 -62
  562. package/source/directives/vary/Vary.ts +0 -48
  563. package/source/directives/vary/embeddings/Embedding.ts +0 -6
  564. package/source/directives/vary/embeddings/Header.ts +0 -32
  565. package/source/directives/vary/embeddings/Language.ts +0 -31
  566. package/source/directives/vary/embeddings/index.ts +0 -11
  567. package/source/directives/vary/index.ts +0 -3
  568. package/transpiled/directives/octets/Fetch.js.map +0 -1
  569. package/transpiled/directives/octets/List.d.ts +0 -16
  570. package/transpiled/directives/octets/List.js +0 -74
  571. package/transpiled/directives/octets/List.js.map +0 -1
  572. package/transpiled/directives/octets/Permute.d.ts +0 -11
  573. package/transpiled/directives/octets/Permute.js.map +0 -1
  574. package/transpiled/directives/octets/Store.js.map +0 -1
  575. package/transpiled/directives/vary/Directive.d.ts +0 -5
  576. package/transpiled/directives/vary/Directive.js.map +0 -1
  577. package/transpiled/directives/vary/Embed.d.ts +0 -10
  578. package/transpiled/directives/vary/Embed.js +0 -49
  579. package/transpiled/directives/vary/Embed.js.map +0 -1
  580. package/transpiled/directives/vary/Properties.js.map +0 -1
  581. package/transpiled/directives/vary/Vary.d.ts +0 -10
  582. package/transpiled/directives/vary/Vary.js +0 -36
  583. package/transpiled/directives/vary/Vary.js.map +0 -1
  584. package/transpiled/directives/vary/embeddings/Embedding.d.ts +0 -5
  585. package/transpiled/directives/vary/embeddings/Embedding.js.map +0 -1
  586. package/transpiled/directives/vary/embeddings/Header.d.ts +0 -7
  587. package/transpiled/directives/vary/embeddings/Header.js +0 -28
  588. package/transpiled/directives/vary/embeddings/Header.js.map +0 -1
  589. package/transpiled/directives/vary/embeddings/Language.d.ts +0 -7
  590. package/transpiled/directives/vary/embeddings/Language.js +0 -28
  591. package/transpiled/directives/vary/embeddings/Language.js.map +0 -1
  592. package/transpiled/directives/vary/embeddings/index.d.ts +0 -5
  593. package/transpiled/directives/vary/embeddings/index.js +0 -10
  594. package/transpiled/directives/vary/embeddings/index.js.map +0 -1
  595. package/transpiled/directives/vary/index.d.ts +0 -2
  596. package/transpiled/directives/vary/index.js +0 -6
  597. package/transpiled/directives/vary/index.js.map +0 -1
  598. /package/components/{identity.federation/operations → identity.tokens/operations/lib}/types.js +0 -0
  599. /package/schemas/octets/{list.cos.yaml → get.cos.yaml} +0 -0
  600. /package/{components/identity.tokens/operations → transpiled/directives/flow}/types.js +0 -0
  601. /package/transpiled/directives/{vary → map}/Directive.js +0 -0
@@ -1,10 +1,8 @@
1
1
  import { NotFound } from '../../HTTP'
2
2
  import { Context } from './Context'
3
- import { Store } from './Store'
4
- import { Fetch } from './Fetch'
5
- import { List } from './List'
3
+ import { Put } from './Put'
4
+ import { Get } from './Get'
6
5
  import { Delete } from './Delete'
7
- import { Permute } from './Permute'
8
6
  import { WorkflowDirective } from './Workflow'
9
7
  import type { Directive } from './Directive'
10
8
  import type { Output } from '../../io'
@@ -23,7 +21,7 @@ export class Octets implements DirectiveFamily<Directive> {
23
21
  const Class = DIRECTIVES[name]
24
22
 
25
23
  if (Class === undefined)
26
- throw new Error(`Directive '${name}' is not provided by the '${this.name}' family.`)
24
+ throw new Error(`Directive 'octets:${name}' is not implemented`)
27
25
 
28
26
  this.discovery ??= remotes.discover('octets', 'storage')
29
27
 
@@ -41,19 +39,19 @@ export class Octets implements DirectiveFamily<Directive> {
41
39
  else if (action === null)
42
40
  action = directive
43
41
  else
44
- throw new Error('Octets action is umbiguous.')
42
+ throw new Error('Octets action is ambiguous')
45
43
 
46
44
  if (action === null)
47
45
  return null
48
46
 
49
47
  // noinspection PointlessBooleanExpressionJS
50
48
  if (context === null)
51
- throw new Error('Octets context is not defined.')
49
+ throw new Error('Octets context is not defined')
52
50
 
53
51
  const targeted = input.request.url[input.request.url.length - 1] !== '/'
54
52
 
55
53
  if (targeted !== action.targeted)
56
- throw new NotFound(`Trailing slash is ${action.targeted ? 'redundant' : 'required'}.`)
54
+ throw new NotFound(`Trailing slash is ${action.targeted ? 'redundant' : 'required'}`)
57
55
 
58
56
  // noinspection JSObjectNullOrUndefined
59
57
  return await input.timing.capture(action.name, action.apply(context.storage, input, parameters))
@@ -62,11 +60,10 @@ export class Octets implements DirectiveFamily<Directive> {
62
60
 
63
61
  const DIRECTIVES: Record<string, Constructor> = {
64
62
  context: Context,
65
- store: Store,
66
- fetch: Fetch,
67
- list: List,
63
+ put: Put,
64
+ get: Get,
65
+ head: Get,
68
66
  delete: Delete,
69
- permute: Permute,
70
67
  workflow: WorkflowDirective
71
68
  }
72
69
 
@@ -1,24 +1,28 @@
1
1
  import { PassThrough } from 'node:stream'
2
2
  import { match } from 'matchacho'
3
- import { BadRequest, UnsupportedMediaType } from '../../HTTP'
3
+ import * as http from '../../HTTP'
4
4
  import { cors } from '../cors'
5
5
  import * as schemas from './schemas'
6
6
  import { Workflow } from './workflows'
7
7
  import { Directive } from './Directive'
8
+ import { toBytes } from './bytes'
8
9
  import type { Readable } from 'stream'
9
10
  import type { Parameter } from '../../RTD'
10
11
  import type { Unit } from './workflows'
11
12
  import type { Entry } from '@toa.io/extensions.storages'
12
13
  import type { Remotes } from '../../Remotes'
13
- import type { ErrorType } from 'error-value'
14
+ import type { Err } from 'error-value'
14
15
  import type { Component } from '@toa.io/core'
15
16
  import type { Output } from '../../io'
16
17
  import type { Input } from './types'
17
18
 
18
- export class Store extends Directive {
19
+ export class Put extends Directive {
19
20
  public readonly targeted = false
20
21
 
21
22
  private readonly accept?: string
23
+ private readonly limit: number
24
+ private readonly limitString: string
25
+ private readonly trust?: Array<string | RegExp>
22
26
  private readonly workflow?: Workflow
23
27
  private readonly discovery: Record<string, Promise<Component>> = {}
24
28
  private storage: Component | null = null
@@ -26,7 +30,8 @@ export class Store extends Directive {
26
30
  public constructor
27
31
  (options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
28
32
  super()
29
- schemas.store.validate(options)
33
+
34
+ schemas.put.validate<Options>(options)
30
35
 
31
36
  this.accept = match(options?.accept,
32
37
  String, (value: string) => value,
@@ -36,9 +41,16 @@ export class Store extends Directive {
36
41
  if (options?.workflow !== undefined)
37
42
  this.workflow = new Workflow(options.workflow, remotes)
38
43
 
44
+ if (options?.trust !== undefined)
45
+ this.trust = options.trust.map((value: string) =>
46
+ value.startsWith('/') ? new RegExp(value.slice(1, -1)) : value)
47
+
48
+ this.limitString = options?.limit ?? '64MiB'
49
+ this.limit = toBytes(this.limitString)
39
50
  this.discovery.storage = discovery
40
51
 
41
- cors.allow('content-meta')
52
+ cors.allow('content-attributes')
53
+ cors.allow('content-location')
42
54
  }
43
55
 
44
56
  public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
@@ -47,22 +59,17 @@ export class Store extends Directive {
47
59
  const request: StoreRequest = {
48
60
  input: {
49
61
  storage,
50
- request: input.request
62
+ request: input.request,
63
+ accept: this.accept,
64
+ limit: this.limit,
65
+ trust: this.trust
51
66
  }
52
67
  }
53
68
 
54
- const meta = input.request.headers['content-meta']
55
-
56
- if (this.accept !== undefined)
57
- request.input.accept = this.accept
58
-
59
- if (meta !== undefined)
60
- request.input.meta = this.parseMeta(meta)
61
-
62
- const entry = await this.storage.invoke<Entry>('store', request)
69
+ const entry = await this.storage.invoke<Entry>('put', request)
63
70
 
64
71
  return match<Output>(entry,
65
- Error, (error: ErrorType) => this.throw(error),
72
+ Error, (error: Err) => this.throw(error),
66
73
  () => this.reply(input, storage, entry, parameters))
67
74
  }
68
75
 
@@ -87,33 +94,24 @@ export class Store extends Directive {
87
94
  return stream
88
95
  }
89
96
 
90
- private throw (error: ErrorType): never {
97
+ private throw (error: Err): never {
91
98
  throw match(error.code,
92
- 'NOT_ACCEPTABLE', () => new UnsupportedMediaType(),
93
- 'TYPE_MISMATCH', () => new BadRequest(),
99
+ 'NOT_ACCEPTABLE', () => new http.UnsupportedMediaType(),
100
+ 'TYPE_MISMATCH', () => new http.BadRequest(),
101
+ 'LIMIT_EXCEEDED', () => new http.RequestEntityTooLarge(`Size limit is ${this.limitString}`),
102
+ 'LOCATION_UNTRUSTED', () => new http.Forbidden(error.message),
103
+ 'LOCATION_LENGTH', () => new http.BadRequest(error.message),
104
+ 'LOCATION_UNAVAILABLE', () => new http.NotFound(error.message),
105
+ 'INVALID_ID', () => new http.BadRequest(error.message),
94
106
  error)
95
107
  }
96
-
97
- private parseMeta (value: string | string[]): Record<string, string> {
98
- if (Array.isArray(value))
99
- value = value.join(',')
100
-
101
- const meta: Record<string, string> = {}
102
-
103
- for (const pair of value.split(',')) {
104
- const eq = pair.indexOf('=')
105
- const key = (eq === -1 ? pair : pair.slice(0, eq)).trim()
106
-
107
- meta[key] = eq === -1 ? 'true' : pair.slice(eq + 1).trim()
108
- }
109
-
110
- return meta
111
- }
112
108
  }
113
109
 
114
110
  export interface Options {
115
111
  accept?: string | string[]
112
+ limit?: string
116
113
  workflow?: Unit[] | Unit
114
+ trust?: string[]
117
115
  }
118
116
 
119
117
  interface StoreRequest {
@@ -121,6 +119,8 @@ interface StoreRequest {
121
119
  storage: string
122
120
  request: Input['request']
123
121
  accept?: string
124
- meta?: Record<string, string>
122
+ limit?: number
123
+ trust?: Array<string | RegExp>
124
+ attributes?: Record<string, string>
125
125
  }
126
126
  }
@@ -29,7 +29,7 @@ export class WorkflowDirective extends Directive {
29
29
  public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
30
30
  this.storage ??= await this.discovery
31
31
 
32
- const entry = await this.storage.invoke<Maybe<Entry>>('get',
32
+ const entry = await this.storage.invoke<Maybe<Entry>>('head',
33
33
  {
34
34
  input: {
35
35
  storage,
@@ -0,0 +1,30 @@
1
+ import { toBytes } from './bytes'
2
+
3
+ it('should parse bytes', async () => {
4
+ expect(toBytes('10')).toBe(10)
5
+ expect(toBytes('10B')).toBe(10)
6
+ })
7
+
8
+ it('should parse binary prefix', async () => {
9
+ expect(toBytes('10KiB')).toBe(10240)
10
+ expect(toBytes('10MiB')).toBe(10485760)
11
+ expect(toBytes('10GiB')).toBe(10737418240)
12
+ expect(toBytes('10TiB')).toBe(10995116277760)
13
+ })
14
+
15
+ it('should parse decimal prefix', async () => {
16
+ expect(toBytes('10kB')).toBe(10000)
17
+ expect(toBytes('10MB')).toBe(10000000)
18
+ expect(toBytes('10GB')).toBe(10000000000)
19
+ expect(toBytes('10TB')).toBe(10000000000000)
20
+ })
21
+
22
+ it('should parse incorrect value as binary', async () => {
23
+ expect(toBytes('10b')).toBe(10)
24
+ expect(toBytes('10kb')).toBe(10240)
25
+ expect(toBytes('10kib')).toBe(10240)
26
+ expect(toBytes('10mb')).toBe(10485760)
27
+ expect(toBytes('10gb')).toBe(10737418240)
28
+ expect(toBytes('10tib')).toBe(10995116277760)
29
+ expect(toBytes('10Mb')).toBe(10485760)
30
+ })
@@ -0,0 +1,18 @@
1
+ import assert from 'node:assert'
2
+
3
+ export function toBytes (input: string): number {
4
+ const match = RX.exec(input)
5
+
6
+ assert.ok(match !== null, `Invalid bytes format: ${input}`)
7
+
8
+ const value = parseFloat(match.groups!.value)
9
+ const prefix = match.groups!.prefix?.[0].toLowerCase() ?? ''
10
+ const binary = match.groups!.binary !== undefined || match.groups!.unit === 'b'
11
+ const base = binary ? 1024 : 1000
12
+ const power = POWERS.indexOf(prefix)
13
+
14
+ return value * Math.pow(base, power)
15
+ }
16
+
17
+ const POWERS = ['', 'k', 'm', 'g', 't']
18
+ const RX = /^(?<value>(\d+)(\.\d+)?)(?<prefix>[kmgt](?<binary>i)?)?(?<unit>b)?$/i
@@ -1,8 +1,7 @@
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'
3
+ import type { Options as GetOptions } from './Get'
4
+ import type { Options as PutOptions } from './Put'
6
5
  import type { Options as DeleteOptions } from './Delete'
7
6
  import type { Schema } from '@toa.io/schemas'
8
7
  import type { Unit } from './workflows'
@@ -10,10 +9,7 @@ import type { Unit } from './workflows'
10
9
  const path = resolve(__dirname, '../../../schemas/octets')
11
10
  const namespace = schemas.namespace(path)
12
11
 
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')
12
+ export const put: Schema<PutOptions | null> = namespace.schema('put')
13
+ export const get: Schema<GetOptions | null> = namespace.schema('get')
16
14
  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
15
  export const workflow: Schema<Unit[] | Unit> = namespace.schema('workflow')
@@ -1,4 +1,5 @@
1
- import { Readable } from 'stream'
1
+ import { Readable } from 'node:stream'
2
+ import { console } from 'openspan'
2
3
  import type { Unit } from './Workflow'
3
4
  import type { Remotes } from '../../../Remotes'
4
5
  import type { Component } from '@toa.io/core'
@@ -39,25 +40,68 @@ export class Execution extends Readable {
39
40
 
40
41
  private async execute (unit: Unit): Promise<void> {
41
42
  const promises = Object.entries(unit).map(async ([step, endpoint]) => {
42
- const result = await this.call(endpoint).catch((error: Error) => console.error(error))
43
+ try {
44
+ const result = await this.call(endpoint)
43
45
 
44
- if (result instanceof Error) {
45
- this.push({ error: { step, ...result } })
46
- this.interrupted = true
47
- } else
48
- this.push({ [step]: result ?? null })
46
+ if (result instanceof Readable)
47
+ return await this.stream(step, result)
48
+
49
+ this.report(step, result)
50
+ } catch (e: unknown) {
51
+ this.exception(step, e)
52
+ }
49
53
  })
50
54
 
51
55
  await Promise.all(promises)
52
56
  }
53
57
 
58
+ private async stream (step: string, stream: Readable): Promise<void> {
59
+ try {
60
+ for await (const result of stream)
61
+ this.report(step, result, false)
62
+
63
+ this.report(step, undefined, true)
64
+ } catch (e: unknown) {
65
+ this.exception(step, e)
66
+ }
67
+ }
68
+
69
+ private report (step: string, result?: Maybe<unknown>, completed = true): void {
70
+ const report: Report = { step }
71
+
72
+ if (completed)
73
+ report.status = 'completed'
74
+
75
+ if (result instanceof Error) {
76
+ report.error = result
77
+ this.interrupted = true
78
+ } else if (result !== undefined)
79
+ report.output = result
80
+
81
+ this.push(report)
82
+ }
83
+
84
+ private exception (step: string, error: unknown): void {
85
+ this.push({ step, status: 'exception' } satisfies Report)
86
+ this.interrupted = true
87
+
88
+ console.error('Workflow exception', error as Error)
89
+ }
90
+
54
91
  private async call (endpoint: string): Promise<Maybe<unknown>> {
92
+ let task = false
93
+
94
+ if (endpoint.startsWith('task:')) {
95
+ endpoint = endpoint.slice(5)
96
+ task = true
97
+ }
98
+
55
99
  const [operation, component, namespace = 'default'] = endpoint.split('.').reverse()
56
100
  const key = `${namespace}.${component}`
57
101
 
58
102
  this.components[key] ??= await this.discover(key, namespace, component)
59
103
 
60
- return await this.components[key].invoke(operation, { input: this.context })
104
+ return this.components[key].invoke(operation, { input: this.context, task })
61
105
  }
62
106
 
63
107
  private async discover (key: string, namespace: string, component: string): Promise<Component> {
@@ -69,8 +113,16 @@ export class Execution extends Readable {
69
113
  }
70
114
 
71
115
  export interface Context {
116
+ authority: string
72
117
  storage: string
73
118
  path: string
74
119
  entry: Entry
75
120
  parameters: Record<string, string>
76
121
  }
122
+
123
+ interface Report {
124
+ step: string
125
+ status?: 'completed' | 'exception'
126
+ output?: unknown
127
+ error?: Error
128
+ }
@@ -1,10 +1,10 @@
1
1
  import { posix } from 'node:path'
2
2
  import { match } from 'matchacho'
3
3
  import { Execution } from './Execution'
4
+ import type { Entry } from '@toa.io/extensions.storages'
4
5
  import type { Context } from './Execution'
5
6
  import type { Parameter } from '../../../RTD'
6
7
  import type { Input } from '../types'
7
- import type { Entry } from '@toa.io/extensions.storages'
8
8
  import type { Remotes } from '../../../Remotes'
9
9
 
10
10
  export class Workflow {
@@ -20,15 +20,15 @@ export class Workflow {
20
20
  }
21
21
 
22
22
  // eslint-disable-next-line max-params
23
- public execute
24
- (input: Input, storage: string, entry: Entry, params: Parameter[]): Execution {
23
+ public execute (input: Input, storage: string, entry: Entry, params: Parameter[]): Execution {
25
24
  const path = posix.join(input.request.url, entry.id)
25
+ const authority = input.authority
26
26
  const parameters: Record<string, string> = {}
27
27
 
28
28
  for (const { name, value } of params)
29
29
  parameters[name] = value
30
30
 
31
- const context: Context = { storage, path, entry, parameters }
31
+ const context: Context = { authority, storage, path, entry, parameters }
32
32
 
33
33
  return new Execution(context, this.units, this.remotes)
34
34
  }
@@ -0,0 +1,5 @@
1
+ import type { Input } from '../../io'
2
+
3
+ export interface Directive {
4
+ preflight: (context: Input) => void
5
+ }
@@ -0,0 +1,20 @@
1
+ import { BadRequest } from '../../HTTP'
2
+ import type { Input } from '../../io'
3
+ import type { Directive } from './Directive'
4
+
5
+ export class Headers implements Directive {
6
+ private readonly headers: string[]
7
+
8
+ public constructor (headers: string[]) {
9
+ if (!Array.isArray(headers))
10
+ headers = [headers]
11
+
12
+ this.headers = headers
13
+ }
14
+
15
+ public preflight (context: Input): void {
16
+ for (const header of this.headers)
17
+ if (context.request.headers[header] === undefined)
18
+ throw new BadRequest(`Header required: ${header}`)
19
+ }
20
+ }
@@ -0,0 +1,28 @@
1
+ import assert from 'node:assert'
2
+ import { Headers } from './Headers'
3
+ import type { Input } from '../../io'
4
+ import type { Directive } from './Directive'
5
+ import type { DirectiveFamily } from '../../RTD'
6
+
7
+ export class Require implements DirectiveFamily {
8
+ public readonly name = 'require'
9
+ public readonly mandatory = false
10
+
11
+ public create (name: string, value: unknown): Directive {
12
+ assert.ok(name in directives, `Unknown directive: require:${name}`)
13
+
14
+ return new directives[name](value)
15
+ }
16
+
17
+ public preflight (instances: Directive[], context: Input): null {
18
+ for (const instance of instances)
19
+ instance.preflight(context)
20
+
21
+ return null
22
+ }
23
+ }
24
+
25
+ const directives: Record<string, new (value: any) => Directive> = {
26
+ header: Headers,
27
+ headers: Headers
28
+ }
@@ -0,0 +1,3 @@
1
+ import { Require } from './Require'
2
+
3
+ export const req = new Require()
@@ -1,16 +1,24 @@
1
- import { type Exception } from '@toa.io/core'
2
1
  import { match } from 'matchacho'
2
+ import { console } from 'openspan'
3
3
  import * as http from './HTTP'
4
+ import { Exception as HTTPException } from './HTTP'
5
+ import type { Exception } from '@toa.io/core'
4
6
 
5
- export function rethrow (exception: Exception): void {
6
- // see /runtime/core/src/exceptions.js
7
+ export function rethrow (exception: Exception | HTTPException): void {
8
+ if (exception instanceof HTTPException)
9
+ throw exception
7
10
 
8
- throw match<Error>(exception.code,
11
+ // see /runtime/core/src/exceptions.js
12
+ throw match(exception.code,
9
13
  badRequest, () => new http.BadRequest(exception.message),
10
14
  302, NOT_FOUND,
11
15
  303, PRECONDITION_FAILED,
12
- 306, () => new http.Conflict(exception.message),
13
- () => exception)
16
+ 306, () => new http.Conflict(),
17
+ () => {
18
+ console.error('Request processing exception', exception)
19
+
20
+ return exception
21
+ })
14
22
  }
15
23
 
16
24
  function badRequest (code: number): boolean {
@@ -12,7 +12,7 @@ export function manifest (declaration: object, manifest: Manifest): Node {
12
12
 
13
13
  const node = parse(declaration, shortcuts)
14
14
 
15
- concretize(node, manifest)
15
+ specify(node, manifest)
16
16
  schemas.node.validate(node)
17
17
 
18
18
  return node
@@ -22,29 +22,28 @@ function wrap (declaration: object, namespace: string, name: string): object {
22
22
  const path = (namespace === undefined || namespace === 'default' ? '' : '/' + namespace) +
23
23
  '/' + name
24
24
 
25
- return { [path]: { protected: true, ...declaration } }
25
+ return { [path]: declaration }
26
26
  }
27
27
 
28
- function concretize (node: Node, manifest: Manifest): void {
28
+ function specify (node: Node, manifest: Manifest): void {
29
29
  for (const route of node.routes) {
30
30
  for (const method of route.node.methods)
31
- concretizeMethod(method, manifest)
31
+ specifyMethod(method, manifest)
32
32
 
33
- concretize(route.node, manifest)
33
+ specify(route.node, manifest)
34
34
  }
35
35
  }
36
36
 
37
- function concretizeMethod (method: Method, manifest: Manifest): void {
38
- if (method.mapping === undefined)
37
+ function specifyMethod (method: Method, manifest: Manifest): void {
38
+ if (method.mapping?.endpoint === undefined)
39
39
  return
40
40
 
41
41
  const operation = manifest.operations[method.mapping.endpoint]
42
42
 
43
- if (operation === undefined)
44
- throw new Error(`Operation '${method.mapping.endpoint}' not found`)
43
+ assert.ok(operation !== undefined, `Operation '${method.mapping.endpoint}' not found`)
45
44
 
46
- if (method.mapping.query === undefined && operation.query !== false)
47
- method.mapping.query = {} as unknown as Query // schema will substitute default values
45
+ if (method.mapping.query === undefined)
46
+ method.mapping.query = operation.query === false ? null : {} as unknown as Query
48
47
 
49
48
  method.mapping.namespace = manifest.namespace
50
49
  method.mapping.component = manifest.name
package/source/root.ts CHANGED
@@ -21,15 +21,30 @@ const PREDEFINED: syntax.Node = {
21
21
  {
22
22
  verb: 'GET',
23
23
  directives: [
24
+ {
25
+ family: 'io',
26
+ name: 'output',
27
+ value: ['id', 'roles']
28
+ },
24
29
  {
25
30
  family: 'auth',
26
31
  name: 'echo',
27
32
  value: null
28
- },
33
+ }
34
+ ]
35
+ },
36
+ {
37
+ verb: 'POST',
38
+ directives: [
29
39
  {
30
40
  family: 'io',
31
41
  name: 'output',
32
42
  value: ['id', 'roles']
43
+ },
44
+ {
45
+ family: 'auth',
46
+ name: 'incept',
47
+ value: null
33
48
  }
34
49
  ]
35
50
  }
package/source/schemas.ts CHANGED
@@ -9,5 +9,5 @@ const path = resolve(__dirname, '../schemas')
9
9
  const namespace = schemas.namespace(path)
10
10
 
11
11
  export const querystring: Schema<Query> = namespace.schema('querystring')
12
- export const annotaion: Schema<Annotation> = namespace.schema('annotation')
12
+ export const annotation: Schema<Annotation> = namespace.schema('annotation')
13
13
  export const node: Schema<Node> = namespace.schema('node')
@@ -1,8 +1,8 @@
1
1
  export interface Annotation {
2
- host?: string;
2
+ authorities: Record<string, string>;
3
3
  class?: string;
4
4
  annotations?: Record<string, string>;
5
- debug: boolean;
6
- trace: boolean;
5
+ debug?: boolean;
6
+ trace?: boolean;
7
7
  '/'?: object;
8
8
  }
@@ -4,4 +4,5 @@ export interface Branch {
4
4
  component: string;
5
5
  isolated: boolean;
6
6
  node: RTD.Node;
7
+ version: string;
7
8
  }
@@ -4,7 +4,6 @@ export declare class Composition extends Connector {
4
4
  private readonly boot;
5
5
  constructor(boot: Bootloader);
6
6
  protected open(): Promise<void>;
7
- protected dispose(): void;
8
7
  }
9
8
  export declare function components(): Components;
10
9
  interface Components {
@@ -15,10 +15,6 @@ class Composition extends core_1.Connector {
15
15
  const composition = await this.boot.composition(paths);
16
16
  await composition.connect();
17
17
  this.depends(composition);
18
- console.info('Composition complete.');
19
- }
20
- dispose() {
21
- console.info('Composition shutdown complete.');
22
18
  }
23
19
  }
24
20
  exports.Composition = Composition;
@@ -1 +1 @@
1
- {"version":3,"file":"Composition.js","sourceRoot":"","sources":["../source/Composition.ts"],"names":[],"mappings":";;;AAAA,qCAAkD;AAClD,yCAAmC;AACnC,uCAAwC;AAGxC,MAAa,WAAY,SAAQ,gBAAS;IACvB,IAAI,CAAY;IAEjC,YAAoB,IAAgB;QAClC,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAEkB,KAAK,CAAC,IAAI;QAC3B,MAAM,KAAK,GAAG,IAAI,EAAE,CAAA;QACpB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAEtD,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;QAE3B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAEzB,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;IACvC,CAAC;IAEkB,OAAO;QACxB,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;IAChD,CAAC;CACF;AAtBD,kCAsBC;AAED,SAAS,IAAI;IACX,OAAO,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,mBAAO,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,SAAS,OAAO;IACd,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAE1D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;AACvD,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QACzC,KAAK,CAAC,IAAI,CAAC,IAAA,mBAAO,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IACvC,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AAC1B,CAAC;AAVD,gCAUC;AAOD,MAAM,IAAI,GAAG,IAAA,mBAAO,EAAC,SAAS,EAAE,gBAAgB,CAAC,CAAA"}
1
+ {"version":3,"file":"Composition.js","sourceRoot":"","sources":["../source/Composition.ts"],"names":[],"mappings":";;;AAAA,qCAAkD;AAClD,yCAAmC;AACnC,uCAAwC;AAGxC,MAAa,WAAY,SAAQ,gBAAS;IACvB,IAAI,CAAY;IAEjC,YAAoB,IAAgB;QAClC,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAEkB,KAAK,CAAC,IAAI;QAC3B,MAAM,KAAK,GAAG,IAAI,EAAE,CAAA;QACpB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAEtD,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;QAE3B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAC3B,CAAC;CACF;AAhBD,kCAgBC;AAED,SAAS,IAAI;IACX,OAAO,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,mBAAO,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,SAAS,OAAO;IACd,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAE1D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;AACvD,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QACzC,KAAK,CAAC,IAAI,CAAC,IAAA,mBAAO,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IACvC,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AAC1B,CAAC;AAVD,gCAUC;AAOD,MAAM,IAAI,GAAG,IAAA,mBAAO,EAAC,SAAS,EAAE,gBAAgB,CAAC,CAAA"}
@@ -3,5 +3,6 @@ export type Context = RTD.Context<Extension>;
3
3
  interface Extension {
4
4
  namespace: string;
5
5
  component: string;
6
+ version: string;
6
7
  }
7
8
  export {};