acrylblends 0.4.1 → 0.5.1

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 (417) hide show
  1. package/LICENSE +73 -0
  2. package/README.md +325 -0
  3. package/docs/framework/README.md +51 -51
  4. package/docs/framework/UPSTREAM.md +1 -1
  5. package/docs/framework/agents/index.md +24 -0
  6. package/docs/framework/api/acryl.md +259 -0
  7. package/docs/framework/api/context.md +527 -0
  8. package/docs/framework/api/exception.md +80 -0
  9. package/docs/framework/api/index.md +12 -0
  10. package/docs/framework/api/presets.md +65 -0
  11. package/docs/framework/api/request.md +396 -0
  12. package/docs/framework/api/routing.md +303 -0
  13. package/docs/framework/{api-summary.md → api/summary.md} +19 -17
  14. package/docs/framework/concepts/benchmarks.md +26 -0
  15. package/docs/framework/concepts/developer-experience.md +5 -0
  16. package/docs/framework/concepts/middleware.md +21 -0
  17. package/docs/framework/concepts/motivation.md +14 -0
  18. package/docs/framework/concepts/routers.md +63 -0
  19. package/docs/framework/concepts/stacks.md +235 -0
  20. package/docs/framework/concepts/web-standard.md +37 -0
  21. package/docs/framework/{getting-started.md → cordis/acryl-in-a-cordis-app.md} +16 -16
  22. package/docs/framework/{concepts.md → cordis/concepts.md} +2 -2
  23. package/docs/framework/cordis/middleware.md +8 -0
  24. package/docs/framework/{migration-from-0-3.md → cordis/migration-from-0-3.md} +16 -13
  25. package/docs/framework/cordis/migration-from-0-4.md +14 -0
  26. package/docs/framework/{migration-from-dsh-webserver.md → cordis/migration-from-dsh-webserver.md} +13 -7
  27. package/docs/framework/{routing.md → cordis/mounting.md} +5 -108
  28. package/docs/framework/{node-server.md → cordis/node-server.md} +4 -4
  29. package/docs/framework/{surfaces.md → cordis/surfaces.md} +2 -2
  30. package/docs/framework/cordis/transport-and-cancellation.md +57 -0
  31. package/docs/framework/{validation.md → cordis/validation.md} +9 -9
  32. package/docs/framework/getting-started/basic.md +196 -0
  33. package/docs/framework/getting-started/bun.md +221 -0
  34. package/docs/framework/getting-started/nodejs.md +344 -0
  35. package/docs/framework/getting-started/other-runtimes.md +23 -0
  36. package/docs/framework/guides/best-practices.md +231 -0
  37. package/docs/framework/guides/create-acrylblends.md +79 -0
  38. package/docs/framework/guides/examples.md +3 -0
  39. package/docs/framework/guides/faq.md +19 -0
  40. package/docs/framework/guides/helpers.md +33 -0
  41. package/docs/framework/guides/jsx-dom.md +299 -0
  42. package/docs/framework/guides/jsx.md +440 -0
  43. package/docs/framework/guides/middleware.md +253 -0
  44. package/docs/framework/guides/rpc.md +886 -0
  45. package/docs/framework/guides/testing.md +133 -0
  46. package/docs/framework/guides/validation.md +383 -0
  47. package/docs/framework/helpers/accepts.md +60 -0
  48. package/docs/framework/helpers/adapter.md +87 -0
  49. package/docs/framework/helpers/conninfo.md +112 -0
  50. package/docs/framework/helpers/cookie.md +232 -0
  51. package/docs/framework/helpers/css.md +285 -0
  52. package/docs/framework/helpers/dev.md +67 -0
  53. package/docs/framework/helpers/factory.md +180 -0
  54. package/docs/framework/helpers/html.md +123 -0
  55. package/docs/framework/helpers/jwt.md +184 -0
  56. package/docs/framework/helpers/proxy.md +118 -0
  57. package/docs/framework/helpers/route.md +143 -0
  58. package/docs/framework/helpers/ssg.md +393 -0
  59. package/docs/framework/helpers/streaming.md +119 -0
  60. package/docs/framework/helpers/testing.md +101 -0
  61. package/docs/framework/helpers/websocket.md +215 -0
  62. package/docs/framework/middleware/builtin/basic-auth.md +165 -0
  63. package/docs/framework/middleware/builtin/bearer-auth.md +138 -0
  64. package/docs/framework/middleware/builtin/body-limit.md +71 -0
  65. package/docs/framework/middleware/builtin/cache.md +122 -0
  66. package/docs/framework/middleware/builtin/combine.md +94 -0
  67. package/docs/framework/middleware/builtin/compress.md +59 -0
  68. package/docs/framework/middleware/builtin/context-storage.md +78 -0
  69. package/docs/framework/middleware/builtin/cors.md +135 -0
  70. package/docs/framework/middleware/builtin/csrf.md +105 -0
  71. package/docs/framework/middleware/builtin/etag.md +54 -0
  72. package/docs/framework/middleware/builtin/ip-restriction.md +69 -0
  73. package/docs/framework/middleware/builtin/jsx-renderer.md +286 -0
  74. package/docs/framework/middleware/builtin/jwk.md +192 -0
  75. package/docs/framework/middleware/builtin/jwt.md +145 -0
  76. package/docs/framework/middleware/builtin/language.md +232 -0
  77. package/docs/framework/middleware/builtin/logger.md +74 -0
  78. package/docs/framework/middleware/builtin/loopback-only.md +31 -0
  79. package/docs/framework/middleware/builtin/method-not-allowed.md +48 -0
  80. package/docs/framework/middleware/builtin/method-override.md +80 -0
  81. package/docs/framework/middleware/builtin/mount.md +106 -0
  82. package/docs/framework/middleware/builtin/pretty-json.md +53 -0
  83. package/docs/framework/middleware/builtin/request-id.md +94 -0
  84. package/docs/framework/middleware/builtin/secure-headers.md +247 -0
  85. package/docs/framework/middleware/builtin/timeout.md +98 -0
  86. package/docs/framework/middleware/builtin/timing.md +101 -0
  87. package/docs/framework/middleware/builtin/trailing-slash.md +74 -0
  88. package/docs/framework/middleware/third-party.md +4 -0
  89. package/docs/framework/upstream.json +3 -3
  90. package/lib/accepts-XBuZPVRI.js +52 -0
  91. package/lib/accepts.d.ts +33 -0
  92. package/lib/accepts.js +2 -0
  93. package/lib/acryl-base.d.ts +2 -0
  94. package/lib/acryl-base.js +332 -0
  95. package/lib/adapter.d.ts +12 -0
  96. package/lib/adapter.js +37 -0
  97. package/lib/app-BM0rTCp7.js +26 -0
  98. package/lib/app-CmAYW1Al.d.ts +21 -0
  99. package/lib/basic-auth.d.ts +72 -0
  100. package/lib/basic-auth.js +95 -0
  101. package/lib/bearer-auth.d.ts +89 -0
  102. package/lib/bearer-auth.js +94 -0
  103. package/lib/body-limit.d.ts +42 -0
  104. package/lib/body-limit.js +66 -0
  105. package/lib/client-BHTr318g.js +266 -0
  106. package/lib/client.d.ts +3 -0
  107. package/lib/client.js +2 -0
  108. package/lib/combine.d.ts +85 -0
  109. package/lib/combine.js +137 -0
  110. package/lib/compose-BuW2B6PZ.js +50 -0
  111. package/lib/compress.d.ts +38 -0
  112. package/lib/compress.js +79 -0
  113. package/lib/connection-C7xgP1hP.js +24 -0
  114. package/lib/conninfo.d.ts +25 -0
  115. package/lib/conninfo.js +2 -0
  116. package/lib/constants-Dy7ZvN1H.js +4 -0
  117. package/lib/context-Bm7rI-oK.d.ts +1234 -0
  118. package/lib/context-DDO0cfuP.js +365 -0
  119. package/lib/context-storage.d.ts +38 -0
  120. package/lib/context-storage.js +52 -0
  121. package/lib/cookie-ClMaKDQf.d.ts +40 -0
  122. package/lib/cookie.d.ts +24 -0
  123. package/lib/cookie.js +82 -0
  124. package/lib/cors.d.ts +52 -0
  125. package/lib/cors.js +106 -0
  126. package/lib/csrf.d.ts +75 -0
  127. package/lib/csrf.js +101 -0
  128. package/lib/etag.d.ts +40 -0
  129. package/lib/etag.js +135 -0
  130. package/lib/factory.d.ts +35 -0
  131. package/lib/factory.js +30 -0
  132. package/lib/headers-tu2YYN8T.d.ts +11 -0
  133. package/lib/html.d.ts +6 -0
  134. package/lib/html.js +31 -0
  135. package/lib/http-exception.d.ts +57 -0
  136. package/lib/http-exception.js +54 -0
  137. package/lib/http-status-DaAwGAFL.d.ts +35 -0
  138. package/lib/index-B-3F4wt2.d.ts +12 -0
  139. package/lib/index-UTBmM3GX.d.ts +68 -0
  140. package/lib/index-oOClm_Xk.d.ts +45 -0
  141. package/lib/index.d.ts +5 -0
  142. package/lib/index.js +28 -0
  143. package/lib/ip-restriction.d.ts +68 -0
  144. package/lib/ip-restriction.js +166 -0
  145. package/lib/jwk.d.ts +52 -0
  146. package/lib/jwk.js +117 -0
  147. package/lib/jwt-BGJBw5AF.js +403 -0
  148. package/lib/jwt-Dg493Tai.d.ts +51 -0
  149. package/lib/jwt.d.ts +72 -0
  150. package/lib/jwt.js +115 -0
  151. package/lib/language.d.ts +88 -0
  152. package/lib/language.js +198 -0
  153. package/lib/logger.d.ts +22 -0
  154. package/lib/logger.js +54 -0
  155. package/lib/loopback-only.d.ts +45 -0
  156. package/lib/loopback-only.js +90 -0
  157. package/lib/method-not-allowed.d.ts +47 -0
  158. package/lib/method-not-allowed.js +82 -0
  159. package/lib/method-override.d.ts +46 -0
  160. package/lib/method-override.js +103 -0
  161. package/lib/mime-BQOYHl-l.d.ts +72 -0
  162. package/lib/node-server/conninfo.d.ts +11 -0
  163. package/lib/node-server/conninfo.js +19 -0
  164. package/lib/node-server/serve-static.d.ts +19 -0
  165. package/lib/node-server/serve-static.js +2 -0
  166. package/lib/node-server.d.ts +103 -0
  167. package/lib/node-server.js +1325 -0
  168. package/lib/powered-by.d.ts +28 -0
  169. package/lib/powered-by.js +24 -0
  170. package/lib/pretty-json.d.ts +40 -0
  171. package/lib/pretty-json.js +39 -0
  172. package/lib/reg-exp-router-DC1R3qoY.js +363 -0
  173. package/lib/request-id.d.ts +45 -0
  174. package/lib/request-id.js +34 -0
  175. package/lib/request.d.ts +2 -0
  176. package/lib/request.js +323 -0
  177. package/lib/route.d.ts +78 -0
  178. package/lib/route.js +126 -0
  179. package/lib/router/linear-router.d.ts +11 -0
  180. package/lib/router/linear-router.js +96 -0
  181. package/lib/router/pattern-router.d.ts +11 -0
  182. package/lib/router/pattern-router.js +41 -0
  183. package/lib/router/reg-exp-router.d.ts +35 -0
  184. package/lib/router/reg-exp-router.js +2 -0
  185. package/lib/router/smart-router.d.ts +15 -0
  186. package/lib/router/smart-router.js +2 -0
  187. package/lib/router/trie-router.d.ts +11 -0
  188. package/lib/router/trie-router.js +2 -0
  189. package/lib/router-CvUxUTOq.d.ts +99 -0
  190. package/lib/router.d.ts +2 -0
  191. package/lib/router.js +35 -0
  192. package/lib/schema-validator.d.ts +28 -0
  193. package/lib/schema-validator.js +22 -0
  194. package/lib/secure-headers.d.ts +125 -0
  195. package/lib/secure-headers.js +163 -0
  196. package/lib/serve-static-Dw_m6KxR.js +213 -0
  197. package/lib/serve-static.d.ts +31 -0
  198. package/lib/serve-static.js +77 -0
  199. package/lib/smart-router-C5CZ5XSM.js +49 -0
  200. package/lib/stream-CPdqZ0Fp.d.ts +34 -0
  201. package/lib/streaming-DHST3Scg.js +96 -0
  202. package/lib/streaming.d.ts +23 -0
  203. package/lib/streaming.js +2 -0
  204. package/lib/testing.d.ts +10 -0
  205. package/lib/testing.js +17 -0
  206. package/lib/timeout.d.ts +30 -0
  207. package/lib/timeout.js +42 -0
  208. package/lib/timing.d.ts +130 -0
  209. package/lib/timing.js +183 -0
  210. package/lib/trailing-slash.d.ts +91 -0
  211. package/lib/trailing-slash.js +85 -0
  212. package/lib/trie-router-CfFbapzL.js +146 -0
  213. package/lib/types-CDO6I3B0.d.ts +40 -0
  214. package/lib/types-CHesD1KG.d.ts +195 -0
  215. package/lib/types-CwrQjlaM.d.ts +105 -0
  216. package/lib/types-DR95J00T.d.ts +29 -0
  217. package/lib/types.d.ts +2 -0
  218. package/lib/types.js +4 -0
  219. package/lib/utils/accept.d.ts +9 -0
  220. package/lib/utils/accept.js +193 -0
  221. package/lib/utils/basic-auth.d.ts +8 -0
  222. package/lib/utils/basic-auth.js +20 -0
  223. package/lib/utils/body.d.ts +2 -0
  224. package/lib/utils/body.js +94 -0
  225. package/lib/utils/buffer.d.ts +19 -0
  226. package/lib/utils/buffer.js +51 -0
  227. package/lib/utils/color.d.ts +24 -0
  228. package/lib/utils/color.js +37 -0
  229. package/lib/utils/compress.d.ts +11 -0
  230. package/lib/utils/compress.js +11 -0
  231. package/lib/utils/concurrent.d.ts +17 -0
  232. package/lib/utils/concurrent.js +30 -0
  233. package/lib/utils/constants.d.ts +7 -0
  234. package/lib/utils/constants.js +7 -0
  235. package/lib/utils/cookie.d.ts +2 -0
  236. package/lib/utils/cookie.js +125 -0
  237. package/lib/utils/crypto.d.ts +14 -0
  238. package/lib/utils/crypto.js +34 -0
  239. package/lib/utils/encode.d.ts +11 -0
  240. package/lib/utils/encode.js +33 -0
  241. package/lib/utils/filepath.d.ts +14 -0
  242. package/lib/utils/filepath.js +25 -0
  243. package/lib/utils/handler.d.ts +9 -0
  244. package/lib/utils/handler.js +12 -0
  245. package/lib/utils/headers.d.ts +2 -0
  246. package/lib/utils/headers.js +1 -0
  247. package/lib/utils/html.d.ts +46 -0
  248. package/lib/utils/html.js +103 -0
  249. package/lib/utils/http-status.d.ts +2 -0
  250. package/lib/utils/http-status.js +1 -0
  251. package/lib/utils/ipaddr.d.ts +56 -0
  252. package/lib/utils/ipaddr.js +238 -0
  253. package/lib/utils/jwt.d.ts +24 -0
  254. package/lib/utils/jwt.js +2 -0
  255. package/lib/utils/mime.d.ts +2 -0
  256. package/lib/utils/mime.js +77 -0
  257. package/lib/utils/stream.d.ts +2 -0
  258. package/lib/utils/stream.js +88 -0
  259. package/lib/utils/types.d.ts +2 -0
  260. package/lib/utils/types.js +1 -0
  261. package/lib/utils/url.d.ts +46 -0
  262. package/lib/utils/url.js +197 -0
  263. package/lib/utils-dw8lxqjL.js +4 -0
  264. package/lib/validator-D84mq-dO.js +65 -0
  265. package/lib/validator.d.ts +42 -0
  266. package/lib/validator.js +2 -0
  267. package/lib/ws.d.ts +2 -0
  268. package/lib/ws.js +53 -0
  269. package/package.json +312 -14
  270. package/plugins/acryl-inspect/src/service.ts +2 -2
  271. package/plugins/acryl-inspect/tests/service.spec.ts +3 -3
  272. package/plugins/acryl-inspect/upstream.json +2 -2
  273. package/plugins/acryl-node-server/tests/adapter/app.ts +2 -2
  274. package/plugins/acryl-node-server/tests/adapter/assets/static/acryl.html +1 -1
  275. package/plugins/acryl-node-server/tests/adapter/assets/static/index.html +1 -1
  276. package/plugins/acryl-node-server/tests/adapter/conninfo.test.ts +2 -2
  277. package/plugins/acryl-node-server/tests/adapter/content-length.test.ts +4 -4
  278. package/plugins/acryl-node-server/tests/adapter/early-hints.test.ts +5 -5
  279. package/plugins/acryl-node-server/tests/adapter/request-client-disconnect.test.ts +2 -2
  280. package/plugins/acryl-node-server/tests/adapter/serve-static.test.ts +20 -20
  281. package/plugins/acryl-node-server/tests/adapter/server-socket.test.ts +2 -2
  282. package/plugins/acryl-node-server/tests/adapter/server.test.ts +60 -50
  283. package/plugins/acryl-node-server/tests/adapter/utils/response.test.ts +4 -4
  284. package/plugins/acryl-node-server/tests/adapter/websocket.test.ts +9 -9
  285. package/plugins/acryl-node-server/tests/server.spec.ts +6 -6
  286. package/plugins/acryl-node-server/upstream.json +2 -2
  287. package/plugins/acryl-router/src/client.ts +1 -1
  288. package/plugins/acryl-router/src/connection.ts +2 -2
  289. package/plugins/acryl-router/src/core/app-base.ts +29 -29
  290. package/plugins/acryl-router/src/core/app.test.ts +175 -175
  291. package/plugins/acryl-router/src/core/app.ts +8 -8
  292. package/plugins/acryl-router/src/core/client/client.test.ts +76 -76
  293. package/plugins/acryl-router/src/core/client/client.ts +2 -2
  294. package/plugins/acryl-router/src/core/client/fetch-result-please.ts +1 -1
  295. package/plugins/acryl-router/src/core/client/index.ts +1 -1
  296. package/plugins/acryl-router/src/core/client/types.test.ts +6 -6
  297. package/plugins/acryl-router/src/core/client/types.ts +16 -16
  298. package/plugins/acryl-router/src/core/client/utils.test.ts +2 -2
  299. package/plugins/acryl-router/src/core/context.test.ts +4 -4
  300. package/plugins/acryl-router/src/core/context.ts +6 -6
  301. package/plugins/acryl-router/src/core/helper/accepts/accepts.test.ts +3 -3
  302. package/plugins/acryl-router/src/core/helper/accepts/index.ts +1 -1
  303. package/plugins/acryl-router/src/core/helper/adapter/index.test.ts +6 -6
  304. package/plugins/acryl-router/src/core/helper/adapter/index.ts +1 -1
  305. package/plugins/acryl-router/src/core/helper/conninfo/index.ts +1 -1
  306. package/plugins/acryl-router/src/core/helper/cookie/index.test.ts +8 -8
  307. package/plugins/acryl-router/src/core/helper/cookie/index.ts +1 -1
  308. package/plugins/acryl-router/src/core/helper/factory/index.test.ts +9 -9
  309. package/plugins/acryl-router/src/core/helper/factory/index.ts +10 -10
  310. package/plugins/acryl-router/src/core/helper/html/index.test.ts +4 -4
  311. package/plugins/acryl-router/src/core/helper/html/index.ts +1 -1
  312. package/plugins/acryl-router/src/core/helper/route/index.test.ts +7 -7
  313. package/plugins/acryl-router/src/core/helper/route/index.ts +8 -8
  314. package/plugins/acryl-router/src/core/helper/streaming/index.ts +1 -1
  315. package/plugins/acryl-router/src/core/helper/testing/index.test.ts +6 -6
  316. package/plugins/acryl-router/src/core/helper/testing/index.ts +4 -4
  317. package/plugins/acryl-router/src/core/helper/websocket/index.ts +2 -1
  318. package/plugins/acryl-router/src/core/http-exception.ts +1 -1
  319. package/plugins/acryl-router/src/core/index.ts +9 -9
  320. package/plugins/acryl-router/src/core/middleware/basic-auth/index.test.ts +6 -6
  321. package/plugins/acryl-router/src/core/middleware/basic-auth/index.ts +3 -3
  322. package/plugins/acryl-router/src/core/middleware/bearer-auth/index.test.ts +5 -5
  323. package/plugins/acryl-router/src/core/middleware/bearer-auth/index.ts +3 -3
  324. package/plugins/acryl-router/src/core/middleware/body-limit/index.test.ts +6 -6
  325. package/plugins/acryl-router/src/core/middleware/body-limit/index.ts +3 -3
  326. package/plugins/acryl-router/src/core/middleware/combine/index.test.ts +9 -9
  327. package/plugins/acryl-router/src/core/middleware/combine/index.ts +7 -7
  328. package/plugins/acryl-router/src/core/middleware/compress/index.test.ts +9 -9
  329. package/plugins/acryl-router/src/core/middleware/compress/index.ts +3 -3
  330. package/plugins/acryl-router/src/core/middleware/context-storage/index.test.ts +5 -5
  331. package/plugins/acryl-router/src/core/middleware/context-storage/index.ts +4 -4
  332. package/plugins/acryl-router/src/core/middleware/cors/index.test.ts +7 -7
  333. package/plugins/acryl-router/src/core/middleware/cors/index.ts +3 -3
  334. package/plugins/acryl-router/src/core/middleware/csrf/index.test.ts +10 -10
  335. package/plugins/acryl-router/src/core/middleware/csrf/index.ts +3 -3
  336. package/plugins/acryl-router/src/core/middleware/etag/index.test.ts +42 -42
  337. package/plugins/acryl-router/src/core/middleware/etag/index.ts +4 -4
  338. package/plugins/acryl-router/src/core/middleware/ip-restriction/index.test.ts +4 -4
  339. package/plugins/acryl-router/src/core/middleware/ip-restriction/index.ts +6 -6
  340. package/plugins/acryl-router/src/core/middleware/jwk/index.test.ts +16 -16
  341. package/plugins/acryl-router/src/core/middleware/jwk/jwk.ts +7 -6
  342. package/plugins/acryl-router/src/core/middleware/jwt/index.test.ts +16 -16
  343. package/plugins/acryl-router/src/core/middleware/jwt/jwt.ts +4 -3
  344. package/plugins/acryl-router/src/core/middleware/language/index.test.ts +3 -3
  345. package/plugins/acryl-router/src/core/middleware/language/language.ts +3 -3
  346. package/plugins/acryl-router/src/core/middleware/logger/index.test.ts +5 -5
  347. package/plugins/acryl-router/src/core/middleware/logger/index.ts +4 -4
  348. package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.test.ts +24 -24
  349. package/plugins/acryl-router/src/core/middleware/method-not-allowed/index.ts +8 -8
  350. package/plugins/acryl-router/src/core/middleware/method-override/index.test.ts +5 -5
  351. package/plugins/acryl-router/src/core/middleware/method-override/index.ts +6 -6
  352. package/plugins/acryl-router/src/core/middleware/powered-by/index.test.ts +4 -4
  353. package/plugins/acryl-router/src/core/middleware/powered-by/index.ts +6 -6
  354. package/plugins/acryl-router/src/core/middleware/pretty-json/index.test.ts +30 -30
  355. package/plugins/acryl-router/src/core/middleware/pretty-json/index.ts +4 -4
  356. package/plugins/acryl-router/src/core/middleware/request-id/index.test.ts +15 -15
  357. package/plugins/acryl-router/src/core/middleware/request-id/request-id.ts +3 -3
  358. package/plugins/acryl-router/src/core/middleware/secure-headers/index.test.ts +35 -35
  359. package/plugins/acryl-router/src/core/middleware/secure-headers/secure-headers.ts +3 -3
  360. package/plugins/acryl-router/src/core/middleware/serve-static/index.test.ts +23 -23
  361. package/plugins/acryl-router/src/core/middleware/serve-static/index.ts +1 -1
  362. package/plugins/acryl-router/src/core/middleware/timeout/index.test.ts +2 -2
  363. package/plugins/acryl-router/src/core/middleware/timeout/index.ts +3 -3
  364. package/plugins/acryl-router/src/core/middleware/timing/index.test.ts +14 -14
  365. package/plugins/acryl-router/src/core/middleware/timing/timing.ts +3 -3
  366. package/plugins/acryl-router/src/core/middleware/trailing-slash/index.test.ts +7 -7
  367. package/plugins/acryl-router/src/core/middleware/trailing-slash/index.ts +7 -7
  368. package/plugins/acryl-router/src/core/request.test.ts +42 -42
  369. package/plugins/acryl-router/src/core/request.ts +6 -6
  370. package/plugins/acryl-router/src/core/router/linear-router/index.ts +1 -1
  371. package/plugins/acryl-router/src/core/router/pattern-router/index.ts +1 -1
  372. package/plugins/acryl-router/src/core/router/reg-exp-router/index.ts +1 -1
  373. package/plugins/acryl-router/src/core/router/smart-router/index.ts +1 -1
  374. package/plugins/acryl-router/src/core/router/trie-router/index.ts +1 -1
  375. package/plugins/acryl-router/src/core/types.test.ts +115 -115
  376. package/plugins/acryl-router/src/core/types.ts +72 -72
  377. package/plugins/acryl-router/src/core/utils/body.ts +8 -8
  378. package/plugins/acryl-router/src/core/utils/html.ts +1 -1
  379. package/plugins/acryl-router/src/core/utils/jwt/jws.ts +3 -3
  380. package/plugins/acryl-router/src/core/utils/jwt/jwt.test.ts +2 -2
  381. package/plugins/acryl-router/src/core/utils/jwt/jwt.ts +3 -3
  382. package/plugins/acryl-router/src/core/utils/jwt/types.ts +1 -1
  383. package/plugins/acryl-router/src/core/utils/types.ts +42 -0
  384. package/plugins/acryl-router/src/core/utils/url.test.ts +2 -2
  385. package/plugins/acryl-router/src/core/validator/index.ts +1 -1
  386. package/plugins/acryl-router/src/core/validator/validator.test.ts +28 -28
  387. package/plugins/acryl-router/src/deprecated.ts +15 -0
  388. package/plugins/acryl-router/src/index.ts +3 -2
  389. package/plugins/acryl-router/src/service.ts +10 -10
  390. package/plugins/acryl-router/tests/docs-examples.spec.ts +11 -11
  391. package/plugins/acryl-router/tests/live-install.spec.ts +2 -2
  392. package/plugins/acryl-router/tests/loader.spec.ts +3 -3
  393. package/plugins/acryl-router/tests/loopback-only.spec.ts +4 -4
  394. package/plugins/acryl-router/tests/no-dom/consumer.ts +11 -0
  395. package/plugins/acryl-router/tests/no-dom/tsconfig.json +13 -0
  396. package/plugins/acryl-router/tests/service.spec.ts +23 -23
  397. package/plugins/acryl-router/upstream.json +3 -3
  398. package/plugins/acryl-router-http/tests/adapter.spec.ts +3 -3
  399. package/plugins/acryl-router-http/tests/surfaces.spec.ts +2 -2
  400. package/plugins/acryl-router-http/upstream.json +2 -2
  401. package/plugins/acryl-state/src/service.ts +2 -2
  402. package/plugins/acryl-state/upstream.json +2 -2
  403. package/plugins/builder/script.ts +2 -2
  404. package/plugins/extensions/resolve.ts +70 -10
  405. package/plugins/openai/prompt.ts +5 -5
  406. package/shared/AGENTS.core.md +16 -9
  407. package/templates/agent/src/routes.ts +2 -2
  408. package/templates/agent/test/model.test.ts +2 -2
  409. package/templates/agent/tsconfig.json +40 -0
  410. package/templates/blank/src/routes.ts +2 -2
  411. package/templates/todo/src/todo.ts +2 -2
  412. package/templates/todo/upstream.json +2 -2
  413. package/docs/framework/context.md +0 -129
  414. package/docs/framework/helpers.md +0 -118
  415. package/docs/framework/middleware.md +0 -154
  416. package/docs/framework/request.md +0 -106
  417. /package/docs/framework/{plugin-lifecycle.md → cordis/plugin-lifecycle.md} +0 -0
