@toa.io/extensions.exposition 1.0.0-alpha.291 → 1.0.0-alpha.293

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 (526) hide show
  1. package/components/identity.basic/package.json +8 -0
  2. package/components/identity.federation/package.json +8 -0
  3. package/components/identity.passkeys/package.json +8 -0
  4. package/components/identity.tokens/package.json +10 -0
  5. package/package.json +25 -13
  6. package/transpiled/Discovery/Explorer.js +1 -1
  7. package/transpiled/Discovery/Explorer.js.map +1 -1
  8. package/transpiled/Discovery/Site.js +1 -1
  9. package/transpiled/Discovery/Site.js.map +1 -1
  10. package/transpiled/Discovery/trunk.js +1 -1
  11. package/transpiled/Discovery/trunk.js.map +1 -1
  12. package/transpiled/Endpoint.js +3 -0
  13. package/transpiled/Endpoint.js.map +1 -1
  14. package/transpiled/Factory.js +1 -1
  15. package/transpiled/Factory.js.map +1 -1
  16. package/transpiled/Gateway.js +1 -1
  17. package/transpiled/Gateway.js.map +1 -1
  18. package/transpiled/HTTP/Server.d.ts +1 -1
  19. package/transpiled/HTTP/Server.js +1 -1
  20. package/transpiled/HTTP/Server.js.map +1 -1
  21. package/transpiled/Introspection.d.ts +6 -0
  22. package/transpiled/Introspection.js +1 -0
  23. package/transpiled/Introspection.js.map +1 -1
  24. package/transpiled/MCP/Server.d.ts +1 -1
  25. package/transpiled/MCP/Server.js +1 -1
  26. package/transpiled/MCP/Server.js.map +1 -1
  27. package/transpiled/MCP/discover.d.ts +1 -1
  28. package/transpiled/MCP/schema.js +2 -2
  29. package/transpiled/Query.d.ts +2 -12
  30. package/transpiled/Query.js +3 -13
  31. package/transpiled/Query.js.map +1 -1
  32. package/transpiled/RPC/Dispatcher.d.ts +1 -1
  33. package/transpiled/RPC/Dispatcher.js +2 -2
  34. package/transpiled/RPC/Dispatcher.js.map +1 -1
  35. package/transpiled/RTD/Endpoint.d.ts +2 -3
  36. package/transpiled/RTD/Tree.js +1 -1
  37. package/transpiled/RTD/Tree.js.map +1 -1
  38. package/transpiled/RTD/factory.js +1 -1
  39. package/transpiled/RTD/factory.js.map +1 -1
  40. package/transpiled/RTD/syntax/index.d.ts +1 -2
  41. package/transpiled/RTD/syntax/index.js +1 -2
  42. package/transpiled/RTD/syntax/index.js.map +1 -1
  43. package/transpiled/Tenant.js +1 -1
  44. package/transpiled/Tenant.js.map +1 -1
  45. package/transpiled/directives/auth/Authorization.js +1 -1
  46. package/transpiled/directives/auth/Authorization.js.map +1 -1
  47. package/transpiled/directives/io/IO.js +1 -1
  48. package/transpiled/directives/io/IO.js.map +1 -1
  49. package/transpiled/directives/oauth/documents.d.ts +1 -1
  50. package/transpiled/index.d.ts +0 -2
  51. package/transpiled/index.js +0 -2
  52. package/transpiled/index.js.map +1 -1
  53. package/transpiled/service.js +1 -1
  54. package/transpiled/service.js.map +1 -1
  55. package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
  56. package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
  57. package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
  58. package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
  59. package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
  60. package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
  61. package/ui/dist/_app/immutable/chunks/{D9tE1yyO.js → DVlaUfVU.js} +1 -1
  62. package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
  63. package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
  64. package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
  65. package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
  66. package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
  67. package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
  68. package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
  69. package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
  70. package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
  71. package/ui/dist/_app/version.json +1 -1
  72. package/ui/dist/index.html +12 -12
  73. package/CHANGELOG.md +0 -35
  74. package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
  75. package/components/identity.basic/source/lib/credentials.test.ts +0 -18
  76. package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
  77. package/components/identity.clients/source/lib/canonical.test.ts +0 -43
  78. package/components/identity.clients/source/lib/cimd.test.ts +0 -122
  79. package/components/identity.clients/source/lib/redirect.test.ts +0 -47
  80. package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
  81. package/components/identity.credentials/source/list.test.ts +0 -70
  82. package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
  83. package/components/identity.federation/source/lib/discovery.test.ts +0 -60
  84. package/components/identity.federation/source/list.test.ts +0 -41
  85. package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
  86. package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
  87. package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
  88. package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
  89. package/components/identity.passkeys/source/errors.test.ts +0 -34
  90. package/components/identity.passkeys/source/webauthn.test.ts +0 -26
  91. package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
  92. package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
  93. package/components/identity.tokens/source/authenticate.test.ts +0 -112
  94. package/components/identity.tokens/source/decrypt.test.ts +0 -216
  95. package/components/identity.tokens/source/encrypt.test.ts +0 -150
  96. package/components/identity.tokens/source/issue.test.ts +0 -73
  97. package/components/identity.tokens/source/lib/form.test.ts +0 -25
  98. package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
  99. package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
  100. package/context.toa.yaml +0 -31
  101. package/cucumber.mjs +0 -7
  102. package/documentation/.assets/ia3-dark.jpg +0 -0
  103. package/documentation/.assets/ia3-light.jpg +0 -0
  104. package/documentation/.assets/overview-dark.jpg +0 -0
  105. package/documentation/.assets/overview-light.jpg +0 -0
  106. package/documentation/.assets/role-scopes-dark.jpg +0 -0
  107. package/documentation/.assets/role-scopes-light.jpg +0 -0
  108. package/documentation/.assets/rtd-dark.jpg +0 -0
  109. package/documentation/.assets/rtd-light.jpg +0 -0
  110. package/documentation/access.md +0 -350
  111. package/documentation/authorities.md +0 -51
  112. package/documentation/cache.md +0 -72
  113. package/documentation/components.md +0 -472
  114. package/documentation/consent.md +0 -101
  115. package/documentation/credentials.md +0 -88
  116. package/documentation/dev.md +0 -30
  117. package/documentation/discovery.md +0 -81
  118. package/documentation/flow.md +0 -44
  119. package/documentation/help.md +0 -122
  120. package/documentation/identity.md +0 -304
  121. package/documentation/introspection.md +0 -123
  122. package/documentation/io.md +0 -167
  123. package/documentation/ip.md +0 -24
  124. package/documentation/map.md +0 -123
  125. package/documentation/mcp.md +0 -183
  126. package/documentation/notes/desync.jpg +0 -0
  127. package/documentation/notes/peers.md +0 -59
  128. package/documentation/notes/sse.md +0 -71
  129. package/documentation/notes/throttling.md +0 -122
  130. package/documentation/oauth.md +0 -180
  131. package/documentation/octets.md +0 -334
  132. package/documentation/passkeys.md +0 -11
  133. package/documentation/protocol.md +0 -120
  134. package/documentation/query.md +0 -324
  135. package/documentation/require.md +0 -15
  136. package/documentation/rpc.md +0 -154
  137. package/documentation/tracing.md +0 -70
  138. package/documentation/tree.md +0 -199
  139. package/features/access.feature +0 -596
  140. package/features/annotation.feature +0 -32
  141. package/features/auth.assert.feature +0 -55
  142. package/features/auth.bearer.feature +0 -120
  143. package/features/auth.claims.feature +0 -171
  144. package/features/auth.incept.feature +0 -166
  145. package/features/auth.input.feature +0 -59
  146. package/features/authorities.basic.feature +0 -141
  147. package/features/authorities.feature +0 -71
  148. package/features/authorities.federation.feature +0 -100
  149. package/features/authorities.tokens.feature +0 -117
  150. package/features/body.feature +0 -76
  151. package/features/cache.feature +0 -368
  152. package/features/configuration.feature +0 -206
  153. package/features/cors.feature +0 -127
  154. package/features/credentials.feature +0 -106
  155. package/features/debug.feature +0 -34
  156. package/features/dev.feature +0 -90
  157. package/features/directives.feature +0 -61
  158. package/features/discovery.feature +0 -213
  159. package/features/discovery.ui.feature +0 -213
  160. package/features/dynamic.feature +0 -192
  161. package/features/errors.feature +0 -258
  162. package/features/etag.feature +0 -239
  163. package/features/flow.feature +0 -148
  164. package/features/help.feature +0 -512
  165. package/features/identity.bans.feature +0 -200
  166. package/features/identity.basic.feature +0 -666
  167. package/features/identity.feature +0 -240
  168. package/features/identity.federation.feature +0 -396
  169. package/features/identity.otp.feature +0 -142
  170. package/features/identity.roles.feature +0 -568
  171. package/features/identity.tokens.custom.feature +0 -430
  172. package/features/identity.tokens.feature +0 -131
  173. package/features/interruptions.feature +0 -20
  174. package/features/introspection.feature +0 -565
  175. package/features/introspection.map.feature +0 -108
  176. package/features/io.feature +0 -204
  177. package/features/io.throttle.feature +0 -166
  178. package/features/map.feature +0 -360
  179. package/features/mcp.feature +0 -753
  180. package/features/methods.feature +0 -48
  181. package/features/oauth.clients.feature +0 -195
  182. package/features/oauth.discovery.feature +0 -164
  183. package/features/oauth.grants.feature +0 -301
  184. package/features/octets.cloudinary.feature +0 -233
  185. package/features/octets.download.feature +0 -194
  186. package/features/octets.entries.feature +0 -83
  187. package/features/octets.feature +0 -306
  188. package/features/octets.head.feature +0 -40
  189. package/features/octets.location.feature +0 -83
  190. package/features/octets.meta.feature +0 -117
  191. package/features/octets.workflows.feature +0 -565
  192. package/features/passkeys.feature +0 -66
  193. package/features/probes.feature +0 -18
  194. package/features/query.feature +0 -389
  195. package/features/realtime.feature +0 -34
  196. package/features/require.feature +0 -66
  197. package/features/response.feature +0 -103
  198. package/features/routes.feature +0 -224
  199. package/features/rpc.feature +0 -429
  200. package/features/server.feature +0 -21
  201. package/features/site/_app/immutable/asset.js +0 -1
  202. package/features/site/favicon.ico +0 -0
  203. package/features/site/index.html +0 -10
  204. package/features/steps/.env.example +0 -5
  205. package/features/steps/Captures.ts +0 -20
  206. package/features/steps/Cloudinary.ts +0 -12
  207. package/features/steps/Common.ts +0 -38
  208. package/features/steps/Components.ts +0 -115
  209. package/features/steps/Database.ts +0 -106
  210. package/features/steps/Gateway.ts +0 -240
  211. package/features/steps/HTTP.ts +0 -96
  212. package/features/steps/IDP.ts +0 -361
  213. package/features/steps/Identity.ts +0 -54
  214. package/features/steps/OTP.ts +0 -42
  215. package/features/steps/Parameters.ts +0 -162
  216. package/features/steps/Probe.ts +0 -38
  217. package/features/steps/Realtime.ts +0 -175
  218. package/features/steps/Workspace.ts +0 -48
  219. package/features/steps/components/audit/manifest.toa.yaml +0 -20
  220. package/features/steps/components/audit/operations/record.js +0 -5
  221. package/features/steps/components/echo/manifest.toa.yaml +0 -59
  222. package/features/steps/components/echo/operations/affect.js +0 -3
  223. package/features/steps/components/echo/operations/compute.js +0 -3
  224. package/features/steps/components/echo/operations/echo.js +0 -3
  225. package/features/steps/components/echo/operations/error.js +0 -7
  226. package/features/steps/components/echo/operations/identity.js +0 -3
  227. package/features/steps/components/echo/operations/parameters.js +0 -3
  228. package/features/steps/components/echo/operations/ping.js +0 -3
  229. package/features/steps/components/echo/operations/unwrap.js +0 -3
  230. package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
  231. package/features/steps/components/echo.beacon/operations/hello.js +0 -3
  232. package/features/steps/components/greeter/manifest.toa.yaml +0 -5
  233. package/features/steps/components/greeter/operations/greet.js +0 -3
  234. package/features/steps/components/notify/manifest.toa.yaml +0 -20
  235. package/features/steps/components/notify/operations/send.js +0 -5
  236. package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
  237. package/features/steps/components/octets.tester/operations/authority.js +0 -3
  238. package/features/steps/components/octets.tester/operations/bar.js +0 -9
  239. package/features/steps/components/octets.tester/operations/baz.js +0 -9
  240. package/features/steps/components/octets.tester/operations/concat.js +0 -5
  241. package/features/steps/components/octets.tester/operations/echo.js +0 -5
  242. package/features/steps/components/octets.tester/operations/err.js +0 -14
  243. package/features/steps/components/octets.tester/operations/foo.js +0 -5
  244. package/features/steps/components/octets.tester/operations/id.js +0 -5
  245. package/features/steps/components/octets.tester/operations/identity.js +0 -5
  246. package/features/steps/components/octets.tester/operations/lenna.png +0 -0
  247. package/features/steps/components/octets.tester/operations/redirect.js +0 -17
  248. package/features/steps/components/octets.tester/operations/yex.js +0 -14
  249. package/features/steps/components/octets.tester/operations/yield.js +0 -11
  250. package/features/steps/components/orders/manifest.toa.yaml +0 -30
  251. package/features/steps/components/orders/operations/create.js +0 -7
  252. package/features/steps/components/pots/manifest.toa.yaml +0 -91
  253. package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
  254. package/features/steps/components/pricing/manifest.toa.yaml +0 -13
  255. package/features/steps/components/pricing/operations/quote.js +0 -3
  256. package/features/steps/components/sequences/manifest.toa.yaml +0 -11
  257. package/features/steps/components/sequences/operations/numbers.js +0 -5
  258. package/features/steps/components/sequences/operations/tokens.js +0 -14
  259. package/features/steps/components/users/manifest.toa.yaml +0 -30
  260. package/features/steps/components/users/operations/create.js +0 -11
  261. package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
  262. package/features/steps/map.ts +0 -30
  263. package/features/steps/tsconfig.json +0 -9
  264. package/features/streams.feature +0 -35
  265. package/features/timestamps.feature +0 -41
  266. package/features/timing.feature +0 -49
  267. package/features/tracing.feature +0 -123
  268. package/schemas/annotation.cos.yaml +0 -125
  269. package/schemas/call.cos.yaml +0 -18
  270. package/schemas/directive.cos.yaml +0 -7
  271. package/schemas/method.cos.yaml +0 -23
  272. package/schemas/node.cos.yaml +0 -22
  273. package/schemas/query.cos.yaml +0 -31
  274. package/schemas/querystring.cos.yaml +0 -19
  275. package/schemas/range.cos.yaml +0 -10
  276. package/schemas/route.cos.yaml +0 -6
  277. package/source/Annotation.ts +0 -89
  278. package/source/Branch.test.ts +0 -40
  279. package/source/Branch.ts +0 -44
  280. package/source/Composition.ts +0 -51
  281. package/source/Context.ts +0 -11
  282. package/source/Directive.test.ts +0 -199
  283. package/source/Directive.ts +0 -248
  284. package/source/Discovery/Explorer.ts +0 -34
  285. package/source/Discovery/Site.test.ts +0 -147
  286. package/source/Discovery/Site.ts +0 -202
  287. package/source/Discovery/index.ts +0 -3
  288. package/source/Discovery/tree.test.ts +0 -175
  289. package/source/Discovery/tree.ts +0 -77
  290. package/source/Discovery/trunk.ts +0 -33
  291. package/source/Endpoint.test.ts +0 -67
  292. package/source/Endpoint.ts +0 -157
  293. package/source/Factory.ts +0 -42
  294. package/source/Gateway.ts +0 -390
  295. package/source/HTTP/Context.ts +0 -143
  296. package/source/HTTP/Probe.ts +0 -99
  297. package/source/HTTP/Server.ts +0 -430
  298. package/source/HTTP/Timing.ts +0 -14
  299. package/source/HTTP/address.test.ts +0 -28
  300. package/source/HTTP/address.ts +0 -16
  301. package/source/HTTP/exceptions.ts +0 -99
  302. package/source/HTTP/formats/form.ts +0 -21
  303. package/source/HTTP/formats/index.ts +0 -36
  304. package/source/HTTP/formats/json.ts +0 -14
  305. package/source/HTTP/formats/msgpack.ts +0 -14
  306. package/source/HTTP/formats/text.ts +0 -10
  307. package/source/HTTP/formats/yaml.test.ts +0 -22
  308. package/source/HTTP/formats/yaml.ts +0 -40
  309. package/source/HTTP/index.ts +0 -6
  310. package/source/HTTP/messages.test.ts +0 -196
  311. package/source/HTTP/messages.ts +0 -186
  312. package/source/HTTP/types.ts +0 -39
  313. package/source/Interception.ts +0 -37
  314. package/source/Introspection.ts +0 -179
  315. package/source/MCP/Server.ts +0 -335
  316. package/source/MCP/discover.ts +0 -51
  317. package/source/MCP/errors.ts +0 -80
  318. package/source/MCP/index.ts +0 -1
  319. package/source/MCP/schema.test.ts +0 -91
  320. package/source/MCP/schema.ts +0 -94
  321. package/source/MCP/tools.ts +0 -144
  322. package/source/MCP/types.ts +0 -84
  323. package/source/Mapping.ts +0 -101
  324. package/source/Query.test.ts +0 -54
  325. package/source/Query.ts +0 -277
  326. package/source/RPC/Context.ts +0 -75
  327. package/source/RPC/Dispatcher.ts +0 -150
  328. package/source/RPC/errors.test.ts +0 -77
  329. package/source/RPC/errors.ts +0 -82
  330. package/source/RPC/index.ts +0 -1
  331. package/source/RPC/names.test.ts +0 -141
  332. package/source/RPC/names.ts +0 -176
  333. package/source/RPC/types.ts +0 -34
  334. package/source/RTD/Context.ts +0 -16
  335. package/source/RTD/Directives.ts +0 -126
  336. package/source/RTD/Endpoint.ts +0 -27
  337. package/source/RTD/Match.ts +0 -11
  338. package/source/RTD/Method.ts +0 -39
  339. package/source/RTD/Node.ts +0 -169
  340. package/source/RTD/Route.ts +0 -93
  341. package/source/RTD/Tree.ts +0 -137
  342. package/source/RTD/expiration.test.ts +0 -81
  343. package/source/RTD/factory.ts +0 -105
  344. package/source/RTD/index.ts +0 -8
  345. package/source/RTD/segment.test.ts +0 -35
  346. package/source/RTD/segment.ts +0 -51
  347. package/source/RTD/syntax/index.ts +0 -2
  348. package/source/RTD/syntax/parse.test.ts +0 -196
  349. package/source/RTD/syntax/parse.ts +0 -171
  350. package/source/RTD/syntax/types.ts +0 -69
  351. package/source/RTD/walk.test.ts +0 -147
  352. package/source/Remotes.test.ts +0 -79
  353. package/source/Remotes.ts +0 -39
  354. package/source/Tenant.ts +0 -73
  355. package/source/const.ts +0 -45
  356. package/source/deployment.ts +0 -96
  357. package/source/directives/auth/Anonymous.test.ts +0 -70
  358. package/source/directives/auth/Anonymous.ts +0 -36
  359. package/source/directives/auth/Anyone.ts +0 -23
  360. package/source/directives/auth/Assert.ts +0 -43
  361. package/source/directives/auth/Authorization.test.ts +0 -24
  362. package/source/directives/auth/Authorization.ts +0 -388
  363. package/source/directives/auth/Delegate.test.ts +0 -36
  364. package/source/directives/auth/Delegate.ts +0 -54
  365. package/source/directives/auth/Echo.ts +0 -24
  366. package/source/directives/auth/Federation.ts +0 -104
  367. package/source/directives/auth/Id.ts +0 -37
  368. package/source/directives/auth/Incept.ts +0 -117
  369. package/source/directives/auth/Input.ts +0 -92
  370. package/source/directives/auth/Role.test.ts +0 -147
  371. package/source/directives/auth/Role.ts +0 -99
  372. package/source/directives/auth/Rule.ts +0 -59
  373. package/source/directives/auth/Scheme.ts +0 -31
  374. package/source/directives/auth/create.ts +0 -11
  375. package/source/directives/auth/index.ts +0 -3
  376. package/source/directives/auth/schemes.test.ts +0 -18
  377. package/source/directives/auth/schemes.ts +0 -39
  378. package/source/directives/auth/split.ts +0 -14
  379. package/source/directives/auth/types.ts +0 -75
  380. package/source/directives/cache/Cache.ts +0 -92
  381. package/source/directives/cache/Control.ts +0 -81
  382. package/source/directives/cache/Exact.ts +0 -7
  383. package/source/directives/cache/etag.ts +0 -38
  384. package/source/directives/cache/index.ts +0 -3
  385. package/source/directives/cache/types.ts +0 -9
  386. package/source/directives/cors/CORS.test.ts +0 -75
  387. package/source/directives/cors/CORS.ts +0 -88
  388. package/source/directives/cors/index.ts +0 -3
  389. package/source/directives/dev/Development.ts +0 -41
  390. package/source/directives/dev/Faulty.ts +0 -31
  391. package/source/directives/dev/Sleep.ts +0 -53
  392. package/source/directives/dev/Stub.ts +0 -14
  393. package/source/directives/dev/Throw.ts +0 -14
  394. package/source/directives/dev/index.ts +0 -3
  395. package/source/directives/dev/types.ts +0 -5
  396. package/source/directives/flow/Compose.ts +0 -98
  397. package/source/directives/flow/Fetch.ts +0 -86
  398. package/source/directives/flow/Flow.ts +0 -43
  399. package/source/directives/flow/index.ts +0 -3
  400. package/source/directives/flow/types.ts +0 -7
  401. package/source/directives/help/Family.ts +0 -122
  402. package/source/directives/help/Help.test.ts +0 -227
  403. package/source/directives/help/Help.ts +0 -47
  404. package/source/directives/help/Parameters.ts +0 -47
  405. package/source/directives/help/described.ts +0 -57
  406. package/source/directives/help/index.ts +0 -45
  407. package/source/directives/index.ts +0 -33
  408. package/source/directives/io/Directive.ts +0 -17
  409. package/source/directives/io/IO.ts +0 -118
  410. package/source/directives/io/Input.ts +0 -55
  411. package/source/directives/io/Message.ts +0 -1
  412. package/source/directives/io/Output.ts +0 -81
  413. package/source/directives/io/Status.test.ts +0 -88
  414. package/source/directives/io/Status.ts +0 -47
  415. package/source/directives/io/Throttle.ts +0 -30
  416. package/source/directives/io/index.ts +0 -3
  417. package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
  418. package/source/directives/io/lib/throttle/Configuration.ts +0 -68
  419. package/source/directives/io/lib/throttle/Keys.ts +0 -53
  420. package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
  421. package/source/directives/io/lib/throttle/Quotas.ts +0 -190
  422. package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
  423. package/source/directives/io/lib/throttle/Sync.ts +0 -93
  424. package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
  425. package/source/directives/io/lib/throttle/Warning.ts +0 -29
  426. package/source/directives/io/lib/throttle/components/Component.ts +0 -7
  427. package/source/directives/io/lib/throttle/components/IP.ts +0 -30
  428. package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
  429. package/source/directives/io/lib/throttle/components/Path.ts +0 -8
  430. package/source/directives/io/lib/throttle/components/Route.ts +0 -19
  431. package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
  432. package/source/directives/io/lib/throttle/components/index.ts +0 -19
  433. package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
  434. package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
  435. package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
  436. package/source/directives/io/lib/throttle/index.ts +0 -4
  437. package/source/directives/io/schemas.test.ts +0 -40
  438. package/source/directives/io/schemas.ts +0 -16
  439. package/source/directives/map/Authority.ts +0 -15
  440. package/source/directives/map/Buffer.ts +0 -15
  441. package/source/directives/map/Claims.ts +0 -63
  442. package/source/directives/map/Directive.ts +0 -4
  443. package/source/directives/map/Headers.ts +0 -60
  444. package/source/directives/map/Language.ts +0 -45
  445. package/source/directives/map/Languages.ts +0 -17
  446. package/source/directives/map/Map.ts +0 -85
  447. package/source/directives/map/Mapping.ts +0 -45
  448. package/source/directives/map/Properties.ts +0 -15
  449. package/source/directives/map/Segments.ts +0 -52
  450. package/source/directives/map/index.ts +0 -3
  451. package/source/directives/mcp/MCP.ts +0 -33
  452. package/source/directives/mcp/Tool.test.ts +0 -56
  453. package/source/directives/mcp/Tool.ts +0 -32
  454. package/source/directives/mcp/index.ts +0 -6
  455. package/source/directives/oauth/Discovery.ts +0 -66
  456. package/source/directives/oauth/documents.ts +0 -110
  457. package/source/directives/oauth/index.ts +0 -3
  458. package/source/directives/octets/Context.ts +0 -23
  459. package/source/directives/octets/Delete.ts +0 -96
  460. package/source/directives/octets/Directive.ts +0 -21
  461. package/source/directives/octets/Get.ts +0 -88
  462. package/source/directives/octets/Octets.ts +0 -82
  463. package/source/directives/octets/Put.ts +0 -186
  464. package/source/directives/octets/Workflow.ts +0 -60
  465. package/source/directives/octets/bytes.test.ts +0 -33
  466. package/source/directives/octets/bytes.ts +0 -18
  467. package/source/directives/octets/index.ts +0 -3
  468. package/source/directives/octets/schemas.test.ts +0 -20
  469. package/source/directives/octets/schemas.ts +0 -15
  470. package/source/directives/octets/types.ts +0 -9
  471. package/source/directives/octets/workflows/Execution.ts +0 -130
  472. package/source/directives/octets/workflows/Workflow.ts +0 -51
  473. package/source/directives/octets/workflows/index.ts +0 -1
  474. package/source/directives/require/Directive.ts +0 -5
  475. package/source/directives/require/Headers.ts +0 -19
  476. package/source/directives/require/Require.ts +0 -27
  477. package/source/directives/require/index.ts +0 -3
  478. package/source/discovery.ts +0 -1
  479. package/source/exceptions.ts +0 -47
  480. package/source/index.ts +0 -12
  481. package/source/io.ts +0 -4
  482. package/source/manifest.test.ts +0 -56
  483. package/source/manifest.ts +0 -56
  484. package/source/octets.d.ts +0 -17
  485. package/source/root.ts +0 -59
  486. package/source/schemas.test.ts +0 -31
  487. package/source/schemas.ts +0 -15
  488. package/source/service.ts +0 -94
  489. package/source/shortcuts.ts +0 -14
  490. package/source/userland.ts +0 -47
  491. package/transpiled/Annotation.d.ts +0 -70
  492. package/transpiled/Annotation.js +0 -2
  493. package/transpiled/Annotation.js.map +0 -1
  494. package/transpiled/RTD/syntax/parse.d.ts +0 -4
  495. package/transpiled/RTD/syntax/parse.js +0 -112
  496. package/transpiled/RTD/syntax/parse.js.map +0 -1
  497. package/transpiled/RTD/syntax/types.d.ts +0 -52
  498. package/transpiled/RTD/syntax/types.js +0 -11
  499. package/transpiled/RTD/syntax/types.js.map +0 -1
  500. package/transpiled/const.d.ts +0 -36
  501. package/transpiled/const.js +0 -37
  502. package/transpiled/const.js.map +0 -1
  503. package/transpiled/deployment.d.ts +0 -6
  504. package/transpiled/deployment.js +0 -76
  505. package/transpiled/deployment.js.map +0 -1
  506. package/transpiled/manifest.d.ts +0 -3
  507. package/transpiled/manifest.js +0 -39
  508. package/transpiled/manifest.js.map +0 -1
  509. package/transpiled/schemas.d.ts +0 -9
  510. package/transpiled/schemas.js +0 -9
  511. package/transpiled/schemas.js.map +0 -1
  512. package/transpiled/shortcuts.d.ts +0 -3
  513. package/transpiled/shortcuts.js +0 -13
  514. package/transpiled/shortcuts.js.map +0 -1
  515. package/tsconfig.json +0 -13
  516. package/tsconfig.tsbuildinfo +0 -1
  517. package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
  518. package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
  519. package/ui/dist/_app/immutable/chunks/B_pK3U1C.js +0 -6
  520. package/ui/dist/_app/immutable/chunks/CiKbPLyY.js +0 -1
  521. package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
  522. package/ui/dist/_app/immutable/entry/app.DMqmL4NY.js +0 -2
  523. package/ui/dist/_app/immutable/entry/start.CRe7HWBI.js +0 -1
  524. package/ui/dist/_app/immutable/nodes/0.D9m-6cbM.js +0 -1
  525. package/ui/dist/_app/immutable/nodes/1.Cgi_RcSO.js +0 -1
  526. package/ui/dist/_app/immutable/nodes/2.D_Cbxgz4.js +0 -14
