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

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