@toa.io/extensions.exposition 1.0.0-alpha.282 → 1.0.0-alpha.284

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 (667) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/components/exposition.octets/manifest.toa.yaml +11 -0
  3. package/components/exposition.octets/types/index.d.ts +3 -0
  4. package/components/exposition.octets/types/toa.d.ts +41 -0
  5. package/components/identity.bans/operations/transit.js +1 -1
  6. package/components/identity.bans/tsconfig.json +1 -1
  7. package/components/identity.bans/tsconfig.tsbuildinfo +1 -1
  8. package/components/identity.bans/types/index.d.ts +3 -0
  9. package/components/identity.bans/types/toa.d.ts +34 -0
  10. package/components/identity.basic/manifest.toa.yaml +13 -2
  11. package/components/identity.basic/operations/add.js +1 -1
  12. package/components/identity.basic/operations/authenticate.js +1 -1
  13. package/components/identity.basic/operations/check.js +1 -1
  14. package/components/identity.basic/operations/delete.js +1 -1
  15. package/components/identity.basic/operations/incept.js +18 -2
  16. package/components/identity.basic/operations/info.js +1 -1
  17. package/components/identity.basic/operations/lib/credentials.js +1 -1
  18. package/components/identity.basic/operations/transit.js +3 -2
  19. package/components/identity.basic/source/add.ts +3 -3
  20. package/components/identity.basic/source/authenticate.ts +2 -2
  21. package/components/identity.basic/source/check.ts +1 -1
  22. package/components/identity.basic/source/delete.ts +2 -2
  23. package/components/identity.basic/source/incept.ts +31 -3
  24. package/components/identity.basic/source/info.ts +1 -1
  25. package/components/identity.basic/source/transit.ts +6 -4
  26. package/components/identity.basic/tsconfig.json +1 -1
  27. package/components/identity.basic/tsconfig.tsbuildinfo +1 -1
  28. package/components/identity.basic/types/index.d.ts +22 -0
  29. package/components/identity.basic/types/toa.d.ts +121 -0
  30. package/components/identity.clients/manifest.toa.yaml +243 -0
  31. package/components/identity.clients/operations/describe.js +44 -0
  32. package/components/identity.clients/operations/lib/Context.js +2 -0
  33. package/components/identity.clients/operations/lib/Entity.js +2 -0
  34. package/components/identity.clients/operations/lib/canonical.js +24 -0
  35. package/components/identity.clients/operations/lib/cimd.js +86 -0
  36. package/components/identity.clients/operations/lib/errors.js +5 -0
  37. package/components/identity.clients/operations/lib/index.js +7 -0
  38. package/components/identity.clients/operations/lib/redirect.js +32 -0
  39. package/components/identity.clients/operations/register.js +84 -0
  40. package/components/identity.clients/source/describe.ts +65 -0
  41. package/components/identity.clients/source/lib/Context.ts +38 -0
  42. package/components/identity.clients/source/lib/Entity.ts +31 -0
  43. package/components/identity.clients/source/lib/canonical.test.ts +43 -0
  44. package/components/identity.clients/source/lib/canonical.ts +27 -0
  45. package/components/identity.clients/source/lib/cimd.test.ts +120 -0
  46. package/components/identity.clients/source/lib/cimd.ts +107 -0
  47. package/components/identity.clients/source/lib/errors.ts +4 -0
  48. package/components/identity.clients/source/lib/index.ts +6 -0
  49. package/components/identity.clients/source/lib/redirect.test.ts +41 -0
  50. package/components/identity.clients/source/lib/redirect.ts +35 -0
  51. package/components/identity.clients/source/register.ts +125 -0
  52. package/components/identity.clients/tsconfig.json +10 -0
  53. package/components/identity.clients/tsconfig.tsbuildinfo +1 -0
  54. package/components/identity.clients/types/index.d.ts +3 -0
  55. package/components/identity.clients/types/toa.d.ts +109 -0
  56. package/components/identity.credentials/operations/list.js +1 -1
  57. package/components/identity.credentials/source/list.ts +2 -1
  58. package/components/identity.credentials/tsconfig.json +4 -2
  59. package/components/identity.credentials/tsconfig.tsbuildinfo +1 -1
  60. package/components/identity.credentials/types/index.d.ts +3 -0
  61. package/components/identity.credentials/types/toa.d.ts +30 -0
  62. package/components/identity.federation/manifest.toa.yaml +37 -1
  63. package/components/identity.federation/operations/authenticate.js +7 -3
  64. package/components/identity.federation/operations/create.js +1 -1
  65. package/components/identity.federation/operations/decode.js +1 -1
  66. package/components/identity.federation/operations/delete.js +1 -1
  67. package/components/identity.federation/operations/incept.js +6 -2
  68. package/components/identity.federation/operations/lib/Configuration.js +1 -1
  69. package/components/identity.federation/operations/lib/Ctx.js +1 -1
  70. package/components/identity.federation/operations/lib/Payload.js +1 -1
  71. package/components/identity.federation/operations/lib/decode.js +23 -9
  72. package/components/identity.federation/operations/lib/discovery.js +1 -1
  73. package/components/identity.federation/operations/lib/errors.js +5 -1
  74. package/components/identity.federation/operations/lib/exchange.js +12 -7
  75. package/components/identity.federation/operations/lib/index.js +2 -1
  76. package/components/identity.federation/operations/lib/jose.js +1 -1
  77. package/components/identity.federation/operations/lib/principal.js +14 -0
  78. package/components/identity.federation/operations/lib/resolve.js +1 -1
  79. package/components/identity.federation/operations/list.js +1 -1
  80. package/components/identity.federation/operations/types/Scheme.js +1 -1
  81. package/components/identity.federation/operations/types/configuration.js +1 -1
  82. package/components/identity.federation/operations/types/context.js +1 -1
  83. package/components/identity.federation/operations/types/entity.js +1 -1
  84. package/components/identity.federation/operations/types/index.js +1 -1
  85. package/components/identity.federation/source/authenticate.ts +9 -3
  86. package/components/identity.federation/source/incept.ts +7 -1
  87. package/components/identity.federation/source/lib/Ctx.ts +2 -2
  88. package/components/identity.federation/source/lib/decode.ts +25 -9
  89. package/components/identity.federation/source/lib/errors.ts +5 -0
  90. package/components/identity.federation/source/lib/exchange.ts +11 -7
  91. package/components/identity.federation/source/lib/index.ts +1 -0
  92. package/components/identity.federation/source/lib/principal.ts +17 -0
  93. package/components/identity.federation/source/types/configuration.ts +1 -1
  94. package/components/identity.federation/source/types/context.ts +6 -2
  95. package/components/identity.federation/tsconfig.json +4 -2
  96. package/components/identity.federation/tsconfig.tsbuildinfo +1 -1
  97. package/components/identity.federation/types/index.d.ts +3 -0
  98. package/components/identity.federation/types/toa.d.ts +127 -0
  99. package/components/identity.grants/manifest.toa.yaml +245 -0
  100. package/components/identity.grants/operations/authorize.js +54 -0
  101. package/components/identity.grants/operations/exchange.js +89 -0
  102. package/components/identity.grants/operations/lib/code.js +30 -0
  103. package/components/identity.grants/operations/lib/identify.js +15 -0
  104. package/components/identity.grants/operations/lib/index.js +3 -0
  105. package/components/identity.grants/operations/list.js +18 -0
  106. package/components/identity.grants/operations/revoke.js +25 -0
  107. package/components/identity.grants/source/authorize.ts +90 -0
  108. package/components/identity.grants/source/exchange.ts +130 -0
  109. package/components/identity.grants/source/lib/code.ts +39 -0
  110. package/components/identity.grants/source/lib/identify.ts +16 -0
  111. package/components/identity.grants/source/lib/index.ts +3 -0
  112. package/components/identity.grants/source/list.ts +28 -0
  113. package/components/identity.grants/source/revoke.ts +38 -0
  114. package/components/identity.grants/tsconfig.json +10 -0
  115. package/components/identity.grants/tsconfig.tsbuildinfo +1 -0
  116. package/components/identity.grants/types/index.d.ts +60 -0
  117. package/components/identity.grants/types/toa.d.ts +108 -0
  118. package/components/identity.keys/manifest.toa.yaml +1 -0
  119. package/components/identity.keys/operations/create.js +1 -1
  120. package/components/identity.keys/operations/disable.js +1 -1
  121. package/components/identity.keys/operations/revoke.js +1 -1
  122. package/components/identity.keys/source/create.ts +1 -1
  123. package/components/identity.keys/source/revoke.ts +1 -1
  124. package/components/identity.keys/tsconfig.json +1 -1
  125. package/components/identity.keys/tsconfig.tsbuildinfo +1 -1
  126. package/components/identity.keys/types/index.d.ts +3 -0
  127. package/components/identity.keys/types/toa.d.ts +47 -0
  128. package/components/identity.otp/operations/authenticate.js +1 -1
  129. package/components/identity.otp/operations/issue.js +1 -1
  130. package/components/identity.otp/operations/lib/Context.js +1 -1
  131. package/components/identity.otp/operations/lib/Entity.js +1 -1
  132. package/components/identity.otp/operations/lib/index.js +1 -1
  133. package/components/identity.otp/source/lib/Context.ts +4 -2
  134. package/components/identity.otp/tsconfig.json +1 -1
  135. package/components/identity.otp/tsconfig.tsbuildinfo +1 -1
  136. package/components/identity.otp/types/index.d.ts +3 -0
  137. package/components/identity.otp/types/toa.d.ts +56 -0
  138. package/components/identity.passkeys/manifest.toa.yaml +3 -0
  139. package/components/identity.passkeys/operations/authenticate.js +1 -1
  140. package/components/identity.passkeys/operations/challenge.js +1 -1
  141. package/components/identity.passkeys/operations/create.js +1 -1
  142. package/components/identity.passkeys/operations/delete.js +1 -1
  143. package/components/identity.passkeys/operations/lib/const.js +1 -1
  144. package/components/identity.passkeys/operations/list.js +1 -1
  145. package/components/identity.passkeys/operations/types/Configuration.js +1 -1
  146. package/components/identity.passkeys/operations/types/Context.js +1 -1
  147. package/components/identity.passkeys/operations/types/Passkey.js +1 -1
  148. package/components/identity.passkeys/operations/types/index.js +1 -1
  149. package/components/identity.passkeys/operations/use.js +1 -1
  150. package/components/identity.passkeys/source/authenticate.ts +1 -1
  151. package/components/identity.passkeys/source/challenge.ts +1 -1
  152. package/components/identity.passkeys/source/create.ts +1 -1
  153. package/components/identity.passkeys/source/types/Context.ts +2 -1
  154. package/components/identity.passkeys/source/use.ts +1 -1
  155. package/components/identity.passkeys/tsconfig.json +1 -1
  156. package/components/identity.passkeys/tsconfig.tsbuildinfo +1 -1
  157. package/components/identity.passkeys/types/index.d.ts +3 -0
  158. package/components/identity.passkeys/types/toa.d.ts +120 -0
  159. package/components/identity.roles/operations/grant.js +1 -1
  160. package/components/identity.roles/operations/lib/Entity.js +1 -1
  161. package/components/identity.roles/operations/list.js +1 -1
  162. package/components/identity.roles/operations/principal.js +29 -5
  163. package/components/identity.roles/source/principal.ts +33 -5
  164. package/components/identity.roles/tsconfig.json +1 -1
  165. package/components/identity.roles/tsconfig.tsbuildinfo +1 -1
  166. package/components/identity.roles/types/index.d.ts +3 -0
  167. package/components/identity.roles/types/toa.d.ts +43 -0
  168. package/components/identity.tokens/manifest.toa.yaml +34 -3
  169. package/components/identity.tokens/operations/authenticate.js +9 -1
  170. package/components/identity.tokens/operations/decrypt.js +3 -3
  171. package/components/identity.tokens/operations/encrypt.js +1 -1
  172. package/components/identity.tokens/operations/issue.js +3 -2
  173. package/components/identity.tokens/operations/lib/form.js +24 -0
  174. package/components/identity.tokens/operations/lib/index.js +2 -2
  175. package/components/identity.tokens/operations/lib/jose.js +1 -1
  176. package/components/identity.tokens/operations/lib/key.js +1 -1
  177. package/components/identity.tokens/operations/lib/pad.js +1 -1
  178. package/components/identity.tokens/operations/revoke.js +1 -1
  179. package/components/identity.tokens/source/authenticate.test.ts +8 -5
  180. package/components/identity.tokens/source/authenticate.ts +12 -1
  181. package/components/identity.tokens/source/decrypt.test.ts +1 -1
  182. package/components/identity.tokens/source/decrypt.ts +4 -3
  183. package/components/identity.tokens/source/encrypt.test.ts +1 -1
  184. package/components/identity.tokens/source/encrypt.ts +2 -1
  185. package/components/identity.tokens/source/issue.test.ts +71 -0
  186. package/components/identity.tokens/source/issue.ts +4 -2
  187. package/components/identity.tokens/source/lib/form.test.ts +25 -0
  188. package/components/identity.tokens/source/lib/form.ts +31 -0
  189. package/components/identity.tokens/source/lib/index.ts +2 -1
  190. package/components/identity.tokens/tsconfig.json +1 -1
  191. package/components/identity.tokens/tsconfig.tsbuildinfo +1 -1
  192. package/components/identity.tokens/types/index.d.ts +61 -0
  193. package/components/identity.tokens/types/toa.d.ts +113 -0
  194. package/documentation/access.md +13 -0
  195. package/documentation/cache.md +10 -1
  196. package/documentation/components.md +3 -0
  197. package/documentation/consent.md +101 -0
  198. package/documentation/identity.md +3 -1
  199. package/documentation/introspection.md +13 -5
  200. package/documentation/io.md +42 -2
  201. package/documentation/map.md +8 -0
  202. package/documentation/mcp.md +180 -0
  203. package/documentation/oauth.md +180 -0
  204. package/documentation/protocol.md +4 -0
  205. package/documentation/rpc.md +140 -0
  206. package/documentation/tree.md +3 -0
  207. package/features/auth.bearer.feature +120 -0
  208. package/features/cache.feature +46 -0
  209. package/features/identity.basic.feature +44 -0
  210. package/features/identity.federation.feature +2 -5
  211. package/features/introspection.feature +333 -0
  212. package/features/mcp.feature +687 -0
  213. package/features/oauth.clients.feature +195 -0
  214. package/features/oauth.discovery.feature +164 -0
  215. package/features/oauth.grants.feature +299 -0
  216. package/features/octets.cloudinary.feature +1 -0
  217. package/features/rpc.feature +429 -0
  218. package/features/steps/Cloudinary.ts +13 -0
  219. package/features/steps/Components.ts +0 -4
  220. package/features/steps/Gateway.ts +23 -2
  221. package/features/steps/Parameters.ts +22 -7
  222. package/features/steps/Realtime.ts +3 -0
  223. package/features/steps/components/echo/manifest.toa.yaml +3 -0
  224. package/features/steps/components/octets.tester/manifest.toa.yaml +2 -0
  225. package/features/steps/components/octets.tester/operations/redirect.js +6 -1
  226. package/features/steps/components/pots/manifest.toa.yaml +2 -0
  227. package/features/steps/components/users/manifest.toa.yaml +1 -0
  228. package/package.json +8 -6
  229. package/readme.md +6 -0
  230. package/schemas/annotation.cos.yaml +63 -0
  231. package/schemas/call.cos.yaml +18 -0
  232. package/source/Annotation.ts +54 -0
  233. package/source/Directive.test.ts +15 -15
  234. package/source/Directive.ts +77 -9
  235. package/source/Endpoint.test.ts +67 -0
  236. package/source/Endpoint.ts +31 -11
  237. package/source/Factory.ts +6 -2
  238. package/source/Gateway.ts +73 -11
  239. package/source/HTTP/Context.ts +7 -0
  240. package/source/HTTP/Server.ts +15 -5
  241. package/source/HTTP/exceptions.ts +2 -2
  242. package/source/HTTP/formats/form.ts +21 -0
  243. package/source/HTTP/formats/index.ts +17 -2
  244. package/source/HTTP/messages.test.ts +25 -1
  245. package/source/HTTP/messages.ts +20 -4
  246. package/source/Interception.ts +8 -2
  247. package/source/Introspection.ts +102 -0
  248. package/source/MCP/Server.ts +275 -0
  249. package/source/MCP/discover.ts +52 -0
  250. package/source/MCP/errors.ts +81 -0
  251. package/source/MCP/index.ts +1 -0
  252. package/source/MCP/schema.test.ts +85 -0
  253. package/source/MCP/schema.ts +87 -0
  254. package/source/MCP/tools.ts +156 -0
  255. package/source/MCP/types.ts +81 -0
  256. package/source/Query.ts +48 -8
  257. package/source/RPC/Context.ts +78 -0
  258. package/source/RPC/Dispatcher.ts +130 -0
  259. package/source/RPC/errors.test.ts +52 -0
  260. package/source/RPC/errors.ts +83 -0
  261. package/source/RPC/index.ts +1 -0
  262. package/source/RPC/names.test.ts +122 -0
  263. package/source/RPC/names.ts +182 -0
  264. package/source/RPC/types.ts +34 -0
  265. package/source/RTD/Directives.ts +52 -2
  266. package/source/RTD/Endpoint.ts +2 -1
  267. package/source/RTD/Method.ts +14 -11
  268. package/source/RTD/Node.ts +38 -7
  269. package/source/RTD/Route.ts +30 -3
  270. package/source/RTD/Tree.ts +37 -1
  271. package/source/RTD/expiration.test.ts +1 -1
  272. package/source/RTD/walk.test.ts +110 -0
  273. package/source/const.ts +15 -0
  274. package/source/deployment.ts +11 -1
  275. package/source/directives/auth/Anonymous.test.ts +38 -0
  276. package/source/directives/auth/Anonymous.ts +12 -0
  277. package/source/directives/auth/Anyone.ts +4 -0
  278. package/source/directives/auth/Authorization.ts +108 -22
  279. package/source/directives/auth/Delegate.test.ts +36 -0
  280. package/source/directives/auth/Delegate.ts +14 -0
  281. package/source/directives/auth/Echo.ts +5 -0
  282. package/source/directives/auth/Incept.ts +16 -10
  283. package/source/directives/auth/Role.ts +13 -0
  284. package/source/directives/auth/Rule.ts +29 -0
  285. package/source/directives/auth/Scheme.ts +5 -0
  286. package/source/directives/auth/schemes.test.ts +8 -4
  287. package/source/directives/auth/schemes.ts +22 -9
  288. package/source/directives/auth/types.ts +26 -2
  289. package/source/directives/cache/Cache.ts +14 -5
  290. package/source/directives/cache/Control.ts +0 -3
  291. package/source/directives/dev/Development.ts +1 -1
  292. package/source/directives/flow/Fetch.ts +1 -1
  293. package/source/directives/flow/Flow.ts +1 -1
  294. package/source/directives/index.ts +5 -2
  295. package/source/directives/io/Directive.ts +1 -1
  296. package/source/directives/io/IO.ts +34 -3
  297. package/source/directives/io/Input.ts +3 -2
  298. package/source/directives/io/Output.ts +10 -4
  299. package/source/directives/io/Status.test.ts +84 -0
  300. package/source/directives/io/Status.ts +46 -0
  301. package/source/directives/io/Throttle.ts +1 -1
  302. package/source/directives/io/lib/throttle/Quotas.ts +2 -2
  303. package/source/directives/map/Headers.ts +11 -0
  304. package/source/directives/map/Map.ts +10 -1
  305. package/source/directives/map/Mapping.ts +23 -0
  306. package/source/directives/map/Segments.ts +12 -0
  307. package/source/directives/mcp/MCP.ts +33 -0
  308. package/source/directives/mcp/Tool.test.ts +66 -0
  309. package/source/directives/mcp/Tool.ts +28 -0
  310. package/source/directives/mcp/index.ts +6 -0
  311. package/source/directives/oauth/Discovery.ts +70 -0
  312. package/source/directives/oauth/documents.ts +113 -0
  313. package/source/directives/oauth/index.ts +3 -0
  314. package/source/directives/octets/Delete.ts +1 -1
  315. package/source/directives/octets/Get.ts +1 -1
  316. package/source/directives/octets/Octets.ts +1 -1
  317. package/source/directives/octets/Workflow.ts +1 -1
  318. package/source/directives/octets/workflows/Execution.ts +1 -1
  319. package/source/directives/require/Directive.ts +1 -1
  320. package/source/directives/require/Headers.ts +1 -1
  321. package/source/directives/require/Require.ts +2 -2
  322. package/source/index.ts +6 -0
  323. package/source/octets.d.ts +17 -0
  324. package/source/schemas.ts +2 -0
  325. package/source/userland.ts +47 -0
  326. package/transpiled/Annotation.d.ts +41 -0
  327. package/transpiled/Directive.d.ts +18 -1
  328. package/transpiled/Directive.js +50 -6
  329. package/transpiled/Directive.js.map +1 -1
  330. package/transpiled/Endpoint.d.ts +9 -0
  331. package/transpiled/Endpoint.js +27 -11
  332. package/transpiled/Endpoint.js.map +1 -1
  333. package/transpiled/Factory.js +6 -2
  334. package/transpiled/Factory.js.map +1 -1
  335. package/transpiled/Gateway.d.ts +19 -2
  336. package/transpiled/Gateway.js +51 -9
  337. package/transpiled/Gateway.js.map +1 -1
  338. package/transpiled/HTTP/Context.d.ts +6 -0
  339. package/transpiled/HTTP/Context.js +6 -0
  340. package/transpiled/HTTP/Context.js.map +1 -1
  341. package/transpiled/HTTP/Server.d.ts +8 -1
  342. package/transpiled/HTTP/Server.js +4 -3
  343. package/transpiled/HTTP/Server.js.map +1 -1
  344. package/transpiled/HTTP/exceptions.d.ts +1 -1
  345. package/transpiled/HTTP/exceptions.js +2 -2
  346. package/transpiled/HTTP/exceptions.js.map +1 -1
  347. package/transpiled/HTTP/formats/form.d.ts +9 -0
  348. package/transpiled/HTTP/formats/form.js +18 -0
  349. package/transpiled/HTTP/formats/form.js.map +1 -0
  350. package/transpiled/HTTP/formats/index.d.ts +10 -2
  351. package/transpiled/HTTP/formats/index.js +10 -0
  352. package/transpiled/HTTP/formats/index.js.map +1 -1
  353. package/transpiled/HTTP/messages.d.ts +12 -0
  354. package/transpiled/HTTP/messages.js +12 -4
  355. package/transpiled/HTTP/messages.js.map +1 -1
  356. package/transpiled/Interception.d.ts +4 -1
  357. package/transpiled/Interception.js +4 -2
  358. package/transpiled/Interception.js.map +1 -1
  359. package/transpiled/Introspection.d.ts +40 -0
  360. package/transpiled/Introspection.js +50 -1
  361. package/transpiled/Introspection.js.map +1 -1
  362. package/transpiled/MCP/Server.d.ts +41 -0
  363. package/transpiled/MCP/Server.js +180 -0
  364. package/transpiled/MCP/Server.js.map +1 -0
  365. package/transpiled/MCP/discover.d.ts +13 -0
  366. package/transpiled/MCP/discover.js +29 -0
  367. package/transpiled/MCP/discover.js.map +1 -0
  368. package/transpiled/MCP/errors.d.ts +24 -0
  369. package/transpiled/MCP/errors.js +67 -0
  370. package/transpiled/MCP/errors.js.map +1 -0
  371. package/transpiled/MCP/index.d.ts +1 -0
  372. package/transpiled/MCP/index.js +2 -0
  373. package/transpiled/MCP/index.js.map +1 -0
  374. package/transpiled/MCP/schema.d.ts +18 -0
  375. package/transpiled/MCP/schema.js +64 -0
  376. package/transpiled/MCP/schema.js.map +1 -0
  377. package/transpiled/MCP/tools.d.ts +31 -0
  378. package/transpiled/MCP/tools.js +121 -0
  379. package/transpiled/MCP/tools.js.map +1 -0
  380. package/transpiled/MCP/types.d.ts +64 -0
  381. package/transpiled/MCP/types.js +13 -0
  382. package/transpiled/MCP/types.js.map +1 -0
  383. package/transpiled/Query.d.ts +7 -0
  384. package/transpiled/Query.js +38 -7
  385. package/transpiled/Query.js.map +1 -1
  386. package/transpiled/RPC/Context.d.ts +11 -0
  387. package/transpiled/RPC/Context.js +63 -0
  388. package/transpiled/RPC/Context.js.map +1 -0
  389. package/transpiled/RPC/Dispatcher.d.ts +19 -0
  390. package/transpiled/RPC/Dispatcher.js +100 -0
  391. package/transpiled/RPC/Dispatcher.js.map +1 -0
  392. package/transpiled/RPC/errors.d.ts +18 -0
  393. package/transpiled/RPC/errors.js +67 -0
  394. package/transpiled/RPC/errors.js.map +1 -0
  395. package/transpiled/RPC/index.d.ts +1 -0
  396. package/transpiled/RPC/index.js +2 -0
  397. package/transpiled/RPC/index.js.map +1 -0
  398. package/transpiled/RPC/names.d.ts +30 -0
  399. package/transpiled/RPC/names.js +121 -0
  400. package/transpiled/RPC/names.js.map +1 -0
  401. package/transpiled/RPC/types.d.ts +27 -0
  402. package/transpiled/RPC/types.js +8 -0
  403. package/transpiled/RPC/types.js.map +1 -0
  404. package/transpiled/RTD/Directives.d.ts +41 -2
  405. package/transpiled/RTD/Endpoint.d.ts +2 -1
  406. package/transpiled/RTD/Method.d.ts +8 -3
  407. package/transpiled/RTD/Method.js +12 -10
  408. package/transpiled/RTD/Method.js.map +1 -1
  409. package/transpiled/RTD/Node.d.ts +20 -2
  410. package/transpiled/RTD/Node.js +22 -4
  411. package/transpiled/RTD/Node.js.map +1 -1
  412. package/transpiled/RTD/Route.d.ts +2 -1
  413. package/transpiled/RTD/Route.js +27 -2
  414. package/transpiled/RTD/Route.js.map +1 -1
  415. package/transpiled/RTD/Tree.d.ts +3 -1
  416. package/transpiled/RTD/Tree.js +26 -0
  417. package/transpiled/RTD/Tree.js.map +1 -1
  418. package/transpiled/const.d.ts +12 -0
  419. package/transpiled/const.js +12 -0
  420. package/transpiled/const.js.map +1 -1
  421. package/transpiled/deployment.js +6 -0
  422. package/transpiled/deployment.js.map +1 -1
  423. package/transpiled/directives/auth/Anonymous.d.ts +6 -0
  424. package/transpiled/directives/auth/Anonymous.js +10 -0
  425. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  426. package/transpiled/directives/auth/Anyone.d.ts +1 -0
  427. package/transpiled/directives/auth/Anyone.js +3 -0
  428. package/transpiled/directives/auth/Anyone.js.map +1 -1
  429. package/transpiled/directives/auth/Authorization.d.ts +28 -2
  430. package/transpiled/directives/auth/Authorization.js +87 -19
  431. package/transpiled/directives/auth/Authorization.js.map +1 -1
  432. package/transpiled/directives/auth/Delegate.d.ts +5 -0
  433. package/transpiled/directives/auth/Delegate.js +10 -0
  434. package/transpiled/directives/auth/Delegate.js.map +1 -1
  435. package/transpiled/directives/auth/Echo.d.ts +2 -0
  436. package/transpiled/directives/auth/Echo.js +4 -0
  437. package/transpiled/directives/auth/Echo.js.map +1 -1
  438. package/transpiled/directives/auth/Incept.d.ts +1 -1
  439. package/transpiled/directives/auth/Incept.js +13 -8
  440. package/transpiled/directives/auth/Incept.js.map +1 -1
  441. package/transpiled/directives/auth/Role.d.ts +2 -0
  442. package/transpiled/directives/auth/Role.js +9 -0
  443. package/transpiled/directives/auth/Role.js.map +1 -1
  444. package/transpiled/directives/auth/Rule.d.ts +5 -0
  445. package/transpiled/directives/auth/Rule.js +20 -0
  446. package/transpiled/directives/auth/Rule.js.map +1 -1
  447. package/transpiled/directives/auth/Scheme.d.ts +2 -0
  448. package/transpiled/directives/auth/Scheme.js +4 -0
  449. package/transpiled/directives/auth/Scheme.js.map +1 -1
  450. package/transpiled/directives/auth/schemes.d.ts +16 -4
  451. package/transpiled/directives/auth/schemes.js +20 -8
  452. package/transpiled/directives/auth/schemes.js.map +1 -1
  453. package/transpiled/directives/auth/types.d.ts +20 -2
  454. package/transpiled/directives/cache/Cache.d.ts +1 -1
  455. package/transpiled/directives/cache/Cache.js +10 -3
  456. package/transpiled/directives/cache/Cache.js.map +1 -1
  457. package/transpiled/directives/cache/Control.js +0 -2
  458. package/transpiled/directives/cache/Control.js.map +1 -1
  459. package/transpiled/directives/dev/Development.d.ts +1 -1
  460. package/transpiled/directives/dev/Development.js +1 -1
  461. package/transpiled/directives/dev/Development.js.map +1 -1
  462. package/transpiled/directives/flow/Flow.d.ts +1 -1
  463. package/transpiled/directives/flow/Flow.js +1 -1
  464. package/transpiled/directives/flow/Flow.js.map +1 -1
  465. package/transpiled/directives/index.js +4 -2
  466. package/transpiled/directives/index.js.map +1 -1
  467. package/transpiled/directives/io/Directive.d.ts +1 -1
  468. package/transpiled/directives/io/IO.d.ts +7 -1
  469. package/transpiled/directives/io/IO.js +25 -3
  470. package/transpiled/directives/io/IO.js.map +1 -1
  471. package/transpiled/directives/io/Input.d.ts +3 -2
  472. package/transpiled/directives/io/Input.js +2 -1
  473. package/transpiled/directives/io/Input.js.map +1 -1
  474. package/transpiled/directives/io/Output.d.ts +5 -3
  475. package/transpiled/directives/io/Output.js +8 -3
  476. package/transpiled/directives/io/Output.js.map +1 -1
  477. package/transpiled/directives/io/Status.d.ts +19 -0
  478. package/transpiled/directives/io/Status.js +34 -0
  479. package/transpiled/directives/io/Status.js.map +1 -0
  480. package/transpiled/directives/io/Throttle.d.ts +1 -1
  481. package/transpiled/directives/io/Throttle.js +1 -1
  482. package/transpiled/directives/io/Throttle.js.map +1 -1
  483. package/transpiled/directives/io/lib/throttle/Quotas.d.ts +1 -1
  484. package/transpiled/directives/io/lib/throttle/Quotas.js +2 -2
  485. package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
  486. package/transpiled/directives/map/Headers.d.ts +2 -0
  487. package/transpiled/directives/map/Headers.js +8 -0
  488. package/transpiled/directives/map/Headers.js.map +1 -1
  489. package/transpiled/directives/map/Map.d.ts +3 -1
  490. package/transpiled/directives/map/Map.js +7 -1
  491. package/transpiled/directives/map/Map.js.map +1 -1
  492. package/transpiled/directives/map/Mapping.d.ts +13 -0
  493. package/transpiled/directives/map/Mapping.js +20 -0
  494. package/transpiled/directives/map/Mapping.js.map +1 -1
  495. package/transpiled/directives/map/Segments.d.ts +3 -0
  496. package/transpiled/directives/map/Segments.js +9 -0
  497. package/transpiled/directives/map/Segments.js.map +1 -1
  498. package/transpiled/directives/mcp/MCP.d.ts +15 -0
  499. package/transpiled/directives/mcp/MCP.js +23 -0
  500. package/transpiled/directives/mcp/MCP.js.map +1 -0
  501. package/transpiled/directives/mcp/Tool.d.ts +13 -0
  502. package/transpiled/directives/mcp/Tool.js +23 -0
  503. package/transpiled/directives/mcp/Tool.js.map +1 -0
  504. package/transpiled/directives/mcp/index.d.ts +4 -0
  505. package/transpiled/directives/mcp/index.js +4 -0
  506. package/transpiled/directives/mcp/index.js.map +1 -0
  507. package/transpiled/directives/oauth/Discovery.d.ts +23 -0
  508. package/transpiled/directives/oauth/Discovery.js +55 -0
  509. package/transpiled/directives/oauth/Discovery.js.map +1 -0
  510. package/transpiled/directives/oauth/documents.d.ts +9 -0
  511. package/transpiled/directives/oauth/documents.js +82 -0
  512. package/transpiled/directives/oauth/documents.js.map +1 -0
  513. package/transpiled/directives/oauth/index.d.ts +2 -0
  514. package/transpiled/directives/oauth/index.js +3 -0
  515. package/transpiled/directives/oauth/index.js.map +1 -0
  516. package/transpiled/directives/octets/Octets.d.ts +1 -1
  517. package/transpiled/directives/octets/Octets.js +1 -1
  518. package/transpiled/directives/octets/Octets.js.map +1 -1
  519. package/transpiled/directives/require/Directive.d.ts +1 -1
  520. package/transpiled/directives/require/Headers.d.ts +1 -1
  521. package/transpiled/directives/require/Headers.js +1 -1
  522. package/transpiled/directives/require/Headers.js.map +1 -1
  523. package/transpiled/directives/require/Require.d.ts +1 -1
  524. package/transpiled/directives/require/Require.js +2 -2
  525. package/transpiled/directives/require/Require.js.map +1 -1
  526. package/transpiled/index.d.ts +2 -0
  527. package/transpiled/schemas.d.ts +2 -0
  528. package/transpiled/schemas.js +1 -0
  529. package/transpiled/schemas.js.map +1 -1
  530. package/transpiled/userland.d.ts +39 -0
  531. package/transpiled/userland.js +7 -0
  532. package/transpiled/userland.js.map +1 -0
  533. package/tsconfig.tsbuildinfo +1 -1
  534. package/components/identity.bans/operations/transit.d.ts +0 -14
  535. package/components/identity.bans/operations/transit.js.map +0 -1
  536. package/components/identity.basic/operations/add.d.ts +0 -3
  537. package/components/identity.basic/operations/add.js.map +0 -1
  538. package/components/identity.basic/operations/authenticate.d.ts +0 -13
  539. package/components/identity.basic/operations/authenticate.js.map +0 -1
  540. package/components/identity.basic/operations/check.d.ts +0 -7
  541. package/components/identity.basic/operations/check.js.map +0 -1
  542. package/components/identity.basic/operations/delete.d.ts +0 -7
  543. package/components/identity.basic/operations/delete.js.map +0 -1
  544. package/components/identity.basic/operations/incept.d.ts +0 -12
  545. package/components/identity.basic/operations/incept.js.map +0 -1
  546. package/components/identity.basic/operations/info.d.ts +0 -10
  547. package/components/identity.basic/operations/info.js.map +0 -1
  548. package/components/identity.basic/operations/lib/credentials.d.ts +0 -5
  549. package/components/identity.basic/operations/lib/credentials.js.map +0 -1
  550. package/components/identity.basic/operations/transit.d.ts +0 -14
  551. package/components/identity.basic/operations/transit.js.map +0 -1
  552. package/components/identity.basic/operations/types.d.ts +0 -61
  553. package/components/identity.basic/operations/types.js +0 -2
  554. package/components/identity.basic/operations/types.js.map +0 -1
  555. package/components/identity.basic/source/types.ts +0 -69
  556. package/components/identity.credentials/operations/list.d.ts +0 -51
  557. package/components/identity.credentials/operations/list.js.map +0 -1
  558. package/components/identity.federation/operations/authenticate.d.ts +0 -16
  559. package/components/identity.federation/operations/authenticate.js.map +0 -1
  560. package/components/identity.federation/operations/create.d.ts +0 -8
  561. package/components/identity.federation/operations/create.js.map +0 -1
  562. package/components/identity.federation/operations/decode.d.ts +0 -3
  563. package/components/identity.federation/operations/decode.js.map +0 -1
  564. package/components/identity.federation/operations/delete.d.ts +0 -8
  565. package/components/identity.federation/operations/delete.js.map +0 -1
  566. package/components/identity.federation/operations/incept.d.ts +0 -11
  567. package/components/identity.federation/operations/incept.js.map +0 -1
  568. package/components/identity.federation/operations/lib/Configuration.d.ts +0 -39
  569. package/components/identity.federation/operations/lib/Configuration.js.map +0 -1
  570. package/components/identity.federation/operations/lib/Ctx.d.ts +0 -8
  571. package/components/identity.federation/operations/lib/Ctx.js.map +0 -1
  572. package/components/identity.federation/operations/lib/Payload.d.ts +0 -5
  573. package/components/identity.federation/operations/lib/Payload.js.map +0 -1
  574. package/components/identity.federation/operations/lib/decode.d.ts +0 -3
  575. package/components/identity.federation/operations/lib/decode.js.map +0 -1
  576. package/components/identity.federation/operations/lib/discovery.d.ts +0 -5
  577. package/components/identity.federation/operations/lib/discovery.js.map +0 -1
  578. package/components/identity.federation/operations/lib/errors.d.ts +0 -70
  579. package/components/identity.federation/operations/lib/errors.js.map +0 -1
  580. package/components/identity.federation/operations/lib/exchange.d.ts +0 -3
  581. package/components/identity.federation/operations/lib/exchange.js.map +0 -1
  582. package/components/identity.federation/operations/lib/index.d.ts +0 -4
  583. package/components/identity.federation/operations/lib/index.js.map +0 -1
  584. package/components/identity.federation/operations/lib/jose.d.ts +0 -1
  585. package/components/identity.federation/operations/lib/jose.js.map +0 -1
  586. package/components/identity.federation/operations/lib/resolve.d.ts +0 -3
  587. package/components/identity.federation/operations/lib/resolve.js.map +0 -1
  588. package/components/identity.federation/operations/list.d.ts +0 -7
  589. package/components/identity.federation/operations/list.js.map +0 -1
  590. package/components/identity.federation/operations/types/Scheme.d.ts +0 -1
  591. package/components/identity.federation/operations/types/Scheme.js.map +0 -1
  592. package/components/identity.federation/operations/types/configuration.d.ts +0 -22
  593. package/components/identity.federation/operations/types/configuration.js.map +0 -1
  594. package/components/identity.federation/operations/types/context.d.ts +0 -35
  595. package/components/identity.federation/operations/types/context.js.map +0 -1
  596. package/components/identity.federation/operations/types/entity.d.ts +0 -9
  597. package/components/identity.federation/operations/types/entity.js.map +0 -1
  598. package/components/identity.federation/operations/types/index.d.ts +0 -4
  599. package/components/identity.federation/operations/types/index.js.map +0 -1
  600. package/components/identity.keys/operations/create.d.ts +0 -22
  601. package/components/identity.keys/operations/create.js.map +0 -1
  602. package/components/identity.keys/operations/disable.d.ts +0 -5
  603. package/components/identity.keys/operations/disable.js.map +0 -1
  604. package/components/identity.keys/operations/revoke.d.ts +0 -15
  605. package/components/identity.keys/operations/revoke.js.map +0 -1
  606. package/components/identity.otp/operations/authenticate.d.ts +0 -12
  607. package/components/identity.otp/operations/authenticate.js.map +0 -1
  608. package/components/identity.otp/operations/issue.d.ts +0 -12
  609. package/components/identity.otp/operations/issue.js.map +0 -1
  610. package/components/identity.otp/operations/lib/Context.d.ts +0 -14
  611. package/components/identity.otp/operations/lib/Context.js.map +0 -1
  612. package/components/identity.otp/operations/lib/Entity.d.ts +0 -6
  613. package/components/identity.otp/operations/lib/Entity.js.map +0 -1
  614. package/components/identity.otp/operations/lib/index.d.ts +0 -1
  615. package/components/identity.otp/operations/lib/index.js.map +0 -1
  616. package/components/identity.passkeys/operations/authenticate.d.ts +0 -16
  617. package/components/identity.passkeys/operations/authenticate.js.map +0 -1
  618. package/components/identity.passkeys/operations/challenge.d.ts +0 -35
  619. package/components/identity.passkeys/operations/challenge.js.map +0 -1
  620. package/components/identity.passkeys/operations/create.d.ts +0 -19
  621. package/components/identity.passkeys/operations/create.js.map +0 -1
  622. package/components/identity.passkeys/operations/delete.d.ts +0 -8
  623. package/components/identity.passkeys/operations/delete.js.map +0 -1
  624. package/components/identity.passkeys/operations/lib/const.d.ts +0 -1
  625. package/components/identity.passkeys/operations/lib/const.js.map +0 -1
  626. package/components/identity.passkeys/operations/list.d.ts +0 -7
  627. package/components/identity.passkeys/operations/list.js.map +0 -1
  628. package/components/identity.passkeys/operations/types/Configuration.d.ts +0 -6
  629. package/components/identity.passkeys/operations/types/Configuration.js.map +0 -1
  630. package/components/identity.passkeys/operations/types/Context.d.ts +0 -15
  631. package/components/identity.passkeys/operations/types/Context.js.map +0 -1
  632. package/components/identity.passkeys/operations/types/Passkey.d.ts +0 -12
  633. package/components/identity.passkeys/operations/types/Passkey.js.map +0 -1
  634. package/components/identity.passkeys/operations/types/index.d.ts +0 -2
  635. package/components/identity.passkeys/operations/types/index.js.map +0 -1
  636. package/components/identity.passkeys/operations/use.d.ts +0 -16
  637. package/components/identity.passkeys/operations/use.js.map +0 -1
  638. package/components/identity.roles/operations/grant.d.ts +0 -10
  639. package/components/identity.roles/operations/grant.js.map +0 -1
  640. package/components/identity.roles/operations/lib/Entity.d.ts +0 -5
  641. package/components/identity.roles/operations/lib/Entity.js.map +0 -1
  642. package/components/identity.roles/operations/list.d.ts +0 -2
  643. package/components/identity.roles/operations/list.js.map +0 -1
  644. package/components/identity.roles/operations/principal.d.ts +0 -13
  645. package/components/identity.roles/operations/principal.js.map +0 -1
  646. package/components/identity.tokens/operations/authenticate.d.ts +0 -9
  647. package/components/identity.tokens/operations/authenticate.js.map +0 -1
  648. package/components/identity.tokens/operations/decrypt.d.ts +0 -15
  649. package/components/identity.tokens/operations/decrypt.js.map +0 -1
  650. package/components/identity.tokens/operations/encrypt.d.ts +0 -8
  651. package/components/identity.tokens/operations/encrypt.js.map +0 -1
  652. package/components/identity.tokens/operations/issue.d.ts +0 -24
  653. package/components/identity.tokens/operations/issue.js.map +0 -1
  654. package/components/identity.tokens/operations/lib/index.d.ts +0 -3
  655. package/components/identity.tokens/operations/lib/index.js.map +0 -1
  656. package/components/identity.tokens/operations/lib/jose.d.ts +0 -1
  657. package/components/identity.tokens/operations/lib/jose.js.map +0 -1
  658. package/components/identity.tokens/operations/lib/key.d.ts +0 -1
  659. package/components/identity.tokens/operations/lib/key.js.map +0 -1
  660. package/components/identity.tokens/operations/lib/pad.d.ts +0 -1
  661. package/components/identity.tokens/operations/lib/pad.js.map +0 -1
  662. package/components/identity.tokens/operations/lib/types.d.ts +0 -88
  663. package/components/identity.tokens/operations/lib/types.js +0 -2
  664. package/components/identity.tokens/operations/lib/types.js.map +0 -1
  665. package/components/identity.tokens/operations/revoke.d.ts +0 -2
  666. package/components/identity.tokens/operations/revoke.js.map +0 -1
  667. package/components/identity.tokens/source/lib/types.ts +0 -102