@@ -1,68 +0,0 @@
1
- export interface Configuration {
2
- key: KeyComponent[]
3
- condition?: KeyCondition[]
4
- requests: number
5
- interval: number
6
- }
7
-
8
- interface Rule<T, K = unknown> {
9
- method: T
10
- options?: K
11
- }
12
-
13
- export type KeyComponentMethod = 'ip' | 'path' | 'route' | 'identity' | 'segment'
14
- export type KeyConditionMethod = 'status'
15
-
16
- export type KeyComponent = Rule<KeyComponentMethod>
17
- export type KeyCondition = Rule<KeyConditionMethod>
18
-
19
- /** A bare component, or the one that takes an argument. */
20
- type KeyEntry = KeyComponentMethod | { segment: string }
21
- type KeyDeclaration = KeyEntry | KeyEntry[]
22
-
23
- type ConditionDeclaration =
24
- | Record<KeyConditionMethod, unknown>
25
- | Array<Record<KeyConditionMethod, unknown>>
26
-
27
- export interface Declaration extends Omit<Configuration, 'key' | 'condition'> {
28
- key: KeyDeclaration
29
- condition?: ConditionDeclaration
30
- }
31
-
32
- export function parse(declaration: Declaration): Configuration {
33
- const { key, condition, requests, interval } = declaration
34
-
35
- return {
36
- key: mapKey(key),
37
- condition: mapCondition(condition),
38
- requests,
39
- interval: interval * 1000
40
- }
41
- }
42
-
43
- function mapKey(declaration: KeyDeclaration): KeyComponent[] {
44
- const entries = Array.isArray(declaration) ? declaration : [declaration]
45
-
46
- // a bare `path`, or `segment: id` for the ones that take an argument
47
- return entries.flatMap((entry): KeyComponent[] =>
48
- typeof entry === 'string'
49
- ? [{ method: entry }]
50
- : Object.entries(entry).map(([method, options]) => ({
51
- method: method as KeyComponentMethod,
52
- options
53
- }))
54
- )
55
- }
56
-
57
- function mapCondition(declaration?: ConditionDeclaration): KeyCondition[] | undefined {
58
- if (declaration === undefined) return
59
-
60
- // reduce to a single object, then map entries to rules
61
- const conditions = Array.isArray(declaration) ? declaration : [declaration]
62
- const single = conditions.reduce((acc, condition) => ({ ...acc, ...condition }), {})
63
-
64
- return Object.entries(single).map(([method, options]) => ({
65
- method,
66
- options
67
- })) as KeyCondition[]
68
- }
@@ -1,53 +0,0 @@
1
- import { createHash } from 'node:crypto'
2
- import { Components, type Component } from './components/index.js'
3
- import { Conditions, type Condition } from './conditions/index.js'
4
- import type { KeyComponent, KeyCondition } from './Configuration.js'
5
- import type { Parameter } from '../../../../RTD/index.js'
6
- import type { Input as Context, Output } from '../../../../io.js'
7
-
8
- const NONE: Parameter[] = []
9
-
10
- export class Keys {
11
- private readonly components: Component[]
12
- private readonly conditions?: Condition[]
13
-
14
- public constructor(components: Component[], conditions?: Condition[]) {
15
- this.components = components
16
- this.conditions = conditions
17
- }
18
-
19
- public static create(
20
- componentRules: KeyComponent[],
21
- conditionRules?: KeyCondition[],
22
- route: string = ''
23
- ): Keys {
24
- const components = componentRules.map(
25
- (rule) => new Components[rule.method](rule.options, route)
26
- )
27
-
28
- const conditions = conditionRules?.map(
29
- (rule) => new Conditions[rule.method](rule.options)
30
- )
31
-
32
- return new this(components, conditions)
33
- }
34
-
35
- /** The key of the request, or nothing when a component cannot key it. */
36
- public get(context: Context, parameters: Parameter[] = NONE): string | undefined {
37
- const hash = createHash('sha256')
38
-
39
- for (const component of this.components) {
40
- const part = component.get(context, parameters)
41
-
42
- if (part === undefined) return
43
-
44
- hash.update(part)
45
- }
46
-
47
- return hash.digest('hex')
48
- }
49
-
50
- public matches(input: Context, output: Output): boolean {
51
- return this.conditions?.some((condition) => !condition.match(input, output)) !== true
52
- }
53
- }
@@ -1,411 +0,0 @@
1
- import { describe, it, beforeEach } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { setTimeout } from 'node:timers/promises'
5
- import { Quotas } from './Quotas.js'
6
- import type { Batch } from './Sync.js'
7
- import type { Configuration } from './Configuration.js'
8
- import type { Input as Context, Output } from '../../../../io.js'
9
-
10
- let quotas: Quotas
11
- let configuration: Configuration
12
- let context: Context
13
- let output: Output
14
-
15
- beforeEach(() => {
16
- output = { status: 200 }
17
- })
18
-
19
- describe('common', () => {
20
- beforeEach(() => {
21
- context = createContext()
22
- configuration = createConfiguration()
23
- quotas = Quotas.create(configuration)
24
- })
25
-
26
- it('should admit a burst of the whole budget', () => {
27
- assert.strictEqual(quotas.check(context, []), 0)
28
- assert.strictEqual(quotas.check(context, []), 0)
29
- })
30
-
31
- it('should refuse past the budget', () => {
32
- quotas.check(context, [])
33
- quotas.check(context, [])
34
-
35
- assert.ok(quotas.check(context, []) > 0)
36
- })
37
-
38
- it('should not charge what it refuses', async () => {
39
- quotas.check(context, [])
40
- quotas.check(context, [])
41
- quotas.check(context, [])
42
- quotas.check(context, [])
43
-
44
- // a refused request does not push admission further out, so one emission is
45
- // all it takes to be admitted again however hard the key is hammered
46
- await timeout(configuration.interval / configuration.requests)
47
-
48
- assert.strictEqual(quotas.check(context, []), 0)
49
- })
50
-
51
- it('should earn the budget back over the interval', async () => {
52
- quotas.check(context, [])
53
- quotas.check(context, [])
54
-
55
- assert.ok(quotas.check(context, []) > 0)
56
-
57
- await timeout(configuration.interval)
58
-
59
- assert.strictEqual(quotas.check(context, []), 0)
60
- assert.strictEqual(quotas.check(context, []), 0)
61
- })
62
- })
63
-
64
- describe('retry', () => {
65
- it('should answer the seconds until the request would be admitted', () => {
66
- // an emission is 5 seconds, which is what the budget takes to earn one back
67
- quotas = Quotas.create(createConfiguration({ requests: 2, interval: 10_000 }))
68
- context = createContext()
69
-
70
- quotas.check(context, [])
71
- quotas.check(context, [])
72
-
73
- assert.strictEqual(quotas.check(context, []), 5)
74
- })
75
-
76
- it('should never answer zero when it refuses', () => {
77
- quotas = Quotas.create(createConfiguration({ requests: 10, interval: 1000 }))
78
- context = createContext()
79
-
80
- for (let i = 0; i < 10; i++) quotas.check(context, [])
81
-
82
- // an emission here is a tenth of a second, and `Retry-After` counts in whole ones
83
- assert.strictEqual(quotas.check(context, []), 1)
84
- })
85
- })
86
-
87
- describe('group', () => {
88
- beforeEach(() => {
89
- context = createContext()
90
- configuration = createConfiguration()
91
- quotas = Quotas.create(configuration)
92
- })
93
-
94
- it('should report what it has charged', () => {
95
- quotas.check(context, [])
96
-
97
- const batch = flush()
98
-
99
- assert.strictEqual(batch.length, 1)
100
- assert.strictEqual(batch[0].delta, configuration.interval / configuration.requests)
101
- assert.strictEqual(batch[0].quotas, quotas)
102
- })
103
-
104
- it('should refuse on what the group has spent, not on what this process has', () => {
105
- quotas.check(context, [])
106
-
107
- const batch = flush()
108
-
109
- // one request here, but the group is already at capacity
110
- quotas.settled(batch[0], configuration.interval, Date.now())
111
-
112
- assert.ok(quotas.check(context, []) > 0)
113
- })
114
-
115
- it('should not refuse below the capacity', () => {
116
- quotas.check(context, [])
117
-
118
- const batch = flush()
119
-
120
- quotas.settled(batch[0], 0, Date.now())
121
-
122
- assert.strictEqual(quotas.check(context, []), 0)
123
- })
124
-
125
- it('should clear what was reported, and keep what was charged since', () => {
126
- quotas.check(context, [])
127
-
128
- const batch = flush()
129
-
130
- quotas.check(context, [])
131
- quotas.settled(batch[0], 0, Date.now())
132
-
133
- assert.strictEqual(flush()[0].delta, configuration.interval / configuration.requests)
134
- })
135
-
136
- it('should keep what it could not report', () => {
137
- quotas.check(context, [])
138
-
139
- const first = flush()
140
-
141
- // no `settled`, as a tick that cannot reach Redis leaves the debt to the next one
142
- assert.strictEqual(flush()[0].delta, first[0].delta)
143
- })
144
-
145
- it('should take a debt for a key it has already dropped', () => {
146
- quotas.check(context, [])
147
-
148
- const batch = flush()
149
-
150
- quotas.settled(batch[0], 0, Date.now())
151
- flush(Date.now() + configuration.interval)
152
-
153
- quotas.settled({ ...batch[0], delta: 0 }, configuration.interval, Date.now())
154
-
155
- assert.ok(quotas.check(context, []) > 0)
156
- })
157
-
158
- it('should name keys so that quotas with different budgets never share one', () => {
159
- const other = Quotas.create(createConfiguration({ requests: 3 }))
160
-
161
- quotas.check(context, [])
162
- other.check(context, [])
163
-
164
- const batch = flush(Date.now(), quotas, other)
165
-
166
- assert.strictEqual(batch[0].key, batch[1].key)
167
- assert.notStrictEqual(quotas.name(batch[0].key), other.name(batch[1].key))
168
- })
169
- })
170
-
171
- describe('sweeping', () => {
172
- beforeEach(() => {
173
- context = createContext()
174
- configuration = createConfiguration()
175
- quotas = Quotas.create(configuration)
176
- })
177
-
178
- it('should drop a key that is out of debt with nothing to report', () => {
179
- quotas.check(context, [])
180
-
181
- const batch = flush()
182
-
183
- quotas.settled(batch[0], 0, Date.now())
184
-
185
- // once the debt has drained, a key says no more than an absent one
186
- assert.strictEqual(flush(Date.now() + configuration.interval).length, 0)
187
- assert.strictEqual(flush(Date.now() + configuration.interval).length, 0)
188
- assert.strictEqual(quotas.check(context, []), 0)
189
- })
190
-
191
- it('should keep a key that still owes something', () => {
192
- quotas.check(context, [])
193
-
194
- assert.strictEqual(flush(Date.now() + configuration.interval).length, 1)
195
- })
196
- })
197
-
198
- describe('path', () => {
199
- beforeEach(() => {
200
- configuration = createConfiguration()
201
- quotas = Quotas.create(configuration)
202
- })
203
-
204
- it('should have separate quotas', () => {
205
- const one = createContext({ url: new URL('http://localhost/one/') })
206
- const two = createContext({ url: new URL('http://localhost/two/') })
207
-
208
- quotas.check(one, [])
209
- quotas.check(one, [])
210
-
211
- assert.ok(quotas.check(one, []) > 0)
212
- assert.strictEqual(quotas.check(two, []), 0)
213
- })
214
- })
215
-
216
- describe('ip', () => {
217
- beforeEach(() => {
218
- configuration = createConfiguration({ key: [{ method: 'ip' }] })
219
- })
220
-
221
- it('should key on the address the context resolved', () => {
222
- quotas = Quotas.create(configuration)
223
-
224
- const one = createContext({ ip: '1.1.1.1' })
225
- const two = createContext({ ip: '2.2.2.2' })
226
-
227
- quotas.check(one, [])
228
- quotas.check(one, [])
229
-
230
- assert.ok(quotas.check(one, []) > 0)
231
- assert.strictEqual(quotas.check(two, []), 0)
232
- })
233
-
234
- it('should let a request without an address through', () => {
235
- quotas = Quotas.create(configuration)
236
-
237
- const context = createContext({})
238
-
239
- for (let i = 0; i < 5; i++) assert.strictEqual(quotas.check(context, []), 0)
240
- })
241
- })
242
-
243
- describe('route', () => {
244
- it('should key on the route, not on the path it came in on', () => {
245
- quotas = Quotas.create(
246
- createConfiguration({ key: [{ method: 'route' }] }),
247
- '/users/:id'
248
- )
249
-
250
- const one = createContext({ url: new URL('http://localhost/users/1/') })
251
- const two = createContext({ url: new URL('http://localhost/users/2/') })
252
-
253
- quotas.check(one, [])
254
- quotas.check(two, [])
255
-
256
- // two paths, one route, one quota — which is the whole difference from `path`
257
- assert.strictEqual(flush().length, 1)
258
- assert.ok(quotas.check(one, []) > 0)
259
- })
260
-
261
- it('should have separate quotas per route', () => {
262
- const users = Quotas.create(
263
- createConfiguration({ key: [{ method: 'route' }] }),
264
- '/users/:id'
265
- )
266
- const posts = Quotas.create(
267
- createConfiguration({ key: [{ method: 'route' }] }),
268
- '/posts/:id'
269
- )
270
-
271
- context = createContext({ url: new URL('http://localhost/users/1/') })
272
-
273
- users.check(context, [])
274
- posts.check(context, [])
275
-
276
- const batch = flush(Date.now(), users, posts)
277
-
278
- assert.notStrictEqual(batch[0].key, batch[1].key)
279
- })
280
- })
281
-
282
- describe('segment', () => {
283
- beforeEach(() => {
284
- configuration = createConfiguration({ key: [{ method: 'segment', options: 'id' }] })
285
- quotas = Quotas.create(configuration)
286
- context = createContext()
287
- })
288
-
289
- it('should have separate quotas per segment value', () => {
290
- const one = [{ name: 'id', value: '1' }]
291
- const two = [{ name: 'id', value: '2' }]
292
-
293
- quotas.check(context, one)
294
- quotas.check(context, one)
295
-
296
- assert.ok(quotas.check(context, one) > 0)
297
- assert.strictEqual(quotas.check(context, two), 0)
298
- })
299
- })
300
-
301
- describe('identity', () => {
302
- beforeEach(() => {
303
- configuration = createConfiguration({ key: [{ method: 'identity' }] })
304
- quotas = Quotas.create(configuration)
305
- })
306
-
307
- it('should have separate quotas per identity', () => {
308
- const one = createContext({ identity: { id: 'one' } })
309
- const two = createContext({ identity: { id: 'two' } })
310
-
311
- quotas.check(one, [])
312
- quotas.check(one, [])
313
-
314
- assert.ok(quotas.check(one, []) > 0)
315
- assert.strictEqual(quotas.check(two, []), 0)
316
- })
317
-
318
- it('should put every anonymous request in one quota', () => {
319
- const one = createContext({ identity: null })
320
- const two = createContext()
321
-
322
- quotas.check(one, [])
323
- quotas.check(two, [])
324
-
325
- assert.ok(quotas.check(one, []) > 0)
326
- assert.ok(quotas.check(two, []) > 0)
327
- })
328
- })
329
-
330
- describe('status', () => {
331
- beforeEach(() => {
332
- context = createContext()
333
- configuration = createConfiguration({
334
- condition: [{ method: 'status', options: 404 }]
335
- })
336
- quotas = Quotas.create(configuration)
337
- })
338
-
339
- it('should not charge before the response can be matched', () => {
340
- quotas.check(context, [])
341
- quotas.check(context, [])
342
- quotas.check(context, [])
343
-
344
- // only the response tells whether a request counts, so checking cannot charge
345
- assert.strictEqual(flush().length, 0)
346
- })
347
-
348
- it('should not charge what the condition rejects', () => {
349
- quotas.check(context, [])
350
- quotas.use(context, output)
351
-
352
- assert.strictEqual(flush().length, 0)
353
- assert.strictEqual(quotas.check(context, []), 0)
354
- })
355
-
356
- it('should charge what the condition accepts', () => {
357
- for (let i = 0; i < 2; i++) {
358
- quotas.check(context, [])
359
- quotas.use(context, { status: 404 })
360
- }
361
-
362
- assert.ok(quotas.check(context, []) > 0)
363
- })
364
-
365
- it('should charge the key checking saw, which settling cannot recompute', () => {
366
- const keys = [{ method: 'segment' as const, options: 'id' }]
367
-
368
- quotas = Quotas.create(
369
- createConfiguration({ key: keys, condition: configuration.condition })
370
- )
371
-
372
- const one = createContext()
373
- const two = createContext()
374
-
375
- quotas.check(one, [{ name: 'id', value: '1' }])
376
- quotas.use(one, { status: 404 })
377
-
378
- quotas.check(two, [{ name: 'id', value: '2' }])
379
- quotas.use(two, { status: 404 })
380
-
381
- // settling is handed no parameters, so recomputing there would hash an empty
382
- // segment both times and the two requests would charge one key
383
- assert.strictEqual(flush().length, 2)
384
- })
385
- })
386
-
387
- function flush(now: number = Date.now(), ...of: Quotas[]): Batch[] {
388
- const batch: Batch[] = []
389
-
390
- for (const one of of.length === 0 ? [quotas] : of) one.flush(now, batch)
391
-
392
- return batch
393
- }
394
-
395
- function createConfiguration(properties?: Partial<Configuration>): Configuration {
396
- return Object.assign(
397
- { key: [{ method: 'path' }], requests: 2, interval: 100 },
398
- properties
399
- )
400
- }
401
-
402
- function createContext(properties?: any): Context {
403
- return Object.assign(
404
- { url: new URL('http://localhost/') },
405
- properties
406
- ) as unknown as Context
407
- }
408
-
409
- async function timeout(ms: number): Promise<void> {
410
- await setTimeout(ms * 1.2)
411
- }