@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,75 +0,0 @@
1
- import { type Component } from '@toa.io/core'
2
- import type { Maybe } from '@toa.io/core/types'
3
- import { type Parameter } from '../../RTD/index.js'
4
- import type { Introspection } from '../../Introspection.js'
5
- import type * as http from '../../HTTP/index.js'
6
- import type * as io from '../../io.js'
7
-
8
- export interface Directive {
9
- priority?: number
10
-
11
- authorize: (
12
- identity: Identity | null,
13
- context: Context,
14
- parameters: Parameter[]
15
- ) => boolean | Promise<boolean>
16
-
17
- /**
18
- * Whether this admits the identity where that can be told without a request — which is
19
- * what describing a method is. `undefined` says it cannot be told: a directive reading a
20
- * route variable's value or the body has neither here, and one that is not implemented
21
- * says the same by its absence. Nothing here may have an effect on the request.
22
- */
23
- admits?: (
24
- identity: Identity | null,
25
- context: Context
26
- ) => boolean | undefined | Promise<boolean | undefined>
27
-
28
- /**
29
- * What this directive makes of what the method says about itself, which is the reverse of
30
- * what it does to a request: a property it fills from the identity is taken out of the
31
- * input, because it is not the caller's to send — and a description that offers one invites
32
- * a caller to name an identity that is not theirs. Nothing here may have an effect on the
33
- * request.
34
- */
35
- describe?: (introspection: Introspection) => Introspection
36
-
37
- reply?: (context: Context) => http.OutgoingMessage | null
38
-
39
- settle?: (context: Context, response: http.OutgoingMessage) => Promise<void>
40
- }
41
-
42
- export interface Identity {
43
- readonly id: string
44
- roles?: string[]
45
- permissions?: Record<string, string[]>
46
- scheme: string | null // null for transient identities
47
-
48
- /** The component that verified the credentials; none for a transient identity. */
49
- provider?: Remote
50
- refresh: boolean
51
- }
52
-
53
- export interface Extension {
54
- identity: Identity | null
55
-
56
- /** the error code the presented credentials were rejected with, when they were */
57
- rejection?: string
58
-
59
- /** whether the identity was checked against the bans while being resolved */
60
- vetted?: boolean
61
- }
62
-
63
- export interface Ban {
64
- banned: boolean
65
- }
66
-
67
- export type Context = io.Input & Extension
68
- export type AuthenticationResult = Maybe<{ identity: Identity; refresh: boolean }>
69
-
70
- export type Scheme = 'basic' | 'token' | 'bearer' | 'code' | 'otp'
71
- export type Remote = 'basic' | 'federation' | 'tokens' | 'roles' | 'bans' | 'otp'
72
- export type Discovery = Record<Remote, Promise<Component>>
73
- export type Components = Partial<Record<Remote, Component>>
74
-
75
- export type Create = (name: string, value: any, ...args: any[]) => Directive
@@ -1,92 +0,0 @@
1
- import { Control } from './Control.js'
2
- import { Exact } from './Exact.js'
3
- import { matches, tag } from './etag.js'
4
- import type { Output } from '../../io.js'
5
- import type { AuthenticatedContext, Directive } from './types.js'
6
- import type { DirectiveFamily } from '../../RTD/index.js'
7
- import type * as http from '../../HTTP/index.js'
8
-
9
- export class Cache implements DirectiveFamily<Directive> {
10
- public readonly name: string = 'cache'
11
- public readonly mandatory: boolean = true
12
-
13
- public create(name: string, value: any): Directive {
14
- const Class = constructors[name]
15
-
16
- if (Class === undefined)
17
- throw new Error(`Directive 'cache:${name}' is not implemented`)
18
-
19
- return new Class(value)
20
- }
21
-
22
- public precall(): Output {
23
- return null
24
- }
25
-
26
- public async settle(
27
- directives: Directive[],
28
- context: AuthenticatedContext,
29
- response: http.OutgoingMessage
30
- ): Promise<void> {
31
- const directive = directives[0]
32
- const method = context.request.method
33
- const safe = method === 'GET' || method === 'HEAD'
34
-
35
- response.headers ??= new Headers()
36
-
37
- validate(context, response, response.headers, safe)
38
-
39
- // `cache:exact` sets what it is given, whatever the method: whether a reply may be
40
- // stored at all is not a question about the method's cacheability, and a token
41
- // endpoint answers a POST it must not have kept
42
- if (directive instanceof Exact) {
43
- directive.set(context, response.headers)
44
-
45
- return
46
- }
47
-
48
- if (!safe) return
49
-
50
- if (directive === undefined) {
51
- if (context.identity !== null && !Control.disabled(response.headers)) {
52
- response.headers.set('cache-control', 'private')
53
- response.headers.append('vary', 'authorization')
54
- }
55
- } else directive.set(context, response.headers)
56
- }
57
- }
58
-
59
- /**
60
- * The validators a reply carries: the timestamp as `last-modified`, whatever the method, and
61
- * on a safe one the version as its `etag`. A client that sends the tag back in `if-none-match`
62
- * already has the representation and is told so, with the tag as it sent it. A reply without
63
- * a version has no tag: nothing identifies it but its body, and hashing that on every reply
64
- * is what a version is for.
65
- */
66
- // eslint-disable-next-line max-params
67
- function validate(
68
- context: AuthenticatedContext,
69
- response: http.OutgoingMessage,
70
- headers: Headers,
71
- safe: boolean
72
- ): void {
73
- const { version, modified } = response
74
-
75
- if (modified !== undefined)
76
- headers.set('last-modified', new Date(modified).toUTCString())
77
-
78
- if (version === undefined || !safe) return
79
-
80
- const sent = context.request.headers['if-none-match']
81
-
82
- if (sent !== undefined && matches(sent, version)) {
83
- response.status = 304
84
- response.body = undefined
85
- headers.set('etag', sent)
86
- } else headers.set('etag', tag(version))
87
- }
88
-
89
- const constructors: Record<string, new (value: any) => Directive> = {
90
- control: Control,
91
- exact: Exact
92
- }
@@ -1,81 +0,0 @@
1
- import { match } from 'matchacho'
2
- import type { AuthenticatedContext, Directive } from './types.js'
3
-
4
- export class Control implements Directive {
5
- protected readonly value: string
6
- private control: string | null = null
7
- private vary: boolean = false
8
-
9
- public constructor(value: string) {
10
- this.value = value
11
- }
12
-
13
- public static disabled(headers: Headers): boolean {
14
- const value = headers.get('cache-control')
15
-
16
- if (value === null) return false
17
-
18
- const directives = mask(value)
19
-
20
- return (directives & NO_STORE) === NO_STORE
21
- }
22
-
23
- public set(context: AuthenticatedContext, headers: Headers): void {
24
- this.control ??= this.resolve(context)
25
-
26
- if (Control.disabled(headers)) return
27
-
28
- headers.set('cache-control', this.control)
29
-
30
- if (this.vary) headers.append('vary', 'authorization')
31
- }
32
-
33
- protected resolve(request: AuthenticatedContext): string {
34
- if (request.identity === null) return this.value
35
-
36
- const directives = mask(this.value)
37
-
38
- if ((directives & PRIVATE) === PRIVATE) this.vary = true
39
-
40
- if ((directives & (PUBLIC | NO_CACHE)) === PUBLIC) return 'no-cache, ' + this.value
41
-
42
- if ((directives & (PUBLIC | PRIVATE)) === 0) {
43
- this.vary = true
44
-
45
- return 'private, ' + this.value
46
- }
47
-
48
- return this.value
49
- }
50
- }
51
-
52
- function mask(value: string): number {
53
- const directives = value.match(DIRECTIVES_RX)
54
-
55
- if (directives === null) return 0
56
-
57
- let mask = 0
58
-
59
- for (const directive of directives)
60
- mask |= match<number>(
61
- directive,
62
- 'private',
63
- PRIVATE,
64
- 'public',
65
- PUBLIC,
66
- 'no-cache',
67
- NO_CACHE,
68
- 'no-store',
69
- NO_STORE,
70
- 0
71
- )
72
-
73
- return mask
74
- }
75
-
76
- const DIRECTIVES_RX = /\b(private|public|no-cache|no-store)\b/gi
77
-
78
- const PUBLIC = 1
79
- const PRIVATE = 2
80
- const NO_CACHE = 4
81
- const NO_STORE = 8
@@ -1,7 +0,0 @@
1
- import { Control } from './Control.js'
2
-
3
- export class Exact extends Control {
4
- protected override resolve(): string {
5
- return this.value
6
- }
7
- }
@@ -1,38 +0,0 @@
1
- /**
2
- * An entity tag is its version in quotes, `"3"`, or the same marked weak, `W/"3"`. A client
3
- * sends one back in `if-match` and `if-none-match`; what it sent is compared here as a string
4
- * and parsed only where a version is needed of it.
5
- */
6
- export function tag(version: number): string {
7
- return `"${version}"`
8
- }
9
-
10
- /** Whether the tag a client sent names the version, strong or weak. */
11
- export function matches(sent: string, version: number): boolean {
12
- const strong = tag(version)
13
-
14
- return sent === strong || sent === 'W/' + strong
15
- }
16
-
17
- /** The version a tag names, or nothing for a tag that is not one. */
18
- export function parse(sent: string): number | null {
19
- const strong = sent.startsWith('W/') ? sent.slice(2) : sent
20
-
21
- if (
22
- strong.length < 3 ||
23
- strong.length > 34 ||
24
- !strong.startsWith('"') ||
25
- !strong.endsWith('"')
26
- )
27
- return null
28
-
29
- const digits = strong.slice(1, -1)
30
-
31
- for (let i = 0; i < digits.length; i++) {
32
- const code = digits.charCodeAt(i)
33
-
34
- if (code < 48 || code > 57) return null
35
- }
36
-
37
- return Number.parseInt(digits)
38
- }
@@ -1,3 +0,0 @@
1
- import { Cache } from './Cache.js'
2
-
3
- export const cache = new Cache()
@@ -1,9 +0,0 @@
1
- import type { Input } from '../../io.js'
2
-
3
- export interface Directive {
4
- set: (input: Input, headers: Headers) => void
5
- }
6
-
7
- export interface AuthenticatedContext extends Input {
8
- identity?: unknown | null
9
- }
@@ -1,75 +0,0 @@
1
- import { describe, it, beforeEach } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { CORS } from './CORS.js'
5
- import type { Input } from '../../io.js'
6
-
7
- const input = (method: string, headers: Record<string, string>): Input =>
8
- ({
9
- request: { method, headers },
10
- pipelines: { body: [], response: [] }
11
- }) as unknown as Input
12
-
13
- describe('cors', () => {
14
- let cors: CORS
15
-
16
- beforeEach(() => {
17
- cors = new CORS()
18
- cors.reset()
19
- })
20
-
21
- it('should answer a preflight', () => {
22
- const output = cors.intercept(
23
- input('OPTIONS', {
24
- origin: 'https://hello.world',
25
- 'access-control-request-method': 'GET'
26
- })
27
- )
28
-
29
- assert.equal(output?.status, 204)
30
- assert.equal(output?.headers?.get('access-control-allow-origin'), 'https://hello.world')
31
- })
32
-
33
- it('should allow OPTIONS, so that one can be preflighted at all', () => {
34
- const output = cors.intercept(
35
- input('OPTIONS', {
36
- origin: 'https://hello.world',
37
- 'access-control-request-method': 'OPTIONS'
38
- })
39
- )
40
-
41
- assert.match(output?.headers?.get('access-control-allow-methods') ?? '', /\bOPTIONS\b/)
42
- })
43
-
44
- it('should pass an OPTIONS that is not a preflight through', () => {
45
- /*
46
- * A browser puts `Origin` on every request whose method is not `GET` or `HEAD`, its own
47
- * `OPTIONS` included — so answering this one here would put introspection out of reach
48
- * of any page. Do not restore the `Origin`-only test.
49
- */
50
- const output = cors.intercept(input('OPTIONS', { origin: 'https://hello.world' }))
51
-
52
- assert.equal(output, null)
53
- })
54
-
55
- it('should decorate a reply that is not a preflight', () => {
56
- const request = input('OPTIONS', { origin: 'https://hello.world' })
57
-
58
- cors.intercept(request)
59
-
60
- const message = {}
61
-
62
- for (const transform of request.pipelines.response) transform(message)
63
-
64
- const headers = (message as { headers?: Headers }).headers
65
-
66
- assert.equal(headers?.get('access-control-allow-origin'), 'https://hello.world')
67
- assert.equal(headers?.get('access-control-allow-credentials'), 'true')
68
- assert.equal(headers?.get('vary'), 'origin')
69
- })
70
-
71
- it('should pass a request carrying no origin through', () => {
72
- assert.equal(cors.intercept(input('OPTIONS', {})), null)
73
- assert.equal(cors.intercept(input('GET', {})), null)
74
- })
75
- })
@@ -1,88 +0,0 @@
1
- import type { Input, Output } from '../../io.js'
2
- import type { Interceptor } from '../../Interception.js'
3
-
4
- /** What is allowed before any directive asks for more. */
5
- const REQUEST_HEADERS = [
6
- 'accept',
7
- 'authorization',
8
- 'content-type',
9
- 'if-match',
10
- 'if-none-match'
11
- ]
12
-
13
- export class CORS implements Interceptor {
14
- public readonly name = 'cors'
15
-
16
- private requestHeaders = new Set<string>(REQUEST_HEADERS)
17
-
18
- private readonly headers = new Headers({
19
- 'access-control-allow-methods': 'GET, POST, PUT, PATCH, DELETE, LOCK, UNLOCK, OPTIONS',
20
- 'access-control-allow-credentials': 'true',
21
- 'access-control-allow-headers': this.allowedHeaders(),
22
- 'access-control-max-age': '3600',
23
- 'cache-control': 'max-age=3600',
24
- vary: 'origin'
25
- })
26
-
27
- public intercept(input: Input): Output {
28
- const origin = input.request.headers.origin
29
- const requested = input.request.headers['access-control-request-method']
30
-
31
- /*
32
- * A preflight is `OPTIONS` carrying `Access-Control-Request-Method`, and only that. A
33
- * browser puts `Origin` on every request whose method is not `GET` or `HEAD` — its own
34
- * `OPTIONS` included, same-origin or not — so answering that one here would put
35
- * introspection out of reach of any page.
36
- */
37
- if (origin !== undefined && requested !== undefined && input.request.method === 'OPTIONS')
38
- return this.preflightResponse(origin)
39
-
40
- input.pipelines.response.push((output) => {
41
- output.headers ??= new Headers()
42
-
43
- if (origin !== undefined) {
44
- output.headers.set('access-control-allow-origin', origin)
45
- output.headers.set('access-control-allow-credentials', 'true')
46
- output.headers.set(
47
- 'access-control-expose-headers',
48
- 'authorization, content-type, content-length, date, etag, last-modified'
49
- )
50
- }
51
-
52
- const method = input.request.method
53
-
54
- if (method === 'GET' || method === 'HEAD' || method === 'OPTIONS')
55
- output.headers.append('vary', 'origin')
56
- })
57
-
58
- return null
59
- }
60
-
61
- public reset(): void {
62
- this.requestHeaders = new Set(REQUEST_HEADERS)
63
- this.headers.set('access-control-allow-headers', this.allowedHeaders())
64
- }
65
-
66
- public allow(header: string): void {
67
- this.requestHeaders.add(header.toLowerCase())
68
- this.headers.set('access-control-allow-headers', this.allowedHeaders())
69
- }
70
-
71
- /**
72
- * Sorted, because the set is filled as branches merge and their order is not
73
- * fixed — an unsorted value would differ between otherwise identical processes,
74
- * and between one restart and the next.
75
- */
76
- private allowedHeaders(): string {
77
- return Array.from(this.requestHeaders).sort().join(', ')
78
- }
79
-
80
- private preflightResponse(origin: string): Output {
81
- this.headers.set('access-control-allow-origin', origin)
82
-
83
- return {
84
- status: 204,
85
- headers: this.headers
86
- }
87
- }
88
- }
@@ -1,3 +0,0 @@
1
- import { CORS } from './CORS.js'
2
-
3
- export const cors = new CORS()
@@ -1,41 +0,0 @@
1
- import { Stub } from './Stub.js'
2
- import { Throw } from './Throw.js'
3
- import { Sleep } from './Sleep.js'
4
- import { Faulty } from './Faulty.js'
5
- import { type Directive } from './types.js'
6
- import type { Input, Output } from '../../io.js'
7
- import type { DirectiveFamily } from '../../RTD/index.js'
8
-
9
- export class Development implements DirectiveFamily<Directive> {
10
- public readonly name: string = 'dev'
11
- public readonly mandatory: boolean = false
12
-
13
- public create(name: string, value: unknown): Directive {
14
- const Class = constructors[name]
15
-
16
- if (Class === undefined) throw new Error(`Directive 'dev:${name}' is not implemented`)
17
-
18
- return new Class(value)
19
- }
20
-
21
- public async precall(directives: Directive[], input: Input): Promise<Output> {
22
- let output = null
23
-
24
- for (const directive of directives) {
25
- const out = await directive.apply(input)
26
-
27
- if (out !== null)
28
- if (output !== null) throw new Error('`dev` directives ambiguous output')
29
- else output = out
30
- }
31
-
32
- return output
33
- }
34
- }
35
-
36
- const constructors: Record<string, new (value: any) => Directive> = {
37
- stub: Stub,
38
- throw: Throw,
39
- sleep: Sleep,
40
- faulty: Faulty
41
- }
@@ -1,31 +0,0 @@
1
- import assert from 'node:assert'
2
- import { ServiceUnavailable } from '../../HTTP/index.js'
3
- import { cors } from '../cors/index.js'
4
- import type { Output } from '../../io.js'
5
- import type { Directive } from './types.js'
6
-
7
- export class Faulty implements Directive {
8
- private static readonly warned = false
9
- private readonly probability: number
10
-
11
- public constructor(probability: number) {
12
- assert.ok(
13
- typeof probability === 'number',
14
- '`dev:faulty` directive value must be a number'
15
- )
16
- assert.ok(
17
- probability > 0 && probability <= 1,
18
- '`dev:faulty` directive value must be in the range (0, 1]'
19
- )
20
-
21
- this.probability = probability
22
-
23
- cors.allow('faulty')
24
- }
25
-
26
- public async apply(): Promise<Output> {
27
- if (Math.random() > this.probability) return null
28
-
29
- throw new ServiceUnavailable()
30
- }
31
- }
@@ -1,53 +0,0 @@
1
- import assert from 'node:assert'
2
- import { setTimeout } from 'node:timers/promises'
3
- import { console } from 'openspan'
4
- import { cors } from '../cors/index.js'
5
- import { BadRequest } from '../../HTTP/index.js'
6
- import type { Directive } from './types.js'
7
- import type { Input, Output } from '../../io.js'
8
-
9
- export class Sleep implements Directive {
10
- private static warned = false
11
- private readonly maximum: number
12
-
13
- public constructor(value: number) {
14
- assert.ok(Number.isInteger(value), '`dev:sleep` directive value must be an integer')
15
-
16
- if (!Sleep.warned) {
17
- console.warn('Sleep directive is enabled', { maximum: value })
18
- Sleep.warned = true
19
- }
20
-
21
- cors.allow('sleep')
22
- this.maximum = value
23
- }
24
-
25
- public async apply(input: Input): Promise<Output> {
26
- const value = input.request.headers.sleep as string | undefined
27
-
28
- if (value === undefined) return null
29
-
30
- const [min, max] = this.parse(value)
31
-
32
- if (min < 0 || max < 0 || min > max || max > this.maximum)
33
- throw new BadRequest('Invalid sleep duration')
34
-
35
- const duration = Math.floor(Math.random() * (max - min)) + min
36
-
37
- await setTimeout(duration)
38
-
39
- return null
40
- }
41
-
42
- private parse(value: string): [number, number] {
43
- try {
44
- const pair = JSON.parse(value) as [number, number]
45
-
46
- if (!Array.isArray(pair) || pair.length !== 2) throw new Error()
47
-
48
- return pair
49
- } catch {
50
- throw new BadRequest('Invalid sleep duration value')
51
- }
52
- }
53
- }
@@ -1,14 +0,0 @@
1
- import type { Output } from '../../io.js'
2
- import type { Directive } from './types.js'
3
-
4
- export class Stub implements Directive {
5
- private readonly value: unknown
6
-
7
- public constructor(value: unknown) {
8
- this.value = value
9
- }
10
-
11
- public apply(): Output {
12
- return { body: this.value }
13
- }
14
- }
@@ -1,14 +0,0 @@
1
- import type { Output } from '../../io.js'
2
- import type { Directive } from './types.js'
3
-
4
- export class Throw implements Directive {
5
- private readonly message: string
6
-
7
- public constructor(message: string) {
8
- this.message = message
9
- }
10
-
11
- public apply(): Output {
12
- throw new Error(this.message)
13
- }
14
- }
@@ -1,3 +0,0 @@
1
- import { Development } from './Development.js'
2
-
3
- export const dev = new Development()
@@ -1,5 +0,0 @@
1
- import type { Input, Output } from '../../io.js'
2
-
3
- export interface Directive {
4
- apply: (input: Input) => Promise<Output> | Output
5
- }