@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,248 +0,0 @@
1
- import { console, type SpanOptions } from 'openspan'
2
- import type { Context, OutgoingMessage, Options } from './HTTP/index.js'
3
- import type { Remotes } from './Remotes.js'
4
- import type { Host } from './Factory.js'
5
- import type { Output } from './io.js'
6
- import type { Introspection } from './Introspection.js'
7
- import type * as RTD from './RTD/index.js'
8
-
9
- export class Directives implements RTD.Directives {
10
- private readonly sets: RTD.DirectiveSet[]
11
-
12
- /** the span of a stage depends only on the set, so it is built once per route */
13
- private readonly spans: Spans[]
14
-
15
- public constructor(sets: RTD.DirectiveSet[]) {
16
- this.sets = sets
17
- this.spans = sets.map((set) => ({
18
- precall: options(set, 'precall'),
19
- settle: options(set, 'settle'),
20
- explain: options(set, 'explain')
21
- }))
22
- }
23
-
24
- public declared<T>(family: string): T[] | undefined {
25
- return this.sets.find((set) => set.family.name === family)?.directives as
26
- | T[]
27
- | undefined
28
- }
29
-
30
- public async precall(context: Context, parameters: RTD.Parameter[]): Promise<Output> {
31
- let output = null
32
-
33
- for (let i = 0; i < this.sets.length; i++) {
34
- const set = this.sets[i]
35
-
36
- if (set.family.precall === undefined) continue
37
-
38
- const out = await console.span(
39
- this.spans[i].precall,
40
- async () => await set.family.precall!(set.directives, context, parameters)
41
- )
42
-
43
- if (out === null) continue
44
-
45
- if (output !== null) throw new Error('Multiple precall directives responded')
46
- else output = out
47
- }
48
-
49
- return output
50
- }
51
-
52
- /**
53
- * What the method says about itself, as its directives leave it. Each family is given
54
- * what the one before it returned, and the first to refuse ends it: a method this caller
55
- * cannot reach is not described at all.
56
- */
57
- public async explain(
58
- context: Context,
59
- introspection: Introspection
60
- ): Promise<Introspection | null> {
61
- let described: Introspection = introspection
62
-
63
- for (let i = 0; i < this.sets.length; i++) {
64
- const set = this.sets[i]
65
-
66
- if (set.family.explain === undefined) continue
67
-
68
- const next = await console.span(
69
- this.spans[i].explain,
70
- async () => await set.family.explain!(set.directives, context, described)
71
- )
72
-
73
- if (next === null) return null
74
-
75
- described = next
76
- }
77
-
78
- return described
79
- }
80
-
81
- public async settle(context: Context, response: OutgoingMessage): Promise<void> {
82
- for (let i = 0; i < this.sets.length; i++) {
83
- const set = this.sets[i]
84
-
85
- if (set.family.settle !== undefined)
86
- await console.span(
87
- this.spans[i].settle,
88
- async () => await set.family.settle!(set.directives, context, response)
89
- )
90
- }
91
- }
92
-
93
- public dispose(): void {
94
- for (const set of this.sets) set.family.dispose?.(set.directives)
95
- }
96
- }
97
-
98
- export class DirectivesFactory implements RTD.DirectiveFactory {
99
- private readonly remotes: Remotes
100
- private readonly families: Record<string, RTD.DirectiveFamily> = {}
101
- private readonly mandatory: string[] = []
102
- private readonly instances: Directives[] = []
103
-
104
- /** The request-scoped stages, in registration order, with the spans they run in. */
105
- private readonly stages: Stage[] = []
106
-
107
- // eslint-disable-next-line max-params
108
- public constructor(
109
- families: RTD.DirectiveFamily[],
110
- remotes: Remotes,
111
- host: Host,
112
- options: Options
113
- ) {
114
- for (const family of families) {
115
- family.mount?.(host, options)
116
- this.families[family.name] = family
117
-
118
- if (family.mandatory) this.mandatory.push(family.name)
119
-
120
- this.stages.push({
121
- family,
122
- preflight: { name: `${family.name} preflight` },
123
- depart: { name: `${family.name} depart` }
124
- })
125
- }
126
-
127
- this.remotes = remotes
128
- }
129
-
130
- /**
131
- * Request-scoped, before anything is routed, so no directives are passed: a family
132
- * answers here only for what it does on its own behalf.
133
- */
134
- public async preflight(context: Context): Promise<void> {
135
- for (const stage of this.stages)
136
- if (stage.family.preflight !== undefined)
137
- await console.span(stage.preflight, async () => {
138
- await stage.family.preflight!(context)
139
- })
140
- }
141
-
142
- /** Request-scoped, on the message going back. */
143
- public async depart(context: Context, response: OutgoingMessage): Promise<void> {
144
- for (const stage of this.stages)
145
- if (stage.family.depart !== undefined)
146
- await console.span(stage.depart, async () => {
147
- await stage.family.depart!(context, response)
148
- })
149
- }
150
-
151
- public create(declarations: RTD.syntax.Directive[], route: string = ''): Directives {
152
- const groups: Record<string, any> = {}
153
- const mandatory = new Set(this.mandatory)
154
-
155
- const names: Record<string, string[]> = {}
156
-
157
- for (const declaration of declarations) {
158
- const family = this.families[declaration.family]
159
-
160
- if (family === undefined)
161
- throw new Error(`Directive family '${declaration.family}' is not found`)
162
-
163
- const directive = family.create(
164
- declaration.name,
165
- declaration.value,
166
- this.remotes,
167
- route
168
- )
169
-
170
- groups[family.name] ??= []
171
- groups[family.name].push(directive)
172
- names[family.name] ??= []
173
- names[family.name].push(`${declaration.family}:${declaration.name}`)
174
- mandatory.delete(family.name)
175
- }
176
-
177
- const sets: RTD.DirectiveSet[] = []
178
-
179
- for (const family of mandatory)
180
- sets.push({
181
- family: this.families[family],
182
- directives: [],
183
- names: []
184
- })
185
-
186
- for (const [family, directives] of Object.entries(groups))
187
- sets.push({
188
- family: this.families[family],
189
- directives,
190
- names: names[family]
191
- })
192
-
193
- // Mandatory families run in the order they are registered in, not in the order a
194
- // manifest happens to mention them: `auth` must resolve the identity before `io`
195
- // can key a quota on it, and a request it denies should not reach `io` at all.
196
- // The rest keep the order they were declared in, the sort being stable.
197
- sets.sort((a, b) => this.rank(a.family.name) - this.rank(b.family.name))
198
-
199
- // whatever order a family needs among its own directives is fixed here, not per request
200
- for (const set of sets) set.family.arrange?.(set.directives)
201
-
202
- const directives = new Directives(sets)
203
-
204
- this.instances.push(directives)
205
-
206
- return directives
207
- }
208
-
209
- public inheritable(directive: RTD.syntax.Directive): boolean {
210
- return this.families[directive.family]?.inherited !== false
211
- }
212
-
213
- public dispose(): void {
214
- for (const directives of this.instances) directives.dispose()
215
- }
216
-
217
- /** Mandatory families first, in their own order; everything else keeps its own. */
218
- private rank(family: string): number {
219
- const index = this.mandatory.indexOf(family)
220
-
221
- return index === -1 ? this.mandatory.length : index
222
- }
223
- }
224
-
225
- function options(
226
- set: RTD.DirectiveSet,
227
- stage: 'precall' | 'settle' | 'explain'
228
- ): SpanOptions {
229
- const options: SpanOptions = { name: `${set.family.name} ${stage}` }
230
-
231
- if (set.names !== undefined && set.names.length > 0)
232
- options.attributes = { directives: Array.from(new Set(set.names)).join(' ') }
233
-
234
- return options
235
- }
236
-
237
- interface Spans {
238
- precall: SpanOptions
239
- settle: SpanOptions
240
- explain: SpanOptions
241
- }
242
-
243
- interface Stage {
244
- family: RTD.DirectiveFamily
245
- preflight: SpanOptions
246
- depart: SpanOptions
247
- }
248
-
@@ -1,34 +0,0 @@
1
- import * as http from '../HTTP/index.js'
2
- import { BRANCH_TTL } from '../const.js'
3
- import { describe } from './tree.js'
4
- import type { Tree } from '../RTD/index.js'
5
-
6
- /**
7
- * What an application serves, for every route at once. Each entry is what `OPTIONS` on that
8
- * path answers, so a key taken from here is a request that can be made.
9
- */
10
- export class Explorer {
11
- private readonly tree: Tree
12
-
13
- public constructor(tree: Tree) {
14
- this.tree = tree
15
- }
16
-
17
- public async process(context: http.Context): Promise<http.OutgoingMessage> {
18
- if (context.request.method !== 'OPTIONS')
19
- throw new http.MethodNotAllowed(new Headers({ allow: ALLOW }))
20
-
21
- return {
22
- body: await describe(this.tree, context),
23
- headers: new Headers({
24
- allow: ALLOW,
25
- // it stands until a branch expires, and it is filtered by who asked
26
- 'cache-control': `private, max-age=${BRANCH_TTL / 1000}`,
27
- vary: 'authorization'
28
- })
29
- }
30
- }
31
- }
32
-
33
- /** The verbs of this path, which are not the verbs of the tree it answers with. */
34
- const ALLOW = 'GET, HEAD, OPTIONS'
@@ -1,147 +0,0 @@
1
- import { describe, it } from 'node:test'
2
- import assert from 'node:assert/strict'
3
- import { Readable } from 'node:stream'
4
- import * as path from 'node:path'
5
- import * as fs from 'node:fs'
6
- import * as os from 'node:os'
7
-
8
- import { Site } from './Site.js'
9
- import * as http from '../HTTP/index.js'
10
- import type { Input, Output } from '../io.js'
11
-
12
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'discovery-'))
13
-
14
- fs.mkdirSync(path.join(root, '_app', 'immutable'), { recursive: true })
15
- fs.writeFileSync(path.join(root, 'index.html'), 'the page\n')
16
- fs.writeFileSync(path.join(root, 'favicon.ico'), 'icon')
17
- fs.writeFileSync(path.join(root, '_app', 'immutable', 'asset.js'), 'export {}\n')
18
-
19
- const empty = fs.mkdtempSync(path.join(os.tmpdir(), 'discovery-empty-'))
20
-
21
- const site = new Site(root)
22
-
23
- const input = (url: string, method = 'GET'): Input =>
24
- ({
25
- request: { method, headers: {} },
26
- url: new URL(url, 'http://nex.toa.io')
27
- }) as unknown as Input
28
-
29
- const header = (output: Output, name: string): string | null =>
30
- output?.headers?.get(name) ?? null
31
-
32
- describe('discovery site', () => {
33
- it('should leave a path outside its prefix alone', () => {
34
- assert.equal(site.intercept(input('/')), null)
35
- assert.equal(site.intercept(input('/pots/')), null)
36
- })
37
-
38
- it('should not claim a path that merely starts like its own', () => {
39
- assert.equal(site.intercept(input('/.discoveryable/')), null)
40
- })
41
-
42
- it('should send the bare path to the directory it is', () => {
43
- const output = site.intercept(input('/.discovery'))
44
-
45
- assert.equal(output?.status, 302)
46
- assert.equal(header(output, 'location'), '/.discovery/')
47
- })
48
-
49
- it('should keep the query when it redirects', () => {
50
- const output = site.intercept(input('/.discovery?at=/pots'))
51
-
52
- assert.equal(header(output, 'location'), '/.discovery/?at=/pots')
53
- })
54
-
55
- it('should serve the page', () => {
56
- const output = site.intercept(input('/.discovery/'))
57
-
58
- assert.equal(output?.status, 200)
59
- assert.equal(header(output, 'content-type'), 'text/html; charset=utf-8')
60
- assert.equal(header(output, 'cache-control'), 'no-cache')
61
- })
62
-
63
- it('should always carry a content-type and a stream', () => {
64
- // a stream without one is framed as `multipart/*`, and the page arrives as an envelope
65
- for (const url of ['/.discovery/', '/.discovery/_app/immutable/asset.js']) {
66
- const output = site.intercept(input(url))
67
-
68
- assert.ok(output?.headers?.has('content-type'), url)
69
- assert.ok(output?.body instanceof Readable, url)
70
- }
71
- })
72
-
73
- it('should hold a hashed asset forever and an icon for a day', () => {
74
- assert.equal(
75
- header(site.intercept(input('/.discovery/_app/immutable/asset.js')), 'cache-control'),
76
- 'public, max-age=31536000, immutable'
77
- )
78
- assert.equal(
79
- header(site.intercept(input('/.discovery/favicon.ico')), 'cache-control'),
80
- 'public, max-age=86400'
81
- )
82
- })
83
-
84
- it('should fall back to the page for anything that could be a route', () => {
85
- const output = site.intercept(input('/.discovery/pots/:id'))
86
-
87
- assert.equal(header(output, 'content-type'), 'text/html; charset=utf-8')
88
- })
89
-
90
- it('should refuse an asset that is not there', () => {
91
- // a missing asset is missing, however much a route can look like one
92
- assert.throws(
93
- () => site.intercept(input('/.discovery/_app/immutable/gone.js')),
94
- http.NotFound
95
- )
96
- })
97
-
98
- it('should refuse a path that climbs out of the root', () => {
99
- /*
100
- * An encoded separator is what reaches here: `..` and `%2e%2e` are dot segments and the
101
- * URL parser has already collapsed them, but `%2f` keeps a segment whole through it and
102
- * decodes to one afterwards.
103
- */
104
- for (const url of [
105
- '/.discovery/%2f%2e%2e%2f%2e%2e%2fpackage.json',
106
- '/.discovery/a%2f..%2f..%2fpackage.json',
107
- '/.discovery/%2e%2e%2fpackage.json'
108
- ])
109
- assert.throws(() => site.intercept(input(url)), http.NotFound, url)
110
- })
111
-
112
- it('should never see a dot segment, which the URL parser collapses first', () => {
113
- // `/.discovery/%2e%2e/x` is `/x`, which is not this prefix and not ours to answer
114
- assert.equal(site.intercept(input('/.discovery/%2e%2e/%2e%2e/package.json')), null)
115
- assert.equal(site.intercept(input('/.discovery/../../package.json')), null)
116
- })
117
-
118
- it('should report the length a GET would have returned, and open no stream', () => {
119
- const output = site.intercept(input('/.discovery/', 'HEAD'))
120
-
121
- assert.equal(output?.status, 200)
122
- assert.equal(header(output, 'content-length'), '9')
123
- assert.equal(output?.body, undefined)
124
- })
125
-
126
- it('should leave OPTIONS on the prefix to the tree', () => {
127
- // it needs the identity, which is resolved after this stage
128
- assert.equal(site.intercept(input('/.discovery', 'OPTIONS')), null)
129
- assert.equal(site.intercept(input('/.discovery/', 'OPTIONS')), null)
130
- })
131
-
132
- it('should refuse every other method', () => {
133
- assert.throws(() => site.intercept(input('/.discovery/', 'POST')), http.MethodNotAllowed)
134
- assert.throws(
135
- () => site.intercept(input('/.discovery/favicon.ico', 'OPTIONS')),
136
- http.MethodNotAllowed
137
- )
138
- })
139
-
140
- it('should say so where the page is not built', () => {
141
- const output = new Site(empty).intercept(input('/.discovery/'))
142
-
143
- assert.equal(output?.status, 503)
144
- assert.equal(header(output, 'content-type'), 'text/plain; charset=utf-8')
145
- assert.ok(output?.body instanceof Readable)
146
- })
147
- })
@@ -1,202 +0,0 @@
1
- import * as fs from 'node:fs'
2
- import * as path from 'node:path'
3
- import { Readable } from 'node:stream'
4
- import { console } from 'openspan'
5
- import * as http from '../HTTP/index.js'
6
- import { DISCOVERY } from '../const.js'
7
- import type { Input, Output } from '../io.js'
8
- import type { Interceptor } from '../Interception.js'
9
-
10
- /**
11
- * The page that reads the tree: the directory `ui` builds, and nothing else.
12
- *
13
- * An interceptor rather than an endpoint, for the reason the OAuth documents are one — it
14
- * runs before a credential is resolved. A page is public, and one served after `auth` would
15
- * refuse the client holding a stale token, who is the client most likely to have opened it.
16
- * It is also what keeps `depart` off these replies: a re-issued credential sets `no-store`,
17
- * which would take the build hash off every asset that carries one.
18
- *
19
- * It claims the whole prefix, so that nothing under it reaches the router — a crawler
20
- * asking for assets that are not there would otherwise have every one of them counted as a
21
- * route that has gone missing, and ping discovery about it.
22
- *
23
- * `OPTIONS` on the prefix itself is the exception it lets through: the tree is what answers
24
- * there, and that needs the identity this stage does not have yet.
25
- */
26
- export class Site implements Interceptor {
27
- public readonly name = 'discovery'
28
-
29
- /** What a test points at a fixture; the build otherwise. */
30
- private readonly override: string | undefined
31
- private root: string
32
-
33
- public constructor(root?: string) {
34
- this.override = root
35
- this.root = root ?? site()
36
- }
37
-
38
- /**
39
- * Resolved here rather than at construction because this is a module singleton, built
40
- * when the module loads and before anything has said where the page is. Said once, too,
41
- * because a page that is not built is otherwise a `503` per request and nothing else.
42
- */
43
- public mount(): void {
44
- this.root = this.override ?? site()
45
-
46
- if (!isFile(path.join(this.root, 'index.html')))
47
- console.warn('Discovery UI is not built', { root: this.root })
48
- }
49
-
50
- public intercept(input: Input): Output {
51
- const { pathname } = input.url
52
-
53
- if (pathname !== DISCOVERY && !pathname.startsWith(DISCOVERY + '/')) return null
54
-
55
- // the prefix itself, as opposed to something under it
56
- const bare = pathname === DISCOVERY || pathname === DISCOVERY + '/'
57
- const method = input.request.method
58
-
59
- if (method !== 'GET' && method !== 'HEAD') {
60
- // the tree answers here, and it needs the identity this stage does not have yet
61
- if (bare && method === 'OPTIONS') return null
62
-
63
- throw new http.MethodNotAllowed(
64
- new Headers({ allow: bare ? 'GET, HEAD, OPTIONS' : 'GET, HEAD' })
65
- )
66
- }
67
-
68
- // the page is a directory, and every asset it names is relative to it
69
- if (pathname === DISCOVERY)
70
- return {
71
- status: 302,
72
- headers: new Headers({ location: DISCOVERY + '/' + input.url.search })
73
- }
74
-
75
- const file = this.resolve(pathname)
76
-
77
- if (file === null) throw new http.NotFound()
78
-
79
- return this.send(file, method)
80
- }
81
-
82
- /**
83
- * The file a request lands on, or `null` when nothing does. A path that exists is served
84
- * as it is; anything else that could be a route falls back to the page, because the
85
- * client router — not this server — knows what routes there are.
86
- */
87
- private resolve(pathname: string): string | null {
88
- /*
89
- * Decoded after the prefix is off, so that an encoded separator cannot smuggle a
90
- * segment past the test that put us here. A dot segment never arrives — `..` and
91
- * `%2e%2e` alike are collapsed while the URL is parsed — but `%2f` survives that and
92
- * decodes to a separator here, which is what the guard below is for.
93
- */
94
- const relative = decode(pathname.slice(DISCOVERY.length))
95
-
96
- if (relative === null || relative.includes('\0')) return null
97
-
98
- const file = path.join(this.root, relative)
99
-
100
- if (file !== this.root && !file.startsWith(this.root + path.sep)) return null
101
-
102
- if (isFile(file)) return file
103
-
104
- /*
105
- * A missing asset is missing, but a route can look like one. What this server would
106
- * have served is what it knows how to serve, so anything else is a route and falls
107
- * back to the page — as does anything ending in a slash, which is no name for a file.
108
- */
109
- const asset = !relative.endsWith('/') && path.extname(relative) in TYPES
110
-
111
- return asset ? null : path.join(this.root, 'index.html')
112
- }
113
-
114
- /**
115
- * Always with a `content-type` of its own: a stream without one is framed as
116
- * `multipart/*` and the page arrives as an envelope of JSON-encoded buffers.
117
- */
118
- private send(file: string, method: string): Output {
119
- const stats = fs.statSync(file, { throwIfNoEntry: false })
120
-
121
- if (stats === undefined)
122
- return {
123
- status: 503,
124
- headers: new Headers({ 'content-type': 'text/plain; charset=utf-8' }),
125
- body: Readable.from([Buffer.from(NOT_BUILT)])
126
- }
127
-
128
- const headers = new Headers({
129
- 'content-type': TYPES[path.extname(file)] ?? 'application/octet-stream',
130
- 'content-length': String(stats.size),
131
- 'cache-control': caching(path.relative(this.root, file))
132
- })
133
-
134
- // a HEAD reply carries no body but reports the length a GET would have returned; the
135
- // HTTP/2 layer does not drop one written to it, so none is opened
136
- if (method === 'HEAD') return { status: 200, headers }
137
-
138
- return { status: 200, headers, body: fs.createReadStream(file) }
139
- }
140
- }
141
-
142
- const NOT_BUILT = 'The discovery UI is not built. Run `npm run build:ui`.\n'
143
-
144
- function decode(pathname: string): string | null {
145
- try {
146
- return decodeURIComponent(pathname)
147
- } catch {
148
- return null
149
- }
150
- }
151
-
152
- function isFile(file: string): boolean {
153
- return fs.statSync(file, { throwIfNoEntry: false })?.isFile() === true
154
- }
155
-
156
- /**
157
- * Where `npm run build:ui` puts the page. Two levels up because this module is a directory
158
- * deeper than `source` itself, and `transpiled` mirrors that — so it resolves the same from
159
- * either. The variable is the features', which run against a fixture rather than a build.
160
- */
161
- function site(): string {
162
- return (
163
- process.env.__TESTING_EXPOSITION_DISCOVERY_ROOT ??
164
- path.resolve(import.meta.dirname, '..', '..', 'ui', 'dist')
165
- )
166
- }
167
-
168
- /** Assets under this prefix carry their build hash in the name. */
169
- const IMMUTABLE = path.join('_app', 'immutable')
170
- const FOREVER = 'public, max-age=31536000, immutable'
171
-
172
- /** The icons: named without a hash, so they are re-read, but rarely. */
173
- const ICONS = new Set(['favicon.ico', 'favicon-96x96.png', 'apple-touch-icon.png'])
174
- const DAY = 'public, max-age=86400'
175
-
176
- /**
177
- * How long what is served may be held. The page is never cached — it names the assets, and
178
- * their names carry the build. An icon is named for what it is rather than for its content,
179
- * so it is asked about again, but not on every page load.
180
- */
181
- function caching(relative: string): string {
182
- if (relative.startsWith(IMMUTABLE)) return FOREVER
183
-
184
- return ICONS.has(relative) ? DAY : 'no-cache'
185
- }
186
-
187
- const TYPES: Record<string, string> = {
188
- '.css': 'text/css; charset=utf-8',
189
- '.html': 'text/html; charset=utf-8',
190
- '.ico': 'image/x-icon',
191
- '.jpg': 'image/jpeg',
192
- '.js': 'text/javascript; charset=utf-8',
193
- '.json': 'application/json; charset=utf-8',
194
- '.map': 'application/json; charset=utf-8',
195
- '.png': 'image/png',
196
- '.svg': 'image/svg+xml',
197
- '.txt': 'text/plain; charset=utf-8',
198
- '.webmanifest': 'application/manifest+json',
199
- '.webp': 'image/webp',
200
- '.woff': 'font/woff',
201
- '.woff2': 'font/woff2'
202
- }
@@ -1,3 +0,0 @@
1
- export { Explorer } from './Explorer.js'
2
- export { Site } from './Site.js'
3
- export { looking } from './trunk.js'