@@ -1,24 +1,37 @@
1
1
  import type { Remote, Scheme } from './types.js'
2
2
 
3
- export const PROVIDERS: Record<Scheme, Remote> = {
4
- basic: 'basic',
5
- token: 'tokens',
6
- bearer: 'federation',
7
- code: 'federation',
8
- otp: 'otp'
3
+ /**
4
+ * The providers of a scheme, in the order they are asked. More than one claims `Bearer`:
5
+ * an OpenID `id_token` is federated, and a token this gateway issued is presented that way
6
+ * by an OAuth client. Which of them a credential belongs to is each provider's own to say,
7
+ * so the order here is only which is asked first.
8
+ */
9
+ export const PROVIDERS: Record<Scheme, Remote[]> = {
10
+ basic: ['basic'],
11
+ token: ['tokens'],
12
+ bearer: ['tokens', 'federation'],
13
+ code: ['federation'],
14
+ otp: ['otp']
9
15
  }
10
16
 
11
17
  export const INCEPTION: Remote[] = ['basic', 'federation']
12
- export const PRIMARY: Scheme = 'token'
18
+ export const PRIMARY: Remote = 'tokens'
13
19
 
14
20
  /**
15
- * The provider of a scheme, or nothing for a scheme that is not one — including a name a
21
+ * The providers of a scheme, or nothing for a scheme that is not one — including a name a
16
22
  * plain object answers on its own, like `constructor`.
17
23
  */
18
- export function provider (scheme: string): Remote | undefined {
24
+ export function providers (scheme: string): Remote[] | undefined {
19
25
  return Object.hasOwn(PROVIDERS, scheme) ? PROVIDERS[scheme as Scheme] : undefined
20
26
  }
21
27
 
28
+ /**
29
+ * What a provider answers when the credentials are not of its kind. The next provider of
30
+ * the scheme is asked; a provider that declines has done nothing, so asking is free of
31
+ * effect — which asking one that rejects would not be.
32
+ */
33
+ export const UNRECOGNIZED = 'UNRECOGNIZED'
34
+
22
35
  /**
23
36
  * The rejection of credentials that are verifiable and owned by no identity: the one
24
37
  * inception goes ahead with.
@@ -1,6 +1,7 @@
1
1
  import { type Component } from '@toa.io/core'
2
- import { type Maybe } from '@toa.io/types'
2
+ import { type Maybe } from '@toa.io/core'
3
3
  import { type Parameter } from '../../RTD/index.js'
4
+ import type { Introspection } from '../../Introspection.js'
4
5
  import type * as http from '../../HTTP/index.js'
5
6
  import type * as io from '../../io.js'
6
7
 
@@ -13,6 +14,26 @@ export interface Directive {
13
14
  parameters: Parameter[]
14
15
  ) => boolean | Promise<boolean>
15
16
 
17
+ /**
18
+ * Whether this admits the identity where that can be told without a request — which is
19
+ * what describing a method is. `undefined` says it cannot be told: a directive reading a
20
+ * route variable's value or the body has neither here, and one that is not implemented
21
+ * says the same by its absence. Nothing here may have an effect on the request.
22
+ */
23
+ admits?: (
24
+ identity: Identity | null,
25
+ context: Context
26
+ ) => boolean | undefined | Promise<boolean | undefined>
27
+
28
+ /**
29
+ * What this directive makes of what the method says about itself, which is the reverse of
30
+ * what it does to a request: a property it fills from the identity is taken out of the
31
+ * input, because it is not the caller's to send — and a description that offers one invites
32
+ * a caller to name an identity that is not theirs. Nothing here may have an effect on the
33
+ * request.
34
+ */
35
+ describe?: (introspection: Introspection) => Introspection
36
+
16
37
  reply?: (context: Context) => http.OutgoingMessage | null
17
38
 
18
39
  settle?: (context: Context, response: http.OutgoingMessage) => Promise<void>
@@ -23,6 +44,9 @@ export interface Identity {
23
44
  roles?: string[]
24
45
  permissions?: Record<string, string[]>
25
46
  scheme: string | null // null for transient identities
47
+
48
+ /** The component that verified the credentials; none for a transient identity. */
49
+ provider?: Remote
26
50
  refresh: boolean
27
51
  }
28
52
 
@@ -43,6 +67,6 @@ export type AuthenticationResult = Maybe<{ identity: Identity, refresh: boolean
43
67
  export type Scheme = 'basic' | 'token' | 'bearer' | 'code' | 'otp'
44
68
  export type Remote = 'basic' | 'federation' | 'tokens' | 'roles' | 'bans' | 'otp'
45
69
  export type Discovery = Record<Remote, Promise<Component>>
46
- export type Schemes = Record<Scheme, Component>
70
+ export type Components = Partial<Record<Remote, Component>>
47
71
 
48
72
  export type Create = (name: string, value: any, ...args: any[]) => Directive
@@ -18,19 +18,28 @@ export class Cache implements DirectiveFamily<Directive> {
18
18
  return new Class(value)
19
19
  }
20
20
 
21
- public preflight (): Output {
21
+ public precall (): Output {
22
22
  return null
23
23
  }
24
24
 
25
25
  public async settle (directives: Directive[], context: AuthenticatedContext, response: http.OutgoingMessage): Promise<void> {
26
- const method = context.request.method
26
+ const directive = directives[0]
27
+
28
+ response.headers ??= new Headers()
29
+
30
+ // `cache:exact` sets what it is given, whatever the method: whether a reply may be
31
+ // stored at all is not a question about the method's cacheability, and a token
32
+ // endpoint answers a POST it must not have kept
33
+ if (directive instanceof Exact) {
34
+ directive.set(context, response.headers)
27
35
 
28
- if (method !== 'GET' && method !== 'HEAD')
29
36
  return
37
+ }
30
38
 
31
- const directive = directives[0]
39
+ const method = context.request.method
32
40
 
33
- response.headers ??= new Headers()
41
+ if (method !== 'GET' && method !== 'HEAD')
42
+ return
34
43
 
35
44
  if (directive === undefined) {
36
45
  if (context.identity !== null && !Control.disabled(response.headers)) {
@@ -22,9 +22,6 @@ export class Control implements Directive {
22
22
  }
23
23
 
24
24
  public set (context: AuthenticatedContext, headers: Headers): void {
25
- if (!['GET', 'HEAD', 'OPTIONS'].includes(context.request.method))
26
- return
27
-
28
25
  this.control ??= this.resolve(context)
29
26
 
30
27
  if (Control.disabled(headers))
@@ -19,7 +19,7 @@ export class Development implements DirectiveFamily<Directive> {
19
19
  return new Class(value)
20
20
  }
21
21
 
22
- public async preflight (directives: Directive[], input: Input): Promise<Output> {
22
+ public async precall (directives: Directive[], input: Input): Promise<Output> {
23
23
  let output = null
24
24
 
25
25
  for (const directive of directives) {
@@ -5,7 +5,7 @@ import { NotFound } from '../../HTTP/index.js'
5
5
  import type { Directive } from './types.js'
6
6
  import type { ReadableStream } from 'node:stream/web'
7
7
  import type { Remotes } from '../../Remotes.js'
8
- import type { Maybe } from '@toa.io/types'
8
+ import type { Maybe } from '@toa.io/core'
9
9
  import type { Component } from '@toa.io/core'
10
10
  import type { Output } from '../../io.js'
11
11
  import type { Input } from '../octets/types.js'
@@ -18,7 +18,7 @@ export class Flow implements DirectiveFamily<Directive> {
18
18
  return new Class(value, remotes)
19
19
  }
20
20
 
21
- public async preflight (directives: Directive[], input: Input, parameters: Parameter[]): Promise<Output> {
21
+ public async precall (directives: Directive[], input: Input, parameters: Parameter[]): Promise<Output> {
22
22
  for (const directive of directives) {
23
23
  if (directive.attach !== undefined)
24
24
  directive.attach(input)
@@ -5,10 +5,13 @@ import { dev } from './dev/index.js'
5
5
  import { octets } from './octets/index.js'
6
6
  import { io } from './io/index.js'
7
7
  import { map } from './map/index.js'
8
+ import { mcp } from './mcp/index.js'
8
9
  import { req } from './require/index.js'
9
10
  import { flow } from './flow/index.js'
11
+ import { discovery } from './oauth/index.js'
10
12
  import type { DirectiveFamily } from '../RTD/index.js'
11
13
  import type { Interceptor } from '../Interception.js'
12
14
 
13
- export const families: DirectiveFamily[] = [authorization, io, cache, map, req, flow, octets, dev]
14
- export const interceptors: Interceptor[] = [cors]
15
+ export const families: DirectiveFamily[] =
16
+ [authorization, io, cache, map, mcp, req, flow, octets, dev]
17
+ export const interceptors: Interceptor[] = [cors, discovery]
@@ -4,7 +4,7 @@ import type { Input as Context } from '../../io.js'
4
4
  import type * as http from '../../HTTP/index.js'
5
5
 
6
6
  export interface Directive {
7
- preflight: (context: Context, parameters: Parameter[]) => void
7
+ precall: (context: Context, parameters: Parameter[]) => void
8
8
 
9
9
  /** Synchronous by contract: settling holds the response, and none of it needs I/O. */
10
10
  settle?: (context: Context, response: http.OutgoingMessage) => void
@@ -1,11 +1,14 @@
1
+ import { restrict } from '../../Introspection.js'
1
2
  import { Output } from './Output.js'
2
3
  import { Input } from './Input.js'
3
4
  import { Throttle } from './Throttle.js'
5
+ import { Status } from './Status.js'
4
6
  import { Sync } from './lib/throttle/index.js'
5
7
  import type * as http from '../../HTTP/index.js'
6
8
  import type { Parameter, DirectiveFamily } from '../../RTD/index.js'
7
9
  import type { Remotes } from '../../Remotes.js'
8
10
  import type { Constructor, Directive } from './Directive.js'
11
+ import type { Introspection } from '../../Introspection.js'
9
12
  import { ATOM_GROUP } from '../../const.js'
10
13
  import type { extensions } from '@toa.io/core'
11
14
 
@@ -37,22 +40,49 @@ export class IO implements DirectiveFamily<Directive> {
37
40
  return new Directive(value, this.sync!, route)
38
41
  }
39
42
 
40
- public preflight (directives: Directive[], context: http.Context,
43
+ public precall (directives: Directive[], context: http.Context,
41
44
  parameters: Parameter[]): null {
42
45
  let restricted = false
43
46
 
44
47
  for (const directive of directives) {
45
48
  restricted ||= directive instanceof Output
46
49
 
47
- directive.preflight(context, parameters)
50
+ directive.precall(context, parameters)
48
51
  }
49
52
 
50
53
  if (!restricted)
51
- DENIAL.preflight(context, parameters)
54
+ DENIAL.precall(context, parameters)
52
55
 
53
56
  return null
54
57
  }
55
58
 
59
+ /**
60
+ * What a whitelist admits is what the schema states. Without an `io:output` the reply is
61
+ * dropped before it is sent, so there is no output to describe at all.
62
+ */
63
+ public explain (directives: Directive[], _: http.Context,
64
+ introspection: Introspection): Introspection {
65
+ let restricted = false
66
+
67
+ for (const directive of directives) {
68
+ if (directive instanceof Input)
69
+ introspection.input = restrict(introspection.input, directive.allowed)
70
+
71
+ if (!(directive instanceof Output))
72
+ continue
73
+
74
+ restricted = true
75
+
76
+ if (!directive.disabled)
77
+ introspection.output = restrict(introspection.output, directive.allowed)
78
+ }
79
+
80
+ if (!restricted)
81
+ delete introspection.output
82
+
83
+ return introspection
84
+ }
85
+
56
86
  public settle (directives: Directive[], context: http.Context,
57
87
  output: http.OutgoingMessage): void {
58
88
  for (const directive of directives)
@@ -72,6 +102,7 @@ export class IO implements DirectiveFamily<Directive> {
72
102
  const constructors: Record<string, Constructor> = {
73
103
  input: Input,
74
104
  output: Output,
105
+ status: Status,
75
106
  throttle: Throttle
76
107
  }
77
108
 
@@ -5,7 +5,8 @@ import type { Directive } from './Directive.js'
5
5
  import type { Input as Context } from '../../io.js'
6
6
 
7
7
  export class Input implements Directive {
8
- private readonly allowed: Set<string>
8
+ /** what a client may send, which is therefore what the input schema states */
9
+ public readonly allowed: Set<string>
9
10
 
10
11
  public constructor (permissions: Permissions) {
11
12
  this.allowed = new Set(permissions)
@@ -15,7 +16,7 @@ export class Input implements Directive {
15
16
  schemas.input.validate<Permissions>(permissions, 'Incorrect \'io:input\' format')
16
17
  }
17
18
 
18
- public preflight (context: Context): void {
19
+ public precall (context: Context): void {
19
20
  // Restrictions are on what the client sent, so the check goes to the front of the
20
21
  // pipeline whatever order the families ran in: `auth:delegate` embeds the identity
21
22
  // and `map:*` assigns mapped properties, and those additions are the server's own,
@@ -7,10 +7,13 @@ import type { Input as Context } from '../../io.js'
7
7
  import type { OutgoingMessage } from '../../HTTP/index.js'
8
8
 
9
9
  export class Output implements Directive {
10
- private readonly disabled: boolean = false
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>
11
15
  private readonly omitted: boolean = true
12
16
  private readonly permissions: string[] = []
13
- private readonly allowed: Set<string>
14
17
 
15
18
  public constructor (permissions: Permissions) {
16
19
  if (typeof permissions === 'boolean')
@@ -29,13 +32,16 @@ export class Output implements Directive {
29
32
  schemas.output.validate(permissions, 'Incorrect \'io:output\' format')
30
33
  }
31
34
 
32
- public preflight (context: Context): void {
35
+ public precall (context: Context): void {
33
36
  context.pipelines.response.push(this.restriction(context))
34
37
  }
35
38
 
36
39
  private restriction (context: Context) {
37
40
  return (message: OutgoingMessage): void => {
38
- const error = message.status !== undefined && message.status >= 300
41
+ // what the gateway built is its own — a code and a message — and a restriction has
42
+ // nothing to say about it; everything else is a reply the operation returned, and is
43
+ // restricted whatever status it carries
44
+ const error = message.authentic === true
39
45
  const stream = message.body instanceof Stream
40
46
  const none = message.body === undefined || message.body === null
41
47
 
@@ -0,0 +1,84 @@
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 { pipelines: { body: [], response: [] }, url: { pathname: '/' } } as unknown as Context
13
+ }
14
+
15
+ it('should take the status from the property and remove it', () => {
16
+ const response: OutgoingMessage = { body: { status: 400, error: 'invalid_request' } }
17
+
18
+ status.settle(context(), response)
19
+
20
+ assert.equal(response.status, 400)
21
+ assert.deepEqual(response.body, { error: 'invalid_request' })
22
+ })
23
+
24
+ it('should leave a reply that states no status alone', () => {
25
+ const response: OutgoingMessage = { body: { id: 'x' } }
26
+
27
+ status.settle(context(), response)
28
+
29
+ assert.equal(response.status, undefined)
30
+ assert.deepEqual(response.body, { id: 'x' })
31
+ })
32
+
33
+ it('should refuse a status that is not one', () => {
34
+ for (const value of ['400', null, {}, true])
35
+ assert.throws(() => {
36
+ status.settle(context(), { body: { status: value } } as OutgoingMessage)
37
+ }, /`io:status` expects 'status' to be a number/)
38
+ })
39
+
40
+ it('should refuse a declaration that is not a property name', () => {
41
+ for (const value of [1, null, {}, ['status']])
42
+ assert.throws(() => Status.validate(value), /`io:status` must be a string/)
43
+ })
44
+
45
+ it('should have a reply it named the status of restricted, whatever that status is', () => {
46
+ for (const stated of [200, 400]) {
47
+ const ctx = context()
48
+ const output = new Output(['code', 'error'])
49
+
50
+ output.precall(ctx, [])
51
+
52
+ const response: OutgoingMessage = {
53
+ body: { status: stated, code: 'SplxlO', error: 'invalid_grant', secret: 'x' }
54
+ }
55
+
56
+ status.settle(ctx, response)
57
+
58
+ for (const transform of ctx.pipelines.response)
59
+ transform(response)
60
+
61
+ assert.equal(response.status, stated)
62
+ assert.deepEqual(response.body, { code: 'SplxlO', error: 'invalid_grant' })
63
+ }
64
+ })
65
+
66
+ it('should leave a failure the gateway built alone, on such a route too', () => {
67
+ const ctx = context()
68
+ const output = new Output(['code'])
69
+
70
+ output.precall(ctx, [])
71
+
72
+ // what `Server.fail` builds out of an exception, on a route that also declares `io:status`
73
+ const response: OutgoingMessage = {
74
+ status: 422,
75
+ authentic: true,
76
+ body: { code: 'NOT_FOUND', message: 'nope' }
77
+ }
78
+
79
+ for (const transform of ctx.pipelines.response)
80
+ transform(response)
81
+
82
+ assert.deepEqual(response.body, { code: 'NOT_FOUND', message: 'nope' },
83
+ 'a code and a message are not what a restriction has anything to say about')
84
+ })
@@ -0,0 +1,46 @@
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))
34
+ return
35
+
36
+ const value: unknown = (body as Record<string, unknown>)[this.property]
37
+
38
+ assert.ok(typeof value === 'number',
39
+ `\`io:status\` expects '${this.property}' to be a number`)
40
+
41
+ response.status = value
42
+
43
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
44
+ delete (body as Record<string, unknown>)[this.property]
45
+ }
46
+ }
@@ -18,7 +18,7 @@ export class Throttle implements Directive {
18
18
  schemas.throttle.validate(declaration, 'Incorrect \'io:throttle\' format')
19
19
  }
20
20
 
21
- public preflight (context: http.Context, parameters: Parameter[]): void {
21
+ public precall (context: http.Context, parameters: Parameter[]): void {
22
22
  const retry = this.quotas.check(context, parameters)
23
23
 
24
24
  if (retry > 0)
@@ -34,7 +34,7 @@ export class Quotas {
34
34
  private readonly entries = new Map<string, Entry>()
35
35
 
36
36
  /**
37
- * The key computed at preflight, for settle to charge against.
37
+ * The key computed at precall, for settle to charge against.
38
38
  *
39
39
  * `segment` reads the route parameters, which settle is not given, and `identity`
40
40
  * can be refreshed between the two — so recomputing there would key a request
@@ -97,7 +97,7 @@ export class Quotas {
97
97
  if (!this.conditional || !this.keys.matches(input, output))
98
98
  return
99
99
 
100
- // preflight always runs first, and a request it refuses never reaches settle
100
+ // precall always runs first, and a request it refuses never reaches settle
101
101
  const key = this.keyed.get(input) ?? this.keys.get(input)
102
102
 
103
103
  if (key === undefined)
@@ -1,7 +1,9 @@
1
1
  import assert from 'node:assert'
2
2
  import { cors } from '../cors/index.js'
3
3
  import { Mapping } from './Mapping.js'
4
+ import { take } from '../../Introspection.js'
4
5
  import type { Input } from '../../io.js'
6
+ import type { Introspection } from '../../Introspection.js'
5
7
 
6
8
  /**
7
9
  * Forbidden request header names: the browser sets them itself and a script cannot
@@ -25,6 +27,15 @@ export class Headers extends Mapping<Record<string, string>> {
25
27
  this.headers.forEach((header) => cors.allow(header))
26
28
  }
27
29
 
30
+ public override explain (introspection: Introspection): void {
31
+ for (const [property, header] of Object.entries(this.value)) {
32
+ const schema = take(introspection, property)
33
+
34
+ introspection.headers ??= {}
35
+ introspection.headers[property] = { ...schema, header }
36
+ }
37
+ }
38
+
28
39
  public properties (context: Input): Record<string, string> {
29
40
  context.pipelines.response.push((response) => {
30
41
  response.headers ??= new global.Headers()
@@ -12,6 +12,7 @@ import type { Directive } from './Directive.js'
12
12
  import type { Properties } from './Properties.js'
13
13
  import type { DirectiveFamily, Parameter } from '../../RTD/index.js'
14
14
  import type { Input, Output } from '../../io.js'
15
+ import type { Introspection } from '../../Introspection.js'
15
16
  import type { Remotes } from '../../Remotes.js'
16
17
 
17
18
  export class Map implements DirectiveFamily {
@@ -31,7 +32,15 @@ export class Map implements DirectiveFamily {
31
32
  })
32
33
  }
33
34
 
34
- public async preflight (directives: Directive[], context: Input, parameters: Parameter[]): Promise<Output> {
35
+ public explain (directives: Directive[], _: Input, introspection: Introspection): Introspection {
36
+ for (const directive of directives)
37
+ if (directive instanceof Mapping)
38
+ directive.explain(introspection)
39
+
40
+ return introspection
41
+ }
42
+
43
+ public async precall (directives: Directive[], context: Input, parameters: Parameter[]): Promise<Output> {
35
44
  const properties = {}
36
45
 
37
46
  for (const directive of directives)
@@ -1,7 +1,9 @@
1
+ import { take } from '../../Introspection.js'
1
2
  import type { Remotes } from '../../Remotes.js'
2
3
  import type { Directive } from './Directive.js'
3
4
  import type { Input } from '../../io.js'
4
5
  import type { Parameter } from '../../RTD/index.js'
6
+ import type { Introspection } from '../../Introspection.js'
5
7
 
6
8
  export abstract class Mapping<T = unknown> {
7
9
  protected value: T
@@ -13,6 +15,27 @@ export abstract class Mapping<T = unknown> {
13
15
  }
14
16
 
15
17
  public abstract properties (context: Input, parameters: Parameter[], directives: Directive[]): Output
18
+
19
+ /**
20
+ * What this mapping does to what the method says about itself, which is the reverse of
21
+ * what it does to a request: a property the gateway fills is taken out of the input,
22
+ * because it is not the caller's to send.
23
+ *
24
+ * The default says nothing more than that. A claim, an authority and a language come
25
+ * from the request itself and there is nowhere for a caller to put one; a header and a
26
+ * segment are the caller's, and those say where.
27
+ */
28
+ public explain (introspection: Introspection): void {
29
+ for (const property of this.names())
30
+ take(introspection, property)
31
+ }
32
+
33
+ /** The input properties this mapping fills, however its value names them. */
34
+ protected names (): string[] {
35
+ return typeof this.value === 'string'
36
+ ? [this.value]
37
+ : Object.keys(this.value as object)
38
+ }
16
39
  }
17
40
 
18
41
  type Properties = Record<string, unknown> | null
@@ -1,6 +1,8 @@
1
1
  import assert from 'node:assert'
2
2
  import { Mapping } from './Mapping.js'
3
+ import { take } from '../../Introspection.js'
3
4
  import type { Parameter } from '../../RTD/index.js'
5
+ import type { Introspection, Schema } from '../../Introspection.js'
4
6
 
5
7
  export class Segments extends Mapping<Record<string, string>> {
6
8
  public constructor (map: Record<string, string>) {
@@ -12,6 +14,16 @@ export class Segments extends Mapping<Record<string, string>> {
12
14
  super(map)
13
15
  }
14
16
 
17
+ /** A segment is the caller's, so it moves to the route rather than out of sight. */
18
+ public override explain (introspection: Introspection): void {
19
+ for (const property of Object.keys(this.value)) {
20
+ const schema = take(introspection, property)
21
+
22
+ introspection.route ??= {}
23
+ introspection.route[property] = schema ?? ({ type: 'string' } as unknown as Schema)
24
+ }
25
+ }
26
+
15
27
  public override properties (_: unknown, parameters: Parameter[]): Record<string, string> {
16
28
  return Object.entries(this.value).reduce((properties: Record<string, string>, [property, parameter]) => {
17
29
  const cut = parameter[0] === '~'
@@ -0,0 +1,33 @@
1
+ import assert from 'node:assert'
2
+ import { Tool } from './Tool.js'
3
+ import type { Context } from '../../HTTP/index.js'
4
+ import type { Introspection } from '../../Introspection.js'
5
+ import type { DirectiveFamily } from '../../RTD/index.js'
6
+
7
+ /** The name the family is declared under, and what `MCP` asks a method for. */
8
+ export const FAMILY = 'mcp'
9
+
10
+ export class MCP implements DirectiveFamily<Tool> {
11
+ public readonly name = FAMILY
12
+ public readonly mandatory = false
13
+
14
+ /** What this method is published as, which is what the nearest declaration says. */
15
+ public static published (directives: Tool[] | undefined): Tool | null {
16
+ return directives?.[0] ?? null
17
+ }
18
+
19
+ // eslint-disable-next-line max-params
20
+ public create (name: string, value: unknown, _: unknown, route: string): Tool {
21
+ assert.ok(name === 'tool', `Unknown directive: mcp:${name}`)
22
+
23
+ return new Tool(value, route)
24
+ }
25
+
26
+ /** What the route states this method is, which is the only thing that states it. */
27
+ public explain (directives: Tool[], _: Context,
28
+ introspection: Introspection): Introspection {
29
+ const tool = MCP.published(directives)
30
+
31
+ return tool === null ? introspection : { ...introspection, description: tool.description }
32
+ }
33
+ }