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
package/docs/api/ffi.md DELETED
@@ -1,557 +0,0 @@
1
- {% callout %}
2
- **⚠️ Warning** — `bun:ffi` is **experimental**, with known bugs and limitations, and should not be relied on in production. The most stable way to interact with native code from Bun is to write a [Node-API module](/docs/api/node-api).
3
- {% /callout %}
4
-
5
- Use the built-in `bun:ffi` module to efficiently call native libraries from JavaScript. It works with languages that support the C ABI (Zig, Rust, C/C++, C#, Nim, Kotlin, etc).
6
-
7
- ## dlopen usage (`bun:ffi`)
8
-
9
- To print the version number of `sqlite3`:
10
-
11
- ```ts
12
- import { dlopen, FFIType, suffix } from "bun:ffi";
13
-
14
- // `suffix` is either "dylib", "so", or "dll" depending on the platform
15
- // you don't have to use "suffix", it's just there for convenience
16
- const path = `libsqlite3.${suffix}`;
17
-
18
- const {
19
- symbols: {
20
- sqlite3_libversion, // the function to call
21
- },
22
- } = dlopen(
23
- path, // a library name or file path
24
- {
25
- sqlite3_libversion: {
26
- // no arguments, returns a string
27
- args: [],
28
- returns: FFIType.cstring,
29
- },
30
- },
31
- );
32
-
33
- console.log(`SQLite 3 version: ${sqlite3_libversion()}`);
34
- ```
35
-
36
- ## Performance
37
-
38
- According to [our benchmark](https://github.com/oven-sh/bun/tree/main/bench/ffi), `bun:ffi` is roughly 2-6x faster than Node.js FFI via `Node-API`.
39
-
40
- {% image src="/images/ffi.png" height="400" /%}
41
-
42
- Bun generates & just-in-time compiles C bindings that efficiently convert values between JavaScript types and native types. To compile C, Bun embeds [TinyCC](https://github.com/TinyCC/tinycc), a small and fast C compiler.
43
-
44
- ## Usage
45
-
46
- ### Zig
47
-
48
- ```zig
49
- // add.zig
50
- pub export fn add(a: i32, b: i32) i32 {
51
- return a + b;
52
- }
53
- ```
54
-
55
- To compile:
56
-
57
- ```bash
58
- $ zig build-lib add.zig -dynamic -OReleaseFast
59
- ```
60
-
61
- Pass a path to the shared library and a map of symbols to import into `dlopen`:
62
-
63
- ```ts
64
- import { dlopen, FFIType, suffix } from "bun:ffi";
65
- const { i32 } = FFIType;
66
-
67
- const path = `libadd.${suffix}`;
68
-
69
- const lib = dlopen(path, {
70
- add: {
71
- args: [i32, i32],
72
- returns: i32,
73
- },
74
- });
75
-
76
- console.log(lib.symbols.add(1, 2));
77
- ```
78
-
79
- ### Rust
80
-
81
- ```rust
82
- // add.rs
83
- #[no_mangle]
84
- pub extern "C" fn add(a: i32, b: i32) -> i32 {
85
- a + b
86
- }
87
- ```
88
-
89
- To compile:
90
-
91
- ```bash
92
- $ rustc --crate-type cdylib add.rs
93
- ```
94
-
95
- ### C++
96
-
97
- ```c
98
- #include <cstdint>
99
-
100
- extern "C" int32_t add(int32_t a, int32_t b) {
101
- return a + b;
102
- }
103
- ```
104
-
105
- To compile:
106
-
107
- ```bash
108
- $ zig build-lib add.cpp -dynamic -lc -lc++
109
- ```
110
-
111
- ## FFI types
112
-
113
- The following `FFIType` values are supported.
114
-
115
- | `FFIType` | C Type | Aliases |
116
- | ---------- | -------------- | --------------------------- |
117
- | buffer | `char*` | |
118
- | cstring | `char*` | |
119
- | function | `(void*)(*)()` | `fn`, `callback` |
120
- | ptr | `void*` | `pointer`, `void*`, `char*` |
121
- | i8 | `int8_t` | `int8_t` |
122
- | i16 | `int16_t` | `int16_t` |
123
- | i32 | `int32_t` | `int32_t`, `int` |
124
- | i64 | `int64_t` | `int64_t` |
125
- | i64_fast | `int64_t` | |
126
- | u8 | `uint8_t` | `uint8_t` |
127
- | u16 | `uint16_t` | `uint16_t` |
128
- | u32 | `uint32_t` | `uint32_t` |
129
- | u64 | `uint64_t` | `uint64_t` |
130
- | u64_fast | `uint64_t` | |
131
- | f32 | `float` | `float` |
132
- | f64 | `double` | `double` |
133
- | bool | `bool` | |
134
- | char | `char` | |
135
- | napi_env | `napi_env` | |
136
- | napi_value | `napi_value` | |
137
-
138
- Note: `buffer` arguments must be a `TypedArray` or `DataView`.
139
-
140
- ## Strings
141
-
142
- JavaScript strings and C-like strings are different, and that complicates using strings with native libraries.
143
-
144
- {% details summary="How are JavaScript strings and C strings different?" %}
145
- JavaScript strings:
146
-
147
- - UTF16 (2 bytes per letter) or potentially latin1, depending on the JavaScript engine &amp; what characters are used
148
- - `length` stored separately
149
- - Immutable
150
-
151
- C strings:
152
-
153
- - UTF8 (1 byte per letter), usually
154
- - The length is not stored. Instead, the string is null-terminated which means the length is the index of the first `\0` it finds
155
- - Mutable
156
-
157
- {% /details %}
158
-
159
- To solve this, `bun:ffi` exports `CString` which extends JavaScript's built-in `String` to support null-terminated strings and add a few extras:
160
-
161
- ```ts
162
- class CString extends String {
163
- /**
164
- * Given a `ptr`, this will automatically search for the closing `\0` character and transcode from UTF-8 to UTF-16 if necessary.
165
- */
166
- constructor(ptr: number, byteOffset?: number, byteLength?: number): string;
167
-
168
- /**
169
- * The ptr to the C string
170
- *
171
- * This `CString` instance is a clone of the string, so it
172
- * is safe to continue using this instance after the `ptr` has been
173
- * freed.
174
- */
175
- ptr: number;
176
- byteOffset?: number;
177
- byteLength?: number;
178
- }
179
- ```
180
-
181
- To convert from a null-terminated string pointer to a JavaScript string:
182
-
183
- ```ts
184
- const myString = new CString(ptr);
185
- ```
186
-
187
- To convert from a pointer with a known length to a JavaScript string:
188
-
189
- ```ts
190
- const myString = new CString(ptr, 0, byteLength);
191
- ```
192
-
193
- The `new CString()` constructor clones the C string, so it is safe to continue using `myString` after `ptr` has been freed.
194
-
195
- ```ts
196
- my_library_free(myString.ptr);
197
-
198
- // this is safe because myString is a clone
199
- console.log(myString);
200
- ```
201
-
202
- When used in `returns`, `FFIType.cstring` coerces the pointer to a JavaScript `string`. When used in `args`, `FFIType.cstring` is identical to `ptr`.
203
-
204
- ## Function pointers
205
-
206
- {% callout %}
207
-
208
- **Note** — Async functions are not yet supported.
209
-
210
- {% /callout %}
211
-
212
- To call a function pointer from JavaScript, use `CFunction`. This is useful if using Node-API (napi) with Bun, and you've already loaded some symbols.
213
-
214
- ```ts
215
- import { CFunction } from "bun:ffi";
216
-
217
- let myNativeLibraryGetVersion = /* somehow, you got this pointer */
218
-
219
- const getVersion = new CFunction({
220
- returns: "cstring",
221
- args: [],
222
- ptr: myNativeLibraryGetVersion,
223
- });
224
- getVersion();
225
- ```
226
-
227
- If you have multiple function pointers, you can define them all at once with `linkSymbols`:
228
-
229
- ```ts
230
- import { linkSymbols } from "bun:ffi";
231
-
232
- // getVersionPtrs defined elsewhere
233
- const [majorPtr, minorPtr, patchPtr] = getVersionPtrs();
234
-
235
- const lib = linkSymbols({
236
- // Unlike with dlopen(), the names here can be whatever you want
237
- getMajor: {
238
- returns: "cstring",
239
- args: [],
240
-
241
- // Since this doesn't use dlsym(), you have to provide a valid ptr
242
- // That ptr could be a number or a bigint
243
- // An invalid pointer will crash your program.
244
- ptr: majorPtr,
245
- },
246
- getMinor: {
247
- returns: "cstring",
248
- args: [],
249
- ptr: minorPtr,
250
- },
251
- getPatch: {
252
- returns: "cstring",
253
- args: [],
254
- ptr: patchPtr,
255
- },
256
- });
257
-
258
- const [major, minor, patch] = [
259
- lib.symbols.getMajor(),
260
- lib.symbols.getMinor(),
261
- lib.symbols.getPatch(),
262
- ];
263
- ```
264
-
265
- ## Callbacks
266
-
267
- Use `JSCallback` to create JavaScript callback functions that can be passed to C/FFI functions. The C/FFI function can call into the JavaScript/TypeScript code. This is useful for asynchronous code or whenever you want to call into JavaScript code from C.
268
-
269
- ```ts
270
- import { dlopen, JSCallback, ptr, CString } from "bun:ffi";
271
-
272
- const {
273
- symbols: { search },
274
- close,
275
- } = dlopen("libmylib", {
276
- search: {
277
- returns: "usize",
278
- args: ["cstring", "callback"],
279
- },
280
- });
281
-
282
- const searchIterator = new JSCallback(
283
- (ptr, length) => /hello/.test(new CString(ptr, length)),
284
- {
285
- returns: "bool",
286
- args: ["ptr", "usize"],
287
- },
288
- );
289
-
290
- const str = Buffer.from("wwutwutwutwutwutwutwutwutwutwutut\0", "utf8");
291
- if (search(ptr(str), searchIterator)) {
292
- // found a match!
293
- }
294
-
295
- // Sometime later:
296
- setTimeout(() => {
297
- searchIterator.close();
298
- close();
299
- }, 5000);
300
- ```
301
-
302
- When you're done with a JSCallback, you should call `close()` to free the memory.
303
-
304
- ### Experimental thread-safe callbacks
305
-
306
- `JSCallback` has experimental support for thread-safe callbacks. This will be needed if you pass a callback function into a different thread from its instantiation context. You can enable it with the optional `threadsafe` parameter.
307
-
308
- Currently, thread-safe callbacks work best when run from another thread that is running JavaScript code, i.e. a [`Worker`](/docs/api/workers). A future version of Bun will enable them to be called from any thread (such as new threads spawned by your native library that Bun is not aware of).
309
-
310
- ```ts
311
- const searchIterator = new JSCallback(
312
- (ptr, length) => /hello/.test(new CString(ptr, length)),
313
- {
314
- returns: "bool",
315
- args: ["ptr", "usize"],
316
- threadsafe: true, // Optional. Defaults to `false`
317
- },
318
- );
319
- ```
320
-
321
- {% callout %}
322
-
323
- **⚡️ Performance tip** — For a slight performance boost, directly pass `JSCallback.prototype.ptr` instead of the `JSCallback` object:
324
-
325
- ```ts
326
- const onResolve = new JSCallback(arg => arg === 42, {
327
- returns: "bool",
328
- args: ["i32"],
329
- });
330
- const setOnResolve = new CFunction({
331
- returns: "bool",
332
- args: ["function"],
333
- ptr: myNativeLibrarySetOnResolve,
334
- });
335
-
336
- // This code runs slightly faster:
337
- setOnResolve(onResolve.ptr);
338
-
339
- // Compared to this:
340
- setOnResolve(onResolve);
341
- ```
342
-
343
- {% /callout %}
344
-
345
- ## Pointers
346
-
347
- Bun represents [pointers](<https://en.wikipedia.org/wiki/Pointer_(computer_programming)>) as a `number` in JavaScript.
348
-
349
- {% details summary="How does a 64 bit pointer fit in a JavaScript number?" %}
350
- 64-bit processors support up to [52 bits of addressable space](https://en.wikipedia.org/wiki/64-bit_computing#Limits_of_processors). [JavaScript numbers](https://en.wikipedia.org/wiki/Double-precision_floating-point_format#IEEE_754_double-precision_binary_floating-point_format:_binary64) support 53 bits of usable space, so that leaves us with about 11 bits of extra space.
351
-
352
- **Why not `BigInt`?** `BigInt` is slower. JavaScript engines allocate a separate `BigInt` which means they can't fit into a regular JavaScript value. If you pass a `BigInt` to a function, it will be converted to a `number`
353
- {% /details %}
354
-
355
- To convert from a `TypedArray` to a pointer:
356
-
357
- ```ts
358
- import { ptr } from "bun:ffi";
359
- let myTypedArray = new Uint8Array(32);
360
- const myPtr = ptr(myTypedArray);
361
- ```
362
-
363
- To convert from a pointer to an `ArrayBuffer`:
364
-
365
- ```ts
366
- import { ptr, toArrayBuffer } from "bun:ffi";
367
- let myTypedArray = new Uint8Array(32);
368
- const myPtr = ptr(myTypedArray);
369
-
370
- // toArrayBuffer accepts a `byteOffset` and `byteLength`
371
- // if `byteLength` is not provided, it is assumed to be a null-terminated pointer
372
- myTypedArray = new Uint8Array(toArrayBuffer(myPtr, 0, 32), 0, 32);
373
- ```
374
-
375
- To read data from a pointer, you have two options. For long-lived pointers, use a `DataView`:
376
-
377
- ```ts
378
- import { toArrayBuffer } from "bun:ffi";
379
- let myDataView = new DataView(toArrayBuffer(myPtr, 0, 32));
380
-
381
- console.log(
382
- myDataView.getUint8(0, true),
383
- myDataView.getUint8(1, true),
384
- myDataView.getUint8(2, true),
385
- myDataView.getUint8(3, true),
386
- );
387
- ```
388
-
389
- For short-lived pointers, use `read`:
390
-
391
- ```ts
392
- import { read } from "bun:ffi";
393
-
394
- console.log(
395
- // ptr, byteOffset
396
- read.u8(myPtr, 0),
397
- read.u8(myPtr, 1),
398
- read.u8(myPtr, 2),
399
- read.u8(myPtr, 3),
400
- );
401
- ```
402
-
403
- The `read` function behaves similarly to `DataView`, but it's usually faster because it doesn't need to create a `DataView` or `ArrayBuffer`.
404
-
405
- | `FFIType` | `read` function |
406
- | --------- | --------------- |
407
- | ptr | `read.ptr` |
408
- | i8 | `read.i8` |
409
- | i16 | `read.i16` |
410
- | i32 | `read.i32` |
411
- | i64 | `read.i64` |
412
- | u8 | `read.u8` |
413
- | u16 | `read.u16` |
414
- | u32 | `read.u32` |
415
- | u64 | `read.u64` |
416
- | f32 | `read.f32` |
417
- | f64 | `read.f64` |
418
-
419
- ### Memory management
420
-
421
- `bun:ffi` does not manage memory for you. You must free the memory when you're done with it.
422
-
423
- #### From JavaScript
424
-
425
- If you want to track when a `TypedArray` is no longer in use from JavaScript, you can use a [FinalizationRegistry](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry).
426
-
427
- #### From C, Rust, Zig, etc
428
-
429
- If you want to track when a `TypedArray` is no longer in use from C or FFI, you can pass a callback and an optional context pointer to `toArrayBuffer` or `toBuffer`. This function is called at some point later, once the garbage collector frees the underlying `ArrayBuffer` JavaScript object.
430
-
431
- The expected signature is the same as in [JavaScriptCore's C API](https://developer.apple.com/documentation/javascriptcore/jstypedarraybytesdeallocator?language=objc):
432
-
433
- ```c
434
- typedef void (*JSTypedArrayBytesDeallocator)(void *bytes, void *deallocatorContext);
435
- ```
436
-
437
- ```ts
438
- import { toArrayBuffer } from "bun:ffi";
439
-
440
- // with a deallocatorContext:
441
- toArrayBuffer(
442
- bytes,
443
- byteOffset,
444
-
445
- byteLength,
446
-
447
- // this is an optional pointer to a callback
448
- deallocatorContext,
449
-
450
- // this is a pointer to a function
451
- jsTypedArrayBytesDeallocator,
452
- );
453
-
454
- // without a deallocatorContext:
455
- toArrayBuffer(
456
- bytes,
457
- byteOffset,
458
-
459
- byteLength,
460
-
461
- // this is a pointer to a function
462
- jsTypedArrayBytesDeallocator,
463
- );
464
- ```
465
-
466
- ### Memory safety
467
-
468
- Using raw pointers outside of FFI is extremely not recommended. A future version of Bun may add a CLI flag to disable `bun:ffi`.
469
-
470
- ### Pointer alignment
471
-
472
- If an API expects a pointer sized to something other than `char` or `u8`, make sure the `TypedArray` is also that size. A `u64*` is not exactly the same as `[8]u8*` due to alignment.
473
-
474
- ### Passing a pointer
475
-
476
- Where FFI functions expect a pointer, pass a `TypedArray` of equivalent size:
477
-
478
- ```ts
479
- import { dlopen, FFIType } from "bun:ffi";
480
-
481
- const {
482
- symbols: { encode_png },
483
- } = dlopen(myLibraryPath, {
484
- encode_png: {
485
- // FFIType's can be specified as strings too
486
- args: ["ptr", "u32", "u32"],
487
- returns: FFIType.ptr,
488
- },
489
- });
490
-
491
- const pixels = new Uint8ClampedArray(128 * 128 * 4);
492
- pixels.fill(254);
493
- pixels.subarray(0, 32 * 32 * 2).fill(0);
494
-
495
- const out = encode_png(
496
- // pixels will be passed as a pointer
497
- pixels,
498
-
499
- 128,
500
- 128,
501
- );
502
- ```
503
-
504
- The [auto-generated wrapper](https://github.com/oven-sh/bun/blob/6a65631cbdcae75bfa1e64323a6ad613a922cd1a/src/bun.js/ffi.exports.js#L180-L182) converts the pointer to a `TypedArray`.
505
-
506
- {% details summary="Hardmode" %}
507
-
508
- If you don't want the automatic conversion or you want a pointer to a specific byte offset within the `TypedArray`, you can also directly get the pointer to the `TypedArray`:
509
-
510
- ```ts
511
- import { dlopen, FFIType, ptr } from "bun:ffi";
512
-
513
- const {
514
- symbols: { encode_png },
515
- } = dlopen(myLibraryPath, {
516
- encode_png: {
517
- // FFIType's can be specified as strings too
518
- args: ["ptr", "u32", "u32"],
519
- returns: FFIType.ptr,
520
- },
521
- });
522
-
523
- const pixels = new Uint8ClampedArray(128 * 128 * 4);
524
- pixels.fill(254);
525
-
526
- // this returns a number! not a BigInt!
527
- const myPtr = ptr(pixels);
528
-
529
- const out = encode_png(
530
- myPtr,
531
-
532
- // dimensions:
533
- 128,
534
- 128,
535
- );
536
- ```
537
-
538
- {% /details %}
539
-
540
- ### Reading pointers
541
-
542
- ```ts
543
- const out = encode_png(
544
- // pixels will be passed as a pointer
545
- pixels,
546
-
547
- // dimensions:
548
- 128,
549
- 128,
550
- );
551
-
552
- // assuming it is 0-terminated, it can be read like this:
553
- let png = new Uint8Array(toArrayBuffer(out));
554
-
555
- // save it to disk:
556
- await Bun.write("out.png", png);
557
- ```