@toa.io/extensions.exposition 1.0.0-alpha.285 → 1.0.0-alpha.287

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 (611) hide show
  1. package/CHANGELOG.md +1 -545
  2. package/components/exposition.octets/operations/delete.js +1 -1
  3. package/components/exposition.octets/operations/get.js +5 -2
  4. package/components/exposition.octets/operations/head.js +1 -1
  5. package/components/exposition.octets/operations/put.js +29 -37
  6. package/components/exposition.octets/types/toa.d.ts +1 -1
  7. package/components/identity.bans/manifest.toa.yaml +12 -13
  8. package/components/identity.bans/migrations/0001-system-properties.yaml +14 -0
  9. package/components/identity.bans/operations/transit.js +1 -1
  10. package/components/identity.bans/source/transit.ts +1 -1
  11. package/components/identity.bans/tsconfig.tsbuildinfo +1 -1
  12. package/components/identity.bans/types/toa.d.ts +5 -5
  13. package/components/identity.basic/events/principal.js +3 -1
  14. package/components/identity.basic/manifest.toa.yaml +17 -23
  15. package/components/identity.basic/migrations/0001-system-properties.yaml +14 -0
  16. package/components/identity.basic/migrations/0002-indexes.yaml +13 -0
  17. package/components/identity.basic/operations/add.js +1 -1
  18. package/components/identity.basic/operations/authenticate.js +2 -2
  19. package/components/identity.basic/operations/check.js +4 -2
  20. package/components/identity.basic/operations/delete.js +1 -1
  21. package/components/identity.basic/operations/incept.js +1 -1
  22. package/components/identity.basic/operations/info.js +1 -1
  23. package/components/identity.basic/operations/lib/credentials.js +1 -1
  24. package/components/identity.basic/operations/transit.js +7 -8
  25. package/components/identity.basic/source/add.ts +5 -2
  26. package/components/identity.basic/source/authenticate.ts +11 -13
  27. package/components/identity.basic/source/check.ts +9 -6
  28. package/components/identity.basic/source/delete.ts +4 -1
  29. package/components/identity.basic/source/incept.ts +13 -10
  30. package/components/identity.basic/source/info.ts +4 -1
  31. package/components/identity.basic/source/lib/credentials.ts +2 -3
  32. package/components/identity.basic/source/transit.ts +27 -21
  33. package/components/identity.basic/tsconfig.tsbuildinfo +1 -1
  34. package/components/identity.basic/types/index.d.ts +7 -3
  35. package/components/identity.basic/types/toa.d.ts +5 -5
  36. package/components/identity.clients/manifest.toa.yaml +36 -40
  37. package/components/identity.clients/migrations/0001-system-properties.yaml +14 -0
  38. package/components/identity.clients/migrations/0002-indexes.yaml +4 -0
  39. package/components/identity.clients/operations/describe.js +1 -1
  40. package/components/identity.clients/operations/lib/canonical.js +1 -1
  41. package/components/identity.clients/operations/lib/cimd.js +3 -2
  42. package/components/identity.clients/operations/lib/redirect.js +7 -4
  43. package/components/identity.clients/operations/register.js +2 -2
  44. package/components/identity.clients/source/describe.ts +6 -8
  45. package/components/identity.clients/source/lib/Context.ts +6 -3
  46. package/components/identity.clients/source/lib/Entity.ts +1 -1
  47. package/components/identity.clients/source/lib/canonical.ts +1 -1
  48. package/components/identity.clients/source/lib/cimd.test.ts +8 -6
  49. package/components/identity.clients/source/lib/cimd.ts +24 -19
  50. package/components/identity.clients/source/lib/redirect.test.ts +8 -2
  51. package/components/identity.clients/source/lib/redirect.ts +12 -8
  52. package/components/identity.clients/source/register.ts +18 -18
  53. package/components/identity.clients/tsconfig.tsbuildinfo +1 -1
  54. package/components/identity.clients/types/toa.d.ts +5 -5
  55. package/components/identity.credentials/manifest.toa.yaml +4 -4
  56. package/components/identity.credentials/operations/list.js +8 -4
  57. package/components/identity.credentials/source/list.test.ts +39 -20
  58. package/components/identity.credentials/source/list.ts +12 -8
  59. package/components/identity.credentials/tsconfig.tsbuildinfo +1 -1
  60. package/components/identity.credentials/types/toa.d.ts +2 -2
  61. package/components/identity.federation/manifest.toa.yaml +23 -32
  62. package/components/identity.federation/migrations/0001-system-properties.yaml +14 -0
  63. package/components/identity.federation/migrations/0002-indexes.yaml +25 -0
  64. package/components/identity.federation/operations/authenticate.js +4 -2
  65. package/components/identity.federation/operations/create.js +2 -2
  66. package/components/identity.federation/operations/decode.js +1 -1
  67. package/components/identity.federation/operations/delete.js +1 -1
  68. package/components/identity.federation/operations/incept.js +1 -1
  69. package/components/identity.federation/operations/lib/decode.js +1 -1
  70. package/components/identity.federation/operations/lib/discovery.js +2 -2
  71. package/components/identity.federation/operations/lib/exchange.js +8 -4
  72. package/components/identity.federation/operations/lib/principal.js +1 -1
  73. package/components/identity.federation/operations/lib/resolve.js +1 -1
  74. package/components/identity.federation/operations/list.js +2 -2
  75. package/components/identity.federation/source/authenticate.ts +19 -17
  76. package/components/identity.federation/source/create.ts +6 -7
  77. package/components/identity.federation/source/decode.ts +4 -1
  78. package/components/identity.federation/source/delete.ts +4 -1
  79. package/components/identity.federation/source/incept.ts +2 -3
  80. package/components/identity.federation/source/lib/decode.ts +4 -7
  81. package/components/identity.federation/source/lib/discovery.test.ts +15 -5
  82. package/components/identity.federation/source/lib/discovery.ts +10 -9
  83. package/components/identity.federation/source/lib/exchange.ts +18 -15
  84. package/components/identity.federation/source/lib/jose.d.ts +1 -1
  85. package/components/identity.federation/source/lib/principal.ts +5 -3
  86. package/components/identity.federation/source/lib/resolve.ts +5 -1
  87. package/components/identity.federation/source/list.test.ts +26 -10
  88. package/components/identity.federation/source/list.ts +5 -2
  89. package/components/identity.federation/source/types/context.ts +5 -2
  90. package/components/identity.federation/source/types/entity.ts +2 -2
  91. package/components/identity.federation/tsconfig.tsbuildinfo +1 -1
  92. package/components/identity.federation/types/toa.d.ts +5 -5
  93. package/components/identity.grants/manifest.toa.yaml +27 -31
  94. package/components/identity.grants/migrations/0001-system-properties.yaml +14 -0
  95. package/components/identity.grants/migrations/0002-indexes.yaml +5 -0
  96. package/components/identity.grants/operations/authorize.js +1 -1
  97. package/components/identity.grants/operations/exchange.js +5 -2
  98. package/components/identity.grants/operations/lib/code.js +1 -1
  99. package/components/identity.grants/operations/lib/identify.js +1 -1
  100. package/components/identity.grants/operations/list.js +1 -1
  101. package/components/identity.grants/operations/revoke.js +3 -2
  102. package/components/identity.grants/source/authorize.ts +27 -19
  103. package/components/identity.grants/source/exchange.ts +15 -11
  104. package/components/identity.grants/source/lib/code.ts +20 -8
  105. package/components/identity.grants/source/lib/identify.ts +1 -1
  106. package/components/identity.grants/source/list.ts +2 -2
  107. package/components/identity.grants/source/revoke.ts +9 -7
  108. package/components/identity.grants/tsconfig.tsbuildinfo +1 -1
  109. package/components/identity.grants/types/index.d.ts +3 -3
  110. package/components/identity.grants/types/toa.d.ts +5 -5
  111. package/components/identity.keys/manifest.toa.yaml +18 -23
  112. package/components/identity.keys/migrations/0001-system-properties.yaml +14 -0
  113. package/components/identity.keys/migrations/0002-indexes.yaml +4 -0
  114. package/components/identity.keys/operations/create.js +1 -1
  115. package/components/identity.keys/operations/disable.js +1 -1
  116. package/components/identity.keys/operations/revoke.js +1 -1
  117. package/components/identity.keys/source/create.ts +2 -3
  118. package/components/identity.keys/source/disable.ts +1 -1
  119. package/components/identity.keys/source/revoke.ts +2 -2
  120. package/components/identity.keys/tsconfig.tsbuildinfo +1 -1
  121. package/components/identity.keys/types/toa.d.ts +5 -5
  122. package/components/identity.otp/manifest.toa.yaml +16 -24
  123. package/components/identity.otp/migrations/0001-system-properties.yaml +14 -0
  124. package/components/identity.otp/migrations/0002-indexes.yaml +5 -0
  125. package/components/identity.otp/operations/authenticate.js +1 -1
  126. package/components/identity.otp/operations/issue.js +1 -1
  127. package/components/identity.otp/source/authenticate.ts +4 -7
  128. package/components/identity.otp/source/issue.ts +1 -1
  129. package/components/identity.otp/source/lib/Context.ts +1 -1
  130. package/components/identity.otp/tsconfig.tsbuildinfo +1 -1
  131. package/components/identity.otp/types/toa.d.ts +5 -5
  132. package/components/identity.passkeys/manifest.toa.yaml +45 -53
  133. package/components/identity.passkeys/migrations/0001-system-properties.yaml +14 -0
  134. package/components/identity.passkeys/migrations/0002-indexes.yaml +11 -0
  135. package/components/identity.passkeys/operations/authenticate.js +1 -1
  136. package/components/identity.passkeys/operations/challenge.js +6 -3
  137. package/components/identity.passkeys/operations/create.js +1 -1
  138. package/components/identity.passkeys/operations/delete.js +1 -1
  139. package/components/identity.passkeys/operations/list.js +1 -1
  140. package/components/identity.passkeys/operations/use.js +1 -1
  141. package/components/identity.passkeys/source/authenticate.ts +3 -4
  142. package/components/identity.passkeys/source/challenge.ts +29 -25
  143. package/components/identity.passkeys/source/create.ts +8 -6
  144. package/components/identity.passkeys/source/delete.ts +4 -1
  145. package/components/identity.passkeys/source/list.ts +4 -1
  146. package/components/identity.passkeys/source/types/Context.ts +1 -1
  147. package/components/identity.passkeys/source/use.ts +12 -10
  148. package/components/identity.passkeys/tsconfig.tsbuildinfo +1 -1
  149. package/components/identity.passkeys/types/toa.d.ts +5 -5
  150. package/components/identity.roles/manifest.toa.yaml +12 -16
  151. package/components/identity.roles/migrations/0001-system-properties.yaml +14 -0
  152. package/components/identity.roles/migrations/0002-indexes.yaml +8 -0
  153. package/components/identity.roles/operations/grant.js +1 -1
  154. package/components/identity.roles/operations/list.js +1 -1
  155. package/components/identity.roles/operations/principal.js +2 -2
  156. package/components/identity.roles/source/grant.ts +7 -6
  157. package/components/identity.roles/source/list.ts +1 -1
  158. package/components/identity.roles/source/principal.ts +5 -7
  159. package/components/identity.roles/tsconfig.tsbuildinfo +1 -1
  160. package/components/identity.roles/types/toa.d.ts +5 -5
  161. package/components/identity.tokens/manifest.toa.yaml +17 -15
  162. package/components/identity.tokens/migrations/0001-system-properties.yaml +14 -0
  163. package/components/identity.tokens/operations/authenticate.js +2 -2
  164. package/components/identity.tokens/operations/decrypt.js +11 -5
  165. package/components/identity.tokens/operations/encrypt.js +2 -2
  166. package/components/identity.tokens/operations/issue.js +2 -4
  167. package/components/identity.tokens/operations/lib/form.js +1 -1
  168. package/components/identity.tokens/operations/lib/key.js +1 -1
  169. package/components/identity.tokens/operations/revoke.js +1 -1
  170. package/components/identity.tokens/source/authenticate.test.ts +22 -16
  171. package/components/identity.tokens/source/authenticate.ts +7 -10
  172. package/components/identity.tokens/source/decrypt.test.ts +62 -29
  173. package/components/identity.tokens/source/decrypt.ts +30 -27
  174. package/components/identity.tokens/source/encrypt.test.ts +21 -16
  175. package/components/identity.tokens/source/encrypt.ts +8 -11
  176. package/components/identity.tokens/source/issue.test.ts +4 -2
  177. package/components/identity.tokens/source/issue.ts +6 -8
  178. package/components/identity.tokens/source/lib/form.ts +5 -9
  179. package/components/identity.tokens/source/lib/jose.d.ts +1 -1
  180. package/components/identity.tokens/source/lib/key.ts +1 -1
  181. package/components/identity.tokens/source/lib/paseto.test.ts +17 -6
  182. package/components/identity.tokens/source/revoke.ts +1 -1
  183. package/components/identity.tokens/tsconfig.tsbuildinfo +1 -1
  184. package/components/identity.tokens/types/index.d.ts +13 -4
  185. package/components/identity.tokens/types/toa.d.ts +5 -5
  186. package/context.toa.yaml +2 -2
  187. package/cucumber.mjs +3 -0
  188. package/documentation/access.md +4 -3
  189. package/documentation/cache.md +17 -3
  190. package/documentation/components.md +2 -2
  191. package/documentation/credentials.md +2 -2
  192. package/documentation/identity.md +7 -9
  193. package/documentation/map.md +2 -2
  194. package/documentation/mcp.md +16 -16
  195. package/documentation/notes/peers.md +1 -1
  196. package/documentation/notes/throttling.md +1 -1
  197. package/documentation/octets.md +4 -4
  198. package/documentation/protocol.md +3 -3
  199. package/documentation/query.md +14 -8
  200. package/documentation/rpc.md +31 -21
  201. package/documentation/tracing.md +3 -3
  202. package/documentation/tree.md +1 -1
  203. package/features/auth.assert.feature +2 -2
  204. package/features/auth.bearer.feature +1 -1
  205. package/features/auth.claims.feature +5 -5
  206. package/features/auth.incept.feature +2 -2
  207. package/features/authorities.federation.feature +1 -1
  208. package/features/configuration.feature +3 -4
  209. package/features/credentials.feature +9 -9
  210. package/features/dev.feature +1 -0
  211. package/features/dynamic.feature +1 -0
  212. package/features/errors.feature +21 -0
  213. package/features/etag.feature +0 -86
  214. package/features/identity.bans.feature +3 -3
  215. package/features/identity.basic.feature +9 -9
  216. package/features/identity.federation.feature +11 -11
  217. package/features/identity.tokens.custom.feature +5 -5
  218. package/features/identity.tokens.feature +2 -2
  219. package/features/interruptions.feature +1 -0
  220. package/features/introspection.map.feature +4 -4
  221. package/features/io.throttle.feature +1 -0
  222. package/features/map.feature +2 -2
  223. package/features/octets.cloudinary.feature +1 -1
  224. package/features/octets.download.feature +1 -0
  225. package/features/require.feature +1 -2
  226. package/features/steps/Captures.ts +1 -1
  227. package/features/steps/Cloudinary.ts +1 -2
  228. package/features/steps/Common.ts +4 -5
  229. package/features/steps/Components.ts +17 -12
  230. package/features/steps/Database.ts +42 -23
  231. package/features/steps/Gateway.ts +55 -72
  232. package/features/steps/HTTP.ts +12 -15
  233. package/features/steps/IDP.ts +118 -94
  234. package/features/steps/Identity.ts +3 -3
  235. package/features/steps/OTP.ts +3 -3
  236. package/features/steps/Parameters.ts +20 -10
  237. package/features/steps/Probe.ts +9 -7
  238. package/features/steps/Realtime.ts +40 -22
  239. package/features/steps/Workspace.ts +10 -7
  240. package/features/steps/components/audit/operations/record.js +1 -1
  241. package/features/steps/components/echo/operations/affect.js +1 -1
  242. package/features/steps/components/echo/operations/compute.js +1 -1
  243. package/features/steps/components/echo/operations/echo.js +1 -1
  244. package/features/steps/components/echo/operations/error.js +1 -1
  245. package/features/steps/components/echo/operations/identity.js +1 -1
  246. package/features/steps/components/echo/operations/parameters.js +1 -1
  247. package/features/steps/components/echo/operations/ping.js +1 -1
  248. package/features/steps/components/echo/operations/unwrap.js +1 -1
  249. package/features/steps/components/greeter/operations/greet.js +1 -1
  250. package/features/steps/components/notify/operations/send.js +1 -1
  251. package/features/steps/components/octets.tester/operations/authority.js +1 -1
  252. package/features/steps/components/octets.tester/operations/bar.js +1 -1
  253. package/features/steps/components/octets.tester/operations/baz.js +1 -1
  254. package/features/steps/components/octets.tester/operations/concat.js +1 -1
  255. package/features/steps/components/octets.tester/operations/echo.js +1 -1
  256. package/features/steps/components/octets.tester/operations/err.js +1 -1
  257. package/features/steps/components/octets.tester/operations/foo.js +1 -1
  258. package/features/steps/components/octets.tester/operations/id.js +1 -1
  259. package/features/steps/components/octets.tester/operations/identity.js +1 -1
  260. package/features/steps/components/octets.tester/operations/redirect.js +6 -4
  261. package/features/steps/components/octets.tester/operations/yex.js +1 -1
  262. package/features/steps/components/octets.tester/operations/yield.js +1 -1
  263. package/features/steps/components/orders/manifest.toa.yaml +10 -12
  264. package/features/steps/components/orders/operations/create.js +4 -2
  265. package/features/steps/components/pots/manifest.toa.yaml +15 -20
  266. package/features/steps/components/pots/migrations/0002-indexes.yaml +4 -0
  267. package/features/steps/components/pricing/operations/quote.js +1 -1
  268. package/features/steps/components/sequences/manifest.toa.yaml +0 -1
  269. package/features/steps/components/sequences/operations/numbers.js +1 -1
  270. package/features/steps/components/sequences/operations/tokens.js +3 -3
  271. package/features/steps/components/users/manifest.toa.yaml +3 -5
  272. package/features/steps/components/users/operations/create.js +1 -1
  273. package/features/steps/components/users.properties/manifest.toa.yaml +5 -6
  274. package/features/steps/map.ts +2 -2
  275. package/features/timestamps.feature +1 -1
  276. package/package.json +7 -7
  277. package/readme.md +11 -11
  278. package/schemas/annotation.cos.yaml +1 -3
  279. package/schemas/method.cos.yaml +2 -0
  280. package/source/Branch.test.ts +2 -2
  281. package/source/Branch.ts +3 -5
  282. package/source/Composition.ts +5 -5
  283. package/source/Directive.test.ts +38 -20
  284. package/source/Directive.ts +61 -47
  285. package/source/Endpoint.test.ts +1 -1
  286. package/source/Endpoint.ts +27 -92
  287. package/source/Factory.ts +26 -12
  288. package/source/Gateway.ts +87 -76
  289. package/source/HTTP/Context.ts +23 -30
  290. package/source/HTTP/Probe.ts +7 -9
  291. package/source/HTTP/Server.ts +88 -69
  292. package/source/HTTP/Timing.ts +6 -21
  293. package/source/HTTP/address.test.ts +8 -2
  294. package/source/HTTP/address.ts +2 -3
  295. package/source/HTTP/exceptions.ts +20 -18
  296. package/source/HTTP/formats/form.ts +1 -1
  297. package/source/HTTP/formats/json.ts +2 -2
  298. package/source/HTTP/formats/msgpack.ts +3 -4
  299. package/source/HTTP/formats/text.ts +2 -2
  300. package/source/HTTP/formats/yaml.test.ts +4 -1
  301. package/source/HTTP/formats/yaml.ts +14 -11
  302. package/source/HTTP/messages.test.ts +38 -28
  303. package/source/HTTP/messages.ts +44 -98
  304. package/source/Interception.ts +3 -4
  305. package/source/Introspection.ts +26 -14
  306. package/source/MCP/Server.ts +114 -54
  307. package/source/MCP/discover.ts +6 -7
  308. package/source/MCP/errors.ts +7 -8
  309. package/source/MCP/schema.test.ts +9 -3
  310. package/source/MCP/schema.ts +12 -16
  311. package/source/MCP/tools.ts +33 -28
  312. package/source/Mapping.ts +25 -27
  313. package/source/Query.ts +58 -44
  314. package/source/RPC/Context.ts +8 -11
  315. package/source/RPC/Dispatcher.ts +46 -26
  316. package/source/RPC/errors.test.ts +41 -16
  317. package/source/RPC/errors.ts +9 -10
  318. package/source/RPC/names.test.ts +35 -16
  319. package/source/RPC/names.ts +22 -29
  320. package/source/RTD/Directives.ts +21 -10
  321. package/source/RTD/Endpoint.ts +4 -1
  322. package/source/RTD/Method.ts +8 -6
  323. package/source/RTD/Node.ts +32 -34
  324. package/source/RTD/Route.ts +18 -21
  325. package/source/RTD/Tree.ts +18 -18
  326. package/source/RTD/factory.ts +13 -16
  327. package/source/RTD/segment.ts +12 -10
  328. package/source/RTD/syntax/parse.test.ts +12 -6
  329. package/source/RTD/syntax/parse.ts +30 -26
  330. package/source/RTD/syntax/types.ts +17 -1
  331. package/source/RTD/walk.test.ts +59 -22
  332. package/source/Remotes.test.ts +25 -4
  333. package/source/Remotes.ts +9 -4
  334. package/source/Tenant.ts +12 -12
  335. package/source/deployment.ts +20 -20
  336. package/source/directives/auth/Anonymous.test.ts +8 -2
  337. package/source/directives/auth/Anonymous.ts +5 -8
  338. package/source/directives/auth/Anyone.ts +3 -3
  339. package/source/directives/auth/Assert.ts +10 -10
  340. package/source/directives/auth/Authorization.ts +83 -69
  341. package/source/directives/auth/Delegate.test.ts +2 -2
  342. package/source/directives/auth/Delegate.ts +8 -10
  343. package/source/directives/auth/Echo.ts +5 -8
  344. package/source/directives/auth/Federation.ts +30 -21
  345. package/source/directives/auth/Id.ts +7 -4
  346. package/source/directives/auth/Incept.ts +32 -26
  347. package/source/directives/auth/Input.ts +36 -20
  348. package/source/directives/auth/Role.test.ts +49 -23
  349. package/source/directives/auth/Role.ts +29 -22
  350. package/source/directives/auth/Rule.ts +13 -8
  351. package/source/directives/auth/Scheme.ts +7 -7
  352. package/source/directives/auth/create.ts +1 -1
  353. package/source/directives/auth/schemes.ts +1 -1
  354. package/source/directives/auth/split.ts +2 -3
  355. package/source/directives/auth/types.ts +5 -2
  356. package/source/directives/cache/Cache.ts +44 -9
  357. package/source/directives/cache/Control.ts +25 -26
  358. package/source/directives/cache/Exact.ts +1 -1
  359. package/source/directives/cache/etag.ts +38 -0
  360. package/source/directives/cors/CORS.ts +9 -7
  361. package/source/directives/dev/Development.ts +3 -4
  362. package/source/directives/dev/Faulty.ts +11 -6
  363. package/source/directives/dev/Sleep.ts +5 -7
  364. package/source/directives/dev/Stub.ts +2 -2
  365. package/source/directives/dev/Throw.ts +2 -2
  366. package/source/directives/flow/Compose.ts +26 -20
  367. package/source/directives/flow/Fetch.ts +15 -15
  368. package/source/directives/flow/Flow.ts +9 -8
  369. package/source/directives/index.ts +11 -2
  370. package/source/directives/io/IO.ts +29 -20
  371. package/source/directives/io/Input.ts +9 -12
  372. package/source/directives/io/Output.ts +20 -23
  373. package/source/directives/io/Status.test.ts +12 -8
  374. package/source/directives/io/Status.ts +9 -8
  375. package/source/directives/io/Throttle.ts +6 -7
  376. package/source/directives/io/lib/throttle/Configuration.test.ts +32 -23
  377. package/source/directives/io/lib/throttle/Configuration.ts +14 -9
  378. package/source/directives/io/lib/throttle/Keys.ts +15 -10
  379. package/source/directives/io/lib/throttle/Quotas.test.ts +33 -17
  380. package/source/directives/io/lib/throttle/Quotas.ts +20 -26
  381. package/source/directives/io/lib/throttle/Sync.test.ts +14 -10
  382. package/source/directives/io/lib/throttle/Sync.ts +9 -12
  383. package/source/directives/io/lib/throttle/Warning.ts +3 -4
  384. package/source/directives/io/lib/throttle/components/IP.ts +4 -5
  385. package/source/directives/io/lib/throttle/components/Identity.ts +1 -1
  386. package/source/directives/io/lib/throttle/components/Path.ts +1 -1
  387. package/source/directives/io/lib/throttle/components/Route.ts +2 -2
  388. package/source/directives/io/lib/throttle/components/Segment.ts +2 -2
  389. package/source/directives/io/lib/throttle/conditions/Status.ts +2 -2
  390. package/source/directives/io/schemas.test.ts +12 -6
  391. package/source/directives/map/Authority.ts +2 -2
  392. package/source/directives/map/Buffer.ts +2 -2
  393. package/source/directives/map/Claims.ts +25 -20
  394. package/source/directives/map/Headers.ts +17 -13
  395. package/source/directives/map/Language.ts +8 -5
  396. package/source/directives/map/Languages.ts +9 -3
  397. package/source/directives/map/Map.ts +25 -12
  398. package/source/directives/map/Mapping.ts +9 -6
  399. package/source/directives/map/Properties.ts +1 -1
  400. package/source/directives/map/Segments.ts +22 -15
  401. package/source/directives/mcp/MCP.ts +9 -7
  402. package/source/directives/mcp/Tool.test.ts +21 -9
  403. package/source/directives/mcp/Tool.ts +23 -11
  404. package/source/directives/oauth/Discovery.ts +7 -11
  405. package/source/directives/oauth/documents.ts +11 -14
  406. package/source/directives/octets/Context.ts +6 -3
  407. package/source/directives/octets/Delete.ts +33 -25
  408. package/source/directives/octets/Directive.ts +5 -1
  409. package/source/directives/octets/Get.ts +13 -21
  410. package/source/directives/octets/Octets.ts +20 -15
  411. package/source/directives/octets/Put.ts +62 -27
  412. package/source/directives/octets/Workflow.ts +18 -12
  413. package/source/directives/octets/bytes.ts +1 -1
  414. package/source/directives/octets/schemas.test.ts +8 -14
  415. package/source/directives/octets/workflows/Execution.ts +19 -21
  416. package/source/directives/octets/workflows/Workflow.ts +10 -7
  417. package/source/directives/require/Headers.ts +3 -4
  418. package/source/directives/require/Require.ts +3 -4
  419. package/source/exceptions.ts +19 -12
  420. package/source/index.ts +1 -1
  421. package/source/manifest.test.ts +4 -1
  422. package/source/manifest.ts +19 -13
  423. package/source/octets.d.ts +1 -1
  424. package/source/root.ts +3 -2
  425. package/source/schemas.test.ts +17 -3
  426. package/transpiled/Branch.js.map +1 -1
  427. package/transpiled/Composition.js.map +1 -1
  428. package/transpiled/Directive.js +6 -2
  429. package/transpiled/Directive.js.map +1 -1
  430. package/transpiled/Endpoint.d.ts +0 -2
  431. package/transpiled/Endpoint.js +11 -52
  432. package/transpiled/Endpoint.js.map +1 -1
  433. package/transpiled/Factory.d.ts +2 -1
  434. package/transpiled/Factory.js +1 -0
  435. package/transpiled/Factory.js.map +1 -1
  436. package/transpiled/Gateway.d.ts +2 -1
  437. package/transpiled/Gateway.js +24 -15
  438. package/transpiled/Gateway.js.map +1 -1
  439. package/transpiled/HTTP/Context.d.ts +0 -3
  440. package/transpiled/HTTP/Context.js +7 -9
  441. package/transpiled/HTTP/Context.js.map +1 -1
  442. package/transpiled/HTTP/Probe.js.map +1 -1
  443. package/transpiled/HTTP/Server.js +19 -4
  444. package/transpiled/HTTP/Server.js.map +1 -1
  445. package/transpiled/HTTP/Timing.d.ts +1 -2
  446. package/transpiled/HTTP/Timing.js +2 -10
  447. package/transpiled/HTTP/Timing.js.map +1 -1
  448. package/transpiled/HTTP/address.js.map +1 -1
  449. package/transpiled/HTTP/exceptions.js.map +1 -1
  450. package/transpiled/HTTP/formats/form.js.map +1 -1
  451. package/transpiled/HTTP/formats/json.js.map +1 -1
  452. package/transpiled/HTTP/formats/msgpack.js.map +1 -1
  453. package/transpiled/HTTP/formats/text.js.map +1 -1
  454. package/transpiled/HTTP/formats/yaml.js +4 -1
  455. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  456. package/transpiled/HTTP/messages.d.ts +3 -2
  457. package/transpiled/HTTP/messages.js +1 -43
  458. package/transpiled/HTTP/messages.js.map +1 -1
  459. package/transpiled/Interception.js.map +1 -1
  460. package/transpiled/Introspection.js +13 -2
  461. package/transpiled/Introspection.js.map +1 -1
  462. package/transpiled/MCP/Server.js +15 -4
  463. package/transpiled/MCP/Server.js.map +1 -1
  464. package/transpiled/MCP/discover.js.map +1 -1
  465. package/transpiled/MCP/errors.js.map +1 -1
  466. package/transpiled/MCP/schema.js +1 -1
  467. package/transpiled/MCP/schema.js.map +1 -1
  468. package/transpiled/MCP/tools.js +10 -7
  469. package/transpiled/MCP/tools.js.map +1 -1
  470. package/transpiled/Mapping.d.ts +2 -2
  471. package/transpiled/Mapping.js +3 -5
  472. package/transpiled/Mapping.js.map +1 -1
  473. package/transpiled/Query.d.ts +6 -2
  474. package/transpiled/Query.js +23 -8
  475. package/transpiled/Query.js.map +1 -1
  476. package/transpiled/RPC/Context.js +0 -7
  477. package/transpiled/RPC/Context.js.map +1 -1
  478. package/transpiled/RPC/Dispatcher.js +4 -1
  479. package/transpiled/RPC/Dispatcher.js.map +1 -1
  480. package/transpiled/RPC/errors.js.map +1 -1
  481. package/transpiled/RPC/names.js.map +1 -1
  482. package/transpiled/RTD/Directives.d.ts +1 -1
  483. package/transpiled/RTD/Method.js +1 -3
  484. package/transpiled/RTD/Method.js.map +1 -1
  485. package/transpiled/RTD/Node.js +5 -4
  486. package/transpiled/RTD/Node.js.map +1 -1
  487. package/transpiled/RTD/Route.js +4 -1
  488. package/transpiled/RTD/Route.js.map +1 -1
  489. package/transpiled/RTD/Tree.js +1 -1
  490. package/transpiled/RTD/Tree.js.map +1 -1
  491. package/transpiled/RTD/factory.js.map +1 -1
  492. package/transpiled/RTD/segment.js.map +1 -1
  493. package/transpiled/RTD/syntax/parse.js.map +1 -1
  494. package/transpiled/RTD/syntax/types.d.ts +6 -0
  495. package/transpiled/RTD/syntax/types.js +10 -1
  496. package/transpiled/RTD/syntax/types.js.map +1 -1
  497. package/transpiled/Remotes.js.map +1 -1
  498. package/transpiled/Tenant.d.ts +1 -1
  499. package/transpiled/Tenant.js.map +1 -1
  500. package/transpiled/deployment.d.ts +3 -0
  501. package/transpiled/deployment.js +6 -1
  502. package/transpiled/deployment.js.map +1 -1
  503. package/transpiled/directives/auth/Anonymous.js +1 -3
  504. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  505. package/transpiled/directives/auth/Anyone.js.map +1 -1
  506. package/transpiled/directives/auth/Assert.js.map +1 -1
  507. package/transpiled/directives/auth/Authorization.js +7 -3
  508. package/transpiled/directives/auth/Authorization.js.map +1 -1
  509. package/transpiled/directives/auth/Delegate.js.map +1 -1
  510. package/transpiled/directives/auth/Echo.js +1 -3
  511. package/transpiled/directives/auth/Echo.js.map +1 -1
  512. package/transpiled/directives/auth/Federation.js +3 -7
  513. package/transpiled/directives/auth/Federation.js.map +1 -1
  514. package/transpiled/directives/auth/Id.js.map +1 -1
  515. package/transpiled/directives/auth/Incept.js +1 -1
  516. package/transpiled/directives/auth/Incept.js.map +1 -1
  517. package/transpiled/directives/auth/Input.js.map +1 -1
  518. package/transpiled/directives/auth/Role.js.map +1 -1
  519. package/transpiled/directives/auth/Rule.js.map +1 -1
  520. package/transpiled/directives/auth/Scheme.js +1 -2
  521. package/transpiled/directives/auth/Scheme.js.map +1 -1
  522. package/transpiled/directives/auth/create.js.map +1 -1
  523. package/transpiled/directives/auth/schemes.js.map +1 -1
  524. package/transpiled/directives/auth/split.js.map +1 -1
  525. package/transpiled/directives/auth/types.d.ts +3 -1
  526. package/transpiled/directives/cache/Cache.js +28 -2
  527. package/transpiled/directives/cache/Cache.js.map +1 -1
  528. package/transpiled/directives/cache/Control.js +1 -1
  529. package/transpiled/directives/cache/Control.js.map +1 -1
  530. package/transpiled/directives/cache/etag.d.ts +10 -0
  531. package/transpiled/directives/cache/etag.js +30 -0
  532. package/transpiled/directives/cache/etag.js.map +1 -0
  533. package/transpiled/directives/cors/CORS.js.map +1 -1
  534. package/transpiled/directives/dev/Development.js.map +1 -1
  535. package/transpiled/directives/dev/Faulty.js.map +1 -1
  536. package/transpiled/directives/dev/Sleep.js.map +1 -1
  537. package/transpiled/directives/dev/Stub.js.map +1 -1
  538. package/transpiled/directives/dev/Throw.js.map +1 -1
  539. package/transpiled/directives/flow/Compose.js +7 -3
  540. package/transpiled/directives/flow/Compose.js.map +1 -1
  541. package/transpiled/directives/flow/Fetch.js.map +1 -1
  542. package/transpiled/directives/flow/Flow.js.map +1 -1
  543. package/transpiled/directives/index.js +11 -1
  544. package/transpiled/directives/index.js.map +1 -1
  545. package/transpiled/directives/io/IO.d.ts +1 -1
  546. package/transpiled/directives/io/IO.js.map +1 -1
  547. package/transpiled/directives/io/Input.js +1 -1
  548. package/transpiled/directives/io/Input.js.map +1 -1
  549. package/transpiled/directives/io/Output.js +3 -3
  550. package/transpiled/directives/io/Output.js.map +1 -1
  551. package/transpiled/directives/io/Status.js.map +1 -1
  552. package/transpiled/directives/io/Throttle.js +1 -1
  553. package/transpiled/directives/io/Throttle.js.map +1 -1
  554. package/transpiled/directives/io/lib/throttle/Configuration.js +8 -2
  555. package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -1
  556. package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -1
  557. package/transpiled/directives/io/lib/throttle/Quotas.js +4 -3
  558. package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
  559. package/transpiled/directives/io/lib/throttle/Sync.d.ts +1 -1
  560. package/transpiled/directives/io/lib/throttle/Sync.js.map +1 -1
  561. package/transpiled/directives/io/lib/throttle/Warning.js.map +1 -1
  562. package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -1
  563. package/transpiled/directives/io/lib/throttle/components/Identity.js.map +1 -1
  564. package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -1
  565. package/transpiled/directives/io/lib/throttle/components/Route.js.map +1 -1
  566. package/transpiled/directives/io/lib/throttle/components/Segment.js.map +1 -1
  567. package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -1
  568. package/transpiled/directives/map/Authority.js.map +1 -1
  569. package/transpiled/directives/map/Buffer.js.map +1 -1
  570. package/transpiled/directives/map/Claims.js.map +1 -1
  571. package/transpiled/directives/map/Headers.js.map +1 -1
  572. package/transpiled/directives/map/Language.js.map +1 -1
  573. package/transpiled/directives/map/Languages.js.map +1 -1
  574. package/transpiled/directives/map/Map.js.map +1 -1
  575. package/transpiled/directives/map/Mapping.js.map +1 -1
  576. package/transpiled/directives/map/Properties.js.map +1 -1
  577. package/transpiled/directives/map/Segments.js.map +1 -1
  578. package/transpiled/directives/mcp/MCP.js +1 -1
  579. package/transpiled/directives/mcp/MCP.js.map +1 -1
  580. package/transpiled/directives/mcp/Tool.js +3 -1
  581. package/transpiled/directives/mcp/Tool.js.map +1 -1
  582. package/transpiled/directives/oauth/Discovery.js.map +1 -1
  583. package/transpiled/directives/oauth/documents.js.map +1 -1
  584. package/transpiled/directives/octets/Context.js +1 -1
  585. package/transpiled/directives/octets/Context.js.map +1 -1
  586. package/transpiled/directives/octets/Delete.js.map +1 -1
  587. package/transpiled/directives/octets/Directive.js.map +1 -1
  588. package/transpiled/directives/octets/Get.js.map +1 -1
  589. package/transpiled/directives/octets/Octets.js +1 -1
  590. package/transpiled/directives/octets/Octets.js.map +1 -1
  591. package/transpiled/directives/octets/Put.js.map +1 -1
  592. package/transpiled/directives/octets/Workflow.js.map +1 -1
  593. package/transpiled/directives/octets/bytes.js.map +1 -1
  594. package/transpiled/directives/octets/workflows/Execution.js +1 -2
  595. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  596. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  597. package/transpiled/directives/require/Headers.js.map +1 -1
  598. package/transpiled/directives/require/Require.js.map +1 -1
  599. package/transpiled/exceptions.js.map +1 -1
  600. package/transpiled/index.d.ts +1 -1
  601. package/transpiled/index.js +1 -1
  602. package/transpiled/index.js.map +1 -1
  603. package/transpiled/manifest.js +5 -1
  604. package/transpiled/manifest.js.map +1 -1
  605. package/transpiled/root.js.map +1 -1
  606. package/tsconfig.tsbuildinfo +1 -1
  607. package/source/redact.test.ts +0 -27
  608. package/source/redact.ts +0 -21
  609. package/transpiled/redact.d.ts +0 -5
  610. package/transpiled/redact.js +0 -17
  611. package/transpiled/redact.js.map +0 -1
