bun-types 1.3.2-canary.20251104T140728 → 1.3.2-canary.20251106T140813

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 (312) hide show
  1. package/bun.d.ts +4 -4
  2. package/docs/README.md +28 -0
  3. package/globals.d.ts +0 -1
  4. package/overrides.d.ts +45 -15
  5. package/package.json +1 -1
  6. package/test.d.ts +1 -1
  7. package/docs/api/binary-data.md +0 -1038
  8. package/docs/api/cc.md +0 -197
  9. package/docs/api/color.md +0 -262
  10. package/docs/api/console.md +0 -57
  11. package/docs/api/cookie.md +0 -449
  12. package/docs/api/dns.md +0 -110
  13. package/docs/api/fetch.md +0 -463
  14. package/docs/api/ffi.md +0 -557
  15. package/docs/api/file-io.md +0 -366
  16. package/docs/api/file-system-router.md +0 -112
  17. package/docs/api/file.md +0 -19
  18. package/docs/api/glob.md +0 -178
  19. package/docs/api/globals.md +0 -387
  20. package/docs/api/hashing.md +0 -319
  21. package/docs/api/html-rewriter.md +0 -334
  22. package/docs/api/http.md +0 -1408
  23. package/docs/api/import-meta.md +0 -69
  24. package/docs/api/node-api.md +0 -14
  25. package/docs/api/redis.md +0 -597
  26. package/docs/api/s3.md +0 -850
  27. package/docs/api/secrets.md +0 -319
  28. package/docs/api/semver.md +0 -52
  29. package/docs/api/spawn.md +0 -582
  30. package/docs/api/sql.md +0 -1374
  31. package/docs/api/sqlite.md +0 -694
  32. package/docs/api/streams.md +0 -230
  33. package/docs/api/tcp.md +0 -221
  34. package/docs/api/transpiler.md +0 -276
  35. package/docs/api/udp.md +0 -123
  36. package/docs/api/utils.md +0 -891
  37. package/docs/api/websockets.md +0 -573
  38. package/docs/api/workers.md +0 -322
  39. package/docs/api/yaml.md +0 -668
  40. package/docs/benchmarks.md +0 -120
  41. package/docs/bun-flavored-toml.md +0 -42
  42. package/docs/bundler/css.md +0 -1028
  43. package/docs/bundler/css_modules.md +0 -145
  44. package/docs/bundler/executables.md +0 -626
  45. package/docs/bundler/fullstack.md +0 -418
  46. package/docs/bundler/hmr.md +0 -234
  47. package/docs/bundler/html.md +0 -349
  48. package/docs/bundler/index.md +0 -1735
  49. package/docs/bundler/intro.md +0 -75
  50. package/docs/bundler/loaders.md +0 -410
  51. package/docs/bundler/macros.md +0 -329
  52. package/docs/bundler/plugins.md +0 -449
  53. package/docs/bundler/vs-esbuild.md +0 -1127
  54. package/docs/cli/add.md +0 -173
  55. package/docs/cli/bun-completions.md +0 -3
  56. package/docs/cli/bun-create.md +0 -338
  57. package/docs/cli/bun-install.md +0 -349
  58. package/docs/cli/bun-upgrade.md +0 -39
  59. package/docs/cli/bunx.md +0 -89
  60. package/docs/cli/filter.md +0 -90
  61. package/docs/cli/info.md +0 -65
  62. package/docs/cli/init.md +0 -85
  63. package/docs/cli/install.md +0 -344
  64. package/docs/cli/link.md +0 -40
  65. package/docs/cli/outdated.md +0 -90
  66. package/docs/cli/patch-commit.md +0 -11
  67. package/docs/cli/pm.md +0 -285
  68. package/docs/cli/publish.md +0 -120
  69. package/docs/cli/remove.md +0 -7
  70. package/docs/cli/run.md +0 -261
  71. package/docs/cli/test.md +0 -397
  72. package/docs/cli/unlink.md +0 -9
  73. package/docs/cli/update.md +0 -129
  74. package/docs/cli/why.md +0 -67
  75. package/docs/contributing/upgrading-webkit.md +0 -57
  76. package/docs/ecosystem/elysia.md +0 -24
  77. package/docs/ecosystem/express.md +0 -37
  78. package/docs/ecosystem/hono.md +0 -18
  79. package/docs/ecosystem/react.md +0 -65
  80. package/docs/ecosystem/stric.md +0 -38
  81. package/docs/guides/binary/arraybuffer-to-array.md +0 -27
  82. package/docs/guides/binary/arraybuffer-to-blob.md +0 -24
  83. package/docs/guides/binary/arraybuffer-to-buffer.md +0 -25
  84. package/docs/guides/binary/arraybuffer-to-string.md +0 -15
  85. package/docs/guides/binary/arraybuffer-to-typedarray.md +0 -39
  86. package/docs/guides/binary/blob-to-arraybuffer.md +0 -14
  87. package/docs/guides/binary/blob-to-dataview.md +0 -14
  88. package/docs/guides/binary/blob-to-stream.md +0 -14
  89. package/docs/guides/binary/blob-to-string.md +0 -15
  90. package/docs/guides/binary/blob-to-typedarray.md +0 -14
  91. package/docs/guides/binary/buffer-to-arraybuffer.md +0 -14
  92. package/docs/guides/binary/buffer-to-blob.md +0 -14
  93. package/docs/guides/binary/buffer-to-readablestream.md +0 -41
  94. package/docs/guides/binary/buffer-to-string.md +0 -25
  95. package/docs/guides/binary/buffer-to-typedarray.md +0 -14
  96. package/docs/guides/binary/dataview-to-string.md +0 -15
  97. package/docs/guides/binary/typedarray-to-arraybuffer.md +0 -25
  98. package/docs/guides/binary/typedarray-to-blob.md +0 -16
  99. package/docs/guides/binary/typedarray-to-buffer.md +0 -14
  100. package/docs/guides/binary/typedarray-to-dataview.md +0 -14
  101. package/docs/guides/binary/typedarray-to-readablestream.md +0 -41
  102. package/docs/guides/binary/typedarray-to-string.md +0 -16
  103. package/docs/guides/deployment/railway.md +0 -157
  104. package/docs/guides/ecosystem/astro.md +0 -72
  105. package/docs/guides/ecosystem/discordjs.md +0 -77
  106. package/docs/guides/ecosystem/docker.md +0 -140
  107. package/docs/guides/ecosystem/drizzle.md +0 -185
  108. package/docs/guides/ecosystem/edgedb.md +0 -228
  109. package/docs/guides/ecosystem/elysia.md +0 -31
  110. package/docs/guides/ecosystem/express.md +0 -40
  111. package/docs/guides/ecosystem/hono.md +0 -39
  112. package/docs/guides/ecosystem/mongoose.md +0 -87
  113. package/docs/guides/ecosystem/neon-drizzle.md +0 -220
  114. package/docs/guides/ecosystem/neon-serverless-postgres.md +0 -55
  115. package/docs/guides/ecosystem/nextjs.md +0 -49
  116. package/docs/guides/ecosystem/nuxt.md +0 -56
  117. package/docs/guides/ecosystem/pm2.md +0 -57
  118. package/docs/guides/ecosystem/prisma.md +0 -141
  119. package/docs/guides/ecosystem/qwik.md +0 -107
  120. package/docs/guides/ecosystem/react.md +0 -50
  121. package/docs/guides/ecosystem/remix.md +0 -78
  122. package/docs/guides/ecosystem/render.md +0 -79
  123. package/docs/guides/ecosystem/sentry.md +0 -52
  124. package/docs/guides/ecosystem/solidstart.md +0 -58
  125. package/docs/guides/ecosystem/ssr-react.md +0 -51
  126. package/docs/guides/ecosystem/stric.md +0 -55
  127. package/docs/guides/ecosystem/sveltekit.md +0 -125
  128. package/docs/guides/ecosystem/systemd.md +0 -113
  129. package/docs/guides/ecosystem/vite.md +0 -71
  130. package/docs/guides/html-rewriter/extract-links.md +0 -68
  131. package/docs/guides/html-rewriter/extract-social-meta.md +0 -93
  132. package/docs/guides/http/cluster.md +0 -66
  133. package/docs/guides/http/fetch-unix.md +0 -33
  134. package/docs/guides/http/fetch.md +0 -24
  135. package/docs/guides/http/file-uploads.md +0 -94
  136. package/docs/guides/http/hot.md +0 -26
  137. package/docs/guides/http/proxy.md +0 -24
  138. package/docs/guides/http/server.md +0 -46
  139. package/docs/guides/http/simple.md +0 -18
  140. package/docs/guides/http/stream-file.md +0 -48
  141. package/docs/guides/http/stream-iterator.md +0 -47
  142. package/docs/guides/http/stream-node-streams-in-bun.md +0 -20
  143. package/docs/guides/http/tls.md +0 -30
  144. package/docs/guides/install/add-dev.md +0 -26
  145. package/docs/guides/install/add-git.md +0 -36
  146. package/docs/guides/install/add-optional.md +0 -25
  147. package/docs/guides/install/add-peer.md +0 -43
  148. package/docs/guides/install/add-tarball.md +0 -33
  149. package/docs/guides/install/add.md +0 -42
  150. package/docs/guides/install/azure-artifacts.md +0 -73
  151. package/docs/guides/install/cicd.md +0 -41
  152. package/docs/guides/install/custom-registry.md +0 -30
  153. package/docs/guides/install/from-npm-install-to-bun-install.md +0 -214
  154. package/docs/guides/install/git-diff-bun-lockfile.md +0 -44
  155. package/docs/guides/install/jfrog-artifactory.md +0 -28
  156. package/docs/guides/install/npm-alias.md +0 -23
  157. package/docs/guides/install/registry-scope.md +0 -38
  158. package/docs/guides/install/trusted.md +0 -46
  159. package/docs/guides/install/workspaces.md +0 -70
  160. package/docs/guides/install/yarnlock.md +0 -44
  161. package/docs/guides/process/argv.md +0 -58
  162. package/docs/guides/process/ctrl-c.md +0 -16
  163. package/docs/guides/process/ipc.md +0 -66
  164. package/docs/guides/process/nanoseconds.md +0 -13
  165. package/docs/guides/process/os-signals.md +0 -39
  166. package/docs/guides/process/spawn-stderr.md +0 -31
  167. package/docs/guides/process/spawn-stdout.md +0 -26
  168. package/docs/guides/process/spawn.md +0 -41
  169. package/docs/guides/process/stdin.md +0 -54
  170. package/docs/guides/read-file/arraybuffer.md +0 -28
  171. package/docs/guides/read-file/buffer.md +0 -19
  172. package/docs/guides/read-file/exists.md +0 -16
  173. package/docs/guides/read-file/json.md +0 -17
  174. package/docs/guides/read-file/mime.md +0 -20
  175. package/docs/guides/read-file/stream.md +0 -26
  176. package/docs/guides/read-file/string.md +0 -22
  177. package/docs/guides/read-file/uint8array.md +0 -21
  178. package/docs/guides/read-file/watch.md +0 -68
  179. package/docs/guides/runtime/build-time-constants.md +0 -293
  180. package/docs/guides/runtime/cicd.md +0 -43
  181. package/docs/guides/runtime/codesign-macos-executable.md +0 -56
  182. package/docs/guides/runtime/define-constant.md +0 -145
  183. package/docs/guides/runtime/delete-directory.md +0 -37
  184. package/docs/guides/runtime/delete-file.md +0 -19
  185. package/docs/guides/runtime/heap-snapshot.md +0 -26
  186. package/docs/guides/runtime/import-html.md +0 -15
  187. package/docs/guides/runtime/import-json.md +0 -44
  188. package/docs/guides/runtime/import-toml.md +0 -30
  189. package/docs/guides/runtime/import-yaml.md +0 -102
  190. package/docs/guides/runtime/read-env.md +0 -32
  191. package/docs/guides/runtime/set-env.md +0 -47
  192. package/docs/guides/runtime/shell.md +0 -40
  193. package/docs/guides/runtime/timezone.md +0 -35
  194. package/docs/guides/runtime/tsconfig-paths.md +0 -29
  195. package/docs/guides/runtime/typescript.md +0 -49
  196. package/docs/guides/runtime/vscode-debugger.md +0 -47
  197. package/docs/guides/runtime/web-debugger.md +0 -82
  198. package/docs/guides/streams/node-readable-to-arraybuffer.md +0 -11
  199. package/docs/guides/streams/node-readable-to-blob.md +0 -11
  200. package/docs/guides/streams/node-readable-to-json.md +0 -12
  201. package/docs/guides/streams/node-readable-to-string.md +0 -12
  202. package/docs/guides/streams/node-readable-to-uint8array.md +0 -11
  203. package/docs/guides/streams/to-array.md +0 -14
  204. package/docs/guides/streams/to-arraybuffer.md +0 -14
  205. package/docs/guides/streams/to-blob.md +0 -14
  206. package/docs/guides/streams/to-buffer.md +0 -15
  207. package/docs/guides/streams/to-json.md +0 -14
  208. package/docs/guides/streams/to-string.md +0 -14
  209. package/docs/guides/streams/to-typedarray.md +0 -22
  210. package/docs/guides/test/bail.md +0 -22
  211. package/docs/guides/test/coverage-threshold.md +0 -60
  212. package/docs/guides/test/coverage.md +0 -44
  213. package/docs/guides/test/happy-dom.md +0 -68
  214. package/docs/guides/test/migrate-from-jest.md +0 -143
  215. package/docs/guides/test/mock-clock.md +0 -48
  216. package/docs/guides/test/mock-functions.md +0 -68
  217. package/docs/guides/test/rerun-each.md +0 -14
  218. package/docs/guides/test/run-tests.md +0 -111
  219. package/docs/guides/test/skip-tests.md +0 -39
  220. package/docs/guides/test/snapshot.md +0 -95
  221. package/docs/guides/test/spy-on.md +0 -46
  222. package/docs/guides/test/svelte-test.md +0 -120
  223. package/docs/guides/test/testing-library.md +0 -92
  224. package/docs/guides/test/timeout.md +0 -15
  225. package/docs/guides/test/todo-tests.md +0 -67
  226. package/docs/guides/test/update-snapshots.md +0 -46
  227. package/docs/guides/test/watch-mode.md +0 -19
  228. package/docs/guides/util/base64.md +0 -15
  229. package/docs/guides/util/deep-equals.md +0 -39
  230. package/docs/guides/util/deflate.md +0 -18
  231. package/docs/guides/util/detect-bun.md +0 -23
  232. package/docs/guides/util/entrypoint.md +0 -17
  233. package/docs/guides/util/escape-html.md +0 -22
  234. package/docs/guides/util/file-url-to-path.md +0 -14
  235. package/docs/guides/util/gzip.md +0 -18
  236. package/docs/guides/util/hash-a-password.md +0 -54
  237. package/docs/guides/util/import-meta-dir.md +0 -13
  238. package/docs/guides/util/import-meta-file.md +0 -13
  239. package/docs/guides/util/import-meta-path.md +0 -13
  240. package/docs/guides/util/javascript-uuid.md +0 -23
  241. package/docs/guides/util/main.md +0 -32
  242. package/docs/guides/util/path-to-file-url.md +0 -14
  243. package/docs/guides/util/sleep.md +0 -22
  244. package/docs/guides/util/version.md +0 -21
  245. package/docs/guides/util/which-path-to-executable-bin.md +0 -15
  246. package/docs/guides/websocket/compression.md +0 -31
  247. package/docs/guides/websocket/context.md +0 -77
  248. package/docs/guides/websocket/pubsub.md +0 -41
  249. package/docs/guides/websocket/simple.md +0 -33
  250. package/docs/guides/write-file/append.md +0 -52
  251. package/docs/guides/write-file/basic.md +0 -44
  252. package/docs/guides/write-file/blob.md +0 -28
  253. package/docs/guides/write-file/cat.md +0 -17
  254. package/docs/guides/write-file/file-cp.md +0 -16
  255. package/docs/guides/write-file/filesink.md +0 -52
  256. package/docs/guides/write-file/response.md +0 -17
  257. package/docs/guides/write-file/stdout.md +0 -21
  258. package/docs/guides/write-file/stream.md +0 -17
  259. package/docs/guides/write-file/unlink.md +0 -16
  260. package/docs/index.md +0 -77
  261. package/docs/install/audit.md +0 -57
  262. package/docs/install/cache.md +0 -59
  263. package/docs/install/catalogs.md +0 -298
  264. package/docs/install/index.md +0 -248
  265. package/docs/install/isolated.md +0 -197
  266. package/docs/install/lifecycle.md +0 -46
  267. package/docs/install/lockfile.md +0 -58
  268. package/docs/install/npmrc.md +0 -105
  269. package/docs/install/overrides.md +0 -73
  270. package/docs/install/patch.md +0 -59
  271. package/docs/install/registries.md +0 -30
  272. package/docs/install/security-scanner-api.md +0 -81
  273. package/docs/install/workspaces.md +0 -114
  274. package/docs/installation.md +0 -327
  275. package/docs/project/asan.md +0 -124
  276. package/docs/project/benchmarking.md +0 -203
  277. package/docs/project/bindgen.md +0 -225
  278. package/docs/project/building-windows.md +0 -162
  279. package/docs/project/contributing.md +0 -347
  280. package/docs/project/internals/build-process-for-ci.md +0 -75
  281. package/docs/project/licensing.md +0 -73
  282. package/docs/project/roadmap.md +0 -87
  283. package/docs/quickstart.md +0 -157
  284. package/docs/runtime/autoimport.md +0 -94
  285. package/docs/runtime/bun-apis.md +0 -207
  286. package/docs/runtime/bunfig.md +0 -772
  287. package/docs/runtime/debugger.md +0 -325
  288. package/docs/runtime/env.md +0 -253
  289. package/docs/runtime/hot.md +0 -145
  290. package/docs/runtime/index.md +0 -312
  291. package/docs/runtime/jsx.md +0 -385
  292. package/docs/runtime/loaders.md +0 -130
  293. package/docs/runtime/modules.md +0 -320
  294. package/docs/runtime/nodejs-apis.md +0 -463
  295. package/docs/runtime/plugins.md +0 -561
  296. package/docs/runtime/shell.md +0 -605
  297. package/docs/runtime/typescript.md +0 -139
  298. package/docs/runtime/web-apis.md +0 -128
  299. package/docs/test/configuration.md +0 -154
  300. package/docs/test/coverage.md +0 -142
  301. package/docs/test/discovery.md +0 -85
  302. package/docs/test/dom.md +0 -75
  303. package/docs/test/examples/concurrent-test-glob.md +0 -132
  304. package/docs/test/hot.md +0 -15
  305. package/docs/test/lifecycle.md +0 -81
  306. package/docs/test/mocks.md +0 -313
  307. package/docs/test/reporters.md +0 -117
  308. package/docs/test/runtime-behavior.md +0 -95
  309. package/docs/test/snapshots.md +0 -68
  310. package/docs/test/time.md +0 -126
  311. package/docs/test/writing.md +0 -825
  312. package/docs/typescript.md +0 -53
