@toa.io/extensions.exposition 1.0.0-alpha.14 → 1.0.0-alpha.143

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 (675) hide show
  1. package/components/context.toa.yaml +2 -2
  2. package/components/identity.bans/manifest.toa.yaml +1 -1
  3. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -1
  4. package/components/identity.basic/manifest.toa.yaml +43 -10
  5. package/components/identity.basic/operations/authenticate.d.ts +5 -1
  6. package/components/identity.basic/operations/authenticate.js +7 -4
  7. package/components/identity.basic/operations/authenticate.js.map +1 -1
  8. package/components/identity.basic/operations/check.d.ts +7 -0
  9. package/components/identity.basic/operations/check.js +15 -0
  10. package/components/identity.basic/operations/check.js.map +1 -0
  11. package/components/identity.basic/operations/incept.d.ts +12 -0
  12. package/components/identity.basic/operations/incept.js +26 -0
  13. package/components/identity.basic/operations/incept.js.map +1 -0
  14. package/components/identity.basic/operations/transit.d.ts +4 -4
  15. package/components/identity.basic/operations/transit.js +8 -6
  16. package/components/identity.basic/operations/transit.js.map +1 -1
  17. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  18. package/components/identity.basic/operations/types.d.ts +8 -4
  19. package/components/identity.basic/source/authenticate.ts +18 -7
  20. package/components/identity.basic/source/check.ts +20 -0
  21. package/components/identity.basic/source/incept.ts +38 -0
  22. package/components/identity.basic/source/transit.ts +11 -9
  23. package/components/identity.basic/source/types.ts +8 -4
  24. package/components/identity.federation/manifest.toa.yaml +65 -19
  25. package/components/identity.federation/operations/authenticate.d.ts +13 -2
  26. package/components/identity.federation/operations/authenticate.js +11 -10
  27. package/components/identity.federation/operations/authenticate.js.map +1 -1
  28. package/components/identity.federation/operations/decode.d.ts +2 -0
  29. package/{transpiled/directives/octets/Permute.js → components/identity.federation/operations/decode.js} +7 -32
  30. package/components/identity.federation/operations/decode.js.map +1 -0
  31. package/components/identity.federation/operations/incept.d.ts +10 -0
  32. package/components/identity.federation/operations/incept.js +14 -0
  33. package/components/identity.federation/operations/incept.js.map +1 -0
  34. package/components/identity.federation/operations/lib/assertions-as-values.js +4 -2
  35. package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -1
  36. package/components/identity.federation/operations/lib/get.d.ts +1 -0
  37. package/components/identity.federation/operations/lib/get.js +64 -0
  38. package/components/identity.federation/operations/lib/get.js.map +1 -0
  39. package/components/identity.federation/operations/lib/jwt.d.ts +5 -5
  40. package/components/identity.federation/operations/lib/jwt.js +35 -19
  41. package/components/identity.federation/operations/lib/jwt.js.map +1 -1
  42. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  43. package/components/identity.federation/operations/types/configuration.d.ts +15 -0
  44. package/components/identity.federation/operations/types/configuration.js +3 -0
  45. package/components/identity.federation/operations/types/configuration.js.map +1 -0
  46. package/components/identity.federation/operations/{types.d.ts → types/context.d.ts} +15 -13
  47. package/{transpiled/directives/vary/embeddings/Embedding.js → components/identity.federation/operations/types/context.js} +1 -1
  48. package/components/identity.federation/operations/types/context.js.map +1 -0
  49. package/components/identity.federation/operations/types/entity.d.ts +6 -0
  50. package/components/identity.federation/operations/types/entity.js +3 -0
  51. package/components/identity.federation/operations/types/entity.js.map +1 -0
  52. package/components/identity.federation/operations/types/index.d.ts +3 -0
  53. package/components/identity.federation/operations/types/index.js +20 -0
  54. package/components/identity.federation/operations/types/index.js.map +1 -0
  55. package/components/identity.federation/source/authenticate.ts +26 -16
  56. package/components/identity.federation/source/decode.ts +9 -0
  57. package/components/identity.federation/source/incept.ts +26 -0
  58. package/components/identity.federation/source/lib/assertions-as-values.ts +5 -2
  59. package/components/identity.federation/source/lib/get.ts +82 -0
  60. package/components/identity.federation/source/lib/jwt.test.ts +127 -4
  61. package/components/identity.federation/source/lib/jwt.ts +48 -21
  62. package/components/identity.federation/source/types/configuration.ts +16 -0
  63. package/components/identity.federation/source/{types.ts → types/context.ts} +16 -13
  64. package/components/identity.federation/source/types/entity.ts +6 -0
  65. package/components/identity.federation/source/types/index.ts +3 -0
  66. package/components/identity.federation/tsconfig.json +5 -4
  67. package/components/identity.keys/manifest.toa.yaml +57 -0
  68. package/components/identity.keys/operations/create.d.ts +22 -0
  69. package/components/identity.keys/operations/create.js +16 -0
  70. package/components/identity.keys/operations/create.js.map +1 -0
  71. package/components/identity.keys/operations/tsconfig.tsbuildinfo +1 -0
  72. package/components/identity.keys/source/create.ts +35 -0
  73. package/components/identity.keys/tsconfig.json +9 -0
  74. package/components/identity.passkeys/manifest.toa.yaml +268 -0
  75. package/components/identity.passkeys/operations/authenticate.d.ts +16 -0
  76. package/components/identity.passkeys/operations/authenticate.js +34 -0
  77. package/components/identity.passkeys/operations/authenticate.js.map +1 -0
  78. package/components/identity.passkeys/operations/challenge.d.ts +35 -0
  79. package/components/identity.passkeys/operations/challenge.js +73 -0
  80. package/components/identity.passkeys/operations/challenge.js.map +1 -0
  81. package/components/identity.passkeys/operations/create.d.ts +19 -0
  82. package/components/identity.passkeys/operations/create.js +58 -0
  83. package/components/identity.passkeys/operations/create.js.map +1 -0
  84. package/components/identity.passkeys/operations/delete.d.ts +8 -0
  85. package/components/identity.passkeys/operations/delete.js +12 -0
  86. package/components/identity.passkeys/operations/delete.js.map +1 -0
  87. package/components/identity.passkeys/operations/lib/const.d.ts +1 -0
  88. package/components/identity.passkeys/operations/lib/const.js +5 -0
  89. package/components/identity.passkeys/operations/lib/const.js.map +1 -0
  90. package/components/identity.passkeys/operations/list.d.ts +7 -0
  91. package/components/identity.passkeys/operations/list.js +15 -0
  92. package/components/identity.passkeys/operations/list.js.map +1 -0
  93. package/components/identity.passkeys/operations/tsconfig.tsbuildinfo +1 -0
  94. package/components/identity.passkeys/operations/types/Configuration.d.ts +6 -0
  95. package/components/identity.passkeys/operations/types/Configuration.js +3 -0
  96. package/components/identity.passkeys/operations/types/Configuration.js.map +1 -0
  97. package/components/identity.passkeys/operations/types/Context.d.ts +16 -0
  98. package/components/identity.passkeys/operations/types/Context.js +3 -0
  99. package/components/identity.passkeys/operations/types/Context.js.map +1 -0
  100. package/components/identity.passkeys/operations/types/Passkey.d.ts +13 -0
  101. package/components/identity.passkeys/operations/types/Passkey.js +3 -0
  102. package/components/identity.passkeys/operations/types/Passkey.js.map +1 -0
  103. package/components/identity.passkeys/operations/types/index.d.ts +2 -0
  104. package/components/identity.passkeys/operations/types/index.js +3 -0
  105. package/components/identity.passkeys/operations/types/index.js.map +1 -0
  106. package/components/identity.passkeys/operations/use.d.ts +16 -0
  107. package/components/identity.passkeys/operations/use.js +57 -0
  108. package/components/identity.passkeys/operations/use.js.map +1 -0
  109. package/components/identity.passkeys/source/authenticate.ts +48 -0
  110. package/components/identity.passkeys/source/challenge.ts +115 -0
  111. package/components/identity.passkeys/source/create.ts +77 -0
  112. package/components/identity.passkeys/source/delete.ts +15 -0
  113. package/components/identity.passkeys/source/lib/const.ts +1 -0
  114. package/components/identity.passkeys/source/list.ts +17 -0
  115. package/components/identity.passkeys/source/types/Configuration.ts +6 -0
  116. package/components/identity.passkeys/source/types/Context.ts +17 -0
  117. package/components/identity.passkeys/source/types/Passkey.ts +14 -0
  118. package/components/identity.passkeys/source/types/index.ts +2 -0
  119. package/components/identity.passkeys/source/use.ts +75 -0
  120. package/components/identity.passkeys/tsconfig.json +9 -0
  121. package/components/identity.roles/manifest.toa.yaml +3 -1
  122. package/components/identity.roles/operations/grant.js +2 -2
  123. package/components/identity.roles/operations/grant.js.map +1 -1
  124. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  125. package/components/identity.roles/source/grant.ts +2 -2
  126. package/components/identity.tokens/manifest.toa.yaml +97 -13
  127. package/components/identity.tokens/operations/authenticate.d.ts +3 -3
  128. package/components/identity.tokens/operations/authenticate.js +15 -11
  129. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  130. package/components/identity.tokens/operations/decrypt.d.ts +12 -3
  131. package/components/identity.tokens/operations/decrypt.js +62 -17
  132. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  133. package/components/identity.tokens/operations/encrypt.d.ts +3 -3
  134. package/components/identity.tokens/operations/encrypt.js +24 -7
  135. package/components/identity.tokens/operations/encrypt.js.map +1 -1
  136. package/components/identity.tokens/operations/issue.d.ts +24 -0
  137. package/components/identity.tokens/operations/issue.js +59 -0
  138. package/components/identity.tokens/operations/issue.js.map +1 -0
  139. package/components/identity.tokens/operations/lib/index.d.ts +2 -0
  140. package/components/identity.tokens/operations/lib/index.js +19 -0
  141. package/components/identity.tokens/operations/lib/index.js.map +1 -0
  142. package/components/identity.tokens/operations/lib/pad.d.ts +1 -0
  143. package/components/identity.tokens/operations/lib/pad.js +5 -0
  144. package/components/identity.tokens/operations/lib/pad.js.map +1 -0
  145. package/components/identity.tokens/operations/lib/types.d.ts +74 -0
  146. package/components/identity.tokens/operations/lib/types.js.map +1 -0
  147. package/components/identity.tokens/operations/revoke.d.ts +2 -2
  148. package/components/identity.tokens/operations/revoke.js.map +1 -1
  149. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  150. package/components/identity.tokens/source/authenticate.test.ts +22 -9
  151. package/components/identity.tokens/source/authenticate.ts +18 -13
  152. package/components/identity.tokens/source/decrypt.test.ts +33 -18
  153. package/components/identity.tokens/source/decrypt.ts +91 -20
  154. package/components/identity.tokens/source/encrypt.test.ts +47 -13
  155. package/components/identity.tokens/source/encrypt.ts +36 -11
  156. package/components/identity.tokens/source/issue.ts +82 -0
  157. package/components/identity.tokens/source/lib/index.ts +2 -0
  158. package/components/identity.tokens/source/lib/pad.ts +1 -0
  159. package/components/identity.tokens/source/lib/paseto.test.ts +16 -0
  160. package/components/identity.tokens/source/lib/types.ts +85 -0
  161. package/components/identity.tokens/source/revoke.ts +2 -2
  162. package/components/octets.storage/manifest.toa.yaml +11 -11
  163. package/components/octets.storage/operations/get.js +3 -3
  164. package/components/octets.storage/operations/head.js +7 -0
  165. package/components/octets.storage/operations/put.js +135 -0
  166. package/documentation/access.md +83 -31
  167. package/documentation/authorities.md +48 -0
  168. package/documentation/cache.md +8 -1
  169. package/documentation/components.md +123 -51
  170. package/documentation/dev.md +30 -0
  171. package/documentation/flow.md +44 -0
  172. package/documentation/identity.md +55 -23
  173. package/documentation/introspection.md +82 -0
  174. package/documentation/map.md +86 -0
  175. package/documentation/octets.md +122 -69
  176. package/documentation/passkeys.md +4 -0
  177. package/documentation/protocol.md +11 -4
  178. package/documentation/query.md +29 -4
  179. package/documentation/require.md +15 -0
  180. package/documentation/tree.md +13 -0
  181. package/features/access.feature +122 -9
  182. package/features/annotation.feature +1 -0
  183. package/features/auth.assert.feature +57 -0
  184. package/features/auth.claims.feature +171 -0
  185. package/features/auth.incept.feature +120 -0
  186. package/features/auth.input.feature +59 -0
  187. package/features/auth.issue.feature +32 -0
  188. package/features/authorities.basic.feature +141 -0
  189. package/features/authorities.feature +32 -0
  190. package/features/authorities.federation.feature +100 -0
  191. package/features/authorities.tokens.feature +117 -0
  192. package/features/body.feature +2 -0
  193. package/features/cache.feature +164 -5
  194. package/features/cors.feature +8 -2
  195. package/features/debug.feature +34 -0
  196. package/features/dev.feature +56 -0
  197. package/features/directives.feature +3 -0
  198. package/features/dynamic.feature +48 -0
  199. package/features/errors.feature +29 -6
  200. package/features/etag.feature +109 -1
  201. package/features/flow.feature +148 -0
  202. package/features/identity.bans.feature +12 -3
  203. package/features/identity.basic.feature +104 -21
  204. package/features/identity.feature +18 -6
  205. package/features/identity.federation.feature +125 -18
  206. package/features/identity.roles.feature +60 -20
  207. package/features/identity.tokens.feature +12 -44
  208. package/features/identtiy.tokens.custom.feature +247 -0
  209. package/features/interruptions.feature +19 -0
  210. package/features/introspection.feature +153 -0
  211. package/features/io.feature +9 -1
  212. package/features/map.feature +305 -0
  213. package/features/methods.feature +47 -0
  214. package/features/octets.cloudinary.feature +71 -0
  215. package/features/octets.download.feature +189 -0
  216. package/features/octets.entries.feature +13 -55
  217. package/features/octets.feature +90 -114
  218. package/features/octets.head.feature +40 -0
  219. package/features/octets.location.feature +83 -0
  220. package/features/octets.meta.feature +65 -15
  221. package/features/octets.workflows.feature +339 -66
  222. package/features/passkeys.feature +66 -0
  223. package/features/probes.feature +14 -0
  224. package/features/{queries.feature → query.feature} +77 -2
  225. package/features/realtime.feature +34 -0
  226. package/features/require.feature +67 -0
  227. package/features/response.feature +34 -2
  228. package/features/routes.feature +93 -2
  229. package/features/server.feature +21 -0
  230. package/features/steps/.env.example +3 -0
  231. package/features/steps/Common.ts +4 -0
  232. package/features/steps/Gateway.ts +26 -7
  233. package/features/steps/HTTP.ts +25 -2
  234. package/features/steps/IdP.ts +64 -2
  235. package/features/steps/Identity.ts +51 -0
  236. package/features/steps/Parameters.ts +45 -2
  237. package/features/steps/Realtime.ts +151 -0
  238. package/features/steps/components/echo/manifest.toa.yaml +12 -0
  239. package/features/steps/components/echo/operations/echo.js +7 -0
  240. package/features/steps/components/echo/operations/parameters.js +7 -0
  241. package/features/steps/components/echo/operations/ping.js +7 -0
  242. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  243. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  244. package/features/steps/components/greeter/manifest.toa.yaml +0 -1
  245. package/features/steps/components/octets.tester/manifest.toa.yaml +25 -3
  246. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  247. package/features/steps/components/octets.tester/operations/bar.js +0 -1
  248. package/features/steps/components/octets.tester/operations/baz.js +0 -2
  249. package/features/steps/components/octets.tester/operations/echo.js +1 -1
  250. package/features/steps/components/octets.tester/operations/foo.js +1 -2
  251. package/features/steps/components/octets.tester/operations/id.js +7 -0
  252. package/features/steps/components/octets.tester/operations/identity.js +7 -0
  253. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  254. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  255. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  256. package/features/steps/components/pots/manifest.toa.yaml +12 -4
  257. package/features/steps/components/sequences/manifest.toa.yaml +0 -1
  258. package/features/steps/components/users/manifest.toa.yaml +4 -2
  259. package/features/steps/components/users/operations/create.js +15 -0
  260. package/features/steps/components/users.properties/manifest.toa.yaml +1 -2
  261. package/features/streams.feature +5 -0
  262. package/features/timestamps.feature +41 -0
  263. package/features/timing.feature +4 -1
  264. package/package.json +25 -13
  265. package/readme.md +19 -14
  266. package/schemas/annotation.cos.yaml +1 -1
  267. package/schemas/method.cos.yaml +2 -1
  268. package/schemas/node.cos.yaml +2 -0
  269. package/schemas/octets/put.cos.yaml +28 -0
  270. package/schemas/query.cos.yaml +4 -10
  271. package/source/Annotation.ts +3 -3
  272. package/source/Branch.ts +1 -0
  273. package/source/Composition.ts +0 -6
  274. package/source/Context.ts +1 -0
  275. package/source/Directive.test.ts +1 -1
  276. package/source/Directive.ts +14 -8
  277. package/source/Endpoint.ts +70 -17
  278. package/source/Factory.ts +22 -13
  279. package/source/Gateway.ts +73 -19
  280. package/source/HTTP/Context.ts +29 -7
  281. package/source/HTTP/Server.ts +119 -49
  282. package/source/HTTP/exceptions.ts +12 -0
  283. package/source/HTTP/formats/index.ts +3 -3
  284. package/source/HTTP/messages.test.ts +46 -2
  285. package/source/HTTP/messages.ts +44 -9
  286. package/source/Introspection.ts +11 -0
  287. package/source/Mapping.ts +68 -21
  288. package/source/Query.test.ts +3 -3
  289. package/source/Query.ts +123 -33
  290. package/source/RTD/Context.ts +1 -1
  291. package/source/RTD/Endpoint.ts +3 -0
  292. package/source/RTD/Method.ts +16 -0
  293. package/source/RTD/Node.ts +29 -13
  294. package/source/RTD/Route.ts +5 -4
  295. package/source/RTD/Tree.ts +2 -2
  296. package/source/RTD/factory.ts +4 -1
  297. package/source/RTD/syntax/parse.test.ts +1 -1
  298. package/source/RTD/syntax/parse.ts +37 -24
  299. package/source/RTD/syntax/types.ts +6 -4
  300. package/source/Remotes.ts +7 -6
  301. package/source/Tenant.ts +6 -12
  302. package/source/deployment.ts +33 -23
  303. package/source/directives/auth/Anonymous.ts +3 -3
  304. package/source/directives/auth/Anyone.ts +13 -0
  305. package/source/directives/auth/Assert.ts +30 -0
  306. package/source/directives/auth/Authorization.ts +68 -26
  307. package/source/directives/auth/Delegate.ts +9 -5
  308. package/source/directives/auth/Echo.ts +16 -6
  309. package/source/directives/auth/Federation.ts +84 -0
  310. package/source/directives/auth/Id.ts +1 -1
  311. package/source/directives/auth/Incept.ts +62 -24
  312. package/source/directives/auth/Input.ts +72 -0
  313. package/source/directives/auth/Role.ts +5 -19
  314. package/source/directives/auth/Rule.ts +3 -5
  315. package/source/directives/auth/Scheme.ts +5 -5
  316. package/source/directives/auth/create.ts +11 -0
  317. package/source/directives/auth/schemes.ts +2 -0
  318. package/source/directives/auth/split.ts +1 -1
  319. package/source/directives/auth/types.ts +10 -5
  320. package/source/directives/cache/Cache.ts +15 -6
  321. package/source/directives/cache/Control.ts +45 -19
  322. package/source/directives/cors/CORS.ts +3 -2
  323. package/source/directives/dev/Development.ts +12 -7
  324. package/source/directives/dev/Sleep.ts +40 -0
  325. package/source/directives/dev/types.ts +1 -1
  326. package/source/directives/flow/Compose.ts +92 -0
  327. package/source/directives/flow/Fetch.ts +86 -0
  328. package/source/directives/flow/Flow.ts +42 -0
  329. package/source/directives/flow/index.ts +3 -0
  330. package/source/directives/flow/types.ts +7 -0
  331. package/source/directives/index.ts +4 -2
  332. package/source/directives/io/IO.ts +1 -1
  333. package/source/directives/io/Input.ts +8 -5
  334. package/source/directives/io/Output.ts +5 -4
  335. package/source/directives/map/Authority.ts +15 -0
  336. package/source/directives/map/Claims.ts +58 -0
  337. package/source/directives/map/Directive.ts +4 -0
  338. package/source/directives/map/Headers.ts +38 -0
  339. package/source/directives/map/Language.ts +42 -0
  340. package/source/directives/map/Languages.ts +11 -0
  341. package/source/directives/map/Map.ts +61 -0
  342. package/source/directives/map/Mapping.ts +19 -0
  343. package/source/directives/{vary → map}/Properties.ts +2 -4
  344. package/source/directives/map/Segments.ts +33 -0
  345. package/source/directives/map/index.ts +3 -0
  346. package/source/directives/octets/Context.ts +3 -2
  347. package/source/directives/octets/Delete.ts +21 -17
  348. package/source/directives/octets/Get.ts +86 -0
  349. package/source/directives/octets/Octets.ts +9 -12
  350. package/source/directives/octets/{Store.ts → Put.ts} +52 -38
  351. package/source/directives/octets/Workflow.ts +9 -3
  352. package/source/directives/octets/bytes.test.ts +30 -0
  353. package/source/directives/octets/bytes.ts +18 -0
  354. package/source/directives/octets/schemas.ts +4 -8
  355. package/source/directives/octets/types.ts +2 -0
  356. package/source/directives/octets/workflows/Execution.ts +61 -8
  357. package/source/directives/octets/workflows/Workflow.ts +17 -7
  358. package/source/directives/octets/workflows/index.ts +1 -1
  359. package/source/directives/require/Directive.ts +5 -0
  360. package/source/directives/require/Headers.ts +20 -0
  361. package/source/directives/require/Require.ts +28 -0
  362. package/source/directives/require/index.ts +3 -0
  363. package/source/exceptions.ts +2 -1
  364. package/source/manifest.ts +10 -11
  365. package/source/root.ts +16 -1
  366. package/source/schemas.ts +1 -1
  367. package/transpiled/Annotation.d.ts +3 -3
  368. package/transpiled/Branch.d.ts +1 -0
  369. package/transpiled/Composition.d.ts +0 -1
  370. package/transpiled/Composition.js +0 -4
  371. package/transpiled/Composition.js.map +1 -1
  372. package/transpiled/Context.d.ts +1 -0
  373. package/transpiled/Directive.js +13 -8
  374. package/transpiled/Directive.js.map +1 -1
  375. package/transpiled/Endpoint.d.ts +6 -4
  376. package/transpiled/Endpoint.js +46 -9
  377. package/transpiled/Endpoint.js.map +1 -1
  378. package/transpiled/Factory.d.ts +3 -2
  379. package/transpiled/Factory.js +18 -10
  380. package/transpiled/Factory.js.map +1 -1
  381. package/transpiled/Gateway.d.ts +3 -0
  382. package/transpiled/Gateway.js +55 -12
  383. package/transpiled/Gateway.js.map +1 -1
  384. package/transpiled/HTTP/Context.d.ts +9 -2
  385. package/transpiled/HTTP/Context.js +19 -6
  386. package/transpiled/HTTP/Context.js.map +1 -1
  387. package/transpiled/HTTP/Server.d.ts +15 -4
  388. package/transpiled/HTTP/Server.js +86 -42
  389. package/transpiled/HTTP/Server.js.map +1 -1
  390. package/transpiled/HTTP/exceptions.d.ts +6 -0
  391. package/transpiled/HTTP/exceptions.js +13 -1
  392. package/transpiled/HTTP/exceptions.js.map +1 -1
  393. package/transpiled/HTTP/formats/index.js +3 -3
  394. package/transpiled/HTTP/formats/index.js.map +1 -1
  395. package/transpiled/HTTP/messages.d.ts +2 -1
  396. package/transpiled/HTTP/messages.js +40 -8
  397. package/transpiled/HTTP/messages.js.map +1 -1
  398. package/transpiled/Introspection.d.ts +9 -0
  399. package/transpiled/Introspection.js +3 -0
  400. package/transpiled/Introspection.js.map +1 -0
  401. package/transpiled/Mapping.d.ts +11 -2
  402. package/transpiled/Mapping.js +50 -19
  403. package/transpiled/Mapping.js.map +1 -1
  404. package/transpiled/Query.d.ts +10 -1
  405. package/transpiled/Query.js +87 -30
  406. package/transpiled/Query.js.map +1 -1
  407. package/transpiled/RTD/Context.d.ts +1 -1
  408. package/transpiled/RTD/Endpoint.d.ts +1 -0
  409. package/transpiled/RTD/Method.d.ts +4 -0
  410. package/transpiled/RTD/Method.js +11 -0
  411. package/transpiled/RTD/Method.js.map +1 -1
  412. package/transpiled/RTD/Node.d.ts +4 -1
  413. package/transpiled/RTD/Node.js +23 -12
  414. package/transpiled/RTD/Node.js.map +1 -1
  415. package/transpiled/RTD/Route.d.ts +1 -1
  416. package/transpiled/RTD/Route.js +0 -1
  417. package/transpiled/RTD/Route.js.map +1 -1
  418. package/transpiled/RTD/Tree.d.ts +1 -1
  419. package/transpiled/RTD/Tree.js.map +1 -1
  420. package/transpiled/RTD/factory.js +4 -1
  421. package/transpiled/RTD/factory.js.map +1 -1
  422. package/transpiled/RTD/syntax/parse.js +34 -22
  423. package/transpiled/RTD/syntax/parse.js.map +1 -1
  424. package/transpiled/RTD/syntax/types.d.ts +5 -3
  425. package/transpiled/RTD/syntax/types.js +1 -1
  426. package/transpiled/RTD/syntax/types.js.map +1 -1
  427. package/transpiled/Remotes.d.ts +4 -4
  428. package/transpiled/Remotes.js +6 -5
  429. package/transpiled/Remotes.js.map +1 -1
  430. package/transpiled/Tenant.d.ts +5 -4
  431. package/transpiled/Tenant.js +2 -7
  432. package/transpiled/Tenant.js.map +1 -1
  433. package/transpiled/deployment.d.ts +1 -1
  434. package/transpiled/deployment.js +28 -20
  435. package/transpiled/deployment.js.map +1 -1
  436. package/transpiled/directives/auth/Anonymous.d.ts +2 -2
  437. package/transpiled/directives/auth/Anonymous.js +2 -2
  438. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  439. package/transpiled/directives/auth/Anyone.d.ts +6 -0
  440. package/transpiled/directives/auth/Anyone.js +14 -0
  441. package/transpiled/directives/auth/Anyone.js.map +1 -0
  442. package/transpiled/directives/auth/Assert.d.ts +6 -0
  443. package/transpiled/directives/auth/Assert.js +53 -0
  444. package/transpiled/directives/auth/Assert.js.map +1 -0
  445. package/transpiled/directives/auth/Authorization.d.ts +4 -3
  446. package/transpiled/directives/auth/Authorization.js +52 -23
  447. package/transpiled/directives/auth/Authorization.js.map +1 -1
  448. package/transpiled/directives/auth/Delegate.d.ts +5 -4
  449. package/transpiled/directives/auth/Delegate.js +7 -3
  450. package/transpiled/directives/auth/Delegate.js.map +1 -1
  451. package/transpiled/directives/auth/Echo.d.ts +4 -4
  452. package/transpiled/directives/auth/Echo.js +11 -4
  453. package/transpiled/directives/auth/Echo.js.map +1 -1
  454. package/transpiled/directives/auth/Federation.d.ts +16 -0
  455. package/transpiled/directives/auth/Federation.js +57 -0
  456. package/transpiled/directives/auth/Federation.js.map +1 -0
  457. package/transpiled/directives/auth/Id.d.ts +1 -1
  458. package/transpiled/directives/auth/Id.js.map +1 -1
  459. package/transpiled/directives/auth/Incept.d.ts +7 -5
  460. package/transpiled/directives/auth/Incept.js +47 -18
  461. package/transpiled/directives/auth/Incept.js.map +1 -1
  462. package/transpiled/directives/auth/Input.d.ts +13 -0
  463. package/transpiled/directives/auth/Input.js +49 -0
  464. package/transpiled/directives/auth/Input.js.map +1 -0
  465. package/transpiled/directives/auth/Role.d.ts +1 -1
  466. package/transpiled/directives/auth/Role.js +5 -15
  467. package/transpiled/directives/auth/Role.js.map +1 -1
  468. package/transpiled/directives/auth/Rule.d.ts +2 -4
  469. package/transpiled/directives/auth/Rule.js +2 -2
  470. package/transpiled/directives/auth/Rule.js.map +1 -1
  471. package/transpiled/directives/auth/Scheme.d.ts +2 -2
  472. package/transpiled/directives/auth/Scheme.js +4 -4
  473. package/transpiled/directives/auth/Scheme.js.map +1 -1
  474. package/transpiled/directives/auth/create.d.ts +2 -0
  475. package/transpiled/directives/auth/create.js +14 -0
  476. package/transpiled/directives/auth/create.js.map +1 -0
  477. package/transpiled/directives/auth/schemes.d.ts +1 -0
  478. package/transpiled/directives/auth/schemes.js +2 -1
  479. package/transpiled/directives/auth/schemes.js.map +1 -1
  480. package/transpiled/directives/auth/split.js +1 -1
  481. package/transpiled/directives/auth/split.js.map +1 -1
  482. package/transpiled/directives/auth/types.d.ts +8 -5
  483. package/transpiled/directives/cache/Cache.d.ts +3 -3
  484. package/transpiled/directives/cache/Cache.js +12 -4
  485. package/transpiled/directives/cache/Cache.js.map +1 -1
  486. package/transpiled/directives/cache/Control.d.ts +3 -2
  487. package/transpiled/directives/cache/Control.js +32 -15
  488. package/transpiled/directives/cache/Control.js.map +1 -1
  489. package/transpiled/directives/cors/CORS.js +3 -2
  490. package/transpiled/directives/cors/CORS.js.map +1 -1
  491. package/transpiled/directives/dev/Development.d.ts +1 -1
  492. package/transpiled/directives/dev/Development.js +13 -7
  493. package/transpiled/directives/dev/Development.js.map +1 -1
  494. package/transpiled/directives/dev/Sleep.d.ts +8 -0
  495. package/transpiled/directives/dev/Sleep.js +36 -0
  496. package/transpiled/directives/dev/Sleep.js.map +1 -0
  497. package/transpiled/directives/dev/types.d.ts +1 -1
  498. package/transpiled/directives/flow/Compose.d.ts +9 -0
  499. package/transpiled/directives/flow/Compose.js +94 -0
  500. package/transpiled/directives/flow/Compose.js.map +1 -0
  501. package/transpiled/directives/flow/Fetch.d.ts +12 -0
  502. package/transpiled/directives/flow/Fetch.js +58 -0
  503. package/transpiled/directives/flow/Fetch.js.map +1 -0
  504. package/transpiled/directives/flow/Flow.d.ts +10 -0
  505. package/transpiled/directives/flow/Flow.js +33 -0
  506. package/transpiled/directives/flow/Flow.js.map +1 -0
  507. package/transpiled/directives/flow/index.d.ts +2 -0
  508. package/transpiled/directives/flow/index.js +6 -0
  509. package/transpiled/directives/flow/index.js.map +1 -0
  510. package/transpiled/directives/flow/types.d.ts +6 -0
  511. package/transpiled/directives/flow/types.js.map +1 -0
  512. package/transpiled/directives/index.js +4 -2
  513. package/transpiled/directives/index.js.map +1 -1
  514. package/transpiled/directives/io/IO.js +1 -1
  515. package/transpiled/directives/io/IO.js.map +1 -1
  516. package/transpiled/directives/io/Input.js +4 -2
  517. package/transpiled/directives/io/Input.js.map +1 -1
  518. package/transpiled/directives/io/Output.js +2 -2
  519. package/transpiled/directives/io/Output.js.map +1 -1
  520. package/transpiled/directives/map/Authority.d.ts +6 -0
  521. package/transpiled/directives/map/Authority.js +19 -0
  522. package/transpiled/directives/map/Authority.js.map +1 -0
  523. package/transpiled/directives/map/Claims.d.ts +10 -0
  524. package/transpiled/directives/map/Claims.js +44 -0
  525. package/transpiled/directives/map/Claims.js.map +1 -0
  526. package/transpiled/directives/map/Directive.d.ts +3 -0
  527. package/transpiled/directives/map/Directive.js.map +1 -0
  528. package/transpiled/directives/map/Headers.d.ts +7 -0
  529. package/transpiled/directives/map/Headers.js +34 -0
  530. package/transpiled/directives/map/Headers.js.map +1 -0
  531. package/transpiled/directives/map/Language.d.ts +10 -0
  532. package/transpiled/directives/map/Language.js +38 -0
  533. package/transpiled/directives/map/Language.js.map +1 -0
  534. package/transpiled/directives/map/Languages.d.ts +4 -0
  535. package/transpiled/directives/map/Languages.js +17 -0
  536. package/transpiled/directives/map/Languages.js.map +1 -0
  537. package/transpiled/directives/map/Map.d.ts +13 -0
  538. package/transpiled/directives/map/Map.js +46 -0
  539. package/transpiled/directives/map/Map.js.map +1 -0
  540. package/transpiled/directives/map/Mapping.d.ts +13 -0
  541. package/transpiled/directives/map/Mapping.js +13 -0
  542. package/transpiled/directives/map/Mapping.js.map +1 -0
  543. package/transpiled/directives/{vary → map}/Properties.d.ts +2 -2
  544. package/transpiled/directives/{vary → map}/Properties.js +1 -3
  545. package/transpiled/directives/map/Properties.js.map +1 -0
  546. package/transpiled/directives/map/Segments.d.ts +6 -0
  547. package/transpiled/directives/map/Segments.js +30 -0
  548. package/transpiled/directives/map/Segments.js.map +1 -0
  549. package/transpiled/directives/map/index.d.ts +2 -0
  550. package/transpiled/directives/map/index.js +6 -0
  551. package/transpiled/directives/map/index.js.map +1 -0
  552. package/transpiled/directives/octets/Context.js +4 -24
  553. package/transpiled/directives/octets/Context.js.map +1 -1
  554. package/transpiled/directives/octets/Delete.js +15 -12
  555. package/transpiled/directives/octets/Delete.js.map +1 -1
  556. package/transpiled/directives/octets/{Fetch.d.ts → Get.d.ts} +5 -6
  557. package/transpiled/directives/octets/{Fetch.js → Get.js} +25 -29
  558. package/transpiled/directives/octets/Get.js.map +1 -0
  559. package/transpiled/directives/octets/Octets.js +9 -12
  560. package/transpiled/directives/octets/Octets.js.map +1 -1
  561. package/transpiled/directives/octets/{Store.d.ts → Put.d.ts} +8 -2
  562. package/transpiled/directives/octets/{Store.js → Put.js} +33 -27
  563. package/transpiled/directives/octets/Put.js.map +1 -0
  564. package/transpiled/directives/octets/Workflow.js +7 -2
  565. package/transpiled/directives/octets/Workflow.js.map +1 -1
  566. package/transpiled/directives/octets/bytes.d.ts +1 -0
  567. package/transpiled/directives/octets/bytes.js +21 -0
  568. package/transpiled/directives/octets/bytes.js.map +1 -0
  569. package/transpiled/directives/octets/schemas.d.ts +4 -8
  570. package/transpiled/directives/octets/schemas.js +3 -6
  571. package/transpiled/directives/octets/schemas.js.map +1 -1
  572. package/transpiled/directives/octets/types.d.ts +2 -0
  573. package/transpiled/directives/octets/workflows/Execution.d.ts +6 -1
  574. package/transpiled/directives/octets/workflows/Execution.js +44 -9
  575. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  576. package/transpiled/directives/octets/workflows/Workflow.d.ts +8 -3
  577. package/transpiled/directives/octets/workflows/Workflow.js +9 -4
  578. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  579. package/transpiled/directives/octets/workflows/index.d.ts +1 -1
  580. package/transpiled/directives/octets/workflows/index.js.map +1 -1
  581. package/transpiled/directives/require/Directive.d.ts +4 -0
  582. package/transpiled/directives/require/Directive.js +3 -0
  583. package/transpiled/directives/require/Directive.js.map +1 -0
  584. package/transpiled/directives/require/Headers.d.ts +7 -0
  585. package/transpiled/directives/require/Headers.js +19 -0
  586. package/transpiled/directives/require/Headers.js.map +1 -0
  587. package/transpiled/directives/require/Require.d.ts +9 -0
  588. package/transpiled/directives/require/Require.js +27 -0
  589. package/transpiled/directives/require/Require.js.map +1 -0
  590. package/transpiled/directives/require/index.d.ts +2 -0
  591. package/transpiled/directives/require/index.js +6 -0
  592. package/transpiled/directives/require/index.js.map +1 -0
  593. package/transpiled/exceptions.js +2 -1
  594. package/transpiled/exceptions.js.map +1 -1
  595. package/transpiled/manifest.js +10 -11
  596. package/transpiled/manifest.js.map +1 -1
  597. package/transpiled/root.js +16 -1
  598. package/transpiled/root.js.map +1 -1
  599. package/transpiled/schemas.d.ts +1 -1
  600. package/transpiled/schemas.js +2 -2
  601. package/transpiled/schemas.js.map +1 -1
  602. package/transpiled/tsconfig.tsbuildinfo +1 -1
  603. package/components/identity.basic/operations/create.d.ts +0 -10
  604. package/components/identity.basic/operations/create.js +0 -10
  605. package/components/identity.basic/operations/create.js.map +0 -1
  606. package/components/identity.basic/source/create.ts +0 -18
  607. package/components/identity.federation/operations/create.d.ts +0 -10
  608. package/components/identity.federation/operations/create.js +0 -15
  609. package/components/identity.federation/operations/create.js.map +0 -1
  610. package/components/identity.federation/operations/schemas.d.ts +0 -59
  611. package/components/identity.federation/operations/schemas.js +0 -9
  612. package/components/identity.federation/operations/schemas.js.map +0 -1
  613. package/components/identity.federation/operations/types.js.map +0 -1
  614. package/components/identity.federation/source/create.ts +0 -26
  615. package/components/identity.federation/source/schemas.ts +0 -61
  616. package/components/identity.tokens/operations/types.d.ts +0 -39
  617. package/components/identity.tokens/operations/types.js.map +0 -1
  618. package/components/identity.tokens/source/types.ts +0 -47
  619. package/components/octets.storage/operations/fetch.js +0 -46
  620. package/components/octets.storage/operations/list.js +0 -7
  621. package/components/octets.storage/operations/permute.js +0 -7
  622. package/components/octets.storage/operations/store.js +0 -11
  623. package/documentation/vary.md +0 -69
  624. package/features/steps/components/octets.tester/operations/diversify.js +0 -14
  625. package/features/vary.feature +0 -180
  626. package/schemas/octets/context.cos.yaml +0 -1
  627. package/schemas/octets/fetch.cos.yaml +0 -3
  628. package/schemas/octets/permute.cos.yaml +0 -1
  629. package/schemas/octets/store.cos.yaml +0 -3
  630. package/source/HTTP/Server.test.ts +0 -126
  631. package/source/directives/octets/Fetch.ts +0 -100
  632. package/source/directives/octets/List.ts +0 -72
  633. package/source/directives/octets/Permute.ts +0 -44
  634. package/source/directives/vary/Directive.ts +0 -6
  635. package/source/directives/vary/Embed.ts +0 -62
  636. package/source/directives/vary/Vary.ts +0 -48
  637. package/source/directives/vary/embeddings/Embedding.ts +0 -6
  638. package/source/directives/vary/embeddings/Header.ts +0 -32
  639. package/source/directives/vary/embeddings/Language.ts +0 -31
  640. package/source/directives/vary/embeddings/index.ts +0 -11
  641. package/source/directives/vary/index.ts +0 -3
  642. package/transpiled/directives/octets/Fetch.js.map +0 -1
  643. package/transpiled/directives/octets/List.d.ts +0 -16
  644. package/transpiled/directives/octets/List.js +0 -74
  645. package/transpiled/directives/octets/List.js.map +0 -1
  646. package/transpiled/directives/octets/Permute.d.ts +0 -11
  647. package/transpiled/directives/octets/Permute.js.map +0 -1
  648. package/transpiled/directives/octets/Store.js.map +0 -1
  649. package/transpiled/directives/vary/Directive.d.ts +0 -5
  650. package/transpiled/directives/vary/Directive.js.map +0 -1
  651. package/transpiled/directives/vary/Embed.d.ts +0 -10
  652. package/transpiled/directives/vary/Embed.js +0 -49
  653. package/transpiled/directives/vary/Embed.js.map +0 -1
  654. package/transpiled/directives/vary/Properties.js.map +0 -1
  655. package/transpiled/directives/vary/Vary.d.ts +0 -10
  656. package/transpiled/directives/vary/Vary.js +0 -36
  657. package/transpiled/directives/vary/Vary.js.map +0 -1
  658. package/transpiled/directives/vary/embeddings/Embedding.d.ts +0 -5
  659. package/transpiled/directives/vary/embeddings/Embedding.js.map +0 -1
  660. package/transpiled/directives/vary/embeddings/Header.d.ts +0 -7
  661. package/transpiled/directives/vary/embeddings/Header.js +0 -28
  662. package/transpiled/directives/vary/embeddings/Header.js.map +0 -1
  663. package/transpiled/directives/vary/embeddings/Language.d.ts +0 -7
  664. package/transpiled/directives/vary/embeddings/Language.js +0 -28
  665. package/transpiled/directives/vary/embeddings/Language.js.map +0 -1
  666. package/transpiled/directives/vary/embeddings/index.d.ts +0 -5
  667. package/transpiled/directives/vary/embeddings/index.js +0 -10
  668. package/transpiled/directives/vary/embeddings/index.js.map +0 -1
  669. package/transpiled/directives/vary/index.d.ts +0 -2
  670. package/transpiled/directives/vary/index.js +0 -6
  671. package/transpiled/directives/vary/index.js.map +0 -1
  672. /package/components/{identity.federation/operations → identity.tokens/operations/lib}/types.js +0 -0
  673. /package/schemas/octets/{list.cos.yaml → get.cos.yaml} +0 -0
  674. /package/{components/identity.tokens/operations → transpiled/directives/flow}/types.js +0 -0
  675. /package/transpiled/directives/{vary → map}/Directive.js +0 -0
