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

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 (620) hide show
  1. package/components/exposition.octets/operations/delete.js +1 -1
  2. package/components/exposition.octets/operations/get.js +5 -2
  3. package/components/exposition.octets/operations/head.js +1 -1
  4. package/components/exposition.octets/operations/put.js +29 -37
  5. package/components/exposition.octets/types/toa.d.ts +1 -1
  6. package/components/identity.bans/manifest.toa.yaml +12 -13
  7. package/components/identity.bans/migrations/0001-system-properties.yaml +14 -0
  8. package/components/identity.bans/operations/transit.js +1 -1
  9. package/components/identity.bans/source/transit.ts +1 -1
  10. package/components/identity.bans/tsconfig.tsbuildinfo +1 -1
  11. package/components/identity.bans/types/toa.d.ts +5 -5
  12. package/components/identity.basic/events/principal.js +3 -1
  13. package/components/identity.basic/manifest.toa.yaml +17 -23
  14. package/components/identity.basic/migrations/0001-system-properties.yaml +14 -0
  15. package/components/identity.basic/migrations/0002-indexes.yaml +13 -0
  16. package/components/identity.basic/operations/add.js +1 -1
  17. package/components/identity.basic/operations/authenticate.js +2 -2
  18. package/components/identity.basic/operations/check.js +4 -2
  19. package/components/identity.basic/operations/delete.js +1 -1
  20. package/components/identity.basic/operations/incept.js +1 -1
  21. package/components/identity.basic/operations/info.js +1 -1
  22. package/components/identity.basic/operations/lib/credentials.js +1 -1
  23. package/components/identity.basic/operations/transit.js +7 -8
  24. package/components/identity.basic/source/add.ts +5 -2
  25. package/components/identity.basic/source/authenticate.ts +11 -13
  26. package/components/identity.basic/source/check.ts +9 -6
  27. package/components/identity.basic/source/delete.ts +4 -1
  28. package/components/identity.basic/source/incept.ts +13 -10
  29. package/components/identity.basic/source/info.ts +4 -1
  30. package/components/identity.basic/source/lib/credentials.ts +2 -3
  31. package/components/identity.basic/source/transit.ts +27 -21
  32. package/components/identity.basic/tsconfig.tsbuildinfo +1 -1
  33. package/components/identity.basic/types/index.d.ts +7 -3
  34. package/components/identity.basic/types/toa.d.ts +5 -5
  35. package/components/identity.clients/manifest.toa.yaml +36 -40
  36. package/components/identity.clients/migrations/0001-system-properties.yaml +14 -0
  37. package/components/identity.clients/migrations/0002-indexes.yaml +4 -0
  38. package/components/identity.clients/operations/describe.js +1 -1
  39. package/components/identity.clients/operations/lib/canonical.js +1 -1
  40. package/components/identity.clients/operations/lib/cimd.js +3 -2
  41. package/components/identity.clients/operations/lib/redirect.js +7 -4
  42. package/components/identity.clients/operations/register.js +2 -2
  43. package/components/identity.clients/source/describe.ts +6 -8
  44. package/components/identity.clients/source/lib/Context.ts +6 -3
  45. package/components/identity.clients/source/lib/Entity.ts +1 -1
  46. package/components/identity.clients/source/lib/canonical.ts +1 -1
  47. package/components/identity.clients/source/lib/cimd.test.ts +8 -6
  48. package/components/identity.clients/source/lib/cimd.ts +24 -19
  49. package/components/identity.clients/source/lib/redirect.test.ts +8 -2
  50. package/components/identity.clients/source/lib/redirect.ts +12 -8
  51. package/components/identity.clients/source/register.ts +18 -18
  52. package/components/identity.clients/tsconfig.tsbuildinfo +1 -1
  53. package/components/identity.clients/types/toa.d.ts +5 -5
  54. package/components/identity.credentials/manifest.toa.yaml +4 -4
  55. package/components/identity.credentials/operations/list.js +8 -4
  56. package/components/identity.credentials/source/list.test.ts +39 -20
  57. package/components/identity.credentials/source/list.ts +12 -8
  58. package/components/identity.credentials/tsconfig.tsbuildinfo +1 -1
  59. package/components/identity.credentials/types/toa.d.ts +2 -2
  60. package/components/identity.federation/manifest.toa.yaml +23 -32
  61. package/components/identity.federation/migrations/0001-system-properties.yaml +14 -0
  62. package/components/identity.federation/migrations/0002-indexes.yaml +25 -0
  63. package/components/identity.federation/operations/authenticate.js +4 -2
  64. package/components/identity.federation/operations/create.js +2 -2
  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 +1 -1
  68. package/components/identity.federation/operations/lib/decode.js +1 -1
  69. package/components/identity.federation/operations/lib/discovery.js +2 -2
  70. package/components/identity.federation/operations/lib/exchange.js +8 -4
  71. package/components/identity.federation/operations/lib/principal.js +1 -1
  72. package/components/identity.federation/operations/lib/resolve.js +1 -1
  73. package/components/identity.federation/operations/list.js +2 -2
  74. package/components/identity.federation/source/authenticate.ts +19 -17
  75. package/components/identity.federation/source/create.ts +6 -7
  76. package/components/identity.federation/source/decode.ts +4 -1
  77. package/components/identity.federation/source/delete.ts +4 -1
  78. package/components/identity.federation/source/incept.ts +2 -3
  79. package/components/identity.federation/source/lib/decode.ts +4 -7
  80. package/components/identity.federation/source/lib/discovery.test.ts +15 -5
  81. package/components/identity.federation/source/lib/discovery.ts +10 -9
  82. package/components/identity.federation/source/lib/exchange.ts +18 -15
  83. package/components/identity.federation/source/lib/jose.d.ts +1 -1
  84. package/components/identity.federation/source/lib/principal.ts +5 -3
  85. package/components/identity.federation/source/lib/resolve.ts +5 -1
  86. package/components/identity.federation/source/list.test.ts +26 -10
  87. package/components/identity.federation/source/list.ts +5 -2
  88. package/components/identity.federation/source/types/context.ts +5 -2
  89. package/components/identity.federation/source/types/entity.ts +2 -2
  90. package/components/identity.federation/tsconfig.tsbuildinfo +1 -1
  91. package/components/identity.federation/types/toa.d.ts +5 -5
  92. package/components/identity.grants/manifest.toa.yaml +27 -31
  93. package/components/identity.grants/migrations/0001-system-properties.yaml +14 -0
  94. package/components/identity.grants/migrations/0002-indexes.yaml +5 -0
  95. package/components/identity.grants/operations/authorize.js +1 -1
  96. package/components/identity.grants/operations/exchange.js +5 -2
  97. package/components/identity.grants/operations/lib/code.js +1 -1
  98. package/components/identity.grants/operations/lib/identify.js +1 -1
  99. package/components/identity.grants/operations/list.js +1 -1
  100. package/components/identity.grants/operations/revoke.js +3 -2
  101. package/components/identity.grants/source/authorize.ts +27 -19
  102. package/components/identity.grants/source/exchange.ts +15 -11
  103. package/components/identity.grants/source/lib/code.ts +20 -8
  104. package/components/identity.grants/source/lib/identify.ts +1 -1
  105. package/components/identity.grants/source/list.ts +2 -2
  106. package/components/identity.grants/source/revoke.ts +9 -7
  107. package/components/identity.grants/tsconfig.tsbuildinfo +1 -1
  108. package/components/identity.grants/types/index.d.ts +3 -3
  109. package/components/identity.grants/types/toa.d.ts +5 -5
  110. package/components/identity.keys/manifest.toa.yaml +18 -23
  111. package/components/identity.keys/migrations/0001-system-properties.yaml +14 -0
  112. package/components/identity.keys/migrations/0002-indexes.yaml +4 -0
  113. package/components/identity.keys/operations/create.js +1 -1
  114. package/components/identity.keys/operations/disable.js +1 -1
  115. package/components/identity.keys/operations/revoke.js +1 -1
  116. package/components/identity.keys/source/create.ts +2 -3
  117. package/components/identity.keys/source/disable.ts +1 -1
  118. package/components/identity.keys/source/revoke.ts +2 -2
  119. package/components/identity.keys/tsconfig.tsbuildinfo +1 -1
  120. package/components/identity.keys/types/toa.d.ts +5 -5
  121. package/components/identity.otp/manifest.toa.yaml +16 -24
  122. package/components/identity.otp/migrations/0001-system-properties.yaml +14 -0
  123. package/components/identity.otp/migrations/0002-indexes.yaml +5 -0
  124. package/components/identity.otp/operations/authenticate.js +1 -1
  125. package/components/identity.otp/operations/issue.js +1 -1
  126. package/components/identity.otp/source/authenticate.ts +4 -7
  127. package/components/identity.otp/source/issue.ts +1 -1
  128. package/components/identity.otp/source/lib/Context.ts +1 -1
  129. package/components/identity.otp/tsconfig.tsbuildinfo +1 -1
  130. package/components/identity.otp/types/toa.d.ts +5 -5
  131. package/components/identity.passkeys/manifest.toa.yaml +45 -53
  132. package/components/identity.passkeys/migrations/0001-system-properties.yaml +14 -0
  133. package/components/identity.passkeys/migrations/0002-indexes.yaml +11 -0
  134. package/components/identity.passkeys/operations/authenticate.js +1 -1
  135. package/components/identity.passkeys/operations/challenge.js +6 -3
  136. package/components/identity.passkeys/operations/create.js +1 -1
  137. package/components/identity.passkeys/operations/delete.js +1 -1
  138. package/components/identity.passkeys/operations/list.js +1 -1
  139. package/components/identity.passkeys/operations/use.js +1 -1
  140. package/components/identity.passkeys/source/authenticate.ts +3 -4
  141. package/components/identity.passkeys/source/challenge.ts +29 -25
  142. package/components/identity.passkeys/source/create.ts +8 -6
  143. package/components/identity.passkeys/source/delete.ts +4 -1
  144. package/components/identity.passkeys/source/list.ts +4 -1
  145. package/components/identity.passkeys/source/types/Context.ts +1 -1
  146. package/components/identity.passkeys/source/use.ts +12 -10
  147. package/components/identity.passkeys/tsconfig.tsbuildinfo +1 -1
  148. package/components/identity.passkeys/types/toa.d.ts +5 -5
  149. package/components/identity.roles/manifest.toa.yaml +12 -16
  150. package/components/identity.roles/migrations/0001-system-properties.yaml +14 -0
  151. package/components/identity.roles/migrations/0002-indexes.yaml +8 -0
  152. package/components/identity.roles/operations/grant.js +1 -1
  153. package/components/identity.roles/operations/list.js +1 -1
  154. package/components/identity.roles/operations/principal.js +2 -2
  155. package/components/identity.roles/source/grant.ts +7 -6
  156. package/components/identity.roles/source/list.ts +1 -1
  157. package/components/identity.roles/source/principal.ts +5 -7
  158. package/components/identity.roles/tsconfig.tsbuildinfo +1 -1
  159. package/components/identity.roles/types/toa.d.ts +5 -5
  160. package/components/identity.tokens/manifest.toa.yaml +17 -15
  161. package/components/identity.tokens/migrations/0001-system-properties.yaml +14 -0
  162. package/components/identity.tokens/operations/authenticate.js +2 -2
  163. package/components/identity.tokens/operations/decrypt.js +11 -5
  164. package/components/identity.tokens/operations/encrypt.js +2 -2
  165. package/components/identity.tokens/operations/issue.js +2 -4
  166. package/components/identity.tokens/operations/lib/form.js +1 -1
  167. package/components/identity.tokens/operations/lib/key.js +1 -1
  168. package/components/identity.tokens/operations/revoke.js +1 -1
  169. package/components/identity.tokens/source/authenticate.test.ts +22 -16
  170. package/components/identity.tokens/source/authenticate.ts +7 -10
  171. package/components/identity.tokens/source/decrypt.test.ts +62 -29
  172. package/components/identity.tokens/source/decrypt.ts +30 -27
  173. package/components/identity.tokens/source/encrypt.test.ts +21 -16
  174. package/components/identity.tokens/source/encrypt.ts +8 -11
  175. package/components/identity.tokens/source/issue.test.ts +4 -2
  176. package/components/identity.tokens/source/issue.ts +6 -8
  177. package/components/identity.tokens/source/lib/form.ts +5 -9
  178. package/components/identity.tokens/source/lib/jose.d.ts +1 -1
  179. package/components/identity.tokens/source/lib/key.ts +1 -1
  180. package/components/identity.tokens/source/lib/paseto.test.ts +17 -6
  181. package/components/identity.tokens/source/revoke.ts +1 -1
  182. package/components/identity.tokens/tsconfig.tsbuildinfo +1 -1
  183. package/components/identity.tokens/types/index.d.ts +13 -4
  184. package/components/identity.tokens/types/toa.d.ts +5 -5
  185. package/context.toa.yaml +2 -2
  186. package/cucumber.mjs +3 -0
  187. package/documentation/access.md +4 -3
  188. package/documentation/cache.md +17 -3
  189. package/documentation/components.md +2 -2
  190. package/documentation/credentials.md +2 -2
  191. package/documentation/identity.md +7 -9
  192. package/documentation/map.md +2 -2
  193. package/documentation/mcp.md +23 -17
  194. package/documentation/notes/peers.md +1 -1
  195. package/documentation/notes/throttling.md +1 -1
  196. package/documentation/octets.md +4 -4
  197. package/documentation/protocol.md +3 -3
  198. package/documentation/query.md +14 -8
  199. package/documentation/rpc.md +45 -31
  200. package/documentation/tracing.md +3 -3
  201. package/documentation/tree.md +1 -1
  202. package/features/auth.assert.feature +2 -2
  203. package/features/auth.bearer.feature +1 -1
  204. package/features/auth.claims.feature +5 -5
  205. package/features/auth.incept.feature +2 -2
  206. package/features/authorities.federation.feature +1 -1
  207. package/features/configuration.feature +3 -4
  208. package/features/credentials.feature +9 -9
  209. package/features/dev.feature +1 -0
  210. package/features/dynamic.feature +1 -0
  211. package/features/errors.feature +21 -0
  212. package/features/etag.feature +0 -86
  213. package/features/identity.bans.feature +3 -3
  214. package/features/identity.basic.feature +9 -9
  215. package/features/identity.federation.feature +11 -11
  216. package/features/identity.tokens.custom.feature +5 -5
  217. package/features/identity.tokens.feature +2 -2
  218. package/features/interruptions.feature +1 -0
  219. package/features/introspection.map.feature +4 -4
  220. package/features/io.throttle.feature +1 -0
  221. package/features/map.feature +2 -2
  222. package/features/mcp.feature +32 -28
  223. package/features/oauth.grants.feature +1 -1
  224. package/features/octets.cloudinary.feature +1 -1
  225. package/features/octets.download.feature +1 -0
  226. package/features/require.feature +1 -2
  227. package/features/rpc.feature +21 -21
  228. package/features/steps/Captures.ts +1 -1
  229. package/features/steps/Cloudinary.ts +1 -2
  230. package/features/steps/Common.ts +4 -5
  231. package/features/steps/Components.ts +17 -12
  232. package/features/steps/Database.ts +42 -23
  233. package/features/steps/Gateway.ts +55 -71
  234. package/features/steps/HTTP.ts +12 -15
  235. package/features/steps/IDP.ts +118 -94
  236. package/features/steps/Identity.ts +3 -3
  237. package/features/steps/OTP.ts +3 -3
  238. package/features/steps/Parameters.ts +20 -10
  239. package/features/steps/Probe.ts +9 -7
  240. package/features/steps/Realtime.ts +40 -22
  241. package/features/steps/Workspace.ts +10 -7
  242. package/features/steps/components/audit/operations/record.js +1 -1
  243. package/features/steps/components/echo/operations/affect.js +1 -1
  244. package/features/steps/components/echo/operations/compute.js +1 -1
  245. package/features/steps/components/echo/operations/echo.js +1 -1
  246. package/features/steps/components/echo/operations/error.js +1 -1
  247. package/features/steps/components/echo/operations/identity.js +1 -1
  248. package/features/steps/components/echo/operations/parameters.js +1 -1
  249. package/features/steps/components/echo/operations/ping.js +1 -1
  250. package/features/steps/components/echo/operations/unwrap.js +1 -1
  251. package/features/steps/components/greeter/operations/greet.js +1 -1
  252. package/features/steps/components/notify/operations/send.js +1 -1
  253. package/features/steps/components/octets.tester/operations/authority.js +1 -1
  254. package/features/steps/components/octets.tester/operations/bar.js +1 -1
  255. package/features/steps/components/octets.tester/operations/baz.js +1 -1
  256. package/features/steps/components/octets.tester/operations/concat.js +1 -1
  257. package/features/steps/components/octets.tester/operations/echo.js +1 -1
  258. package/features/steps/components/octets.tester/operations/err.js +1 -1
  259. package/features/steps/components/octets.tester/operations/foo.js +1 -1
  260. package/features/steps/components/octets.tester/operations/id.js +1 -1
  261. package/features/steps/components/octets.tester/operations/identity.js +1 -1
  262. package/features/steps/components/octets.tester/operations/redirect.js +6 -4
  263. package/features/steps/components/octets.tester/operations/yex.js +1 -1
  264. package/features/steps/components/octets.tester/operations/yield.js +1 -1
  265. package/features/steps/components/orders/manifest.toa.yaml +10 -12
  266. package/features/steps/components/orders/operations/create.js +4 -2
  267. package/features/steps/components/pots/manifest.toa.yaml +15 -20
  268. package/features/steps/components/pots/migrations/0002-indexes.yaml +4 -0
  269. package/features/steps/components/pricing/operations/quote.js +1 -1
  270. package/features/steps/components/sequences/manifest.toa.yaml +0 -1
  271. package/features/steps/components/sequences/operations/numbers.js +1 -1
  272. package/features/steps/components/sequences/operations/tokens.js +3 -3
  273. package/features/steps/components/users/manifest.toa.yaml +3 -5
  274. package/features/steps/components/users/operations/create.js +1 -1
  275. package/features/steps/components/users.properties/manifest.toa.yaml +5 -6
  276. package/features/steps/map.ts +2 -2
  277. package/features/timestamps.feature +1 -1
  278. package/package.json +7 -7
  279. package/readme.md +11 -11
  280. package/schemas/annotation.cos.yaml +1 -3
  281. package/schemas/method.cos.yaml +2 -0
  282. package/source/Branch.test.ts +2 -2
  283. package/source/Branch.ts +3 -5
  284. package/source/Composition.ts +5 -5
  285. package/source/Directive.test.ts +38 -20
  286. package/source/Directive.ts +61 -47
  287. package/source/Endpoint.test.ts +1 -1
  288. package/source/Endpoint.ts +27 -92
  289. package/source/Factory.ts +26 -12
  290. package/source/Gateway.ts +87 -76
  291. package/source/HTTP/Context.ts +23 -30
  292. package/source/HTTP/Probe.ts +7 -9
  293. package/source/HTTP/Server.ts +88 -69
  294. package/source/HTTP/Timing.ts +6 -21
  295. package/source/HTTP/address.test.ts +8 -2
  296. package/source/HTTP/address.ts +2 -3
  297. package/source/HTTP/exceptions.ts +20 -18
  298. package/source/HTTP/formats/form.ts +1 -1
  299. package/source/HTTP/formats/json.ts +2 -2
  300. package/source/HTTP/formats/msgpack.ts +3 -4
  301. package/source/HTTP/formats/text.ts +2 -2
  302. package/source/HTTP/formats/yaml.test.ts +4 -1
  303. package/source/HTTP/formats/yaml.ts +14 -11
  304. package/source/HTTP/messages.test.ts +38 -28
  305. package/source/HTTP/messages.ts +44 -98
  306. package/source/Interception.ts +3 -4
  307. package/source/Introspection.ts +29 -14
  308. package/source/MCP/Server.ts +114 -54
  309. package/source/MCP/discover.ts +6 -7
  310. package/source/MCP/errors.ts +7 -8
  311. package/source/MCP/schema.test.ts +9 -3
  312. package/source/MCP/schema.ts +12 -16
  313. package/source/MCP/tools.ts +33 -27
  314. package/source/MCP/types.ts +4 -1
  315. package/source/Mapping.ts +25 -27
  316. package/source/Query.ts +58 -44
  317. package/source/RPC/Context.ts +8 -11
  318. package/source/RPC/Dispatcher.ts +46 -26
  319. package/source/RPC/errors.test.ts +41 -16
  320. package/source/RPC/errors.ts +9 -10
  321. package/source/RPC/names.test.ts +51 -32
  322. package/source/RPC/names.ts +26 -32
  323. package/source/RTD/Directives.ts +21 -10
  324. package/source/RTD/Endpoint.ts +4 -1
  325. package/source/RTD/Method.ts +8 -6
  326. package/source/RTD/Node.ts +32 -34
  327. package/source/RTD/Route.ts +18 -21
  328. package/source/RTD/Tree.ts +18 -18
  329. package/source/RTD/factory.ts +13 -16
  330. package/source/RTD/segment.ts +12 -10
  331. package/source/RTD/syntax/parse.test.ts +12 -6
  332. package/source/RTD/syntax/parse.ts +30 -26
  333. package/source/RTD/syntax/types.ts +17 -1
  334. package/source/RTD/walk.test.ts +64 -27
  335. package/source/Remotes.test.ts +25 -4
  336. package/source/Remotes.ts +9 -4
  337. package/source/Tenant.ts +12 -12
  338. package/source/deployment.ts +20 -20
  339. package/source/directives/auth/Anonymous.test.ts +8 -2
  340. package/source/directives/auth/Anonymous.ts +5 -8
  341. package/source/directives/auth/Anyone.ts +3 -3
  342. package/source/directives/auth/Assert.ts +10 -10
  343. package/source/directives/auth/Authorization.ts +83 -69
  344. package/source/directives/auth/Delegate.test.ts +2 -2
  345. package/source/directives/auth/Delegate.ts +8 -10
  346. package/source/directives/auth/Echo.ts +5 -8
  347. package/source/directives/auth/Federation.ts +30 -21
  348. package/source/directives/auth/Id.ts +7 -4
  349. package/source/directives/auth/Incept.ts +32 -26
  350. package/source/directives/auth/Input.ts +36 -20
  351. package/source/directives/auth/Role.test.ts +49 -23
  352. package/source/directives/auth/Role.ts +29 -22
  353. package/source/directives/auth/Rule.ts +13 -8
  354. package/source/directives/auth/Scheme.ts +7 -7
  355. package/source/directives/auth/create.ts +1 -1
  356. package/source/directives/auth/schemes.ts +1 -1
  357. package/source/directives/auth/split.ts +2 -3
  358. package/source/directives/auth/types.ts +5 -2
  359. package/source/directives/cache/Cache.ts +44 -9
  360. package/source/directives/cache/Control.ts +25 -26
  361. package/source/directives/cache/Exact.ts +1 -1
  362. package/source/directives/cache/etag.ts +38 -0
  363. package/source/directives/cors/CORS.ts +9 -7
  364. package/source/directives/dev/Development.ts +3 -4
  365. package/source/directives/dev/Faulty.ts +11 -6
  366. package/source/directives/dev/Sleep.ts +5 -7
  367. package/source/directives/dev/Stub.ts +2 -2
  368. package/source/directives/dev/Throw.ts +2 -2
  369. package/source/directives/flow/Compose.ts +26 -20
  370. package/source/directives/flow/Fetch.ts +15 -15
  371. package/source/directives/flow/Flow.ts +9 -8
  372. package/source/directives/index.ts +11 -2
  373. package/source/directives/io/IO.ts +29 -20
  374. package/source/directives/io/Input.ts +9 -12
  375. package/source/directives/io/Output.ts +20 -23
  376. package/source/directives/io/Status.test.ts +12 -8
  377. package/source/directives/io/Status.ts +9 -8
  378. package/source/directives/io/Throttle.ts +6 -7
  379. package/source/directives/io/lib/throttle/Configuration.test.ts +32 -23
  380. package/source/directives/io/lib/throttle/Configuration.ts +14 -9
  381. package/source/directives/io/lib/throttle/Keys.ts +15 -10
  382. package/source/directives/io/lib/throttle/Quotas.test.ts +33 -17
  383. package/source/directives/io/lib/throttle/Quotas.ts +20 -26
  384. package/source/directives/io/lib/throttle/Sync.test.ts +14 -10
  385. package/source/directives/io/lib/throttle/Sync.ts +9 -12
  386. package/source/directives/io/lib/throttle/Warning.ts +3 -4
  387. package/source/directives/io/lib/throttle/components/IP.ts +4 -5
  388. package/source/directives/io/lib/throttle/components/Identity.ts +1 -1
  389. package/source/directives/io/lib/throttle/components/Path.ts +1 -1
  390. package/source/directives/io/lib/throttle/components/Route.ts +2 -2
  391. package/source/directives/io/lib/throttle/components/Segment.ts +2 -2
  392. package/source/directives/io/lib/throttle/conditions/Status.ts +2 -2
  393. package/source/directives/io/schemas.test.ts +12 -6
  394. package/source/directives/map/Authority.ts +2 -2
  395. package/source/directives/map/Buffer.ts +2 -2
  396. package/source/directives/map/Claims.ts +25 -20
  397. package/source/directives/map/Headers.ts +17 -13
  398. package/source/directives/map/Language.ts +8 -5
  399. package/source/directives/map/Languages.ts +9 -3
  400. package/source/directives/map/Map.ts +25 -12
  401. package/source/directives/map/Mapping.ts +9 -6
  402. package/source/directives/map/Properties.ts +1 -1
  403. package/source/directives/map/Segments.ts +22 -15
  404. package/source/directives/mcp/MCP.ts +14 -5
  405. package/source/directives/mcp/Tool.test.ts +42 -6
  406. package/source/directives/mcp/Tool.ts +38 -7
  407. package/source/directives/oauth/Discovery.ts +7 -11
  408. package/source/directives/oauth/documents.ts +11 -14
  409. package/source/directives/octets/Context.ts +6 -3
  410. package/source/directives/octets/Delete.ts +33 -25
  411. package/source/directives/octets/Directive.ts +5 -1
  412. package/source/directives/octets/Get.ts +13 -21
  413. package/source/directives/octets/Octets.ts +20 -15
  414. package/source/directives/octets/Put.ts +62 -27
  415. package/source/directives/octets/Workflow.ts +18 -12
  416. package/source/directives/octets/bytes.ts +1 -1
  417. package/source/directives/octets/schemas.test.ts +8 -14
  418. package/source/directives/octets/workflows/Execution.ts +19 -21
  419. package/source/directives/octets/workflows/Workflow.ts +10 -7
  420. package/source/directives/require/Headers.ts +3 -4
  421. package/source/directives/require/Require.ts +3 -4
  422. package/source/exceptions.ts +19 -12
  423. package/source/index.ts +1 -1
  424. package/source/manifest.test.ts +4 -1
  425. package/source/manifest.ts +19 -13
  426. package/source/octets.d.ts +1 -1
  427. package/source/root.ts +3 -2
  428. package/source/schemas.test.ts +17 -3
  429. package/transpiled/Branch.js.map +1 -1
  430. package/transpiled/Composition.js.map +1 -1
  431. package/transpiled/Directive.js +6 -2
  432. package/transpiled/Directive.js.map +1 -1
  433. package/transpiled/Endpoint.d.ts +0 -2
  434. package/transpiled/Endpoint.js +11 -52
  435. package/transpiled/Endpoint.js.map +1 -1
  436. package/transpiled/Factory.d.ts +2 -1
  437. package/transpiled/Factory.js +1 -0
  438. package/transpiled/Factory.js.map +1 -1
  439. package/transpiled/Gateway.d.ts +2 -1
  440. package/transpiled/Gateway.js +24 -15
  441. package/transpiled/Gateway.js.map +1 -1
  442. package/transpiled/HTTP/Context.d.ts +0 -3
  443. package/transpiled/HTTP/Context.js +7 -9
  444. package/transpiled/HTTP/Context.js.map +1 -1
  445. package/transpiled/HTTP/Probe.js.map +1 -1
  446. package/transpiled/HTTP/Server.js +19 -4
  447. package/transpiled/HTTP/Server.js.map +1 -1
  448. package/transpiled/HTTP/Timing.d.ts +1 -2
  449. package/transpiled/HTTP/Timing.js +2 -10
  450. package/transpiled/HTTP/Timing.js.map +1 -1
  451. package/transpiled/HTTP/address.js.map +1 -1
  452. package/transpiled/HTTP/exceptions.js.map +1 -1
  453. package/transpiled/HTTP/formats/form.js.map +1 -1
  454. package/transpiled/HTTP/formats/json.js.map +1 -1
  455. package/transpiled/HTTP/formats/msgpack.js.map +1 -1
  456. package/transpiled/HTTP/formats/text.js.map +1 -1
  457. package/transpiled/HTTP/formats/yaml.js +4 -1
  458. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  459. package/transpiled/HTTP/messages.d.ts +3 -2
  460. package/transpiled/HTTP/messages.js +1 -43
  461. package/transpiled/HTTP/messages.js.map +1 -1
  462. package/transpiled/Interception.js.map +1 -1
  463. package/transpiled/Introspection.d.ts +2 -0
  464. package/transpiled/Introspection.js +13 -2
  465. package/transpiled/Introspection.js.map +1 -1
  466. package/transpiled/MCP/Server.js +15 -4
  467. package/transpiled/MCP/Server.js.map +1 -1
  468. package/transpiled/MCP/discover.js.map +1 -1
  469. package/transpiled/MCP/errors.js.map +1 -1
  470. package/transpiled/MCP/schema.js +1 -1
  471. package/transpiled/MCP/schema.js.map +1 -1
  472. package/transpiled/MCP/tools.js +10 -6
  473. package/transpiled/MCP/tools.js.map +1 -1
  474. package/transpiled/MCP/types.d.ts +3 -1
  475. package/transpiled/Mapping.d.ts +2 -2
  476. package/transpiled/Mapping.js +3 -5
  477. package/transpiled/Mapping.js.map +1 -1
  478. package/transpiled/Query.d.ts +6 -2
  479. package/transpiled/Query.js +23 -8
  480. package/transpiled/Query.js.map +1 -1
  481. package/transpiled/RPC/Context.js +0 -7
  482. package/transpiled/RPC/Context.js.map +1 -1
  483. package/transpiled/RPC/Dispatcher.js +4 -1
  484. package/transpiled/RPC/Dispatcher.js.map +1 -1
  485. package/transpiled/RPC/errors.js.map +1 -1
  486. package/transpiled/RPC/names.d.ts +3 -2
  487. package/transpiled/RPC/names.js +1 -1
  488. package/transpiled/RPC/names.js.map +1 -1
  489. package/transpiled/RTD/Directives.d.ts +1 -1
  490. package/transpiled/RTD/Method.js +1 -3
  491. package/transpiled/RTD/Method.js.map +1 -1
  492. package/transpiled/RTD/Node.js +5 -4
  493. package/transpiled/RTD/Node.js.map +1 -1
  494. package/transpiled/RTD/Route.js +4 -1
  495. package/transpiled/RTD/Route.js.map +1 -1
  496. package/transpiled/RTD/Tree.js +1 -1
  497. package/transpiled/RTD/Tree.js.map +1 -1
  498. package/transpiled/RTD/factory.js.map +1 -1
  499. package/transpiled/RTD/segment.js.map +1 -1
  500. package/transpiled/RTD/syntax/parse.js.map +1 -1
  501. package/transpiled/RTD/syntax/types.d.ts +6 -0
  502. package/transpiled/RTD/syntax/types.js +10 -1
  503. package/transpiled/RTD/syntax/types.js.map +1 -1
  504. package/transpiled/Remotes.js.map +1 -1
  505. package/transpiled/Tenant.d.ts +1 -1
  506. package/transpiled/Tenant.js.map +1 -1
  507. package/transpiled/deployment.d.ts +3 -0
  508. package/transpiled/deployment.js +6 -1
  509. package/transpiled/deployment.js.map +1 -1
  510. package/transpiled/directives/auth/Anonymous.js +1 -3
  511. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  512. package/transpiled/directives/auth/Anyone.js.map +1 -1
  513. package/transpiled/directives/auth/Assert.js.map +1 -1
  514. package/transpiled/directives/auth/Authorization.js +7 -3
  515. package/transpiled/directives/auth/Authorization.js.map +1 -1
  516. package/transpiled/directives/auth/Delegate.js.map +1 -1
  517. package/transpiled/directives/auth/Echo.js +1 -3
  518. package/transpiled/directives/auth/Echo.js.map +1 -1
  519. package/transpiled/directives/auth/Federation.js +3 -7
  520. package/transpiled/directives/auth/Federation.js.map +1 -1
  521. package/transpiled/directives/auth/Id.js.map +1 -1
  522. package/transpiled/directives/auth/Incept.js +1 -1
  523. package/transpiled/directives/auth/Incept.js.map +1 -1
  524. package/transpiled/directives/auth/Input.js.map +1 -1
  525. package/transpiled/directives/auth/Role.js.map +1 -1
  526. package/transpiled/directives/auth/Rule.js.map +1 -1
  527. package/transpiled/directives/auth/Scheme.js +1 -2
  528. package/transpiled/directives/auth/Scheme.js.map +1 -1
  529. package/transpiled/directives/auth/create.js.map +1 -1
  530. package/transpiled/directives/auth/schemes.js.map +1 -1
  531. package/transpiled/directives/auth/split.js.map +1 -1
  532. package/transpiled/directives/auth/types.d.ts +3 -1
  533. package/transpiled/directives/cache/Cache.js +28 -2
  534. package/transpiled/directives/cache/Cache.js.map +1 -1
  535. package/transpiled/directives/cache/Control.js +1 -1
  536. package/transpiled/directives/cache/Control.js.map +1 -1
  537. package/transpiled/directives/cache/etag.d.ts +10 -0
  538. package/transpiled/directives/cache/etag.js +30 -0
  539. package/transpiled/directives/cache/etag.js.map +1 -0
  540. package/transpiled/directives/cors/CORS.js.map +1 -1
  541. package/transpiled/directives/dev/Development.js.map +1 -1
  542. package/transpiled/directives/dev/Faulty.js.map +1 -1
  543. package/transpiled/directives/dev/Sleep.js.map +1 -1
  544. package/transpiled/directives/dev/Stub.js.map +1 -1
  545. package/transpiled/directives/dev/Throw.js.map +1 -1
  546. package/transpiled/directives/flow/Compose.js +7 -3
  547. package/transpiled/directives/flow/Compose.js.map +1 -1
  548. package/transpiled/directives/flow/Fetch.js.map +1 -1
  549. package/transpiled/directives/flow/Flow.js.map +1 -1
  550. package/transpiled/directives/index.js +11 -1
  551. package/transpiled/directives/index.js.map +1 -1
  552. package/transpiled/directives/io/IO.d.ts +1 -1
  553. package/transpiled/directives/io/IO.js.map +1 -1
  554. package/transpiled/directives/io/Input.js +1 -1
  555. package/transpiled/directives/io/Input.js.map +1 -1
  556. package/transpiled/directives/io/Output.js +3 -3
  557. package/transpiled/directives/io/Output.js.map +1 -1
  558. package/transpiled/directives/io/Status.js.map +1 -1
  559. package/transpiled/directives/io/Throttle.js +1 -1
  560. package/transpiled/directives/io/Throttle.js.map +1 -1
  561. package/transpiled/directives/io/lib/throttle/Configuration.js +8 -2
  562. package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -1
  563. package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -1
  564. package/transpiled/directives/io/lib/throttle/Quotas.js +4 -3
  565. package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
  566. package/transpiled/directives/io/lib/throttle/Sync.d.ts +1 -1
  567. package/transpiled/directives/io/lib/throttle/Sync.js.map +1 -1
  568. package/transpiled/directives/io/lib/throttle/Warning.js.map +1 -1
  569. package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -1
  570. package/transpiled/directives/io/lib/throttle/components/Identity.js.map +1 -1
  571. package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -1
  572. package/transpiled/directives/io/lib/throttle/components/Route.js.map +1 -1
  573. package/transpiled/directives/io/lib/throttle/components/Segment.js.map +1 -1
  574. package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -1
  575. package/transpiled/directives/map/Authority.js.map +1 -1
  576. package/transpiled/directives/map/Buffer.js.map +1 -1
  577. package/transpiled/directives/map/Claims.js.map +1 -1
  578. package/transpiled/directives/map/Headers.js.map +1 -1
  579. package/transpiled/directives/map/Language.js.map +1 -1
  580. package/transpiled/directives/map/Languages.js.map +1 -1
  581. package/transpiled/directives/map/Map.js.map +1 -1
  582. package/transpiled/directives/map/Mapping.js.map +1 -1
  583. package/transpiled/directives/map/Properties.js.map +1 -1
  584. package/transpiled/directives/map/Segments.js.map +1 -1
  585. package/transpiled/directives/mcp/MCP.js +7 -1
  586. package/transpiled/directives/mcp/MCP.js.map +1 -1
  587. package/transpiled/directives/mcp/Tool.d.ts +6 -1
  588. package/transpiled/directives/mcp/Tool.js +16 -3
  589. package/transpiled/directives/mcp/Tool.js.map +1 -1
  590. package/transpiled/directives/oauth/Discovery.js.map +1 -1
  591. package/transpiled/directives/oauth/documents.js.map +1 -1
  592. package/transpiled/directives/octets/Context.js +1 -1
  593. package/transpiled/directives/octets/Context.js.map +1 -1
  594. package/transpiled/directives/octets/Delete.js.map +1 -1
  595. package/transpiled/directives/octets/Directive.js.map +1 -1
  596. package/transpiled/directives/octets/Get.js.map +1 -1
  597. package/transpiled/directives/octets/Octets.js +1 -1
  598. package/transpiled/directives/octets/Octets.js.map +1 -1
  599. package/transpiled/directives/octets/Put.js.map +1 -1
  600. package/transpiled/directives/octets/Workflow.js.map +1 -1
  601. package/transpiled/directives/octets/bytes.js.map +1 -1
  602. package/transpiled/directives/octets/workflows/Execution.js +1 -2
  603. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  604. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  605. package/transpiled/directives/require/Headers.js.map +1 -1
  606. package/transpiled/directives/require/Require.js.map +1 -1
  607. package/transpiled/exceptions.js.map +1 -1
  608. package/transpiled/index.d.ts +1 -1
  609. package/transpiled/index.js +1 -1
  610. package/transpiled/index.js.map +1 -1
  611. package/transpiled/manifest.js +5 -1
  612. package/transpiled/manifest.js.map +1 -1
  613. package/transpiled/root.js.map +1 -1
  614. package/tsconfig.tsbuildinfo +1 -1
  615. package/CHANGELOG.md +0 -541
  616. package/source/redact.test.ts +0 -27
  617. package/source/redact.ts +0 -21
  618. package/transpiled/redact.d.ts +0 -5
  619. package/transpiled/redact.js +0 -17
  620. package/transpiled/redact.js.map +0 -1
