@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,66 +0,0 @@
1
- import { documents, type Documents } from './documents.js'
2
- import type * as http from '../../HTTP/index.js'
3
- import type { Input, Output } from '../../io.js'
4
- import type { Interceptor } from '../../Interception.js'
5
-
6
- /**
7
- * What a client reads before it can authenticate: where the authorization server is, and
8
- * what this resource expects. Both are fixed paths a specification names, both must be
9
- * answered to anyone, and both are a function of the annotation alone — nothing is read to
10
- * build them, so they are built once per authority and served as they are.
11
- *
12
- * An interceptor rather than a route because `auth` runs before any directive: a client
13
- * re-reading discovery while holding a stale token would have it verified, and then be
14
- * refused a document that has to be public.
15
- */
16
- export class Discovery implements Interceptor {
17
- /**
18
- * A map, because the key is the request's authority and an unconfigured host is passed
19
- * through as itself: `Host: constructor` names something a plain object answers on its own.
20
- */
21
- private readonly authorities = new Map<string, Documents>()
22
-
23
- public mount(options: http.Options): void {
24
- this.authorities.clear()
25
-
26
- if (options.oauth === undefined) return
27
-
28
- /*
29
- * `https` always: RFC 8414 has an issuer be one, and OAuth 2.1 has every endpoint of an
30
- * authorization server be one — the loopback exception is a client's redirect URI, not
31
- * a server's address. A gateway served without TLS has no authorization server a client
32
- * may use, and naming it `http` would hide that behind documents none should accept.
33
- *
34
- * The host is the configured one, not the request's, which is the client's to write: a
35
- * forged one would have these documents name someone else's token endpoint.
36
- */
37
- for (const [authority, host] of Object.entries(options.authorities))
38
- this.authorities.set(authority, documents(`https://${host}`, options.oauth))
39
- }
40
-
41
- public reset(): void {
42
- this.authorities.clear()
43
- }
44
-
45
- public intercept(input: Input): Output {
46
- const known = this.authorities.get(input.authority)
47
-
48
- if (known === undefined) return null
49
-
50
- // every reply, not just a document's: the challenge is what points a client here
51
- input.pipelines.response.push((response) => {
52
- if (response.status !== UNAUTHORIZED) return
53
-
54
- response.headers ??= new Headers()
55
- response.headers.set('www-authenticate', known.challenge(input.url.pathname))
56
- })
57
-
58
- const body = known.read(input.url.pathname)
59
-
60
- if (body === undefined) return null
61
-
62
- return { body, headers: new Headers({ 'cache-control': 'public, max-age=3600' }) }
63
- }
64
- }
65
-
66
- const UNAUTHORIZED = 401
@@ -1,110 +0,0 @@
1
- import type { OAuth } from '../../Annotation.js'
2
-
3
- /** The discovery documents of one authority, and the challenge that points at them. */
4
- export interface Documents {
5
- /** The document a path names, or nothing when it names none. */
6
- read: (pathname: string) => object | undefined
7
-
8
- /** `WWW-Authenticate` for a request to this path, which names the resource it failed at. */
9
- challenge: (pathname: string) => string
10
- }
11
-
12
- export function documents(issuer: string, oauth: OAuth): Documents {
13
- const server = authorizationServer(issuer, oauth)
14
- const resources = protectedResources(issuer, oauth)
15
- const scope = oauth.scopes === undefined ? '' : `, scope="${oauth.scopes.join(' ')}"`
16
-
17
- function read(pathname: string): object | undefined {
18
- if (pathname === AUTHORIZATION_SERVER || pathname === OPENID_CONFIGURATION)
19
- return server
20
-
21
- if (pathname.startsWith(PROTECTED_RESOURCE))
22
- return resources.get(pathname.slice(PROTECTED_RESOURCE.length))
23
-
24
- return undefined
25
- }
26
-
27
- function challenge(pathname: string): string {
28
- return `Bearer resource_metadata="${issuer}${PROTECTED_RESOURCE}${suffix(oauth, pathname)}"${scope}`
29
- }
30
-
31
- return { read, challenge }
32
- }
33
-
34
- /**
35
- * RFC 8414. `authorization_endpoint` is the application's own page and may be anywhere;
36
- * everything else this extension serves. Both flags are load-bearing for a client that
37
- * prefers Client ID Metadata Documents: without either it falls back to registration.
38
- */
39
- function authorizationServer(issuer: string, oauth: OAuth): object {
40
- const metadata: Record<string, unknown> = {
41
- issuer,
42
- authorization_endpoint: oauth.authorize,
43
- token_endpoint: `${issuer}${TOKEN}`,
44
- response_types_supported: ['code'],
45
- grant_types_supported: ['authorization_code'],
46
- code_challenge_methods_supported: ['S256'],
47
- token_endpoint_auth_methods_supported: ['none'],
48
- client_id_metadata_document_supported: true,
49
- authorization_response_iss_parameter_supported: true
50
- }
51
-
52
- if (oauth.registration === 'open')
53
- metadata.registration_endpoint = `${issuer}${REGISTRATION}`
54
-
55
- if (oauth.scopes !== undefined) metadata.scopes_supported = oauth.scopes
56
-
57
- return metadata
58
- }
59
-
60
- /**
61
- * RFC 9728, keyed by the path the well-known segment is followed by: a client resolving
62
- * `https://host/mcp` reads `/.well-known/oauth-protected-resource/mcp`, and one that names
63
- * no path reads the document at the origin.
64
- */
65
- function protectedResources(issuer: string, oauth: OAuth): Map<string, object> {
66
- const map = new Map<string, object>()
67
-
68
- for (const path of oauth.resources ?? [])
69
- map.set(canonical(path), resource(issuer, canonical(path), oauth))
70
-
71
- map.set('', resource(issuer, '', oauth))
72
-
73
- return map
74
- }
75
-
76
- function resource(issuer: string, path: string, oauth: OAuth): object {
77
- const metadata: Record<string, unknown> = {
78
- resource: issuer + path,
79
- authorization_servers: [issuer],
80
- bearer_methods_supported: ['header']
81
- }
82
-
83
- if (oauth.scopes !== undefined) metadata.scopes_supported = oauth.scopes
84
-
85
- return metadata
86
- }
87
-
88
- /** The document a request to this path was refused against: the longest resource holding it. */
89
- function suffix(oauth: OAuth, pathname: string): string {
90
- let longest = ''
91
-
92
- for (const path of oauth.resources ?? [])
93
- if (pathname.startsWith(path) && path.length > longest.length) longest = path
94
-
95
- return canonical(longest)
96
- }
97
-
98
- /**
99
- * A resource is identified without its trailing slash — the form MCP asks for — while a
100
- * route is declared with one, so `/mcp/` identifies `…/mcp`.
101
- */
102
- function canonical(path: string): string {
103
- return path.endsWith('/') ? path.slice(0, -1) : path
104
- }
105
-
106
- const AUTHORIZATION_SERVER = '/.well-known/oauth-authorization-server'
107
- const PROTECTED_RESOURCE = '/.well-known/oauth-protected-resource'
108
- const OPENID_CONFIGURATION = '/.well-known/openid-configuration'
109
- const TOKEN = '/identity/grants/'
110
- const REGISTRATION = '/identity/clients/'
@@ -1,3 +0,0 @@
1
- import { Discovery } from './Discovery.js'
2
-
3
- export const discovery = new Discovery()
@@ -1,23 +0,0 @@
1
- import assert from 'node:assert'
2
- import { Directive } from './Directive.js'
3
- import type { Output } from '../../io.js'
4
-
5
- export class Context extends Directive {
6
- public readonly targeted = false
7
- public readonly storage: string
8
-
9
- public constructor(value: unknown) {
10
- super()
11
-
12
- assert.ok(
13
- typeof value === 'string',
14
- "Directive 'octets:context' must must be a string"
15
- )
16
-
17
- this.storage = value
18
- }
19
-
20
- public async apply(): Promise<Output> {
21
- return null
22
- }
23
- }
@@ -1,96 +0,0 @@
1
- import { Readable } from 'stream'
2
- import { NotFound } from '../../HTTP/index.js'
3
- import * as schemas from './schemas.js'
4
- import { Workflow } from './workflows/index.js'
5
- import { Directive } from './Directive.js'
6
- import type { Parameter } from '../../RTD/index.js'
7
- import type { Unit, Location } from './workflows/index.js'
8
- import type { Maybe } from '@toa.io/core/types'
9
- import type { Component } from '@toa.io/core'
10
- import type { Output } from '../../io.js'
11
- import type { Input } from './types.js'
12
- import type { Remotes } from '../../Remotes.js'
13
- import type { Entry } from '@toa.io/extensions.storages'
14
-
15
- export class Delete extends Directive {
16
- public readonly targeted = true
17
-
18
- private readonly workflow?: Workflow
19
- private readonly discovery: Promise<Component>
20
- private storage!: Component
21
-
22
- public constructor(
23
- options: Options | null,
24
- discovery: Promise<Component>,
25
- remotes: Remotes
26
- ) {
27
- super()
28
- schemas.remove.validate(options)
29
-
30
- if (options?.workflow !== undefined)
31
- this.workflow = new Workflow(options.workflow, remotes)
32
-
33
- this.discovery = discovery
34
- }
35
-
36
- public async apply(
37
- storage: string,
38
- input: Input,
39
- parameters: Parameter[]
40
- ): Promise<Output> {
41
- this.storage ??= await this.discovery
42
-
43
- const output: Output = {}
44
-
45
- if (this.workflow !== undefined) {
46
- const entry = await this.storage.invoke<Maybe<Entry>>('head', {
47
- input: {
48
- storage,
49
- path: input.request.url
50
- }
51
- })
52
-
53
- if (entry instanceof Error) throw new NotFound()
54
-
55
- output.status = 202
56
- output.body = Readable.from(this.execute(input, storage, entry, parameters))
57
- } else await this.delete(storage, input)
58
-
59
- return output
60
- }
61
-
62
- private async delete(storage: string, input: Input): Promise<void> {
63
- await this.storage.invoke('delete', {
64
- input: {
65
- storage,
66
- path: input.request.url
67
- }
68
- })
69
- }
70
-
71
- // eslint-disable-next-line max-params
72
- private async *execute(
73
- input: Input,
74
- storage: string,
75
- entry: Entry,
76
- parameters: Parameter[]
77
- ): AsyncGenerator {
78
- const location: Location = {
79
- storage,
80
- authority: input.authority,
81
- path: input.request.url
82
- }
83
-
84
- for await (const chunk of this.workflow!.execute(location, entry, parameters)) {
85
- yield chunk
86
-
87
- if (typeof chunk === 'object' && chunk !== null && 'error' in chunk) return
88
- }
89
-
90
- await this.delete(storage, input)
91
- }
92
- }
93
-
94
- export interface Options {
95
- workflow?: Unit[] | Unit
96
- }
@@ -1,21 +0,0 @@
1
- import type { Input } from './types.js'
2
- import type { Parameter } from '../../RTD/index.js'
3
- import type { Introspection } from '../../Introspection.js'
4
- import type * as io from '../../io.js'
5
-
6
- export abstract class Directive {
7
- public readonly name = 'octets.' + this.constructor.name.toLowerCase()
8
- public abstract readonly targeted: boolean
9
-
10
- public abstract apply(
11
- storage: string,
12
- input: Input,
13
- parameters: Parameter[]
14
- ): Promise<io.Output>
15
-
16
- /**
17
- * What a caller has to know to make the request. Only sending a file takes anything a
18
- * schema does not already say; reading one and deleting one take nothing.
19
- */
20
- public describe?(introspection: Introspection): void
21
- }
@@ -1,88 +0,0 @@
1
- import { Forbidden, NotFound } from '../../HTTP/index.js'
2
- import * as schemas from './schemas.js'
3
- import { Directive } from './Directive.js'
4
- import type { Maybe } from '@toa.io/core/types'
5
- import type { Entry, Stream } from '@toa.io/extensions.storages'
6
- import type { Component } from '@toa.io/core'
7
- import type { Output } from '../../io.js'
8
- import type { Input } from './types.js'
9
-
10
- export class Get extends Directive {
11
- public readonly targeted = true
12
-
13
- private readonly options: Required<Options> = {
14
- meta: false
15
- }
16
-
17
- private readonly discovery: Promise<Component>
18
- private storage!: Component
19
-
20
- public constructor(options: Options | null, discovery: Promise<Component>) {
21
- super()
22
-
23
- schemas.get.validate(options)
24
- Object.assign(this.options, options)
25
-
26
- this.discovery = discovery
27
- }
28
-
29
- public async apply(storage: string, input: Input): Promise<Output> {
30
- this.storage ??= await this.discovery
31
-
32
- if (input.subtype === 'octets.entry')
33
- if (this.options.meta) return this.head(storage, input)
34
- else throw new Forbidden('Metadata is not accessible')
35
- else return await this.get(storage, input)
36
- }
37
-
38
- private async get(storage: string, input: Input): Promise<Output> {
39
- if ('if-none-match' in input.request.headers) return { status: 304 }
40
-
41
- const endpoint = input.request.method === 'GET' ? 'get' : 'head'
42
-
43
- const entry = await this.storage.invoke<Maybe<Stream>>(endpoint, {
44
- input: {
45
- storage,
46
- path: input.request.url,
47
- range: input.request.headers.range,
48
- agent: input.request.headers['user-agent']
49
- }
50
- })
51
-
52
- if (entry instanceof Error) throw new NotFound()
53
-
54
- const headers = new Headers({
55
- 'content-type': entry.type,
56
- etag: `"${entry.checksum}"`
57
- })
58
-
59
- if (entry.range !== undefined) headers.set('content-range', entry.range)
60
-
61
- // an absent content-length is what says the length is unknown; naming the encoding
62
- // is redundant over HTTP/1.1 and forbidden over HTTP/2
63
- if (entry.size !== null) headers.set('content-length', entry.size.toString())
64
-
65
- return {
66
- status: entry.partial === true ? 206 : 200,
67
- headers,
68
- body: endpoint === 'get' ? entry.stream : undefined
69
- }
70
- }
71
-
72
- private async head(storage: string, input: Input): Promise<Output> {
73
- const entry = await this.storage.invoke<Maybe<Entry>>('head', {
74
- input: {
75
- storage,
76
- path: input.request.url
77
- }
78
- })
79
-
80
- if (entry instanceof Error) throw new NotFound()
81
-
82
- return { body: entry }
83
- }
84
- }
85
-
86
- export interface Options {
87
- meta?: boolean
88
- }
@@ -1,82 +0,0 @@
1
- import { NotFound } from '../../HTTP/index.js'
2
- import { Context } from './Context.js'
3
- import { Put } from './Put.js'
4
- import { Get } from './Get.js'
5
- import { Delete } from './Delete.js'
6
- import { WorkflowDirective } from './Workflow.js'
7
- import type { Directive } from './Directive.js'
8
- import type { Output } from '../../io.js'
9
- import type { Component } from '@toa.io/core'
10
- import type { Remotes } from '../../Remotes.js'
11
- import type { Parameter, DirectiveFamily } from '../../RTD/index.js'
12
- import type { Introspection } from '../../Introspection.js'
13
- import type { Input } from './types.js'
14
-
15
- export class Octets implements DirectiveFamily<Directive> {
16
- public readonly name: string = 'octets'
17
- public readonly mandatory: boolean = false
18
-
19
- private discovery = null as unknown as Promise<Component>
20
-
21
- public create(name: string, value: any, remotes: Remotes): Directive {
22
- const Class = DIRECTIVES[name]
23
-
24
- if (Class === undefined)
25
- throw new Error(`Directive 'octets:${name}' is not implemented`)
26
-
27
- this.discovery ??= remotes.discover('exposition', 'octets')
28
-
29
- return new Class(value, this.discovery, remotes)
30
- }
31
-
32
- /** What the request takes, which only sending a file says anything about. */
33
- public explain(directives: Directive[], _: Input, introspection: Introspection): Introspection {
34
- for (const directive of directives) directive.describe?.(introspection)
35
-
36
- return introspection
37
- }
38
-
39
- public async precall(
40
- directives: Directive[],
41
- input: Input,
42
- parameters: Parameter[]
43
- ): Promise<Output> {
44
- let context: Context | null = null
45
- let action: Directive | null = null
46
-
47
- for (const directive of directives)
48
- if (directive instanceof Context) context ??= directive
49
- else if (action === null) action = directive
50
- else throw new Error('Octets action is ambiguous')
51
-
52
- if (action === null) return null
53
-
54
- // noinspection PointlessBooleanExpressionJS
55
- if (context === null) throw new Error('Octets context is not defined')
56
-
57
- const targeted = input.request.url[input.request.url.length - 1] !== '/'
58
-
59
- if (targeted !== action.targeted)
60
- throw new NotFound(
61
- `Trailing slash is ${action.targeted ? 'redundant' : 'required'}`
62
- )
63
-
64
- // noinspection JSObjectNullOrUndefined
65
- return await action.apply(context.storage, input, parameters)
66
- }
67
- }
68
-
69
- const DIRECTIVES: Record<string, Constructor> = {
70
- context: Context,
71
- put: Put,
72
- get: Get,
73
- head: Get,
74
- delete: Delete,
75
- workflow: WorkflowDirective
76
- }
77
-
78
- type Constructor = new (
79
- value: any,
80
- discovery: Promise<Component>,
81
- remotes: Remotes
82
- ) => Directive
@@ -1,186 +0,0 @@
1
- import { PassThrough } from 'node:stream'
2
- import { match } from 'matchacho'
3
- import * as http from '../../HTTP/index.js'
4
- import { cors } from '../cors/index.js'
5
- import * as schemas from './schemas.js'
6
- import { Workflow } from './workflows/index.js'
7
- import { Directive } from './Directive.js'
8
- import { toBytes } from './bytes.js'
9
- import type { Readable } from 'stream'
10
- import type { Parameter } from '../../RTD/index.js'
11
- import type { Unit, Location } from './workflows/index.js'
12
- import type { Entry } from '@toa.io/extensions.storages'
13
- import type { Remotes } from '../../Remotes.js'
14
- import type { Component } from '@toa.io/core'
15
- import type { Introspection } from '../../Introspection.js'
16
- import type { Output } from '../../io.js'
17
- import type { Input } from './types.js'
18
-
19
- export class Put extends Directive {
20
- public readonly targeted = false
21
-
22
- private readonly location?: string
23
- private readonly accept?: string
24
- private readonly limit: number
25
- private readonly limitString: string
26
- private readonly trust?: Array<string | RegExp>
27
- private readonly workflow?: Workflow
28
- private readonly discovery: Record<string, Promise<Component>> = {}
29
- private storage: Component | null = null
30
-
31
- public constructor(
32
- options: Options | null,
33
- discovery: Promise<Component>,
34
- remotes: Remotes
35
- ) {
36
- super()
37
-
38
- schemas.put.validate<Options>(options)
39
-
40
- this.accept = match(
41
- options?.accept,
42
- String,
43
- (value: string) => value,
44
- Array,
45
- (types: string[]) => types.join(','),
46
- undefined
47
- )
48
-
49
- if (options?.workflow !== undefined)
50
- this.workflow = new Workflow(options.workflow, remotes)
51
-
52
- if (options?.trust !== undefined)
53
- this.trust = options.trust.map((value: string) =>
54
- value.startsWith('/') ? new RegExp(value.slice(1, -1)) : value
55
- )
56
-
57
- if (options?.location !== undefined) this.location = options.location
58
-
59
- this.limitString = options?.limit ?? '64MiB'
60
- this.limit = toBytes(this.limitString)
61
- this.discovery.storage = discovery
62
-
63
- cors.allow('content-attributes')
64
- cors.allow('content-location')
65
- }
66
-
67
- /** What sending a file here takes: what may be sent, how much of it, and what comes back. */
68
- public override describe(introspection: Introspection): void {
69
- introspection.octets = {
70
- ...(this.accept === undefined ? {} : { accept: this.accept }),
71
- limit: this.limitString,
72
- ...(this.workflow === undefined ? {} : { stream: true })
73
- }
74
- }
75
-
76
- public async apply(
77
- storage: string,
78
- input: Input,
79
- parameters: Parameter[]
80
- ): Promise<Output> {
81
- this.storage ??= await this.discovery.storage
82
-
83
- const request: StoreRequest = {
84
- input: {
85
- storage,
86
- request: input.request,
87
- location: this.location,
88
- accept: this.accept,
89
- limit: this.limit,
90
- trust: this.trust
91
- }
92
- }
93
-
94
- const entry = await this.storage.invoke<Entry>('put', request)
95
-
96
- return match<Output>(
97
- entry,
98
- Error,
99
- (error: CodedError) => this.throw(error),
100
- () => this.reply(input, storage, entry, parameters)
101
- )
102
- }
103
-
104
- // eslint-disable-next-line max-params
105
- private reply(
106
- input: Input,
107
- storage: string,
108
- entry: Entry,
109
- parameters: Parameter[]
110
- ): Output {
111
- const body =
112
- this.workflow === undefined
113
- ? entry
114
- : this.execute(input, storage, entry, parameters)
115
-
116
- return { body }
117
- }
118
-
119
- // eslint-disable-next-line max-params
120
- private execute(
121
- input: Input,
122
- storage: string,
123
- entry: Entry,
124
- parameters: Parameter[]
125
- ): Readable {
126
- const stream = new PassThrough({ objectMode: true })
127
-
128
- stream.push(entry)
129
-
130
- const location: Location = {
131
- storage,
132
- authority: input.authority,
133
- identity: input.identity?.id,
134
- path: this.location ?? input.request.url
135
- }
136
-
137
- this.workflow!.execute(location, entry, parameters).pipe(stream)
138
-
139
- return stream
140
- }
141
-
142
- private throw(error: CodedError): never {
143
- throw match(
144
- error.code,
145
- 'NOT_ACCEPTABLE',
146
- () => new http.UnsupportedMediaType(),
147
- 'TYPE_MISMATCH',
148
- () => new http.BadRequest(),
149
- 'LIMIT_EXCEEDED',
150
- () => new http.RequestEntityTooLarge(`Size limit is ${this.limitString}`),
151
- 'LOCATION_UNTRUSTED',
152
- () => new http.Forbidden(error.message),
153
- 'LOCATION_LENGTH',
154
- () => new http.BadRequest(error.message),
155
- 'LOCATION_UNAVAILABLE',
156
- () => new http.NotFound(error.message),
157
- 'INVALID_ID',
158
- () => new http.BadRequest(error.message),
159
- error
160
- )
161
- }
162
- }
163
-
164
- export interface Options {
165
- location?: string
166
- accept?: string | string[]
167
- limit?: string
168
- workflow?: Unit[] | Unit
169
- trust?: string[]
170
- }
171
-
172
- interface StoreRequest {
173
- input: {
174
- storage: string
175
- request: Input['request']
176
- location?: string
177
- accept?: string
178
- limit?: number
179
- trust?: Array<string | RegExp>
180
- attributes?: Record<string, string>
181
- }
182
- }
183
-
184
- interface CodedError extends Error {
185
- code: string
186
- }