bun-types 1.3.2-canary.20251106T140813 → 1.3.2-canary.20251108T140624

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,582 @@
1
+ ---
2
+ title: Redis
3
+ description: Use Bun's native Redis client with a Promise-based API
4
+ ---
5
+
6
+ <Note>Bun's Redis client supports Redis server versions 7.2 and up.</Note>
7
+
8
+ Bun provides native bindings for working with Redis databases with a modern, Promise-based API. The interface is designed to be simple and performant, with built-in connection management, fully typed responses, and TLS support.
9
+
10
+ ```ts redis.ts icon="/icons/typescript.svg"
11
+ import { redis } from "bun";
12
+
13
+ // Set a key
14
+ await redis.set("greeting", "Hello from Bun!");
15
+
16
+ // Get a key
17
+ const greeting = await redis.get("greeting");
18
+ console.log(greeting); // "Hello from Bun!"
19
+
20
+ // Increment a counter
21
+ await redis.set("counter", 0);
22
+ await redis.incr("counter");
23
+
24
+ // Check if a key exists
25
+ const exists = await redis.exists("greeting");
26
+
27
+ // Delete a key
28
+ await redis.del("greeting");
29
+ ```
30
+
31
+ ---
32
+
33
+ ## Getting Started
34
+
35
+ To use the Redis client, you first need to create a connection:
36
+
37
+ ```ts redis.ts icon="/icons/typescript.svg"
38
+ import { redis, RedisClient } from "bun";
39
+
40
+ // Using the default client (reads connection info from environment)
41
+ // process.env.REDIS_URL is used by default
42
+ await redis.set("hello", "world");
43
+ const result = await redis.get("hello");
44
+
45
+ // Creating a custom client
46
+ const client = new RedisClient("redis://username:password@localhost:6379");
47
+ await client.set("counter", "0");
48
+ await client.incr("counter");
49
+ ```
50
+
51
+ By default, the client reads connection information from the following environment variables (in order of precedence):
52
+
53
+ - `REDIS_URL`
54
+ - If not set, defaults to `"redis://localhost:6379"`
55
+
56
+ ### Connection Lifecycle
57
+
58
+ The Redis client automatically handles connections in the background:
59
+
60
+ ```ts redis.ts icon="/icons/typescript.svg"
61
+ // No connection is made until a command is executed
62
+ const client = new RedisClient();
63
+
64
+ // First command initiates the connection
65
+ await client.set("key", "value");
66
+
67
+ // Connection remains open for subsequent commands
68
+ await client.get("key");
69
+
70
+ // Explicitly close the connection when done
71
+ client.close();
72
+ ```
73
+
74
+ You can also manually control the connection lifecycle:
75
+
76
+ ```ts redis.ts icon="/icons/typescript.svg"
77
+ const client = new RedisClient();
78
+
79
+ // Explicitly connect
80
+ await client.connect();
81
+
82
+ // Run commands
83
+ await client.set("key", "value");
84
+
85
+ // Disconnect when done
86
+ client.close();
87
+ ```
88
+
89
+ ---
90
+
91
+ ## Basic Operations
92
+
93
+ ### String Operations
94
+
95
+ ```ts redis.ts icon="/icons/typescript.svg"
96
+ // Set a key
97
+ await redis.set("user:1:name", "Alice");
98
+
99
+ // Get a key
100
+ const name = await redis.get("user:1:name");
101
+
102
+ // Get a key as Uint8Array
103
+ const buffer = await redis.getBuffer("user:1:name");
104
+
105
+ // Delete a key
106
+ await redis.del("user:1:name");
107
+
108
+ // Check if a key exists
109
+ const exists = await redis.exists("user:1:name");
110
+
111
+ // Set expiration (in seconds)
112
+ await redis.set("session:123", "active");
113
+ await redis.expire("session:123", 3600); // expires in 1 hour
114
+
115
+ // Get time to live (in seconds)
116
+ const ttl = await redis.ttl("session:123");
117
+ ```
118
+
119
+ ### Numeric Operations
120
+
121
+ ```ts redis.ts icon="/icons/typescript.svg"
122
+ // Set initial value
123
+ await redis.set("counter", "0");
124
+
125
+ // Increment by 1
126
+ await redis.incr("counter");
127
+
128
+ // Decrement by 1
129
+ await redis.decr("counter");
130
+ ```
131
+
132
+ ### Hash Operations
133
+
134
+ ```ts redis.ts icon="/icons/typescript.svg"
135
+ // Set multiple fields in a hash
136
+ await redis.hmset("user:123", ["name", "Alice", "email", "alice@example.com", "active", "true"]);
137
+
138
+ // Get multiple fields from a hash
139
+ const userFields = await redis.hmget("user:123", ["name", "email"]);
140
+ console.log(userFields); // ["Alice", "alice@example.com"]
141
+
142
+ // Get single field from hash (returns value directly, null if missing)
143
+ const userName = await redis.hget("user:123", "name");
144
+ console.log(userName); // "Alice"
145
+
146
+ // Increment a numeric field in a hash
147
+ await redis.hincrby("user:123", "visits", 1);
148
+
149
+ // Increment a float field in a hash
150
+ await redis.hincrbyfloat("user:123", "score", 1.5);
151
+ ```
152
+
153
+ ### Set Operations
154
+
155
+ ```ts redis.ts icon="/icons/typescript.svg"
156
+ // Add member to set
157
+ await redis.sadd("tags", "javascript");
158
+
159
+ // Remove member from set
160
+ await redis.srem("tags", "javascript");
161
+
162
+ // Check if member exists in set
163
+ const isMember = await redis.sismember("tags", "javascript");
164
+
165
+ // Get all members of a set
166
+ const allTags = await redis.smembers("tags");
167
+
168
+ // Get a random member
169
+ const randomTag = await redis.srandmember("tags");
170
+
171
+ // Pop (remove and return) a random member
172
+ const poppedTag = await redis.spop("tags");
173
+ ```
174
+
175
+ ---
176
+
177
+ ## Pub/Sub
178
+
179
+ Bun provides native bindings for the [Redis
180
+ Pub/Sub](https://redis.io/docs/latest/develop/pubsub/) protocol. **New in Bun
181
+ 1.2.23**
182
+
183
+ <Warning>
184
+ The Redis Pub/Sub feature is experimental. Although we expect it to be stable, we're currently actively looking for
185
+ feedback and areas for improvement.
186
+ </Warning>
187
+
188
+ ### Basic Usage
189
+
190
+ To get started publishing messages, you can set up a publisher in
191
+ `publisher.ts`:
192
+
193
+ ```typescript publisher.ts icon="/icons/typescript.svg"
194
+ import { RedisClient } from "bun";
195
+
196
+ const writer = new RedisClient("redis://localhost:6739");
197
+ await writer.connect();
198
+
199
+ writer.publish("general", "Hello everyone!");
200
+
201
+ writer.close();
202
+ ```
203
+
204
+ In another file, create the subscriber in `subscriber.ts`:
205
+
206
+ ```typescript subscriber.ts icon="/icons/typescript.svg"
207
+ import { RedisClient } from "bun";
208
+
209
+ const listener = new RedisClient("redis://localhost:6739");
210
+ await listener.connect();
211
+
212
+ await listener.subscribe("general", (message, channel) => {
213
+ console.log(`Received: ${message}`);
214
+ });
215
+ ```
216
+
217
+ In one shell, run your subscriber:
218
+
219
+ ```bash terminal icon="terminal"
220
+ bun run subscriber.ts
221
+ ```
222
+
223
+ and, in another, run your publisher:
224
+
225
+ ```bash terminal icon="terminal"
226
+ bun run publisher.ts
227
+ ```
228
+
229
+ <Note>
230
+ The subscription mode takes over the `RedisClient` connection. A
231
+ client with subscriptions can only call `RedisClient.prototype.subscribe()`. In
232
+ other words, applications which need to message Redis need a separate
233
+ connection, acquirable through `.duplicate()`:
234
+
235
+ ```ts redis.ts icon="/icons/typescript.svg"
236
+ import { RedisClient } from "bun";
237
+
238
+ const redis = new RedisClient("redis://localhost:6379");
239
+ await redis.connect();
240
+ const subscriber = await redis.duplicate(); // [!code ++]
241
+
242
+ await subscriber.subscribe("foo", () => {});
243
+ await redis.set("bar", "baz");
244
+ ```
245
+
246
+ </Note>
247
+
248
+ ### Publishing
249
+
250
+ Publishing messages is done through the `publish()` method:
251
+
252
+ ```typescript redis.ts icon="/icons/typescript.svg"
253
+ await client.publish(channelName, message);
254
+ ```
255
+
256
+ ### Subscriptions
257
+
258
+ The Bun `RedisClient` allows you to subscribe to channels through the
259
+ `.subscribe()` method:
260
+
261
+ ```typescript redis.ts icon="/icons/typescript.svg"
262
+ await client.subscribe(channel, (message, channel) => {});
263
+ ```
264
+
265
+ You can unsubscribe through the `.unsubscribe()` method:
266
+
267
+ ```typescript redis.ts icon="/icons/typescript.svg"
268
+ await client.unsubscribe(); // Unsubscribe from all channels.
269
+ await client.unsubscribe(channel); // Unsubscribe a particular channel.
270
+ await client.unsubscribe(channel, listener); // Unsubscribe a particular listener.
271
+ ```
272
+
273
+ ## Advanced Usage
274
+
275
+ ### Command Execution and Pipelining
276
+
277
+ The client automatically pipelines commands, improving performance by sending multiple commands in a batch and processing responses as they arrive.
278
+
279
+ ```ts redis.ts icon="/icons/typescript.svg"
280
+ // Commands are automatically pipelined by default
281
+ const [infoResult, listResult] = await Promise.all([redis.get("user:1:name"), redis.get("user:2:email")]);
282
+ ```
283
+
284
+ To disable automatic pipelining, you can set the `enableAutoPipelining` option to `false`:
285
+
286
+ ```ts redis.ts icon="/icons/typescript.svg"
287
+ const client = new RedisClient("redis://localhost:6379", {
288
+ enableAutoPipelining: false, // [!code ++]
289
+ });
290
+ ```
291
+
292
+ ### Raw Commands
293
+
294
+ When you need to use commands that don't have convenience methods, you can use the `send` method:
295
+
296
+ ```ts redis.ts icon="/icons/typescript.svg"
297
+ // Run any Redis command
298
+ const info = await redis.send("INFO", []);
299
+
300
+ // LPUSH to a list
301
+ await redis.send("LPUSH", ["mylist", "value1", "value2"]);
302
+
303
+ // Get list range
304
+ const list = await redis.send("LRANGE", ["mylist", "0", "-1"]);
305
+ ```
306
+
307
+ The `send` method allows you to use any Redis command, even ones that don't have dedicated methods in the client. The first argument is the command name, and the second argument is an array of string arguments.
308
+
309
+ ### Connection Events
310
+
311
+ You can register handlers for connection events:
312
+
313
+ ```ts redis.ts icon="/icons/typescript.svg"
314
+ const client = new RedisClient();
315
+
316
+ // Called when successfully connected to Redis server
317
+ client.onconnect = () => {
318
+ console.log("Connected to Redis server");
319
+ };
320
+
321
+ // Called when disconnected from Redis server
322
+ client.onclose = error => {
323
+ console.error("Disconnected from Redis server:", error);
324
+ };
325
+
326
+ // Manually connect/disconnect
327
+ await client.connect();
328
+ client.close();
329
+ ```
330
+
331
+ ### Connection Status and Monitoring
332
+
333
+ ```ts redis.ts icon="/icons/typescript.svg"
334
+ // Check if connected
335
+ console.log(client.connected); // boolean indicating connection status
336
+
337
+ // Check amount of data buffered (in bytes)
338
+ console.log(client.bufferedAmount);
339
+ ```
340
+
341
+ ### Type Conversion
342
+
343
+ The Redis client handles automatic type conversion for Redis responses:
344
+
345
+ - Integer responses are returned as JavaScript numbers
346
+ - Bulk strings are returned as JavaScript strings
347
+ - Simple strings are returned as JavaScript strings
348
+ - Null bulk strings are returned as `null`
349
+ - Array responses are returned as JavaScript arrays
350
+ - Error responses throw JavaScript errors with appropriate error codes
351
+ - Boolean responses (RESP3) are returned as JavaScript booleans
352
+ - Map responses (RESP3) are returned as JavaScript objects
353
+ - Set responses (RESP3) are returned as JavaScript arrays
354
+
355
+ Special handling for specific commands:
356
+
357
+ - `EXISTS` returns a boolean instead of a number (1 becomes true, 0 becomes false)
358
+ - `SISMEMBER` returns a boolean (1 becomes true, 0 becomes false)
359
+
360
+ The following commands disable automatic pipelining:
361
+
362
+ - `AUTH`
363
+ - `INFO`
364
+ - `QUIT`
365
+ - `EXEC`
366
+ - `MULTI`
367
+ - `WATCH`
368
+ - `SCRIPT`
369
+ - `SELECT`
370
+ - `CLUSTER`
371
+ - `DISCARD`
372
+ - `UNWATCH`
373
+ - `PIPELINE`
374
+ - `SUBSCRIBE`
375
+ - `UNSUBSCRIBE`
376
+ - `UNPSUBSCRIBE`
377
+
378
+ ---
379
+
380
+ ## Connection Options
381
+
382
+ When creating a client, you can pass various options to configure the connection:
383
+
384
+ ```ts redis.ts icon="/icons/typescript.svg"
385
+ const client = new RedisClient("redis://localhost:6379", {
386
+ // Connection timeout in milliseconds (default: 10000)
387
+ connectionTimeout: 5000,
388
+
389
+ // Idle timeout in milliseconds (default: 0 = no timeout)
390
+ idleTimeout: 30000,
391
+
392
+ // Whether to automatically reconnect on disconnection (default: true)
393
+ autoReconnect: true,
394
+
395
+ // Maximum number of reconnection attempts (default: 10)
396
+ maxRetries: 10,
397
+
398
+ // Whether to queue commands when disconnected (default: true)
399
+ enableOfflineQueue: true,
400
+
401
+ // Whether to automatically pipeline commands (default: true)
402
+ enableAutoPipelining: true,
403
+
404
+ // TLS options (default: false)
405
+ tls: true,
406
+ // Alternatively, provide custom TLS config:
407
+ // tls: {
408
+ // rejectUnauthorized: true,
409
+ // ca: "path/to/ca.pem",
410
+ // cert: "path/to/cert.pem",
411
+ // key: "path/to/key.pem",
412
+ // }
413
+ });
414
+ ```
415
+
416
+ ### Reconnection Behavior
417
+
418
+ When a connection is lost, the client automatically attempts to reconnect with exponential backoff:
419
+
420
+ 1. The client starts with a small delay (50ms) and doubles it with each attempt
421
+ 2. Reconnection delay is capped at 2000ms (2 seconds)
422
+ 3. The client attempts to reconnect up to `maxRetries` times (default: 10)
423
+ 4. Commands executed during disconnection are:
424
+ - Queued if `enableOfflineQueue` is true (default)
425
+ - Rejected immediately if `enableOfflineQueue` is false
426
+
427
+ ---
428
+
429
+ ## Supported URL Formats
430
+
431
+ The Redis client supports various URL formats:
432
+
433
+ ```ts redis.ts icon="/icons/typescript.svg"
434
+ // Standard Redis URL
435
+ new RedisClient("redis://localhost:6379");
436
+ new RedisClient("redis://localhost:6379");
437
+
438
+ // With authentication
439
+ new RedisClient("redis://username:password@localhost:6379");
440
+
441
+ // With database number
442
+ new RedisClient("redis://localhost:6379/0");
443
+
444
+ // TLS connections
445
+ new RedisClient("rediss://localhost:6379");
446
+ new RedisClient("rediss://localhost:6379");
447
+ new RedisClient("redis+tls://localhost:6379");
448
+ new RedisClient("redis+tls://localhost:6379");
449
+
450
+ // Unix socket connections
451
+ new RedisClient("redis+unix:///path/to/socket");
452
+ new RedisClient("redis+unix:///path/to/socket");
453
+
454
+ // TLS over Unix socket
455
+ new RedisClient("redis+tls+unix:///path/to/socket");
456
+ new RedisClient("redis+tls+unix:///path/to/socket");
457
+ ```
458
+
459
+ ---
460
+
461
+ ## Error Handling
462
+
463
+ The Redis client throws typed errors for different scenarios:
464
+
465
+ ```ts redis.ts icon="/icons/typescript.svg"
466
+ try {
467
+ await redis.get("non-existent-key");
468
+ } catch (error) {
469
+ if (error.code === "ERR_REDIS_CONNECTION_CLOSED") {
470
+ console.error("Connection to Redis server was closed");
471
+ } else if (error.code === "ERR_REDIS_AUTHENTICATION_FAILED") {
472
+ console.error("Authentication failed");
473
+ } else {
474
+ console.error("Unexpected error:", error);
475
+ }
476
+ }
477
+ ```
478
+
479
+ Common error codes:
480
+
481
+ - `ERR_REDIS_CONNECTION_CLOSED` - Connection to the server was closed
482
+ - `ERR_REDIS_AUTHENTICATION_FAILED` - Failed to authenticate with the server
483
+ - `ERR_REDIS_INVALID_RESPONSE` - Received an invalid response from the server
484
+
485
+ ---
486
+
487
+ ## Example Use Cases
488
+
489
+ ### Caching
490
+
491
+ ```ts redis.ts icon="/icons/typescript.svg"
492
+ async function getUserWithCache(userId) {
493
+ const cacheKey = `user:${userId}`;
494
+
495
+ // Try to get from cache first
496
+ const cachedUser = await redis.get(cacheKey);
497
+ if (cachedUser) {
498
+ return JSON.parse(cachedUser);
499
+ }
500
+
501
+ // Not in cache, fetch from database
502
+ const user = await database.getUser(userId);
503
+
504
+ // Store in cache for 1 hour
505
+ await redis.set(cacheKey, JSON.stringify(user));
506
+ await redis.expire(cacheKey, 3600);
507
+
508
+ return user;
509
+ }
510
+ ```
511
+
512
+ ### Rate Limiting
513
+
514
+ ```ts redis.ts icon="/icons/typescript.svg"
515
+ async function rateLimit(ip, limit = 100, windowSecs = 3600) {
516
+ const key = `ratelimit:${ip}`;
517
+
518
+ // Increment counter
519
+ const count = await redis.incr(key);
520
+
521
+ // Set expiry if this is the first request in window
522
+ if (count === 1) {
523
+ await redis.expire(key, windowSecs);
524
+ }
525
+
526
+ // Check if limit exceeded
527
+ return {
528
+ limited: count > limit,
529
+ remaining: Math.max(0, limit - count),
530
+ };
531
+ }
532
+ ```
533
+
534
+ ### Session Storage
535
+
536
+ ```ts redis.ts icon="/icons/typescript.svg"
537
+ async function createSession(userId, data) {
538
+ const sessionId = crypto.randomUUID();
539
+ const key = `session:${sessionId}`;
540
+
541
+ // Store session with expiration
542
+ await redis.hmset(key, ["userId", userId.toString(), "created", Date.now().toString(), "data", JSON.stringify(data)]);
543
+ await redis.expire(key, 86400); // 24 hours
544
+
545
+ return sessionId;
546
+ }
547
+
548
+ async function getSession(sessionId) {
549
+ const key = `session:${sessionId}`;
550
+
551
+ // Get session data
552
+ const exists = await redis.exists(key);
553
+ if (!exists) return null;
554
+
555
+ const [userId, created, data] = await redis.hmget(key, ["userId", "created", "data"]);
556
+
557
+ return {
558
+ userId: Number(userId),
559
+ created: Number(created),
560
+ data: JSON.parse(data),
561
+ };
562
+ }
563
+ ```
564
+
565
+ ---
566
+
567
+ ## Implementation Notes
568
+
569
+ Bun's Redis client is implemented in Zig and uses the Redis Serialization Protocol (RESP3). It manages connections efficiently and provides automatic reconnection with exponential backoff.
570
+
571
+ The client supports pipelining commands, meaning multiple commands can be sent without waiting for the replies to previous commands. This significantly improves performance when sending multiple commands in succession.
572
+
573
+ ## Limitations and Future Plans
574
+
575
+ Current limitations of the Redis client we are planning to address in future versions:
576
+
577
+ - Transactions (MULTI/EXEC) must be done through raw commands for now
578
+
579
+ Unsupported features:
580
+
581
+ - Redis Sentinel
582
+ - Redis Cluster