@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,57 +0,0 @@
1
- import assert from 'node:assert'
2
-
3
- /** What a resource, a method or a parameter says of itself, in the order it is written. */
4
- export interface Described {
5
- title?: string
6
- description?: string
7
-
8
- /** what its methods are guarded by; see `guarded` */
9
- authenticated?: boolean
10
- private?: boolean
11
- protected?: boolean
12
- system?: boolean
13
- }
14
-
15
- /**
16
- * A bare value is the title: it is the short thing, and the one a client has somewhere to
17
- * put — a name is an address and reads as one. A sentence is written as a mapping, beside
18
- * the title it explains, and either may stand alone.
19
- */
20
- export function described(subject: string, value: unknown): Described {
21
- const stated = typeof value === 'string' ? { title: value } : value
22
-
23
- assert.ok(
24
- typeof stated === 'object' && stated !== null && !Array.isArray(stated),
25
- `Directive ${subject}: the value is a title, or a \`title\` and a \`description\``
26
- )
27
-
28
- const { title, description, ...rest } = stated as Record<string, unknown>
29
-
30
- assert.ok(
31
- Object.keys(rest).length === 0,
32
- `Directive ${subject}: unknown ${Object.keys(rest)
33
- .map((key) => `'${key}'`)
34
- .join(', ')}`
35
- )
36
-
37
- assert.ok(
38
- title === undefined || (typeof title === 'string' && title.trim().length > 0),
39
- `Directive ${subject}: a title cannot be empty`
40
- )
41
-
42
- assert.ok(
43
- description === undefined ||
44
- (typeof description === 'string' && description.trim().length > 0),
45
- `Directive ${subject}: a description cannot be empty`
46
- )
47
-
48
- assert.ok(
49
- title !== undefined || description !== undefined,
50
- `Directive ${subject}: says nothing`
51
- )
52
-
53
- return {
54
- ...(title === undefined ? {} : { title: title as string }),
55
- ...(description === undefined ? {} : { description: description as string })
56
- }
57
- }
@@ -1,45 +0,0 @@
1
- import { Family, FAMILY } from './Family.js'
2
- import type { Directive } from './Family.js'
3
- import type { Described } from './described.js'
4
- import type { Directives } from '../../RTD/index.js'
5
- import type { Introspection } from '../../Introspection.js'
6
-
7
- export const help = new Family()
8
-
9
- /**
10
- * What the resource a method is on says of itself, or nothing where it says nothing. Read
11
- * from the method because that is what carries a route's directives; every method of one
12
- * node carries the same declaration.
13
- */
14
- export function resource(directives: Directives): Described | null {
15
- const stated = Family.node(directives.declared<Directive>(FAMILY))
16
-
17
- if (stated === null) return null
18
-
19
- return {
20
- ...(stated.title === undefined ? {} : { title: stated.title }),
21
- ...(stated.description === undefined ? {} : { description: stated.description })
22
- }
23
- }
24
-
25
- /**
26
- * What a resource is, taken from what its methods are: the flags are a method's, and a
27
- * resource carries whichever of them any of its methods does — which is what a reader picks
28
- * one icon by.
29
- */
30
- export function guarded(methods: Record<string, Introspection>): Described {
31
- const described: Described = {}
32
-
33
- for (const introspection of Object.values(methods))
34
- for (const flag of FLAGS) if (introspection[flag] === true) described[flag] = true
35
-
36
- return described
37
- }
38
-
39
- const FLAGS = ['authenticated', 'private', 'protected', 'system'] as const
40
-
41
- export { FAMILY, Family } from './Family.js'
42
- export { Help } from './Help.js'
43
- export { Parameters } from './Parameters.js'
44
- export type { Directive } from './Family.js'
45
- export type { Described } from './described.js'
@@ -1,33 +0,0 @@
1
- import { authorization } from './auth/index.js'
2
- import { cache } from './cache/index.js'
3
- import { cors } from './cors/index.js'
4
- import { dev } from './dev/index.js'
5
- import { octets } from './octets/index.js'
6
- import { io } from './io/index.js'
7
- import { map } from './map/index.js'
8
- import { mcp } from './mcp/index.js'
9
- import { req } from './require/index.js'
10
- import { flow } from './flow/index.js'
11
- import { help } from './help/index.js'
12
- import { discovery } from './oauth/index.js'
13
- import { Site } from '../Discovery/index.js'
14
- import type { DirectiveFamily } from '../RTD/index.js'
15
- import type { Interceptor } from '../Interception.js'
16
-
17
- export const families: DirectiveFamily[] = [
18
- authorization,
19
- io,
20
- cache,
21
- map,
22
- mcp,
23
- help,
24
- req,
25
- flow,
26
- octets,
27
- dev
28
- ]
29
- /**
30
- * `cors` first, so a preflight is answered before anything reads the request; the page is
31
- * last, and claims its own prefix.
32
- */
33
- export const interceptors: Interceptor[] = [cors, discovery, new Site()]
@@ -1,17 +0,0 @@
1
- import type { Sync } from './lib/throttle/index.js'
2
- import type { Parameter } from '../../RTD/index.js'
3
- import type { Input as Context } from '../../io.js'
4
- import type * as http from '../../HTTP/index.js'
5
-
6
- export interface Directive {
7
- precall: (context: Context, parameters: Parameter[]) => void
8
-
9
- /** Synchronous by contract: settling holds the response, and none of it needs I/O. */
10
- settle?: (context: Context, response: http.OutgoingMessage) => void
11
- }
12
-
13
- export interface Constructor {
14
- validate: (value: unknown) => void
15
-
16
- new (value: any, sync: Sync, route: string): Directive
17
- }
@@ -1,118 +0,0 @@
1
- import { restrict } from '../../Introspection.js'
2
- import { Output } from './Output.js'
3
- import { Input } from './Input.js'
4
- import { Throttle } from './Throttle.js'
5
- import { Status } from './Status.js'
6
- import { Sync } from './lib/throttle/index.js'
7
- import type * as http from '../../HTTP/index.js'
8
- import type { Parameter, DirectiveFamily } from '../../RTD/index.js'
9
- import type { Remotes } from '../../Remotes.js'
10
- import type { Constructor, Directive } from './Directive.js'
11
- import type { Introspection } from '../../Introspection.js'
12
- import { ATOM_GROUP } from '../../const.js'
13
- import type { extensions } from '@toa.io/core/types'
14
-
15
- export class IO implements DirectiveFamily<Directive> {
16
- public readonly name = 'io'
17
- public readonly mandatory = true
18
-
19
- private host!: extensions.Host
20
-
21
- /** Throttling reconciles through the atom of the gateways, one for every directive. */
22
- private sync: Sync | null = null
23
-
24
- public mount(host: extensions.Host): void {
25
- this.host = host
26
- }
27
-
28
- // eslint-disable-next-line max-params
29
- public create(
30
- name: string,
31
- value: unknown,
32
- remotes: Remotes,
33
- route: string
34
- ): Directive {
35
- if (!(name in constructors))
36
- throw new Error(`Directive 'io:${name}' is not implemented`)
37
-
38
- const Directive = constructors[name]
39
-
40
- Directive.validate(value)
41
-
42
- if (name === 'throttle') this.sync ??= new Sync(this.host.atom(ATOM_GROUP))
43
-
44
- return new Directive(value, this.sync!, route)
45
- }
46
-
47
- public precall(
48
- directives: Directive[],
49
- context: http.Context,
50
- parameters: Parameter[]
51
- ): null {
52
- let restricted = false
53
-
54
- for (const directive of directives) {
55
- restricted ||= directive instanceof Output
56
-
57
- directive.precall(context, parameters)
58
- }
59
-
60
- if (!restricted) DENIAL.precall(context, parameters)
61
-
62
- return null
63
- }
64
-
65
- /**
66
- * What a whitelist admits is what the schema states. Without an `io:output` the reply is
67
- * dropped before it is sent, so there is no output to describe at all.
68
- */
69
- public explain(
70
- directives: Directive[],
71
- _: http.Context,
72
- introspection: Introspection
73
- ): Introspection {
74
- let restricted = false
75
-
76
- for (const directive of directives) {
77
- if (directive instanceof Input)
78
- introspection.input = restrict(introspection.input, directive.allowed)
79
-
80
- if (!(directive instanceof Output)) continue
81
-
82
- restricted = true
83
-
84
- if (!directive.disabled)
85
- introspection.output = restrict(introspection.output, directive.allowed)
86
- }
87
-
88
- if (!restricted) delete introspection.output
89
-
90
- return introspection
91
- }
92
-
93
- public settle(
94
- directives: Directive[],
95
- context: http.Context,
96
- output: http.OutgoingMessage
97
- ): void {
98
- for (const directive of directives) directive.settle?.(context, output)
99
- }
100
-
101
- /**
102
- * The ticker belongs to the family rather than to any route's directives, and the
103
- * factory disposes every route it made — so this runs once per route at shutdown,
104
- * and disposing an already stopped ticker is what makes that harmless.
105
- */
106
- public dispose(): void {
107
- this.sync?.dispose()
108
- }
109
- }
110
-
111
- const constructors: Record<string, Constructor> = {
112
- input: Input,
113
- output: Output,
114
- status: Status,
115
- throttle: Throttle
116
- }
117
-
118
- const DENIAL: Directive = new Output([])
@@ -1,55 +0,0 @@
1
- import { BadRequest } from '../../HTTP/index.js'
2
- import * as schemas from './schemas.js'
3
- import type { Message } from './Message.js'
4
- import type { Directive } from './Directive.js'
5
- import type { Input as Context } from '../../io.js'
6
-
7
- export class Input implements Directive {
8
- /** what a client may send, which is therefore what the input schema states */
9
- public readonly allowed: Set<string>
10
-
11
- public constructor(permissions: Permissions) {
12
- this.allowed = new Set(permissions)
13
- }
14
-
15
- public static validate(permissions: unknown): asserts permissions is Permissions {
16
- schemas.input.validate<Permissions>(permissions, "Incorrect 'io:input' format")
17
- }
18
-
19
- public precall(context: Context): void {
20
- // Restrictions are on what the client sent, so the check goes to the front of the
21
- // pipeline whatever order the families ran in: `auth:delegate` embeds the identity
22
- // and `map:*` assigns mapped properties, and those additions are the server's own,
23
- // not input to be restricted.
24
- context.pipelines.body.unshift((body) => this.check(body))
25
- }
26
-
27
- private check(body: unknown): Message | Message[] | undefined {
28
- if (body === undefined) return body
29
-
30
- try {
31
- schemas.message.validate<Message | Message[]>(body)
32
- } catch {
33
- throw new BadRequest('Invalid request body')
34
- }
35
-
36
- const property = this.violation(body)
37
-
38
- if (property !== undefined) throw new BadRequest(`Unexpected input: ${property}`)
39
-
40
- return body
41
- }
42
-
43
- private violation(value: Message | Message[]): string | undefined {
44
- if (!Array.isArray(value))
45
- return Object.keys(value).find((key) => !this.allowed.has(key))
46
-
47
- for (const item of value) {
48
- const property = this.violation(item)
49
-
50
- if (property !== undefined) return property
51
- }
52
- }
53
- }
54
-
55
- export type Permissions = string[]
@@ -1 +0,0 @@
1
- export type Message = Record<string, unknown>
@@ -1,81 +0,0 @@
1
- import { Stream } from 'node:stream'
2
- import { console } from 'openspan'
3
- import * as schemas from './schemas.js'
4
- import type { Message } from './Message.js'
5
- import type { Directive } from './Directive.js'
6
- import type { Input as Context } from '../../io.js'
7
- import type { OutgoingMessage } from '../../HTTP/index.js'
8
-
9
- export class Output implements Directive {
10
- /** whether the reply passes whole, which is when the schema is the operation's own */
11
- public readonly disabled: boolean = false
12
-
13
- /** what a reply may carry, which is therefore what the output schema states */
14
- public readonly allowed: Set<string>
15
- private readonly omitted: boolean = true
16
- private readonly permissions: string[] = []
17
-
18
- public constructor(permissions: Permissions) {
19
- if (typeof permissions === 'boolean')
20
- if (permissions) this.disabled = true
21
- else this.omitted = false
22
- else this.permissions = permissions
23
-
24
- this.allowed = new Set(this.permissions)
25
- }
26
-
27
- public static validate(permissions: unknown): asserts permissions is Permissions {
28
- schemas.output.validate(permissions, "Incorrect 'io:output' format")
29
- }
30
-
31
- public precall(context: Context): void {
32
- context.pipelines.response.push(this.restriction(context))
33
- }
34
-
35
- private restriction(context: Context) {
36
- return (message: OutgoingMessage): void => {
37
- // what the gateway built is its own — a code and a message — and a restriction has
38
- // nothing to say about it; everything else is a reply the operation returned, and is
39
- // restricted whatever status it carries
40
- const error = message.authentic === true
41
- const stream = message.body instanceof Stream
42
- const none = message.body === undefined || message.body === null
43
-
44
- if (this.disabled || error || stream || none) return
45
-
46
- if (typeof message.body !== 'object' || this.permissions.length === 0) {
47
- if (this.omitted)
48
- console.warn(
49
- "Permissions for 'io:output' are not specified properly, response omitted",
50
- { path: context.url.pathname }
51
- )
52
-
53
- delete message.body
54
-
55
- return
56
- }
57
-
58
- schemas.message.validate<Message>(
59
- message.body,
60
- "'io:output' expects response to be an object or array of objects"
61
- )
62
-
63
- if (Array.isArray(message.body))
64
- message.body = message.body.map((entity) => this.fit(entity as Message))
65
- else message.body = this.fit(message.body)
66
- }
67
- }
68
-
69
- /** Runs per entity of a collection, hence the set and the absence of intermediates. */
70
- private fit(message: Message): Message {
71
- const output: Message = {}
72
-
73
- // the keys of the entity, so that the response keeps the order it was built in
74
- for (const key of Object.keys(message))
75
- if (this.allowed.has(key)) output[key] = message[key]
76
-
77
- return output
78
- }
79
- }
80
-
81
- export type Permissions = string[] | boolean
@@ -1,88 +0,0 @@
1
- import { it } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { Status } from './Status.js'
5
- import { Output } from './Output.js'
6
- import type { Input as Context } from '../../io.js'
7
- import type { OutgoingMessage } from '../../HTTP/index.js'
8
-
9
- const status = new Status('status')
10
-
11
- function context(): Context {
12
- return {
13
- pipelines: { body: [], response: [] },
14
- url: { pathname: '/' }
15
- } as unknown as Context
16
- }
17
-
18
- it('should take the status from the property and remove it', () => {
19
- const response: OutgoingMessage = { body: { status: 400, error: 'invalid_request' } }
20
-
21
- status.settle(context(), response)
22
-
23
- assert.equal(response.status, 400)
24
- assert.deepEqual(response.body, { error: 'invalid_request' })
25
- })
26
-
27
- it('should leave a reply that states no status alone', () => {
28
- const response: OutgoingMessage = { body: { id: 'x' } }
29
-
30
- status.settle(context(), response)
31
-
32
- assert.equal(response.status, undefined)
33
- assert.deepEqual(response.body, { id: 'x' })
34
- })
35
-
36
- it('should refuse a status that is not one', () => {
37
- for (const value of ['400', null, {}, true])
38
- assert.throws(() => {
39
- status.settle(context(), { body: { status: value } } as OutgoingMessage)
40
- }, /`io:status` expects 'status' to be a number/)
41
- })
42
-
43
- it('should refuse a declaration that is not a property name', () => {
44
- for (const value of [1, null, {}, ['status']])
45
- assert.throws(() => Status.validate(value), /`io:status` must be a string/)
46
- })
47
-
48
- it('should have a reply it named the status of restricted, whatever that status is', () => {
49
- for (const stated of [200, 400]) {
50
- const ctx = context()
51
- const output = new Output(['code', 'error'])
52
-
53
- output.precall(ctx, [])
54
-
55
- const response: OutgoingMessage = {
56
- body: { status: stated, code: 'SplxlO', error: 'invalid_grant', secret: 'x' }
57
- }
58
-
59
- status.settle(ctx, response)
60
-
61
- for (const transform of ctx.pipelines.response) transform(response)
62
-
63
- assert.equal(response.status, stated)
64
- assert.deepEqual(response.body, { code: 'SplxlO', error: 'invalid_grant' })
65
- }
66
- })
67
-
68
- it('should leave a failure the gateway built alone, on such a route too', () => {
69
- const ctx = context()
70
- const output = new Output(['code'])
71
-
72
- output.precall(ctx, [])
73
-
74
- // what `Server.fail` builds out of an exception, on a route that also declares `io:status`
75
- const response: OutgoingMessage = {
76
- status: 422,
77
- authentic: true,
78
- body: { code: 'NOT_FOUND', message: 'nope' }
79
- }
80
-
81
- for (const transform of ctx.pipelines.response) transform(response)
82
-
83
- assert.deepEqual(
84
- response.body,
85
- { code: 'NOT_FOUND', message: 'nope' },
86
- 'a code and a message are not what a restriction has anything to say about'
87
- )
88
- })
@@ -1,47 +0,0 @@
1
- import assert from 'node:assert'
2
- import type { Directive } from './Directive.js'
3
- import type * as http from '../../HTTP/index.js'
4
-
5
- /**
6
- * The status of the reply, taken from a property of what the operation returned and removed
7
- * from it — an outcome the operation knows and the transport does not, like a protocol that
8
- * states its error as a body rather than as a status of its own.
9
- *
10
- * Settled rather than transformed, so the status is set before anything reads it. A reply of
11
- * 300 or above is left as the operation built it, which `io:output` does not restrict: a
12
- * failure and a success are different shapes, and one list of permitted properties does not
13
- * describe both.
14
- */
15
- export class Status implements Directive {
16
- private readonly property: string
17
-
18
- public constructor(property: unknown) {
19
- this.property = property as string
20
- }
21
-
22
- public static validate(value: unknown): asserts value is string {
23
- assert.ok(typeof value === 'string', '`io:status` must be a string')
24
- }
25
-
26
- public precall(): void {
27
- // nothing to do until the operation has answered
28
- }
29
-
30
- public settle(_: unknown, response: http.OutgoingMessage): void {
31
- const body: unknown = response.body
32
-
33
- if (body === null || typeof body !== 'object' || !(this.property in body)) return
34
-
35
- const value: unknown = (body as Record<string, unknown>)[this.property]
36
-
37
- assert.ok(
38
- typeof value === 'number',
39
- `\`io:status\` expects '${this.property}' to be a number`
40
- )
41
-
42
- response.status = value
43
-
44
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
45
- delete (body as Record<string, unknown>)[this.property]
46
- }
47
- }
@@ -1,30 +0,0 @@
1
- import { TooManyRequests } from '../../HTTP/index.js'
2
- import * as schemas from './schemas.js'
3
- import { parse, Quotas, type Declaration, type Sync } from './lib/throttle/index.js'
4
- import type * as http from '../../HTTP/index.js'
5
- import type { Parameter } from '../../RTD/index.js'
6
- import type { Directive } from './Directive.js'
7
-
8
- export class Throttle implements Directive {
9
- private readonly quotas: Quotas
10
-
11
- public constructor(declaration: Declaration, sync: Sync, route: string) {
12
- this.quotas = Quotas.create(parse(declaration), route)
13
-
14
- sync.register(this.quotas)
15
- }
16
-
17
- public static validate(declaration: unknown): asserts declaration is Declaration {
18
- schemas.throttle.validate(declaration, "Incorrect 'io:throttle' format")
19
- }
20
-
21
- public precall(context: http.Context, parameters: Parameter[]): void {
22
- const retry = this.quotas.check(context, parameters)
23
-
24
- if (retry > 0) throw new TooManyRequests(retry)
25
- }
26
-
27
- public settle(context: http.Context, output: http.OutgoingMessage): void {
28
- this.quotas.use(context, output)
29
- }
30
- }
@@ -1,3 +0,0 @@
1
- import { IO } from './IO.js'
2
-
3
- export const io = new IO()
@@ -1,72 +0,0 @@
1
- import { it } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { parse, type Configuration } from './Configuration.js'
5
-
6
- const rest: Omit<Configuration, 'key' | 'condition'> = {
7
- interval: 1,
8
- requests: 1
9
- }
10
-
11
- it('should convert key', () => {
12
- const result: Partial<Configuration> = {
13
- key: [
14
- {
15
- method: 'ip'
16
- }
17
- ]
18
- }
19
-
20
- assert.partialDeepStrictEqual(parse({ key: 'ip', ...rest }), result)
21
- assert.partialDeepStrictEqual(parse({ key: ['ip'], ...rest }), result)
22
- })
23
-
24
- it('should convert condition', () => {
25
- assert.partialDeepStrictEqual(
26
- parse({ key: ['ip', 'path'], condition: { status: '404' }, ...rest }),
27
- {
28
- condition: [
29
- {
30
- method: 'status',
31
- options: '404'
32
- }
33
- ]
34
- }
35
- )
36
-
37
- assert.partialDeepStrictEqual(
38
- parse({ key: 'ip', condition: { status: '404' }, ...rest }),
39
- {
40
- condition: [
41
- {
42
- method: 'status',
43
- options: '404'
44
- }
45
- ]
46
- }
47
- )
48
- })
49
-
50
- it('should convert a key component that takes an argument', () => {
51
- assert.partialDeepStrictEqual(parse({ key: { segment: 'id' }, ...rest }), {
52
- key: [
53
- {
54
- method: 'segment',
55
- options: 'id'
56
- }
57
- ]
58
- })
59
- })
60
-
61
- it('should convert a mixed key', () => {
62
- assert.partialDeepStrictEqual(
63
- parse({ key: ['route', { segment: 'id' }, 'identity'], ...rest }),
64
- {
65
- key: [
66
- { method: 'route' },
67
- { method: 'segment', options: 'id' },
68
- { method: 'identity' }
69
- ]
70
- }
71
- )
72
- })