@@ -0,0 +1,40 @@
1
+ import assert from 'node:assert'
2
+ import { setTimeout } from 'node:timers/promises'
3
+ import { console } from 'openspan'
4
+ import { cors } from '../cors'
5
+ import { BadRequest } from '../../HTTP'
6
+ import type { Directive } from './types'
7
+ import type { Input, Output } from '../../io'
8
+
9
+ export class Sleep implements Directive {
10
+ private static warned = false
11
+ private readonly maximum: number
12
+
13
+ public constructor (value: number) {
14
+ assert.ok(Number.isInteger(value), '`dev:sleep` directive value must be an integer')
15
+
16
+ if (!Sleep.warned) {
17
+ console.warn(`Sleep directive is enabled (maximum: ${value}ms)`)
18
+ Sleep.warned = true
19
+ }
20
+
21
+ cors.allow('sleep')
22
+ this.maximum = value
23
+ }
24
+
25
+ public async apply (input: Input): Promise<Output> {
26
+ const value = input.request.headers.sleep as string | undefined
27
+
28
+ if (value === undefined)
29
+ return null
30
+
31
+ const duration = Number.parseInt(value)
32
+
33
+ if (Number.isNaN(duration) || duration < 0 || duration > this.maximum)
34
+ throw new BadRequest('Invalid sleep duration')
35
+
36
+ await setTimeout(duration)
37
+
38
+ return null
39
+ }
40
+ }
@@ -1,5 +1,5 @@
1
1
  import type { Input, Output } from '../../io'