@@ -3,7 +3,7 @@ properties:
3
3
  type: string
4
4
  resources:
5
5
  # `null` deploys the service without any, which every deployment has to state one way
6
- # or the other — see `migrations/263.md`.
6
+ # or the other — see `migrations/262.md`.
7
7
  type: object
8
8
  nullable: true
9
9
  properties:
@@ -76,7 +76,6 @@ properties:
76
76
  registration:
77
77
  type: string
78
78
  enum: [open, closed]
79
- default: closed
80
79
  required:
81
80
  - authorize
82
81
  additionalProperties: false
@@ -109,7 +108,6 @@ properties:
109
108
  anonymous:
110
109
  description: Whether the endpoint answers without a credential
111
110
  type: boolean
112
- default: false
113
111
  required:
114
112
  - name
115
113
  additionalProperties: false
@@ -12,6 +12,8 @@ properties:
12
12
  type: string
13
13
  query:
14
14
  $ref: query
15
+ paged:
16
+ type: boolean
15
17
  additionalProperties: false
16
18
  type: object
17
19
  directives:
@@ -4,7 +4,7 @@ import assert from 'node:assert/strict'
4
4
  import { decide } from './Branch.js'
5
5
  import type { Branch, Exposed } from './Branch.js'
6
6
 
7
- function branch (version: string, timestamp: number): Branch {
7
+ function branch(version: string, timestamp: number): Branch {
8
8
  return {
9
9
  namespace: 'default',
10
10
  component: 'one',
@@ -15,7 +15,7 @@ function branch (version: string, timestamp: number): Branch {
15
15
  }
16
16
  }
17
17
 
18
- function exposed (version: string, timestamp: number): Exposed {
18
+ function exposed(version: string, timestamp: number): Exposed {
19
19
  return { version, timestamp, nodes: [] }
20
20
  }
21
21
 
package/source/Branch.ts CHANGED
@@ -33,12 +33,10 @@ export interface Exposed {
33
33
  * - `superseded`: it came from a tenant that started before the one exposed now
34
34
  * - `merge`: everything else
35
35
  */
36
- export function decide (exposed: Exposed, branch: Branch): Decision {
37
- if (exposed.version === branch.version)
38
- return 'refresh'
36
+ export function decide(exposed: Exposed, branch: Branch): Decision {
37
+ if (exposed.version === branch.version) return 'refresh'
39
38
 
40
- if (branch.timestamp < exposed.timestamp)
41
- return 'superseded'
39
+ if (branch.timestamp < exposed.timestamp) return 'superseded'
42
40
 
43
41
  return 'merge'
44
42
  }
@@ -6,12 +6,12 @@ import { type Host } from './Factory.js'
6
6
  export class Composition extends Connector {
7
7
  private readonly host: Host
8
8
 
9
- public constructor (host: Host) {
9
+ public constructor(host: Host) {
10
10
  super()
11
11
  this.host = host
12
12
  }
13
13
 
14
- protected override async open (): Promise<void> {
14
+ protected override async open(): Promise<void> {
15
15
  const paths = find()
16
16
  const composition = await this.host.composition(paths)
17
17
 
@@ -21,17 +21,17 @@ export class Composition extends Connector {
21
21
  }
22
22
  }
23
23
 
24
- function find (): string[] {
24
+ function find(): string[] {
25
25
  return entries().map((entry) => resolve(ROOT, entry.name))
26
26
  }
27
27
 
28
- function entries (): Dirent[] {
28
+ function entries(): Dirent[] {
29
29
  const entries = readdirSync(ROOT, { withFileTypes: true })
30
30
 
31
31
  return entries.filter((entry) => entry.isDirectory())
32
32
  }
33
33
 
34
- export function components (): Components {
34
+ export function components(): Components {
35
35
  const labels: string[] = []
36
36
  const paths: string[] = []
37
37
 
@@ -16,7 +16,10 @@ const families: Array<DirectiveFamily> = [
16
16
  mandatory: true,
17
17
  create: mock.fn((_0: any, _1: any, _2: any) => generate() as any),
18
18
  arrange: mock.fn(),
19
- precall: mock.fn(() => { sequence.push('foo'); return null }),
19
+ precall: mock.fn(() => {
20
+ sequence.push('foo')
21
+ return null
22
+ }),
20
23
  settle: mock.fn(),
21
24
  dispose: mock.fn()
22
25
  },
@@ -25,7 +28,10 @@ const families: Array<DirectiveFamily> = [
25
28
  mandatory: true,
26
29
  create: mock.fn((_0: any, _1: any, _2: any) => generate() as any),
27
30
  arrange: mock.fn(),
28
- precall: mock.fn(() => { sequence.push('qux'); return null }),
31
+ precall: mock.fn(() => {
32
+ sequence.push('qux')
33
+ return null
34
+ }),
29
35
  settle: mock.fn(),
30
36
  dispose: mock.fn()
31
37
  },
@@ -34,7 +40,10 @@ const families: Array<DirectiveFamily> = [
34
40
  mandatory: false,
35
41
  create: mock.fn((_0: string, _1: any, _2: any) => generate() as any),
36
42
  arrange: mock.fn(),
37
- precall: mock.fn(() => { sequence.push('bar'); return null }),
43
+ precall: mock.fn(() => {
44
+ sequence.push('bar')
45
+ return null
46
+ }),
38
47
  settle: mock.fn(),
39
48
  dispose: mock.fn()
40
49
  }
@@ -49,11 +58,18 @@ beforeEach(() => {
49
58
  for (const family of families) {
50
59
  assert.ok(family.precall !== undefined)
51
60
 
52
- family.precall.mock.mockImplementation(() => { sequence.push(family.name); return null })
61
+ family.precall.mock.mockImplementation(() => {
62
+ sequence.push(family.name)
63
+ return null
64
+ })
53
65
  }
54
66
 
55
- factory = new DirectivesFactory(families, {} as unknown as Remotes, {} as unknown as Host,
56
- { authorities: {} })
67
+ factory = new DirectivesFactory(
68
+ families,
69
+ {} as unknown as Remotes,
70
+ {} as unknown as Host,
71
+ { authorities: {} }
72
+ )
57
73
  })
58
74
 
59
75
  it('should create directive', async () => {
@@ -95,8 +111,11 @@ it('should throw error if directive family is not found', async () => {
95
111
  value: generate()
96
112
  }
97
113
 
98
- assert.throws(() => factory.create([declaration]),
99
- (error: Error) => error.message.includes(`Directive family '${declaration.family}' is not found`))
114
+ assert.throws(
115
+ () => factory.create([declaration]),
116
+ (error: Error) =>
117
+ error.message.includes(`Directive family '${declaration.family}' is not found`)
118
+ )
100
119
  })
101
120
 
102
121
  it('should apply directive', async () => {
@@ -129,7 +148,7 @@ it('should apply mandatory families', async () => {
129
148
 
130
149
  describe('order', () => {
131
150
  // the order the families actually ran, as each precall recorded it
132
- function order (): string[] {
151
+ function order(): string[] {
133
152
  return sequence
134
153
  }
135
154
 
@@ -145,18 +164,17 @@ describe('order', () => {
145
164
  assert.deepStrictEqual(order(), ['foo', 'qux'])
146
165
  })
147
166
 
148
- it('should run a mandatory family before a declared one it is not declared with',
149
- async () => {
150
- // only `qux` is declared: `foo` still has to run first, not merely first of
151
- // whatever had no declarations
152
- const directives = factory.create([
153
- { family: 'qux', name: generate(), value: generate() }
154
- ])
167
+ it('should run a mandatory family before a declared one it is not declared with', async () => {
168
+ // only `qux` is declared: `foo` still has to run first, not merely first of
169
+ // whatever had no declarations
170
+ const directives = factory.create([
171
+ { family: 'qux', name: generate(), value: generate() }
172
+ ])
155
173
 
156
- await directives.precall(generate() as unknown as Context, [])
174
+ await directives.precall(generate() as unknown as Context, [])
157
175
 
158
- assert.deepStrictEqual(order(), ['foo', 'qux'])
159
- })
176
+ assert.deepStrictEqual(order(), ['foo', 'qux'])
177
+ })
160
178
 
161
179
  it('should run mandatory families before the rest', async () => {
162
180
  const directives = factory.create([
@@ -170,7 +188,7 @@ describe('order', () => {
170
188
  })
171
189
  })
172
190
 
173
- function resetCalls (target = [families], seen = new Set()) {
191
+ function resetCalls(target = [families], seen = new Set()) {
174
192
  if (target === null || typeof target !== 'object' || seen.has(target)) return
175
193
 
176
194
  seen.add(target)
@@ -12,7 +12,7 @@ export class Directives implements RTD.Directives {
12
12
  /** the span of a stage depends only on the set, so it is built once per route */
13
13
  private readonly spans: Spans[]
14
14
 
15
- public constructor (sets: RTD.DirectiveSet[]) {
15
+ public constructor(sets: RTD.DirectiveSet[]) {
16
16
  this.sets = sets
17
17
  this.spans = sets.map((set) => ({
18
18
  precall: options(set, 'precall'),
@@ -21,29 +21,29 @@ export class Directives implements RTD.Directives {
21
21
  }))
22
22
  }
23
23
 
24
- public declared<T> (family: string): T[] | undefined {
25
- return this.sets.find((set) => set.family.name === family)?.directives as T[] | undefined
24
+ public declared<T>(family: string): T[] | undefined {
25
+ return this.sets.find((set) => set.family.name === family)?.directives as
26
+ | T[]
27
+ | undefined
26
28
  }
27
29
 
28
- public async precall (context: Context, parameters: RTD.Parameter[]): Promise<Output> {
30
+ public async precall(context: Context, parameters: RTD.Parameter[]): Promise<Output> {
29
31
  let output = null
30
32
 
31
33
  for (let i = 0; i < this.sets.length; i++) {
32
34
  const set = this.sets[i]
33
35
 
34
- if (set.family.precall === undefined)
35
- continue
36
+ if (set.family.precall === undefined) continue
36
37
 
37
- const out = await console.span(this.spans[i].precall,
38
- async () => await set.family.precall!(set.directives, context, parameters))
38
+ const out = await console.span(
39
+ this.spans[i].precall,
40
+ async () => await set.family.precall!(set.directives, context, parameters)
41
+ )
39
42
 
40
- if (out === null)
41
- continue
43
+ if (out === null) continue
42
44
 
43
- if (output !== null)
44
- throw new Error('Multiple precall directives responded')
45
- else
46
- output = out
45
+ if (output !== null) throw new Error('Multiple precall directives responded')
46
+ else output = out
47
47
  }
48
48
 
49
49
  return output
@@ -54,21 +54,23 @@ export class Directives implements RTD.Directives {
54
54
  * what the one before it returned, and the first to refuse ends it: a method this caller
55
55
  * cannot reach is not described at all.
56
56
  */
57
- public async explain (context: Context,
58
- introspection: Introspection): Promise<Introspection | null> {
57
+ public async explain(
58
+ context: Context,
59
+ introspection: Introspection
60
+ ): Promise<Introspection | null> {
59
61
  let described: Introspection = introspection
60
62
 
61
63
  for (let i = 0; i < this.sets.length; i++) {
62
64
  const set = this.sets[i]
63
65
 
64
- if (set.family.explain === undefined)
65
- continue
66
+ if (set.family.explain === undefined) continue
66
67
 
67
- const next = await console.span(this.spans[i].explain,
68
- async () => await set.family.explain!(set.directives, context, described))
68
+ const next = await console.span(
69
+ this.spans[i].explain,
70
+ async () => await set.family.explain!(set.directives, context, described)
71
+ )
69
72
 
70
- if (next === null)
71
- return null
73
+ if (next === null) return null
72
74
 
73
75
  described = next
74
76
  }
@@ -76,19 +78,20 @@ export class Directives implements RTD.Directives {
76
78
  return described
77
79
  }
78
80
 
79
- public async settle (context: Context, response: OutgoingMessage): Promise<void> {
81
+ public async settle(context: Context, response: OutgoingMessage): Promise<void> {
80
82
  for (let i = 0; i < this.sets.length; i++) {
81
83
  const set = this.sets[i]
82
84
 
83
85
  if (set.family.settle !== undefined)
84
- await console.span(this.spans[i].settle,
85
- async () => await set.family.settle!(set.directives, context, response))
86
+ await console.span(
87
+ this.spans[i].settle,
88
+ async () => await set.family.settle!(set.directives, context, response)
89
+ )
86
90
  }
87
91
  }
88
92
 
89
- public dispose (): void {
90
- for (const set of this.sets)
91
- set.family.dispose?.(set.directives)
93
+ public dispose(): void {
94
+ for (const set of this.sets) set.family.dispose?.(set.directives)
92
95
  }
93
96
  }
94
97
 
@@ -102,14 +105,17 @@ export class DirectivesFactory implements RTD.DirectiveFactory {
102
105
  private readonly stages: Stage[] = []
103
106
 
104
107
  // eslint-disable-next-line max-params
105
- public constructor (families: RTD.DirectiveFamily[], remotes: Remotes, host: Host,
106
- options: Options) {
108
+ public constructor(
109
+ families: RTD.DirectiveFamily[],
110
+ remotes: Remotes,
111
+ host: Host,
112
+ options: Options
113
+ ) {
107
114
  for (const family of families) {
108
115
  family.mount?.(host, options)
109
116
  this.families[family.name] = family
110
117
 
111
- if (family.mandatory)
112
- this.mandatory.push(family.name)
118
+ if (family.mandatory) this.mandatory.push(family.name)
113
119
 
114
120
  this.stages.push({
115
121
  family,
@@ -125,22 +131,24 @@ export class DirectivesFactory implements RTD.DirectiveFactory {
125
131
  * Request-scoped, before anything is routed, so no directives are passed: a family
126
132
  * answers here only for what it does on its own behalf.
127
133
  */
128
- public async preflight (context: Context): Promise<void> {
134
+ public async preflight(context: Context): Promise<void> {
129
135
  for (const stage of this.stages)
130
136
  if (stage.family.preflight !== undefined)
131
- await console.span(stage.preflight,
132
- async () => { await stage.family.preflight!(context) })
137
+ await console.span(stage.preflight, async () => {
138
+ await stage.family.preflight!(context)
139
+ })
133
140
  }
134
141
 
135
142
  /** Request-scoped, on the message going back. */
136
- public async depart (context: Context, response: OutgoingMessage): Promise<void> {
143
+ public async depart(context: Context, response: OutgoingMessage): Promise<void> {
137
144
  for (const stage of this.stages)
138
145
  if (stage.family.depart !== undefined)
139
- await console.span(stage.depart,
140
- async () => { await stage.family.depart!(context, response) })
146
+ await console.span(stage.depart, async () => {
147
+ await stage.family.depart!(context, response)
148
+ })
141
149
  }
142
150
 
143
- public create (declarations: RTD.syntax.Directive[], route: string = ''): Directives {
151
+ public create(declarations: RTD.syntax.Directive[], route: string = ''): Directives {
144
152
  const groups: Record<string, any> = {}
145
153
  const mandatory = new Set(this.mandatory)
146
154
 
@@ -152,7 +160,12 @@ export class DirectivesFactory implements RTD.DirectiveFactory {
152
160
  if (family === undefined)
153
161
  throw new Error(`Directive family '${declaration.family}' is not found`)
154
162
 
155
- const directive = family.create(declaration.name, declaration.value, this.remotes, route)
163
+ const directive = family.create(
164
+ declaration.name,
165
+ declaration.value,
166
+ this.remotes,
167
+ route
168
+ )
156
169
 
157
170
  groups[family.name] ??= []
158
171
  groups[family.name].push(directive)
@@ -184,8 +197,7 @@ export class DirectivesFactory implements RTD.DirectiveFactory {
184
197
  sets.sort((a, b) => this.rank(a.family.name) - this.rank(b.family.name))
185
198
 
186
199
  // whatever order a family needs among its own directives is fixed here, not per request
187
- for (const set of sets)
188
- set.family.arrange?.(set.directives)
200
+ for (const set of sets) set.family.arrange?.(set.directives)
189
201
 
190
202
  const directives = new Directives(sets)
191
203
 
@@ -194,20 +206,22 @@ export class DirectivesFactory implements RTD.DirectiveFactory {
194
206
  return directives
195
207
  }
196
208
 
197
- public dispose (): void {
198
- for (const directives of this.instances)
199
- directives.dispose()
209
+ public dispose(): void {
210
+ for (const directives of this.instances) directives.dispose()
200
211
  }
201
212
 
202
213
  /** Mandatory families first, in their own order; everything else keeps its own. */
203
- private rank (family: string): number {
214
+ private rank(family: string): number {
204
215
  const index = this.mandatory.indexOf(family)
205
216
 
206
217
  return index === -1 ? this.mandatory.length : index
207
218
  }
208
219
  }
209
220
 
210
- function options (set: RTD.DirectiveSet, stage: 'precall' | 'settle' | 'explain'): SpanOptions {
221
+ function options(
222
+ set: RTD.DirectiveSet,
223
+ stage: 'precall' | 'settle' | 'explain'
224
+ ): SpanOptions {
211
225
  const options: SpanOptions = { name: `${set.family.name} ${stage}` }
212
226
 
213
227
  if (set.names !== undefined && set.names.length > 0)
@@ -10,7 +10,7 @@ import type { Parameter } from './RTD/index.js'
10
10
  * What `Remote.explain` answers is the contract's own object, the same one every time and
11
11
  * on every route that mounts the endpoint — which is what this stands in for.
12
12
  */
13
- function remote (): Promise<Remote> {
13
+ function remote(): Promise<Remote> {
14
14
  const explanation = {
15
15
  input: {
16
16
  type: 'object',
@@ -1,8 +1,7 @@
1
1
  import { Readable } from 'node:stream'
2
- import { console } from 'openspan'
3
2
  import { Mapping } from './Mapping.js'
4
3
  import { take } from './Introspection.js'
5
- import { redact } from './redact.js'
4
+ import { parse } from './directives/cache/etag.js'
6
5
  import * as http from './HTTP/index.js'
7
6
  import type { Introspection, Schema } from './Introspection.js'
8
7
  import type { Remote } from '@toa.io/core'
@@ -19,56 +18,41 @@ export class Endpoint implements RTD.Endpoint {
19
18
  /** What the operation says, with what the route takes already split out of it. */
20
19
  private introspection: Introspection | null = null
21
20
 
22
- public constructor (endpoint: string, mapping: Mapping, discovery: Promise<Remote>) {
21
+ public constructor(endpoint: string, mapping: Mapping, discovery: Promise<Remote>) {
23
22
  this.endpoint = endpoint
24
23
  this.mapping = mapping
25
24
  this.discovery = discovery
26
25
  }
27
26
 
28
- public async call (context: http.Context, parameters: RTD.Parameter[]): Promise<http.OutgoingMessage> {
27
+ public async call(
28
+ context: http.Context,
29
+ parameters: RTD.Parameter[]
30
+ ): Promise<http.OutgoingMessage> {
29
31
  const body = await context.body()
30
32
  const query = this.query(context)
31
33
  const request = this.mapping.fit(body, query, parameters)
32
34
 
33
35
  this.remote ??= await this.discovery
34
36
 
35
- const endpoint = this.remote.locator.id + '.' + this.endpoint
36
-
37
- console.debug('Calling operation', { endpoint, request: redact(request) })
38
-
39
37
  const reply = await this.remote.invoke(this.endpoint, request)
40
38
 
41
- console.debug('Received reply',
42
- { endpoint, reply: reply instanceof Readable ? '[Readable stream]' : redact(reply) })
43
-
44
- if (reply instanceof Error)
45
- throw new http.UnprocessableEntity(reply)
39
+ if (reply instanceof Error) throw new http.UnprocessableEntity(reply)
46
40
 
47
- const message: http.OutgoingMessage = {}
41
+ const message: http.OutgoingMessage = { body: reply }
48
42
 
49
- // etag
50
- if (reply !== null && reply !== undefined) {
51
- const etag = context.request.headers['if-none-match']
43
+ // what the reply carries for a cache to validate by; the `cache` family sets the headers
44
+ if (typeof reply === 'object' && reply !== null && !(reply instanceof Readable)) {
45
+ if ('VERSION' in reply) message.version = reply.VERSION
52
46
 
53
- if (this.conditionalGet(reply, etag, message))
54
- return message
55
- }
56
-
57
- // last-modified
58
- if (typeof reply === 'object' && reply !== null && ('_updated' in reply || '_created' in reply)) {
59
- const timestamp: string = reply._updated ?? reply._created
60
- const date = new Date(timestamp)
47
+ const modified = reply.UPDATED ?? reply.CREATED
61
48
 
62
- message.headers ??= new Headers()
63
- message.headers.set('last-modified', date.toUTCString())
49
+ if (modified !== undefined) message.modified = modified
64
50
  }
65
51
 
66
- message.body = reply
67
-
68
52
  return message
69
53
  }
70
54
 
71
- public async explain (parameters: RTD.Parameter[]): Promise<Introspection> {
55
+ public async explain(parameters: RTD.Parameter[]): Promise<Introspection> {
72
56
  this.introspection ??= await this.introspect(parameters)
73
57
 
74
58
  // what a directive narrows is this caller's answer, not the next caller's
@@ -81,7 +65,7 @@ export class Endpoint implements RTD.Endpoint {
81
65
  * share one remote — so the copy is what keeps the second from describing what the first
82
66
  * took away.
83
67
  */
84
- private async introspect (parameters: RTD.Parameter[]): Promise<Introspection> {
68
+ private async introspect(parameters: RTD.Parameter[]): Promise<Introspection> {
85
69
  this.remote ??= await this.discovery
86
70
 
87
71
  const operation = structuredClone(await this.remote.explain(this.endpoint))
@@ -97,8 +81,7 @@ export class Endpoint implements RTD.Endpoint {
97
81
  for (const parameter of parameters) {
98
82
  const schema = take(operation, parameter.name)
99
83
 
100
- if (schema === undefined)
101
- continue
84
+ if (schema === undefined) continue
102
85
 
103
86
  route ??= {}
104
87
  route[parameter.name] = schema
@@ -107,80 +90,34 @@ export class Endpoint implements RTD.Endpoint {
107
90
  const query = this.mapping.explain(operation)
108
91
  const introspection: Introspection = {}
109
92
 
110
- if (route !== null)
111
- introspection.route = route
93
+ if (route !== null) introspection.route = route
112
94
 
113
- if (query !== null)
114
- introspection.query = query
95
+ if (query !== null) introspection.query = query
115
96
 
116
97
  Object.assign(introspection, operation)
117
98
 
118
99
  return introspection
119
100
  }
120
101
 
121
- public async close (): Promise<void> {
102
+ public async close(): Promise<void> {
122
103
  this.remote ??= await this.discovery
123
104
 
124
105
  await this.remote.disconnect(INTERRUPT)
125
106
  }
126
107
 
127
- private conditionalGet (reply: unknown, etag: string | undefined, message: http.OutgoingMessage): boolean {
128
- message.headers ??= new Headers()
129
-
130
- if (typeof reply === 'object' && reply !== null && '_version' in reply) {
131
- const version = reply._version as number
132
- const matched = etag === undefined ? null : this.matchVersion(etag)
133
-
134
- if (etag !== undefined && matched !== null && version === matched) {
135
- message.status = 304
136
- message.headers.set('etag', etag)
137
-
138
- return true
139
- }
140
-
141
- message.headers.set('etag', `"${version.toString()}"`)
142
-
143
- return false
144
- }
145
-
146
- if (reply instanceof Readable)
147
- return false
148
-
149
- /*
150
- * A reply that carries no version is tagged with a hash of its body. The body is
151
- * serialized anyway when the response is written, so the tag is computed from what
152
- * is actually sent rather than from a second serialization of the reply — which
153
- * makes it specific to the negotiated representation, hence `vary: accept`.
154
- */
155
- message.etag = true
156
-
157
- return false
158
- }
159
-
160
- private query (context: http.Context): http.Query {
108
+ private query(context: http.Context): http.Query {
161
109
  const query: http.Query = Object.fromEntries(context.url.searchParams)
162
110
  const etag = context.request.headers['if-match']
163
111
 
164
- if (etag !== undefined && this.mapping.queryable)
165
- query.version = this.version(etag)
112
+ if (etag !== undefined && this.mapping.queryable) query.version = this.version(etag)
166
113
 
167
114
  return query
168
115
  }
169
116
 
170
- private matchVersion (etag: string): number | null {
171
- const match = etag.match(ETAG)
117
+ private version(etag: string): number {
118
+ const version = parse(etag)
172
119
 
173
- if (match === null)
174
- return null
175
-
176
- return Number.parseInt(match.groups!.version)
177
- }
178
-
179
- private version (etag: string): number {
180
- const version = this.matchVersion(etag)
181
-
182
- if (version === null)
183
- throw new http.BadRequest('Invalid ETag')
120
+ if (version === null) throw new http.BadRequest('Invalid ETag')
184
121
 
185
122
  return version
186
123
  }
@@ -189,15 +126,15 @@ export class Endpoint implements RTD.Endpoint {
189
126
  export class EndpointsFactory implements RTD.EndpointsFactory {
190
127
  private readonly remotes: Remotes
191
128
 
192
- public constructor (remotes: Remotes) {
129
+ public constructor(remotes: Remotes) {
193
130
  this.remotes = remotes
194
131
  }
195
132
 
196
- public create (method: RTD.syntax.Method, context: Context): Endpoint {
133
+ public create(method: RTD.syntax.Method, context: Context): Endpoint {
197
134
  if (method.mapping === undefined)
198
135
  throw new Error('Cannot create Endpoint without mapping')
199
136
 
200
- const mapping = Mapping.create(method.mapping.query)
137
+ const mapping = Mapping.create(method.mapping.query, method.mapping.paged)
201
138
 
202
139
  const branch = context.extension
203
140
 
@@ -213,6 +150,4 @@ export class EndpointsFactory implements RTD.EndpointsFactory {
213
150
  }
214
151
  }
215
152
 
216
- const ETAG = /^(W\/)?"(?<version>\d{1,32})"$/
217
-
218
153
  const INTERRUPT = true