@@ -26,7 +26,15 @@ beforeEach(() => {
26
26
  it('should create remote', async () => {
27
27
  const remote = await remotes.discover(namespace, name)
28
28
 
29
- assert.ok(host.remote.mock.calls.some((call: any) => call.arguments.length === 2 && isPartial(call.arguments[0], { namespace, name }) && call.arguments[1] !== null && call.arguments[1] !== undefined))
29
+ assert.ok(
30
+ host.remote.mock.calls.some(
31
+ (call: any) =>
32
+ call.arguments.length === 2 &&
33
+ isPartial(call.arguments[0], { namespace, name }) &&
34
+ call.arguments[1] !== null &&
35
+ call.arguments[1] !== undefined
36
+ )
37
+ )
30
38
 
31
39
  assert.deepStrictEqual(remote, await host.remote.mock.calls[0].result)
32
40
  })
@@ -38,16 +46,29 @@ it('should be instance of Connector', async () => {
38
46
  it('should depend on created remotes', async () => {
39
47
  const remote = await remotes.discover(namespace, name)
40
48
 
41
- assert.ok(remote.link.mock.calls.some((call: any) => call.arguments.length === 1 && isDeepStrictEqual(call.arguments[0], remotes)))
49
+ assert.ok(
50
+ remote.link.mock.calls.some(
51
+ (call: any) =>
52
+ call.arguments.length === 1 && isDeepStrictEqual(call.arguments[0], remotes)
53
+ )
54
+ )
42
55
  })
43
56
 
44
57
  it('should attribute calls to the gateway', async () => {
45
58
  await remotes.discover(namespace, name)
46
59
 
47
- assert.ok(host.remote.mock.calls.some((call: any) => call.arguments.length === 2 && call.arguments[0] !== null && call.arguments[0] !== undefined && isDeepStrictEqual(call.arguments[1], { service: 'exposition' })))
60
+ assert.ok(
61
+ host.remote.mock.calls.some(
62
+ (call: any) =>
63
+ call.arguments.length === 2 &&
64
+ call.arguments[0] !== null &&
65
+ call.arguments[0] !== undefined &&
66
+ isDeepStrictEqual(call.arguments[1], { service: 'exposition' })
67
+ )
68
+ )
48
69
  })
49
70
 
50
- function isPartial (actual, expected) {
71
+ function isPartial(actual, expected) {
51
72
  try {
52
73
  assert.partialDeepStrictEqual(actual, expected)
53
74
 
package/source/Remotes.ts CHANGED
@@ -1,16 +1,21 @@
1
- import { Locator, Connector, type Remote, type Source } from '@toa.io/core'
1
+ import { Locator, Connector, type Remote } from '@toa.io/core'
2
+ import type { Source } from '@toa.io/core/types'
2
3
  import { type Host } from './Factory.js'
3
4
 
4
5
  export class Remotes extends Connector {
5
6
  private readonly host: Host
6
7
  private readonly cache: Record<string, Promise<Remote>> = {}
7
8
 
8
- public constructor (host: Host) {
9
+ public constructor(host: Host) {
9
10
  super()
10
11
  this.host = host
11
12
  }
12
13
 
13
- public async discover (namespace: string, name: string, version: string = 'local'): Promise<Remote> {
14
+ public async discover(
15
+ namespace: string,
16
+ name: string,
17
+ version: string = 'local'
18
+ ): Promise<Remote> {
14
19
  const locator = new Locator(name, namespace)
15
20
  const key = locator.id + ':' + version
16
21
 
@@ -19,7 +24,7 @@ export class Remotes extends Connector {
19
24
  return this.cache[key]
20
25
  }
21
26
 
22
- private async locate (locator: Locator): Promise<Remote> {
27
+ private async locate(locator: Locator): Promise<Remote> {
23
28
  // the gateway is the origin of every call it forwards
24
29
  const remote = await this.host.remote(locator, SOURCE)
25
30
 
package/source/Tenant.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { setTimeout } from 'node:timers/promises'
2
2
  import { Connector } from '@toa.io/core'
3
3
  import { BRANCH_TTL } from './const.js'
4
- import type { bindings } from '@toa.io/core'
4
+ import type { bindings } from '@toa.io/core/types'
5
5
  import type { Label } from './discovery.js'
6
6
  import type { Branch } from './Branch.js'
7
7
 
@@ -11,7 +11,7 @@ export class Tenant extends Connector {
11
11
  private started = 0
12
12
  private stopped = false
13
13
 
14
- public constructor (broadcast: Broadcast, branch: Omit<Branch, 'timestamp'>) {
14
+ public constructor(broadcast: Broadcast, branch: Omit<Branch, 'timestamp'>) {
15
15
  super()
16
16
 
17
17
  this.broadcast = broadcast
@@ -20,7 +20,7 @@ export class Tenant extends Connector {
20
20
  this.depends(broadcast)
21
21
  }
22
22
 
23
- public override async open (): Promise<void> {
23
+ public override async open(): Promise<void> {
24
24
  this.started = Date.now()
25
25
 
26
26
  await this.expose()
@@ -35,35 +35,35 @@ export class Tenant extends Connector {
35
35
  * announces itself once more has its routes held open by whoever is listening, and the
36
36
  * requests that follow reach nothing.
37
37
  */
38
- protected override async close (): Promise<void> {
38
+ protected override async close(): Promise<void> {
39
39
  this.stopped = true
40
40
  }
41
41
 
42
- private async announce (): Promise<void> {
42
+ private async announce(): Promise<void> {
43
43
  while (!this.stopped) {
44
44
  const delay = exposeInterval(Date.now() - this.started)
45
45
 
46
46
  await setTimeout(delay, undefined, { ref: false })
47
47
 
48
- if (this.stopped)
49
- break
48
+ if (this.stopped) break
50
49
 
51
50
  await this.expose()
52
51
  }
53
52
  }
54
53
 
55
- private async expose (): Promise<void> {
54
+ private async expose(): Promise<void> {
56
55
  // the ping subscription outlives the announcing loop, and answering one on the way out
57
56
  // is the same announcement by another route
58
- if (this.stopped)
59
- return
57
+ if (this.stopped) return
60
58
 
61
59
  await this.broadcast.transmit('expose', { ...this.branch, timestamp: this.started })
62
60
  }
63
61
  }
64
62
 
65
- function exposeInterval (uptime: number): number {
66
- return Math.round(EXPOSE_MAX - (EXPOSE_MAX - EXPOSE_MIN) * Math.exp(-uptime / EXPOSE_TAU))
63
+ function exposeInterval(uptime: number): number {
64
+ return Math.round(
65
+ EXPOSE_MAX - (EXPOSE_MAX - EXPOSE_MIN) * Math.exp(-uptime / EXPOSE_TAU)
66
+ )
67
67
  }
68
68
 
69
69
  const EXPOSE_MIN = 5_000
@@ -8,7 +8,11 @@ import { components } from './Composition.js'
8
8
  import { parse } from './RTD/syntax/index.js'
9
9
  import { DELAY, PORT, PROBE } from './HTTP/index.js'
10
10
 
11
- export function deployment (_: unknown, annotation?: Annotation): Dependency {
11
+ /** Where Toa's release publishes this service's image. An application takes it
12
+ * instead of building one when its context says `registry.services: published`. */
13
+ export const image = 'ghcr.io/toa-io/extension-exposition-gateway'
14
+
15
+ export function deployment(_: unknown, annotation?: Annotation): Dependency {
12
16
  assert.ok(annotation !== undefined, 'Exposition context annotation is required')
13
17
  schemas.annotation.validate(annotation)
14
18
 
@@ -17,8 +21,10 @@ export function deployment (_: unknown, annotation?: Annotation): Dependency {
17
21
  const service: Service = {
18
22
  group: 'exposition',
19
23
  name: 'gateway',
24
+ image,
20
25
  port: PORT,
21
- version: JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version,
26
+ version: JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'))
27
+ .version,
22
28
  variables: [],
23
29
  components: labels,
24
30
  resources: annotation.resources,
@@ -44,8 +50,7 @@ export function deployment (_: unknown, annotation?: Annotation): Dependency {
44
50
  service.ingress!.hosts = Object.values(authorities)
45
51
 
46
52
  // leaving these undefined lets the context's own ingress section supply them
47
- if (annotation.class !== undefined)
48
- service.ingress!.class = annotation.class
53
+ if (annotation.class !== undefined) service.ingress!.class = annotation.class
49
54
 
50
55
  if (annotation.annotations !== undefined)
51
56
  service.ingress!.annotations = annotation.annotations
@@ -55,26 +60,19 @@ export function deployment (_: unknown, annotation?: Annotation): Dependency {
55
60
 
56
61
  const properties: Properties = { authorities }
57
62
 
58
- if (debug === true)
59
- properties.debug = true
63
+ if (debug === true) properties.debug = true
60
64
 
61
- if (annotation.protocol !== undefined)
62
- properties.protocol = annotation.protocol
65
+ if (annotation.protocol !== undefined) properties.protocol = annotation.protocol
63
66
 
64
- if (annotation.ip !== undefined)
65
- properties.ip = annotation.ip
67
+ if (annotation.ip !== undefined) properties.ip = annotation.ip
66
68
 
67
- if (annotation.bouncer !== undefined)
68
- properties.bouncer = annotation.bouncer
69
+ if (annotation.bouncer !== undefined) properties.bouncer = annotation.bouncer
69
70
 
70
- if (annotation.oauth !== undefined)
71
- properties.oauth = annotation.oauth
71
+ if (annotation.oauth !== undefined) properties.oauth = annotation.oauth
72
72
 
73
- if (annotation.rpc !== undefined)
74
- properties.rpc = annotation.rpc
73
+ if (annotation.rpc !== undefined) properties.rpc = annotation.rpc
75
74
 
76
- if (annotation.mcp !== undefined)
77
- properties.mcp = annotation.mcp
75
+ if (annotation.mcp !== undefined) properties.mcp = annotation.mcp
78
76
 
79
77
  service.variables!.push({
80
78
  name: 'TOA_EXPOSITION_PROPERTIES',
@@ -92,5 +90,7 @@ export function deployment (_: unknown, annotation?: Annotation): Dependency {
92
90
  return { services: [service] }
93
91
  }
94
92
 
95
- type Properties = Pick<Annotation,
96
- 'authorities' | 'debug' | 'protocol' | 'bouncer' | 'ip' | 'oauth' | 'rpc' | 'mcp'>
93
+ type Properties = Pick<
94
+ Annotation,
95
+ 'authorities' | 'debug' | 'protocol' | 'bouncer' | 'ip' | 'oauth' | 'rpc' | 'mcp'
96
+ >
@@ -14,7 +14,10 @@ describe('anonymous', () => {
14
14
 
15
15
  it('should refuse a request that presents a credential', () => {
16
16
  // it would make the reply uncacheable, which is the whole of the rule
17
- assert.equal(new Anonymous(true).authorize(null, context({ authorization: 'Token x' })), false)
17
+ assert.equal(
18
+ new Anonymous(true).authorize(null, context({ authorization: 'Token x' })),
19
+ false
20
+ )
18
21
  })
19
22
 
20
23
  it('should admit a procedure whatever the request presented', () => {
@@ -33,6 +36,9 @@ describe('anonymous', () => {
33
36
  const directive = new Anonymous(true)
34
37
 
35
38
  assert.equal(directive.admits(null, context({ authorization: 'Token x' })), false)
36
- assert.equal(directive.admits(null, context({ authorization: 'Token x' }, true)), true)
39
+ assert.equal(
40
+ directive.admits(null, context({ authorization: 'Token x' }, true)),
41
+ true
42
+ )
37
43
  })
38
44
  })
@@ -3,7 +3,7 @@ import { type Directive, type Context } from './types.js'
3
3
  export class Anonymous implements Directive {
4
4
  private readonly allow: boolean
5
5
 
6
- public constructor (allow: boolean) {
6
+ public constructor(allow: boolean) {
7
7
  this.allow = allow
8
8
  }
9
9
 
@@ -12,16 +12,13 @@ export class Anonymous implements Directive {
12
12
  * of the rule, and none of it applies to a procedure: what a procedure answers is a value
13
13
  * in an envelope, and the envelope is the one thing that is cached or not.
14
14
  */
15
- public authorize (_: any, context: Context): boolean {
16
- if (context.procedural)
17
- return this.allow
15
+ public authorize(_: any, context: Context): boolean {
16
+ if (context.procedural) return this.allow
18
17
 
19
- return 'authorization' in context.request.headers
20
- ? false
21
- : this.allow
18
+ return 'authorization' in context.request.headers ? false : this.allow
22
19
  }
23
20
 
24
- public admits (_: any, context: Context): boolean {
21
+ public admits(_: any, context: Context): boolean {
25
22
  return this.authorize(_, context)
26
23
  }
27
24
  }
@@ -3,15 +3,15 @@ import { type Directive, type Context } from './types.js'
3
3
  export class Anyone implements Directive {
4
4
  private readonly allow: boolean
5
5
 
6
- public constructor (allow: boolean) {
6
+ public constructor(allow: boolean) {
7
7
  this.allow = allow
8
8
  }
9
9
 
10
- public authorize (_: any, context: Context): boolean {
10
+ public authorize(_: any, context: Context): boolean {
11
11
  return context.identity !== null && this.allow
12
12
  }
13
13
 
14
- public admits (_: any, context: Context): boolean {
14
+ public admits(_: any, context: Context): boolean {
15
15
  return this.authorize(_, context)
16
16
  }
17
17
  }
@@ -7,26 +7,26 @@ import type { Context, Directive, Identity } from './types.js'
7
7
  export class Assert implements Directive {
8
8
  private readonly disabled: boolean
9
9
 
10
- public constructor (enabled: boolean) {
11
- assert.ok(typeof enabled === 'boolean', '`auth:assert` directive value must be a boolean')
10
+ public constructor(enabled: boolean) {
11
+ assert.ok(
12
+ typeof enabled === 'boolean',
13
+ '`auth:assert` directive value must be a boolean'
14
+ )
12
15
 
13
16
  this.disabled = !enabled
14
17
  }
15
18
 
16
- public async authorize (identity: Identity | null, context: Context): Promise<boolean> {
17
- if (!this.disabled)
18
- await this.incept(context, identity)
19
+ public async authorize(identity: Identity | null, context: Context): Promise<boolean> {
20
+ if (!this.disabled) await this.incept(context, identity)
19
21
 
20
22
  return false
21
23
  }
22
24
 
23
- private async incept (context: Context, identity: Identity | null): Promise<void> {
24
- if (context.request.headers.authorization === undefined)
25
- throw new http.Unauthorized()
25
+ private async incept(context: Context, identity: Identity | null): Promise<void> {
26
+ if (context.request.headers.authorization === undefined) throw new http.Unauthorized()
26
27
 
27
28
  if (identity === null) {
28
- if (!Incept.acceptable(context))
29
- throw new http.Unauthorized()
29
+ if (!Incept.acceptable(context)) throw new http.Unauthorized()
30
30
 
31
31
  context.identity = await Incept.incept(context, newid())
32
32
 
@@ -52,7 +52,7 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
52
52
  private meter: Quotas | null = null
53
53
  private sync: Sync | null = null
54
54
 
55
- public mount (host: Host, options: http.Options): void {
55
+ public mount(host: Host, options: http.Options): void {
56
56
  this.sync?.dispose()
57
57
  this.sync = null
58
58
  this.meter = null
@@ -60,8 +60,7 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
60
60
  const bouncer = options.bouncer
61
61
 
62
62
  // keyed by address, which is the deployment's to name, so off until it is set
63
- if (bouncer === undefined)
64
- return
63
+ if (bouncer === undefined) return
65
64
 
66
65
  this.meter = new Quotas({
67
66
  keys: Keys.create([{ method: 'ip', options: BOUNCER }]),
@@ -75,29 +74,35 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
75
74
  this.sync.register(this.meter)
76
75
  }
77
76
 
78
- public dispose (): void {
77
+ public dispose(): void {
79
78
  this.sync?.dispose()
80
79
  }
81
80
 
82
- public create (name: string, value: any, remotes: Remotes): Directive {
83
- assert.ok(name in constructors,
84
- `Directive 'auth:${name}' is not implemented`)
81
+ public create(name: string, value: any, remotes: Remotes): Directive {
82
+ assert.ok(name in constructors, `Directive 'auth:${name}' is not implemented`)
85
83
 
86
84
  const Class = constructors[name]
87
85
 
88
86
  for (const name of REMOTES)
89
87
  this.discovery[name] ??= remotes.discover('identity', name)
90
88
 
91
- return match(Class,
92
- Role, () => new Role(value as string | string[], this.discovery.roles),
93
- Rule, () => new Rule(value as Record<string, string>, this.create.bind(this)),
94
- Input, () => new Input(value as Declaration[], this.create.bind(this)),
95
- Incept, () => new Incept(value as string, this.discovery),
96
- Delegate, () => new Delegate(value as string, this.discovery.roles),
97
- () => new Class(value))
89
+ return match(
90
+ Class,
91
+ Role,
92
+ () => new Role(value as string | string[], this.discovery.roles),
93
+ Rule,
94
+ () => new Rule(value as Record<string, string>, this.create.bind(this)),
95
+ Input,
96
+ () => new Input(value as Declaration[], this.create.bind(this)),
97
+ Incept,
98
+ () => new Incept(value as string, this.discovery),
99
+ Delegate,
100
+ () => new Delegate(value as string, this.discovery.roles),
101
+ () => new Class(value)
102
+ )
98
103
  }
99
104
 
100
- public arrange (directives: Directive[]): void {
105
+ public arrange(directives: Directive[]): void {
101
106
  directives.sort((a, b) => (a.priority ?? 1) - (b.priority ?? 1))
102
107
  }
103
108
 
@@ -105,28 +110,26 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
105
110
  * Authentication: who the credential names, if one is presented. A credential belongs to
106
111
  * the request, so it is read once however many calls the request carries.
107
112
  */
108
- public async preflight (context: Context): Promise<void> {
113
+ public async preflight(context: Context): Promise<void> {
109
114
  context.identity = await this.resolve(context)
110
115
  }
111
116
 
112
117
  /** Authorization: whether that identity may make this call, which every call asks anew. */
113
- public async precall (directives: Directive[],
118
+ public async precall(
119
+ directives: Directive[],
114
120
  context: Context,
115
- parameters: Parameter[]): Promise<Output> {
121
+ parameters: Parameter[]
122
+ ): Promise<Output> {
116
123
  for (const directive of directives) {
117
124
  const allow = await directive.authorize(context.identity, context, parameters)
118
125
 
119
126
  if (allow)
120
- if (this.permitted(context))
121
- return directive.reply?.(context) ?? null
122
- else
123
- throw new http.Forbidden()
127
+ if (this.permitted(context)) return directive.reply?.(context) ?? null
128
+ else throw new http.Forbidden()
124
129
  }
125
130
 
126
- if (context.identity === null)
127
- throw new http.Unauthorized()
128
- else
129
- throw new http.Forbidden()
131
+ if (context.identity === null) throw new http.Unauthorized()
132
+ else throw new http.Forbidden()
130
133
  }
131
134
 
132
135
  /**
@@ -142,8 +145,11 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
142
145
  * admission is a disjunction and stops at the first that admits, while what the directives
143
146
  * fill is not any one of them's to state alone.
144
147
  */
145
- public async explain (directives: Directive[], context: Context,
146
- introspection: Introspection): Promise<Introspection | null> {
148
+ public async explain(
149
+ directives: Directive[],
150
+ context: Context,
151
+ introspection: Introspection
152
+ ): Promise<Introspection | null> {
147
153
  let untold = false
148
154
  let admitted = false
149
155
 
@@ -163,8 +169,7 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
163
169
  }
164
170
  }
165
171
 
166
- if (!admitted && !untold)
167
- return null
172
+ if (!admitted && !untold) return null
168
173
 
169
174
  // whichever of them admitted, a property any of them fills from the identity is filled
170
175
  // from the identity: what a caller sent there would be overwritten or forged
@@ -174,35 +179,36 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
174
179
  return introspection
175
180
  }
176
181
 
177
- public async settle (directives: Directive[],
182
+ public async settle(
183
+ directives: Directive[],
178
184
  context: Context,
179
- response: http.OutgoingMessage): Promise<void> {
180
- await Promise.all(directives.map(async (directive) =>
181
- directive.settle?.(context, response)))
185
+ response: http.OutgoingMessage
186
+ ): Promise<void> {
187
+ await Promise.all(
188
+ directives.map(async (directive) => directive.settle?.(context, response))
189
+ )
182
190
  }
183
191
 
184
192
  /**
185
193
  * Re-issuing a credential, and refusing a ban, are the request's business: the header
186
194
  * carries one token however many calls were made, and a ban refuses all of them.
187
195
  */
188
- public async depart (context: Context, response: http.OutgoingMessage): Promise<void> {
196
+ public async depart(context: Context, response: http.OutgoingMessage): Promise<void> {
189
197
  const identity = context.identity
190
198
 
191
- if (identity === null)
192
- return
199
+ if (identity === null) return
193
200
 
194
- if (identity.provider === PRIMARY && !identity.refresh)
195
- return
201
+ if (identity.provider === PRIMARY && !identity.refresh) return
196
202
 
197
- if (await this.banned(identity))
203
+ // resolving already asked, for any provider but the primary
204
+ if (context.vetted !== true && (await this.banned(identity)))
198
205
  throw new http.Unauthorized()
199
206
 
200
207
  // a token carries the roles it was issued with, and the refresh is where they are read again;
201
208
  // any other scheme has just read them, unless a Role directive already did
202
209
  if (identity.provider === PRIMARY)
203
210
  identity.roles = await Role.get(identity, this.discovery.roles)
204
- else
205
- identity.roles ??= await Role.get(identity, this.discovery.roles)
211
+ else identity.roles ??= await Role.get(identity, this.discovery.roles)
206
212
  this.tokens ??= await this.discovery.tokens
207
213
 
208
214
  const token = await this.tokens.invoke<string>('encrypt', {
@@ -216,17 +222,15 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
216
222
  response.headers.set('cache-control', 'no-store')
217
223
  }
218
224
 
219
- private async resolve (context: Context): Promise<Identity | null> {
225
+ private async resolve(context: Context): Promise<Identity | null> {
220
226
  const { authority } = context
221
227
  const { authorization } = context.request.headers
222
228
 
223
- if (authorization === undefined)
224
- return null
229
+ if (authorization === undefined) return null
225
230
 
226
231
  const retry = this.meter?.check(context, NONE) ?? 0
227
232
 
228
- if (retry > 0)
229
- throw new http.TooManyRequests(retry)
233
+ if (retry > 0) throw new http.TooManyRequests(retry)
230
234
 
231
235
  const [scheme, credentials] = split(authorization)
232
236
  const candidates = providersOf(scheme)
@@ -242,16 +246,18 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
242
246
  for (const candidate of candidates) {
243
247
  this.components[candidate] ??= await this.discovery[candidate]
244
248
 
245
- const answer = await this.components[candidate]!.invoke<AuthenticationResult>('authenticate', {
246
- input: {
247
- scheme,
248
- authority,
249
- credentials
249
+ const answer = await this.components[candidate]!.invoke<AuthenticationResult>(
250
+ 'authenticate',
251
+ {
252
+ input: {
253
+ scheme,
254
+ authority,
255
+ credentials
256
+ }
250
257
  }
251
- })
258
+ )
252
259
 
253
- if (declined(answer))
254
- continue
260
+ if (declined(answer)) continue
255
261
 
256
262
  provider = candidate
257
263
  result = answer
@@ -275,7 +281,11 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
275
281
 
276
282
  const identity = result.identity
277
283
 
278
- if (provider !== PRIMARY && (await this.banned(identity))) throw new http.Unauthorized()
284
+ if (provider !== PRIMARY) {
285
+ if (await this.banned(identity)) throw new http.Unauthorized()
286
+
287
+ context.vetted = true
288
+ }
279
289
 
280
290
  identity.scheme = scheme
281
291
  identity.provider = provider!
@@ -284,17 +294,16 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
284
294
  return identity
285
295
  }
286
296
 
287
- private permitted (context: Context): boolean {
297
+ private permitted(context: Context): boolean {
288
298
  const permissions = context.identity?.permissions
289
299
 
290
- if (permissions === undefined)
291
- return true
300
+ if (permissions === undefined) return true
292
301
 
293
302
  // the route is matched on the normalized path, so the permission is too
294
303
  return permits(permissions, context.request.method, context.url.pathname)
295
304
  }
296
305
 
297
- private async banned (identity: Identity): Promise<boolean> {
306
+ private async banned(identity: Identity): Promise<boolean> {
298
307
  this.bans ??= await this.discovery.bans
299
308
 
300
309
  const ban = await this.bans.invoke<Ban>('observe', { query: { id: identity.id } })
@@ -304,21 +313,27 @@ export class Authorization implements DirectiveFamily<Directive, Extension> {
304
313
  }
305
314
 
306
315
  /** Whether a provider says the credentials are not of its kind, so the next is asked. */
307
- function declined (result: AuthenticationResult): boolean {
316
+ function declined(result: AuthenticationResult): boolean {
308
317
  return result instanceof Error && codeOf(result) === UNRECOGNIZED
309
318
  }
310
319
 
311
- function codeOf (result: Error): string | undefined {
320
+ function codeOf(result: Error): string | undefined {
312
321
  const code: string | unknown = (result as unknown as { code: string }).code
313
322
 
314
323
  return typeof code === 'string' ? code : undefined
315
324
  }
316
325
 
317
326
  /** Whether the permissions admit the method on the path the request is routed by. */
318
- export function permits (permissions: Record<string, string[]>, method: string, pathname: string): boolean {
319
- return Object.entries(permissions).some(([pattern, methods]) =>
320
- methods.some((allowed) => allowed === '*' || allowed === method) &&
321
- glob(pattern).match(pathname))
327
+ export function permits(
328
+ permissions: Record<string, string[]>,
329
+ method: string,
330
+ pathname: string
331
+ ): boolean {
332
+ return Object.entries(permissions).some(
333
+ ([pattern, methods]) =>
334
+ methods.some((allowed) => allowed === '*' || allowed === method) &&
335
+ glob(pattern).match(pathname)
336
+ )
322
337
  }
323
338
 
324
339
  /**
@@ -326,12 +341,11 @@ export function permits (permissions: Record<string, string[]>, method: string,
326
341
  * matched on every request the identity makes. Patterns arrive with an identity, hence
327
342
  * the bound.
328
343
  */
329
- function glob (pattern: string): Minimatch {
344
+ function glob(pattern: string): Minimatch {
330
345
  let compiled = GLOBS.get(pattern)
331
346
 
332
347
  if (compiled === undefined) {
333
- if (GLOBS.size >= GLOBS_LIMIT)
334
- GLOBS.clear()
348
+ if (GLOBS.size >= GLOBS_LIMIT) GLOBS.clear()
335
349
 
336
350
  compiled = new Minimatch(pattern)
337
351
 
@@ -4,7 +4,7 @@ import { Delegate } from './Delegate.js'
4
4
  import type { Introspection } from '../../Introspection.js'
5
5
 
6
6
  describe('auth:delegate', () => {
7
- function explanation (): Introspection {
7
+ function explanation(): Introspection {
8
8
  return {
9
9
  input: {
10
10
  type: 'object',
@@ -20,7 +20,7 @@ describe('auth:delegate', () => {
20
20
  it('should take the property it embeds out of the input', () => {
21
21
  const delegate = new Delegate('identity', null as never)
22
22
  const described = delegate.describe(explanation())
23
- const input = described.input as { properties: object, required: string[] }
23
+ const input = described.input as { properties: object; required: string[] }
24
24
 
25
25
  assert.deepStrictEqual(Object.keys(input.properties), ['title'])
26
26
  assert.deepStrictEqual(input.required, ['title'])