2
2
 
3
3
  export interface Directive {
4
- apply: (input: Input) => Output
4
+ apply: (input: Input) => Promise<Output> | Output
5
5
  }
@@ -0,0 +1,92 @@
1
+ import { once } from 'node:events'
2
+ import * as assert from 'node:assert'
3
+ import { Readable } from 'node:stream'
4
+ import { console } from 'openspan'
5
+ import type { Directive } from './types'
6
+ import type { Input as Context } from '../../io'
7
+ import type { OutgoingMessage } from '../../HTTP'
8
+
9
+ export class Compose implements Directive {
10
+ private readonly expressions: Expression[]
11
+
12
+ public constructor (composition: any) {
13
+ this.expressions = build(composition)
14
+ }
15
+
16
+ public attach (context: Context): void {
17
+ context.pipelines.response.push(async (message: OutgoingMessage) => {
18
+ if (!(message.body instanceof Readable)) {
19
+ console.warn('Response body is not a stream, skipping composition')
20
+
21
+ return
22
+ }
23
+
24
+ assert.ok(message.body instanceof Readable, 'Response body is not a stream')
25
+
26
+ // @ts-expect-error -- objectMode is not defined in the type definition
27
+ assert.ok(message.body._readableState.objectMode, 'Response stream is not in object mode')
28
+
29
+ const $ = await this.compose(message.body)
30
+
31
+ message.body = this.execute($)
32
+ })
33
+ }
34
+
35
+ private async compose (stream: Readable): Promise<unknown[]> {
36
+ const $: unknown[] = []
37
+
38
+ stream.on('data', (data) => $.push(data))
39
+
40
+ await once(stream, 'end')
41
+
42
+ return $
43
+ }
44
+
45
+ private execute ($: unknown[]): unknown {
46
+ let exception: Error | undefined
47
+
48
+ for (const expression of this.expressions)
49
+ try {
50
+ return expression($)
51
+ } catch (e: unknown) {
52
+ exception = e as Error
53
+ console.debug('Chunks composition failed', { cause: exception.message })
54
+ }
55
+
56
+ throw exception!
57
+ }
58
+ }
59
+
60
+ function build (composition: any): Expression[] {
61
+ return Array.isArray(composition)
62
+ ? composition.map((variant) => compile(variant as object | string))
63
+ : [compile(composition as object | string)]
64
+ }
65
+
66
+ function compile (composition: object | string): Expression {
67
+ const text = typeof composition === 'string'
68
+ ? `return ${composition}`
69
+ : `return ${json(composition)}`
70
+
71
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval,no-new-func
72
+ return new Function('$', text) as Expression
73
+ }
74
+
75
+ function json (node: object | string): string {
76
+ if (typeof node === 'string')
77
+ if (node.startsWith('\\'))
78
+ return `"${node}"`
79
+ else
80
+ return node
81
+
82
+ if (Array.isArray(node))
83
+ return `[${node.map((v) => json(v as object | string)).join(',')}]`
84
+
85
+ if (node.constructor !== Object)
86
+ return JSON.stringify(node)
87
+
88
+ return '{' + Object.entries(node)
89
+ .map(([key, value]) => `"${key}": ${json(value as object | string)}`).join(',') + '}'
90
+ }
91
+
92
+ type Expression = ($: unknown[]) => unknown
@@ -0,0 +1,86 @@
1
+ import { Readable } from 'node:stream'
2
+ import assert from 'node:assert'
3
+ import { match } from 'matchacho'
4
+ import { NotFound } from '../../HTTP'
5
+ import type { Directive } from './types'
6
+ import type { ReadableStream } from 'node:stream/web'
7
+ import type { Remotes } from '../../Remotes'
8
+ import type { Maybe } from '@toa.io/types'
9
+ import type { Component } from '@toa.io/core'
10
+ import type { Output } from '../../io'
11
+ import type { Input } from '../octets/types'
12
+ import type { Parameter } from '../../RTD'
13
+
14
+ export class Fetch implements Directive {
15
+ private readonly connecting: Promise<Component>
16
+ private remote: Component | null = null
17
+ private readonly operation: string
18
+
19
+ public constructor (endpoint: string, discovery: Remotes) {
20
+ assert.equal(typeof endpoint, 'string', '`flow:fetch` must be a string')
21
+
22
+ const [operation, name, namespace = 'default'] = endpoint.split('.').reverse()
23
+
24
+ this.operation = operation
25
+ this.connecting = discovery.discover(namespace, name)
26
+ }
27
+
28
+ public async apply (input: Input, parameters: Parameter[]): Promise<Output> {
29
+ if ('if-none-match' in input.request.headers)
30
+ return { status: 304 }
31
+
32
+ this.remote ??= await this.connecting
33
+
34
+ const request = await this.remote.invoke<Maybe<Request | string>>(this.operation, {
35
+ input: {
36
+ authority: input.authority,
37
+ path: input.request.url,
38
+ parameters: Object.fromEntries(parameters.map(({ name, value }) => [name, value]))
39
+ }
40
+ })
41
+
42
+ if (request instanceof Error)
43
+ throw new NotFound(request)
44
+
45
+ const { url, options } = match<Request>(request,
46
+ String, { url: request },
47
+ (request: Request): Request => ({
48
+ url: request.url,
49
+ options: {
50
+ method: request.options?.method ?? 'GET',
51
+ body: request.options?.body,
52
+ headers: request.options?.headers
53
+ }
54
+ }))
55
+
56
+ const response = await fetch(url, options)
57
+
58
+ if (!response.ok)
59
+ throw new NotFound()
60
+
61
+ const headers = new Headers()
62
+
63
+ for (const header of ['content-type', 'content-length', 'etag']) {
64
+ const value = response.headers.get(header)
65
+
66
+ if (value !== null)
67
+ headers.set(header, value)
68
+ }
69
+
70
+ return {
71
+ headers,
72
+ body: response.body === null ? null : Readable.fromWeb(response.body as ReadableStream)
73
+ }
74
+ }
75
+ }
76
+
77
+ interface Request {
78
+ url: string
79
+ options?: RequestOptions
80
+ }
81
+
82
+ interface RequestOptions {
83
+ method?: string
84
+ body?: string
85
+ headers?: Record<string, string>
86
+ }
@@ -0,0 +1,42 @@
1
+ import { Fetch } from './Fetch'
2
+ import { Compose } from './Compose'
3
+ import type { Directive } from './types'
4
+ import type { Input, Output } from '../../io'
5
+ import type { DirectiveFamily, Parameter } from '../../RTD'
6
+ import type { Remotes } from '../../Remotes'
7
+
8
+ export class Flow implements DirectiveFamily<Directive> {
9
+ public readonly name: string = 'flow'
10
+ public readonly mandatory: boolean = false
11
+
12
+ public create (name: string, value: unknown, remotes: Remotes): Directive {
13
+ const Class = constructors[name]
14
+
15
+ if (Class === undefined)
16
+ throw new Error(`Directive '${this.name}:${name}' is not implemented`)
17
+
18
+ return new Class(value, remotes)
19
+ }
20
+
21
+ public async preflight (directives: Directive[], input: Input, parameters: Parameter[]): Promise<Output> {
22
+ for (const directive of directives) {
23
+ if (directive.attach !== undefined)
24
+ directive.attach(input)
25
+
26
+ if (directive.apply === undefined)
27
+ continue
28
+
29
+ const output = await directive.apply(input, parameters)
30
+
31
+ if (output !== null)
32
+ return output
33
+ }
34
+
35
+ return null
36
+ }
37
+ }
38
+
39
+ const constructors: Record<string, new (value: any, discovery: Remotes) => Directive> = {
40
+ fetch: Fetch,
41
+ compose: Compose
42
+ }
@@ -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,24 +12,27 @@ 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 {
19
19
  context.pipelines.body.push((body) => this.check(body))
20
20
  }
