@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
package/source/Query.ts DELETED
@@ -1,277 +0,0 @@
1
- import assert from 'node:assert'
2
- import { quote } from '@toa.io/generic'
3
- import * as http from './HTTP/index.js'
4
- import { type Parameter } from './RTD/index.js'
5
- import * as schemas from './schemas.js'
6
- import { queryable } from './Mapping.js'
7
- import { take } from './Introspection.js'
8
- import type { Introspection, Schema } from './Introspection.js'
9
- import type * as syntax from './RTD/syntax/index.js'
10
- import type * as core from '@toa.io/core/types'
11
-
12
- export class Query {
13
- public readonly parameterized: boolean
14
-
15
- private readonly query: syntax.Query
16
- private readonly closed: boolean = false
17
- private readonly prepend: ',' | ';' = ';'
18
- private readonly queryable: boolean
19
- private readonly searchable: boolean
20
-
21
- /** whether a page is taken of what this answers, and so whether `omit` and `limit` apply */
22
- private readonly paged: boolean
23
-
24
- public constructor(query: syntax.Query, paged = true) {
25
- this.parameterized = query?.parameters !== undefined
26
- this.queryable = queryable(query)
27
- this.searchable = query?.search === true
28
- this.paged = paged
29
-
30
- if (this.queryable) {
31
- if (this.paged) {
32
- query.omit ??= { value: 0, range: [0, 1000] }
33
- query.limit ??= { value: 10, range: [1, 100] }
34
- }
35
-
36
- if (query.criteria !== undefined) {
37
- // eslint-disable-next-line max-depth
38
- if (query.criteria.endsWith(';')) query.criteria = query.criteria.slice(0, -1)
39
- else this.closed = true
40
-
41
- // eslint-disable-next-line max-depth
42
- if (query.criteria.startsWith(',') || query.criteria.startsWith(';')) {
43
- this.prepend = query.criteria[0] as ',' | ';'
44
-
45
- query.criteria = query.criteria.slice(1)
46
- }
47
- }
48
- }
49
-
50
- this.query = query
51
- }
52
-
53
- public fit(query: http.Query, parameters: Parameter[]): QueryString {
54
- const qs = this.split(query)
55
-
56
- if (qs.query !== null) {
57
- const error = schemas.querystring.fit(qs.query)
58
-
59
- if (error !== null) throw new http.BadRequest('Query ' + error.message)
60
-
61
- this.fitCriteria(qs.query, parameters)
62
-
63
- if (this.paged) this.fitRanges(qs.query)
64
- else this.refuseRanges(qs.query)
65
-
66
- this.fitSort(qs.query)
67
-
68
- if (this.query.deleted !== undefined)
69
- (qs.query as core.Query).deleted = this.query.deleted
70
- }
71
-
72
- return {
73
- query: qs.query as core.Query,
74
- parameters: qs.parameters
75
- }
76
- }
77
-
78
- /**
79
- * What the querystring carries: the parameters this method declares, taken out of the
80
- * input because they are not the body's, and what a queryable method accepts besides.
81
- *
82
- * Only what it actually accepts — a criteria the declaration closes is refused, and so is
83
- * a search where none was asked for.
84
- */
85
- /**
86
- * The querystring parameters this resource declares, which are properties of its own
87
- * taken out of the input. What selects records is not among them: that is the same of
88
- * every queryable resource, and `selection` is where it is stated.
89
- */
90
- public explain(introspection: Introspection): Record<string, Schema> | null {
91
- let query: Record<string, Schema> | null = null
92
-
93
- if (this.query?.parameters !== undefined)
94
- for (const parameter of this.query.parameters) {
95
- const schema = take(introspection, parameter)
96
-
97
- // eslint-disable-next-line max-depth
98
- if (schema === undefined) continue
99
-
100
- query ??= {}
101
- query[parameter] = schema
102
- }
103
-
104
- return query
105
- }
106
-
107
- /**
108
- * What picks the records a call is about, which is the querystring the gateway reads
109
- * rather than anything the resource declares — the same for every queryable resource,
110
- * and so not what one says about itself. A procedure states it, because there it is
111
- * something the caller sends.
112
- */
113
- public selection(): Record<string, Schema> | null {
114
- if (!this.queryable) return null
115
-
116
- const query: Record<string, Schema> = {}
117
-
118
- if (!this.closed)
119
- query.criteria = keyword(
120
- 'string',
121
- 'What to match, in RSQL: `state==hot`, `rank=gt=5;name==*tea*`.'
122
- )
123
-
124
- query.sort = keyword(
125
- 'string',
126
- 'What to order by: `rank:desc`, or `rank` for ascending.'
127
- )
128
-
129
- if (this.paged) {
130
- query.limit = bounded('How many at once.', this.query.limit!)
131
- query.omit = bounded('How many to skip.', this.query.omit!)
132
- }
133
-
134
- if (this.searchable)
135
- query.search = keyword('string', 'What to search the text index for.')
136
-
137
- return query
138
- }
139
-
140
- private split(query: http.Query): {
141
- query: http.Query | null
142
- parameters: Record<string, string> | null
143
- } {
144
- let parameters: Record<string, string> | null = null
145
-
146
- if (this.query?.parameters !== undefined)
147
- for (const key in query)
148
- // eslint-disable-next-line max-depth
149
- if (this.query.parameters.includes(key)) {
150
- parameters ??= {}
151
- parameters[key] = query[key] as string
152
-
153
- delete query[key]
154
- }
155
-
156
- if (!this.queryable) {
157
- const keys = Object.keys(query)
158
-
159
- if (keys.length > 0)
160
- throw new http.BadRequest(`Query parameter '${keys[0]}' is not allowed`)
161
-
162
- query = null!
163
- }
164
-
165
- if (query?.search !== undefined && !this.searchable)
166
- throw new http.BadRequest('Query search is not allowed')
167
-
168
- return {
169
- query,
170
- parameters
171
- }
172
- }
173
-
174
- private fitCriteria(query: http.Query, parameters: Parameter[]): void {
175
- const groups: CriteriaGroup[] = []
176
- const idx = parameters.findIndex((parameter) => parameter.name === 'id')
177
-
178
- if (idx !== -1) {
179
- query.id = parameters[idx].value
180
-
181
- parameters.splice(idx, 1)
182
- }
183
-
184
- if (parameters.length > 0) {
185
- // a segment may carry `,` `;` `(` `)` `=`, which is criteria grammar when unquoted
186
- const criteria = parameters
187
- .map(({ name, value }) => `${name}==${quote(value)}`)
188
- .join(';')
189
-
190
- groups.push({ criteria, operator: this.prepend })
191
- }
192
-
193
- if (this.query.criteria !== undefined)
194
- groups.push({ criteria: this.query.criteria, operator: ';' })
195
-
196
- if (query.criteria !== undefined)
197
- if (this.closed) throw new http.BadRequest('Query criteria is closed')
198
- else groups.push({ criteria: query.criteria, operator: WHATEVER })
199
-
200
- if (groups.length > 0)
201
- query.criteria = groups.reduce((acc, { criteria, operator }, i) => {
202
- return i === groups.length - 1
203
- ? `${acc}(${criteria})`
204
- : `${acc}(${criteria})${operator}`
205
- }, '')
206
- }
207
-
208
- /** A route that answers one object is not paged, so a request that pages it is a mistake. */
209
- private refuseRanges(qs: http.Query): void {
210
- for (const name of ['omit', 'limit'] as const)
211
- if (qs[name] !== undefined)
212
- throw new http.BadRequest(`Query ${name} is not allowed`)
213
- }
214
-
215
- private fitRanges(qs: http.Query): void {
216
- const query = qs as core.Query
217
-
218
- assert.ok(this.query.limit !== undefined, 'Query limit must be defined')
219
- assert.ok(this.query.omit !== undefined, 'Query limit range must be defined')
220
-
221
- if (qs.limit !== undefined)
222
- query.limit = fit(qs.limit, this.query.limit.range, 'limit')
223
- else query.limit = this.query.limit.value
224
-
225
- if (qs.omit !== undefined) query.omit = fit(qs.omit, this.query.omit.range, 'omit')
226
- }
227
-
228
- private fitSort(qs: http.Query): void {
229
- const query = qs as core.Query
230
-
231
- if (qs.sort === undefined && this.query.sort === undefined) return
232
-
233
- const sort = (this.query.sort ?? '') + (qs.sort ?? '')
234
-
235
- query.sort = sort.split(';')
236
- }
237
- }
238
-
239
- function fit(string: string, range: [number, number], name: string): number {
240
- const number = parseInt(string)
241
-
242
- if (number < range[0] || number > range[1])
243
- throw new http.BadRequest(
244
- `Query ${name} must be between ${range[0]} and ${range[1]} inclusive`
245
- )
246
-
247
- return number
248
- }
249
-
250
- const WHATEVER = ';'
251
-
252
- interface CriteriaGroup {
253
- criteria: string
254
- operator: ',' | ';'
255
- }
256
-
257
- function keyword(type: string, description: string): Schema {
258
- return { type, description } as unknown as Schema
259
- }
260
-
261
- function bounded(description: string, bounds: syntax.Range): Schema {
262
- const schema: Record<string, unknown> = {
263
- type: 'integer',
264
- description,
265
- minimum: bounds.range[0],
266
- maximum: bounds.range[1]
267
- }
268
-
269
- if (bounds.value !== undefined) schema.default = bounds.value
270
-
271
- return schema as unknown as Schema
272
- }
273
-
274
- export interface QueryString {
275
- query: core.Query | null
276
- parameters: Record<string, string> | null
277
- }
@@ -1,75 +0,0 @@
1
- import * as http from '../HTTP/index.js'
2
- import type { Params } from './types.js'
3
-
4
- /**
5
- * One call, as a request the rest of the gateway can serve.
6
- *
7
- * The clone is the transport context except for what the call decides, so nothing
8
- * downstream — the router, the directives, the endpoint, the mapping — knows it is one.
9
- * It is derived from the context rather than built beside it, so everything not named
10
- * here, `identity` included, is read through.
11
- */
12
- // eslint-disable-next-line max-params
13
- export function fork(
14
- context: http.Context,
15
- path: string,
16
- verb: string,
17
- query: Params | undefined,
18
- input: unknown
19
- ): http.Context {
20
- const url = new URL(path, context.url)
21
-
22
- if (query !== undefined)
23
- for (const [name, value] of Object.entries(query))
24
- url.searchParams.set(name, String(value))
25
-
26
- const headers = { ...context.request.headers }
27
-
28
- // a conditional is the envelope's, and a call would answer 304 to a question nobody asked
29
- delete headers['if-match']
30
- delete headers['if-none-match']
31
-
32
- const request = Object.create(context.request, {
33
- method: { value: verb, enumerable: true },
34
- headers: { value: headers, enumerable: true }
35
- })
36
-
37
- // its own, so an `io:output` restriction shapes this call's reply and no other
38
- const pipelines: Pipelines = { body: [], response: [] }
39
-
40
- return Object.create(context, {
41
- /*
42
- * A credential refuses an `anonymous` route because it would make the reply
43
- * uncacheable. What a procedure answers is not a reply: it is a value in an envelope
44
- * this gateway answers `no-store`, and the procedure's own headers are discarded.
45
- */
46
- procedural: { value: true, enumerable: true },
47
- url: { value: url, enumerable: true },
48
- request: { value: request, enumerable: true },
49
- pipelines: { value: pipelines, enumerable: true },
50
- body: {
51
- value: async () => {
52
- let value = input
53
-
54
- for (const transform of pipelines.body) value = await transform(value)
55
-
56
- return value
57
- }
58
- },
59
- /*
60
- * The raw request is the envelope, and it has been read. `map:buffer` is the one
61
- * directive that asks for it, and answering with a spent stream would hand the
62
- * operation an empty string; refusing says what is actually the matter.
63
- */
64
- buffer: {
65
- value: () => {
66
- throw new http.BadRequest('`map:buffer` reads the request, which a call is not')
67
- }
68
- }
69
- }) as http.Context
70
- }
71
-
72
- interface Pipelines {
73
- body: Array<(input: unknown) => unknown>
74
- response: Array<(output: http.OutgoingMessage) => void | Promise<void>>
75
- }
@@ -1,150 +0,0 @@
1
- import { console } from 'openspan'
2
- import * as http from '../HTTP/index.js'
3
- import * as schemas from '../schemas.js'
4
- import { BATCH } from '../const.js'
5
- import { address, split } from './names.js'
6
- import { fork } from './Context.js'
7
- import {
8
- BATCH_TOO_LARGE,
9
- INVALID_REQUEST,
10
- PARSE,
11
- failure,
12
- of,
13
- response
14
- } from './errors.js'
15
- import { VERSION, type Call, type Response } from './types.js'
16
- import type { RPC } from '../Annotation.js'
17
-
18
- /**
19
- * JSON-RPC, as the calls a request carries.
20
- *
21
- * It clones the context per call and hands each clone back to the gateway: it holds no
22
- * tree, no index and no knowledge of routing. Whether a name resolves, what it resolves
23
- * to, and what the directives of that route do are answered by the same `route` an
24
- * ordinary request goes through.
25
- */
26
- export class Dispatcher {
27
- private readonly batch: number
28
-
29
- public constructor(options: RPC) {
30
- this.batch = options.batch ?? BATCH
31
- }
32
-
33
- public async dispatch(
34
- context: http.Context,
35
- route: http.Processor
36
- ): Promise<http.OutgoingMessage> {
37
- if (context.request.method !== 'POST')
38
- throw new http.MethodNotAllowed(new Headers({ allow: 'POST' }))
39
-
40
- const envelope = await this.read(context)
41
- const batched = Array.isArray(envelope)
42
- const calls = batched ? envelope : [envelope]
43
-
44
- if (calls.length === 0)
45
- throw new http.BadRequest(
46
- response(null, failure(INVALID_REQUEST, 'A request carries at least one call'))
47
- )
48
-
49
- if (calls.length > this.batch)
50
- throw new http.BadRequest(
51
- response(
52
- null,
53
- failure(BATCH_TOO_LARGE, `A request carries at most ${this.batch} calls`)
54
- )
55
- )
56
-
57
- const answers: Response[] = []
58
-
59
- // one after another: a request the caller writes should not become a fan-out they own
60
- for (const call of calls) {
61
- const answer = await this.answer(call, context, route)
62
-
63
- if (answer !== null) answers.push(answer)
64
- }
65
-
66
- // every call was a notification, and a notification is answered by not answering
67
- if (answers.length === 0) return { status: NO_CONTENT }
68
-
69
- // a reply assembled from several is not one of them, and is not stored as if it were
70
- return {
71
- status: OK,
72
- body: batched ? answers : answers[0],
73
- headers: new Headers({ 'cache-control': 'no-store' })
74
- }
75
- }
76
-
77
- private async answer(
78
- input: unknown,
79
- context: http.Context,
80
- route: http.Processor
81
- ): Promise<Response | null> {
82
- const invalid = schemas.call.fit(input)
83
-
84
- // it may have carried an id, but nothing about it is trustworthy enough to answer to
85
- if (invalid !== null) return response(null, failure(INVALID_REQUEST, invalid.message))
86
-
87
- return await this.call(input as Call, context, route)
88
- }
89
-
90
- private async call(
91
- call: Call,
92
- context: http.Context,
93
- route: http.Processor
94
- ): Promise<Response | null> {
95
- const notification = call.id === undefined
96
-
97
- try {
98
- const params = call.params ?? {}
99
- const { path, verb, variables } = address(call.method, params)
100
- const { query, input } = split(params, variables)
101
- const clone = fork(context, path, verb, query, input)
102
-
103
- // one span per call, so what the directives of that call open has somewhere to hang
104
- const message = await console.span(
105
- { name: call.method, attributes: { id: call.id } },
106
- async () => await route(clone)
107
- )
108
-
109
- // what `io:output` restricts, over this call's reply rather than the envelope
110
- await http.shape(clone, message)
111
-
112
- if (notification) return null
113
-
114
- return { jsonrpc: VERSION, id: call.id!, result: message.body ?? null }
115
- } catch (exception) {
116
- /*
117
- * A credential belongs to the request. Refusing one call for it would leave the
118
- * reply a 200, and the challenge that tells a client where to authenticate is
119
- * attached to a 401 — so the whole envelope is refused instead.
120
- */
121
- if (exception instanceof http.Unauthorized) throw exception
122
-
123
- if (notification) {
124
- console.debug('Notification failed', {
125
- method: call.method,
126
- error: of(exception)
127
- })
128
-
129
- return null
130
- }
131
-
132
- return { jsonrpc: VERSION, id: call.id!, error: of(exception) }
133
- }
134
- }
135
-
136
- /** A body the decoder refuses is a parse error; a media type it does not know is not. */
137
- private async read(context: http.Context): Promise<unknown> {
138
- try {
139
- return await context.body()
140
- } catch (exception) {
141
- if (exception instanceof http.BadRequest)
142
- throw new http.BadRequest(response(null, failure(PARSE, 'Parse error')))
143
-
144
- throw exception
145
- }
146
- }
147
- }
148
-
149
- const OK = 200
150
- const NO_CONTENT = 204
@@ -1,77 +0,0 @@
1
- import { describe, it } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import * as http from '../HTTP/index.js'
5
- import {
6
- FORBIDDEN,
7
- INTERNAL,
8
- INVALID_PARAMS,
9
- METHOD_NOT_FOUND,
10
- REFUSED,
11
- of
12
- } from './errors.js'
13
-
14
- describe('of', () => {
15
- it('should read a missing route as a missing method', () => {
16
- assert.deepEqual(of(new http.NotFound('pots/_id/FETCH names no method')), {
17
- code: METHOD_NOT_FOUND,
18
- message: 'pots/_id/FETCH names no method'
19
- })
20
- })
21
-
22
- it('should read a verb the node does not declare as a missing method', () => {
23
- assert.deepEqual(of(new http.MethodNotAllowed()), {
24
- code: METHOD_NOT_FOUND,
25
- message: 'Method not found'
26
- })
27
- })
28
-
29
- it('should read a refused authorization as forbidden', () => {
30
- assert.deepEqual(of(new http.Forbidden()), { code: FORBIDDEN, message: 'Forbidden' })
31
- })
32
-
33
- it('should read a bad request as invalid params', () => {
34
- assert.deepEqual(of(new http.BadRequest('Query limit must be between 1 and 100')), {
35
- code: INVALID_PARAMS,
36
- message: 'Query limit must be between 1 and 100'
37
- })
38
- })
39
-
40
- it('should carry the code an operation refused with', () => {
41
- const error = Object.assign(new Error(), {
42
- code: 'WONT_CREATE',
43
- message: 'Volume is out of range'
44
- })
45
-
46
- assert.deepEqual(of(new http.UnprocessableEntity(error)), {
47
- code: REFUSED,
48
- message: 'Volume is out of range',
49
- data: { code: 'WONT_CREATE' }
50
- })
51
- })
52
-
53
- it('should stand the code in for a message the operation did not declare', () => {
54
- const error = Object.assign(new Error(), { code: 'WONT_CREATE' })
55
-
56
- assert.deepEqual(of(new http.UnprocessableEntity(error)), {
57
- code: REFUSED,
58
- message: 'WONT_CREATE',
59
- data: { code: 'WONT_CREATE' }
60
- })
61
- })
62
-
63
- it('should say what any other client error was refused with', () => {
64
- assert.deepEqual(of(new http.Conflict()), {
65
- code: REFUSED,
66
- message: 'Refused',
67
- data: { status: 409 }
68
- })
69
- })
70
-
71
- it('should say nothing of what it did not mean to answer', () => {
72
- assert.deepEqual(of(new Error('the connection dropped')), {
73
- code: INTERNAL,
74
- message: 'Internal error'
75
- })
76
- })
77
- })
@@ -1,82 +0,0 @@
1
- import * as http from '../HTTP/index.js'
2
- import { VERSION, type Failure, type Response } from './types.js'
3
-
4
- /*
5
- * The five the specification fixes (JSON-RPC 2.0 §5.1). A client reads these the same
6
- * whoever answers.
7
- */
8
- export const PARSE = -32700
9
- export const INVALID_REQUEST = -32600
10
- export const METHOD_NOT_FOUND = -32601
11
- export const INVALID_PARAMS = -32602
12
- export const INTERNAL = -32603
13
-
14
- /*
15
- * Ours. The specification reserves -32000 to -32099 for implementation-defined server
16
- * errors and defines nothing in it, so these mean nothing outside Toa — which is why
17
- * `REFUSED` carries the operation's own code in `data`.
18
- */
19
- export const FORBIDDEN = -32000
20
- export const REFUSED = -32001
21
- export const BATCH_TOO_LARGE = -32002
22
-
23
- export function failure(code: number, message: string, data?: unknown): Failure {
24
- const value: Failure = { code, message }
25
-
26
- if (data !== undefined) value.data = data
27
-
28
- return value
29
- }
30
-
31
- export function response(id: string | number | null, error: Failure): Response {
32
- return { jsonrpc: VERSION, id, error }
33
- }
34
-
35
- /**
36
- * What an exception says as a JSON-RPC error.
37
- *
38
- * The readable text is `body`, never `message`: `http.Exception` calls `super()` with no
39
- * argument, so every one of them carries an empty `message`.
40
- */
41
- export function of(exception: unknown): Failure {
42
- if (exception instanceof http.UnprocessableEntity) return refusal(exception)
43
-
44
- if (exception instanceof http.NotFound || exception instanceof http.MethodNotAllowed)
45
- return failure(METHOD_NOT_FOUND, text(exception, 'Method not found'))
46
-
47
- if (exception instanceof http.Forbidden)
48
- return failure(FORBIDDEN, text(exception, 'Forbidden'))
49
-
50
- if (exception instanceof http.BadRequest)
51
- return failure(INVALID_PARAMS, text(exception, 'Invalid params'))
52
-
53
- // a conflict, a precondition, a throttle: the call was refused, and by what is worth saying
54
- if (exception instanceof http.ClientError)
55
- return failure(REFUSED, text(exception, 'Refused'), { status: exception.status })
56
-
57
- return failure(INTERNAL, 'Internal error')
58
- }
59
-
60
- /**
61
- * An operation that declares its errors answers with one rather than throwing, and the
62
- * reply contract states `{ code, message? }` — the message optional. The number says the
63
- * operation refused; `data.code` says what it refused with, and is what a caller branches on.
64
- */
65
- function refusal(exception: http.UnprocessableEntity): Failure {
66
- const body = exception.body
67
-
68
- if (typeof body !== 'object' || body === null || typeof body.code !== 'string')
69
- return failure(REFUSED, text(exception, 'Refused'))
70
-
71
- const code = body.code as string
72
- const message =
73
- typeof body.message === 'string' && body.message !== '' ? body.message : code
74
-
75
- return failure(REFUSED, message, { code })
76
- }
77
-
78
- function text(exception: http.Exception, fallback: string): string {
79
- return typeof exception.body === 'string' && exception.body !== ''
80
- ? exception.body
81
- : fallback
82
- }
@@ -1 +0,0 @@
1
- export { Dispatcher } from './Dispatcher.js'