@toa.io/extensions.exposition 1.0.0-alpha.292 → 1.0.0-alpha.294

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 (443) 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 +24 -13
  6. package/transpiled/Endpoint.js +3 -0
  7. package/transpiled/Endpoint.js.map +1 -1
  8. package/transpiled/Introspection.d.ts +6 -0
  9. package/transpiled/Introspection.js +1 -0
  10. package/transpiled/Introspection.js.map +1 -1
  11. package/transpiled/MCP/schema.js +2 -2
  12. package/transpiled/Query.d.ts +2 -12
  13. package/transpiled/Query.js +2 -12
  14. package/transpiled/Query.js.map +1 -1
  15. package/transpiled/RTD/Endpoint.d.ts +2 -3
  16. package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
  17. package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
  18. package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
  19. package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
  20. package/ui/dist/_app/immutable/chunks/{aLpTDmOc.js → CEe-wL8u.js} +1 -1
  21. package/ui/dist/_app/immutable/chunks/CV9soJ0B.js +6 -0
  22. package/ui/dist/_app/immutable/chunks/Im4_dtgC.js +1 -0
  23. package/ui/dist/_app/immutable/chunks/UkDaEvqJ.js +86 -0
  24. package/ui/dist/_app/immutable/entry/app.BnWlwGtD.js +2 -0
  25. package/ui/dist/_app/immutable/entry/start.Cm--Gj58.js +1 -0
  26. package/ui/dist/_app/immutable/nodes/0.z7Qg-vYh.js +1 -0
  27. package/ui/dist/_app/immutable/nodes/1.DtKiO-Oq.js +1 -0
  28. package/ui/dist/_app/immutable/nodes/2.B8zoEhQx.js +8 -0
  29. package/ui/dist/_app/immutable/nodes/3.eHKOcSZr.js +1 -0
  30. package/ui/dist/_app/immutable/nodes/4.CXvilufZ.js +1 -0
  31. package/ui/dist/_app/immutable/nodes/5.CTa_nmvd.js +1 -0
  32. package/ui/dist/_app/version.json +1 -1
  33. package/ui/dist/index.html +12 -12
  34. package/CHANGELOG.md +0 -42
  35. package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
  36. package/components/identity.basic/source/lib/credentials.test.ts +0 -18
  37. package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
  38. package/components/identity.clients/source/lib/canonical.test.ts +0 -43
  39. package/components/identity.clients/source/lib/cimd.test.ts +0 -122
  40. package/components/identity.clients/source/lib/redirect.test.ts +0 -47
  41. package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
  42. package/components/identity.credentials/source/list.test.ts +0 -70
  43. package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
  44. package/components/identity.federation/source/lib/discovery.test.ts +0 -60
  45. package/components/identity.federation/source/list.test.ts +0 -41
  46. package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
  47. package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
  48. package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
  49. package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
  50. package/components/identity.passkeys/source/errors.test.ts +0 -34
  51. package/components/identity.passkeys/source/webauthn.test.ts +0 -26
  52. package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
  53. package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
  54. package/components/identity.tokens/source/authenticate.test.ts +0 -112
  55. package/components/identity.tokens/source/decrypt.test.ts +0 -216
  56. package/components/identity.tokens/source/encrypt.test.ts +0 -150
  57. package/components/identity.tokens/source/issue.test.ts +0 -73
  58. package/components/identity.tokens/source/lib/form.test.ts +0 -25
  59. package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
  60. package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
  61. package/context.toa.yaml +0 -31
  62. package/cucumber.mjs +0 -7
  63. package/documentation/.assets/ia3-dark.jpg +0 -0
  64. package/documentation/.assets/ia3-light.jpg +0 -0
  65. package/documentation/.assets/overview-dark.jpg +0 -0
  66. package/documentation/.assets/overview-light.jpg +0 -0
  67. package/documentation/.assets/role-scopes-dark.jpg +0 -0
  68. package/documentation/.assets/role-scopes-light.jpg +0 -0
  69. package/documentation/.assets/rtd-dark.jpg +0 -0
  70. package/documentation/.assets/rtd-light.jpg +0 -0
  71. package/documentation/access.md +0 -350
  72. package/documentation/authorities.md +0 -51
  73. package/documentation/cache.md +0 -72
  74. package/documentation/components.md +0 -472
  75. package/documentation/consent.md +0 -101
  76. package/documentation/credentials.md +0 -88
  77. package/documentation/dev.md +0 -30
  78. package/documentation/discovery.md +0 -81
  79. package/documentation/flow.md +0 -44
  80. package/documentation/help.md +0 -122
  81. package/documentation/identity.md +0 -304
  82. package/documentation/introspection.md +0 -123
  83. package/documentation/io.md +0 -167
  84. package/documentation/ip.md +0 -24
  85. package/documentation/map.md +0 -123
  86. package/documentation/mcp.md +0 -183
  87. package/documentation/notes/desync.jpg +0 -0
  88. package/documentation/notes/peers.md +0 -59
  89. package/documentation/notes/sse.md +0 -71
  90. package/documentation/notes/throttling.md +0 -122
  91. package/documentation/oauth.md +0 -180
  92. package/documentation/octets.md +0 -334
  93. package/documentation/passkeys.md +0 -11
  94. package/documentation/protocol.md +0 -120
  95. package/documentation/query.md +0 -324
  96. package/documentation/require.md +0 -15
  97. package/documentation/rpc.md +0 -154
  98. package/documentation/tracing.md +0 -70
  99. package/documentation/tree.md +0 -199
  100. package/features/access.feature +0 -596
  101. package/features/annotation.feature +0 -32
  102. package/features/auth.assert.feature +0 -55
  103. package/features/auth.bearer.feature +0 -120
  104. package/features/auth.claims.feature +0 -171
  105. package/features/auth.incept.feature +0 -166
  106. package/features/auth.input.feature +0 -59
  107. package/features/authorities.basic.feature +0 -141
  108. package/features/authorities.feature +0 -71
  109. package/features/authorities.federation.feature +0 -100
  110. package/features/authorities.tokens.feature +0 -117
  111. package/features/body.feature +0 -76
  112. package/features/cache.feature +0 -368
  113. package/features/configuration.feature +0 -206
  114. package/features/cors.feature +0 -127
  115. package/features/credentials.feature +0 -106
  116. package/features/debug.feature +0 -34
  117. package/features/dev.feature +0 -90
  118. package/features/directives.feature +0 -61
  119. package/features/discovery.feature +0 -213
  120. package/features/discovery.ui.feature +0 -213
  121. package/features/dynamic.feature +0 -192
  122. package/features/errors.feature +0 -258
  123. package/features/etag.feature +0 -239
  124. package/features/flow.feature +0 -148
  125. package/features/help.feature +0 -512
  126. package/features/identity.bans.feature +0 -200
  127. package/features/identity.basic.feature +0 -666
  128. package/features/identity.feature +0 -240
  129. package/features/identity.federation.feature +0 -396
  130. package/features/identity.otp.feature +0 -142
  131. package/features/identity.roles.feature +0 -568
  132. package/features/identity.tokens.custom.feature +0 -430
  133. package/features/identity.tokens.feature +0 -131
  134. package/features/interruptions.feature +0 -20
  135. package/features/introspection.feature +0 -565
  136. package/features/introspection.map.feature +0 -108
  137. package/features/io.feature +0 -204
  138. package/features/io.throttle.feature +0 -166
  139. package/features/map.feature +0 -360
  140. package/features/mcp.feature +0 -753
  141. package/features/methods.feature +0 -48
  142. package/features/oauth.clients.feature +0 -195
  143. package/features/oauth.discovery.feature +0 -164
  144. package/features/oauth.grants.feature +0 -301
  145. package/features/octets.cloudinary.feature +0 -233
  146. package/features/octets.download.feature +0 -194
  147. package/features/octets.entries.feature +0 -83
  148. package/features/octets.feature +0 -306
  149. package/features/octets.head.feature +0 -40
  150. package/features/octets.location.feature +0 -83
  151. package/features/octets.meta.feature +0 -117
  152. package/features/octets.workflows.feature +0 -565
  153. package/features/passkeys.feature +0 -66
  154. package/features/probes.feature +0 -18
  155. package/features/query.feature +0 -389
  156. package/features/realtime.feature +0 -34
  157. package/features/require.feature +0 -66
  158. package/features/response.feature +0 -103
  159. package/features/routes.feature +0 -224
  160. package/features/rpc.feature +0 -429
  161. package/features/server.feature +0 -21
  162. package/features/site/_app/immutable/asset.js +0 -1
  163. package/features/site/favicon.ico +0 -0
  164. package/features/site/index.html +0 -10
  165. package/features/steps/.env.example +0 -5
  166. package/features/steps/Captures.ts +0 -20
  167. package/features/steps/Cloudinary.ts +0 -12
  168. package/features/steps/Common.ts +0 -38
  169. package/features/steps/Components.ts +0 -115
  170. package/features/steps/Database.ts +0 -106
  171. package/features/steps/Gateway.ts +0 -239
  172. package/features/steps/HTTP.ts +0 -96
  173. package/features/steps/IDP.ts +0 -361
  174. package/features/steps/Identity.ts +0 -54
  175. package/features/steps/OTP.ts +0 -42
  176. package/features/steps/Parameters.ts +0 -162
  177. package/features/steps/Probe.ts +0 -38
  178. package/features/steps/Realtime.ts +0 -175
  179. package/features/steps/Workspace.ts +0 -48
  180. package/features/steps/components/audit/manifest.toa.yaml +0 -20
  181. package/features/steps/components/audit/operations/record.js +0 -5
  182. package/features/steps/components/echo/manifest.toa.yaml +0 -59
  183. package/features/steps/components/echo/operations/affect.js +0 -3
  184. package/features/steps/components/echo/operations/compute.js +0 -3
  185. package/features/steps/components/echo/operations/echo.js +0 -3
  186. package/features/steps/components/echo/operations/error.js +0 -7
  187. package/features/steps/components/echo/operations/identity.js +0 -3
  188. package/features/steps/components/echo/operations/parameters.js +0 -3
  189. package/features/steps/components/echo/operations/ping.js +0 -3
  190. package/features/steps/components/echo/operations/unwrap.js +0 -3
  191. package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
  192. package/features/steps/components/echo.beacon/operations/hello.js +0 -3
  193. package/features/steps/components/greeter/manifest.toa.yaml +0 -5
  194. package/features/steps/components/greeter/operations/greet.js +0 -3
  195. package/features/steps/components/notify/manifest.toa.yaml +0 -20
  196. package/features/steps/components/notify/operations/send.js +0 -5
  197. package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
  198. package/features/steps/components/octets.tester/operations/authority.js +0 -3
  199. package/features/steps/components/octets.tester/operations/bar.js +0 -9
  200. package/features/steps/components/octets.tester/operations/baz.js +0 -9
  201. package/features/steps/components/octets.tester/operations/concat.js +0 -5
  202. package/features/steps/components/octets.tester/operations/echo.js +0 -5
  203. package/features/steps/components/octets.tester/operations/err.js +0 -14
  204. package/features/steps/components/octets.tester/operations/foo.js +0 -5
  205. package/features/steps/components/octets.tester/operations/id.js +0 -5
  206. package/features/steps/components/octets.tester/operations/identity.js +0 -5
  207. package/features/steps/components/octets.tester/operations/lenna.png +0 -0
  208. package/features/steps/components/octets.tester/operations/redirect.js +0 -17
  209. package/features/steps/components/octets.tester/operations/yex.js +0 -14
  210. package/features/steps/components/octets.tester/operations/yield.js +0 -11
  211. package/features/steps/components/orders/manifest.toa.yaml +0 -30
  212. package/features/steps/components/orders/operations/create.js +0 -7
  213. package/features/steps/components/pots/manifest.toa.yaml +0 -91
  214. package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
  215. package/features/steps/components/pricing/manifest.toa.yaml +0 -13
  216. package/features/steps/components/pricing/operations/quote.js +0 -3
  217. package/features/steps/components/sequences/manifest.toa.yaml +0 -11
  218. package/features/steps/components/sequences/operations/numbers.js +0 -5
  219. package/features/steps/components/sequences/operations/tokens.js +0 -14
  220. package/features/steps/components/users/manifest.toa.yaml +0 -30
  221. package/features/steps/components/users/operations/create.js +0 -11
  222. package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
  223. package/features/steps/map.ts +0 -30
  224. package/features/steps/tsconfig.json +0 -9
  225. package/features/streams.feature +0 -35
  226. package/features/timestamps.feature +0 -41
  227. package/features/timing.feature +0 -49
  228. package/features/tracing.feature +0 -123
  229. package/source/Branch.test.ts +0 -40
  230. package/source/Branch.ts +0 -44
  231. package/source/Composition.ts +0 -51
  232. package/source/Context.ts +0 -11
  233. package/source/Directive.test.ts +0 -199
  234. package/source/Directive.ts +0 -248
  235. package/source/Discovery/Explorer.ts +0 -34
  236. package/source/Discovery/Site.test.ts +0 -147
  237. package/source/Discovery/Site.ts +0 -202
  238. package/source/Discovery/index.ts +0 -3
  239. package/source/Discovery/tree.test.ts +0 -175
  240. package/source/Discovery/tree.ts +0 -77
  241. package/source/Discovery/trunk.ts +0 -33
  242. package/source/Endpoint.test.ts +0 -67
  243. package/source/Endpoint.ts +0 -157
  244. package/source/Factory.ts +0 -42
  245. package/source/Gateway.ts +0 -390
  246. package/source/HTTP/Context.ts +0 -143
  247. package/source/HTTP/Probe.ts +0 -99
  248. package/source/HTTP/Server.ts +0 -435
  249. package/source/HTTP/Timing.ts +0 -14
  250. package/source/HTTP/address.test.ts +0 -28
  251. package/source/HTTP/address.ts +0 -16
  252. package/source/HTTP/exceptions.ts +0 -99
  253. package/source/HTTP/formats/form.ts +0 -21
  254. package/source/HTTP/formats/index.ts +0 -36
  255. package/source/HTTP/formats/json.ts +0 -14
  256. package/source/HTTP/formats/msgpack.ts +0 -14
  257. package/source/HTTP/formats/text.ts +0 -10
  258. package/source/HTTP/formats/yaml.test.ts +0 -22
  259. package/source/HTTP/formats/yaml.ts +0 -40
  260. package/source/HTTP/index.ts +0 -6
  261. package/source/HTTP/messages.test.ts +0 -196
  262. package/source/HTTP/messages.ts +0 -186
  263. package/source/HTTP/types.ts +0 -39
  264. package/source/Interception.ts +0 -37
  265. package/source/Introspection.ts +0 -179
  266. package/source/MCP/Server.ts +0 -335
  267. package/source/MCP/discover.ts +0 -51
  268. package/source/MCP/errors.ts +0 -80
  269. package/source/MCP/index.ts +0 -1
  270. package/source/MCP/schema.test.ts +0 -91
  271. package/source/MCP/schema.ts +0 -94
  272. package/source/MCP/tools.ts +0 -144
  273. package/source/MCP/types.ts +0 -84
  274. package/source/Mapping.ts +0 -101
  275. package/source/Query.test.ts +0 -54
  276. package/source/Query.ts +0 -277
  277. package/source/RPC/Context.ts +0 -75
  278. package/source/RPC/Dispatcher.ts +0 -150
  279. package/source/RPC/errors.test.ts +0 -77
  280. package/source/RPC/errors.ts +0 -82
  281. package/source/RPC/index.ts +0 -1
  282. package/source/RPC/names.test.ts +0 -141
  283. package/source/RPC/names.ts +0 -176
  284. package/source/RPC/types.ts +0 -34
  285. package/source/RTD/Context.ts +0 -16
  286. package/source/RTD/Directives.ts +0 -126
  287. package/source/RTD/Endpoint.ts +0 -27
  288. package/source/RTD/Match.ts +0 -11
  289. package/source/RTD/Method.ts +0 -39
  290. package/source/RTD/Node.ts +0 -169
  291. package/source/RTD/Route.ts +0 -93
  292. package/source/RTD/Tree.ts +0 -137
  293. package/source/RTD/expiration.test.ts +0 -81
  294. package/source/RTD/factory.ts +0 -105
  295. package/source/RTD/index.ts +0 -8
  296. package/source/RTD/segment.test.ts +0 -35
  297. package/source/RTD/segment.ts +0 -51
  298. package/source/RTD/syntax/index.ts +0 -1
  299. package/source/RTD/walk.test.ts +0 -147
  300. package/source/Remotes.test.ts +0 -79
  301. package/source/Remotes.ts +0 -39
  302. package/source/Tenant.ts +0 -73
  303. package/source/directives/auth/Anonymous.test.ts +0 -70
  304. package/source/directives/auth/Anonymous.ts +0 -36
  305. package/source/directives/auth/Anyone.ts +0 -23
  306. package/source/directives/auth/Assert.ts +0 -43
  307. package/source/directives/auth/Authorization.test.ts +0 -24
  308. package/source/directives/auth/Authorization.ts +0 -388
  309. package/source/directives/auth/Delegate.test.ts +0 -36
  310. package/source/directives/auth/Delegate.ts +0 -54
  311. package/source/directives/auth/Echo.ts +0 -24
  312. package/source/directives/auth/Federation.ts +0 -104
  313. package/source/directives/auth/Id.ts +0 -37
  314. package/source/directives/auth/Incept.ts +0 -117
  315. package/source/directives/auth/Input.ts +0 -92
  316. package/source/directives/auth/Role.test.ts +0 -147
  317. package/source/directives/auth/Role.ts +0 -99
  318. package/source/directives/auth/Rule.ts +0 -59
  319. package/source/directives/auth/Scheme.ts +0 -31
  320. package/source/directives/auth/create.ts +0 -11
  321. package/source/directives/auth/index.ts +0 -3
  322. package/source/directives/auth/schemes.test.ts +0 -18
  323. package/source/directives/auth/schemes.ts +0 -39
  324. package/source/directives/auth/split.ts +0 -14
  325. package/source/directives/auth/types.ts +0 -75
  326. package/source/directives/cache/Cache.ts +0 -92
  327. package/source/directives/cache/Control.ts +0 -81
  328. package/source/directives/cache/Exact.ts +0 -7
  329. package/source/directives/cache/etag.ts +0 -38
  330. package/source/directives/cache/index.ts +0 -3
  331. package/source/directives/cache/types.ts +0 -9
  332. package/source/directives/cors/CORS.test.ts +0 -75
  333. package/source/directives/cors/CORS.ts +0 -88
  334. package/source/directives/cors/index.ts +0 -3
  335. package/source/directives/dev/Development.ts +0 -41
  336. package/source/directives/dev/Faulty.ts +0 -31
  337. package/source/directives/dev/Sleep.ts +0 -53
  338. package/source/directives/dev/Stub.ts +0 -14
  339. package/source/directives/dev/Throw.ts +0 -14
  340. package/source/directives/dev/index.ts +0 -3
  341. package/source/directives/dev/types.ts +0 -5
  342. package/source/directives/flow/Compose.ts +0 -98
  343. package/source/directives/flow/Fetch.ts +0 -86
  344. package/source/directives/flow/Flow.ts +0 -43
  345. package/source/directives/flow/index.ts +0 -3
  346. package/source/directives/flow/types.ts +0 -7
  347. package/source/directives/help/Family.ts +0 -122
  348. package/source/directives/help/Help.test.ts +0 -227
  349. package/source/directives/help/Help.ts +0 -47
  350. package/source/directives/help/Parameters.ts +0 -47
  351. package/source/directives/help/described.ts +0 -57
  352. package/source/directives/help/index.ts +0 -45
  353. package/source/directives/index.ts +0 -33
  354. package/source/directives/io/Directive.ts +0 -17
  355. package/source/directives/io/IO.ts +0 -118
  356. package/source/directives/io/Input.ts +0 -55
  357. package/source/directives/io/Message.ts +0 -1
  358. package/source/directives/io/Output.ts +0 -81
  359. package/source/directives/io/Status.test.ts +0 -88
  360. package/source/directives/io/Status.ts +0 -47
  361. package/source/directives/io/Throttle.ts +0 -30
  362. package/source/directives/io/index.ts +0 -3
  363. package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
  364. package/source/directives/io/lib/throttle/Configuration.ts +0 -68
  365. package/source/directives/io/lib/throttle/Keys.ts +0 -53
  366. package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
  367. package/source/directives/io/lib/throttle/Quotas.ts +0 -190
  368. package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
  369. package/source/directives/io/lib/throttle/Sync.ts +0 -93
  370. package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
  371. package/source/directives/io/lib/throttle/Warning.ts +0 -29
  372. package/source/directives/io/lib/throttle/components/Component.ts +0 -7
  373. package/source/directives/io/lib/throttle/components/IP.ts +0 -30
  374. package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
  375. package/source/directives/io/lib/throttle/components/Path.ts +0 -8
  376. package/source/directives/io/lib/throttle/components/Route.ts +0 -19
  377. package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
  378. package/source/directives/io/lib/throttle/components/index.ts +0 -19
  379. package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
  380. package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
  381. package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
  382. package/source/directives/io/lib/throttle/index.ts +0 -4
  383. package/source/directives/io/schemas.test.ts +0 -40
  384. package/source/directives/io/schemas.ts +0 -16
  385. package/source/directives/map/Authority.ts +0 -15
  386. package/source/directives/map/Buffer.ts +0 -15
  387. package/source/directives/map/Claims.ts +0 -63
  388. package/source/directives/map/Directive.ts +0 -4
  389. package/source/directives/map/Headers.ts +0 -60
  390. package/source/directives/map/Language.ts +0 -45
  391. package/source/directives/map/Languages.ts +0 -17
  392. package/source/directives/map/Map.ts +0 -85
  393. package/source/directives/map/Mapping.ts +0 -45
  394. package/source/directives/map/Properties.ts +0 -15
  395. package/source/directives/map/Segments.ts +0 -52
  396. package/source/directives/map/index.ts +0 -3
  397. package/source/directives/mcp/MCP.ts +0 -33
  398. package/source/directives/mcp/Tool.test.ts +0 -56
  399. package/source/directives/mcp/Tool.ts +0 -32
  400. package/source/directives/mcp/index.ts +0 -6
  401. package/source/directives/oauth/Discovery.ts +0 -66
  402. package/source/directives/oauth/documents.ts +0 -110
  403. package/source/directives/oauth/index.ts +0 -3
  404. package/source/directives/octets/Context.ts +0 -23
  405. package/source/directives/octets/Delete.ts +0 -96
  406. package/source/directives/octets/Directive.ts +0 -21
  407. package/source/directives/octets/Get.ts +0 -88
  408. package/source/directives/octets/Octets.ts +0 -82
  409. package/source/directives/octets/Put.ts +0 -186
  410. package/source/directives/octets/Workflow.ts +0 -60
  411. package/source/directives/octets/bytes.test.ts +0 -33
  412. package/source/directives/octets/bytes.ts +0 -18
  413. package/source/directives/octets/index.ts +0 -3
  414. package/source/directives/octets/schemas.test.ts +0 -20
  415. package/source/directives/octets/schemas.ts +0 -15
  416. package/source/directives/octets/types.ts +0 -9
  417. package/source/directives/octets/workflows/Execution.ts +0 -130
  418. package/source/directives/octets/workflows/Workflow.ts +0 -51
  419. package/source/directives/octets/workflows/index.ts +0 -1
  420. package/source/directives/require/Directive.ts +0 -5
  421. package/source/directives/require/Headers.ts +0 -19
  422. package/source/directives/require/Require.ts +0 -27
  423. package/source/directives/require/index.ts +0 -3
  424. package/source/discovery.ts +0 -1
  425. package/source/exceptions.ts +0 -47
  426. package/source/index.ts +0 -10
  427. package/source/io.ts +0 -4
  428. package/source/octets.d.ts +0 -17
  429. package/source/root.ts +0 -59
  430. package/source/service.ts +0 -95
  431. package/source/userland.ts +0 -47
  432. package/tsconfig.json +0 -13
  433. package/tsconfig.tsbuildinfo +0 -1
  434. package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
  435. package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
  436. package/ui/dist/_app/immutable/chunks/BaWe3aOV.js +0 -1
  437. package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
  438. package/ui/dist/_app/immutable/chunks/GZTfV0ks.js +0 -6
  439. package/ui/dist/_app/immutable/entry/app.D5v4JoUx.js +0 -2
  440. package/ui/dist/_app/immutable/entry/start.CWxFoIyZ.js +0 -1
  441. package/ui/dist/_app/immutable/nodes/0.DIh5T_5-.js +0 -1
  442. package/ui/dist/_app/immutable/nodes/1.CY-bFzHC.js +0 -1
  443. package/ui/dist/_app/immutable/nodes/2.6Ubd1ItY.js +0 -14
@@ -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
- }
@@ -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
- }