21
21
 
22
- private check (body: unknown): unknown {
22
+ private check (body: unknown): Message | Message[] | undefined {
23
+ if (body === undefined)
24
+ return body
25
+
23
26
  try {
24
- schemas.message.validate(body)
27
+ schemas.message.validate<Message | Message[]>(body)
25
28
  } catch {
26
- throw new BadRequest('Invalid request body.')
29
+ throw new BadRequest('Invalid request body')
27
30
  }
28
31
 
29
32
  const property = this.violation(body)
30
33
 
31
34
  if (property !== undefined)
32
- throw new BadRequest(`Unexpected input: ${property}.`)
35
+ throw new BadRequest(`Unexpected input: ${property}`)
33
36
 
34
37
  return body
35
38
  }
@@ -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,58 @@
1
+ import assert from 'node:assert'
2
+ import { Mapping } from './Mapping'
3
+ import type { Component } from '@toa.io/core'
4
+ import type { Remotes } from '../../Remotes'
5
+ import type { Input } from '../../io'
6
+
7
+ export class Claims extends Mapping<Record<string, string>> {
8
+ private readonly discovery!: Promise<Component>
9
+ private federation: Component | null = null
10
+
11
+ public constructor (map: Record<string, string>, remotes: Remotes) {
12
+ assert.ok(map.constructor === Object, '`map:claims` must be an object')
13
+
14
+ assert.ok(Object.values(map).every((value) => typeof value === 'string'),
15
+ '`map:claims ` must be an object with string values')
16
+
17
+ super(map, remotes)
18
+
19
+ this.discovery = remotes.discover('identity', 'federation')
20
+ }
21
+
22
+ public override async properties (context: Input): Promise<Record<string, string> | null> {
23
+ const authentication = context.request.headers.authorization
24
+
25
+ if (authentication === undefined)
26
+ return null
27
+
28
+ const claims = await this.claims(authentication)
29
+
30
+ if (claims === null)
31
+ return null
32
+
33
+ return Object.entries(this.value).reduce((properties: Record<string, string>, [property, claim]) => {
34
+ const value = claims[claim]
35
+
36
+ if (value !== undefined)
37
+ properties[property] = value
38
+
39
+ return properties
40
+ }, {})
41
+ }
42
+
43
+ private async claims (authentication: string): Promise<Record<string, string> | null> {
44
+ const [scheme, credentials] = authentication.split(' ')
45
+
46
+ if (scheme !== 'Bearer' || credentials === undefined)
47
+ return null
48
+
49
+ this.federation ??= await this.discovery
50
+
51
+ const claims = await this.federation.invoke<Record<string, string> | Error>('decode', { input: credentials })
52
+
53
+ if (claims instanceof Error)
54
+ return null
55
+
56
+ return claims
57
+ }
58
+ }
@@ -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
+
16
+ cors.allow('accept-language')
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,61 @@
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
+ import type { Remotes } from '../../Remotes'
15
+
16
+ export class Map implements DirectiveFamily {
17
+ public readonly name = 'map'
18
+ public readonly mandatory = false
19
+
20
+ private remotes!: Remotes
21
+
22
+ public create (name: string, value: unknown, remotes: Remotes): Property | Mapping {
23
+ this.remotes = remotes
24
+
25
+ return match(name,
26
+ () => properties.has(name), (name: PN) => new Property(name, value as PV),
27
+ () => name in mappings, (name: keyof typeof mappings) => new mappings[name](value, remotes),
28
+ () => {
29
+ throw new Error(`Directive 'map:${name}' is not implemented`)
30
+ })
31
+ }
32
+
33
+ public async preflight (directives: Directive[], context: Input, parameters: Parameter[]): Promise<Output> {
34
+ const properties = {}
35
+
36
+ for (const directive of directives)
37
+ if (directive instanceof Mapping)
38
+ Object.assign(properties, await directive.properties(context, parameters, directives))
39
+
40
+ context.pipelines.body.push((body: unknown) => {
41
+ if (body === undefined || body === null || typeof body !== 'object')
42
+ return properties
43
+ else
44
+ return Object.assign(body, properties)
45
+ })
46
+
47
+ return null
48
+ }
49
+ }
50
+
51
+ type PN = keyof Properties
52
+ type PV = Properties[PN]
53
+
54
+ const mappings: Record<string, new (value: any, remotes: Remotes) => Directive> = {
55
+ authority: Authority,
56
+ headers: Headers,
57
+ languages: Languages,
58
+ language: Language,
59
+ segments: Segments,
60
+ claims: Claims
61
+ }
@@ -0,0 +1,19 @@
1
+ import type { Remotes } from '../../Remotes'
2
+ import type { Directive } from './Directive'
3
+ import type { Input } from '../../io'
4
+ import type { Parameter } from '../../RTD'
5
+
6
+ export abstract class Mapping<T = unknown> {
7
+ protected value: T
8
+ protected remotes?: Remotes
9
+
10
+ protected constructor (value: T, remotes?: Remotes) {
11
+ this.value = value
12
+ this.remotes = remotes
13
+ }
14
+
15
+ public abstract properties (context: Input, parameters: Parameter[], directives: Directive[]): Output
16
+ }
17
+
18
+ type Properties = Record<string, unknown> | null
19
+ type Output = Properties | Promise<Properties>
@@ -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,33 @@
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 cut = parameter[0] === '~'
18
+
19
+ if (cut) parameter = parameter.slice(1)
20
+
21
+ const index = parameters.findIndex(({ name }) => name === parameter)
22
+
23
+ assert.ok(index > -1, `Route parameter '${parameter}' is missing`)
24
+
25
+ properties[property] = parameters[index].value
26
+
27
+ if (cut)
28
+ parameters.splice(index, 1)
29
+
30
+ return properties
31
+ }, {})
32
+ }
33
+ }