bun-types 1.3.2-canary.20251106T140813 → 1.3.2

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 (316) hide show
  1. package/bun.d.ts +102 -6
  2. package/docs/bundler/bytecode.mdx +465 -0
  3. package/docs/bundler/css.mdx +1024 -0
  4. package/docs/bundler/esbuild.mdx +253 -0
  5. package/docs/bundler/executables.mdx +535 -0
  6. package/docs/bundler/fullstack.mdx +1064 -0
  7. package/docs/bundler/hot-reloading.mdx +229 -0
  8. package/docs/bundler/html-static.mdx +386 -0
  9. package/docs/bundler/index.mdx +1499 -0
  10. package/docs/bundler/loaders.mdx +356 -0
  11. package/docs/bundler/macros.mdx +328 -0
  12. package/docs/bundler/minifier.mdx +1306 -0
  13. package/docs/bundler/plugins.mdx +411 -0
  14. package/docs/feedback.mdx +85 -0
  15. package/docs/guides/binary/arraybuffer-to-array.mdx +29 -0
  16. package/docs/guides/binary/arraybuffer-to-blob.mdx +26 -0
  17. package/docs/guides/binary/arraybuffer-to-buffer.mdx +27 -0
  18. package/docs/guides/binary/arraybuffer-to-string.mdx +17 -0
  19. package/docs/guides/binary/arraybuffer-to-typedarray.mdx +41 -0
  20. package/docs/guides/binary/blob-to-arraybuffer.mdx +16 -0
  21. package/docs/guides/binary/blob-to-dataview.mdx +16 -0
  22. package/docs/guides/binary/blob-to-stream.mdx +16 -0
  23. package/docs/guides/binary/blob-to-string.mdx +17 -0
  24. package/docs/guides/binary/blob-to-typedarray.mdx +16 -0
  25. package/docs/guides/binary/buffer-to-arraybuffer.mdx +16 -0
  26. package/docs/guides/binary/buffer-to-blob.mdx +16 -0
  27. package/docs/guides/binary/buffer-to-readablestream.mdx +43 -0
  28. package/docs/guides/binary/buffer-to-string.mdx +27 -0
  29. package/docs/guides/binary/buffer-to-typedarray.mdx +16 -0
  30. package/docs/guides/binary/dataview-to-string.mdx +17 -0
  31. package/docs/guides/binary/typedarray-to-arraybuffer.mdx +27 -0
  32. package/docs/guides/binary/typedarray-to-blob.mdx +18 -0
  33. package/docs/guides/binary/typedarray-to-buffer.mdx +16 -0
  34. package/docs/guides/binary/typedarray-to-dataview.mdx +16 -0
  35. package/docs/guides/binary/typedarray-to-readablestream.mdx +43 -0
  36. package/docs/guides/binary/typedarray-to-string.mdx +18 -0
  37. package/docs/guides/deployment/aws-lambda.mdx +204 -0
  38. package/docs/guides/deployment/digital-ocean.mdx +161 -0
  39. package/docs/guides/deployment/google-cloud-run.mdx +197 -0
  40. package/docs/guides/deployment/railway.mdx +145 -0
  41. package/docs/guides/deployment/render.mdx +82 -0
  42. package/docs/guides/deployment/vercel.mdx +99 -0
  43. package/docs/guides/ecosystem/astro.mdx +82 -0
  44. package/docs/guides/ecosystem/discordjs.mdx +80 -0
  45. package/docs/guides/ecosystem/docker.mdx +151 -0
  46. package/docs/guides/ecosystem/drizzle.mdx +195 -0
  47. package/docs/guides/ecosystem/edgedb.mdx +257 -0
  48. package/docs/guides/ecosystem/elysia.mdx +31 -0
  49. package/docs/guides/ecosystem/express.mdx +43 -0
  50. package/docs/guides/ecosystem/hono.mdx +47 -0
  51. package/docs/guides/ecosystem/mongoose.mdx +92 -0
  52. package/docs/guides/ecosystem/neon-drizzle.mdx +234 -0
  53. package/docs/guides/ecosystem/neon-serverless-postgres.mdx +60 -0
  54. package/docs/guides/ecosystem/nextjs.mdx +57 -0
  55. package/docs/guides/ecosystem/nuxt.mdx +90 -0
  56. package/docs/guides/ecosystem/pm2.mdx +55 -0
  57. package/docs/guides/ecosystem/prisma-postgres.mdx +169 -0
  58. package/docs/guides/ecosystem/prisma.mdx +164 -0
  59. package/docs/guides/ecosystem/qwik.mdx +114 -0
  60. package/docs/guides/ecosystem/react.mdx +52 -0
  61. package/docs/guides/ecosystem/remix.mdx +97 -0
  62. package/docs/guides/ecosystem/sentry.mdx +54 -0
  63. package/docs/guides/ecosystem/solidstart.mdx +66 -0
  64. package/docs/guides/ecosystem/ssr-react.mdx +49 -0
  65. package/docs/guides/ecosystem/stric.mdx +54 -0
  66. package/docs/guides/ecosystem/sveltekit.mdx +138 -0
  67. package/docs/guides/ecosystem/systemd.mdx +114 -0
  68. package/docs/guides/ecosystem/upstash.mdx +87 -0
  69. package/docs/guides/ecosystem/vite.mdx +77 -0
  70. package/docs/guides/html-rewriter/extract-links.mdx +72 -0
  71. package/docs/guides/html-rewriter/extract-social-meta.mdx +97 -0
  72. package/docs/guides/http/cluster.mdx +69 -0
  73. package/docs/guides/http/fetch-unix.mdx +35 -0
  74. package/docs/guides/http/fetch.mdx +26 -0
  75. package/docs/guides/http/file-uploads.mdx +97 -0
  76. package/docs/guides/http/hot.mdx +28 -0
  77. package/docs/guides/http/proxy.mdx +26 -0
  78. package/docs/guides/http/server.mdx +48 -0
  79. package/docs/guides/http/simple.mdx +20 -0
  80. package/docs/guides/http/stream-file.mdx +50 -0
  81. package/docs/guides/http/stream-iterator.mdx +49 -0
  82. package/docs/guides/http/stream-node-streams-in-bun.mdx +22 -0
  83. package/docs/guides/http/tls.mdx +32 -0
  84. package/docs/guides/index.mdx +10 -0
  85. package/docs/guides/install/add-dev.mdx +28 -0
  86. package/docs/guides/install/add-git.mdx +38 -0
  87. package/docs/guides/install/add-optional.mdx +27 -0
  88. package/docs/guides/install/add-peer.mdx +45 -0
  89. package/docs/guides/install/add-tarball.mdx +35 -0
  90. package/docs/guides/install/add.mdx +44 -0
  91. package/docs/guides/install/azure-artifacts.mdx +76 -0
  92. package/docs/guides/install/cicd.mdx +43 -0
  93. package/docs/guides/install/custom-registry.mdx +32 -0
  94. package/docs/guides/install/from-npm-install-to-bun-install.mdx +230 -0
  95. package/docs/guides/install/git-diff-bun-lockfile.mdx +47 -0
  96. package/docs/guides/install/jfrog-artifactory.mdx +28 -0
  97. package/docs/guides/install/npm-alias.mdx +25 -0
  98. package/docs/guides/install/registry-scope.mdx +40 -0
  99. package/docs/guides/install/trusted.mdx +50 -0
  100. package/docs/guides/install/workspaces.mdx +70 -0
  101. package/docs/guides/install/yarnlock.mdx +50 -0
  102. package/docs/guides/process/argv.mdx +66 -0
  103. package/docs/guides/process/ctrl-c.mdx +18 -0
  104. package/docs/guides/process/ipc.mdx +69 -0
  105. package/docs/guides/process/nanoseconds.mdx +15 -0
  106. package/docs/guides/process/os-signals.mdx +41 -0
  107. package/docs/guides/process/spawn-stderr.mdx +34 -0
  108. package/docs/guides/process/spawn-stdout.mdx +28 -0
  109. package/docs/guides/process/spawn.mdx +43 -0
  110. package/docs/guides/process/stdin.mdx +62 -0
  111. package/docs/guides/read-file/arraybuffer.mdx +30 -0
  112. package/docs/guides/read-file/buffer.mdx +21 -0
  113. package/docs/guides/read-file/exists.mdx +18 -0
  114. package/docs/guides/read-file/json.mdx +19 -0
  115. package/docs/guides/read-file/mime.mdx +22 -0
  116. package/docs/guides/read-file/stream.mdx +28 -0
  117. package/docs/guides/read-file/string.mdx +24 -0
  118. package/docs/guides/read-file/uint8array.mdx +23 -0
  119. package/docs/guides/read-file/watch.mdx +66 -0
  120. package/docs/guides/runtime/build-time-constants.mdx +295 -0
  121. package/docs/guides/runtime/cicd.mdx +45 -0
  122. package/docs/guides/runtime/codesign-macos-executable.mdx +61 -0
  123. package/docs/guides/runtime/define-constant.mdx +149 -0
  124. package/docs/guides/runtime/delete-directory.mdx +39 -0
  125. package/docs/guides/runtime/delete-file.mdx +21 -0
  126. package/docs/guides/runtime/heap-snapshot.mdx +28 -0
  127. package/docs/guides/runtime/import-html.mdx +17 -0
  128. package/docs/guides/runtime/import-json.mdx +46 -0
  129. package/docs/guides/runtime/import-toml.mdx +32 -0
  130. package/docs/guides/runtime/import-yaml.mdx +104 -0
  131. package/docs/guides/runtime/read-env.mdx +37 -0
  132. package/docs/guides/runtime/set-env.mdx +51 -0
  133. package/docs/guides/runtime/shell.mdx +42 -0
  134. package/docs/guides/runtime/timezone.mdx +38 -0
  135. package/docs/guides/runtime/tsconfig-paths.mdx +31 -0
  136. package/docs/guides/runtime/typescript.mdx +51 -0
  137. package/docs/guides/runtime/vscode-debugger.mdx +48 -0
  138. package/docs/guides/runtime/web-debugger.mdx +103 -0
  139. package/docs/guides/streams/node-readable-to-arraybuffer.mdx +13 -0
  140. package/docs/guides/streams/node-readable-to-blob.mdx +13 -0
  141. package/docs/guides/streams/node-readable-to-json.mdx +14 -0
  142. package/docs/guides/streams/node-readable-to-string.mdx +14 -0
  143. package/docs/guides/streams/node-readable-to-uint8array.mdx +13 -0
  144. package/docs/guides/streams/to-array.mdx +16 -0
  145. package/docs/guides/streams/to-arraybuffer.mdx +16 -0
  146. package/docs/guides/streams/to-blob.mdx +16 -0
  147. package/docs/guides/streams/to-buffer.mdx +17 -0
  148. package/docs/guides/streams/to-json.mdx +16 -0
  149. package/docs/guides/streams/to-string.mdx +16 -0
  150. package/docs/guides/streams/to-typedarray.mdx +24 -0
  151. package/docs/guides/test/bail.mdx +24 -0
  152. package/docs/guides/test/coverage-threshold.mdx +67 -0
  153. package/docs/guides/test/coverage.mdx +49 -0
  154. package/docs/guides/test/happy-dom.mdx +73 -0
  155. package/docs/guides/test/migrate-from-jest.mdx +125 -0
  156. package/docs/guides/test/mock-clock.mdx +50 -0
  157. package/docs/guides/test/mock-functions.mdx +70 -0
  158. package/docs/guides/test/rerun-each.mdx +16 -0
  159. package/docs/guides/test/run-tests.mdx +116 -0
  160. package/docs/guides/test/skip-tests.mdx +43 -0
  161. package/docs/guides/test/snapshot.mdx +102 -0
  162. package/docs/guides/test/spy-on.mdx +49 -0
  163. package/docs/guides/test/svelte-test.mdx +113 -0
  164. package/docs/guides/test/testing-library.mdx +93 -0
  165. package/docs/guides/test/timeout.mdx +17 -0
  166. package/docs/guides/test/todo-tests.mdx +74 -0
  167. package/docs/guides/test/update-snapshots.mdx +49 -0
  168. package/docs/guides/test/watch-mode.mdx +24 -0
  169. package/docs/guides/util/base64.mdx +17 -0
  170. package/docs/guides/util/deep-equals.mdx +41 -0
  171. package/docs/guides/util/deflate.mdx +20 -0
  172. package/docs/guides/util/detect-bun.mdx +25 -0
  173. package/docs/guides/util/entrypoint.mdx +19 -0
  174. package/docs/guides/util/escape-html.mdx +24 -0
  175. package/docs/guides/util/file-url-to-path.mdx +16 -0
  176. package/docs/guides/util/gzip.mdx +20 -0
  177. package/docs/guides/util/hash-a-password.mdx +56 -0
  178. package/docs/guides/util/import-meta-dir.mdx +15 -0
  179. package/docs/guides/util/import-meta-file.mdx +15 -0
  180. package/docs/guides/util/import-meta-path.mdx +15 -0
  181. package/docs/guides/util/javascript-uuid.mdx +25 -0
  182. package/docs/guides/util/main.mdx +43 -0
  183. package/docs/guides/util/path-to-file-url.mdx +16 -0
  184. package/docs/guides/util/sleep.mdx +24 -0
  185. package/docs/guides/util/version.mdx +23 -0
  186. package/docs/guides/util/which-path-to-executable-bin.mdx +17 -0
  187. package/docs/guides/websocket/compression.mdx +33 -0
  188. package/docs/guides/websocket/context.mdx +74 -0
  189. package/docs/guides/websocket/pubsub.mdx +40 -0
  190. package/docs/guides/websocket/simple.mdx +35 -0
  191. package/docs/guides/write-file/append.mdx +54 -0
  192. package/docs/guides/write-file/basic.mdx +46 -0
  193. package/docs/guides/write-file/blob.mdx +30 -0
  194. package/docs/guides/write-file/cat.mdx +19 -0
  195. package/docs/guides/write-file/file-cp.mdx +18 -0
  196. package/docs/guides/write-file/filesink.mdx +54 -0
  197. package/docs/guides/write-file/response.mdx +19 -0
  198. package/docs/guides/write-file/stdout.mdx +23 -0
  199. package/docs/guides/write-file/stream.mdx +19 -0
  200. package/docs/guides/write-file/unlink.mdx +18 -0
  201. package/docs/index.mdx +133 -0
  202. package/docs/installation.mdx +365 -0
  203. package/docs/pm/bunx.mdx +83 -0
  204. package/docs/pm/catalogs.mdx +292 -0
  205. package/docs/pm/cli/add.mdx +179 -0
  206. package/docs/pm/cli/audit.mdx +60 -0
  207. package/docs/pm/cli/install.mdx +471 -0
  208. package/docs/pm/cli/link.mdx +48 -0
  209. package/docs/pm/cli/outdated.mdx +197 -0
  210. package/docs/pm/cli/patch.mdx +69 -0
  211. package/docs/pm/cli/pm.mdx +319 -0
  212. package/docs/pm/cli/publish.mdx +123 -0
  213. package/docs/pm/cli/remove.mdx +16 -0
  214. package/docs/pm/cli/update.mdx +140 -0
  215. package/docs/pm/cli/why.mdx +84 -0
  216. package/docs/pm/filter.mdx +102 -0
  217. package/docs/pm/global-cache.mdx +72 -0
  218. package/docs/pm/isolated-installs.mdx +205 -0
  219. package/docs/pm/lifecycle.mdx +57 -0
  220. package/docs/pm/lockfile.mdx +64 -0
  221. package/docs/pm/npmrc.mdx +111 -0
  222. package/docs/pm/overrides.mdx +83 -0
  223. package/docs/pm/scopes-registries.mdx +35 -0
  224. package/docs/pm/security-scanner-api.mdx +95 -0
  225. package/docs/pm/workspaces.mdx +109 -0
  226. package/docs/project/benchmarking.mdx +218 -0
  227. package/docs/project/bindgen.mdx +223 -0
  228. package/docs/project/building-windows.mdx +133 -0
  229. package/docs/project/contributing.mdx +343 -0
  230. package/docs/project/feedback.mdx +20 -0
  231. package/docs/project/license.mdx +78 -0
  232. package/docs/project/roadmap.mdx +8 -0
  233. package/docs/quickstart.mdx +240 -0
  234. package/docs/runtime/auto-install.mdx +97 -0
  235. package/docs/runtime/binary-data.mdx +846 -0
  236. package/docs/runtime/bun-apis.mdx +59 -0
  237. package/docs/runtime/bunfig.mdx +642 -0
  238. package/docs/runtime/c-compiler.mdx +204 -0
  239. package/docs/runtime/child-process.mdx +532 -0
  240. package/docs/runtime/color.mdx +267 -0
  241. package/docs/runtime/console.mdx +67 -0
  242. package/docs/runtime/cookies.mdx +454 -0
  243. package/docs/runtime/debugger.mdx +335 -0
  244. package/docs/runtime/environment-variables.mdx +214 -0
  245. package/docs/runtime/ffi.mdx +565 -0
  246. package/docs/runtime/file-io.mdx +306 -0
  247. package/docs/runtime/file-system-router.mdx +118 -0
  248. package/docs/runtime/file-types.mdx +354 -0
  249. package/docs/runtime/glob.mdx +181 -0
  250. package/docs/runtime/globals.mdx +72 -0
  251. package/docs/runtime/hashing.mdx +315 -0
  252. package/docs/runtime/html-rewriter.mdx +340 -0
  253. package/docs/runtime/http/cookies.mdx +79 -0
  254. package/docs/runtime/http/error-handling.mdx +40 -0
  255. package/docs/runtime/http/metrics.mdx +36 -0
  256. package/docs/runtime/http/routing.mdx +289 -0
  257. package/docs/runtime/http/server.mdx +647 -0
  258. package/docs/runtime/http/tls.mdx +101 -0
  259. package/docs/runtime/http/websockets.mdx +404 -0
  260. package/docs/runtime/index.mdx +223 -0
  261. package/docs/runtime/jsx.mdx +115 -0
  262. package/docs/runtime/module-resolution.mdx +342 -0
  263. package/docs/runtime/networking/dns.mdx +111 -0
  264. package/docs/runtime/networking/fetch.mdx +468 -0
  265. package/docs/runtime/networking/tcp.mdx +239 -0
  266. package/docs/runtime/networking/udp.mdx +129 -0
  267. package/docs/runtime/node-api.mdx +19 -0
  268. package/docs/runtime/nodejs-compat.mdx +468 -0
  269. package/docs/runtime/plugins.mdx +405 -0
  270. package/docs/runtime/redis.mdx +582 -0
  271. package/docs/runtime/s3.mdx +863 -0
  272. package/docs/runtime/secrets.mdx +336 -0
  273. package/docs/runtime/semver.mdx +57 -0
  274. package/docs/runtime/shell.mdx +637 -0
  275. package/docs/runtime/sql.mdx +1404 -0
  276. package/docs/runtime/sqlite.mdx +699 -0
  277. package/docs/runtime/streams.mdx +232 -0
  278. package/docs/runtime/templating/create.mdx +269 -0
  279. package/docs/runtime/templating/init.mdx +58 -0
  280. package/docs/runtime/transpiler.mdx +288 -0
  281. package/docs/runtime/typescript.mdx +58 -0
  282. package/docs/runtime/utils.mdx +922 -0
  283. package/docs/runtime/watch-mode.mdx +161 -0
  284. package/docs/runtime/web-apis.mdx +29 -0
  285. package/docs/runtime/workers.mdx +328 -0
  286. package/docs/runtime/yaml.mdx +469 -0
  287. package/docs/snippets/cli/add.mdx +166 -0
  288. package/docs/snippets/cli/build.mdx +196 -0
  289. package/docs/snippets/cli/feedback.mdx +17 -0
  290. package/docs/snippets/cli/init.mdx +84 -0
  291. package/docs/snippets/cli/install.mdx +173 -0
  292. package/docs/snippets/cli/link.mdx +163 -0
  293. package/docs/snippets/cli/outdated.mdx +140 -0
  294. package/docs/snippets/cli/patch.mdx +171 -0
  295. package/docs/snippets/cli/publish.mdx +198 -0
  296. package/docs/snippets/cli/remove.mdx +146 -0
  297. package/docs/snippets/cli/run.mdx +293 -0
  298. package/docs/snippets/cli/test.mdx +100 -0
  299. package/docs/snippets/cli/update.mdx +144 -0
  300. package/docs/snippets/product-card.mdx +32 -0
  301. package/docs/snippets/product-tiles.mdx +94 -0
  302. package/docs/test/code-coverage.mdx +409 -0
  303. package/docs/test/configuration.mdx +467 -0
  304. package/docs/test/dates-times.mdx +129 -0
  305. package/docs/test/discovery.mdx +90 -0
  306. package/docs/test/dom.mdx +226 -0
  307. package/docs/test/index.mdx +380 -0
  308. package/docs/test/lifecycle.mdx +348 -0
  309. package/docs/test/mocks.mdx +637 -0
  310. package/docs/test/reporters.mdx +117 -0
  311. package/docs/test/runtime-behavior.mdx +342 -0
  312. package/docs/test/snapshots.mdx +434 -0
  313. package/docs/test/writing-tests.mdx +635 -0
  314. package/docs/typescript.mdx +54 -0
  315. package/package.json +8 -6
  316. package/test.d.ts +2 -2
