@toa.io/extensions.exposition 1.0.0-alpha.24 → 1.0.0-alpha.241

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 (821) 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/tree.md +13 -0
  231. package/features/access.feature +67 -2
  232. package/features/auth.assert.feature +57 -0
  233. package/features/auth.claims.feature +170 -0
  234. package/features/auth.incept.feature +120 -0
  235. package/features/auth.input.feature +59 -0
  236. package/features/auth.issue.feature +32 -0
  237. package/features/authorities.feature +3 -3
  238. package/features/authorities.federation.feature +20 -20
  239. package/features/authorities.tokens.feature +1 -2
  240. package/features/body.feature +27 -0
  241. package/features/cache.feature +92 -3
  242. package/features/cors.feature +28 -7
  243. package/features/debug.feature +34 -0
  244. package/features/dev.feature +87 -0
  245. package/features/dynamic.feature +82 -1
  246. package/features/errors.feature +17 -5
  247. package/features/etag.feature +134 -1
  248. package/features/flow.feature +148 -0
  249. package/features/identity.basic.feature +81 -6
  250. package/features/identity.feature +11 -4
  251. package/features/identity.federation.feature +122 -42
  252. package/features/identity.otp.feature +101 -0
  253. package/features/identity.roles.feature +52 -3
  254. package/features/identity.tokens.feature +1 -99
  255. package/features/identtiy.tokens.custom.feature +247 -0
  256. package/features/interruptions.feature +19 -0
  257. package/features/introspection.feature +153 -0
  258. package/features/io.feature +0 -1
  259. package/features/io.throttle.feature +40 -0
  260. package/features/map.feature +356 -0
  261. package/features/methods.feature +47 -0
  262. package/features/octets.cloudinary.feature +223 -0
  263. package/features/octets.download.feature +189 -0
  264. package/features/octets.entries.feature +8 -58
  265. package/features/octets.feature +58 -65
  266. package/features/octets.head.feature +40 -0
  267. package/features/octets.location.feature +83 -0
  268. package/features/octets.meta.feature +62 -15
  269. package/features/octets.workflows.feature +332 -67
  270. package/features/passkeys.feature +66 -0
  271. package/features/probes.feature +14 -0
  272. package/features/{queries.feature → query.feature} +132 -0
  273. package/features/realtime.feature +34 -0
  274. package/features/response.feature +29 -0
  275. package/features/routes.feature +86 -2
  276. package/features/server.feature +21 -0
  277. package/features/steps/.env.example +5 -0
  278. package/features/steps/Captures.ts +12 -0
  279. package/features/steps/Common.ts +4 -0
  280. package/features/steps/Gateway.ts +14 -1
  281. package/features/steps/HTTP.ts +27 -3
  282. package/features/steps/IDP.ts +334 -0
  283. package/features/steps/Identity.ts +51 -0
  284. package/features/steps/OTP.ts +39 -0
  285. package/features/steps/Parameters.ts +88 -2
  286. package/features/steps/Realtime.ts +151 -0
  287. package/features/steps/Workspace.ts +1 -2
  288. package/features/steps/components/echo/manifest.toa.yaml +17 -0
  289. package/features/steps/components/echo/operations/echo.js +7 -0
  290. package/features/steps/components/echo/operations/parameters.js +7 -0
  291. package/features/steps/components/echo/operations/ping.js +7 -0
  292. package/features/steps/components/echo/operations/unwrap.js +7 -0
  293. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  294. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  295. package/features/steps/components/greeter/manifest.toa.yaml +0 -1
  296. package/features/steps/components/octets.tester/manifest.toa.yaml +26 -3
  297. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  298. package/features/steps/components/octets.tester/operations/bar.js +0 -1
  299. package/features/steps/components/octets.tester/operations/baz.js +1 -1
  300. package/features/steps/components/octets.tester/operations/echo.js +1 -1
  301. package/features/steps/components/octets.tester/operations/foo.js +2 -2
  302. package/features/steps/components/octets.tester/operations/id.js +7 -0
  303. package/features/steps/components/octets.tester/operations/identity.js +7 -0
  304. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  305. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  306. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  307. package/features/steps/components/pots/manifest.toa.yaml +15 -4
  308. package/features/steps/components/sequences/manifest.toa.yaml +0 -1
  309. package/features/steps/components/users/manifest.toa.yaml +4 -2
  310. package/features/steps/components/users/operations/create.js +15 -0
  311. package/features/steps/components/users.properties/manifest.toa.yaml +0 -1
  312. package/features/streams.feature +4 -0
  313. package/features/timestamps.feature +41 -0
  314. package/features/timing.feature +1 -1
  315. package/package.json +34 -21
  316. package/schemas/annotation.cos.yaml +7 -0
  317. package/schemas/io/throttle.cos.yaml +36 -0
  318. package/schemas/method.cos.yaml +2 -1
  319. package/schemas/node.cos.yaml +2 -0
  320. package/schemas/octets/put.cos.yaml +28 -0
  321. package/schemas/query.cos.yaml +7 -10
  322. package/schemas/querystring.cos.yaml +1 -0
  323. package/source/Annotation.ts +3 -0
  324. package/source/Branch.ts +1 -0
  325. package/source/Composition.ts +0 -6
  326. package/source/Context.ts +1 -0
  327. package/source/Directive.test.ts +5 -3
  328. package/source/Directive.ts +30 -6
  329. package/source/Endpoint.ts +86 -23
  330. package/source/Factory.ts +15 -3
  331. package/source/Gateway.ts +174 -15
  332. package/source/HTTP/Context.ts +31 -6
  333. package/source/HTTP/Server.ts +172 -47
  334. package/source/HTTP/Timing.ts +1 -1
  335. package/source/HTTP/exceptions.ts +30 -12
  336. package/source/HTTP/formats/index.ts +4 -5
  337. package/source/HTTP/formats/json.ts +2 -4
  338. package/source/HTTP/formats/msgpack.ts +0 -1
  339. package/source/HTTP/formats/text.ts +2 -4
  340. package/source/HTTP/formats/yaml.ts +2 -3
  341. package/source/HTTP/messages.test.ts +70 -7
  342. package/source/HTTP/messages.ts +99 -19
  343. package/source/Introspection.ts +11 -0
  344. package/source/Mapping.ts +69 -21
  345. package/source/Query.test.ts +3 -3
  346. package/source/Query.ts +130 -33
  347. package/source/RTD/Context.ts +1 -1
  348. package/source/RTD/Directives.ts +4 -0
  349. package/source/RTD/Endpoint.ts +3 -0
  350. package/source/RTD/Method.ts +16 -0
  351. package/source/RTD/Node.ts +65 -23
  352. package/source/RTD/Route.ts +19 -9
  353. package/source/RTD/Tree.ts +22 -9
  354. package/source/RTD/expiration.test.ts +78 -0
  355. package/source/RTD/factory.ts +19 -1
  356. package/source/RTD/segment.ts +2 -0
  357. package/source/RTD/syntax/parse.test.ts +1 -1
  358. package/source/RTD/syntax/parse.ts +37 -24
  359. package/source/RTD/syntax/types.ts +9 -4
  360. package/source/Remotes.ts +7 -6
  361. package/source/Tenant.ts +40 -12
  362. package/source/const.ts +1 -0
  363. package/source/deployment.ts +20 -8
  364. package/source/directives/auth/Anonymous.ts +3 -3
  365. package/source/directives/auth/Anyone.ts +13 -0
  366. package/source/directives/auth/Assert.ts +35 -0
  367. package/source/directives/auth/Authorization.ts +58 -22
  368. package/source/directives/auth/Delegate.ts +9 -5
  369. package/source/directives/auth/Echo.ts +16 -6
  370. package/source/directives/auth/Federation.ts +84 -0
  371. package/source/directives/auth/Id.ts +1 -1
  372. package/source/directives/auth/Incept.ts +75 -23
  373. package/source/directives/auth/Input.ts +71 -0
  374. package/source/directives/auth/Role.test.ts +2 -3
  375. package/source/directives/auth/Role.ts +6 -11
  376. package/source/directives/auth/Rule.ts +3 -6
  377. package/source/directives/auth/Scheme.ts +5 -5
  378. package/source/directives/auth/create.ts +11 -0
  379. package/source/directives/auth/schemes.ts +5 -2
  380. package/source/directives/auth/split.ts +1 -1
  381. package/source/directives/auth/types.ts +12 -7
  382. package/source/directives/cache/Cache.ts +20 -7
  383. package/source/directives/cache/Control.ts +16 -16
  384. package/source/directives/cors/CORS.ts +9 -9
  385. package/source/directives/dev/Development.ts +14 -7
  386. package/source/directives/dev/Faulty.ts +26 -0
  387. package/source/directives/dev/Sleep.ts +55 -0
  388. package/source/directives/dev/types.ts +1 -1
  389. package/source/directives/flow/Compose.ts +92 -0
  390. package/source/directives/flow/Fetch.ts +86 -0
  391. package/source/directives/flow/Flow.ts +42 -0
  392. package/source/directives/flow/index.ts +3 -0
  393. package/source/directives/flow/types.ts +7 -0
  394. package/source/directives/index.ts +3 -2
  395. package/source/directives/io/Directive.ts +5 -2
  396. package/source/directives/io/IO.ts +18 -6
  397. package/source/directives/io/Input.ts +9 -6
  398. package/source/directives/io/Output.ts +6 -5
  399. package/source/directives/io/Throttle.ts +32 -0
  400. package/source/directives/io/lib/throttle/Configuration.test.ts +40 -0
  401. package/source/directives/io/lib/throttle/Configuration.ts +58 -0
  402. package/source/directives/io/lib/throttle/Interval.ts +31 -0
  403. package/source/directives/io/lib/throttle/Keys.ts +40 -0
  404. package/source/directives/io/lib/throttle/Quota.ts +22 -0
  405. package/source/directives/io/lib/throttle/Quotas.test.ts +136 -0
  406. package/source/directives/io/lib/throttle/Quotas.ts +83 -0
  407. package/source/directives/io/lib/throttle/components/Component.ts +5 -0
  408. package/source/directives/io/lib/throttle/components/IP.ts +40 -0
  409. package/source/directives/io/lib/throttle/components/Path.ts +8 -0
  410. package/source/directives/io/lib/throttle/components/index.ts +13 -0
  411. package/source/directives/io/lib/throttle/conditions/Condition.ts +5 -0
  412. package/source/directives/io/lib/throttle/conditions/Status.ts +17 -0
  413. package/source/directives/io/lib/throttle/conditions/index.ts +11 -0
  414. package/source/directives/io/lib/throttle/index.ts +2 -0
  415. package/source/directives/io/schemas.test.ts +9 -0
  416. package/source/directives/io/schemas.ts +3 -0
  417. package/source/directives/map/Authority.ts +15 -0
  418. package/source/directives/map/Buffer.ts +15 -0
  419. package/source/directives/map/Claims.ts +58 -0
  420. package/source/directives/map/Directive.ts +4 -0
  421. package/source/directives/map/Headers.ts +38 -0
  422. package/source/directives/map/Language.ts +42 -0
  423. package/source/directives/map/Languages.ts +11 -0
  424. package/source/directives/map/Map.ts +63 -0
  425. package/source/directives/map/Mapping.ts +19 -0
  426. package/source/directives/{vary → map}/Properties.ts +2 -4
  427. package/source/directives/map/Segments.ts +33 -0
  428. package/source/directives/map/index.ts +3 -0
  429. package/source/directives/octets/Context.ts +3 -2
  430. package/source/directives/octets/Delete.ts +22 -19
  431. package/source/directives/octets/Get.ts +96 -0
  432. package/source/directives/octets/Octets.ts +10 -12
  433. package/source/directives/octets/Put.ts +138 -0
  434. package/source/directives/octets/Workflow.ts +9 -3
  435. package/source/directives/octets/bytes.test.ts +30 -0
  436. package/source/directives/octets/bytes.ts +18 -0
  437. package/source/directives/octets/schemas.ts +4 -8
  438. package/source/directives/octets/types.ts +2 -0
  439. package/source/directives/octets/workflows/Execution.ts +62 -8
  440. package/source/directives/octets/workflows/Workflow.ts +18 -7
  441. package/source/directives/octets/workflows/index.ts +1 -1
  442. package/source/exceptions.ts +16 -4
  443. package/source/manifest.ts +10 -11
  444. package/source/root.ts +16 -1
  445. package/transpiled/Annotation.d.ts +2 -0
  446. package/transpiled/Branch.d.ts +1 -0
  447. package/transpiled/Composition.d.ts +0 -1
  448. package/transpiled/Composition.js +0 -4
  449. package/transpiled/Composition.js.map +1 -1
  450. package/transpiled/Context.d.ts +1 -0
  451. package/transpiled/Directive.d.ts +3 -0
  452. package/transpiled/Directive.js +24 -6
  453. package/transpiled/Directive.js.map +1 -1
  454. package/transpiled/Endpoint.d.ts +6 -4
  455. package/transpiled/Endpoint.js +63 -17
  456. package/transpiled/Endpoint.js.map +1 -1
  457. package/transpiled/Factory.d.ts +1 -1
  458. package/transpiled/Factory.js +11 -2
  459. package/transpiled/Factory.js.map +1 -1
  460. package/transpiled/Gateway.d.ts +16 -0
  461. package/transpiled/Gateway.js +125 -14
  462. package/transpiled/Gateway.js.map +1 -1
  463. package/transpiled/HTTP/Context.d.ts +7 -1
  464. package/transpiled/HTTP/Context.js +22 -4
  465. package/transpiled/HTTP/Context.js.map +1 -1
  466. package/transpiled/HTTP/Server.d.ts +9 -3
  467. package/transpiled/HTTP/Server.js +134 -37
  468. package/transpiled/HTTP/Server.js.map +1 -1
  469. package/transpiled/HTTP/Timing.js.map +1 -1
  470. package/transpiled/HTTP/exceptions.d.ts +16 -7
  471. package/transpiled/HTTP/exceptions.js +34 -16
  472. package/transpiled/HTTP/exceptions.js.map +1 -1
  473. package/transpiled/HTTP/formats/index.d.ts +2 -2
  474. package/transpiled/HTTP/formats/index.js +3 -3
  475. package/transpiled/HTTP/formats/index.js.map +1 -1
  476. package/transpiled/HTTP/formats/json.d.ts +2 -2
  477. package/transpiled/HTTP/formats/json.js +3 -4
  478. package/transpiled/HTTP/formats/json.js.map +1 -1
  479. package/transpiled/HTTP/formats/msgpack.d.ts +1 -1
  480. package/transpiled/HTTP/formats/msgpack.js.map +1 -1
  481. package/transpiled/HTTP/formats/text.d.ts +2 -2
  482. package/transpiled/HTTP/formats/text.js +3 -4
  483. package/transpiled/HTTP/formats/text.js.map +1 -1
  484. package/transpiled/HTTP/formats/yaml.d.ts +2 -2
  485. package/transpiled/HTTP/formats/yaml.js +3 -4
  486. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  487. package/transpiled/HTTP/messages.d.ts +4 -1
  488. package/transpiled/HTTP/messages.js +74 -13
  489. package/transpiled/HTTP/messages.js.map +1 -1
  490. package/transpiled/Introspection.d.ts +9 -0
  491. package/transpiled/Introspection.js +3 -0
  492. package/transpiled/Introspection.js.map +1 -0
  493. package/transpiled/Mapping.d.ts +11 -2
  494. package/transpiled/Mapping.js +51 -19
  495. package/transpiled/Mapping.js.map +1 -1
  496. package/transpiled/Query.d.ts +12 -1
  497. package/transpiled/Query.js +93 -28
  498. package/transpiled/Query.js.map +1 -1
  499. package/transpiled/RTD/Context.d.ts +1 -1
  500. package/transpiled/RTD/Directives.d.ts +3 -0
  501. package/transpiled/RTD/Endpoint.d.ts +1 -0
  502. package/transpiled/RTD/Method.d.ts +4 -0
  503. package/transpiled/RTD/Method.js +11 -0
  504. package/transpiled/RTD/Method.js.map +1 -1
  505. package/transpiled/RTD/Node.d.ts +13 -2
  506. package/transpiled/RTD/Node.js +46 -17
  507. package/transpiled/RTD/Node.js.map +1 -1
  508. package/transpiled/RTD/Route.d.ts +5 -4
  509. package/transpiled/RTD/Route.js +10 -4
  510. package/transpiled/RTD/Route.js.map +1 -1
  511. package/transpiled/RTD/Tree.d.ts +8 -1
  512. package/transpiled/RTD/Tree.js +15 -3
  513. package/transpiled/RTD/Tree.js.map +1 -1
  514. package/transpiled/RTD/factory.d.ts +1 -0
  515. package/transpiled/RTD/factory.js +16 -2
  516. package/transpiled/RTD/factory.js.map +1 -1
  517. package/transpiled/RTD/segment.d.ts +1 -0
  518. package/transpiled/RTD/segment.js +2 -0
  519. package/transpiled/RTD/segment.js.map +1 -1
  520. package/transpiled/RTD/syntax/parse.js +34 -22
  521. package/transpiled/RTD/syntax/parse.js.map +1 -1
  522. package/transpiled/RTD/syntax/types.d.ts +8 -3
  523. package/transpiled/RTD/syntax/types.js +1 -1
  524. package/transpiled/RTD/syntax/types.js.map +1 -1
  525. package/transpiled/Remotes.d.ts +4 -4
  526. package/transpiled/Remotes.js +6 -5
  527. package/transpiled/Remotes.js.map +1 -1
  528. package/transpiled/Tenant.d.ts +9 -4
  529. package/transpiled/Tenant.js +26 -7
  530. package/transpiled/Tenant.js.map +1 -1
  531. package/transpiled/const.d.ts +1 -0
  532. package/transpiled/const.js +5 -0
  533. package/transpiled/const.js.map +1 -0
  534. package/transpiled/deployment.js +14 -3
  535. package/transpiled/deployment.js.map +1 -1
  536. package/transpiled/directives/auth/Anonymous.d.ts +2 -2
  537. package/transpiled/directives/auth/Anonymous.js +2 -2
  538. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  539. package/transpiled/directives/auth/Anyone.d.ts +6 -0
  540. package/transpiled/directives/auth/Anyone.js +14 -0
  541. package/transpiled/directives/auth/Anyone.js.map +1 -0
  542. package/transpiled/directives/auth/Assert.d.ts +7 -0
  543. package/transpiled/directives/auth/Assert.js +57 -0
  544. package/transpiled/directives/auth/Assert.js.map +1 -0
  545. package/transpiled/directives/auth/Authorization.d.ts +4 -3
  546. package/transpiled/directives/auth/Authorization.js +48 -21
  547. package/transpiled/directives/auth/Authorization.js.map +1 -1
  548. package/transpiled/directives/auth/Delegate.d.ts +5 -4
  549. package/transpiled/directives/auth/Delegate.js +7 -3
  550. package/transpiled/directives/auth/Delegate.js.map +1 -1
  551. package/transpiled/directives/auth/Echo.d.ts +4 -4
  552. package/transpiled/directives/auth/Echo.js +11 -4
  553. package/transpiled/directives/auth/Echo.js.map +1 -1
  554. package/transpiled/directives/auth/Federation.d.ts +16 -0
  555. package/transpiled/directives/auth/Federation.js +57 -0
  556. package/transpiled/directives/auth/Federation.js.map +1 -0
  557. package/transpiled/directives/auth/Id.d.ts +1 -1
  558. package/transpiled/directives/auth/Id.js.map +1 -1
  559. package/transpiled/directives/auth/Incept.d.ts +8 -5
  560. package/transpiled/directives/auth/Incept.js +56 -18
  561. package/transpiled/directives/auth/Incept.js.map +1 -1
  562. package/transpiled/directives/auth/Input.d.ts +13 -0
  563. package/transpiled/directives/auth/Input.js +49 -0
  564. package/transpiled/directives/auth/Input.js.map +1 -0
  565. package/transpiled/directives/auth/Role.d.ts +1 -1
  566. package/transpiled/directives/auth/Role.js +4 -6
  567. package/transpiled/directives/auth/Role.js.map +1 -1
  568. package/transpiled/directives/auth/Rule.d.ts +2 -4
  569. package/transpiled/directives/auth/Rule.js +2 -2
  570. package/transpiled/directives/auth/Rule.js.map +1 -1
  571. package/transpiled/directives/auth/Scheme.d.ts +2 -2
  572. package/transpiled/directives/auth/Scheme.js +4 -4
  573. package/transpiled/directives/auth/Scheme.js.map +1 -1
  574. package/transpiled/directives/auth/create.d.ts +2 -0
  575. package/transpiled/directives/auth/create.js +14 -0
  576. package/transpiled/directives/auth/create.js.map +1 -0
  577. package/transpiled/directives/auth/schemes.d.ts +2 -1
  578. package/transpiled/directives/auth/schemes.js +5 -2
  579. package/transpiled/directives/auth/schemes.js.map +1 -1
  580. package/transpiled/directives/auth/split.js +1 -1
  581. package/transpiled/directives/auth/split.js.map +1 -1
  582. package/transpiled/directives/auth/types.d.ts +10 -7
  583. package/transpiled/directives/cache/Cache.d.ts +3 -3
  584. package/transpiled/directives/cache/Cache.js +15 -4
  585. package/transpiled/directives/cache/Cache.js.map +1 -1
  586. package/transpiled/directives/cache/Control.d.ts +2 -2
  587. package/transpiled/directives/cache/Control.js +12 -12
  588. package/transpiled/directives/cache/Control.js.map +1 -1
  589. package/transpiled/directives/cors/CORS.js +7 -7
  590. package/transpiled/directives/cors/CORS.js.map +1 -1
  591. package/transpiled/directives/dev/Development.d.ts +1 -1
  592. package/transpiled/directives/dev/Development.js +15 -7
  593. package/transpiled/directives/dev/Development.js.map +1 -1
  594. package/transpiled/directives/dev/Faulty.d.ts +8 -0
  595. package/transpiled/directives/dev/Faulty.js +26 -0
  596. package/transpiled/directives/dev/Faulty.js.map +1 -0
  597. package/transpiled/directives/dev/Sleep.d.ts +9 -0
  598. package/transpiled/directives/dev/Sleep.js +48 -0
  599. package/transpiled/directives/dev/Sleep.js.map +1 -0
  600. package/transpiled/directives/dev/types.d.ts +1 -1
  601. package/transpiled/directives/flow/Compose.d.ts +9 -0
  602. package/transpiled/directives/flow/Compose.js +94 -0
  603. package/transpiled/directives/flow/Compose.js.map +1 -0
  604. package/transpiled/directives/flow/Fetch.d.ts +12 -0
  605. package/transpiled/directives/flow/Fetch.js +58 -0
  606. package/transpiled/directives/flow/Fetch.js.map +1 -0
  607. package/transpiled/directives/flow/Flow.d.ts +10 -0
  608. package/transpiled/directives/flow/Flow.js +33 -0
  609. package/transpiled/directives/flow/Flow.js.map +1 -0
  610. package/transpiled/directives/flow/index.d.ts +2 -0
  611. package/transpiled/directives/flow/index.js +6 -0
  612. package/transpiled/directives/flow/index.js.map +1 -0
  613. package/transpiled/directives/flow/types.d.ts +6 -0
  614. package/transpiled/directives/flow/types.js.map +1 -0
  615. package/transpiled/directives/index.js +3 -2
  616. package/transpiled/directives/index.js.map +1 -1
  617. package/transpiled/directives/io/Directive.d.ts +5 -2
  618. package/transpiled/directives/io/IO.d.ts +4 -2
  619. package/transpiled/directives/io/IO.js +14 -4
  620. package/transpiled/directives/io/IO.js.map +1 -1
  621. package/transpiled/directives/io/Input.d.ts +1 -1
  622. package/transpiled/directives/io/Input.js +5 -3
  623. package/transpiled/directives/io/Input.js.map +1 -1
  624. package/transpiled/directives/io/Output.d.ts +1 -1
  625. package/transpiled/directives/io/Output.js +3 -3
  626. package/transpiled/directives/io/Output.js.map +1 -1
  627. package/transpiled/directives/io/Throttle.d.ts +11 -0
  628. package/transpiled/directives/io/Throttle.js +51 -0
  629. package/transpiled/directives/io/Throttle.js.map +1 -0
  630. package/transpiled/directives/io/lib/throttle/Configuration.d.ts +23 -0
  631. package/transpiled/directives/io/lib/throttle/Configuration.js +27 -0
  632. package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -0
  633. package/transpiled/directives/io/lib/throttle/Interval.d.ts +9 -0
  634. package/transpiled/directives/io/lib/throttle/Interval.js +31 -0
  635. package/transpiled/directives/io/lib/throttle/Interval.js.map +1 -0
  636. package/transpiled/directives/io/lib/throttle/Keys.d.ts +12 -0
  637. package/transpiled/directives/io/lib/throttle/Keys.js +34 -0
  638. package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -0
  639. package/transpiled/directives/io/lib/throttle/Quota.d.ts +8 -0
  640. package/transpiled/directives/io/lib/throttle/Quota.js +22 -0
  641. package/transpiled/directives/io/lib/throttle/Quota.js.map +1 -0
  642. package/transpiled/directives/io/lib/throttle/Quotas.d.ts +26 -0
  643. package/transpiled/directives/io/lib/throttle/Quotas.js +61 -0
  644. package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -0
  645. package/transpiled/directives/io/lib/throttle/components/Component.d.ts +4 -0
  646. package/transpiled/directives/io/lib/throttle/components/Component.js +3 -0
  647. package/transpiled/directives/io/lib/throttle/components/Component.js.map +1 -0
  648. package/transpiled/directives/io/lib/throttle/components/IP.d.ts +6 -0
  649. package/transpiled/directives/io/lib/throttle/components/IP.js +33 -0
  650. package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -0
  651. package/transpiled/directives/io/lib/throttle/components/Path.d.ts +5 -0
  652. package/transpiled/directives/io/lib/throttle/components/Path.js +10 -0
  653. package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -0
  654. package/transpiled/directives/io/lib/throttle/components/index.d.ts +5 -0
  655. package/transpiled/directives/io/lib/throttle/components/index.js +10 -0
  656. package/transpiled/directives/io/lib/throttle/components/index.js.map +1 -0
  657. package/transpiled/directives/io/lib/throttle/conditions/Condition.d.ts +4 -0
  658. package/transpiled/directives/io/lib/throttle/conditions/Condition.js +3 -0
  659. package/transpiled/directives/io/lib/throttle/conditions/Condition.js.map +1 -0
  660. package/transpiled/directives/io/lib/throttle/conditions/Status.d.ts +7 -0
  661. package/transpiled/directives/io/lib/throttle/conditions/Status.js +19 -0
  662. package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -0
  663. package/transpiled/directives/io/lib/throttle/conditions/index.d.ts +5 -0
  664. package/transpiled/directives/io/lib/throttle/conditions/index.js +8 -0
  665. package/transpiled/directives/io/lib/throttle/conditions/index.js.map +1 -0
  666. package/transpiled/directives/io/lib/throttle/index.d.ts +2 -0
  667. package/transpiled/directives/io/lib/throttle/index.js +8 -0
  668. package/transpiled/directives/io/lib/throttle/index.js.map +1 -0
  669. package/transpiled/directives/io/schemas.d.ts +2 -0
  670. package/transpiled/directives/io/schemas.js +2 -1
  671. package/transpiled/directives/io/schemas.js.map +1 -1
  672. package/transpiled/directives/map/Authority.d.ts +6 -0
  673. package/transpiled/directives/map/Authority.js +19 -0
  674. package/transpiled/directives/map/Authority.js.map +1 -0
  675. package/transpiled/directives/map/Buffer.d.ts +6 -0
  676. package/transpiled/directives/map/Buffer.js +19 -0
  677. package/transpiled/directives/map/Buffer.js.map +1 -0
  678. package/transpiled/directives/map/Claims.d.ts +10 -0
  679. package/transpiled/directives/map/Claims.js +44 -0
  680. package/transpiled/directives/map/Claims.js.map +1 -0
  681. package/transpiled/directives/map/Directive.d.ts +3 -0
  682. package/transpiled/directives/map/Directive.js.map +1 -0
  683. package/transpiled/directives/map/Headers.d.ts +7 -0
  684. package/transpiled/directives/map/Headers.js +34 -0
  685. package/transpiled/directives/map/Headers.js.map +1 -0
  686. package/transpiled/directives/map/Language.d.ts +10 -0
  687. package/transpiled/directives/map/Language.js +38 -0
  688. package/transpiled/directives/map/Language.js.map +1 -0
  689. package/transpiled/directives/map/Languages.d.ts +4 -0
  690. package/transpiled/directives/map/Languages.js +17 -0
  691. package/transpiled/directives/map/Languages.js.map +1 -0
  692. package/transpiled/directives/map/Map.d.ts +13 -0
  693. package/transpiled/directives/map/Map.js +48 -0
  694. package/transpiled/directives/map/Map.js.map +1 -0
  695. package/transpiled/directives/map/Mapping.d.ts +13 -0
  696. package/transpiled/directives/map/Mapping.js +13 -0
  697. package/transpiled/directives/map/Mapping.js.map +1 -0
  698. package/transpiled/directives/{vary → map}/Properties.d.ts +2 -2
  699. package/transpiled/directives/{vary → map}/Properties.js +1 -3
  700. package/transpiled/directives/map/Properties.js.map +1 -0
  701. package/transpiled/directives/map/Segments.d.ts +6 -0
  702. package/transpiled/directives/map/Segments.js +30 -0
  703. package/transpiled/directives/map/Segments.js.map +1 -0
  704. package/transpiled/directives/map/index.d.ts +2 -0
  705. package/transpiled/directives/map/index.js +6 -0
  706. package/transpiled/directives/map/index.js.map +1 -0
  707. package/transpiled/directives/octets/Context.js +4 -24
  708. package/transpiled/directives/octets/Context.js.map +1 -1
  709. package/transpiled/directives/octets/Delete.js +15 -12
  710. package/transpiled/directives/octets/Delete.js.map +1 -1
  711. package/transpiled/directives/octets/{Fetch.d.ts → Get.d.ts} +5 -6
  712. package/transpiled/directives/octets/{Fetch.js → Get.js} +34 -30
  713. package/transpiled/directives/octets/Get.js.map +1 -0
  714. package/transpiled/directives/octets/Octets.js +9 -10
  715. package/transpiled/directives/octets/Octets.js.map +1 -1
  716. package/transpiled/directives/octets/{Store.d.ts → Put.d.ts} +8 -2
  717. package/transpiled/directives/octets/{Store.js → Put.js} +33 -27
  718. package/transpiled/directives/octets/Put.js.map +1 -0
  719. package/transpiled/directives/octets/Workflow.js +7 -2
  720. package/transpiled/directives/octets/Workflow.js.map +1 -1
  721. package/transpiled/directives/octets/bytes.d.ts +1 -0
  722. package/transpiled/directives/octets/bytes.js +21 -0
  723. package/transpiled/directives/octets/bytes.js.map +1 -0
  724. package/transpiled/directives/octets/schemas.d.ts +4 -8
  725. package/transpiled/directives/octets/schemas.js +3 -6
  726. package/transpiled/directives/octets/schemas.js.map +1 -1
  727. package/transpiled/directives/octets/types.d.ts +2 -0
  728. package/transpiled/directives/octets/workflows/Execution.d.ts +7 -1
  729. package/transpiled/directives/octets/workflows/Execution.js +44 -9
  730. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  731. package/transpiled/directives/octets/workflows/Workflow.d.ts +8 -3
  732. package/transpiled/directives/octets/workflows/Workflow.js +10 -4
  733. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  734. package/transpiled/directives/octets/workflows/index.d.ts +1 -1
  735. package/transpiled/directives/octets/workflows/index.js.map +1 -1
  736. package/transpiled/exceptions.js +11 -2
  737. package/transpiled/exceptions.js.map +1 -1
  738. package/transpiled/manifest.js +10 -11
  739. package/transpiled/manifest.js.map +1 -1
  740. package/transpiled/root.js +16 -1
  741. package/transpiled/root.js.map +1 -1
  742. package/transpiled/tsconfig.tsbuildinfo +1 -1
  743. package/components/identity.federation/operations/lib/assertions-as-values.d.ts +0 -4
  744. package/components/identity.federation/operations/lib/assertions-as-values.js.map +0 -1
  745. package/components/identity.federation/operations/lib/jwt.d.ts +0 -20
  746. package/components/identity.federation/operations/lib/jwt.js +0 -136
  747. package/components/identity.federation/operations/lib/jwt.js.map +0 -1
  748. package/components/identity.federation/operations/schemas.d.ts +0 -63
  749. package/components/identity.federation/operations/schemas.js +0 -9
  750. package/components/identity.federation/operations/schemas.js.map +0 -1
  751. package/components/identity.federation/operations/types.d.ts +0 -56
  752. package/components/identity.federation/operations/types.js.map +0 -1
  753. package/components/identity.federation/source/lib/assertions-as-values.ts +0 -19
  754. package/components/identity.federation/source/lib/jwt.test.ts +0 -56
  755. package/components/identity.federation/source/lib/jwt.ts +0 -171
  756. package/components/identity.federation/source/schemas.ts +0 -65
  757. package/components/identity.federation/source/types.ts +0 -62
  758. package/components/identity.tokens/operations/types.d.ts +0 -46
  759. package/components/identity.tokens/operations/types.js.map +0 -1
  760. package/components/octets.storage/operations/fetch.js +0 -46
  761. package/components/octets.storage/operations/list.js +0 -7
  762. package/components/octets.storage/operations/store.js +0 -11
  763. package/documentation/vary.md +0 -69
  764. package/features/steps/IdP.ts +0 -154
  765. package/features/steps/components/octets.tester/operations/diversify.js +0 -14
  766. package/features/vary.feature +0 -252
  767. package/schemas/octets/context.cos.yaml +0 -1
  768. package/schemas/octets/fetch.cos.yaml +0 -3
  769. package/schemas/octets/permute.cos.yaml +0 -1
  770. package/schemas/octets/store.cos.yaml +0 -3
  771. package/source/directives/octets/Fetch.ts +0 -100
  772. package/source/directives/octets/List.ts +0 -72
  773. package/source/directives/octets/Store.ts +0 -126
  774. package/source/directives/vary/Directive.ts +0 -7
  775. package/source/directives/vary/Embed.ts +0 -68
  776. package/source/directives/vary/Vary.ts +0 -50
  777. package/source/directives/vary/embeddings/Authority.ts +0 -8
  778. package/source/directives/vary/embeddings/Embedding.ts +0 -7
  779. package/source/directives/vary/embeddings/Header.ts +0 -32
  780. package/source/directives/vary/embeddings/Language.ts +0 -31
  781. package/source/directives/vary/embeddings/Parameter.ts +0 -14
  782. package/source/directives/vary/embeddings/index.ts +0 -13
  783. package/source/directives/vary/index.ts +0 -3
  784. package/transpiled/directives/octets/Fetch.js.map +0 -1
  785. package/transpiled/directives/octets/List.d.ts +0 -16
  786. package/transpiled/directives/octets/List.js +0 -74
  787. package/transpiled/directives/octets/List.js.map +0 -1
  788. package/transpiled/directives/octets/Store.js.map +0 -1
  789. package/transpiled/directives/vary/Directive.d.ts +0 -6
  790. package/transpiled/directives/vary/Directive.js.map +0 -1
  791. package/transpiled/directives/vary/Embed.d.ts +0 -11
  792. package/transpiled/directives/vary/Embed.js +0 -51
  793. package/transpiled/directives/vary/Embed.js.map +0 -1
  794. package/transpiled/directives/vary/Properties.js.map +0 -1
  795. package/transpiled/directives/vary/Vary.d.ts +0 -10
  796. package/transpiled/directives/vary/Vary.js +0 -36
  797. package/transpiled/directives/vary/Vary.js.map +0 -1
  798. package/transpiled/directives/vary/embeddings/Authority.d.ts +0 -5
  799. package/transpiled/directives/vary/embeddings/Authority.js +0 -10
  800. package/transpiled/directives/vary/embeddings/Authority.js.map +0 -1
  801. package/transpiled/directives/vary/embeddings/Embedding.d.ts +0 -6
  802. package/transpiled/directives/vary/embeddings/Embedding.js.map +0 -1
  803. package/transpiled/directives/vary/embeddings/Header.d.ts +0 -7
  804. package/transpiled/directives/vary/embeddings/Header.js +0 -28
  805. package/transpiled/directives/vary/embeddings/Header.js.map +0 -1
  806. package/transpiled/directives/vary/embeddings/Language.d.ts +0 -7
  807. package/transpiled/directives/vary/embeddings/Language.js +0 -28
  808. package/transpiled/directives/vary/embeddings/Language.js.map +0 -1
  809. package/transpiled/directives/vary/embeddings/Parameter.d.ts +0 -7
  810. package/transpiled/directives/vary/embeddings/Parameter.js +0 -14
  811. package/transpiled/directives/vary/embeddings/Parameter.js.map +0 -1
  812. package/transpiled/directives/vary/embeddings/index.d.ts +0 -5
  813. package/transpiled/directives/vary/embeddings/index.js +0 -14
  814. package/transpiled/directives/vary/embeddings/index.js.map +0 -1
  815. package/transpiled/directives/vary/index.d.ts +0 -2
  816. package/transpiled/directives/vary/index.js +0 -6
  817. package/transpiled/directives/vary/index.js.map +0 -1
  818. /package/components/{identity.federation/operations → identity.tokens/operations/lib}/types.js +0 -0
  819. /package/schemas/octets/{list.cos.yaml → get.cos.yaml} +0 -0
  820. /package/{components/identity.tokens/operations → transpiled/directives/flow}/types.js +0 -0
  821. /package/transpiled/directives/{vary → map}/Directive.js +0 -0
