@toa.io/extensions.exposition 1.0.0-alpha.25 → 1.0.0-alpha.250

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 (834) hide show
  1. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -1
  2. package/components/identity.basic/manifest.toa.yaml +71 -11
  3. package/components/identity.basic/operations/add.d.ts +3 -0
  4. package/components/identity.basic/operations/add.js +16 -0
  5. package/components/identity.basic/operations/add.js.map +1 -0
  6. package/components/identity.basic/operations/authenticate.js +2 -2
  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 +1 -1
  12. package/components/identity.basic/operations/incept.js +9 -3
  13. package/components/identity.basic/operations/incept.js.map +1 -1
  14. package/components/identity.basic/operations/transit.d.ts +2 -2
  15. package/components/identity.basic/operations/transit.js +9 -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 +14 -6
  19. package/components/identity.basic/source/add.ts +14 -0
  20. package/components/identity.basic/source/authenticate.ts +2 -2
  21. package/components/identity.basic/source/check.ts +20 -0
  22. package/components/identity.basic/source/incept.ts +10 -4
  23. package/components/identity.basic/source/transit.ts +12 -10
  24. package/components/identity.basic/source/types.ts +15 -6
  25. package/components/identity.federation/manifest.toa.yaml +63 -38
  26. package/components/identity.federation/operations/authenticate.d.ts +16 -3
  27. package/components/identity.federation/operations/authenticate.js +25 -16
  28. package/components/identity.federation/operations/authenticate.js.map +1 -1
  29. package/components/identity.federation/operations/decode.d.ts +3 -0
  30. package/components/identity.federation/operations/decode.js +12 -0
  31. package/components/identity.federation/operations/decode.js.map +1 -0
  32. package/components/identity.federation/operations/incept.d.ts +5 -5
  33. package/components/identity.federation/operations/incept.js +13 -5
  34. package/components/identity.federation/operations/incept.js.map +1 -1
  35. package/components/identity.federation/operations/lib/Configuration.d.ts +39 -0
  36. package/components/identity.federation/operations/lib/Configuration.js +3 -0
  37. package/components/identity.federation/operations/lib/Configuration.js.map +1 -0
  38. package/components/identity.federation/operations/lib/Ctx.d.ts +6 -0
  39. package/{transpiled/directives/vary/embeddings/Embedding.js → components/identity.federation/operations/lib/Ctx.js} +1 -1
  40. package/components/identity.federation/operations/lib/Ctx.js.map +1 -0
  41. package/components/identity.federation/operations/lib/Payload.d.ts +5 -0
  42. package/components/identity.federation/operations/lib/Payload.js +3 -0
  43. package/components/identity.federation/operations/lib/Payload.js.map +1 -0
  44. package/components/identity.federation/operations/lib/decode.d.ts +3 -0
  45. package/components/identity.federation/operations/lib/{assertions-as-values.js → decode.js} +19 -19
  46. package/components/identity.federation/operations/lib/decode.js.map +1 -0
  47. package/components/identity.federation/operations/lib/discovery.d.ts +4 -0
  48. package/components/identity.federation/operations/lib/discovery.js +49 -0
  49. package/components/identity.federation/operations/lib/discovery.js.map +1 -0
  50. package/components/identity.federation/operations/lib/errors.d.ts +11 -0
  51. package/components/identity.federation/operations/lib/errors.js +15 -0
  52. package/components/identity.federation/operations/lib/errors.js.map +1 -0
  53. package/components/identity.federation/operations/lib/exchange.d.ts +3 -0
  54. package/components/identity.federation/operations/lib/exchange.js +107 -0
  55. package/components/identity.federation/operations/lib/exchange.js.map +1 -0
  56. package/components/identity.federation/operations/lib/index.d.ts +3 -0
  57. package/components/identity.federation/operations/lib/index.js +8 -0
  58. package/components/identity.federation/operations/lib/index.js.map +1 -0
  59. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  60. package/components/identity.federation/operations/types/Scheme.d.ts +1 -0
  61. package/components/identity.federation/operations/types/Scheme.js +3 -0
  62. package/components/identity.federation/operations/types/Scheme.js.map +1 -0
  63. package/components/identity.federation/operations/types/configuration.d.ts +20 -0
  64. package/components/identity.federation/operations/types/configuration.js +3 -0
  65. package/components/identity.federation/operations/types/configuration.js.map +1 -0
  66. package/components/identity.federation/operations/types/context.d.ts +36 -0
  67. package/components/identity.federation/operations/types/context.js +3 -0
  68. package/components/identity.federation/operations/types/context.js.map +1 -0
  69. package/components/identity.federation/operations/types/entity.d.ts +6 -0
  70. package/components/identity.federation/operations/types/entity.js +3 -0
  71. package/components/identity.federation/operations/types/entity.js.map +1 -0
  72. package/components/identity.federation/operations/types/index.d.ts +4 -0
  73. package/components/identity.federation/operations/types/index.js +21 -0
  74. package/components/identity.federation/operations/types/index.js.map +1 -0
  75. package/components/identity.federation/source/authenticate.ts +43 -21
  76. package/components/identity.federation/source/decode.ts +10 -0
  77. package/components/identity.federation/source/incept.ts +20 -11
  78. package/components/identity.federation/source/lib/Configuration.ts +39 -0
  79. package/components/identity.federation/source/lib/Ctx.ts +7 -0
  80. package/components/identity.federation/source/lib/Payload.ts +6 -0
  81. package/components/identity.federation/source/lib/decode.ts +28 -0
  82. package/components/identity.federation/source/lib/discovery.ts +30 -0
  83. package/components/identity.federation/source/lib/errors.ts +12 -0
  84. package/components/identity.federation/source/lib/exchange.ts +116 -0
  85. package/components/identity.federation/source/lib/index.ts +3 -0
  86. package/components/identity.federation/source/types/Scheme.ts +1 -0
  87. package/components/identity.federation/source/types/configuration.ts +21 -0
  88. package/components/identity.federation/source/types/context.ts +40 -0
  89. package/components/identity.federation/source/types/entity.ts +6 -0
  90. package/components/identity.federation/source/types/index.ts +4 -0
  91. package/components/identity.federation/tsconfig.json +5 -4
  92. package/components/identity.keys/manifest.toa.yaml +57 -0
  93. package/components/identity.keys/operations/create.d.ts +22 -0
  94. package/components/identity.keys/operations/create.js +16 -0
  95. package/components/identity.keys/operations/create.js.map +1 -0
  96. package/components/identity.keys/operations/tsconfig.tsbuildinfo +1 -0
  97. package/components/identity.keys/source/create.ts +35 -0
  98. package/components/identity.keys/tsconfig.json +9 -0
  99. package/components/identity.otp/manifest.toa.yaml +69 -0
  100. package/components/identity.otp/operations/authenticate.d.ts +12 -0
  101. package/components/identity.otp/operations/authenticate.js +31 -0
  102. package/components/identity.otp/operations/authenticate.js.map +1 -0
  103. package/components/identity.otp/operations/issue.d.ts +12 -0
  104. package/components/identity.otp/operations/issue.js +22 -0
  105. package/components/identity.otp/operations/issue.js.map +1 -0
  106. package/components/identity.otp/operations/lib/Context.d.ts +13 -0
  107. package/components/identity.otp/operations/lib/Context.js +3 -0
  108. package/components/identity.otp/operations/lib/Context.js.map +1 -0
  109. package/components/identity.otp/operations/lib/Entity.d.ts +6 -0
  110. package/components/identity.otp/operations/lib/Entity.js +3 -0
  111. package/components/identity.otp/operations/lib/Entity.js.map +1 -0
  112. package/components/identity.otp/operations/lib/index.d.ts +1 -0
  113. package/components/identity.otp/operations/lib/index.js +3 -0
  114. package/components/identity.otp/operations/lib/index.js.map +1 -0
  115. package/components/identity.otp/operations/tsconfig.tsbuildinfo +1 -0
  116. package/components/identity.otp/source/authenticate.ts +48 -0
  117. package/components/identity.otp/source/issue.ts +34 -0
  118. package/components/identity.otp/source/lib/Context.ts +14 -0
  119. package/components/identity.otp/source/lib/Entity.ts +6 -0
  120. package/components/identity.otp/source/lib/index.ts +1 -0
  121. package/components/identity.otp/tsconfig.json +9 -0
  122. package/components/identity.passkeys/manifest.toa.yaml +276 -0
  123. package/components/identity.passkeys/operations/authenticate.d.ts +16 -0
  124. package/components/identity.passkeys/operations/authenticate.js +34 -0
  125. package/components/identity.passkeys/operations/authenticate.js.map +1 -0
  126. package/components/identity.passkeys/operations/challenge.d.ts +35 -0
  127. package/components/identity.passkeys/operations/challenge.js +73 -0
  128. package/components/identity.passkeys/operations/challenge.js.map +1 -0
  129. package/components/identity.passkeys/operations/create.d.ts +19 -0
  130. package/components/identity.passkeys/operations/create.js +58 -0
  131. package/components/identity.passkeys/operations/create.js.map +1 -0
  132. package/components/identity.passkeys/operations/delete.d.ts +8 -0
  133. package/components/identity.passkeys/operations/delete.js +12 -0
  134. package/components/identity.passkeys/operations/delete.js.map +1 -0
  135. package/components/identity.passkeys/operations/lib/const.d.ts +1 -0
  136. package/components/identity.passkeys/operations/lib/const.js +5 -0
  137. package/components/identity.passkeys/operations/lib/const.js.map +1 -0
  138. package/components/identity.passkeys/operations/list.d.ts +7 -0
  139. package/components/identity.passkeys/operations/list.js +15 -0
  140. package/components/identity.passkeys/operations/list.js.map +1 -0
  141. package/components/identity.passkeys/operations/tsconfig.tsbuildinfo +1 -0
  142. package/components/identity.passkeys/operations/types/Configuration.d.ts +6 -0
  143. package/components/identity.passkeys/operations/types/Configuration.js +3 -0
  144. package/components/identity.passkeys/operations/types/Configuration.js.map +1 -0
  145. package/components/identity.passkeys/operations/types/Context.d.ts +15 -0
  146. package/components/identity.passkeys/operations/types/Context.js +3 -0
  147. package/components/identity.passkeys/operations/types/Context.js.map +1 -0
  148. package/components/identity.passkeys/operations/types/Passkey.d.ts +13 -0
  149. package/components/identity.passkeys/operations/types/Passkey.js +3 -0
  150. package/components/identity.passkeys/operations/types/Passkey.js.map +1 -0
  151. package/components/identity.passkeys/operations/types/index.d.ts +2 -0
  152. package/components/identity.passkeys/operations/types/index.js +3 -0
  153. package/components/identity.passkeys/operations/types/index.js.map +1 -0
  154. package/components/identity.passkeys/operations/use.d.ts +16 -0
  155. package/components/identity.passkeys/operations/use.js +57 -0
  156. package/components/identity.passkeys/operations/use.js.map +1 -0
  157. package/components/identity.passkeys/source/authenticate.ts +48 -0
  158. package/components/identity.passkeys/source/challenge.ts +115 -0
  159. package/components/identity.passkeys/source/create.ts +77 -0
  160. package/components/identity.passkeys/source/delete.ts +15 -0
  161. package/components/identity.passkeys/source/lib/const.ts +1 -0
  162. package/components/identity.passkeys/source/list.ts +17 -0
  163. package/components/identity.passkeys/source/types/Configuration.ts +6 -0
  164. package/components/identity.passkeys/source/types/Context.ts +16 -0
  165. package/components/identity.passkeys/source/types/Passkey.ts +14 -0
  166. package/components/identity.passkeys/source/types/index.ts +2 -0
  167. package/components/identity.passkeys/source/use.ts +75 -0
  168. package/components/identity.passkeys/tsconfig.json +9 -0
  169. package/components/identity.roles/manifest.toa.yaml +4 -2
  170. package/components/identity.roles/operations/grant.js +2 -2
  171. package/components/identity.roles/operations/grant.js.map +1 -1
  172. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  173. package/components/identity.roles/source/grant.ts +2 -2
  174. package/components/identity.tokens/manifest.toa.yaml +93 -13
  175. package/components/identity.tokens/operations/authenticate.d.ts +2 -2
  176. package/components/identity.tokens/operations/authenticate.js +13 -12
  177. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  178. package/components/identity.tokens/operations/decrypt.d.ts +13 -3
  179. package/components/identity.tokens/operations/decrypt.js +65 -18
  180. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  181. package/components/identity.tokens/operations/encrypt.d.ts +3 -3
  182. package/components/identity.tokens/operations/encrypt.js +24 -8
  183. package/components/identity.tokens/operations/encrypt.js.map +1 -1
  184. package/components/identity.tokens/operations/issue.d.ts +24 -0
  185. package/components/identity.tokens/operations/issue.js +59 -0
  186. package/components/identity.tokens/operations/issue.js.map +1 -0
  187. package/components/identity.tokens/operations/lib/index.d.ts +2 -0
  188. package/components/identity.tokens/operations/lib/index.js +19 -0
  189. package/components/identity.tokens/operations/lib/index.js.map +1 -0
  190. package/components/identity.tokens/operations/lib/pad.d.ts +1 -0
  191. package/components/identity.tokens/operations/lib/pad.js +5 -0
  192. package/components/identity.tokens/operations/lib/pad.js.map +1 -0
  193. package/components/identity.tokens/operations/lib/types.d.ts +75 -0
  194. package/components/identity.tokens/operations/lib/types.js.map +1 -0
  195. package/components/identity.tokens/operations/revoke.d.ts +2 -2
  196. package/components/identity.tokens/operations/revoke.js.map +1 -1
  197. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  198. package/components/identity.tokens/source/authenticate.test.ts +13 -7
  199. package/components/identity.tokens/source/authenticate.ts +15 -14
  200. package/components/identity.tokens/source/decrypt.test.ts +29 -16
  201. package/components/identity.tokens/source/decrypt.ts +94 -20
  202. package/components/identity.tokens/source/encrypt.test.ts +48 -13
  203. package/components/identity.tokens/source/encrypt.ts +36 -12
  204. package/components/identity.tokens/source/issue.ts +82 -0
  205. package/components/identity.tokens/source/lib/index.ts +2 -0
  206. package/components/identity.tokens/source/lib/pad.ts +1 -0
  207. package/components/identity.tokens/source/lib/paseto.test.ts +16 -0
  208. package/components/identity.tokens/source/{types.ts → lib/types.ts} +38 -7
  209. package/components/identity.tokens/source/revoke.ts +2 -2
  210. package/components/octets.storage/manifest.toa.yaml +13 -5
  211. package/components/octets.storage/operations/get.js +3 -3
  212. package/components/octets.storage/operations/head.js +7 -0
  213. package/components/octets.storage/operations/put.js +135 -0
  214. package/documentation/access.md +78 -27
  215. package/documentation/authorities.md +6 -11
  216. package/documentation/components.md +114 -39
  217. package/documentation/dev.md +30 -0
  218. package/documentation/flow.md +44 -0
  219. package/documentation/identity.md +115 -5
  220. package/documentation/introspection.md +82 -0
  221. package/documentation/io.md +42 -2
  222. package/documentation/map.md +115 -0
  223. package/documentation/notes/desync.jpg +0 -0
  224. package/documentation/notes/peers.md +59 -0
  225. package/documentation/notes/throttling.md +82 -0
  226. package/documentation/octets.md +122 -69
  227. package/documentation/passkeys.md +4 -0
  228. package/documentation/protocol.md +11 -4
  229. package/documentation/query.md +51 -4
  230. package/documentation/tracing.md +70 -0
  231. package/documentation/tree.md +13 -0
  232. package/features/access.feature +67 -2
  233. package/features/auth.assert.feature +57 -0
  234. package/features/auth.claims.feature +170 -0
  235. package/features/auth.incept.feature +120 -0
  236. package/features/auth.input.feature +59 -0
  237. package/features/auth.issue.feature +32 -0
  238. package/features/authorities.feature +3 -3
  239. package/features/authorities.federation.feature +20 -20
  240. package/features/authorities.tokens.feature +1 -2
  241. package/features/body.feature +27 -0
  242. package/features/cache.feature +92 -3
  243. package/features/cors.feature +28 -7
  244. package/features/debug.feature +34 -0
  245. package/features/dev.feature +87 -0
  246. package/features/dynamic.feature +82 -1
  247. package/features/errors.feature +17 -5
  248. package/features/etag.feature +173 -1
  249. package/features/flow.feature +148 -0
  250. package/features/identity.basic.feature +81 -6
  251. package/features/identity.feature +11 -4
  252. package/features/identity.federation.feature +122 -42
  253. package/features/identity.otp.feature +101 -0
  254. package/features/identity.roles.feature +52 -3
  255. package/features/identity.tokens.feature +1 -99
  256. package/features/identtiy.tokens.custom.feature +247 -0
  257. package/features/interruptions.feature +19 -0
  258. package/features/introspection.feature +153 -0
  259. package/features/io.feature +0 -1
  260. package/features/io.throttle.feature +40 -0
  261. package/features/map.feature +356 -0
  262. package/features/methods.feature +47 -0
  263. package/features/octets.cloudinary.feature +223 -0
  264. package/features/octets.download.feature +189 -0
  265. package/features/octets.entries.feature +8 -58
  266. package/features/octets.feature +58 -65
  267. package/features/octets.head.feature +40 -0
  268. package/features/octets.location.feature +83 -0
  269. package/features/octets.meta.feature +62 -15
  270. package/features/octets.workflows.feature +332 -67
  271. package/features/passkeys.feature +66 -0
  272. package/features/probes.feature +14 -0
  273. package/features/{queries.feature → query.feature} +132 -0
  274. package/features/realtime.feature +34 -0
  275. package/features/response.feature +29 -0
  276. package/features/routes.feature +86 -2
  277. package/features/server.feature +21 -0
  278. package/features/steps/.env.example +5 -0
  279. package/features/steps/Captures.ts +12 -0
  280. package/features/steps/Common.ts +4 -0
  281. package/features/steps/Gateway.ts +15 -5
  282. package/features/steps/HTTP.ts +27 -3
  283. package/features/steps/IDP.ts +334 -0
  284. package/features/steps/Identity.ts +51 -0
  285. package/features/steps/OTP.ts +39 -0
  286. package/features/steps/Parameters.ts +94 -2
  287. package/features/steps/Realtime.ts +151 -0
  288. package/features/steps/Workspace.ts +1 -2
  289. package/features/steps/components/audit/manifest.toa.yaml +13 -0
  290. package/features/steps/components/audit/operations/record.js +9 -0
  291. package/features/steps/components/echo/manifest.toa.yaml +17 -0
  292. package/features/steps/components/echo/operations/echo.js +7 -0
  293. package/features/steps/components/echo/operations/parameters.js +7 -0
  294. package/features/steps/components/echo/operations/ping.js +7 -0
  295. package/features/steps/components/echo/operations/unwrap.js +7 -0
  296. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  297. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  298. package/features/steps/components/greeter/manifest.toa.yaml +0 -1
  299. package/features/steps/components/notify/manifest.toa.yaml +13 -0
  300. package/features/steps/components/notify/operations/send.js +9 -0
  301. package/features/steps/components/octets.tester/manifest.toa.yaml +26 -3
  302. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  303. package/features/steps/components/octets.tester/operations/bar.js +0 -1
  304. package/features/steps/components/octets.tester/operations/baz.js +1 -1
  305. package/features/steps/components/octets.tester/operations/echo.js +1 -1
  306. package/features/steps/components/octets.tester/operations/foo.js +2 -2
  307. package/features/steps/components/octets.tester/operations/id.js +7 -0
  308. package/features/steps/components/octets.tester/operations/identity.js +7 -0
  309. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  310. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  311. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  312. package/features/steps/components/orders/manifest.toa.yaml +15 -0
  313. package/features/steps/components/orders/operations/create.js +9 -0
  314. package/features/steps/components/pots/manifest.toa.yaml +15 -4
  315. package/features/steps/components/pricing/manifest.toa.yaml +7 -0
  316. package/features/steps/components/pricing/operations/quote.js +7 -0
  317. package/features/steps/components/sequences/manifest.toa.yaml +0 -1
  318. package/features/steps/components/users/manifest.toa.yaml +4 -2
  319. package/features/steps/components/users/operations/create.js +15 -0
  320. package/features/steps/components/users.properties/manifest.toa.yaml +0 -1
  321. package/features/streams.feature +4 -0
  322. package/features/timestamps.feature +41 -0
  323. package/features/timing.feature +2 -22
  324. package/features/tracing.feature +123 -0
  325. package/package.json +34 -21
  326. package/readme.md +7 -1
  327. package/schemas/annotation.cos.yaml +7 -1
  328. package/schemas/io/throttle.cos.yaml +36 -0
  329. package/schemas/method.cos.yaml +2 -1
  330. package/schemas/node.cos.yaml +2 -0
  331. package/schemas/octets/put.cos.yaml +28 -0
  332. package/schemas/query.cos.yaml +7 -10
  333. package/schemas/querystring.cos.yaml +1 -0
  334. package/source/Annotation.ts +3 -1
  335. package/source/Branch.ts +1 -0
  336. package/source/Composition.ts +0 -6
  337. package/source/Context.ts +1 -0
  338. package/source/Directive.test.ts +5 -3
  339. package/source/Directive.ts +51 -9
  340. package/source/Endpoint.ts +114 -25
  341. package/source/Factory.ts +32 -3
  342. package/source/Gateway.ts +166 -15
  343. package/source/HTTP/Context.ts +32 -8
  344. package/source/HTTP/Server.ts +230 -52
  345. package/source/HTTP/Timing.ts +1 -12
  346. package/source/HTTP/exceptions.ts +30 -12
  347. package/source/HTTP/formats/index.ts +4 -5
  348. package/source/HTTP/formats/json.ts +2 -4
  349. package/source/HTTP/formats/msgpack.ts +0 -1
  350. package/source/HTTP/formats/text.ts +2 -4
  351. package/source/HTTP/formats/yaml.ts +2 -3
  352. package/source/HTTP/messages.test.ts +70 -7
  353. package/source/HTTP/messages.ts +99 -19
  354. package/source/Introspection.ts +11 -0
  355. package/source/Mapping.ts +69 -21
  356. package/source/Query.test.ts +3 -3
  357. package/source/Query.ts +130 -33
  358. package/source/RTD/Context.ts +1 -1
  359. package/source/RTD/Directives.ts +7 -0
  360. package/source/RTD/Endpoint.ts +3 -0
  361. package/source/RTD/Method.ts +16 -0
  362. package/source/RTD/Node.ts +65 -23
  363. package/source/RTD/Route.ts +19 -9
  364. package/source/RTD/Tree.ts +22 -9
  365. package/source/RTD/expiration.test.ts +78 -0
  366. package/source/RTD/factory.ts +19 -1
  367. package/source/RTD/segment.ts +2 -0
  368. package/source/RTD/syntax/parse.test.ts +1 -1
  369. package/source/RTD/syntax/parse.ts +37 -24
  370. package/source/RTD/syntax/types.ts +9 -4
  371. package/source/Remotes.ts +7 -6
  372. package/source/Tenant.ts +39 -12
  373. package/source/const.ts +1 -0
  374. package/source/deployment.ts +22 -13
  375. package/source/directives/auth/Anonymous.ts +3 -3
  376. package/source/directives/auth/Anyone.ts +13 -0
  377. package/source/directives/auth/Assert.ts +35 -0
  378. package/source/directives/auth/Authorization.ts +58 -22
  379. package/source/directives/auth/Delegate.ts +9 -5
  380. package/source/directives/auth/Echo.ts +16 -6
  381. package/source/directives/auth/Federation.ts +84 -0
  382. package/source/directives/auth/Id.ts +1 -1
  383. package/source/directives/auth/Incept.ts +75 -23
  384. package/source/directives/auth/Input.ts +71 -0
  385. package/source/directives/auth/Role.test.ts +2 -3
  386. package/source/directives/auth/Role.ts +6 -11
  387. package/source/directives/auth/Rule.ts +3 -6
  388. package/source/directives/auth/Scheme.ts +5 -5
  389. package/source/directives/auth/create.ts +11 -0
  390. package/source/directives/auth/schemes.ts +5 -2
  391. package/source/directives/auth/split.ts +1 -1
  392. package/source/directives/auth/types.ts +12 -7
  393. package/source/directives/cache/Cache.ts +20 -7
  394. package/source/directives/cache/Control.ts +16 -16
  395. package/source/directives/cors/CORS.ts +9 -9
  396. package/source/directives/dev/Development.ts +14 -7
  397. package/source/directives/dev/Faulty.ts +26 -0
  398. package/source/directives/dev/Sleep.ts +55 -0
  399. package/source/directives/dev/types.ts +1 -1
  400. package/source/directives/flow/Compose.ts +92 -0
  401. package/source/directives/flow/Fetch.ts +86 -0
  402. package/source/directives/flow/Flow.ts +42 -0
  403. package/source/directives/flow/index.ts +3 -0
  404. package/source/directives/flow/types.ts +7 -0
  405. package/source/directives/index.ts +3 -2
  406. package/source/directives/io/Directive.ts +5 -2
  407. package/source/directives/io/IO.ts +18 -6
  408. package/source/directives/io/Input.ts +9 -6
  409. package/source/directives/io/Output.ts +6 -5
  410. package/source/directives/io/Throttle.ts +32 -0
  411. package/source/directives/io/lib/throttle/Configuration.test.ts +40 -0
  412. package/source/directives/io/lib/throttle/Configuration.ts +58 -0
  413. package/source/directives/io/lib/throttle/Interval.ts +31 -0
  414. package/source/directives/io/lib/throttle/Keys.ts +40 -0
  415. package/source/directives/io/lib/throttle/Quota.ts +22 -0
  416. package/source/directives/io/lib/throttle/Quotas.test.ts +136 -0
  417. package/source/directives/io/lib/throttle/Quotas.ts +83 -0
  418. package/source/directives/io/lib/throttle/components/Component.ts +5 -0
  419. package/source/directives/io/lib/throttle/components/IP.ts +40 -0
  420. package/source/directives/io/lib/throttle/components/Path.ts +8 -0
  421. package/source/directives/io/lib/throttle/components/index.ts +13 -0
  422. package/source/directives/io/lib/throttle/conditions/Condition.ts +5 -0
  423. package/source/directives/io/lib/throttle/conditions/Status.ts +17 -0
  424. package/source/directives/io/lib/throttle/conditions/index.ts +11 -0
  425. package/source/directives/io/lib/throttle/index.ts +2 -0
  426. package/source/directives/io/schemas.test.ts +9 -0
  427. package/source/directives/io/schemas.ts +3 -0
  428. package/source/directives/map/Authority.ts +15 -0
  429. package/source/directives/map/Buffer.ts +15 -0
  430. package/source/directives/map/Claims.ts +58 -0
  431. package/source/directives/map/Directive.ts +4 -0
  432. package/source/directives/map/Headers.ts +38 -0
  433. package/source/directives/map/Language.ts +42 -0
  434. package/source/directives/map/Languages.ts +11 -0
  435. package/source/directives/map/Map.ts +63 -0
  436. package/source/directives/map/Mapping.ts +19 -0
  437. package/source/directives/{vary → map}/Properties.ts +2 -4
  438. package/source/directives/map/Segments.ts +33 -0
  439. package/source/directives/map/index.ts +3 -0
  440. package/source/directives/octets/Context.ts +3 -2
  441. package/source/directives/octets/Delete.ts +22 -19
  442. package/source/directives/octets/Get.ts +96 -0
  443. package/source/directives/octets/Octets.ts +10 -12
  444. package/source/directives/octets/Put.ts +138 -0
  445. package/source/directives/octets/Workflow.ts +9 -3
  446. package/source/directives/octets/bytes.test.ts +30 -0
  447. package/source/directives/octets/bytes.ts +18 -0
  448. package/source/directives/octets/schemas.ts +4 -8
  449. package/source/directives/octets/types.ts +2 -0
  450. package/source/directives/octets/workflows/Execution.ts +62 -8
  451. package/source/directives/octets/workflows/Workflow.ts +18 -7
  452. package/source/directives/octets/workflows/index.ts +1 -1
  453. package/source/exceptions.ts +16 -4
  454. package/source/manifest.ts +10 -11
  455. package/source/root.ts +16 -1
  456. package/transpiled/Annotation.d.ts +2 -1
  457. package/transpiled/Branch.d.ts +1 -0
  458. package/transpiled/Composition.d.ts +0 -1
  459. package/transpiled/Composition.js +0 -4
  460. package/transpiled/Composition.js.map +1 -1
  461. package/transpiled/Context.d.ts +1 -0
  462. package/transpiled/Directive.d.ts +3 -0
  463. package/transpiled/Directive.js +39 -9
  464. package/transpiled/Directive.js.map +1 -1
  465. package/transpiled/Endpoint.d.ts +8 -4
  466. package/transpiled/Endpoint.js +78 -19
  467. package/transpiled/Endpoint.js.map +1 -1
  468. package/transpiled/Factory.d.ts +1 -1
  469. package/transpiled/Factory.js +23 -2
  470. package/transpiled/Factory.js.map +1 -1
  471. package/transpiled/Gateway.d.ts +15 -0
  472. package/transpiled/Gateway.js +119 -14
  473. package/transpiled/Gateway.js.map +1 -1
  474. package/transpiled/HTTP/Context.d.ts +7 -2
  475. package/transpiled/HTTP/Context.js +23 -5
  476. package/transpiled/HTTP/Context.js.map +1 -1
  477. package/transpiled/HTTP/Server.d.ts +10 -4
  478. package/transpiled/HTTP/Server.js +178 -41
  479. package/transpiled/HTTP/Server.js.map +1 -1
  480. package/transpiled/HTTP/Timing.d.ts +0 -2
  481. package/transpiled/HTTP/Timing.js +0 -8
  482. package/transpiled/HTTP/Timing.js.map +1 -1
  483. package/transpiled/HTTP/exceptions.d.ts +16 -7
  484. package/transpiled/HTTP/exceptions.js +34 -16
  485. package/transpiled/HTTP/exceptions.js.map +1 -1
  486. package/transpiled/HTTP/formats/index.d.ts +2 -2
  487. package/transpiled/HTTP/formats/index.js +3 -3
  488. package/transpiled/HTTP/formats/index.js.map +1 -1
  489. package/transpiled/HTTP/formats/json.d.ts +2 -2
  490. package/transpiled/HTTP/formats/json.js +3 -4
  491. package/transpiled/HTTP/formats/json.js.map +1 -1
  492. package/transpiled/HTTP/formats/msgpack.d.ts +1 -1
  493. package/transpiled/HTTP/formats/msgpack.js.map +1 -1
  494. package/transpiled/HTTP/formats/text.d.ts +2 -2
  495. package/transpiled/HTTP/formats/text.js +3 -4
  496. package/transpiled/HTTP/formats/text.js.map +1 -1
  497. package/transpiled/HTTP/formats/yaml.d.ts +2 -2
  498. package/transpiled/HTTP/formats/yaml.js +3 -4
  499. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  500. package/transpiled/HTTP/messages.d.ts +4 -1
  501. package/transpiled/HTTP/messages.js +74 -13
  502. package/transpiled/HTTP/messages.js.map +1 -1
  503. package/transpiled/Introspection.d.ts +9 -0
  504. package/transpiled/Introspection.js +3 -0
  505. package/transpiled/Introspection.js.map +1 -0
  506. package/transpiled/Mapping.d.ts +11 -2
  507. package/transpiled/Mapping.js +51 -19
  508. package/transpiled/Mapping.js.map +1 -1
  509. package/transpiled/Query.d.ts +12 -1
  510. package/transpiled/Query.js +93 -28
  511. package/transpiled/Query.js.map +1 -1
  512. package/transpiled/RTD/Context.d.ts +1 -1
  513. package/transpiled/RTD/Directives.d.ts +5 -0
  514. package/transpiled/RTD/Endpoint.d.ts +1 -0
  515. package/transpiled/RTD/Method.d.ts +4 -0
  516. package/transpiled/RTD/Method.js +11 -0
  517. package/transpiled/RTD/Method.js.map +1 -1
  518. package/transpiled/RTD/Node.d.ts +13 -2
  519. package/transpiled/RTD/Node.js +46 -17
  520. package/transpiled/RTD/Node.js.map +1 -1
  521. package/transpiled/RTD/Route.d.ts +5 -4
  522. package/transpiled/RTD/Route.js +10 -4
  523. package/transpiled/RTD/Route.js.map +1 -1
  524. package/transpiled/RTD/Tree.d.ts +8 -1
  525. package/transpiled/RTD/Tree.js +15 -3
  526. package/transpiled/RTD/Tree.js.map +1 -1
  527. package/transpiled/RTD/factory.d.ts +1 -0
  528. package/transpiled/RTD/factory.js +16 -2
  529. package/transpiled/RTD/factory.js.map +1 -1
  530. package/transpiled/RTD/segment.d.ts +1 -0
  531. package/transpiled/RTD/segment.js +2 -0
  532. package/transpiled/RTD/segment.js.map +1 -1
  533. package/transpiled/RTD/syntax/parse.js +34 -22
  534. package/transpiled/RTD/syntax/parse.js.map +1 -1
  535. package/transpiled/RTD/syntax/types.d.ts +8 -3
  536. package/transpiled/RTD/syntax/types.js +1 -1
  537. package/transpiled/RTD/syntax/types.js.map +1 -1
  538. package/transpiled/Remotes.d.ts +4 -4
  539. package/transpiled/Remotes.js +6 -5
  540. package/transpiled/Remotes.js.map +1 -1
  541. package/transpiled/Tenant.d.ts +9 -4
  542. package/transpiled/Tenant.js +26 -7
  543. package/transpiled/Tenant.js.map +1 -1
  544. package/transpiled/const.d.ts +1 -0
  545. package/transpiled/const.js +5 -0
  546. package/transpiled/const.js.map +1 -0
  547. package/transpiled/deployment.js +15 -6
  548. package/transpiled/deployment.js.map +1 -1
  549. package/transpiled/directives/auth/Anonymous.d.ts +2 -2
  550. package/transpiled/directives/auth/Anonymous.js +2 -2
  551. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  552. package/transpiled/directives/auth/Anyone.d.ts +6 -0
  553. package/transpiled/directives/auth/Anyone.js +14 -0
  554. package/transpiled/directives/auth/Anyone.js.map +1 -0
  555. package/transpiled/directives/auth/Assert.d.ts +7 -0
  556. package/transpiled/directives/auth/Assert.js +57 -0
  557. package/transpiled/directives/auth/Assert.js.map +1 -0
  558. package/transpiled/directives/auth/Authorization.d.ts +4 -3
  559. package/transpiled/directives/auth/Authorization.js +48 -21
  560. package/transpiled/directives/auth/Authorization.js.map +1 -1
  561. package/transpiled/directives/auth/Delegate.d.ts +5 -4
  562. package/transpiled/directives/auth/Delegate.js +7 -3
  563. package/transpiled/directives/auth/Delegate.js.map +1 -1
  564. package/transpiled/directives/auth/Echo.d.ts +4 -4
  565. package/transpiled/directives/auth/Echo.js +11 -4
  566. package/transpiled/directives/auth/Echo.js.map +1 -1
  567. package/transpiled/directives/auth/Federation.d.ts +16 -0
  568. package/transpiled/directives/auth/Federation.js +57 -0
  569. package/transpiled/directives/auth/Federation.js.map +1 -0
  570. package/transpiled/directives/auth/Id.d.ts +1 -1
  571. package/transpiled/directives/auth/Id.js.map +1 -1
  572. package/transpiled/directives/auth/Incept.d.ts +8 -5
  573. package/transpiled/directives/auth/Incept.js +56 -18
  574. package/transpiled/directives/auth/Incept.js.map +1 -1
  575. package/transpiled/directives/auth/Input.d.ts +13 -0
  576. package/transpiled/directives/auth/Input.js +49 -0
  577. package/transpiled/directives/auth/Input.js.map +1 -0
  578. package/transpiled/directives/auth/Role.d.ts +1 -1
  579. package/transpiled/directives/auth/Role.js +4 -6
  580. package/transpiled/directives/auth/Role.js.map +1 -1
  581. package/transpiled/directives/auth/Rule.d.ts +2 -4
  582. package/transpiled/directives/auth/Rule.js +2 -2
  583. package/transpiled/directives/auth/Rule.js.map +1 -1
  584. package/transpiled/directives/auth/Scheme.d.ts +2 -2
  585. package/transpiled/directives/auth/Scheme.js +4 -4
  586. package/transpiled/directives/auth/Scheme.js.map +1 -1
  587. package/transpiled/directives/auth/create.d.ts +2 -0
  588. package/transpiled/directives/auth/create.js +14 -0
  589. package/transpiled/directives/auth/create.js.map +1 -0
  590. package/transpiled/directives/auth/schemes.d.ts +2 -1
  591. package/transpiled/directives/auth/schemes.js +5 -2
  592. package/transpiled/directives/auth/schemes.js.map +1 -1
  593. package/transpiled/directives/auth/split.js +1 -1
  594. package/transpiled/directives/auth/split.js.map +1 -1
  595. package/transpiled/directives/auth/types.d.ts +10 -7
  596. package/transpiled/directives/cache/Cache.d.ts +3 -3
  597. package/transpiled/directives/cache/Cache.js +15 -4
  598. package/transpiled/directives/cache/Cache.js.map +1 -1
  599. package/transpiled/directives/cache/Control.d.ts +2 -2
  600. package/transpiled/directives/cache/Control.js +12 -12
  601. package/transpiled/directives/cache/Control.js.map +1 -1
  602. package/transpiled/directives/cors/CORS.js +7 -7
  603. package/transpiled/directives/cors/CORS.js.map +1 -1
  604. package/transpiled/directives/dev/Development.d.ts +1 -1
  605. package/transpiled/directives/dev/Development.js +15 -7
  606. package/transpiled/directives/dev/Development.js.map +1 -1
  607. package/transpiled/directives/dev/Faulty.d.ts +8 -0
  608. package/transpiled/directives/dev/Faulty.js +26 -0
  609. package/transpiled/directives/dev/Faulty.js.map +1 -0
  610. package/transpiled/directives/dev/Sleep.d.ts +9 -0
  611. package/transpiled/directives/dev/Sleep.js +48 -0
  612. package/transpiled/directives/dev/Sleep.js.map +1 -0
  613. package/transpiled/directives/dev/types.d.ts +1 -1
  614. package/transpiled/directives/flow/Compose.d.ts +9 -0
  615. package/transpiled/directives/flow/Compose.js +94 -0
  616. package/transpiled/directives/flow/Compose.js.map +1 -0
  617. package/transpiled/directives/flow/Fetch.d.ts +12 -0
  618. package/transpiled/directives/flow/Fetch.js +58 -0
  619. package/transpiled/directives/flow/Fetch.js.map +1 -0
  620. package/transpiled/directives/flow/Flow.d.ts +10 -0
  621. package/transpiled/directives/flow/Flow.js +33 -0
  622. package/transpiled/directives/flow/Flow.js.map +1 -0
  623. package/transpiled/directives/flow/index.d.ts +2 -0
  624. package/transpiled/directives/flow/index.js +6 -0
  625. package/transpiled/directives/flow/index.js.map +1 -0
  626. package/transpiled/directives/flow/types.d.ts +6 -0
  627. package/transpiled/directives/flow/types.js.map +1 -0
  628. package/transpiled/directives/index.js +3 -2
  629. package/transpiled/directives/index.js.map +1 -1
  630. package/transpiled/directives/io/Directive.d.ts +5 -2
  631. package/transpiled/directives/io/IO.d.ts +4 -2
  632. package/transpiled/directives/io/IO.js +14 -4
  633. package/transpiled/directives/io/IO.js.map +1 -1
  634. package/transpiled/directives/io/Input.d.ts +1 -1
  635. package/transpiled/directives/io/Input.js +5 -3
  636. package/transpiled/directives/io/Input.js.map +1 -1
  637. package/transpiled/directives/io/Output.d.ts +1 -1
  638. package/transpiled/directives/io/Output.js +3 -3
  639. package/transpiled/directives/io/Output.js.map +1 -1
  640. package/transpiled/directives/io/Throttle.d.ts +11 -0
  641. package/transpiled/directives/io/Throttle.js +51 -0
  642. package/transpiled/directives/io/Throttle.js.map +1 -0
  643. package/transpiled/directives/io/lib/throttle/Configuration.d.ts +23 -0
  644. package/transpiled/directives/io/lib/throttle/Configuration.js +27 -0
  645. package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -0
  646. package/transpiled/directives/io/lib/throttle/Interval.d.ts +9 -0
  647. package/transpiled/directives/io/lib/throttle/Interval.js +31 -0
  648. package/transpiled/directives/io/lib/throttle/Interval.js.map +1 -0
  649. package/transpiled/directives/io/lib/throttle/Keys.d.ts +12 -0
  650. package/transpiled/directives/io/lib/throttle/Keys.js +34 -0
  651. package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -0
  652. package/transpiled/directives/io/lib/throttle/Quota.d.ts +8 -0
  653. package/transpiled/directives/io/lib/throttle/Quota.js +22 -0
  654. package/transpiled/directives/io/lib/throttle/Quota.js.map +1 -0
  655. package/transpiled/directives/io/lib/throttle/Quotas.d.ts +26 -0
  656. package/transpiled/directives/io/lib/throttle/Quotas.js +61 -0
  657. package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -0
  658. package/transpiled/directives/io/lib/throttle/components/Component.d.ts +4 -0
  659. package/transpiled/directives/io/lib/throttle/components/Component.js +3 -0
  660. package/transpiled/directives/io/lib/throttle/components/Component.js.map +1 -0
  661. package/transpiled/directives/io/lib/throttle/components/IP.d.ts +6 -0
  662. package/transpiled/directives/io/lib/throttle/components/IP.js +33 -0
  663. package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -0
  664. package/transpiled/directives/io/lib/throttle/components/Path.d.ts +5 -0
  665. package/transpiled/directives/io/lib/throttle/components/Path.js +10 -0
  666. package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -0
  667. package/transpiled/directives/io/lib/throttle/components/index.d.ts +5 -0
  668. package/transpiled/directives/io/lib/throttle/components/index.js +10 -0
  669. package/transpiled/directives/io/lib/throttle/components/index.js.map +1 -0
  670. package/transpiled/directives/io/lib/throttle/conditions/Condition.d.ts +4 -0
  671. package/transpiled/directives/io/lib/throttle/conditions/Condition.js +3 -0
  672. package/transpiled/directives/io/lib/throttle/conditions/Condition.js.map +1 -0
  673. package/transpiled/directives/io/lib/throttle/conditions/Status.d.ts +7 -0
  674. package/transpiled/directives/io/lib/throttle/conditions/Status.js +19 -0
  675. package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -0
  676. package/transpiled/directives/io/lib/throttle/conditions/index.d.ts +5 -0
  677. package/transpiled/directives/io/lib/throttle/conditions/index.js +8 -0
  678. package/transpiled/directives/io/lib/throttle/conditions/index.js.map +1 -0
  679. package/transpiled/directives/io/lib/throttle/index.d.ts +2 -0
  680. package/transpiled/directives/io/lib/throttle/index.js +8 -0
  681. package/transpiled/directives/io/lib/throttle/index.js.map +1 -0
  682. package/transpiled/directives/io/schemas.d.ts +2 -0
  683. package/transpiled/directives/io/schemas.js +2 -1
  684. package/transpiled/directives/io/schemas.js.map +1 -1
  685. package/transpiled/directives/map/Authority.d.ts +6 -0
  686. package/transpiled/directives/map/Authority.js +19 -0
  687. package/transpiled/directives/map/Authority.js.map +1 -0
  688. package/transpiled/directives/map/Buffer.d.ts +6 -0
  689. package/transpiled/directives/map/Buffer.js +19 -0
  690. package/transpiled/directives/map/Buffer.js.map +1 -0
  691. package/transpiled/directives/map/Claims.d.ts +10 -0
  692. package/transpiled/directives/map/Claims.js +44 -0
  693. package/transpiled/directives/map/Claims.js.map +1 -0
  694. package/transpiled/directives/map/Directive.d.ts +3 -0
  695. package/transpiled/directives/map/Directive.js.map +1 -0
  696. package/transpiled/directives/map/Headers.d.ts +7 -0
  697. package/transpiled/directives/map/Headers.js +34 -0
  698. package/transpiled/directives/map/Headers.js.map +1 -0
  699. package/transpiled/directives/map/Language.d.ts +10 -0
  700. package/transpiled/directives/map/Language.js +38 -0
  701. package/transpiled/directives/map/Language.js.map +1 -0
  702. package/transpiled/directives/map/Languages.d.ts +4 -0
  703. package/transpiled/directives/map/Languages.js +17 -0
  704. package/transpiled/directives/map/Languages.js.map +1 -0
  705. package/transpiled/directives/map/Map.d.ts +13 -0
  706. package/transpiled/directives/map/Map.js +48 -0
  707. package/transpiled/directives/map/Map.js.map +1 -0
  708. package/transpiled/directives/map/Mapping.d.ts +13 -0
  709. package/transpiled/directives/map/Mapping.js +13 -0
  710. package/transpiled/directives/map/Mapping.js.map +1 -0
  711. package/transpiled/directives/{vary → map}/Properties.d.ts +2 -2
  712. package/transpiled/directives/{vary → map}/Properties.js +1 -3
  713. package/transpiled/directives/map/Properties.js.map +1 -0
  714. package/transpiled/directives/map/Segments.d.ts +6 -0
  715. package/transpiled/directives/map/Segments.js +30 -0
  716. package/transpiled/directives/map/Segments.js.map +1 -0
  717. package/transpiled/directives/map/index.d.ts +2 -0
  718. package/transpiled/directives/map/index.js +6 -0
  719. package/transpiled/directives/map/index.js.map +1 -0
  720. package/transpiled/directives/octets/Context.js +4 -24
  721. package/transpiled/directives/octets/Context.js.map +1 -1
  722. package/transpiled/directives/octets/Delete.js +15 -12
  723. package/transpiled/directives/octets/Delete.js.map +1 -1
  724. package/transpiled/directives/octets/{Fetch.d.ts → Get.d.ts} +5 -6
  725. package/transpiled/directives/octets/{Fetch.js → Get.js} +34 -30
  726. package/transpiled/directives/octets/Get.js.map +1 -0
  727. package/transpiled/directives/octets/Octets.js +9 -10
  728. package/transpiled/directives/octets/Octets.js.map +1 -1
  729. package/transpiled/directives/octets/{Store.d.ts → Put.d.ts} +8 -2
  730. package/transpiled/directives/octets/{Store.js → Put.js} +33 -27
  731. package/transpiled/directives/octets/Put.js.map +1 -0
  732. package/transpiled/directives/octets/Workflow.js +7 -2
  733. package/transpiled/directives/octets/Workflow.js.map +1 -1
  734. package/transpiled/directives/octets/bytes.d.ts +1 -0
  735. package/transpiled/directives/octets/bytes.js +21 -0
  736. package/transpiled/directives/octets/bytes.js.map +1 -0
  737. package/transpiled/directives/octets/schemas.d.ts +4 -8
  738. package/transpiled/directives/octets/schemas.js +3 -6
  739. package/transpiled/directives/octets/schemas.js.map +1 -1
  740. package/transpiled/directives/octets/types.d.ts +2 -0
  741. package/transpiled/directives/octets/workflows/Execution.d.ts +7 -1
  742. package/transpiled/directives/octets/workflows/Execution.js +44 -9
  743. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  744. package/transpiled/directives/octets/workflows/Workflow.d.ts +8 -3
  745. package/transpiled/directives/octets/workflows/Workflow.js +10 -4
  746. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  747. package/transpiled/directives/octets/workflows/index.d.ts +1 -1
  748. package/transpiled/directives/octets/workflows/index.js.map +1 -1
  749. package/transpiled/exceptions.js +11 -2
  750. package/transpiled/exceptions.js.map +1 -1
  751. package/transpiled/manifest.js +10 -11
  752. package/transpiled/manifest.js.map +1 -1
  753. package/transpiled/root.js +16 -1
  754. package/transpiled/root.js.map +1 -1
  755. package/transpiled/tsconfig.tsbuildinfo +1 -1
  756. package/components/identity.federation/operations/lib/assertions-as-values.d.ts +0 -4
  757. package/components/identity.federation/operations/lib/assertions-as-values.js.map +0 -1
  758. package/components/identity.federation/operations/lib/jwt.d.ts +0 -20
  759. package/components/identity.federation/operations/lib/jwt.js +0 -136
  760. package/components/identity.federation/operations/lib/jwt.js.map +0 -1
  761. package/components/identity.federation/operations/schemas.d.ts +0 -63
  762. package/components/identity.federation/operations/schemas.js +0 -9
  763. package/components/identity.federation/operations/schemas.js.map +0 -1
  764. package/components/identity.federation/operations/types.d.ts +0 -56
  765. package/components/identity.federation/operations/types.js.map +0 -1
  766. package/components/identity.federation/source/lib/assertions-as-values.ts +0 -19
  767. package/components/identity.federation/source/lib/jwt.test.ts +0 -56
  768. package/components/identity.federation/source/lib/jwt.ts +0 -171
  769. package/components/identity.federation/source/schemas.ts +0 -65
  770. package/components/identity.federation/source/types.ts +0 -62
  771. package/components/identity.tokens/operations/types.d.ts +0 -46
  772. package/components/identity.tokens/operations/types.js.map +0 -1
  773. package/components/octets.storage/operations/fetch.js +0 -46
  774. package/components/octets.storage/operations/list.js +0 -7
  775. package/components/octets.storage/operations/store.js +0 -11
  776. package/documentation/vary.md +0 -69
  777. package/features/steps/IdP.ts +0 -154
  778. package/features/steps/components/octets.tester/operations/diversify.js +0 -14
  779. package/features/vary.feature +0 -252
  780. package/schemas/octets/context.cos.yaml +0 -1
  781. package/schemas/octets/fetch.cos.yaml +0 -3
  782. package/schemas/octets/permute.cos.yaml +0 -1
  783. package/schemas/octets/store.cos.yaml +0 -3
  784. package/source/directives/octets/Fetch.ts +0 -100
  785. package/source/directives/octets/List.ts +0 -72
  786. package/source/directives/octets/Store.ts +0 -126
  787. package/source/directives/vary/Directive.ts +0 -7
  788. package/source/directives/vary/Embed.ts +0 -68
  789. package/source/directives/vary/Vary.ts +0 -50
  790. package/source/directives/vary/embeddings/Authority.ts +0 -8
  791. package/source/directives/vary/embeddings/Embedding.ts +0 -7
  792. package/source/directives/vary/embeddings/Header.ts +0 -32
  793. package/source/directives/vary/embeddings/Language.ts +0 -31
  794. package/source/directives/vary/embeddings/Parameter.ts +0 -14
  795. package/source/directives/vary/embeddings/index.ts +0 -13
  796. package/source/directives/vary/index.ts +0 -3
  797. package/transpiled/directives/octets/Fetch.js.map +0 -1
  798. package/transpiled/directives/octets/List.d.ts +0 -16
  799. package/transpiled/directives/octets/List.js +0 -74
  800. package/transpiled/directives/octets/List.js.map +0 -1
  801. package/transpiled/directives/octets/Store.js.map +0 -1
  802. package/transpiled/directives/vary/Directive.d.ts +0 -6
  803. package/transpiled/directives/vary/Directive.js.map +0 -1
  804. package/transpiled/directives/vary/Embed.d.ts +0 -11
  805. package/transpiled/directives/vary/Embed.js +0 -51
  806. package/transpiled/directives/vary/Embed.js.map +0 -1
  807. package/transpiled/directives/vary/Properties.js.map +0 -1
  808. package/transpiled/directives/vary/Vary.d.ts +0 -10
  809. package/transpiled/directives/vary/Vary.js +0 -36
  810. package/transpiled/directives/vary/Vary.js.map +0 -1
  811. package/transpiled/directives/vary/embeddings/Authority.d.ts +0 -5
  812. package/transpiled/directives/vary/embeddings/Authority.js +0 -10
  813. package/transpiled/directives/vary/embeddings/Authority.js.map +0 -1
  814. package/transpiled/directives/vary/embeddings/Embedding.d.ts +0 -6
  815. package/transpiled/directives/vary/embeddings/Embedding.js.map +0 -1
  816. package/transpiled/directives/vary/embeddings/Header.d.ts +0 -7
  817. package/transpiled/directives/vary/embeddings/Header.js +0 -28
  818. package/transpiled/directives/vary/embeddings/Header.js.map +0 -1
  819. package/transpiled/directives/vary/embeddings/Language.d.ts +0 -7
  820. package/transpiled/directives/vary/embeddings/Language.js +0 -28
  821. package/transpiled/directives/vary/embeddings/Language.js.map +0 -1
  822. package/transpiled/directives/vary/embeddings/Parameter.d.ts +0 -7
  823. package/transpiled/directives/vary/embeddings/Parameter.js +0 -14
  824. package/transpiled/directives/vary/embeddings/Parameter.js.map +0 -1
  825. package/transpiled/directives/vary/embeddings/index.d.ts +0 -5
  826. package/transpiled/directives/vary/embeddings/index.js +0 -14
  827. package/transpiled/directives/vary/embeddings/index.js.map +0 -1
  828. package/transpiled/directives/vary/index.d.ts +0 -2
  829. package/transpiled/directives/vary/index.js +0 -6
  830. package/transpiled/directives/vary/index.js.map +0 -1
  831. /package/components/{identity.federation/operations → identity.tokens/operations/lib}/types.js +0 -0
  832. /package/schemas/octets/{list.cos.yaml → get.cos.yaml} +0 -0
  833. /package/{components/identity.tokens/operations → transpiled/directives/flow}/types.js +0 -0
  834. /package/transpiled/directives/{vary → map}/Directive.js +0 -0