@@ -0,0 +1,213 @@
1
+ import { getMimeType } from "./utils/mime.js";
2
+ import "./factory.js";
3
+ import "./connection-C7xgP1hP.js";
4
+ import { Readable } from "node:stream";
5
+ import { createReadStream, existsSync, statSync } from "node:fs";
6
+ import { join } from "node:path";
7
+ import { versions } from "node:process";
8
+ //#region ../../plugins/acryl-node-server/src/adapter/utils/stream.ts
9
+ const pr54206Applied = () => {
10
+ const [major, minor] = versions.node.split(".").map((component) => parseInt(component));
11
+ return major >= 23 || major === 22 && minor >= 7 || major === 20 && minor >= 18;
12
+ };
13
+ const useReadableToWeb = pr54206Applied();
14
+ const createStreamBody = (stream, useNativeReadableToWeb = useReadableToWeb) => {
15
+ if (useNativeReadableToWeb) return Readable.toWeb(stream);
16
+ let controller;
17
+ let settled = false;
18
+ const cleanup = () => {
19
+ stream.off("data", onData);
20
+ stream.off("error", onError);
21
+ stream.off("end", onTerminate);
22
+ stream.off("close", onTerminate);
23
+ };
24
+ const settle = (callback) => {
25
+ if (settled) return;
26
+ settled = true;
27
+ cleanup();
28
+ callback?.();
29
+ };
30
+ const onData = (chunk) => {
31
+ if (settled || !controller) return;
32
+ controller.enqueue(chunk);
33
+ if ((controller.desiredSize ?? 0) <= 0) stream.pause();
34
+ };
35
+ const onError = (error) => {
36
+ settle(() => {
37
+ controller?.error(error);
38
+ });
39
+ };
40
+ const onTerminate = () => {
41
+ settle(() => {
42
+ controller?.close();
43
+ });
44
+ };
45
+ return new ReadableStream({
46
+ start(streamController) {
47
+ controller = streamController;
48
+ stream.on("data", onData);
49
+ stream.on("error", onError);
50
+ stream.on("end", onTerminate);
51
+ stream.on("close", onTerminate);
52
+ stream.pause();
53
+ },
54
+ pull() {
55
+ if (!settled) stream.resume();
56
+ },
57
+ cancel() {
58
+ settle();
59
+ const ignoreError = () => {};
60
+ stream.on("error", ignoreError);
61
+ stream.once("close", () => stream.off("error", ignoreError));
62
+ stream.destroy();
63
+ }
64
+ });
65
+ };
66
+ //#endregion
67
+ //#region ../../plugins/acryl-node-server/src/adapter/serve-static.ts
68
+ const COMPRESSIBLE_CONTENT_TYPE_REGEX = /^\s*(?:text\/[^;\s]+|application\/(?:javascript|json|xml|xml-dtd|ecmascript|dart|postscript|rtf|tar|toml|vnd\.dart|vnd\.ms-fontobject|vnd\.ms-opentype|wasm|x-httpd-php|x-javascript|x-ns-proxy-autoconfig|x-sh|x-tar|x-virtualbox-hdd|x-virtualbox-ova|x-virtualbox-ovf|x-virtualbox-vbox|x-virtualbox-vdi|x-virtualbox-vhd|x-virtualbox-vmdk|x-www-form-urlencoded)|font\/(?:otf|ttf)|image\/(?:bmp|vnd\.adobe\.photoshop|vnd\.microsoft\.icon|vnd\.ms-dds|x-icon|x-ms-bmp)|message\/rfc822|model\/gltf-binary|x-shader\/x-fragment|x-shader\/x-vertex|[^;\s]+?\+(?:json|text|xml|yaml))(?:[;\s]|$)/i;
69
+ const ENCODINGS = {
70
+ br: ".br",
71
+ zstd: ".zst",
72
+ gzip: ".gz"
73
+ };
74
+ const ENCODINGS_ORDERED_KEYS = Object.keys(ENCODINGS);
75
+ const getStats = (path) => {
76
+ let stats;
77
+ try {
78
+ stats = statSync(path);
79
+ } catch {}
80
+ return stats;
81
+ };
82
+ const BYTE_RANGE_PATTERN = /^(?:bytes=)?(?!-$)(\d*)-(\d*)$/;
83
+ const parseByteRange = (range) => {
84
+ const match = range.match(BYTE_RANGE_PATTERN);
85
+ if (!match) return;
86
+ const [, start, end] = match;
87
+ if (start === "") return {
88
+ type: "suffix",
89
+ length: Number(end)
90
+ };
91
+ if (end === "") return {
92
+ type: "open-ended",
93
+ start: Number(start)
94
+ };
95
+ return {
96
+ type: "bounded",
97
+ start: Number(start),
98
+ end: Number(end)
99
+ };
100
+ };
101
+ const resolveByteRange = (spec, size) => {
102
+ if (size === 0) return;
103
+ if (spec.type === "suffix") {
104
+ if (spec.length === 0) return;
105
+ return {
106
+ start: Math.max(size - spec.length, 0),
107
+ end: size - 1
108
+ };
109
+ }
110
+ const end = spec.type === "bounded" ? Math.min(spec.end, size - 1) : size - 1;
111
+ if (spec.start >= size || spec.start > end) return;
112
+ return {
113
+ start: spec.start,
114
+ end
115
+ };
116
+ };
117
+ const tryDecode = (str, decoder) => {
118
+ try {
119
+ return decoder(str);
120
+ } catch {
121
+ return str.replace(/(?:%[0-9A-Fa-f]{2})+/g, (match) => {
122
+ try {
123
+ return decoder(match);
124
+ } catch {
125
+ return match;
126
+ }
127
+ });
128
+ }
129
+ };
130
+ const tryDecodeURI = (str) => tryDecode(str, decodeURI);
131
+ const serveStatic = (options = { root: "" }) => {
132
+ const root = options.root || "";
133
+ const optionPath = options.path;
134
+ if (root !== "" && !existsSync(root)) console.error(`serveStatic: root path '${root}' is not found, are you sure it's correct?`);
135
+ return async (c, next) => {
136
+ if (c.finalized) return next();
137
+ if (c.req.method !== "GET" && c.req.method !== "HEAD") return next();
138
+ let filename;
139
+ if (optionPath) filename = optionPath;
140
+ else try {
141
+ if (!options.allowPercentInPath && c.req.path.includes("%")) throw new Error();
142
+ filename = tryDecodeURI(c.req.path);
143
+ if (/(?:^|[\/\\])\.{1,2}(?:$|[\/\\])|[\/\\]{2,}|\\/.test(filename)) throw new Error();
144
+ } catch {
145
+ await options.onNotFound?.(c.req.path, c);
146
+ return next();
147
+ }
148
+ let path = join(root, !optionPath && options.rewriteRequestPath ? options.rewriteRequestPath(filename, c) : filename);
149
+ let stats = getStats(path);
150
+ if (stats && stats.isDirectory()) {
151
+ const indexFile = options.index ?? "index.html";
152
+ path = join(path, indexFile);
153
+ stats = getStats(path);
154
+ }
155
+ if (!stats) {
156
+ await options.onNotFound?.(path, c);
157
+ return next();
158
+ }
159
+ const mimeType = getMimeType(path);
160
+ c.header("Content-Type", mimeType || "application/octet-stream");
161
+ if (options.precompressed && (!mimeType || mimeType === "application/octet-stream" || COMPRESSIBLE_CONTENT_TYPE_REGEX.test(mimeType))) {
162
+ const acceptEncodingSet = new Set(c.req.header("Accept-Encoding")?.split(",").map((encoding) => encoding.trim()));
163
+ for (const encoding of ENCODINGS_ORDERED_KEYS) {
164
+ if (!acceptEncodingSet.has(encoding)) continue;
165
+ const precompressedStats = getStats(path + ENCODINGS[encoding]);
166
+ if (precompressedStats) {
167
+ c.header("Content-Encoding", encoding);
168
+ c.header("Vary", "Accept-Encoding", { append: true });
169
+ stats = precompressedStats;
170
+ path = path + ENCODINGS[encoding];
171
+ break;
172
+ }
173
+ }
174
+ }
175
+ let result;
176
+ const size = stats.size;
177
+ const range = c.req.header("range") || "";
178
+ c.header("Last-Modified", stats.mtime.toUTCString());
179
+ if (c.req.method === "HEAD") {
180
+ c.header("Content-Length", size.toString());
181
+ c.status(200);
182
+ result = c.body(null);
183
+ } else if (!range) {
184
+ c.header("Content-Length", size.toString());
185
+ result = c.body(createStreamBody(createReadStream(path)), 200);
186
+ } else {
187
+ c.header("Accept-Ranges", "bytes");
188
+ const rangeSpec = parseByteRange(range) ?? {
189
+ type: "open-ended",
190
+ start: 0
191
+ };
192
+ const resolvedRange = resolveByteRange(rangeSpec, size);
193
+ if (!resolvedRange) {
194
+ c.header("Content-Range", `bytes */${size}`);
195
+ result = c.body(null, 416);
196
+ } else {
197
+ const { start, end } = resolvedRange;
198
+ const chunkSize = end - start + 1;
199
+ const stream = createReadStream(path, {
200
+ start,
201
+ end
202
+ });
203
+ c.header("Content-Length", chunkSize.toString());
204
+ c.header("Content-Range", `bytes ${start}-${end}/${size}`);
205
+ result = c.body(createStreamBody(stream), 206);
206
+ }
207
+ }
208
+ await options.onFound?.(path, c);
209
+ return result;
210
+ };
211
+ };
212
+ //#endregion
213
+ export { serveStatic as t };
@@ -0,0 +1,31 @@
1
+ import { I as MiddlewareHandler, _ as Env, i as Data, t as Context } from "./context-Bm7rI-oK.js";
2
+
3
+ //#region ../../plugins/acryl-router/src/core/middleware/serve-static/index.d.ts
4
+ type ServeStaticOptions<E extends Env = Env> = {
5
+ root?: string;
6
+ path?: string;
7
+ precompressed?: boolean; /** Allow percent signs in the routed request path. Defaults to false. */
8
+ allowPercentInPath?: boolean;
9
+ mimes?: Record<string, string>;
10
+ rewriteRequestPath?: (path: string) => string;
11
+ onFound?: (path: string, c: Context<E>) => void | Promise<void>;
12
+ onNotFound?: (path: string, c: Context<E>) => void | Promise<void>;
13
+ };
14
+ /**
15
+ * This middleware is not directly used by the user. Create a wrapper specifying `getContent()` by the environment such as Deno or Bun.
16
+ */
17
+ declare const serveStatic: <E extends Env = Env>(options: ServeStaticOptions<E> & {
18
+ getContent: (path: string, c: Context<E>) => Promise<Data | Response | null>;
19
+ /**
20
+ *
21
+ * `join` option according to the runtime. Example `import { join } from 'node:path`. If not specified, it will fall back to the default join function.`
22
+ */
23
+ join?: (...paths: string[]) => string;
24
+ /**
25
+ * @deprecated Currently, `pathResolve` is no longer used.
26
+ */
27
+ pathResolve?: (path: string) => string;
28
+ isDir?: (path: string) => boolean | undefined | Promise<boolean | undefined>;
29
+ }) => MiddlewareHandler;
30
+ //#endregion
31
+ export { ServeStaticOptions, serveStatic };
@@ -0,0 +1,77 @@
1
+ import { tryDecodeURI } from "./utils/url.js";
2
+ import { parseAccept } from "./utils/accept.js";
3
+ import { COMPRESSIBLE_CONTENT_TYPE_REGEX } from "./utils/compress.js";
4
+ import { getMimeType } from "./utils/mime.js";
5
+ //#region ../../plugins/acryl-router/src/core/middleware/serve-static/path.ts
6
+ /**
7
+ * `defaultJoin` does not support Windows paths and always uses `/` separators.
8
+ * If you need Windows path support, please use `join` exported from `node:path` etc. instead.
9
+ */
10
+ const defaultJoin = (...paths) => {
11
+ let result = paths.filter((p) => p !== "").join("/");
12
+ result = result.replace(/(?<=\/)\/+/g, "");
13
+ const segments = result.split("/");
14
+ const resolved = [];
15
+ for (const segment of segments) if (segment === ".." && resolved.length > 0 && resolved.at(-1) !== "..") resolved.pop();
16
+ else if (segment !== ".") resolved.push(segment);
17
+ return resolved.join("/") || ".";
18
+ };
19
+ //#endregion
20
+ //#region ../../plugins/acryl-router/src/core/middleware/serve-static/index.ts
21
+ const ENCODINGS = {
22
+ br: ".br",
23
+ zstd: ".zst",
24
+ gzip: ".gz"
25
+ };
26
+ const ENCODINGS_ORDERED_KEYS = Object.keys(ENCODINGS);
27
+ const DEFAULT_DOCUMENT = "index.html";
28
+ /**
29
+ * This middleware is not directly used by the user. Create a wrapper specifying `getContent()` by the environment such as Deno or Bun.
30
+ */
31
+ const serveStatic = (options) => {
32
+ const root = options.root ?? "./";
33
+ const optionPath = options.path;
34
+ const join = options.join ?? defaultJoin;
35
+ return async (c, next) => {
36
+ if (c.finalized) return next();
37
+ if (c.req.method !== "GET" && c.req.method !== "HEAD") return next();
38
+ let filename;
39
+ if (options.path) filename = options.path;
40
+ else try {
41
+ if (!options.allowPercentInPath && c.req.path.includes("%")) throw new Error();
42
+ filename = tryDecodeURI(c.req.path);
43
+ if (/(?:^|[\/\\])\.{1,2}(?:$|[\/\\])|[\/\\]{2,}|\\/.test(filename)) throw new Error();
44
+ } catch {
45
+ await options.onNotFound?.(c.req.path, c);
46
+ return next();
47
+ }
48
+ let path = join(root, !optionPath && options.rewriteRequestPath ? options.rewriteRequestPath(filename) : filename);
49
+ if (options.isDir && await options.isDir(path)) path = join(path, DEFAULT_DOCUMENT);
50
+ const getContent = options.getContent;
51
+ let content = await getContent(path, c);
52
+ if (content instanceof Response) return c.newResponse(content.body, content);
53
+ if (content != null) {
54
+ const mimeType = options.mimes && getMimeType(path, options.mimes) || getMimeType(path);
55
+ c.header("Content-Type", mimeType || "application/octet-stream");
56
+ if (options.precompressed && (!mimeType || COMPRESSIBLE_CONTENT_TYPE_REGEX.test(mimeType))) {
57
+ const acceptEncodingSet = new Set(parseAccept(c.req.header("Accept-Encoding") ?? "").filter((encoding) => encoding.q > 0).map((encoding) => encoding.type));
58
+ for (const encoding of ENCODINGS_ORDERED_KEYS) {
59
+ if (!acceptEncodingSet.has(encoding)) continue;
60
+ const compressedContent = await getContent(path + ENCODINGS[encoding], c);
61
+ if (compressedContent) {
62
+ content = compressedContent;
63
+ c.header("Content-Encoding", encoding);
64
+ c.header("Vary", "Accept-Encoding", { append: true });
65
+ break;
66
+ }
67
+ }
68
+ }
69
+ await options.onFound?.(path, c);
70
+ return c.body(content);
71
+ }
72
+ await options.onNotFound?.(path, c);
73
+ await next();
74
+ };
75
+ };
76
+ //#endregion
77
+ export { serveStatic };
@@ -0,0 +1,49 @@
1
+ import { MESSAGE_MATCHER_IS_ALREADY_BUILT, UnsupportedPathError } from "./router.js";
2
+ //#region ../../plugins/acryl-router/src/core/router/smart-router/router.ts
3
+ var SmartRouter = class {
4
+ name = "SmartRouter";
5
+ #routers = [];
6
+ #routes = [];
7
+ constructor(init) {
8
+ this.#routers = init.routers;
9
+ }
10
+ add(method, path, handler) {
11
+ if (!this.#routes) throw new Error(MESSAGE_MATCHER_IS_ALREADY_BUILT);
12
+ this.#routes.push([
13
+ method,
14
+ path,
15
+ handler
16
+ ]);
17
+ }
18
+ match(method, path) {
19
+ if (!this.#routes) throw new Error("Fatal error");
20
+ const routers = this.#routers;
21
+ const routes = this.#routes;
22
+ const len = routers.length;
23
+ let i = 0;
24
+ let res;
25
+ for (; i < len; i++) {
26
+ const router = routers[i];
27
+ try {
28
+ for (let i = 0, len = routes.length; i < len; i++) router.add(...routes[i]);
29
+ res = router.match(method, path);
30
+ } catch (e) {
31
+ if (e instanceof UnsupportedPathError) continue;
32
+ throw e;
33
+ }
34
+ this.match = router.match.bind(router);
35
+ this.#routers = [router];
36
+ this.#routes = void 0;
37
+ break;
38
+ }
39
+ if (i === len) throw new Error("Fatal error");
40
+ this.name = `SmartRouter + ${this.activeRouter.name}`;
41
+ return res;
42
+ }
43
+ get activeRouter() {
44
+ if (this.#routes || this.#routers.length !== 1) throw new Error("No active router has been determined yet.");
45
+ return this.#routers[0];
46
+ }
47
+ };
48
+ //#endregion
49
+ export { SmartRouter as t };
@@ -0,0 +1,34 @@
1
+ //#region ../../plugins/acryl-router/src/core/utils/stream.d.ts
2
+ /**
3
+ * @module
4
+ * Stream utility.
5
+ */
6
+ declare class StreamingApi {
7
+ private writer;
8
+ private encoder;
9
+ private writable;
10
+ private abortSubscribers;
11
+ responseReadable: ReadableStream;
12
+ /**
13
+ * Whether the stream has been aborted.
14
+ */
15
+ aborted: boolean;
16
+ /**
17
+ * Whether the stream has been closed normally.
18
+ */
19
+ closed: boolean;
20
+ constructor(writable: WritableStream, _readable: ReadableStream);
21
+ write(input: Uint8Array | string): Promise<StreamingApi>;
22
+ writeln(input: string): Promise<StreamingApi>;
23
+ sleep(ms: number): Promise<unknown>;
24
+ close(): Promise<void>;
25
+ pipe(body: ReadableStream): Promise<void>;
26
+ onAbort(listener: () => void | Promise<void>): void;
27
+ /**
28
+ * Abort the stream.
29
+ * You can call this method when stream is aborted by external event.
30
+ */
31
+ abort(): void;
32
+ }
33
+ //#endregion
34
+ export { StreamingApi as t };
@@ -0,0 +1,96 @@
1
+ import { HtmlEscapedCallbackPhase, resolveCallback } from "./utils/html.js";
2
+ import { n as TEXT_PLAIN } from "./context-DDO0cfuP.js";
3
+ import { StreamingApi } from "./utils/stream.js";
4
+ //#region ../../plugins/acryl-router/src/core/helper/streaming/utils.ts
5
+ let isOldBunVersion = () => {
6
+ const version = typeof Bun !== "undefined" ? Bun.version : void 0;
7
+ if (version === void 0) return false;
8
+ const result = version.startsWith("1.1") || version.startsWith("1.0") || version.startsWith("0.");
9
+ isOldBunVersion = () => result;
10
+ return result;
11
+ };
12
+ //#endregion
13
+ //#region ../../plugins/acryl-router/src/core/helper/streaming/stream.ts
14
+ const contextStash$1 = /* @__PURE__ */ new WeakMap();
15
+ const stream = (c, cb, onError) => {
16
+ const { readable, writable } = new TransformStream();
17
+ const stream = new StreamingApi(writable, readable);
18
+ if (isOldBunVersion()) c.req.raw.signal.addEventListener("abort", () => {
19
+ if (!stream.closed) stream.abort();
20
+ });
21
+ contextStash$1.set(stream.responseReadable, c);
22
+ (async () => {
23
+ try {
24
+ await cb(stream);
25
+ } catch (e) {
26
+ if (e === void 0) {} else if (e instanceof Error && onError) await onError(e, stream);
27
+ else console.error(e);
28
+ } finally {
29
+ stream.close();
30
+ }
31
+ })();
32
+ return c.newResponse(stream.responseReadable);
33
+ };
34
+ //#endregion
35
+ //#region ../../plugins/acryl-router/src/core/helper/streaming/sse.ts
36
+ var SSEStreamingApi = class extends StreamingApi {
37
+ constructor(writable, readable) {
38
+ super(writable, readable);
39
+ }
40
+ async writeSSE(message) {
41
+ const dataLines = (await resolveCallback(message.data, HtmlEscapedCallbackPhase.Stringify, false, {})).split(/\r\n|\r|\n/).map((line) => {
42
+ return `data: ${line}`;
43
+ }).join("\n");
44
+ for (const key of ["event", "id"]) {
45
+ const value = message[key];
46
+ if (value && /[\r\n]/.test(value)) throw new Error(`${key} must not contain "\\r" or "\\n"`);
47
+ }
48
+ const sseData = [
49
+ message.event && `event: ${message.event}`,
50
+ dataLines,
51
+ message.id !== void 0 && `id: ${message.id}`,
52
+ message.retry !== void 0 && `retry: ${message.retry}`
53
+ ].filter(Boolean).join("\n") + "\n\n";
54
+ await this.write(sseData);
55
+ }
56
+ };
57
+ const run = async (stream, cb, onError) => {
58
+ try {
59
+ await cb(stream);
60
+ } catch (e) {
61
+ if (e instanceof Error && onError) {
62
+ await onError(e, stream);
63
+ await stream.writeSSE({
64
+ event: "error",
65
+ data: e.message
66
+ });
67
+ } else console.error(e);
68
+ } finally {
69
+ stream.close();
70
+ }
71
+ };
72
+ const contextStash = /* @__PURE__ */ new WeakMap();
73
+ const streamSSE = (c, cb, onError) => {
74
+ const { readable, writable } = new TransformStream();
75
+ const stream = new SSEStreamingApi(writable, readable);
76
+ if (isOldBunVersion()) c.req.raw.signal.addEventListener("abort", () => {
77
+ if (!stream.closed) stream.abort();
78
+ });
79
+ contextStash.set(stream.responseReadable, c);
80
+ c.header("Transfer-Encoding", "chunked");
81
+ c.header("Content-Type", "text/event-stream");
82
+ c.header("Cache-Control", "no-cache");
83
+ c.header("Connection", "keep-alive");
84
+ run(stream, cb, onError);
85
+ return c.newResponse(stream.responseReadable);
86
+ };
87
+ //#endregion
88
+ //#region ../../plugins/acryl-router/src/core/helper/streaming/text.ts
89
+ const streamText = (c, cb, onError) => {
90
+ c.header("Content-Type", TEXT_PLAIN);
91
+ c.header("X-Content-Type-Options", "nosniff");
92
+ c.header("Transfer-Encoding", "chunked");
93
+ return stream(c, cb, onError);
94
+ };
95
+ //#endregion
96
+ export { stream as i, SSEStreamingApi as n, streamSSE as r, streamText as t };
@@ -0,0 +1,23 @@
1
+ import { t as Context } from "./context-Bm7rI-oK.js";
2
+ import { t as StreamingApi } from "./stream-CPdqZ0Fp.js";
3
+
4
+ //#region ../../plugins/acryl-router/src/core/helper/streaming/stream.d.ts
5
+ declare const stream: (c: Context, cb: (stream: StreamingApi) => Promise<void>, onError?: (e: Error, stream: StreamingApi) => Promise<void>) => Response;
6
+ //#endregion
7
+ //#region ../../plugins/acryl-router/src/core/helper/streaming/sse.d.ts
8
+ interface SSEMessage {
9
+ data: string | Promise<string>;
10
+ event?: string;
11
+ id?: string;
12
+ retry?: number;
13
+ }
14
+ declare class SSEStreamingApi extends StreamingApi {
15
+ constructor(writable: WritableStream, readable: ReadableStream);
16
+ writeSSE(message: SSEMessage): Promise<void>;
17
+ }
18
+ declare const streamSSE: (c: Context, cb: (stream: SSEStreamingApi) => Promise<void>, onError?: (e: Error, stream: SSEStreamingApi) => Promise<void>) => Response;
19
+ //#endregion
20
+ //#region ../../plugins/acryl-router/src/core/helper/streaming/text.d.ts
21
+ declare const streamText: (c: Context, cb: (stream: StreamingApi) => Promise<void>, onError?: (e: Error, stream: StreamingApi) => Promise<void>) => Response;
22
+ //#endregion
23
+ export { type SSEMessage, SSEStreamingApi, stream, streamSSE, streamText };
@@ -0,0 +1,2 @@
1
+ import { i as stream, n as SSEStreamingApi, r as streamSSE, t as streamText } from "./streaming-DHST3Scg.js";
2
+ export { SSEStreamingApi, stream, streamSSE, streamText };
@@ -0,0 +1,10 @@
1
+ import { J as Schema, a as ExecutionContext } from "./context-Bm7rI-oK.js";
2
+ import { T as UnionToIntersection } from "./types-CwrQjlaM.js";
3
+ import { t as Acryl } from "./app-CmAYW1Al.js";
4
+ import { i as ClientRequestOptions, n as Client } from "./types-CHesD1KG.js";
5
+
6
+ //#region ../../plugins/acryl-router/src/core/helper/testing/index.d.ts
7
+ type ExtractEnv<T> = T extends Acryl<infer E, Schema, string> ? E : never;
8
+ declare const testClient: <T extends Acryl<any, Schema, string>>(app: T, Env?: ExtractEnv<T>["Bindings"] | {}, executionCtx?: ExecutionContext, options?: Omit<ClientRequestOptions, "fetch">) => UnionToIntersection<Client<T, "http://localhost">>;
9
+ //#endregion
10
+ export { testClient };
package/lib/testing.js ADDED
@@ -0,0 +1,17 @@
1
+ import { t as hc } from "./client-BHTr318g.js";
2
+ //#region ../../plugins/acryl-router/src/core/helper/testing/index.ts
3
+ /**
4
+ * @module
5
+ * Testing Helper for Acryl.
6
+ */
7
+ const testClient = (app, Env, executionCtx, options) => {
8
+ const customFetch = (input, init) => {
9
+ return app.request(input, init, Env, executionCtx);
10
+ };
11
+ return hc("http://localhost", {
12
+ ...options,
13
+ fetch: customFetch
14
+ });
15
+ };
16
+ //#endregion
17
+ export { testClient };
@@ -0,0 +1,30 @@
1
+ import { I as MiddlewareHandler, t as Context } from "./context-Bm7rI-oK.js";
2
+ import { HTTPException } from "./http-exception.js";
3
+
4
+ //#region ../../plugins/acryl-router/src/core/middleware/timeout/index.d.ts
5
+ type HTTPExceptionFunction = (context: Context) => HTTPException;
6
+ /**
7
+ * Timeout Middleware for Acryl.
8
+ *
9
+ * @param {number} duration - The timeout duration in milliseconds.
10
+ * @param {HTTPExceptionFunction | HTTPException} [exception=defaultTimeoutException] - The exception to throw when the timeout occurs. Can be a function that returns an HTTPException or an HTTPException object.
11
+ * @returns {MiddlewareHandler} The middleware handler function.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const app = new Acryl()
16
+ *
17
+ * app.use(
18
+ * '/long-request',
19
+ * timeout(5000) // Set timeout to 5 seconds
20
+ * )
21
+ *
22
+ * app.get('/long-request', async (c) => {
23
+ * await someLongRunningFunction()
24
+ * return c.text('Completed within time limit')
25
+ * })
26
+ * ```
27
+ */
28
+ declare const timeout: (duration: number, exception?: HTTPExceptionFunction | HTTPException) => MiddlewareHandler;
29
+ //#endregion
30
+ export { HTTPExceptionFunction, timeout };
package/lib/timeout.js ADDED
@@ -0,0 +1,42 @@
1
+ import { HTTPException } from "./http-exception.js";
2
+ //#region ../../plugins/acryl-router/src/core/middleware/timeout/index.ts
3
+ const defaultTimeoutException = new HTTPException(504, { message: "Gateway Timeout" });
4
+ /**
5
+ * Timeout Middleware for Acryl.
6
+ *
7
+ * @param {number} duration - The timeout duration in milliseconds.
8
+ * @param {HTTPExceptionFunction | HTTPException} [exception=defaultTimeoutException] - The exception to throw when the timeout occurs. Can be a function that returns an HTTPException or an HTTPException object.
9
+ * @returns {MiddlewareHandler} The middleware handler function.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const app = new Acryl()
14
+ *
15
+ * app.use(
16
+ * '/long-request',
17
+ * timeout(5000) // Set timeout to 5 seconds
18
+ * )
19
+ *
20
+ * app.get('/long-request', async (c) => {
21
+ * await someLongRunningFunction()
22
+ * return c.text('Completed within time limit')
23
+ * })
24
+ * ```
25
+ */
26
+ const timeout = (duration, exception = defaultTimeoutException) => {
27
+ return async function timeout(context, next) {
28
+ let timer;
29
+ const timeoutPromise = new Promise((_, reject) => {
30
+ timer = setTimeout(() => {
31
+ reject(typeof exception === "function" ? exception(context) : exception);
32
+ }, duration);
33
+ });
34
+ try {
35
+ await Promise.race([next(), timeoutPromise]);
36
+ } finally {
37
+ if (timer !== void 0) clearTimeout(timer);
38
+ }
39
+ };
40
+ };
41
+ //#endregion
42
+ export { timeout };