@@ -11,17 +11,24 @@ export class Directives implements RTD.Directives {
11
11
  }
12
12
 
13
13
  public async preflight (context: Context, parameters: RTD.Parameter[]): Promise<Output> {
14
+ let output = null
15
+
14
16
  for (const set of this.sets) {
15
17
  if (set.family.preflight === undefined)
16
18
  continue
17
19
 
18
- const output = await set.family.preflight(set.directives, context, parameters)
20
+ const out = await set.family.preflight(set.directives, context, parameters)
21
+
22
+ if (out === null)
23
+ continue
19
24
 
20
25
  if (output !== null)
21
- return output
26
+ throw new Error('Multiple preflight directives responded')
27
+ else
28
+ output = out
22
29
  }
23
30
 
24
- return null
31
+ return output
25
32
  }
26
33
 
27
34
  public async settle (context: Context, response: OutgoingMessage): Promise<void> {
@@ -29,12 +36,18 @@ export class Directives implements RTD.Directives {
29
36
  if (set.family.settle !== undefined)
30
37
  await set.family.settle(set.directives, context, response)
31
38
  }
39
+
40
+ public dispose (): void {
41
+ for (const set of this.sets)
42
+ set.family.dispose?.(set.directives)
43
+ }
32
44
  }
33
45
 
