@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,190 +0,0 @@
1
- import { Keys } from './Keys.js'
2
- import type { Batch } from './Sync.js'
3
- import type { Configuration } from './Configuration.js'
4
- import type { Parameter } from '../../../../RTD/index.js'
5
- import type { Input as Context, Output } from '../../../../io.js'
6
-
7
- /**
8
- * A quota per key, metered by GCRA, decided in this process and shared with the others.
9
- *
10
- * The state of a key is one theoretical arrival time: the moment the key would be back
11
- * at zero if nothing more arrived. An admitted request pushes it `emission` further out,
12
- * time drags it back, and a request is admitted while it stays within `capacity` of now.
13
- * So `requests` is what a key may spend at once, and `requests / interval` what it earns
14
- * back — no window to burst across the edge of, and no lockout to time out of.
15
- *
16
- * Deciding needs nothing but the local map, which is what keeps the request path free of
17
- * I/O. What the other gateways have spent arrives on {@link Sync}'s tick, as a debt in
18
- * milliseconds — a duration, so it carries across processes without their clocks having
19
- * to agree, and additive, which is what lets each process report only its own increments.
20
- */
21
- export class Quotas {
22
- /** How often the debt is worth reconciling with the other gateways, in milliseconds. */
23
- public readonly period: number
24
-
25
- /** Milliseconds of debt an admitted request adds, `interval / requests`. */
26
- private readonly emission: number
27
-
28
- /** Debt a key may carry before it is refused, `interval` — a burst of `requests`. */
29
- private readonly capacity: number
30
-
31
- private readonly keys: Keys
32
- private readonly prefix: string
33
- private readonly conditional: boolean
34
- private readonly entries = new Map<string, Entry>()
35
-
36
- /**
37
- * The key computed at precall, for settle to charge against.
38
- *
39
- * `segment` reads the route parameters, which settle is not given, and `identity`
40
- * can be refreshed between the two — so recomputing there would key a request
41
- * differently than it was checked, and throttling would quietly stop working.
42
- */
43
- private readonly keyed = new WeakMap<Context, string>()
44
-
45
- public constructor(options: Options) {
46
- this.keys = options.keys
47
- this.conditional = options.conditional
48
- this.emission = options.interval / options.requests
49
- this.capacity = options.interval
50
- this.period = period(options.interval)
51
-
52
- // a key means one budget, so quotas that do not share one must not share a key
53
- this.prefix =
54
- options.name === undefined
55
- ? `t:${options.requests}:${options.interval}:`
56
- : `${options.name}:`
57
- }
58
-
59
- public static create(configuration: Configuration, route: string = ''): Quotas {
60
- const { requests, interval, condition } = configuration
61
- const keys = Keys.create(configuration.key, condition, route)
62
-
63
- return new this({ keys, requests, interval, conditional: condition !== undefined })
64
- }
65
-
66
- /**
67
- * Seconds to wait before the request would be admitted, or zero when it is.
68
- *
69
- * Charges here when nothing conditions the count, so that the request is metered by
70
- * the same call that admits it; otherwise only the response can tell whether it counts,
71
- * and {@link use} charges once it can.
72
- */
73
- public check(context: Context, parameters: Parameter[]): number {
74
- const key = this.keys.get(context, parameters)
75
-
76
- // a request that cannot be keyed is not metered
77
- if (key === undefined) return 0
78
-
79
- this.keyed.set(context, key)
80
-
81
- const now = Date.now()
82
- const entry = this.entries.get(key)
83
- const tat = Math.max(entry?.tat ?? now, now)
84
- const admit = tat + this.emission - this.capacity
85
-
86
- if (admit > now) return Math.ceil((admit - now) / 1000)
87
-
88
- if (!this.conditional) this.charge(key, entry, tat)
89
-
90
- return 0
91
- }
92
-
93
- /** Charges what the condition accepts, once the response can be matched against it. */
94
- public use(input: Context, output: Output): void {
95
- if (!this.conditional || !this.keys.matches(input, output)) return
96
-
97
- // precall always runs first, and a request it refuses never reaches settle
98
- const key = this.keyed.get(input) ?? this.keys.get(input)
99
-
100
- if (key === undefined) return
101
-
102
- const now = Date.now()
103
- const entry = this.entries.get(key)
104
- const tat = Math.max(entry?.tat ?? now, now)
105
-
106
- this.charge(key, entry, tat)
107
- }
108
-
109
- /**
110
- * Adds what is worth reporting to the batch, and drops what has gone quiet.
111
- *
112
- * The debt is not cleared here but in {@link settled}, so a tick that fails to reach
113
- * Redis leaves it to be reported by the next one instead of losing it.
114
- */
115
- public flush(now: number, batch: Batch[]): void {
116
- for (const [key, entry] of this.entries) {
117
- const delta = Math.round(entry.debt)
118
-
119
- if (delta > 0) {
120
- batch.push({ quotas: this, key, delta })
121
-
122
- continue
123
- }
124
-
125
- // out of debt and with nothing left to report, a key says no more than an absent one
126
- if (entry.tat <= now) this.entries.delete(key)
127
- }
128
- }
129
-
130
- /** Takes the group's debt back, and clears what this process contributed to it. */
131
- public settled(reported: Batch, debt: number, now: number): void {
132
- const entry = this.entries.get(reported.key)
133
-
134
- if (entry === undefined) {
135
- if (debt > 0) this.entries.set(reported.key, { tat: now + debt, debt: 0 })
136
-
137
- return
138
- }
139
-
140
- entry.debt -= reported.delta
141
-
142
- // the group has spent at least what this process has, so its debt is the one to keep
143
- entry.tat = Math.max(entry.tat, now + debt)
144
- }
145
-
146
- public name(key: string): string {
147
- return this.prefix + key
148
- }
149
-
150
- private charge(key: string, entry: Entry | undefined, tat: number): void {
151
- if (entry === undefined)
152
- this.entries.set(key, { tat: tat + this.emission, debt: this.emission })
153
- else {
154
- entry.tat = tat + this.emission
155
- entry.debt += this.emission
156
- }
157
- }
158
- }
159
-
160
- /**
161
- * How often to reconcile, in milliseconds.
162
- *
163
- * Reconciling is what bounds the overshoot — between two ticks a gateway is going on
164
- * what it alone has spent — so it is worth doing an order of magnitude more often than
165
- * the interval, within reason on either end.
166
- */
167
- function period(interval: number): number {
168
- return Math.min(Math.max(interval / 10, MIN_PERIOD), MAX_PERIOD)
169
- }
170
-
171
- const MIN_PERIOD = 250
172
- const MAX_PERIOD = 2000
173
-
174
- interface Entry {
175
- /** Theoretical arrival time: when the key is back at zero if nothing more arrives. */
176
- tat: number
177
-
178
- /** Milliseconds of debt this process has added and not yet reported. */
179
- debt: number
180
- }
181
-
182
- export interface Options {
183
- keys: Keys
184
- requests: number
185
- interval: number
186
- conditional: boolean
187
-
188
- /** what the keys are reported under, in place of the budget they carry */
189
- name?: string
190
- }
@@ -1,163 +0,0 @@
1
- import { it, beforeEach, afterEach, mock } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { Sync } from './Sync.js'
5
- import { Quotas } from './Quotas.js'
6
- import type { atomicity } from '@toa.io/core/types'
7
- import type { Configuration } from './Configuration.js'
8
- import type { Input as Context } from '../../../../io.js'
9
-
10
- let sync: Sync
11
- let invocations: Input[]
12
- let context: Context
13
-
14
- beforeEach(() => {
15
- mock.timers.enable()
16
-
17
- invocations = []
18
- context = createContext()
19
- })
20
-
21
- afterEach(() => {
22
- sync.dispose()
23
-
24
- mock.timers.reset()
25
- })
26
-
27
- it('should tick as often as the shortest interval asks', async () => {
28
- sync = new Sync(createStash())
29
-
30
- const slow = createQuotas({ interval: 60_000 })
31
-
32
- // on its own a minute reconciles every two seconds, which is the cap
33
- sync.register(slow)
34
- slow.check(context, [])
35
-
36
- await tick()
37
-
38
- assert.strictEqual(invocations.length, 0)
39
-
40
- // a second asks for every 250ms, and the shortest sets the pace for all of them
41
- sync.register(createQuotas({ interval: 1000 }))
42
-
43
- await tick()
44
-
45
- // that a single timer paces every quota was asserted through jest's timer
46
- // count, which node:test does not expose; the pacing above still covers it
47
- assert.strictEqual(invocations.length, 1)
48
- })
49
-
50
- it('should reconcile every quota in one call', async () => {
51
- sync = new Sync(createStash())
52
-
53
- const one = createQuotas()
54
- const two = createQuotas({ key: [{ method: 'identity' }] })
55
-
56
- sync.register(one)
57
- sync.register(two)
58
-
59
- one.check(context, [])
60
- two.check(context, [])
61
-
62
- await tick()
63
-
64
- assert.strictEqual(invocations.length, 1)
65
- assert.strictEqual(invocations[0].keys.length, 2)
66
- assert.deepStrictEqual(invocations[0].deltas, [50, 50])
67
- })
68
-
69
- it('should not call when there is nothing to report', async () => {
70
- sync = new Sync(createStash())
71
-
72
- sync.register(createQuotas())
73
-
74
- await tick()
75
-
76
- assert.strictEqual(invocations.length, 0)
77
- })
78
-
79
- it('should take the group debt back', async () => {
80
- sync = new Sync(createStash(() => [1000]))
81
-
82
- const quotas = createQuotas()
83
-
84
- sync.register(quotas)
85
- quotas.check(context, [])
86
-
87
- await tick()
88
-
89
- // one request here, but the group is already at capacity
90
- assert.ok(quotas.check(context, []) > 0)
91
- })
92
-
93
- it('should clear what it reported', async () => {
94
- sync = new Sync(createStash())
95
-
96
- const quotas = createQuotas()
97
-
98
- sync.register(quotas)
99
- quotas.check(context, [])
100
-
101
- await tick()
102
- await tick()
103
-
104
- assert.strictEqual(invocations.length, 1)
105
- })
106
-
107
- it('should keep what it could not report, and keep serving', async () => {
108
- sync = new Sync(
109
- createStash(() => {
110
- throw new Error('Redis is unreachable')
111
- })
112
- )
113
-
114
- const quotas = createQuotas()
115
-
116
- sync.register(quotas)
117
- quotas.check(context, [])
118
-
119
- await tick()
120
- await tick()
121
-
122
- assert.strictEqual(invocations.length, 2)
123
- assert.deepStrictEqual(invocations[1].deltas, [50])
124
- assert.strictEqual(quotas.check(context, []), 0)
125
- })
126
-
127
- async function tick(): Promise<void> {
128
- mock.timers.tick(250)
129
-
130
- // the reconciliation a tick starts is asynchronous, and node:test advances
131
- // timers synchronously; let it settle before the next one
132
- await new Promise((resolve) => process.nextTick(resolve))
133
- }
134
-
135
- function createQuotas(properties?: Partial<Configuration>): Quotas {
136
- const configuration = { key: [{ method: 'path' as const }], requests: 2, interval: 100 }
137
-
138
- return Quotas.create(Object.assign(configuration, properties))
139
- }
140
-
141
- function createContext(properties?: any): Context {
142
- return Object.assign(
143
- { url: new URL('http://localhost/'), identity: { id: 'one' } },
144
- properties
145
- ) as unknown as Context
146
- }
147
-
148
- function createStash(reply?: (deltas: number[]) => number[]): atomicity.Atom {
149
- const atom = {
150
- meter: async (keys: string[], deltas: number[]): Promise<number[]> => {
151
- invocations.push({ keys, deltas })
152
-
153
- return reply === undefined ? deltas : reply(deltas)
154
- }
155
- }
156
-
157
- return atom as unknown as atomicity.Atom
158
- }
159
-
160
- interface Input {
161
- keys: string[]
162
- deltas: number[]
163
- }
@@ -1,93 +0,0 @@
1
- import { console } from 'openspan'
2
- import type { Quotas } from './Quotas.js'
3
- import type { atomicity } from '@toa.io/core/types'
4
-
5
- /**
6
- * Reconciles every quota of the process with the other gateways, on one tick.
7
- *
8
- * Nothing here is on the request path. Each tick takes what the quotas have spent since
9
- * the last one and sends all of it as a single call, so the cost of staying in step is
10
- * one round trip a tick — not one per key, and not one per directive. What comes back is
11
- * the debt the whole group has reached, which the quotas then decide on locally.
12
- */
13
- export class Sync {
14
- private readonly atom: atomicity.Atom
15
- private readonly quotas: Quotas[] = []
16
- private timer: NodeJS.Timeout | null = null
17
- private period = Infinity
18
-
19
- /** Ticks do not overlap: a slow round trip delays reconciling, it does not double it. */
20
- private reconciling = false
21
-
22
- public constructor(atom: atomicity.Atom) {
23
- this.atom = atom
24
- }
25
-
26
- public register(quotas: Quotas): void {
27
- this.quotas.push(quotas)
28
-
29
- // the shortest interval sets the pace, and reconciling the others more often than
30
- // they asked for only makes them more accurate — an idle quota contributes nothing
31
- if (quotas.period < this.period) {
32
- this.period = quotas.period
33
-
34
- this.start()
35
- }
36
- }
37
-
38
- public dispose(): void {
39
- if (this.timer !== null) {
40
- clearInterval(this.timer)
41
-
42
- this.timer = null
43
- }
44
- }
45
-
46
- private start(): void {
47
- this.dispose()
48
-
49
- this.timer = setInterval(this.tick, this.period)
50
-
51
- this.timer.unref()
52
- }
53
-
54
- private readonly tick = (): void => {
55
- if (this.reconciling) return
56
-
57
- const now = Date.now()
58
- const batch: Batch[] = []
59
-
60
- for (const quotas of this.quotas) quotas.flush(now, batch)
61
-
62
- if (batch.length === 0) return
63
-
64
- this.reconciling = true
65
-
66
- void this.reconcile(batch).finally(() => {
67
- this.reconciling = false
68
- })
69
- }
70
-
71
- private async reconcile(batch: Batch[]): Promise<void> {
72
- try {
73
- const keys = batch.map((entry) => entry.quotas.name(entry.key))
74
- const deltas = batch.map((entry) => entry.delta)
75
-
76
- const debts = await this.atom.meter(keys, deltas)
77
- const now = Date.now()
78
-
79
- for (let i = 0; i < batch.length; i++)
80
- batch[i].quotas.settled(batch[i], debts[i], now)
81
- } catch (error) {
82
- // what was not reported stays to be reported by the next tick, and until then
83
- // this gateway keeps throttling on what it alone has seen, and keeps serving
84
- console.warn('Throttling could not reconcile with the group', error as Error)
85
- }
86
- }
87
- }
88
-
89
- export interface Batch {
90
- quotas: Quotas
91
- key: string
92
- delta: number
93
- }
@@ -1,32 +0,0 @@
1
- import { it, beforeEach, afterEach, mock } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { console } from 'openspan'
5
- import { Warning } from './Warning.js'
6
-
7
- let warn: ReturnType<typeof mock.method>
8
-
9
- beforeEach(() => {
10
- mock.timers.enable({ apis: ['Date'] })
11
- warn = mock.method(console, 'warn', () => undefined)
12
- })
13
-
14
- afterEach(() => {
15
- warn.mock.restore()
16
- mock.timers.reset()
17
- })
18
-
19
- it('should write once per interval', () => {
20
- const warning = new Warning('no ip', 1000)
21
-
22
- warning.emit()
23
- warning.emit()
24
-
25
- assert.equal(warn.mock.callCount(), 1)
26
-
27
- mock.timers.tick(1000)
28
- warning.emit()
29
-
30
- assert.equal(warn.mock.callCount(), 2)
31
- assert.equal(warn.mock.calls[0].arguments[0], 'no ip')
32
- })
@@ -1,29 +0,0 @@
1
- import { console } from 'openspan'
2
-
3
- /**
4
- * A warning about a condition that holds for request after request, written once per
5
- * `interval` rather than once per request.
6
- */
7
- export class Warning {
8
- private readonly message: string
9
- private readonly interval: number
10
- private last = -Infinity
11
-
12
- public constructor(message: string, interval: number = INTERVAL) {
13
- this.message = message
14
- this.interval = interval
15
- }
16
-
17
- public emit(attributes?: Record<string, unknown>): void {
18
- const now = Date.now()
19
-
20
- if (now - this.last < this.interval) return
21
-
22
- this.last = now
23
-
24
- console.warn(this.message, attributes)
25
- }
26
- }
27
-
28
- /** 100 seconds */
29
- const INTERVAL = 100_000
@@ -1,7 +0,0 @@
1
- import type { Parameter } from '../../../../../RTD/index.js'
2
- import type { Input as Context } from '../../../../../io.js'
3
-
4
- export interface Component {
5
- /** what to key on, or nothing when the request cannot be keyed by this component */
6
- get: (context: Context, parameters: Parameter[]) => string | undefined
7
- }
@@ -1,30 +0,0 @@
1
- import { Warning } from '../Warning.js'
2
- import type { Context } from '../../../../../HTTP/index.js'
3
- import type { Component } from './Component.js'
4
-
5
- /**
6
- * The client address, as the request context resolved it; see `documentation/ip.md`.
7
- *
8
- * A request without one cannot be keyed, so it is let through, and whoever keys on the
9
- * address says so — once in a while rather than on every request, because the cause is
10
- * the deployment, not the request.
11
- */
12
- export class IP implements Component {
13
- private readonly warning: Warning
14
-
15
- public constructor(options: unknown, route: string) {
16
- const subject = typeof options === 'string' ? options : throttle(route)
17
-
18
- this.warning = new Warning(`${subject} is not in effect: the request has no ip`)
19
- }
20
-
21
- public get(context: Context): string | undefined {
22
- if (context.ip === undefined) this.warning.emit()
23
-
24
- return context.ip
25
- }
26
- }
27
-
28
- function throttle(route: string): string {
29
- return route === '' ? 'Throttle' : `Throttle of ${route}`
30
- }
@@ -1,19 +0,0 @@
1
- import type { Input } from '../../../../../io.js'
2
- import type { Component } from './Component.js'
3
-
4
- /**
5
- * The authenticated identity, or nothing when the request carries none.
6
- *
7
- * Anonymous requests therefore share one quota between them; `ip` is the component
8
- * that tells them apart.
9
- */
10
- export class Identity implements Component {
11
- public get(context: Input): string {
12
- return (context as AuthenticatedContext).identity?.id ?? ''
13
- }
14
- }
15
-
16
- // declared here rather than imported from `auth`, the way `cache` does it
17
- interface AuthenticatedContext extends Input {
18
- identity?: { id?: string } | null
19
- }
@@ -1,8 +0,0 @@
1
- import type { Context } from '../../../../../HTTP/index.js'
2
- import type { Component } from './Component.js'
3
-
4
- export class Path implements Component {
5
- public get(context: Context): string {
6
- return context.url.pathname
7
- }
8
- }
@@ -1,19 +0,0 @@
1
- import type { Component } from './Component.js'
2
-
3
- /**
4
- * The route as declared — `/users/:id` — rather than the path a request came in on.
5
- *
6
- * A constant per method, resolved when the tree is built, so every request to one
7
- * route shares a quota however many concrete paths match it.
8
- */
9
- export class Route implements Component {
10
- private readonly route: string
11
-
12
- public constructor(_: unknown, route: string) {
13
- this.route = route
14
- }
15
-
16
- public get(): string {
17
- return this.route
18
- }
19
- }
@@ -1,19 +0,0 @@
1
- import assert from 'node:assert'
2
- import type { Parameter } from '../../../../../RTD/index.js'
3
- import type { Input as Context } from '../../../../../io.js'
4
- import type { Component } from './Component.js'
5
-
6
- /** The value a named route segment was bound to, or nothing when the route has none. */
7
- export class Segment implements Component {
8
- private readonly name: string
9
-
10
- public constructor(name: unknown) {
11
- assert.ok(typeof name === 'string', 'Throttle segment must be a string')
12
-
13
- this.name = name
14
- }
15
-
16
- public get(_: Context, parameters: Parameter[]): string {
17
- return parameters.find(({ name }) => name === this.name)?.value ?? ''
18
- }
19
- }
@@ -1,19 +0,0 @@
1
- import { Path } from './Path.js'
2
- import { IP } from './IP.js'
3
- import { Route } from './Route.js'
4
- import { Identity } from './Identity.js'
5
- import { Segment } from './Segment.js'
6
- import type { KeyComponentMethod } from '../Configuration.js'
7
- import type { Component } from './Component.js'
8
-
9
- type Constructor<T> = new (options: unknown, route: string) => T
10
-
11
- export const Components: Record<KeyComponentMethod, Constructor<Component>> = {
12
- ip: IP,
13
- path: Path,
14
- route: Route,
15
- identity: Identity,
16
- segment: Segment
17
- }
18
-
19
- export type { Component }
@@ -1,5 +0,0 @@
1
- import type { Input, Output } from '../../../../../io.js'
2
-
3
- export interface Condition {
4
- match: (input: Input, output: Output) => boolean
5
- }
@@ -1,17 +0,0 @@
1
- import assert from 'node:assert'
2
- import type { Input, Output } from '../../../../../io.js'
3
- import type { Condition } from './Condition.js'
4
-
5
- export class Status implements Condition {
6
- private readonly status: number
7
-
8
- public constructor(status: unknown) {
9
- assert.ok(typeof status === 'number', 'Status must be a number')
10
-
11
- this.status = status
12
- }
13
-
14
- public match(input: Input, output: Output): boolean {
15
- return output?.status === this.status
16
- }
17
- }
@@ -1,11 +0,0 @@
1
- import { Status } from './Status.js'
2
- import type { KeyConditionMethod } from '../Configuration.js'
3
- import type { Condition } from './Condition.js'
4
-
5
- type Constructor<T> = new (options: unknown) => T
6
-
7
- export const Conditions: Record<KeyConditionMethod, Constructor<Condition>> = {
8
- status: Status
9
- }
10
-
11
- export type { Condition }
@@ -1,4 +0,0 @@
1
- export { Quotas } from './Quotas.js'
2
- export { Sync } from './Sync.js'
3
- export { Warning } from './Warning.js'
4
- export { parse, type Configuration, type Declaration } from './Configuration.js'