@toa.io/extensions.exposition 1.0.0-alpha.291 → 1.0.0-alpha.293

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/components/identity.basic/package.json +8 -0
  2. package/components/identity.federation/package.json +8 -0
  3. package/components/identity.passkeys/package.json +8 -0
  4. package/components/identity.tokens/package.json +10 -0
  5. package/package.json +25 -13
  6. package/transpiled/Discovery/Explorer.js +1 -1
  7. package/transpiled/Discovery/Explorer.js.map +1 -1
  8. package/transpiled/Discovery/Site.js +1 -1
  9. package/transpiled/Discovery/Site.js.map +1 -1
  10. package/transpiled/Discovery/trunk.js +1 -1
  11. package/transpiled/Discovery/trunk.js.map +1 -1
  12. package/transpiled/Endpoint.js +3 -0
  13. package/transpiled/Endpoint.js.map +1 -1
  14. package/transpiled/Factory.js +1 -1
  15. package/transpiled/Factory.js.map +1 -1
  16. package/transpiled/Gateway.js +1 -1
  17. package/transpiled/Gateway.js.map +1 -1
  18. package/transpiled/HTTP/Server.d.ts +1 -1
  19. package/transpiled/HTTP/Server.js +1 -1
  20. package/transpiled/HTTP/Server.js.map +1 -1
  21. package/transpiled/Introspection.d.ts +6 -0
  22. package/transpiled/Introspection.js +1 -0
  23. package/transpiled/Introspection.js.map +1 -1
  24. package/transpiled/MCP/Server.d.ts +1 -1
  25. package/transpiled/MCP/Server.js +1 -1
  26. package/transpiled/MCP/Server.js.map +1 -1
  27. package/transpiled/MCP/discover.d.ts +1 -1
  28. package/transpiled/MCP/schema.js +2 -2
  29. package/transpiled/Query.d.ts +2 -12
  30. package/transpiled/Query.js +3 -13
  31. package/transpiled/Query.js.map +1 -1
  32. package/transpiled/RPC/Dispatcher.d.ts +1 -1
  33. package/transpiled/RPC/Dispatcher.js +2 -2
  34. package/transpiled/RPC/Dispatcher.js.map +1 -1
  35. package/transpiled/RTD/Endpoint.d.ts +2 -3
  36. package/transpiled/RTD/Tree.js +1 -1
  37. package/transpiled/RTD/Tree.js.map +1 -1
  38. package/transpiled/RTD/factory.js +1 -1
  39. package/transpiled/RTD/factory.js.map +1 -1
  40. package/transpiled/RTD/syntax/index.d.ts +1 -2
  41. package/transpiled/RTD/syntax/index.js +1 -2
  42. package/transpiled/RTD/syntax/index.js.map +1 -1
  43. package/transpiled/Tenant.js +1 -1
  44. package/transpiled/Tenant.js.map +1 -1
  45. package/transpiled/directives/auth/Authorization.js +1 -1
  46. package/transpiled/directives/auth/Authorization.js.map +1 -1
  47. package/transpiled/directives/io/IO.js +1 -1
  48. package/transpiled/directives/io/IO.js.map +1 -1
  49. package/transpiled/directives/oauth/documents.d.ts +1 -1
  50. package/transpiled/index.d.ts +0 -2
  51. package/transpiled/index.js +0 -2
  52. package/transpiled/index.js.map +1 -1
  53. package/transpiled/service.js +1 -1
  54. package/transpiled/service.js.map +1 -1
  55. package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
  56. package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
  57. package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
  58. package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
  59. package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
  60. package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
  61. package/ui/dist/_app/immutable/chunks/{D9tE1yyO.js → DVlaUfVU.js} +1 -1
  62. package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
  63. package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
  64. package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
  65. package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
  66. package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
  67. package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
  68. package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
  69. package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
  70. package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
  71. package/ui/dist/_app/version.json +1 -1
  72. package/ui/dist/index.html +12 -12
  73. package/CHANGELOG.md +0 -35
  74. package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
  75. package/components/identity.basic/source/lib/credentials.test.ts +0 -18
  76. package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
  77. package/components/identity.clients/source/lib/canonical.test.ts +0 -43
  78. package/components/identity.clients/source/lib/cimd.test.ts +0 -122
  79. package/components/identity.clients/source/lib/redirect.test.ts +0 -47
  80. package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
  81. package/components/identity.credentials/source/list.test.ts +0 -70
  82. package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
  83. package/components/identity.federation/source/lib/discovery.test.ts +0 -60
  84. package/components/identity.federation/source/list.test.ts +0 -41
  85. package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
  86. package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
  87. package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
  88. package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
  89. package/components/identity.passkeys/source/errors.test.ts +0 -34
  90. package/components/identity.passkeys/source/webauthn.test.ts +0 -26
  91. package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
  92. package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
  93. package/components/identity.tokens/source/authenticate.test.ts +0 -112
  94. package/components/identity.tokens/source/decrypt.test.ts +0 -216
  95. package/components/identity.tokens/source/encrypt.test.ts +0 -150
  96. package/components/identity.tokens/source/issue.test.ts +0 -73
  97. package/components/identity.tokens/source/lib/form.test.ts +0 -25
  98. package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
  99. package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
  100. package/context.toa.yaml +0 -31
  101. package/cucumber.mjs +0 -7
  102. package/documentation/.assets/ia3-dark.jpg +0 -0
  103. package/documentation/.assets/ia3-light.jpg +0 -0
  104. package/documentation/.assets/overview-dark.jpg +0 -0
  105. package/documentation/.assets/overview-light.jpg +0 -0
  106. package/documentation/.assets/role-scopes-dark.jpg +0 -0
  107. package/documentation/.assets/role-scopes-light.jpg +0 -0
  108. package/documentation/.assets/rtd-dark.jpg +0 -0
  109. package/documentation/.assets/rtd-light.jpg +0 -0
  110. package/documentation/access.md +0 -350
  111. package/documentation/authorities.md +0 -51
  112. package/documentation/cache.md +0 -72
  113. package/documentation/components.md +0 -472
  114. package/documentation/consent.md +0 -101
  115. package/documentation/credentials.md +0 -88
  116. package/documentation/dev.md +0 -30
  117. package/documentation/discovery.md +0 -81
  118. package/documentation/flow.md +0 -44
  119. package/documentation/help.md +0 -122
  120. package/documentation/identity.md +0 -304
  121. package/documentation/introspection.md +0 -123
  122. package/documentation/io.md +0 -167
  123. package/documentation/ip.md +0 -24
  124. package/documentation/map.md +0 -123
  125. package/documentation/mcp.md +0 -183
  126. package/documentation/notes/desync.jpg +0 -0
  127. package/documentation/notes/peers.md +0 -59
  128. package/documentation/notes/sse.md +0 -71
  129. package/documentation/notes/throttling.md +0 -122
  130. package/documentation/oauth.md +0 -180
  131. package/documentation/octets.md +0 -334
  132. package/documentation/passkeys.md +0 -11
  133. package/documentation/protocol.md +0 -120
  134. package/documentation/query.md +0 -324
  135. package/documentation/require.md +0 -15
  136. package/documentation/rpc.md +0 -154
  137. package/documentation/tracing.md +0 -70
  138. package/documentation/tree.md +0 -199
  139. package/features/access.feature +0 -596
  140. package/features/annotation.feature +0 -32
  141. package/features/auth.assert.feature +0 -55
  142. package/features/auth.bearer.feature +0 -120
  143. package/features/auth.claims.feature +0 -171
  144. package/features/auth.incept.feature +0 -166
  145. package/features/auth.input.feature +0 -59
  146. package/features/authorities.basic.feature +0 -141
  147. package/features/authorities.feature +0 -71
  148. package/features/authorities.federation.feature +0 -100
  149. package/features/authorities.tokens.feature +0 -117
  150. package/features/body.feature +0 -76
  151. package/features/cache.feature +0 -368
  152. package/features/configuration.feature +0 -206
  153. package/features/cors.feature +0 -127
  154. package/features/credentials.feature +0 -106
  155. package/features/debug.feature +0 -34
  156. package/features/dev.feature +0 -90
  157. package/features/directives.feature +0 -61
  158. package/features/discovery.feature +0 -213
  159. package/features/discovery.ui.feature +0 -213
  160. package/features/dynamic.feature +0 -192
  161. package/features/errors.feature +0 -258
  162. package/features/etag.feature +0 -239
  163. package/features/flow.feature +0 -148
  164. package/features/help.feature +0 -512
  165. package/features/identity.bans.feature +0 -200
  166. package/features/identity.basic.feature +0 -666
  167. package/features/identity.feature +0 -240
  168. package/features/identity.federation.feature +0 -396
  169. package/features/identity.otp.feature +0 -142
  170. package/features/identity.roles.feature +0 -568
  171. package/features/identity.tokens.custom.feature +0 -430
  172. package/features/identity.tokens.feature +0 -131
  173. package/features/interruptions.feature +0 -20
  174. package/features/introspection.feature +0 -565
  175. package/features/introspection.map.feature +0 -108
  176. package/features/io.feature +0 -204
  177. package/features/io.throttle.feature +0 -166
  178. package/features/map.feature +0 -360
  179. package/features/mcp.feature +0 -753
  180. package/features/methods.feature +0 -48
  181. package/features/oauth.clients.feature +0 -195
  182. package/features/oauth.discovery.feature +0 -164
  183. package/features/oauth.grants.feature +0 -301
  184. package/features/octets.cloudinary.feature +0 -233
  185. package/features/octets.download.feature +0 -194
  186. package/features/octets.entries.feature +0 -83
  187. package/features/octets.feature +0 -306
  188. package/features/octets.head.feature +0 -40
  189. package/features/octets.location.feature +0 -83
  190. package/features/octets.meta.feature +0 -117
  191. package/features/octets.workflows.feature +0 -565
  192. package/features/passkeys.feature +0 -66
  193. package/features/probes.feature +0 -18
  194. package/features/query.feature +0 -389
  195. package/features/realtime.feature +0 -34
  196. package/features/require.feature +0 -66
  197. package/features/response.feature +0 -103
  198. package/features/routes.feature +0 -224
  199. package/features/rpc.feature +0 -429
  200. package/features/server.feature +0 -21
  201. package/features/site/_app/immutable/asset.js +0 -1
  202. package/features/site/favicon.ico +0 -0
  203. package/features/site/index.html +0 -10
  204. package/features/steps/.env.example +0 -5
  205. package/features/steps/Captures.ts +0 -20
  206. package/features/steps/Cloudinary.ts +0 -12
  207. package/features/steps/Common.ts +0 -38
  208. package/features/steps/Components.ts +0 -115
  209. package/features/steps/Database.ts +0 -106
  210. package/features/steps/Gateway.ts +0 -240
  211. package/features/steps/HTTP.ts +0 -96
  212. package/features/steps/IDP.ts +0 -361
  213. package/features/steps/Identity.ts +0 -54
  214. package/features/steps/OTP.ts +0 -42
  215. package/features/steps/Parameters.ts +0 -162
  216. package/features/steps/Probe.ts +0 -38
  217. package/features/steps/Realtime.ts +0 -175
  218. package/features/steps/Workspace.ts +0 -48
  219. package/features/steps/components/audit/manifest.toa.yaml +0 -20
  220. package/features/steps/components/audit/operations/record.js +0 -5
  221. package/features/steps/components/echo/manifest.toa.yaml +0 -59
  222. package/features/steps/components/echo/operations/affect.js +0 -3
  223. package/features/steps/components/echo/operations/compute.js +0 -3
  224. package/features/steps/components/echo/operations/echo.js +0 -3
  225. package/features/steps/components/echo/operations/error.js +0 -7
  226. package/features/steps/components/echo/operations/identity.js +0 -3
  227. package/features/steps/components/echo/operations/parameters.js +0 -3
  228. package/features/steps/components/echo/operations/ping.js +0 -3
  229. package/features/steps/components/echo/operations/unwrap.js +0 -3
  230. package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
  231. package/features/steps/components/echo.beacon/operations/hello.js +0 -3
  232. package/features/steps/components/greeter/manifest.toa.yaml +0 -5
  233. package/features/steps/components/greeter/operations/greet.js +0 -3
  234. package/features/steps/components/notify/manifest.toa.yaml +0 -20
  235. package/features/steps/components/notify/operations/send.js +0 -5
  236. package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
  237. package/features/steps/components/octets.tester/operations/authority.js +0 -3
  238. package/features/steps/components/octets.tester/operations/bar.js +0 -9
  239. package/features/steps/components/octets.tester/operations/baz.js +0 -9
  240. package/features/steps/components/octets.tester/operations/concat.js +0 -5
  241. package/features/steps/components/octets.tester/operations/echo.js +0 -5
  242. package/features/steps/components/octets.tester/operations/err.js +0 -14
  243. package/features/steps/components/octets.tester/operations/foo.js +0 -5
  244. package/features/steps/components/octets.tester/operations/id.js +0 -5
  245. package/features/steps/components/octets.tester/operations/identity.js +0 -5
  246. package/features/steps/components/octets.tester/operations/lenna.png +0 -0
  247. package/features/steps/components/octets.tester/operations/redirect.js +0 -17
  248. package/features/steps/components/octets.tester/operations/yex.js +0 -14
  249. package/features/steps/components/octets.tester/operations/yield.js +0 -11
  250. package/features/steps/components/orders/manifest.toa.yaml +0 -30
  251. package/features/steps/components/orders/operations/create.js +0 -7
  252. package/features/steps/components/pots/manifest.toa.yaml +0 -91
  253. package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
  254. package/features/steps/components/pricing/manifest.toa.yaml +0 -13
  255. package/features/steps/components/pricing/operations/quote.js +0 -3
  256. package/features/steps/components/sequences/manifest.toa.yaml +0 -11
  257. package/features/steps/components/sequences/operations/numbers.js +0 -5
  258. package/features/steps/components/sequences/operations/tokens.js +0 -14
  259. package/features/steps/components/users/manifest.toa.yaml +0 -30
  260. package/features/steps/components/users/operations/create.js +0 -11
  261. package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
  262. package/features/steps/map.ts +0 -30
  263. package/features/steps/tsconfig.json +0 -9
  264. package/features/streams.feature +0 -35
  265. package/features/timestamps.feature +0 -41
  266. package/features/timing.feature +0 -49
  267. package/features/tracing.feature +0 -123
  268. package/schemas/annotation.cos.yaml +0 -125
  269. package/schemas/call.cos.yaml +0 -18
  270. package/schemas/directive.cos.yaml +0 -7
  271. package/schemas/method.cos.yaml +0 -23
  272. package/schemas/node.cos.yaml +0 -22
  273. package/schemas/query.cos.yaml +0 -31
  274. package/schemas/querystring.cos.yaml +0 -19
  275. package/schemas/range.cos.yaml +0 -10
  276. package/schemas/route.cos.yaml +0 -6
  277. package/source/Annotation.ts +0 -89
  278. package/source/Branch.test.ts +0 -40
  279. package/source/Branch.ts +0 -44
  280. package/source/Composition.ts +0 -51
  281. package/source/Context.ts +0 -11
  282. package/source/Directive.test.ts +0 -199
  283. package/source/Directive.ts +0 -248
  284. package/source/Discovery/Explorer.ts +0 -34
  285. package/source/Discovery/Site.test.ts +0 -147
  286. package/source/Discovery/Site.ts +0 -202
  287. package/source/Discovery/index.ts +0 -3
  288. package/source/Discovery/tree.test.ts +0 -175
  289. package/source/Discovery/tree.ts +0 -77
  290. package/source/Discovery/trunk.ts +0 -33
  291. package/source/Endpoint.test.ts +0 -67
  292. package/source/Endpoint.ts +0 -157
  293. package/source/Factory.ts +0 -42
  294. package/source/Gateway.ts +0 -390
  295. package/source/HTTP/Context.ts +0 -143
  296. package/source/HTTP/Probe.ts +0 -99
  297. package/source/HTTP/Server.ts +0 -430
  298. package/source/HTTP/Timing.ts +0 -14
  299. package/source/HTTP/address.test.ts +0 -28
  300. package/source/HTTP/address.ts +0 -16
  301. package/source/HTTP/exceptions.ts +0 -99
  302. package/source/HTTP/formats/form.ts +0 -21
  303. package/source/HTTP/formats/index.ts +0 -36
  304. package/source/HTTP/formats/json.ts +0 -14
  305. package/source/HTTP/formats/msgpack.ts +0 -14
  306. package/source/HTTP/formats/text.ts +0 -10
  307. package/source/HTTP/formats/yaml.test.ts +0 -22
  308. package/source/HTTP/formats/yaml.ts +0 -40
  309. package/source/HTTP/index.ts +0 -6
  310. package/source/HTTP/messages.test.ts +0 -196
  311. package/source/HTTP/messages.ts +0 -186
  312. package/source/HTTP/types.ts +0 -39
  313. package/source/Interception.ts +0 -37
  314. package/source/Introspection.ts +0 -179
  315. package/source/MCP/Server.ts +0 -335
  316. package/source/MCP/discover.ts +0 -51
  317. package/source/MCP/errors.ts +0 -80
  318. package/source/MCP/index.ts +0 -1
  319. package/source/MCP/schema.test.ts +0 -91
  320. package/source/MCP/schema.ts +0 -94
  321. package/source/MCP/tools.ts +0 -144
  322. package/source/MCP/types.ts +0 -84
  323. package/source/Mapping.ts +0 -101
  324. package/source/Query.test.ts +0 -54
  325. package/source/Query.ts +0 -277
  326. package/source/RPC/Context.ts +0 -75
  327. package/source/RPC/Dispatcher.ts +0 -150
  328. package/source/RPC/errors.test.ts +0 -77
  329. package/source/RPC/errors.ts +0 -82
  330. package/source/RPC/index.ts +0 -1
  331. package/source/RPC/names.test.ts +0 -141
  332. package/source/RPC/names.ts +0 -176
  333. package/source/RPC/types.ts +0 -34
  334. package/source/RTD/Context.ts +0 -16
  335. package/source/RTD/Directives.ts +0 -126
  336. package/source/RTD/Endpoint.ts +0 -27
  337. package/source/RTD/Match.ts +0 -11
  338. package/source/RTD/Method.ts +0 -39
  339. package/source/RTD/Node.ts +0 -169
  340. package/source/RTD/Route.ts +0 -93
  341. package/source/RTD/Tree.ts +0 -137
  342. package/source/RTD/expiration.test.ts +0 -81
  343. package/source/RTD/factory.ts +0 -105
  344. package/source/RTD/index.ts +0 -8
  345. package/source/RTD/segment.test.ts +0 -35
  346. package/source/RTD/segment.ts +0 -51
  347. package/source/RTD/syntax/index.ts +0 -2
  348. package/source/RTD/syntax/parse.test.ts +0 -196
  349. package/source/RTD/syntax/parse.ts +0 -171
  350. package/source/RTD/syntax/types.ts +0 -69
  351. package/source/RTD/walk.test.ts +0 -147
  352. package/source/Remotes.test.ts +0 -79
  353. package/source/Remotes.ts +0 -39
  354. package/source/Tenant.ts +0 -73
  355. package/source/const.ts +0 -45
  356. package/source/deployment.ts +0 -96
  357. package/source/directives/auth/Anonymous.test.ts +0 -70
  358. package/source/directives/auth/Anonymous.ts +0 -36
  359. package/source/directives/auth/Anyone.ts +0 -23
  360. package/source/directives/auth/Assert.ts +0 -43
  361. package/source/directives/auth/Authorization.test.ts +0 -24
  362. package/source/directives/auth/Authorization.ts +0 -388
  363. package/source/directives/auth/Delegate.test.ts +0 -36
  364. package/source/directives/auth/Delegate.ts +0 -54
  365. package/source/directives/auth/Echo.ts +0 -24
  366. package/source/directives/auth/Federation.ts +0 -104
  367. package/source/directives/auth/Id.ts +0 -37
  368. package/source/directives/auth/Incept.ts +0 -117
  369. package/source/directives/auth/Input.ts +0 -92
  370. package/source/directives/auth/Role.test.ts +0 -147
  371. package/source/directives/auth/Role.ts +0 -99
  372. package/source/directives/auth/Rule.ts +0 -59
  373. package/source/directives/auth/Scheme.ts +0 -31
  374. package/source/directives/auth/create.ts +0 -11
  375. package/source/directives/auth/index.ts +0 -3
  376. package/source/directives/auth/schemes.test.ts +0 -18
  377. package/source/directives/auth/schemes.ts +0 -39
  378. package/source/directives/auth/split.ts +0 -14
  379. package/source/directives/auth/types.ts +0 -75
  380. package/source/directives/cache/Cache.ts +0 -92
  381. package/source/directives/cache/Control.ts +0 -81
  382. package/source/directives/cache/Exact.ts +0 -7
  383. package/source/directives/cache/etag.ts +0 -38
  384. package/source/directives/cache/index.ts +0 -3
  385. package/source/directives/cache/types.ts +0 -9
  386. package/source/directives/cors/CORS.test.ts +0 -75
  387. package/source/directives/cors/CORS.ts +0 -88
  388. package/source/directives/cors/index.ts +0 -3
  389. package/source/directives/dev/Development.ts +0 -41
  390. package/source/directives/dev/Faulty.ts +0 -31
  391. package/source/directives/dev/Sleep.ts +0 -53
  392. package/source/directives/dev/Stub.ts +0 -14
  393. package/source/directives/dev/Throw.ts +0 -14
  394. package/source/directives/dev/index.ts +0 -3
  395. package/source/directives/dev/types.ts +0 -5
  396. package/source/directives/flow/Compose.ts +0 -98
  397. package/source/directives/flow/Fetch.ts +0 -86
  398. package/source/directives/flow/Flow.ts +0 -43
  399. package/source/directives/flow/index.ts +0 -3
  400. package/source/directives/flow/types.ts +0 -7
  401. package/source/directives/help/Family.ts +0 -122
  402. package/source/directives/help/Help.test.ts +0 -227
  403. package/source/directives/help/Help.ts +0 -47
  404. package/source/directives/help/Parameters.ts +0 -47
  405. package/source/directives/help/described.ts +0 -57
  406. package/source/directives/help/index.ts +0 -45
  407. package/source/directives/index.ts +0 -33
  408. package/source/directives/io/Directive.ts +0 -17
  409. package/source/directives/io/IO.ts +0 -118
  410. package/source/directives/io/Input.ts +0 -55
  411. package/source/directives/io/Message.ts +0 -1
  412. package/source/directives/io/Output.ts +0 -81
  413. package/source/directives/io/Status.test.ts +0 -88
  414. package/source/directives/io/Status.ts +0 -47
  415. package/source/directives/io/Throttle.ts +0 -30
  416. package/source/directives/io/index.ts +0 -3
  417. package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
  418. package/source/directives/io/lib/throttle/Configuration.ts +0 -68
  419. package/source/directives/io/lib/throttle/Keys.ts +0 -53
  420. package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
  421. package/source/directives/io/lib/throttle/Quotas.ts +0 -190
  422. package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
  423. package/source/directives/io/lib/throttle/Sync.ts +0 -93
  424. package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
  425. package/source/directives/io/lib/throttle/Warning.ts +0 -29
  426. package/source/directives/io/lib/throttle/components/Component.ts +0 -7
  427. package/source/directives/io/lib/throttle/components/IP.ts +0 -30
  428. package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
  429. package/source/directives/io/lib/throttle/components/Path.ts +0 -8
  430. package/source/directives/io/lib/throttle/components/Route.ts +0 -19
  431. package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
  432. package/source/directives/io/lib/throttle/components/index.ts +0 -19
  433. package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
  434. package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
  435. package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
  436. package/source/directives/io/lib/throttle/index.ts +0 -4
  437. package/source/directives/io/schemas.test.ts +0 -40
  438. package/source/directives/io/schemas.ts +0 -16
  439. package/source/directives/map/Authority.ts +0 -15
  440. package/source/directives/map/Buffer.ts +0 -15
  441. package/source/directives/map/Claims.ts +0 -63
  442. package/source/directives/map/Directive.ts +0 -4
  443. package/source/directives/map/Headers.ts +0 -60
  444. package/source/directives/map/Language.ts +0 -45
  445. package/source/directives/map/Languages.ts +0 -17
  446. package/source/directives/map/Map.ts +0 -85
  447. package/source/directives/map/Mapping.ts +0 -45
  448. package/source/directives/map/Properties.ts +0 -15
  449. package/source/directives/map/Segments.ts +0 -52
  450. package/source/directives/map/index.ts +0 -3
  451. package/source/directives/mcp/MCP.ts +0 -33
  452. package/source/directives/mcp/Tool.test.ts +0 -56
  453. package/source/directives/mcp/Tool.ts +0 -32
  454. package/source/directives/mcp/index.ts +0 -6
  455. package/source/directives/oauth/Discovery.ts +0 -66
  456. package/source/directives/oauth/documents.ts +0 -110
  457. package/source/directives/oauth/index.ts +0 -3
  458. package/source/directives/octets/Context.ts +0 -23
  459. package/source/directives/octets/Delete.ts +0 -96
  460. package/source/directives/octets/Directive.ts +0 -21
  461. package/source/directives/octets/Get.ts +0 -88
  462. package/source/directives/octets/Octets.ts +0 -82
  463. package/source/directives/octets/Put.ts +0 -186
  464. package/source/directives/octets/Workflow.ts +0 -60
  465. package/source/directives/octets/bytes.test.ts +0 -33
  466. package/source/directives/octets/bytes.ts +0 -18
  467. package/source/directives/octets/index.ts +0 -3
  468. package/source/directives/octets/schemas.test.ts +0 -20
  469. package/source/directives/octets/schemas.ts +0 -15
  470. package/source/directives/octets/types.ts +0 -9
  471. package/source/directives/octets/workflows/Execution.ts +0 -130
  472. package/source/directives/octets/workflows/Workflow.ts +0 -51
  473. package/source/directives/octets/workflows/index.ts +0 -1
  474. package/source/directives/require/Directive.ts +0 -5
  475. package/source/directives/require/Headers.ts +0 -19
  476. package/source/directives/require/Require.ts +0 -27
  477. package/source/directives/require/index.ts +0 -3
  478. package/source/discovery.ts +0 -1
  479. package/source/exceptions.ts +0 -47
  480. package/source/index.ts +0 -12
  481. package/source/io.ts +0 -4
  482. package/source/manifest.test.ts +0 -56
  483. package/source/manifest.ts +0 -56
  484. package/source/octets.d.ts +0 -17
  485. package/source/root.ts +0 -59
  486. package/source/schemas.test.ts +0 -31
  487. package/source/schemas.ts +0 -15
  488. package/source/service.ts +0 -94
  489. package/source/shortcuts.ts +0 -14
  490. package/source/userland.ts +0 -47
  491. package/transpiled/Annotation.d.ts +0 -70
  492. package/transpiled/Annotation.js +0 -2
  493. package/transpiled/Annotation.js.map +0 -1
  494. package/transpiled/RTD/syntax/parse.d.ts +0 -4
  495. package/transpiled/RTD/syntax/parse.js +0 -112
  496. package/transpiled/RTD/syntax/parse.js.map +0 -1
  497. package/transpiled/RTD/syntax/types.d.ts +0 -52
  498. package/transpiled/RTD/syntax/types.js +0 -11
  499. package/transpiled/RTD/syntax/types.js.map +0 -1
  500. package/transpiled/const.d.ts +0 -36
  501. package/transpiled/const.js +0 -37
  502. package/transpiled/const.js.map +0 -1
  503. package/transpiled/deployment.d.ts +0 -6
  504. package/transpiled/deployment.js +0 -76
  505. package/transpiled/deployment.js.map +0 -1
  506. package/transpiled/manifest.d.ts +0 -3
  507. package/transpiled/manifest.js +0 -39
  508. package/transpiled/manifest.js.map +0 -1
  509. package/transpiled/schemas.d.ts +0 -9
  510. package/transpiled/schemas.js +0 -9
  511. package/transpiled/schemas.js.map +0 -1
  512. package/transpiled/shortcuts.d.ts +0 -3
  513. package/transpiled/shortcuts.js +0 -13
  514. package/transpiled/shortcuts.js.map +0 -1
  515. package/tsconfig.json +0 -13
  516. package/tsconfig.tsbuildinfo +0 -1
  517. package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
  518. package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
  519. package/ui/dist/_app/immutable/chunks/B_pK3U1C.js +0 -6
  520. package/ui/dist/_app/immutable/chunks/CiKbPLyY.js +0 -1
  521. package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
  522. package/ui/dist/_app/immutable/entry/app.DMqmL4NY.js +0 -2
  523. package/ui/dist/_app/immutable/entry/start.CRe7HWBI.js +0 -1
  524. package/ui/dist/_app/immutable/nodes/0.D9m-6cbM.js +0 -1
  525. package/ui/dist/_app/immutable/nodes/1.Cgi_RcSO.js +0 -1
  526. package/ui/dist/_app/immutable/nodes/2.D_Cbxgz4.js +0 -14