34
46
  export class DirectivesFactory implements RTD.DirectiveFactory {
35
47
  private readonly remotes: Remotes
36
48
  private readonly families: Record<string, RTD.DirectiveFamily> = {}
37
49
  private readonly mandatory: string[] = []
50
+ private readonly instances: Directives[] = []
38
51
 
39
52
  public constructor (families: RTD.DirectiveFamily[], remotes: Remotes) {
40
53
  for (const family of families) {
@@ -58,7 +71,7 @@ export class DirectivesFactory implements RTD.DirectiveFactory {
58
71
  const family = this.families[declaration.family]
59
72
 
60
73
  if (family === undefined)
61
- throw new Error(`Directive family '${declaration.family}' is not found.`)
74
+ throw new Error(`Directive family '${declaration.family}' is not found`)
62
75
 
63
76
  const directive = family.create(declaration.name, declaration.value, this.remotes)
64
77
 
@@ -81,16 +94,27 @@ export class DirectivesFactory implements RTD.DirectiveFactory {
81
94
  directives
82
95
  })
83
96
 
84
- return new Directives(sets)
97
+ const directives = new Directives(sets)
98
+
99
+ this.instances.push(directives)
100
+
101
+ return directives
102
+ }
103
+
104
+ public dispose (): void {
105
+ for (const directives of this.instances)
106
+ directives.dispose()
85
107
  }
86
108
  }
87
109
 
88
110
  export const shortcuts: RTD.syntax.Shortcuts = new Map([
89
111
  ['anonymous', 'auth:anonymous'],
112
+ ['anyone', 'auth:anyone'],
90
113
  ['id', 'auth:id'],
91
114
  ['role', 'auth:role'],
92
115
  ['rule', 'auth:rule'],
93
116
  ['incept', 'auth:incept'],
94
117
  ['input', 'io:input'],
95
- ['output', 'io:output']
118
+ ['output', 'io:output'],
119
+ ['languages', 'map:languages']
96
120
  ])
@@ -1,17 +1,21 @@
1
- import { type Component } from '@toa.io/core'
2
- import { type Remotes } from './Remotes'
1
+ import { Readable } from 'node:stream'
2
+ import { createHash } from 'node:crypto'
3
+ import { console } from 'openspan'
3
4
  import { Mapping } from './Mapping'
4
- import { type Context } from './Context'
5
5
  import * as http from './HTTP'
6
+ import type { Introspection, Schema } from './Introspection'
7
+ import type { Remote } from '@toa.io/core'
8
+ import type { Remotes } from './Remotes'
9
+ import type { Context } from './Context'
6
10
  import type * as RTD from './RTD'
7
11
 
8
12
  export class Endpoint implements RTD.Endpoint {
9
13
  private readonly endpoint: string
10
14
  private readonly mapping: Mapping
11
- private readonly discovery: Promise<Component>
12
- private remote: Component | null = null
15
+ private readonly discovery: Promise<Remote>
16
+ private remote: Remote | null = null
13
17
 
14
- public constructor (endpoint: string, mapping: Mapping, discovery: Promise<Component>) {
18
+ public constructor (endpoint: string, mapping: Mapping, discovery: Promise<Remote>) {
15
19
  this.endpoint = endpoint
16
20
  this.mapping = mapping
17
21
  this.discovery = discovery
@@ -24,28 +28,53 @@ export class Endpoint implements RTD.Endpoint {
24
28
 
25
29
  this.remote ??= await this.discovery
26
30
 
31
+ const endpoint = this.remote.locator.id + '.' + this.endpoint
32
+
33
+ console.debug('Calling operation', { endpoint, request })
34
+
27
35
  const reply = await this.remote.invoke(this.endpoint, request)
28
36
 
29
- if (context.debug)
30
- console.debug('Call', `${this.remote.locator.id}.${this.endpoint}`, request)
37
+ console.debug('Received reply', { endpoint, reply: reply instanceof Readable ? '[Readable stream]' : reply })
31
38
 
32
39
  if (reply instanceof Error)
33
40
  throw new http.UnprocessableEntity(reply)
34
41
 
35
42
  const message: http.OutgoingMessage = {}
36
43
 
37
- if (typeof reply === 'object' && reply !== null && '_version' in reply) {
44
+ // etag
45
+ if (reply !== null && reply !== undefined) {
38
46
  const etag = context.request.headers['if-none-match']
39
47
 
40
48
  message.headers ??= new Headers()
41
49
 
42
- if (etag !== undefined && reply._version === this.version(etag)) {
43
- message.status = 304
44
- message.headers.set('etag', etag)
50
+ if (typeof reply === 'object' && '_version' in reply)
51
+ if (etag !== undefined && reply._version === this.version(etag)) {
52
+ message.status = 304
53
+ message.headers.set('etag', etag)
54
+
55
+ return message
56
+ } else
57
+ message.headers.set('etag', `"${reply._version.toString()}"`)
58
+ else if (!(reply instanceof Readable)) {
59
+ const hash = `"${createHash('sha256').update(JSON.stringify(reply)).digest('hex')}"`
60
+
61
+ if (etag === hash) {
62
+ message.status = 304
63
+ message.headers.set('etag', etag)
64
+
65
+ return message
66
+ } else
67
+ message.headers.set('etag', hash)
68
+ }
69
+ }
45
70
 
46
- return message
47
- } else
48
- message.headers.set('etag', `"${reply._version.toString()}"`)
71
+ // last-modified
72
+ if (typeof reply === 'object' && reply !== null && ('_updated' in reply || '_created' in reply)) {
73
+ const timestamp: string = reply._updated ?? reply._created
74
+ const date = new Date(timestamp)
75
+
76
+ message.headers ??= new Headers()
77
+ message.headers.set('last-modified', date.toUTCString())
49
78
  }
50
79
 
51
80
  message.body = reply
@@ -53,6 +82,40 @@ export class Endpoint implements RTD.Endpoint {
53
82
  return message
54
83
  }
55
84
 
85
+ public async explain (parameters: RTD.Parameter[]): Promise<Introspection> {
86
+ this.remote ??= await this.discovery
87
+
88
+ const operation = await this.remote.explain(this.endpoint)
89
+
90
+ let route: Record<string, Schema> | null = null
91
+
92
+ if (operation.input?.type === 'object')
93
+ for (const parameter of parameters) {
94
+ const schema = operation.input.properties[parameter.name]
95
+
96
+ // eslint-disable-next-line max-depth
97
+ if (schema !== undefined) {
98
+ route ??= {}
99
+ route[parameter.name] = schema
100
+
101
+ delete operation.input.properties[parameter.name]
102
+ }
103
+ }
104
+
105
+ const query = this.mapping.explain(operation)
106
+ const introspection: Introspection = {}
107
+
108
+ if (route !== null)
109
+ introspection.route = route
110
+
111
+ if (query !== null)
112
+ introspection.query = query
113
+
114
+ Object.assign(introspection, operation)
115
+
116
+ return introspection
117
+ }
118
+
56
119
  public async close (): Promise<void> {
57
120
  this.remote ??= await this.discovery
58
121
 
@@ -63,7 +126,7 @@ export class Endpoint implements RTD.Endpoint {
63
126
  const query: http.Query = Object.fromEntries(context.url.searchParams)
64
127
  const etag = context.request.headers['if-match']
65
128
 
66
- if (etag !== undefined)
129
+ if (etag !== undefined && this.mapping.queryable)
67
130
  query.version = this.version(etag)
68
131
 
69
132
  return query
@@ -73,7 +136,7 @@ export class Endpoint implements RTD.Endpoint {
73
136
  const match = etag.match(ETAG)
74
137
 
75
138
  if (match === null)
76
- throw new http.BadRequest('Invalid ETag.')
139
+ throw new http.BadRequest('Invalid ETag')
77
140
 
78
141
  return Number.parseInt(match.groups!.version)
79
142
  }
@@ -88,21 +151,21 @@ export class EndpointsFactory implements RTD.EndpointsFactory {
88
151
 
89
152
  public create (method: RTD.syntax.Method, context: Context): Endpoint {
90
153
  if (method.mapping === undefined)
91
- throw new Error('Cannot create Endpoint without mapping.')
154
+ throw new Error('Cannot create Endpoint without mapping')
92
155
 
93
156
  const mapping = Mapping.create(method.mapping.query)
94
- const namespace = method.mapping.namespace ?? context.extension?.namespace
95
- const component = method.mapping.component ?? context.extension?.component
157
+ const namespace = method.mapping.namespace ?? context.extension.namespace
158
+ const component = method.mapping.component ?? context.extension.component
96
159
 
97
160
  if (namespace === undefined || component === undefined)
98
- throw new Error('Annotation endpoints must be fully qualified.')
161
+ throw new Error('Annotation endpoints must be fully qualified')
99
162
 
100
- const discovery = this.remotes.discover(namespace, component)
163
+ const discovery = this.remotes.discover(namespace, component, context.extension.version)
101
164
 
102
165
  return new Endpoint(method.mapping.endpoint, mapping, discovery)
103
166
  }
104
167
  }
105
168
 
106
- const ETAG = /^"(?<version>\d{1,32})"$/
169
+ const ETAG = /^(W\/)?"(?<version>\d{1,32})"$/
107
170
 
108
171
  const INTERRUPT = true
package/source/Factory.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import assert from 'node:assert'
2
+ import { createHash } from 'node:crypto'
2
3
  import { decode } from '@toa.io/generic'
3
4
  import { Tenant } from './Tenant'
4
5
  import { Gateway } from './Gateway'
5
6
  import { Remotes } from './Remotes'
6
- import { Tree, syntax } from './RTD'
7
+ import { Tree } from './RTD'
7
8
  import { EndpointsFactory } from './Endpoint'
8
9
  import { families, interceptors } from './directives'
9
10
  import { DirectivesFactory } from './Directive'
@@ -11,6 +12,8 @@ import { Composition } from './Composition'
11
12
  import * as root from './root'
12
13
  import { Interception } from './Interception'
13
14
  import * as http from './HTTP'
15
+ import type { Branch } from './Branch'
16
+ import type { syntax } from './RTD'
14
17
  import type { Broadcast } from './Gateway'
15
18
  import type { Connector, Locator, extensions } from '@toa.io/core'
16
19
 
@@ -23,8 +26,17 @@ export class Factory implements extensions.Factory {
23
26
 
24
27
  public tenant (locator: Locator, node: syntax.Node): Connector {
25
28
  const broadcast: Broadcast = this.boot.bindings.broadcast(CHANNEL, locator.id)
29
+ const hash = createHash('sha256').update(JSON.stringify(node)).digest('hex')
26
30
 
27
- return new Tenant(broadcast, locator, node)
31
+ const branch: Branch = {
32
+ namespace: locator.namespace,
33
+ component: locator.name,
34
+ isolated: locator.namespace === 'identity',
35
+ node,
36
+ version: hash
37
+ }
38
+
39
+ return new Tenant(broadcast, branch)
28
40
  }
29
41
 
30
42
  public service (): Connector | null {
@@ -33,7 +45,7 @@ export class Factory implements extensions.Factory {
33
45
 
34
46
  const options = decode<http.Options>(process.env.TOA_EXPOSITION_PROPERTIES)
35
47
  const broadcast: Broadcast = this.boot.bindings.broadcast(CHANNEL)
36
- const server = http.Server.create({ ...options, methods: syntax.verbs })
48
+ const server = http.Server.create({ ...options })
37
49
  const remotes = new Remotes(this.boot)
38
50
  const node = root.resolve()
39
51
  const methods = new EndpointsFactory(remotes)
package/source/Gateway.ts CHANGED
@@ -1,8 +1,11 @@
1
+ import assert from 'node:assert'
2
+ import { setTimeout } from 'node:timers/promises'
3
+ import { console } from 'openspan'
1
4
  import { type bindings, Connector } from '@toa.io/core'
2
5
  import * as http from './HTTP'
3
6
  import { rethrow } from './exceptions'
4
7
  import type { Interception } from './Interception'
5
- import type { Method, Parameter, Tree } from './RTD'
8
+ import type { Method, Node, Parameter, Tree, Match } from './RTD'
6
9
  import type { Label } from './discovery'
7
10
  import type { Branch } from './Branch'
8
11
 
@@ -10,6 +13,12 @@ export class Gateway extends Connector {
10
13
  private readonly broadcast: Broadcast
11
14
  private readonly tree: Tree
12
15
  private readonly interceptor: Interception
16
+ private readonly branches = new Map<string, Exposed>()
17
+ private lastMerge = 0
18
+ private lastPing = 0
19
+ private stopped = false
20
+ private reconciliation: NodeJS.Timeout | null = null
21
+ private resolveFirstMerge: (() => void) | null = null
13
22
 
14
23
  public constructor (broadcast: Broadcast, tree: Tree, interception: Interception) {
15
24
  super()
@@ -28,17 +37,20 @@ export class Gateway extends Connector {
28
37
  if (interception !== null)
29
38
  return interception
30
39
 
31
- const match = this.tree.match(context.url.pathname)
40
+ const { node, parameters } = this.match(context)
32
41
 
33
- if (match === null)
34
- throw new http.NotFound('Route not found')
42
+ if (context.request.method === 'OPTIONS')
43
+ return await this.explain(node, parameters)
35
44
 
36
- const { node, parameters } = match
45
+ let verb = context.request.method
37
46
 
38
- if (!(context.request.method in node.methods))
47
+ if (!(verb in node.methods) && verb === 'HEAD' && 'GET' in node.methods)
48
+ verb = 'GET'
49
+
50
+ if (!(verb in node.methods))
39
51
  throw new http.MethodNotAllowed()
40
52
 
41
- const method = node.methods[context.request.method]
53
+ const method = node.methods[verb]
42
54
 
43
55
  const interruption = await context.timing.capture('preflight',
44
56
  method.directives.preflight(context, parameters)).catch(rethrow)
@@ -55,16 +67,52 @@ export class Gateway extends Connector {
55
67
  protected override async open (): Promise<void> {
56
68
  await this.discover()
57
69
 
58
- console.info('Gateway has started and is awaiting resource branches.')
70
+ console.info('Gateway started')
59
71
  }
60
72
 
61
73
  protected override dispose (): void {
62
- console.info('Gateway is closed.')
74
+ this.stopped = true
75
+
76
+ if (this.reconciliation !== null)
77
+ clearInterval(this.reconciliation)
78
+
79
+ this.tree.dispose()
80
+
81
+ console.info('Gateway is closed')
82
+ }
83
+
84
+ private match (context: http.Context): Match {
85
+ const match = this.tree.match(context.url.pathname)
86
+
87
+ if (match === null) {
88
+ // the route may be missing because an expose has been lost
89
+ this.reping()
90
+
91
+ throw new http.NotFound('Route not found')
92
+ }
93
+
94
+ if (match.node.forward === null)
95
+ return match
96
+
97
+ const destination = match.node.forward.replace(/\/:([^/]+)/g,
98
+ (_, name) => {
99
+ const value = match.parameters.find((parameter) => parameter.name === name)?.value
100
+
101
+ assert.ok(value !== undefined, `Forwarded parameter '${name}' not found`)
102
+
103
+ return `/${value}`
104
+ })
105
+
106
+ const forward = this.tree.match(destination)
107
+
108
+ assert.ok(forward !== null, 'Forwarded route not found')
109
+
110
+ return forward
63
111
  }
64
112
 
65
113
  private async call (method: Method, context: http.Context, parameters: Parameter[]): Promise<http.OutgoingMessage> {
66
114
  if (context.url.pathname[context.url.pathname.length - 1] !== '/')
67
- throw new http.NotFound('Trailing slash is required.')
115
+ throw new http.NotFound('Trailing slash is required')
68
116
 
69
117
  if (context.encoder === null)
70
118
  throw new http.NotAcceptable()
@@ -77,21 +125,132 @@ export class Gateway extends Connector {
77
125
  .catch(rethrow) as http.OutgoingMessage
78
126
  }
79
127
 
128
+ private async explain (node: Node, parameters: Parameter[]): Promise<http.OutgoingMessage> {
129
+ const body = await node.explain(parameters)
130
+ const allow = [...Object.keys(node.methods)].join(', ')
131
+ const headers = new Headers({ allow })
132
+
133
+ return { body, headers }
134
+ }
135
+
80
136
  private async discover (): Promise<void> {
137
+ const first = new Promise<void>((resolve) => {
138
+ this.resolveFirstMerge = resolve
139
+ })
140
+
81
141
  await this.broadcast.receive<Branch>('expose', this.merge.bind(this))
142
+
143
+ void this.knock()
144
+
145
+ await this.settled(first)
146
+
147
+ this.reconciliation = setInterval(() => void this.ping(), RECONCILE_INTERVAL)
148
+ this.reconciliation.unref()
149
+ }
150
+
151
+ /**
152
+ * A single ping is enough only if every tenant is listening by then, which is
153
+ * not the case while the deployment is still rolling out.
154
+ */
155
+ private async knock (): Promise<void> {
156
+ for (const delay of KNOCK_DELAYS) {
157
+ if (this.stopped)
158
+ return
159
+
160
+ if (delay > 0)
161
+ await setTimeout(delay, undefined, { ref: false })
162
+
163
+ await this.ping()
164
+ }
165
+ }
166
+
167
+ private async ping (): Promise<void> {
168
+ if (this.stopped)
169
+ return
170
+
171
+ this.lastPing = Date.now()
172
+
82
173
  await this.broadcast.transmit<null>('ping', null)
174
+ .catch((exception: Error) => console.error('Discovery ping failed',
175
+ { message: exception.message }))
176
+ }
177
+
178
+ private reping (): void {
179
+ if (Date.now() - this.lastPing < PING_COOLDOWN)
180
+ return
181
+
182
+ void this.ping()
183
+ }
184
+
185
+ private async settled (first: Promise<void>): Promise<void> {
186
+ const deadline = Date.now() + SETTLE_TIMEOUT
187
+
188
+ await Promise.race([first, setTimeout(SETTLE_TIMEOUT)])
189
+
190
+ if (this.lastMerge === 0) {
191
+ console.warn('Discovery timed out waiting for the first expose')
192
+
193
+ return
194
+ }
195
+
196
+ while (Date.now() - this.lastMerge < SETTLE_QUIET) {
197
+ if (Date.now() >= deadline)
198
+ break
199
+
200
+ await setTimeout(SETTLE_POLL)
201
+ }
83
202
  }
84
203
 
85
204
  private merge (branch: Branch): void {
205
+ const id = branch.namespace + '.' + branch.component
206
+
207
+ const attributes = {
208
+ namespace: branch.namespace,
209
+ component: branch.component,
210
+ version: branch.version
211
+ }
212
+
213
+ const exposed = this.branches.get(id)
214
+
215
+ // rebuilding an identical branch would only tear down its live endpoints
216
+ if (exposed?.version === branch.version) {
217
+ this.tree.refresh(exposed.nodes)
218
+ console.debug('Branch refreshed', attributes)
219
+
220
+ return
221
+ }
222
+
223
+ let nodes: Node[]
224
+
86
225
  try {
87
- this.tree.merge(branch.node, branch)
226
+ nodes = this.tree.merge(branch.node, branch)
227
+ } catch (exception: unknown) {
228
+ const message = exception instanceof Error ? exception.message : 'Unknown error'
229
+
230
+ console.error('Branch merge exception', { message, ...attributes })
88
231
 
89
- console.info('Resource branch of ' +
90
- `'${branch.namespace}.${branch.component}' has been merged.`)
91
- } catch (exception) {
92
- console.error(exception)
232
+ return
93
233
  }
234
+
235
+ this.branches.set(id, { version: branch.version, nodes })
236
+ this.lastMerge = Date.now()
237
+ this.resolveFirstMerge?.()
238
+ this.resolveFirstMerge = null
239
+
240
+ console.info('Branch merged', attributes)
94
241
  }
95
242
  }
96
243
 
97
244
  export type Broadcast = bindings.Broadcast<Label>
245
+
246
+ interface Exposed {
247
+ version: string
248
+ nodes: Node[]
249
+ }
250
+
251
+ const SETTLE_QUIET = 10_000
252
+ const SETTLE_TIMEOUT = 30_000
253
+ const SETTLE_POLL = 50
254
+ const KNOCK_DELAYS = [0, 500, 1000, 1500]
255
+ const RECONCILE_INTERVAL = 30_000
256
+ const PING_COOLDOWN = 5_000
@@ -1,4 +1,7 @@
1
+ import crypto from 'node:crypto'
2
+ import { buffer } from 'node:stream/consumers'
1
3
  import Negotiator from 'negotiator'
4
+ import { console } from 'openspan'
2
5
  import { Timing } from './Timing'
3
6
  import { type Format, formats, types } from './formats'
4
7
  import { read } from './messages'
@@ -6,6 +9,7 @@ import type { OutgoingMessage } from './messages'
6
9
  import type * as http from 'node:http'
7
10
 
8
11
  export class Context {
12
+ public readonly id: string
9
13
  public readonly authority: string
10
14
  public readonly request: IncomingMessage
11
15
  public readonly url: URL
@@ -19,13 +23,17 @@ export class Context {
19
23
  response: []
20
24
  }
21
25
 
26
+ private consumed = false
27
+
22
28
  public constructor (authority: string, request: IncomingMessage, properties: Properties) {
23
29
  this.authority = authority
24
30
  this.request = request
25
31
 
32
+ this.id = crypto.randomUUID()
26
33
  this.url = new URL(request.url, `https://${request.headers.host}`)
27
34
  this.timing = new Timing(properties.trace)
28
35
  this.debug = properties.debug
36
+ this.log(request)
29
37
 
30
38
  if (this.request.headers.accept !== undefined) {
31
39
  const match = SUBTYPE.exec(this.request.headers.accept)
@@ -49,12 +57,29 @@ export class Context {
49
57
  this.encoder = formats[mediaType]
50
58
  }
51
59
 
52
- public async body<T> (): Promise<T> {
53
- const value = await read(this)
60
+ public async buffer (): Promise<Buffer> {
61
+ this.consumed = true
62
+
63
+ return await buffer(this.request)
64
+ }
65
+
66
+ public async body<T>(): Promise<T> {
67
+ let value = this.consumed ? null : await read(this)
68
+
69
+ for (const transform of this.pipelines.body)
70
+ value = await transform(value)
71
+
72
+ return value
73
+ }
74
+
75
+ private log (request: IncomingMessage): void {
76
+ const headers = { ...request.headers }
77
+
78
+ if (headers.authorization !== undefined)
79
+ // only scheme
80
+ headers.authorization = headers.authorization.slice(0, headers.authorization.indexOf(' '))
54
81
 
55
- return this.pipelines.body.length === 0
56
- ? value
57
- : this.pipelines.body.reduce((value, transform) => transform(value), value)
82
+ console.debug('Received request', { method: request.method, url: request.url, headers })
58
83
  }
59
84
  }
60
85
 
@@ -65,7 +90,7 @@ export interface IncomingMessage extends http.IncomingMessage {
65
90
 
66
91
  interface Pipelines {
67
92
  body: Array<(input: unknown) => unknown>
68
- response: Array<(output: OutgoingMessage) => void>
93
+ response: Array<(output: OutgoingMessage) => void | Promise<void>>
69
94
  }
70
95
 
71
96
  interface Properties {