@@ -0,0 +1,79 @@
1
+ ---
2
+ title: Cookies
3
+ description: Work with cookies in HTTP requests and responses using Bun's built-in Cookie API.
4
+ ---
5
+
6
+ Bun provides a built-in API for working with cookies in HTTP requests and responses. The `BunRequest` object includes a `cookies` property that provides a `CookieMap` for easily accessing and manipulating cookies. When using `routes`, `Bun.serve()` automatically tracks `request.cookies.set` and applies them to the response.
7
+
8
+ ## Reading cookies
9
+
10
+ Read cookies from incoming requests using the `cookies` property on the `BunRequest` object:
11
+
12
+ ```ts
13
+ Bun.serve({
14
+ routes: {
15
+ "/profile": req => {
16
+ // Access cookies from the request
17
+ const userId = req.cookies.get("user_id");
18
+ const theme = req.cookies.get("theme") || "light";
19
+
20
+ return Response.json({
21
+ userId,
22
+ theme,
23
+ message: "Profile page",
24
+ });
25
+ },
26
+ },
27
+ });
28
+ ```
29
+
30
+ ## Setting cookies
31
+
32
+ To set cookies, use the `set` method on the `CookieMap` from the `BunRequest` object.
33
+
34
+ ```ts
35
+ Bun.serve({
36
+ routes: {
37
+ "/login": req => {
38
+ const cookies = req.cookies;
39
+
40
+ // Set a cookie with various options
41
+ cookies.set("user_id", "12345", {
42
+ maxAge: 60 * 60 * 24 * 7, // 1 week
43
+ httpOnly: true,
44
+ secure: true,
45
+ path: "/",
46
+ });
47
+
48
+ // Add a theme preference cookie
49
+ cookies.set("theme", "dark");
50
+
51
+ // Modified cookies from the request are automatically applied to the response
52
+ return new Response("Login successful");
53
+ },
54
+ },
55
+ });
56
+ ```
57
+
58
+ `Bun.serve()` automatically tracks modified cookies from the request and applies them to the response.
59
+
60
+ ## Deleting cookies
61
+
62
+ To delete a cookie, use the `delete` method on the `request.cookies` (`CookieMap`) object:
63
+
64
+ ```ts
65
+ Bun.serve({
66
+ routes: {
67
+ "/logout": req => {
68
+ // Delete the user_id cookie
69
+ req.cookies.delete("user_id", {
70
+ path: "/",
71
+ });
72
+
73
+ return new Response("Logged out successfully");
74
+ },
75
+ },
76
+ });
77
+ ```
78
+
79
+ Deleted cookies become a `Set-Cookie` header on the response with the `maxAge` set to `0` and an empty `value`.
@@ -0,0 +1,40 @@
1
+ ---
2
+ title: Error Handling
3
+ description: Learn how to handle errors in Bun's development server
4
+ ---
5
+
6
+ To activate development mode, set `development: true`.
7
+
8
+ ```ts title="server.ts" icon="/icons/typescript.svg"
9
+ Bun.serve({
10
+ development: true, // [!code ++]
11
+ fetch(req) {
12
+ throw new Error("woops!");
13
+ },
14
+ });
15
+ ```
16
+
17
+ In development mode, Bun will surface errors in-browser with a built-in error page.
18
+
19
+ <Frame>![Bun's built-in 500 page](/images/exception_page.png)</Frame>
20
+
21
+ ### `error` callback
22
+
23
+ To handle server-side errors, implement an `error` handler. This function should return a `Response` to serve to the client when an error occurs. This response will supersede Bun's default error page in `development` mode.
24
+
25
+ ```ts
26
+ Bun.serve({
27
+ fetch(req) {
28
+ throw new Error("woops!");
29
+ },
30
+ error(error) {
31
+ return new Response(`<pre>${error}\n${error.stack}</pre>`, {
32
+ headers: {
33
+ "Content-Type": "text/html",
34
+ },
35
+ });
36
+ },
37
+ });
38
+ ```
39
+
40
+ <Info>[Learn more about debugging in Bun](/runtime/debugger)</Info>
@@ -0,0 +1,36 @@
1
+ ---
2
+ title: Metrics
3
+ description: Monitor server activity with built-in metrics
4
+ ---
5
+
6
+ ### `server.pendingRequests` and `server.pendingWebSockets`
7
+
8
+ Monitor server activity with built-in counters:
9
+
10
+ ```ts
11
+ const server = Bun.serve({
12
+ fetch(req, server) {
13
+ return new Response(
14
+ `Active requests: ${server.pendingRequests}\n` + `Active WebSockets: ${server.pendingWebSockets}`,
15
+ );
16
+ },
17
+ });
18
+ ```
19
+
20
+ ### `server.subscriberCount(topic)`
21
+
22
+ Get count of subscribers for a WebSocket topic:
23
+
24
+ ```ts
25
+ const server = Bun.serve({
26
+ fetch(req, server) {
27
+ const chatUsers = server.subscriberCount("chat");
28
+ return new Response(`${chatUsers} users in chat`);
29
+ },
30
+ websocket: {
31
+ message(ws) {
32
+ ws.subscribe("chat");
33
+ },
34
+ },
35
+ });
36
+ ```
@@ -0,0 +1,289 @@
1
+ ---
2
+ title: Routing
3
+ description: Define routes in `Bun.serve` using static paths, parameters, and wildcards
4
+ ---
5
+
6
+ You can add routes to `Bun.serve()` by using the `routes` property (for static paths, parameters, and wildcards) or by handling unmatched requests with the [`fetch`](#fetch) method.
7
+
8
+ `Bun.serve()`'s router builds on top uWebSocket's [tree-based approach](https://github.com/oven-sh/bun/blob/0d1a00fa0f7830f8ecd99c027fce8096c9d459b6/packages/bun-uws/src/HttpRouter.h#L57-L64) to add [SIMD-accelerated route parameter decoding](https://github.com/oven-sh/bun/blob/main/src/bun.js/bindings/decodeURIComponentSIMD.cpp#L21-L271) and [JavaScriptCore structure caching](https://github.com/oven-sh/bun/blob/main/src/bun.js/bindings/ServerRouteList.cpp#L100-L101) to push the performance limits of what modern hardware allows.
9
+
10
+ ## Basic Setup
11
+
12
+ ```ts title="server.ts" icon="/icons/typescript.svg"
13
+ Bun.serve({
14
+ routes: {
15
+ "/": () => new Response("Home"),
16
+ "/api": () => Response.json({ success: true }),
17
+ "/users": async () => Response.json({ users: [] }),
18
+ },
19
+ fetch() {
20
+ return new Response("Unmatched route");
21
+ },
22
+ });
23
+ ```
24
+
25
+ Routes in `Bun.serve()` receive a `BunRequest` (which extends [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request)) and return a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) or `Promise<Response>`. This makes it easier to use the same code for both sending & receiving HTTP requests.
26
+
27
+ ```ts
28
+ // Simplified for brevity
29
+ interface BunRequest<T extends string> extends Request {
30
+ params: Record<T, string>;
31
+ readonly cookies: CookieMap;
32
+ }
33
+ ```
34
+
35
+ ## Asynchronous Routes
36
+
37
+ ### Async/await
38
+
39
+ You can use async/await in route handlers to return a `Promise<Response>`.
40
+
41
+ ```ts
42
+ import { sql, serve } from "bun";
43
+
44
+ serve({
45
+ port: 3001,
46
+ routes: {
47
+ "/api/version": async () => {
48
+ const [version] = await sql`SELECT version()`;
49
+ return Response.json(version);
50
+ },
51
+ },
52
+ });
53
+ ```
54
+
55
+ ### Promise
56
+
57
+ You can also return a `Promise<Response>` from a route handler.
58
+
59
+ ```ts
60
+ import { sql, serve } from "bun";
61
+
62
+ serve({
63
+ routes: {
64
+ "/api/version": () => {
65
+ return new Promise(resolve => {
66
+ setTimeout(async () => {
67
+ const [version] = await sql`SELECT version()`;
68
+ resolve(Response.json(version));
69
+ }, 100);
70
+ });
71
+ },
72
+ },
73
+ });
74
+ ```
75
+
76
+ ---
77
+
78
+ ## Route precedence
79
+
80
+ Routes are matched in order of specificity:
81
+
82
+ 1. Exact routes (`/users/all`)
83
+ 2. Parameter routes (`/users/:id`)
84
+ 3. Wildcard routes (`/users/*`)
85
+ 4. Global catch-all (`/*`)
86
+
87
+ ```ts
88
+ Bun.serve({
89
+ routes: {
90
+ // Most specific first
91
+ "/api/users/me": () => new Response("Current user"),
92
+ "/api/users/:id": req => new Response(`User ${req.params.id}`),
93
+ "/api/*": () => new Response("API catch-all"),
94
+ "/*": () => new Response("Global catch-all"),
95
+ },
96
+ });
97
+ ```
98
+
99
+ ---
100
+
101
+ ## Type-safe route parameters
102
+
103
+ TypeScript parses route parameters when passed as a string literal, so that your editor will show autocomplete when accessing `request.params`.
104
+
105
+ ```ts title="index.ts"
106
+ import type { BunRequest } from "bun";
107
+
108
+ Bun.serve({
109
+ routes: {
110
+ // TypeScript knows the shape of params when passed as a string literal
111
+ "/orgs/:orgId/repos/:repoId": req => {
112
+ const { orgId, repoId } = req.params;
113
+ return Response.json({ orgId, repoId });
114
+ },
115
+
116
+ "/orgs/:orgId/repos/:repoId/settings": (
117
+ // optional: you can explicitly pass a type to BunRequest:
118
+ req: BunRequest<"/orgs/:orgId/repos/:repoId/settings">,
119
+ ) => {
120
+ const { orgId, repoId } = req.params;
121
+ return Response.json({ orgId, repoId });
122
+ },
123
+ },
124
+ });
125
+ ```
126
+
127
+ Percent-encoded route parameter values are automatically decoded. Unicode characters are supported. Invalid unicode is replaced with the unicode replacement character `&0xFFFD;`.
128
+
129
+ ### Static responses
130
+
131
+ Routes can also be `Response` objects (without the handler function). Bun.serve() optimizes it for zero-allocation dispatch - perfect for health checks, redirects, and fixed content:
132
+
133
+ ```ts
134
+ Bun.serve({
135
+ routes: {
136
+ // Health checks
137
+ "/health": new Response("OK"),
138
+ "/ready": new Response("Ready", {
139
+ headers: {
140
+ // Pass custom headers
141
+ "X-Ready": "1",
142
+ },
143
+ }),
144
+
145
+ // Redirects
146
+ "/blog": Response.redirect("https://bun.com/blog"),
147
+
148
+ // API responses
149
+ "/api/config": Response.json({
150
+ version: "1.0.0",
151
+ env: "production",
152
+ }),
153
+ },
154
+ });
155
+ ```
156
+
157
+ Static responses do not allocate additional memory after initialization. You can generally expect at least a 15% performance improvement over manually returning a `Response` object.
158
+
159
+ Static route responses are cached for the lifetime of the server object. To reload static routes, call `server.reload(options)`.
160
+
161
+ ### File Responses vs Static Responses
162
+
163
+ When serving files in routes, there are two distinct behaviors depending on whether you buffer the file content or serve it directly:
164
+
165
+ ```ts
166
+ Bun.serve({
167
+ routes: {
168
+ // Static route - content is buffered in memory at startup
169
+ "/logo.png": new Response(await Bun.file("./logo.png").bytes()),
170
+
171
+ // File route - content is read from filesystem on each request
172
+ "/download.zip": new Response(Bun.file("./download.zip")),
173
+ },
174
+ });
175
+ ```
176
+
177
+ **Static routes** (`new Response(await file.bytes())`) buffer content in memory at startup:
178
+
179
+ - **Zero filesystem I/O** during requests - content served entirely from memory
180
+ - **ETag support** - Automatically generates and validates ETags for caching
181
+ - **If-None-Match** - Returns `304 Not Modified` when client ETag matches
182
+ - **No 404 handling** - Missing files cause startup errors, not runtime 404s
183
+ - **Memory usage** - Full file content stored in RAM
184
+ - **Best for**: Small static assets, API responses, frequently accessed files
185
+
186
+ **File routes** (`new Response(Bun.file(path))`) read from filesystem per request:
187
+
188
+ - **Filesystem reads** on each request - checks file existence and reads content
189
+ - **Built-in 404 handling** - Returns `404 Not Found` if file doesn't exist or becomes inaccessible
190
+ - **Last-Modified support** - Uses file modification time for `If-Modified-Since` headers
191
+ - **If-Modified-Since** - Returns `304 Not Modified` when file hasn't changed since client's cached version
192
+ - **Range request support** - Automatically handles partial content requests with `Content-Range` headers
193
+ - **Streaming transfers** - Uses buffered reader with backpressure handling for efficient memory usage
194
+ - **Memory efficient** - Only buffers small chunks during transfer, not entire file
195
+ - **Best for**: Large files, dynamic content, user uploads, files that change frequently
196
+
197
+ ---
198
+
199
+ ## Streaming files
200
+
201
+ To stream a file, return a `Response` object with a `BunFile` object as the body.
202
+
203
+ ```ts
204
+ Bun.serve({
205
+ fetch(req) {
206
+ return new Response(Bun.file("./hello.txt"));
207
+ },
208
+ });
209
+ ```
210
+
211
+ <Info>
212
+ ⚡️ **Speed** — Bun automatically uses the [`sendfile(2)`](https://man7.org/linux/man-pages/man2/sendfile.2.html)
213
+ system call when possible, enabling zero-copy file transfers in the kernel—the fastest way to send files.
214
+ </Info>
215
+
216
+ You can send part of a file using the [`slice(start, end)`](https://developer.mozilla.org/en-US/docs/Web/API/Blob/slice) method on the `Bun.file` object. This automatically sets the `Content-Range` and `Content-Length` headers on the `Response` object.
217
+
218
+ ```ts
219
+ Bun.serve({
220
+ fetch(req) {
221
+ // parse `Range` header
222
+ const [start = 0, end = Infinity] = req.headers
223
+ .get("Range") // Range: bytes=0-100
224
+ .split("=") // ["Range: bytes", "0-100"]
225
+ .at(-1) // "0-100"
226
+ .split("-") // ["0", "100"]
227
+ .map(Number); // [0, 100]
228
+
229
+ // return a slice of the file
230
+ const bigFile = Bun.file("./big-video.mp4");
231
+ return new Response(bigFile.slice(start, end));
232
+ },
233
+ });
234
+ ```
235
+
236
+ ---
237
+
238
+ ## `fetch` request handler
239
+
240
+ The `fetch` handler handles incoming requests that weren't matched by any route. It receives a [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) object and returns a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) or [`Promise<Response>`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).
241
+
242
+ ```ts
243
+ Bun.serve({
244
+ fetch(req) {
245
+ const url = new URL(req.url);
246
+ if (url.pathname === "/") return new Response("Home page!");
247
+ if (url.pathname === "/blog") return new Response("Blog!");
248
+ return new Response("404!");
249
+ },
250
+ });
251
+ ```
252
+
253
+ The `fetch` handler supports async/await:
254
+
255
+ ```ts
256
+ import { sleep, serve } from "bun";
257
+
258
+ serve({
259
+ async fetch(req) {
260
+ const start = performance.now();
261
+ await sleep(10);
262
+ const end = performance.now();
263
+ return new Response(`Slept for ${end - start}ms`);
264
+ },
265
+ });
266
+ ```
267
+
268
+ Promise-based responses are also supported:
269
+
270
+ ```ts
271
+ Bun.serve({
272
+ fetch(req) {
273
+ // Forward the request to another server.
274
+ return fetch("https://example.com");
275
+ },
276
+ });
277
+ ```
278
+
279
+ You can also access the `Server` object from the `fetch` handler. It's the second argument passed to the `fetch` function.
280
+
281
+ ```ts
282
+ // `server` is passed in as the second argument to `fetch`.
283
+ const server = Bun.serve({
284
+ fetch(req, server) {
285
+ const ip = server.requestIP(req);
286
+ return new Response(`Your IP is ${ip}`);
287
+ },
288
+ });
289
+ ```