@@ -1,69 +0,0 @@
1
- The `import.meta` object is a way for a module to access information about itself. It's part of the JavaScript language, but its contents are not standardized. Each "host" (browser, runtime, etc) is free to implement any properties it wishes on the `import.meta` object.
2
-
3
- Bun implements the following properties.
4
-
5
- ```ts#/path/to/project/file.ts
6
- import.meta.dir; // => "/path/to/project"
7
- import.meta.file; // => "file.ts"
8
- import.meta.path; // => "/path/to/project/file.ts"
9
- import.meta.url; // => "file:///path/to/project/file.ts"
10
-
11
- import.meta.main; // `true` if this file is directly executed by `bun run`
12
- // `false` otherwise
13
-
14
- import.meta.resolve("zod"); // => "file:///path/to/project/node_modules/zod/index.js"
15
- ```
16
-
17
- {% table %}
18
-
19
- ---
20
-
21
- - `import.meta.dir`
22
- - Absolute path to the directory containing the current file, e.g. `/path/to/project`. Equivalent to `__dirname` in CommonJS modules (and Node.js)
23
-
24
- ---
25
-
26
- - `import.meta.dirname`
27
- - An alias to `import.meta.dir`, for Node.js compatibility
28
-
29
- ---
30
-
31
- - `import.meta.env`
32
- - An alias to `process.env`.
33
-
34
- ---
35
-
36
- - `import.meta.file`
37
- - The name of the current file, e.g. `index.tsx`
38
-
39
- ---
40
-
41
- - `import.meta.path`
42
- - Absolute path to the current file, e.g. `/path/to/project/index.ts`. Equivalent to `__filename` in CommonJS modules (and Node.js)
43
-
44
- ---
45
-
46
- - `import.meta.filename`
47
- - An alias to `import.meta.path`, for Node.js compatibility
48
-
49
- ---
50
-
51
- - `import.meta.main`
52
- - Indicates whether the current file is the entrypoint to the current `bun` process. Is the file being directly executed by `bun run` or is it being imported?
53
-
54
- ---
55
-
56
- - `import.meta.resolve`
57
- - Resolve a module specifier (e.g. `"zod"` or `"./file.tsx"`) to a url. Equivalent to [`import.meta.resolve` in browsers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import.meta#resolve)
58
-
59
- ```ts
60
- import.meta.resolve("zod");
61
- // => "file:///path/to/project/node_modules/zod/index.ts"
62
- ```
63
-
64
- ---
65
-
66
- - `import.meta.url`
67
- - A `string` url to the current file, e.g. `file:///path/to/project/index.ts`. Equivalent to [`import.meta.url` in browsers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import.meta#url)
68
-
69
- {% /table %}
@@ -1,14 +0,0 @@
1
- Node-API is an interface for building native add-ons to Node.js. Bun implements 95% of this interface from scratch, so most existing Node-API extensions will work with Bun out of the box. Track the completion status of it in [this issue](https://github.com/oven-sh/bun/issues/158).
2
-
3
- As in Node.js, `.node` files (Node-API modules) can be required directly in Bun.
4
-
5
- ```js
6
- const napi = require("./my-node-module.node");
7
- ```
8
-
9
- Alternatively, use `process.dlopen`:
10
-
11
- ```js
12
- let mod = { exports: {} };
13
- process.dlopen(mod, "./my-node-module.node");
14
- ```
package/docs/api/redis.md DELETED
@@ -1,597 +0,0 @@
1
- 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. **New in Bun v1.2.9**
2
-
3
- ```ts
4
- import { redis } from "bun";
5
-
6
- // Set a key
7
- await redis.set("greeting", "Hello from Bun!");
8
-
9
- // Get a key
10
- const greeting = await redis.get("greeting");
11
- console.log(greeting); // "Hello from Bun!"
12
-
13
- // Increment a counter
14
- await redis.set("counter", 0);
15
- await redis.incr("counter");
16
-
17
- // Check if a key exists
18
- const exists = await redis.exists("greeting");
19
-
20
- // Delete a key
21
- await redis.del("greeting");
22
- ```
23
-
24
- ## Getting Started
25
-
26
- To use the Redis client, you first need to create a connection:
27
-
28
- ```ts
29
- import { redis, RedisClient } from "bun";
30
-
31
- // Using the default client (reads connection info from environment)
32
- // process.env.REDIS_URL is used by default
33
- await redis.set("hello", "world");
34
- const result = await redis.get("hello");
35
-
36
- // Creating a custom client
37
- const client = new RedisClient("redis://username:password@localhost:6379");
38
- await client.set("counter", "0");
39
- await client.incr("counter");
40
- ```
41
-
42
- By default, the client reads connection information from the following environment variables (in order of precedence):
43
-
44
- - `REDIS_URL`
45
- - `VALKEY_URL`
46
- - If not set, defaults to `"redis://localhost:6379"`
47
-
48
- ### Connection Lifecycle
49
-
50
- The Redis client automatically handles connections in the background:
51
-
52
- ```ts
53
- // No connection is made until a command is executed
54
- const client = new RedisClient();
55
-
56
- // First command initiates the connection
57
- await client.set("key", "value");
58
-
59
- // Connection remains open for subsequent commands
60
- await client.get("key");
61
-
62
- // Explicitly close the connection when done
63
- client.close();
64
- ```
65
-
66
- You can also manually control the connection lifecycle:
67
-
68
- ```ts
69
- const client = new RedisClient();
70
-
71
- // Explicitly connect
72
- await client.connect();
73
-
74
- // Run commands
75
- await client.set("key", "value");
76
-
77
- // Disconnect when done
78
- client.close();
79
- ```
80
-
81
- ## Basic Operations
82
-
83
- ### String Operations
84
-
85
- ```ts
86
- // Set a key
87
- await redis.set("user:1:name", "Alice");
88
-
89
- // Get a key
90
- const name = await redis.get("user:1:name");
91
-
92
- // Get a key as Uint8Array
93
- const buffer = await redis.getBuffer("user:1:name");
94
-
95
- // Delete a key
96
- await redis.del("user:1:name");
97
-
98
- // Check if a key exists
99
- const exists = await redis.exists("user:1:name");
100
-
101
- // Set expiration (in seconds)
102
- await redis.set("session:123", "active");
103
- await redis.expire("session:123", 3600); // expires in 1 hour
104
-
105
- // Get time to live (in seconds)
106
- const ttl = await redis.ttl("session:123");
107
- ```
108
-
109
- ### Numeric Operations
110
-
111
- ```ts
112
- // Set initial value
113
- await redis.set("counter", "0");
114
-
115
- // Increment by 1
116
- await redis.incr("counter");
117
-
118
- // Decrement by 1
119
- await redis.decr("counter");
120
- ```
121
-
122
- ### Hash Operations
123
-
124
- ```ts
125
- // Set multiple fields in a hash
126
- await redis.hmset("user:123", [
127
- "name",
128
- "Alice",
129
- "email",
130
- "alice@example.com",
131
- "active",
132
- "true",
133
- ]);
134
-
135
- // Get multiple fields from a hash
136
- const userFields = await redis.hmget("user:123", ["name", "email"]);
137
- console.log(userFields); // ["Alice", "alice@example.com"]
138
-
139
- // Get single field from hash (returns value directly, null if missing)
140
- const userName = await redis.hget("user:123", "name");
141
- console.log(userName); // "Alice"
142
-
143
- // Increment a numeric field in a hash
144
- await redis.hincrby("user:123", "visits", 1);
145
-
146
- // Increment a float field in a hash
147
- await redis.hincrbyfloat("user:123", "score", 1.5);
148
- ```
149
-
150
- ### Set Operations
151
-
152
- ```ts
153
- // Add member to set
154
- await redis.sadd("tags", "javascript");
155
-
156
- // Remove member from set
157
- await redis.srem("tags", "javascript");
158
-
159
- // Check if member exists in set
160
- const isMember = await redis.sismember("tags", "javascript");
161
-
162
- // Get all members of a set
163
- const allTags = await redis.smembers("tags");
164
-
165
- // Get a random member
166
- const randomTag = await redis.srandmember("tags");
167
-
168
- // Pop (remove and return) a random member
169
- const poppedTag = await redis.spop("tags");
170
- ```
171
-
172
- ## Pub/Sub
173
-
174
- Bun provides native bindings for the [Redis
175
- Pub/Sub](https://redis.io/docs/latest/develop/pubsub/) protocol. **New in Bun
176
- 1.2.23**
177
-
178
- {% callout %}
179
- **🚧** — The Redis Pub/Sub feature is experimental. Although we expect it to be
180
- stable, we're currently actively looking for feedback and areas for improvement.
181
- {% /callout %}
182
-
183
- ### Basic Usage
184
-
185
- To get started publishing messages, you can set up a publisher in
186
- `publisher.ts`:
187
-
188
- ```typescript#publisher.ts
189
- import { RedisClient } from "bun";
190
-
191
- const writer = new RedisClient("redis://localhost:6739");
192
- await writer.connect();
193
-
194
- writer.publish("general", "Hello everyone!");
195
-
196
- writer.close();
197
- ```
198
-
199
- In another file, create the subscriber in `subscriber.ts`:
200
-
201
- ```typescript#subscriber.ts
202
- import { RedisClient } from "bun";
203
-
204
- const listener = new RedisClient("redis://localhost:6739");
205
- await listener.connect();
206
-
207
- await listener.subscribe("general", (message, channel) => {
208
- console.log(`Received: ${message}`);
209
- });
210
- ```
211
-
212
- In one shell, run your subscriber:
213
-
214
- ```bash
215
- bun run subscriber.ts
216
- ```
217
-
218
- and, in another, run your publisher:
219
-
220
- ```bash
221
- bun run publisher.ts
222
- ```
223
-
224
- {% callout %}
225
- **Note:** The subscription mode takes over the `RedisClient` connection. A
226
- client with subscriptions can only call `RedisClient.prototype.subscribe()`. In
227
- other words, applications which need to message Redis need a separate
228
- connection, acquirable through `.duplicate()`:
229
-
230
- ```typescript
231
- import { RedisClient } from "bun";
232
-
233
- const redis = new RedisClient("redis://localhost:6379");
234
- await redis.connect();
235
- const subscriber = await redis.duplicate();
236
-
237
- await subscriber.subscribe("foo", () => {});
238
- await redis.set("bar", "baz");
239
- ```
240
-
241
- {% /callout %}
242
-
243
- ### Publishing
244
-
245
- Publishing messages is done through the `publish()` method:
246
-
247
- ```typescript
248
- await client.publish(channelName, message);
249
- ```
250
-
251
- ### Subscriptions
252
-
253
- The Bun `RedisClient` allows you to subscribe to channels through the
254
- `.subscribe()` method:
255
-
256
- ```typescript
257
- await client.subscribe(channel, (message, channel) => {});
258
- ```
259
-
260
- You can unsubscribe through the `.unsubscribe()` method:
261
-
262
- ```typescript
263
- await client.unsubscribe(); // Unsubscribe from all channels.
264
- await client.unsubscribe(channel); // Unsubscribe a particular channel.
265
- await client.unsubscribe(channel, listener); // Unsubscribe a particular listener.
266
- ```
267
-
268
- ## Advanced Usage
269
-
270
- ### Command Execution and Pipelining
271
-
272
- The client automatically pipelines commands, improving performance by sending multiple commands in a batch and processing responses as they arrive.
273
-
274
- ```ts
275
- // Commands are automatically pipelined by default
276
- const [infoResult, listResult] = await Promise.all([
277
- redis.get("user:1:name"),
278
- redis.get("user:2:email"),
279
- ]);
280
- ```
281
-
282
- To disable automatic pipelining, you can set the `enableAutoPipelining` option to `false`:
283
-
284
- ```ts
285
- const client = new RedisClient("redis://localhost:6379", {
286
- enableAutoPipelining: false,
287
- });
288
- ```
289
-
290
- ### Raw Commands
291
-
292
- When you need to use commands that don't have convenience methods, you can use the `send` method:
293
-
294
- ```ts
295
- // Run any Redis command
296
- const info = await redis.send("INFO", []);
297
-
298
- // LPUSH to a list
299
- await redis.send("LPUSH", ["mylist", "value1", "value2"]);
300
-
301
- // Get list range
302
- const list = await redis.send("LRANGE", ["mylist", "0", "-1"]);
303
- ```
304
-
305
- 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.
306
-
307
- ### Connection Events
308
-
309
- You can register handlers for connection events:
310
-
311
- ```ts
312
- const client = new RedisClient();
313
-
314
- // Called when successfully connected to Redis server
315
- client.onconnect = () => {
316
- console.log("Connected to Redis server");
317
- };
318
-
319
- // Called when disconnected from Redis server
320
- client.onclose = error => {
321
- console.error("Disconnected from Redis server:", error);
322
- };
323
-
324
- // Manually connect/disconnect
325
- await client.connect();
326
- client.close();
327
- ```
328
-
329
- ### Connection Status and Monitoring
330
-
331
- ```ts
332
- // Check if connected
333
- console.log(client.connected); // boolean indicating connection status
334
-
335
- // Check amount of data buffered (in bytes)
336
- console.log(client.bufferedAmount);
337
- ```
338
-
339
- ### Type Conversion
340
-
341
- The Redis client handles automatic type conversion for Redis responses:
342
-
343
- - Integer responses are returned as JavaScript numbers
344
- - Bulk strings are returned as JavaScript strings
345
- - Simple strings are returned as JavaScript strings
346
- - Null bulk strings are returned as `null`
347
- - Array responses are returned as JavaScript arrays
348
- - Error responses throw JavaScript errors with appropriate error codes
349
- - Boolean responses (RESP3) are returned as JavaScript booleans
350
- - Map responses (RESP3) are returned as JavaScript objects
351
- - Set responses (RESP3) are returned as JavaScript arrays
352
-
353
- Special handling for specific commands:
354
-
355
- - `EXISTS` returns a boolean instead of a number (1 becomes true, 0 becomes false)
356
- - `SISMEMBER` returns a boolean (1 becomes true, 0 becomes false)
357
-
358
- The following commands disable automatic pipelining:
359
-
360
- - `AUTH`
361
- - `INFO`
362
- - `QUIT`
363
- - `EXEC`
364
- - `MULTI`
365
- - `WATCH`
366
- - `SCRIPT`
367
- - `SELECT`
368
- - `CLUSTER`
369
- - `DISCARD`
370
- - `UNWATCH`
371
- - `PIPELINE`
372
- - `SUBSCRIBE`
373
- - `UNSUBSCRIBE`
374
- - `UNPSUBSCRIBE`
375
-
376
- ## Connection Options
377
-
378
- When creating a client, you can pass various options to configure the connection:
379
-
380
- ```ts
381
- const client = new RedisClient("redis://localhost:6379", {
382
- // Connection timeout in milliseconds (default: 10000)
383
- connectionTimeout: 5000,
384
-
385
- // Idle timeout in milliseconds (default: 0 = no timeout)
386
- idleTimeout: 30000,
387
-
388
- // Whether to automatically reconnect on disconnection (default: true)
389
- autoReconnect: true,
390
-
391
- // Maximum number of reconnection attempts (default: 10)
392
- maxRetries: 10,
393
-
394
- // Whether to queue commands when disconnected (default: true)
395
- enableOfflineQueue: true,
396
-
397
- // Whether to automatically pipeline commands (default: true)
398
- enableAutoPipelining: true,
399
-
400
- // TLS options (default: false)
401
- tls: true,
402
- // Alternatively, provide custom TLS config:
403
- // tls: {
404
- // rejectUnauthorized: true,
405
- // ca: "path/to/ca.pem",
406
- // cert: "path/to/cert.pem",
407
- // key: "path/to/key.pem",
408
- // }
409
- });
410
- ```
411
-
412
- ### Reconnection Behavior
413
-
414
- When a connection is lost, the client automatically attempts to reconnect with exponential backoff:
415
-
416
- 1. The client starts with a small delay (50ms) and doubles it with each attempt
417
- 2. Reconnection delay is capped at 2000ms (2 seconds)
418
- 3. The client attempts to reconnect up to `maxRetries` times (default: 10)
419
- 4. Commands executed during disconnection are:
420
- - Queued if `enableOfflineQueue` is true (default)
421
- - Rejected immediately if `enableOfflineQueue` is false
422
-
423
- ## Supported URL Formats
424
-
425
- The Redis client supports various URL formats:
426
-
427
- ```ts
428
- // Standard Redis URL
429
- new RedisClient("redis://localhost:6379");
430
- new RedisClient("redis://localhost:6379");
431
-
432
- // With authentication
433
- new RedisClient("redis://username:password@localhost:6379");
434
-
435
- // With database number
436
- new RedisClient("redis://localhost:6379/0");
437
-
438
- // TLS connections
439
- new RedisClient("rediss://localhost:6379");
440
- new RedisClient("rediss://localhost:6379");
441
- new RedisClient("redis+tls://localhost:6379");
442
- new RedisClient("redis+tls://localhost:6379");
443
-
444
- // Unix socket connections
445
- new RedisClient("redis+unix:///path/to/socket");
446
- new RedisClient("redis+unix:///path/to/socket");
447
-
448
- // TLS over Unix socket
449
- new RedisClient("redis+tls+unix:///path/to/socket");
450
- new RedisClient("redis+tls+unix:///path/to/socket");
451
- ```
452
-
453
- ## Error Handling
454
-
455
- The Redis client throws typed errors for different scenarios:
456
-
457
- ```ts
458
- try {
459
- await redis.get("non-existent-key");
460
- } catch (error) {
461
- if (error.code === "ERR_REDIS_CONNECTION_CLOSED") {
462
- console.error("Connection to Redis server was closed");
463
- } else if (error.code === "ERR_REDIS_AUTHENTICATION_FAILED") {
464
- console.error("Authentication failed");
465
- } else {
466
- console.error("Unexpected error:", error);
467
- }
468
- }
469
- ```
470
-
471
- Common error codes:
472
-
473
- - `ERR_REDIS_CONNECTION_CLOSED` - Connection to the server was closed
474
- - `ERR_REDIS_AUTHENTICATION_FAILED` - Failed to authenticate with the server
475
- - `ERR_REDIS_INVALID_RESPONSE` - Received an invalid response from the server
476
-
477
- ## Example Use Cases
478
-
479
- ### Caching
480
-
481
- ```ts
482
- async function getUserWithCache(userId) {
483
- const cacheKey = `user:${userId}`;
484
-
485
- // Try to get from cache first
486
- const cachedUser = await redis.get(cacheKey);
487
- if (cachedUser) {
488
- return JSON.parse(cachedUser);
489
- }
490
-
491
- // Not in cache, fetch from database
492
- const user = await database.getUser(userId);
493
-
494
- // Store in cache for 1 hour
495
- await redis.set(cacheKey, JSON.stringify(user));
496
- await redis.expire(cacheKey, 3600);
497
-
498
- return user;
499
- }
500
- ```
501
-
502
- ### Rate Limiting
503
-
504
- ```ts
505
- async function rateLimit(ip, limit = 100, windowSecs = 3600) {
506
- const key = `ratelimit:${ip}`;
507
-
508
- // Increment counter
509
- const count = await redis.incr(key);
510
-
511
- // Set expiry if this is the first request in window
512
- if (count === 1) {
513
- await redis.expire(key, windowSecs);
514
- }
515
-
516
- // Check if limit exceeded
517
- return {
518
- limited: count > limit,
519
- remaining: Math.max(0, limit - count),
520
- };
521
- }
522
- ```
523
-
524
- ### Session Storage
525
-
526
- ```ts
527
- async function createSession(userId, data) {
528
- const sessionId = crypto.randomUUID();
529
- const key = `session:${sessionId}`;
530
-
531
- // Store session with expiration
532
- await redis.hmset(key, [
533
- "userId",
534
- userId.toString(),
535
- "created",
536
- Date.now().toString(),
537
- "data",
538
- JSON.stringify(data),
539
- ]);
540
- await redis.expire(key, 86400); // 24 hours
541
-
542
- return sessionId;
543
- }
544
-
545
- async function getSession(sessionId) {
546
- const key = `session:${sessionId}`;
547
-
548
- // Get session data
549
- const exists = await redis.exists(key);
550
- if (!exists) return null;
551
-
552
- const [userId, created, data] = await redis.hmget(key, [
553
- "userId",
554
- "created",
555
- "data",
556
- ]);
557
-
558
- return {
559
- userId: Number(userId),
560
- created: Number(created),
561
- data: JSON.parse(data),
562
- };
563
- }
564
- ```
565
-
566
- ## Implementation Notes
567
-
568
- 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.
569
-
570
- 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.
571
-
572
- ### RESP3 Protocol Support
573
-
574
- Bun's Redis client uses the newer RESP3 protocol by default, which provides more data types and features compared to RESP2:
575
-
576
- - Better error handling with typed errors
577
- - Native Boolean responses
578
- - Map/Dictionary responses (key-value objects)
579
- - Set responses
580
- - Double (floating point) values
581
- - BigNumber support for large integer values
582
-
583
- When connecting to Redis servers using older versions that don't support RESP3, the client automatically fallbacks to compatible modes.
584
-
585
- ## Limitations and Future Plans
586
-
587
- Current limitations of the Redis client we are planning to address in future versions:
588
-
589
- - [ ] Transactions (MULTI/EXEC) must be done through raw commands for now
590
- - [ ] Streams are supported but without dedicated methods
591
- - [ ] Pub/Sub does not currently support binary data, nor pattern-based
592
- subscriptions.
593
-
594
- Unsupported features:
595
-
596
- - Redis Sentinel
597
- - Redis Cluster