@@ -1,18 +1,22 @@
1
+ import assert from 'node:assert'
1
2
  import fs from 'node:fs'
2
3
  import os from 'node:os'
3
4
  import * as http from 'node:http'
4
5
  import { once } from 'node:events'
6
+ import { setTimeout } from 'node:timers/promises'
7
+ import { console, current, decide, decode, run, type SpanContext } from 'openspan'
5
8
  import { Connector } from '@toa.io/core'
6
9
  import { type OutgoingMessage, write } from './messages'
7
10
  import { ClientError, Exception } from './exceptions'
8
- import { Context } from './Context'
9
- import type { IncomingMessage } from './Context'
11
+ import { Context, type IncomingMessage } from './Context'
10
12
 
11
13
  export class Server extends Connector {
12
14
  private readonly server: http.Server = http.createServer()
13
15
  private readonly properties: Properties
14
16
  private readonly authorities: Record<string, string>
15
- private process?: Processing
17
+ private process?: Processor
18
+ private ready: boolean = false
19
+ private startedAt: number = 0
16
20
 
17
21
  private constructor (properties: Properties) {
18
22
  super()
@@ -21,71 +25,147 @@ export class Server extends Connector {
21
25
  this.authorities = Object.fromEntries(Object.entries(properties.authorities).map(([key, value]) => [value, key]))
22
26
 
23
27
  this.server.on('request', (req, res) => this.listener(req, res))
24
- }
25
-
26
- public get port (): number {
27
- if (this.properties.port !== 0)
28
- return this.properties.port
29
-
30
- const address = this.server.address()
31
28
 
32
- if (address === null || typeof address === 'string')
33
- throw new Error('Server is not listening on a port.')
29
+ this.server.on('clientError', (error, socket) => {
30
+ console.warn('Client connection error', error)
34
31
 
35
- return address.port
32
+ if (socket.writable) socket.end('HTTP/1.1 400 Bad Request\r\n\r\n')
33
+ else socket.destroy()
34
+ })
36
35
  }
37
36
 
38
37
  public static create (options: Options): Server {
39
- const properties: Properties = Object.assign({}, DEFAULTS, options)
38
+ const properties: Properties = { ...DEFAULTS, ...options }
40
39
 
41
40
  return new Server(properties)
42
41
  }
43
42
 
44
- public attach (process: Processing): void {
43
+ public attach (process: Processor): void {
45
44
  this.process = process
46
45
  }
47
46
 
48
47
  protected override async open (): Promise<void> {
48
+ this.startedAt = Date.now()
49
49
  this.server.listen(this.properties.port)
50
50
 
51
51
  await once(this.server, 'listening')
52
52
 
53
- console.info('HTTP Server is listening.')
53
+ console.info('HTTP Server is listening')
54
+
55
+ await setTimeout(this.properties.delay)
56
+
57
+ this.ready = true
58
+
59
+ console.info('Ready')
54
60
  }
55
61
 
56
62
  protected override async close (): Promise<void> {
63
+ this.ready = false
64
+
57
65
  this.server.close()
66
+ this.server.closeIdleConnections()
67
+
68
+ console.info('Stopped accepting new connections')
58
69
 
59
- console.info('HTTP Server stopped accepting new connections.')
70
+ // keep-alive clients hold connections open indefinitely, so the drain is bounded
71
+ await Promise.race([
72
+ once(this.server, 'close'),
73
+ setTimeout(this.properties.drain, undefined, { ref: false })
74
+ ])
60
75
 
61
- await once(this.server, 'close')
76
+ this.server.closeAllConnections()
62
77
 
63
- console.info('HTTP Server has been stopped.')
78
+ console.info('Stopped')
64
79
  }
65
80
 
66
81
  private listener (request: http.IncomingMessage, response: http.ServerResponse): void {
82
+ request.once('error', (error) => {
83
+ console.warn('Request error', errorAttributes(request, error))
84
+
85
+ if (!response.writableEnded)
86
+ response.destroy()
87
+ })
88
+
89
+ request.socket.once('error', (error) => {
90
+ console.warn('Socket error', errorAttributes(request, error))
91
+
92
+ if (!response.writableEnded)
93
+ response.destroy()
94
+ })
95
+
96
+ const invalid = validate(request)
97
+
98
+ if (invalid !== null) {
99
+ console.warn('Invalid request', errorAttributes(request, invalid))
100
+
101
+ response.writeHead(400).end()
102
+
103
+ return
104
+ }
105
+
67
106
  if (request.method === undefined || !this.properties.methods.has(request.method)) {
68
107
  response.writeHead(501).end()
69
108
 
70
109
  return
71
110
  }
72
111
 
73
- if (request.headers.host === undefined || !(request.headers.host in this.authorities)) {
74
- response.writeHead(404).end('Unknown authority')
112
+ if (request.url === '/.ready') {
113
+ if (this.ready)
114
+ response.writeHead(200, { 'cache-control': 'no-store' }).end()
115
+ else {
116
+ const remaining = (Math.ceil((Date.now() - this.startedAt) / 1000)).toString()
117
+
118
+ response.writeHead(503, { 'retry-after': remaining }).end()
119
+ }
75
120
 
76
121
  return
77
122
  }
78
123
 
79
- const authority = this.authorities[request.headers.host]
80
- const context = new Context(authority, request as IncomingMessage, this.properties)
124
+ assert(this.process !== undefined, 'Request processor is not attached')
125
+
126
+ const host = request.headers.host!
127
+ const authority = this.authorities[host] ?? host
128
+
129
+ // if the request carries no trace context, the trace starts here
130
+ const remote = trace(request.headers)
131
+
132
+ const processing = remote === null
133
+ ? this.serve(request, response, authority)
134
+ : run(remote, async () => await this.serve(request, response, authority))
81
135
 
82
- this.process!(context)
83
- .then(this.success(context, response))
84
- .catch(this.fail(context, response))
136
+ processing.catch((error) => {
137
+ console.error('Request processing failed', error)
138
+
139
+ if (!response.writableEnded)
140
+ response.writeHead(500).end()
141
+ })
142
+ }
143
+
144
+ private async serve (request: http.IncomingMessage,
145
+ response: http.ServerResponse,
146
+ authority: string): Promise<void> {
147
+ await console.span({
148
+ name: `${request.method} ${request.url}`,
149
+ kind: 'server',
150
+ service: 'exposition',
151
+ attributes: { method: request.method, url: request.url, authority }
152
+ }, async () => {
153
+ response.setHeader('ray', current()!.traceId)
154
+
155
+ const context = new Context(authority, request as IncomingMessage, this.properties)
156
+
157
+ await this.process!(context)
158
+ .then(this.success(context, response))
159
+ .catch(this.fail(context, response))
160
+ .finally(() => {
161
+ request.removeAllListeners('error')
162
+ request.socket.removeAllListeners('error')
163
+ })
164
+ })
85
165
  }
86
166
 
87
167
  private success (context: Context, response: http.ServerResponse) {
88
- return (message: OutgoingMessage) => {
168
+ return async (message: OutgoingMessage) => {
89
169
  let status = message.status
90
170
 
91
171
  if (status === undefined)
@@ -93,63 +173,161 @@ export class Server extends Connector {
93
173
  status = 404
94
174
  else if (context.request.method === 'POST')
95
175
  status = 201
96
- else if (message.body === undefined)
176
+ else if (message.body === undefined && context.request.method !== 'HEAD')
97
177
  status = 204
98
178
  else
99
179
  status = 200
100
180
 
101
- response.statusCode = message.status = status
102
- write(context, response, message)
181
+ message.status = status
182
+
183
+ await write(context, response, message)
103
184
  }
104
185
  }
105
186
 
106
187
  private fail (context: Context, response: http.ServerResponse) {
107
188
  return async (exception: Error) => {
108
- if (!context.request.complete)
109
- await adam(context.request)
110
-
111
- response.statusCode = exception instanceof Exception ? exception.status : 500
112
-
113
- const message: OutgoingMessage = { status: response.statusCode }
114
- const verbose = exception instanceof ClientError || this.properties.debug
189
+ try {
190
+ if (!context.request.complete)
191
+ await adam(context.request)
192
+
193
+ const status = exception instanceof Exception ? exception.status : 500
194
+ const span = current()
195
+
196
+ // https://opentelemetry.io/docs/specs/semconv/http/http-spans/#status
197
+ if (status >= 500 && span !== undefined)
198
+ span.status = 'error'
199
+
200
+ if (!response.writableEnded) {
201
+ response.statusCode = status
202
+
203
+ const message: OutgoingMessage = { status: response.statusCode }
204
+
205
+ // eslint-disable-next-line max-depth
206
+ if (context.encoder === null)
207
+ message.body = undefined
208
+ else if (exception instanceof ClientError || this.properties.debug)
209
+ message.body =
210
+ exception instanceof Exception
211
+ ? exception.body
212
+ : (this.properties.debug && exception.stack) ?? exception.message
213
+
214
+ await write(context, response, message)
215
+ }
216
+ } catch (final) {
217
+ console.error('Error in error handler', final)
218
+
219
+ if (!response.writableEnded)
220
+ try {
221
+ response.writeHead(500).end()
222
+ } catch (e) {
223
+ // Nothing more we can do
224
+ }
225
+ }
226
+ }
227
+ }
228
+ }
115
229
 
116
- if (verbose)
117
- message.body =
118
- exception instanceof Exception
119
- ? exception.body
120
- : exception.stack ?? exception.message
230
+ function validate (request: http.IncomingMessage): null | Error {
231
+ try {
232
+ void new URL(request.url!, `https://${request.headers.host}`)
121
233
 
122
- write(context, response, message)
123
- }
234
+ return null
235
+ } catch (error) {
236
+ return error as Error
124
237
  }
125
238
  }
126
239
 
127
240
  // https://github.com/whatwg/fetch/issues/1254
128
- async function adam (request: http.IncomingMessage): Promise<any> {
241
+ async function adam (request: http.IncomingMessage): Promise<void> {
129
242
  const devnull = fs.createWriteStream(os.devNull)
130
243
 
131
- request.pipe(devnull)
244
+ devnull.on('error', () => undefined)
245
+ request.pipe(devnull).on('error', () => undefined)
246
+
247
+ await once(request, 'end')
248
+ }
249
+
250
+ function errorAttributes (request: http.IncomingMessage, error: Error & any): RequestErrorAttributes {
251
+ const attributes: RequestErrorAttributes = {
252
+ path: request.url!,
253
+ method: request.method!,
254
+ name: error.name
255
+ }
132
256
 
133
- return once(request, 'end')
257
+ if (typeof error.code === 'string')
258
+ attributes.code = error.code
259
+
260
+ if (typeof error.stack === 'string')
261
+ attributes.stack = error.stack
262
+
263
+ return attributes
134
264
  }
135
265
 
266
+ export const PORT = 8000
267
+ export const DELAY = 3 // seconds
268
+ export const DRAIN = 10 // seconds
269
+
270
+ /**
271
+ * Extracts the remote trace context from the request headers.
272
+ *
273
+ * The `ray` header adopts the trace by ID only and does not bypass sampling:
274
+ * the sampling decision is made by the server.
275
+ */
276
+ function trace (headers: http.IncomingHttpHeaders): SpanContext | null {
277
+ if (typeof headers.traceparent === 'string')
278
+ return decode(headers.traceparent)
279
+
280
+ // adopting a trace by ID does not bypass sampling
281
+ if (typeof headers.ray === 'string' && RAY.test(headers.ray) && headers.ray !== ZERO_RAY)
282
+ return { traceId: headers.ray.toLowerCase(), sampled: decide() }
283
+
284
+ return null
285
+ }
286
+
287
+ const RAY = /^[\da-f]{32}$/i
288
+ const ZERO_RAY = '0'.repeat(32)
289
+
136
290
  const DEFAULTS: Omit<Properties, 'authorities'> = {
137
- methods: new Set<string>(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']),
291
+ methods: new Set<string>(['OPTIONS', 'GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'LOCK', 'UNLOCK']),
138
292
  debug: false,
139
- trace: false,
140
- port: 8000
293
+ port: PORT,
294
+ delay: DELAY * 1000,
295
+ drain: DRAIN * 1000
141
296
  }
142
297
 
143
298
  interface Properties {
144
299
  authorities: Record<string, string>
145
300
  methods: Set<string>
146
301
  debug: boolean
147
- trace: boolean
148
302
  port: number
303
+ delay: number
304
+ drain: number
149
305
  }
150
306
 
151
307
  export type Options = { authorities: Properties['authorities'] } & {
152
308
  [K in Exclude<keyof Properties, 'authorities'>]?: Properties[K]
153
309
  }
154
310
 
155
- export type Processing = (input: Context) => Promise<OutgoingMessage>
311
+ export type Processor = (input: Context) => Promise<OutgoingMessage>
312
+
313
+ interface RequestErrorAttributes {
314
+ path: string
315
+ method: string
316
+ name: string
317
+ code?: string
318
+ stack?: string
319
+ }
320
+
321
+ /**
322
+ * I'm too fucking dumb to figure out how to handle this in a better way.
323
+ * It can be reproduced by calling `response.destroy()` on the client side while reading
324
+ * an empty stream.
325
+ */
326
+ process.on('uncaughtException', (err: unknown) => {
327
+ const code = (err as { code?: string }).code
328
+
329
+ if (code === 'ECONNRESET' || code === 'EPIPE')
330
+ console.warn('Connection reset by peer', code)
331
+ else
332
+ throw err
333
+ })
@@ -2,18 +2,10 @@ import { performance } from 'node:perf_hooks'
2
2
  import type { ServerResponse } from 'node:http'
3
3
 
4
4
  export class Timing {
5
- private readonly skip: boolean
6
5
  private readonly start = performance.now()
7
6
  private readonly breakpoints: Breakpoint[] = []
8
7
 
9
- public constructor (enabled: boolean) {
10
- this.skip = !enabled
11
- }
12
-
13
- public async capture<T> (id: string, promise: Promise<T>): Promise<T> {
14
- if (this.skip)
15
- return promise
16
-
8
+ public async capture<T>(id: string, promise: Promise<T>): Promise<T> {
17
9
  const start = performance.now()
18
10
  const result = promise instanceof Promise ? await promise : promise
19
11
 
@@ -23,9 +15,6 @@ export class Timing {
23
15
  }
24
16
 
25
17
  public append (response: ServerResponse): void {
26
- if (this.skip)
27
- return
28
-
29
18
  this.breakpoints.push({ id: 'total', duration: performance.now() - this.start })
30
19
 
31
20
  for (const breakpoint of this.breakpoints)
@@ -36,27 +36,33 @@ export class NotFound extends ClientError {
36
36
  }
37
37
  }
38
38
 
39
- export class Conflict extends ClientError {
40
- public constructor (body?: any) {
41
- super(409, body)
39
+ export class MethodNotAllowed extends ClientError {
40
+ public constructor () {
41
+ super(405)
42
42
  }
43
43
  }
44
44
 
45
- export class UnprocessableEntity extends ClientError {
45
+ export class NotAcceptable extends ClientError {
46
+ public constructor () {
47
+ super(406)
48
+ }
49
+ }
50
+
51
+ export class Conflict extends ClientError {
46
52
  public constructor (body?: any) {
47
- super(422, body)
53
+ super(409, body)
48
54
  }
49
55
  }
50
56
 
51
- export class MethodNotAllowed extends ClientError {
57
+ export class PreconditionFailed extends ClientError {
52
58
  public constructor () {
53
- super(405)
59
+ super(412)
54
60
  }
55
61
  }
56
62
 
57
- export class NotAcceptable extends ClientError {
58
- public constructor () {
59
- super(406)
63
+ export class RequestEntityTooLarge extends ClientError {
64
+ public constructor (body?: any) {
65
+ super(413, body)
60
66
  }
61
67
  }
62
68
 
@@ -66,8 +72,20 @@ export class UnsupportedMediaType extends ClientError {
66
72
  }
67
73
  }
68
74
 
69
- export class PreconditionFailed extends ClientError {
75
+ export class UnprocessableEntity extends ClientError {
76
+ public constructor (body?: any) {
77
+ super(422, body)
78
+ }
79
+ }
80
+
81
+ export class TooManyRequests extends ClientError {
70
82
  public constructor () {
71
- super(412)
83
+ super(429)
84
+ }
85
+ }
86
+
87
+ export class ServiceUnavailable extends Exception {
88
+ public constructor (body?: any) {
89
+ super(503, body)
72
90
  }
73
91
  }
@@ -1,14 +1,13 @@
1
- import { type Buffer } from 'node:buffer'
2
1
  import * as json from './json'
3
2
  import * as yaml from './yaml'
4
3
  import * as msgpack from './msgpack'
5
4
  import * as text from './text'
6
5
 
7
6
  export const formats: Record<string, Format> = {
8
- [msgpack.type]: msgpack,
9
- [yaml.type]: yaml,
10
7
  [json.type]: json,
11
- [text.type]: text
8
+ [yaml.type]: yaml,
9
+ [text.type]: text,
10
+ [msgpack.type]: msgpack
12
11
  }
13
12
 
14
13
  export const types = Object.keys(formats)
@@ -18,5 +17,5 @@ export interface Format {
18
17
  readonly multipart: string
19
18
 
20
19
  encode: (value: any) => Buffer
21
- decode: (buffer: Buffer) => any
20
+ decode: (buffer: Buffer, charset?: string) => any
22
21
  }
@@ -1,10 +1,8 @@
1
- import { Buffer } from 'node:buffer'
2
-
3
1
  export const type = 'application/json'
4
2
  export const multipart = 'multipart/json'
5
3
 
6
- export function decode (buffer: Buffer): any {
7
- const text = buffer.toString()
4
+ export function decode (buffer: Buffer, charset = 'utf-8'): any {
5
+ const text = buffer.toString(charset as BufferEncoding)
8
6
 
9
7
  return JSON.parse(text)
10
8
  }
@@ -1,4 +1,3 @@
1
- import { type Buffer } from 'node:buffer'
2
1
  import { pack, unpack } from 'msgpackr'
3
2
 
4
3
  export function decode (buffer: Buffer): any {
@@ -1,10 +1,8 @@
1
- import { Buffer } from 'node:buffer'
2
-
3
1
  export const type = 'text/plain'
4
2
  export const multipart = 'multipart/text'
5
3
 
6
- export function decode (buffer: Buffer): any {
7
- return buffer.toString()
4
+ export function decode (buffer: Buffer, charset = 'utf-8'): any {
5
+ return buffer.toString(charset as BufferEncoding)
8
6
  }
9
7
 
10
8
  export function encode (value: { toString: () => string }): Buffer {
@@ -1,11 +1,10 @@
1
- import { Buffer } from 'node:buffer'
2
1
  import * as yaml from 'js-yaml'
3
2
 
4
3
  export const type = 'application/yaml'
5
4
  export const multipart = 'multipart/yaml'
6
5
 
7
- export function decode (buffer: Buffer): any {
8
- const text = buffer.toString()
6
+ export function decode (buffer: Buffer, charset = 'utf-8'): any {
7
+ const text = buffer.toString(charset as BufferEncoding)
9
8
 
10
9
  return yaml.load(text)
11
10
  }
@@ -1,9 +1,13 @@
1
- import { Readable } from 'node:stream'
1
+ import { PassThrough, Readable } from 'node:stream'
2
+ import * as streamConsumers from 'node:stream/consumers'
3
+ import { once } from 'node:events'
2
4
  import { generate } from 'randomstring'
3
5
  import * as msgpack from 'msgpackr'
4
- import { read } from './messages'
6
+ import { multipart, read, type OutgoingMessage } from './messages'
5
7
  import { BadRequest, UnsupportedMediaType } from './exceptions'
8
+ import { formats } from './formats'
6
9
  import { Timing } from './Timing'
10
+ import type * as http from 'node:http'
7
11
  import type { Context } from './Context'
8
12
 
9
13
  beforeEach(() => {
@@ -53,6 +57,17 @@ describe('read', () => {
53
57
  expect(output).toStrictEqual(input)
54
58
  })
55
59
 
60
+ it('should parse application/json with charset parameter', async () => {
61
+ const path = generate()
62
+ const headers = { 'content-type': 'application/json; charset=utf-8' }
63
+ const input = { [generate()]: generate() }
64
+ const json = JSON.stringify(input)
65
+ const context = createContext(path, headers, json)
66
+ const output = await read(context)
67
+
68
+ expect(output).toStrictEqual(input)
69
+ })
70
+
56
71
  it('should throw on unsupported request media type', async () => {
57
72
  const path = generate()
58
73
  const headers = { 'content-type': 'wtf/' + generate() }
@@ -69,20 +84,68 @@ describe('read', () => {
69
84
 
70
85
  await expect(read(request)).rejects.toThrow(BadRequest)
71
86
  })
87
+
88
+ it('should output correct mulitpart format', async () => {
89
+ const response = new class extends PassThrough {
90
+ public readonly headers = new Headers()
91
+
92
+ public setHeader (key: string, value: string): this {
93
+ this.headers.set(key, value)
94
+
95
+ return this
96
+ }
97
+ }()
98
+
99
+ const context = { encoder: formats['text/plain'] } as unknown as Context
100
+ const message = { body: Readable.from(['Hello', 'New', 'World']) } as unknown as OutgoingMessage
101
+
102
+ multipart(message, context, response as unknown as http.ServerResponse)
103
+
104
+ await once(message.body, 'end')
105
+
106
+ const result = await streamConsumers.text(response)
107
+
108
+ expect(result).toBe([
109
+ '--cut',
110
+ '',
111
+ 'ACK',
112
+ '--cut',
113
+ '',
114
+ 'Hello',
115
+ '--cut',
116
+ '',
117
+ 'New',
118
+ '--cut',
119
+ '',
120
+ 'World',
121
+ '--cut',
122
+ '',
123
+ 'FIN',
124
+ '--cut--'].join('\r\n'))
125
+ })
72
126
  })
73
127
 
74
- export function createContext
75
- (url: string, headers: Record<string, string> = {}, content: string | Buffer = ''):
128
+ export function createContext (url: string, headers: Record<string, string> = {}, content: string | Buffer = ''):
76
129
  jest.MockedObject<Context> {
77
- const buffer = Buffer.isBuffer(content) ? content : Buffer.from(content)
78
- const stream = Readable.from(buffer)
130
+ const data = Buffer.isBuffer(content) ? content : Buffer.from(content)
131
+ const stream = Readable.from(data)
132
+ let consumed = false
79
133
 
80
134
  const mock: Partial<Context> = {
81
135
  request: Object.assign(stream, {
82
136
  url,
83
137
  headers
84
138
  }) as unknown as Context['request'],
85
- timing: new Timing(false)
139
+ url: new URL(url, 'https://host.local'),
140
+ timing: new Timing(),
141
+ buffer: async () => {
142
+ if (consumed)
143
+ throw new Error('Request body already consumed')
144
+
145
+ consumed = true
146
+
147
+ return data
148
+ }
86
149
  }
87
150
 
88
151
  return mock as unknown as jest.MockedObject<Context>