@@ -1,175 +0,0 @@
1
- import { describe as suite, it, afterEach } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { describe } from './tree.js'
5
- import { Tree } from '../RTD/Tree.js'
6
- import type * as http from '../HTTP/index.js'
7
- import type { Introspection } from '../Introspection.js'
8
- import type { EndpointsFactory } from '../Endpoint.js'
9
- import type { DirectiveFactory } from '../RTD/Directives.js'
10
- import type * as syntax from '../RTD/syntax/index.js'
11
-
12
- /** A method with no mapping has no endpoint, so what it says is its directives' alone. */
13
- const endpoints = {} as unknown as EndpointsFactory
14
-
15
- /** What a method marked with this describes as, standing for a directive that refuses. */
16
- const REFUSE = 'refuse'
17
-
18
- const directives = {
19
- create: (stack: syntax.Directive[]) => ({
20
- declared: () => undefined,
21
- precall: async () => null,
22
- settle: async () => undefined,
23
- dispose: () => undefined,
24
- explain: async (_: unknown, introspection: Introspection) => {
25
- const mark = stack.find((directive) => directive.family === 'test')?.value
26
-
27
- if (mark === REFUSE) return null
28
-
29
- return mark === undefined ? introspection : { ...introspection, description: mark }
30
- }
31
- }),
32
- preflight: async () => undefined,
33
- depart: async () => undefined,
34
- dispose: () => undefined
35
- } as unknown as DirectiveFactory
36
-
37
- const method = (verb: string, mark?: string): syntax.Method => ({
38
- verb,
39
- directives: mark === undefined ? [] : [{ family: 'test', name: 'mark', value: mark }]
40
- })
41
-
42
- const node = (
43
- path: string,
44
- methods: syntax.Method[] = [],
45
- routes: syntax.Route[] = []
46
- ): syntax.Route => ({ path, node: { routes, methods, directives: [] } })
47
-
48
- const trunk = (routes: syntax.Route[], methods: syntax.Method[] = []): syntax.Node => ({
49
- routes,
50
- methods,
51
- directives: []
52
- })
53
-
54
- const request = {} as unknown as http.Context
55
-
56
- afterEach(() => {
57
- delete process.env.__TESTING_EXPOSITION_BRANCH_TTL
58
- })
59
-
60
- suite('discovery tree', () => {
61
- it('should key the trunk by the root', async () => {
62
- const tree = new Tree(trunk([], [method('GET')]), endpoints, directives)
63
-
64
- assert.deepEqual(Object.keys((await describe(tree, request)).routes), ['/'])
65
- })
66
-
67
- it('should key every route by the template it answers at', async () => {
68
- const tree = new Tree(
69
- trunk([
70
- node('/pots', [method('GET'), method('POST')], [node('/:id', [method('GET')])])
71
- ]),
72
- endpoints,
73
- directives
74
- )
75
-
76
- const { routes: resources } = await describe(tree, request)
77
-
78
- assert.deepEqual(Object.keys(resources), ['/pots', '/pots/:id'])
79
- assert.deepEqual(Object.keys(resources['/pots']), ['GET', 'POST'])
80
- })
81
-
82
- it('should include a route no name can spell', async () => {
83
- // `/.rpc` and `/.mcp` leave these out; HTTP addresses a route by its path
84
- const tree = new Tree(
85
- trunk([
86
- node('/v1.0', [method('GET')]),
87
- node('/files', [], [node('/**', [method('GET')])]),
88
- node('/any', [], [node('/*', [method('GET')])])
89
- ]),
90
- endpoints,
91
- directives
92
- )
93
-
94
- assert.deepEqual(Object.keys((await describe(tree, request)).routes), [
95
- '/any/*',
96
- '/files/**',
97
- '/v1.0'
98
- ])
99
- })
100
-
101
- it('should skip an intermediate node, whose route answers in its place', async () => {
102
- const tree = new Tree(
103
- trunk([node('/posts', [method('PATCH')], [node('/', [method('PUT')])])]),
104
- endpoints,
105
- directives
106
- )
107
-
108
- assert.deepEqual(Object.keys((await describe(tree, request)).routes), ['/posts'])
109
- })
110
-
111
- it('should omit a resource this caller may reach no method of', async () => {
112
- const tree = new Tree(
113
- trunk([
114
- node('/open', [method('GET')]),
115
- node('/closed', [method('GET', REFUSE), method('POST', REFUSE)])
116
- ]),
117
- endpoints,
118
- directives
119
- )
120
-
121
- assert.deepEqual(Object.keys((await describe(tree, request)).routes), ['/open'])
122
- })
123
-
124
- it('should carry only the verbs this caller may reach', async () => {
125
- const tree = new Tree(
126
- trunk([node('/pots', [method('GET'), method('POST', REFUSE)])]),
127
- endpoints,
128
- directives
129
- )
130
-
131
- const { routes: resources } = await describe(tree, request)
132
-
133
- assert.deepEqual(Object.keys(resources['/pots']), ['GET'])
134
- })
135
-
136
- it('should answer the declaration a request would reach where two share a template', async () => {
137
- // `/a/b` and `/a: { /b: }` are two routes and one template; the more specific matches
138
- const tree = new Tree(
139
- trunk([
140
- node('/a/b', [method('GET', 'nested')]),
141
- node('/a', [], [node('/b', [method('GET', 'adjacent')])])
142
- ]),
143
- endpoints,
144
- directives
145
- )
146
-
147
- const { routes: resources } = await describe(tree, request)
148
-
149
- assert.deepEqual(Object.keys(resources), ['/a/b'])
150
- assert.equal(resources['/a/b'].GET.description, 'nested')
151
- })
152
-
153
- it('should drop a branch that has expired', async () => {
154
- process.env.__TESTING_EXPOSITION_BRANCH_TTL = '-1'
155
-
156
- const tree = new Tree(trunk([]), endpoints, directives)
157
-
158
- tree.merge(trunk([node('/pots', [method('GET')])]), {
159
- namespace: 'default',
160
- component: 'pots'
161
- })
162
-
163
- assert.deepEqual(Object.keys((await describe(tree, request)).routes), [])
164
- })
165
-
166
- it('should sort, because branches merge in the order their tenants answer', async () => {
167
- const tree = new Tree(
168
- trunk([node('/zed', [method('GET')]), node('/alpha', [method('GET')])]),
169
- endpoints,
170
- directives
171
- )
172
-
173
- assert.deepEqual(Object.keys((await describe(tree, request)).routes), ['/alpha', '/zed'])
174
- })
175
- })
@@ -1,77 +0,0 @@
1
- import { describing } from '../Introspection.js'
2
- import { template } from '../RPC/names.js'
3
- import { variables } from '../RTD/segment.js'
4
- import { guarded, resource, type Described } from '../directives/help/index.js'
5
- import type * as http from '../HTTP/index.js'
6
- import type { Tree } from '../RTD/index.js'
7
- import type { Introspection } from '../Introspection.js'
8
-
9
- /**
10
- * Every route in the tree this caller may reach, keyed by the template it answers at, and
11
- * each described exactly as `OPTIONS` on that path describes it — so a key can be taken
12
- * from the answer and sent back as a request.
13
- *
14
- * A route a name cannot spell is here, unlike at `/.rpc` and `/.mcp`: HTTP addresses a
15
- * route by its path, so leaving one out would make this disagree with the router. A
16
- * resource no method of which this caller may reach is not here at all — `OPTIONS` answers
17
- * `403` to one, and an empty entry would still say it exists.
18
- *
19
- * Sorted, because a branch is merged whenever its tenant answers and two replicas would
20
- * otherwise order the same tree differently. Verbs keep the order they were declared in,
21
- * which is the order `OPTIONS` answers them in.
22
- */
23
- export async function describe(tree: Tree, request: http.Context): Promise<Discovered> {
24
- const context = describing(request)
25
- const routes = new Map<string, Mounted>()
26
-
27
- /*
28
- * Sequentially: there is no I/O to overlap — an endpoint's own description is read once
29
- * and memoized — so awaiting the whole tree at once would only allocate every clone of
30
- * it at the same moment.
31
- */
32
- for (const { segments, verb, method } of tree.walk()) {
33
- const introspection = await method.explain(context, variables(segments))
34
-
35
- if (introspection === null) continue
36
-
37
- const route = template(segments)
38
- let mounted = routes.get(route)
39
-
40
- if (mounted === undefined) {
41
- mounted = { described: resource(method.directives), methods: {} }
42
- routes.set(route, mounted)
43
- }
44
-
45
- // two declarations can walk to one template — `/a/b` and `/a: { /b: }` — and the walk
46
- // is in the order `match` tries them, so the first is the one a request would reach
47
- mounted.methods[verb] ??= introspection
48
- }
49
-
50
- const described: Record<string, Resource> = {}
51
-
52
- for (const route of Array.from(routes.keys()).sort()) {
53
- const { described: stated, methods } = routes.get(route)!
54
-
55
- // what the resource is, beside the methods it serves; a verb is upper case and cannot
56
- // collide with either key
57
- described[route] = { ...stated, ...guarded(methods), ...methods }
58
- }
59
-
60
- return { routes: described }
61
- }
62
-
63
- /** What the tree answers. An object, so that what is said of the whole of it has somewhere to go. */
64
- export interface Discovered {
65
- routes: Record<string, Resource>
66
- }
67
-
68
- /** What one resource is, and what it serves; a verb is upper case, and nothing else here is. */
69
- export interface Resource extends Described {
70
- [verb: string]: unknown
71
- }
72
-
73
- /** One route template as the walk found it, before the two are answered as one. */
74
- interface Mounted {
75
- described: Described | null
76
- methods: Record<string, Introspection>
77
- }
@@ -1,33 +0,0 @@
1
- import Negotiator from 'negotiator'
2
- import { types } from '../HTTP/formats/index.js'
3
- import { DISCOVERY } from '../const.js'
4
- import type { Context, OutgoingMessage } from '../HTTP/index.js'
5
-
6
- /** What a browser asks for, and what nothing else here answers with. */
7
- const HTML = 'text/html'
8
-
9
- /**
10
- * Where a browser that asked for the trunk is sent. An application serves what it declares,
11
- * and `/` is usually not one of those — a person who typed the address into a browser is
12
- * looking for something to look at, and the page is the only thing here that is one.
13
- *
14
- * A client that asked for something in particular gets what it asked for: only an `accept`
15
- * that prefers a page, or one that names no preference at all, is sent here. The second is
16
- * what an unfurler sends — several ask for anything, and a link to an application would
17
- * otherwise show nothing — and what `curl` sends, which the page serves no worse than the
18
- * `405` it used to get.
19
- */
20
- export function looking(context: Context): OutgoingMessage | null {
21
- if (context.request.method !== 'GET' || context.procedural) return null
22
-
23
- const accept = context.request.headers.accept
24
-
25
- if (accept !== undefined && accept.trim() !== ANYTHING) {
26
- if (new Negotiator(context.request).mediaType([...types, HTML]) !== HTML) return null
27
- }
28
-
29
- return { status: 302, headers: new Headers({ location: DISCOVERY + '/' }) }
30
- }
31
-
32
- /** An `accept` that names nothing, which is the same as naming none. */
33
- const ANYTHING = '*/*'
@@ -1,67 +0,0 @@
1
- import { describe, it } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { Endpoint } from './Endpoint.js'
5
- import { Mapping } from './Mapping.js'
6
- import type { Remote } from '@toa.io/core'
7
- import type { Parameter } from './RTD/index.js'
8
-
9
- /**
10
- * What `Remote.explain` answers is the contract's own object, the same one every time and
11
- * on every route that mounts the endpoint — which is what this stands in for.
12
- */
13
- function remote(): Promise<Remote> {
14
- const explanation = {
15
- input: {
16
- type: 'object',
17
- properties: {
18
- a: { type: 'string' },
19
- b: { type: 'string' }
20
- },
21
- required: ['a', 'b']
22
- },
23
- output: null
24
- }
25
-
26
- return Promise.resolve({
27
- explain: async () => explanation
28
- } as unknown as Remote)
29
- }
30
-
31
- const endpoint = (discovery: Promise<Remote>): Endpoint =>
32
- new Endpoint('parameters', Mapping.create(), discovery)
33
-
34
- const variable: Parameter[] = [{ name: 'a', value: 'a1b2' }]
35
-
36
- describe('explain', () => {
37
- it('should state a route variable as the route, not as the input', async () => {
38
- const introspection = await endpoint(remote()).explain(variable)
39
-
40
- assert.deepEqual(Object.keys(introspection.route ?? {}), ['a'])
41
- assert.deepEqual(Object.keys((introspection.input as any).properties), ['b'])
42
- assert.deepEqual((introspection.input as any).required, ['b'])
43
- })
44
-
45
- it('should leave the operation for the next route that mounts it', async () => {
46
- const discovery = remote()
47
-
48
- await endpoint(discovery).explain(variable)
49
-
50
- // a second route on the same endpoint, taking no variable of its own
51
- const introspection = await endpoint(discovery).explain([])
52
-
53
- assert.deepEqual(Object.keys((introspection.input as any).properties), ['a', 'b'])
54
- assert.deepEqual((introspection.input as any).required, ['a', 'b'])
55
- })
56
-
57
- it('should answer a copy, so what one caller narrows the next still sees', async () => {
58
- const one = endpoint(remote())
59
- const first = await one.explain(variable)
60
-
61
- delete (first.input as any).properties.b
62
-
63
- const second = await one.explain(variable)
64
-
65
- assert.deepEqual(Object.keys((second.input as any).properties), ['b'])
66
- })
67
- })
@@ -1,157 +0,0 @@
1
- import { Readable } from 'node:stream'
2
- import { Mapping } from './Mapping.js'
3
- import { take } from './Introspection.js'
4
- import { parse } from './directives/cache/etag.js'
5
- import * as http from './HTTP/index.js'
6
- import type { Introspection, Schema } from './Introspection.js'
7
- import type { Remote } from '@toa.io/core'
8
- import type { Remotes } from './Remotes.js'
9
- import type { Context } from './Context.js'
10
- import type * as RTD from './RTD/index.js'
11
-
12
- export class Endpoint implements RTD.Endpoint {
13
- private readonly endpoint: string
14
- private readonly mapping: Mapping
15
- private readonly discovery: Promise<Remote>
16
- private remote: Remote | null = null
17
-
18
- /** What the operation says, with what the route takes already split out of it. */
19
- private introspection: Introspection | null = null
20
-
21
- public constructor(endpoint: string, mapping: Mapping, discovery: Promise<Remote>) {
22
- this.endpoint = endpoint
23
- this.mapping = mapping
24
- this.discovery = discovery
25
- }
26
-
27
- public async call(
28
- context: http.Context,
29
- parameters: RTD.Parameter[]
30
- ): Promise<http.OutgoingMessage> {
31
- const body = await context.body()
32
- const query = this.query(context)
33
- const request = this.mapping.fit(body, query, parameters)
34
-
35
- this.remote ??= await this.discovery
36
-
37
- const reply = await this.remote.invoke(this.endpoint, request)
38
-
39
- if (reply instanceof Error) throw new http.UnprocessableEntity(reply)
40
-
41
- const message: http.OutgoingMessage = { body: reply }
42
-
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
46
-
47
- const modified = reply.UPDATED ?? reply.CREATED
48
-
49
- if (modified !== undefined) message.modified = modified
50
- }
51
-
52
- return message
53
- }
54
-
55
- public selection(): Record<string, Schema> | null {
56
- return this.mapping.selection()
57
- }
58
-
59
- public async explain(parameters: RTD.Parameter[]): Promise<Introspection> {
60
- this.introspection ??= await this.introspect(parameters)
61
-
62
- // what a directive narrows is this caller's answer, not the next caller's
63
- return structuredClone(this.introspection)
64
- }
65
-
66
- /**
67
- * `Remote.explain` answers the contract's own object, whose `input` is the manifest's by
68
- * reference. What follows takes properties out of it, and two routes mounting one endpoint
69
- * share one remote — so the copy is what keeps the second from describing what the first
70
- * took away.
71
- */
72
- private async introspect(parameters: RTD.Parameter[]): Promise<Introspection> {
73
- this.remote ??= await this.discovery
74
-
75
- const operation = structuredClone(await this.remote.explain(this.endpoint))
76
-
77
- // what the operation states it is, is the Introspection's to read and not a resource's:
78
- // an operation is written without knowledge of any route, and the same one mounted twice
79
- // is two methods. What a method states is what its route states, which `mcp:tool` gives.
80
- delete operation.description
81
-
82
- let route: Record<string, Schema> | null = null
83
-
84
- // a variable the operation names is taken by the path, so it is not the body's to send
85
- for (const parameter of parameters) {
86
- const schema = take(operation, parameter.name)
87
-
88
- if (schema === undefined) continue
89
-
90
- route ??= {}
91
- route[parameter.name] = schema
92
- }
93
-
94
- const query = this.mapping.explain(operation)
95
- const introspection: Introspection = {}
96
-
97
- if (route !== null) introspection.route = route
98
-
99
- if (query !== null) introspection.query = query
100
-
101
- Object.assign(introspection, operation)
102
-
103
- return introspection
104
- }
105
-
106
- public async close(): Promise<void> {
107
- this.remote ??= await this.discovery
108
-
109
- await this.remote.disconnect(INTERRUPT)
110
- }
111
-
112
- private query(context: http.Context): http.Query {
113
- const query: http.Query = Object.fromEntries(context.url.searchParams)
114
- const etag = context.request.headers['if-match']
115
-
116
- if (etag !== undefined && this.mapping.queryable) query.version = this.version(etag)
117
-
118
- return query
119
- }
120
-
121
- private version(etag: string): number {
122
- const version = parse(etag)
123
-
124
- if (version === null) throw new http.BadRequest('Invalid ETag')
125
-
126
- return version
127
- }
128
- }
129
-
130
- export class EndpointsFactory implements RTD.EndpointsFactory {
131
- private readonly remotes: Remotes
132
-
133
- public constructor(remotes: Remotes) {
134
- this.remotes = remotes
135
- }
136
-
137
- public create(method: RTD.syntax.Method, context: Context): Endpoint {
138
- if (method.mapping === undefined)
139
- throw new Error('Cannot create Endpoint without mapping')
140
-
141
- const mapping = Mapping.create(method.mapping.query, method.mapping.paged)
142
-
143
- const branch = context.extension
144
-
145
- const namespace = method.mapping.namespace ?? branch?.namespace
146
- const component = method.mapping.component ?? branch?.component
147
-
148
- if (namespace === undefined || component === undefined)
149
- throw new Error('Annotation endpoints must be fully qualified')
150
-
151
- const discovery = this.remotes.discover(namespace, component, branch?.version)
152
-
153
- return new Endpoint(method.mapping.endpoint, mapping, discovery)
154
- }
155
- }
156
-
157
- const INTERRUPT = true
package/source/Factory.ts DELETED
@@ -1,42 +0,0 @@
1
- import { createHash } from 'node:crypto'
2
- import { Tenant } from './Tenant.js'
3
- import { CHANNEL } from './const.js'
4
- import type { Branch } from './Branch.js'
5
- import type { syntax } from './RTD/index.js'
6
- import type { Broadcast } from './Gateway.js'
7
- import type { Connector, Locator } from '@toa.io/core'
8
- import type { extensions } from '@toa.io/core/types'
9
-
10
- export class Factory implements extensions.Factory {
11
- private readonly host: Host
12
-
13
- public constructor(host: Host) {
14
- this.host = host
15
- }
16
-
17
- public async tenant(locator: Locator, node: syntax.Node): Promise<Connector> {
18
- const broadcast: Broadcast = await this.host.broadcast(CHANNEL, locator.id)
19
- const hash = createHash('sha256').update(JSON.stringify(node)).digest('hex')
20
-
21
- // no timestamp: the tenant stamps each announcement with its own start time
22
- const branch: Omit<Branch, 'timestamp'> = {
23
- // boot only ever hands a tenant a component's locator, which always has a namespace
24
- namespace: locator.namespace!,
25
- component: locator.name,
26
- isolated: locator.namespace === 'identity',
27
- node,
28
- version: hash
29
- }
30
-
31
- return new Tenant(broadcast, branch)
32
- }
33
-
34
- public async service(): Promise<Connector | null> {
35
- const { service } = await import('./service.js')
36
-
37
- return await service(this.host)
38
- }
39
- }
40
-
41
- // eslint-disable-next-line @typescript-eslint/consistent-type-imports
42
- export type Host = extensions.Host