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.
- package/bun.d.ts +4 -4
- package/docs/README.md +28 -0
- package/globals.d.ts +0 -1
- package/overrides.d.ts +45 -15
- package/package.json +1 -1
- package/test.d.ts +1 -1
- package/docs/api/binary-data.md +0 -1038
- package/docs/api/cc.md +0 -197
- package/docs/api/color.md +0 -262
- package/docs/api/console.md +0 -57
- package/docs/api/cookie.md +0 -449
- package/docs/api/dns.md +0 -110
- package/docs/api/fetch.md +0 -463
- package/docs/api/ffi.md +0 -557
- package/docs/api/file-io.md +0 -366
- package/docs/api/file-system-router.md +0 -112
- package/docs/api/file.md +0 -19
- package/docs/api/glob.md +0 -178
- package/docs/api/globals.md +0 -387
- package/docs/api/hashing.md +0 -319
- package/docs/api/html-rewriter.md +0 -334
- package/docs/api/http.md +0 -1408
- package/docs/api/import-meta.md +0 -69
- package/docs/api/node-api.md +0 -14
- package/docs/api/redis.md +0 -597
- package/docs/api/s3.md +0 -850
- package/docs/api/secrets.md +0 -319
- package/docs/api/semver.md +0 -52
- package/docs/api/spawn.md +0 -582
- package/docs/api/sql.md +0 -1374
- package/docs/api/sqlite.md +0 -694
- package/docs/api/streams.md +0 -230
- package/docs/api/tcp.md +0 -221
- package/docs/api/transpiler.md +0 -276
- package/docs/api/udp.md +0 -123
- package/docs/api/utils.md +0 -891
- package/docs/api/websockets.md +0 -573
- package/docs/api/workers.md +0 -322
- package/docs/api/yaml.md +0 -668
- package/docs/benchmarks.md +0 -120
- package/docs/bun-flavored-toml.md +0 -42
- package/docs/bundler/css.md +0 -1028
- package/docs/bundler/css_modules.md +0 -145
- package/docs/bundler/executables.md +0 -626
- package/docs/bundler/fullstack.md +0 -418
- package/docs/bundler/hmr.md +0 -234
- package/docs/bundler/html.md +0 -349
- package/docs/bundler/index.md +0 -1735
- package/docs/bundler/intro.md +0 -75
- package/docs/bundler/loaders.md +0 -410
- package/docs/bundler/macros.md +0 -329
- package/docs/bundler/plugins.md +0 -449
- package/docs/bundler/vs-esbuild.md +0 -1127
- package/docs/cli/add.md +0 -173
- package/docs/cli/bun-completions.md +0 -3
- package/docs/cli/bun-create.md +0 -338
- package/docs/cli/bun-install.md +0 -349
- package/docs/cli/bun-upgrade.md +0 -39
- package/docs/cli/bunx.md +0 -89
- package/docs/cli/filter.md +0 -90
- package/docs/cli/info.md +0 -65
- package/docs/cli/init.md +0 -85
- package/docs/cli/install.md +0 -344
- package/docs/cli/link.md +0 -40
- package/docs/cli/outdated.md +0 -90
- package/docs/cli/patch-commit.md +0 -11
- package/docs/cli/pm.md +0 -285
- package/docs/cli/publish.md +0 -120
- package/docs/cli/remove.md +0 -7
- package/docs/cli/run.md +0 -261
- package/docs/cli/test.md +0 -397
- package/docs/cli/unlink.md +0 -9
- package/docs/cli/update.md +0 -129
- package/docs/cli/why.md +0 -67
- package/docs/contributing/upgrading-webkit.md +0 -57
- package/docs/ecosystem/elysia.md +0 -24
- package/docs/ecosystem/express.md +0 -37
- package/docs/ecosystem/hono.md +0 -18
- package/docs/ecosystem/react.md +0 -65
- package/docs/ecosystem/stric.md +0 -38
- package/docs/guides/binary/arraybuffer-to-array.md +0 -27
- package/docs/guides/binary/arraybuffer-to-blob.md +0 -24
- package/docs/guides/binary/arraybuffer-to-buffer.md +0 -25
- package/docs/guides/binary/arraybuffer-to-string.md +0 -15
- package/docs/guides/binary/arraybuffer-to-typedarray.md +0 -39
- package/docs/guides/binary/blob-to-arraybuffer.md +0 -14
- package/docs/guides/binary/blob-to-dataview.md +0 -14
- package/docs/guides/binary/blob-to-stream.md +0 -14
- package/docs/guides/binary/blob-to-string.md +0 -15
- package/docs/guides/binary/blob-to-typedarray.md +0 -14
- package/docs/guides/binary/buffer-to-arraybuffer.md +0 -14
- package/docs/guides/binary/buffer-to-blob.md +0 -14
- package/docs/guides/binary/buffer-to-readablestream.md +0 -41
- package/docs/guides/binary/buffer-to-string.md +0 -25
- package/docs/guides/binary/buffer-to-typedarray.md +0 -14
- package/docs/guides/binary/dataview-to-string.md +0 -15
- package/docs/guides/binary/typedarray-to-arraybuffer.md +0 -25
- package/docs/guides/binary/typedarray-to-blob.md +0 -16
- package/docs/guides/binary/typedarray-to-buffer.md +0 -14
- package/docs/guides/binary/typedarray-to-dataview.md +0 -14
- package/docs/guides/binary/typedarray-to-readablestream.md +0 -41
- package/docs/guides/binary/typedarray-to-string.md +0 -16
- package/docs/guides/deployment/railway.md +0 -157
- package/docs/guides/ecosystem/astro.md +0 -72
- package/docs/guides/ecosystem/discordjs.md +0 -77
- package/docs/guides/ecosystem/docker.md +0 -140
- package/docs/guides/ecosystem/drizzle.md +0 -185
- package/docs/guides/ecosystem/edgedb.md +0 -228
- package/docs/guides/ecosystem/elysia.md +0 -31
- package/docs/guides/ecosystem/express.md +0 -40
- package/docs/guides/ecosystem/hono.md +0 -39
- package/docs/guides/ecosystem/mongoose.md +0 -87
- package/docs/guides/ecosystem/neon-drizzle.md +0 -220
- package/docs/guides/ecosystem/neon-serverless-postgres.md +0 -55
- package/docs/guides/ecosystem/nextjs.md +0 -49
- package/docs/guides/ecosystem/nuxt.md +0 -56
- package/docs/guides/ecosystem/pm2.md +0 -57
- package/docs/guides/ecosystem/prisma.md +0 -141
- package/docs/guides/ecosystem/qwik.md +0 -107
- package/docs/guides/ecosystem/react.md +0 -50
- package/docs/guides/ecosystem/remix.md +0 -78
- package/docs/guides/ecosystem/render.md +0 -79
- package/docs/guides/ecosystem/sentry.md +0 -52
- package/docs/guides/ecosystem/solidstart.md +0 -58
- package/docs/guides/ecosystem/ssr-react.md +0 -51
- package/docs/guides/ecosystem/stric.md +0 -55
- package/docs/guides/ecosystem/sveltekit.md +0 -125
- package/docs/guides/ecosystem/systemd.md +0 -113
- package/docs/guides/ecosystem/vite.md +0 -71
- package/docs/guides/html-rewriter/extract-links.md +0 -68
- package/docs/guides/html-rewriter/extract-social-meta.md +0 -93
- package/docs/guides/http/cluster.md +0 -66
- package/docs/guides/http/fetch-unix.md +0 -33
- package/docs/guides/http/fetch.md +0 -24
- package/docs/guides/http/file-uploads.md +0 -94
- package/docs/guides/http/hot.md +0 -26
- package/docs/guides/http/proxy.md +0 -24
- package/docs/guides/http/server.md +0 -46
- package/docs/guides/http/simple.md +0 -18
- package/docs/guides/http/stream-file.md +0 -48
- package/docs/guides/http/stream-iterator.md +0 -47
- package/docs/guides/http/stream-node-streams-in-bun.md +0 -20
- package/docs/guides/http/tls.md +0 -30
- package/docs/guides/install/add-dev.md +0 -26
- package/docs/guides/install/add-git.md +0 -36
- package/docs/guides/install/add-optional.md +0 -25
- package/docs/guides/install/add-peer.md +0 -43
- package/docs/guides/install/add-tarball.md +0 -33
- package/docs/guides/install/add.md +0 -42
- package/docs/guides/install/azure-artifacts.md +0 -73
- package/docs/guides/install/cicd.md +0 -41
- package/docs/guides/install/custom-registry.md +0 -30
- package/docs/guides/install/from-npm-install-to-bun-install.md +0 -214
- package/docs/guides/install/git-diff-bun-lockfile.md +0 -44
- package/docs/guides/install/jfrog-artifactory.md +0 -28
- package/docs/guides/install/npm-alias.md +0 -23
- package/docs/guides/install/registry-scope.md +0 -38
- package/docs/guides/install/trusted.md +0 -46
- package/docs/guides/install/workspaces.md +0 -70
- package/docs/guides/install/yarnlock.md +0 -44
- package/docs/guides/process/argv.md +0 -58
- package/docs/guides/process/ctrl-c.md +0 -16
- package/docs/guides/process/ipc.md +0 -66
- package/docs/guides/process/nanoseconds.md +0 -13
- package/docs/guides/process/os-signals.md +0 -39
- package/docs/guides/process/spawn-stderr.md +0 -31
- package/docs/guides/process/spawn-stdout.md +0 -26
- package/docs/guides/process/spawn.md +0 -41
- package/docs/guides/process/stdin.md +0 -54
- package/docs/guides/read-file/arraybuffer.md +0 -28
- package/docs/guides/read-file/buffer.md +0 -19
- package/docs/guides/read-file/exists.md +0 -16
- package/docs/guides/read-file/json.md +0 -17
- package/docs/guides/read-file/mime.md +0 -20
- package/docs/guides/read-file/stream.md +0 -26
- package/docs/guides/read-file/string.md +0 -22
- package/docs/guides/read-file/uint8array.md +0 -21
- package/docs/guides/read-file/watch.md +0 -68
- package/docs/guides/runtime/build-time-constants.md +0 -293
- package/docs/guides/runtime/cicd.md +0 -43
- package/docs/guides/runtime/codesign-macos-executable.md +0 -56
- package/docs/guides/runtime/define-constant.md +0 -145
- package/docs/guides/runtime/delete-directory.md +0 -37
- package/docs/guides/runtime/delete-file.md +0 -19
- package/docs/guides/runtime/heap-snapshot.md +0 -26
- package/docs/guides/runtime/import-html.md +0 -15
- package/docs/guides/runtime/import-json.md +0 -44
- package/docs/guides/runtime/import-toml.md +0 -30
- package/docs/guides/runtime/import-yaml.md +0 -102
- package/docs/guides/runtime/read-env.md +0 -32
- package/docs/guides/runtime/set-env.md +0 -47
- package/docs/guides/runtime/shell.md +0 -40
- package/docs/guides/runtime/timezone.md +0 -35
- package/docs/guides/runtime/tsconfig-paths.md +0 -29
- package/docs/guides/runtime/typescript.md +0 -49
- package/docs/guides/runtime/vscode-debugger.md +0 -47
- package/docs/guides/runtime/web-debugger.md +0 -82
- package/docs/guides/streams/node-readable-to-arraybuffer.md +0 -11
- package/docs/guides/streams/node-readable-to-blob.md +0 -11
- package/docs/guides/streams/node-readable-to-json.md +0 -12
- package/docs/guides/streams/node-readable-to-string.md +0 -12
- package/docs/guides/streams/node-readable-to-uint8array.md +0 -11
- package/docs/guides/streams/to-array.md +0 -14
- package/docs/guides/streams/to-arraybuffer.md +0 -14
- package/docs/guides/streams/to-blob.md +0 -14
- package/docs/guides/streams/to-buffer.md +0 -15
- package/docs/guides/streams/to-json.md +0 -14
- package/docs/guides/streams/to-string.md +0 -14
- package/docs/guides/streams/to-typedarray.md +0 -22
- package/docs/guides/test/bail.md +0 -22
- package/docs/guides/test/coverage-threshold.md +0 -60
- package/docs/guides/test/coverage.md +0 -44
- package/docs/guides/test/happy-dom.md +0 -68
- package/docs/guides/test/migrate-from-jest.md +0 -143
- package/docs/guides/test/mock-clock.md +0 -48
- package/docs/guides/test/mock-functions.md +0 -68
- package/docs/guides/test/rerun-each.md +0 -14
- package/docs/guides/test/run-tests.md +0 -111
- package/docs/guides/test/skip-tests.md +0 -39
- package/docs/guides/test/snapshot.md +0 -95
- package/docs/guides/test/spy-on.md +0 -46
- package/docs/guides/test/svelte-test.md +0 -120
- package/docs/guides/test/testing-library.md +0 -92
- package/docs/guides/test/timeout.md +0 -15
- package/docs/guides/test/todo-tests.md +0 -67
- package/docs/guides/test/update-snapshots.md +0 -46
- package/docs/guides/test/watch-mode.md +0 -19
- package/docs/guides/util/base64.md +0 -15
- package/docs/guides/util/deep-equals.md +0 -39
- package/docs/guides/util/deflate.md +0 -18
- package/docs/guides/util/detect-bun.md +0 -23
- package/docs/guides/util/entrypoint.md +0 -17
- package/docs/guides/util/escape-html.md +0 -22
- package/docs/guides/util/file-url-to-path.md +0 -14
- package/docs/guides/util/gzip.md +0 -18
- package/docs/guides/util/hash-a-password.md +0 -54
- package/docs/guides/util/import-meta-dir.md +0 -13
- package/docs/guides/util/import-meta-file.md +0 -13
- package/docs/guides/util/import-meta-path.md +0 -13
- package/docs/guides/util/javascript-uuid.md +0 -23
- package/docs/guides/util/main.md +0 -32
- package/docs/guides/util/path-to-file-url.md +0 -14
- package/docs/guides/util/sleep.md +0 -22
- package/docs/guides/util/version.md +0 -21
- package/docs/guides/util/which-path-to-executable-bin.md +0 -15
- package/docs/guides/websocket/compression.md +0 -31
- package/docs/guides/websocket/context.md +0 -77
- package/docs/guides/websocket/pubsub.md +0 -41
- package/docs/guides/websocket/simple.md +0 -33
- package/docs/guides/write-file/append.md +0 -52
- package/docs/guides/write-file/basic.md +0 -44
- package/docs/guides/write-file/blob.md +0 -28
- package/docs/guides/write-file/cat.md +0 -17
- package/docs/guides/write-file/file-cp.md +0 -16
- package/docs/guides/write-file/filesink.md +0 -52
- package/docs/guides/write-file/response.md +0 -17
- package/docs/guides/write-file/stdout.md +0 -21
- package/docs/guides/write-file/stream.md +0 -17
- package/docs/guides/write-file/unlink.md +0 -16
- package/docs/index.md +0 -77
- package/docs/install/audit.md +0 -57
- package/docs/install/cache.md +0 -59
- package/docs/install/catalogs.md +0 -298
- package/docs/install/index.md +0 -248
- package/docs/install/isolated.md +0 -197
- package/docs/install/lifecycle.md +0 -46
- package/docs/install/lockfile.md +0 -58
- package/docs/install/npmrc.md +0 -105
- package/docs/install/overrides.md +0 -73
- package/docs/install/patch.md +0 -59
- package/docs/install/registries.md +0 -30
- package/docs/install/security-scanner-api.md +0 -81
- package/docs/install/workspaces.md +0 -114
- package/docs/installation.md +0 -327
- package/docs/project/asan.md +0 -124
- package/docs/project/benchmarking.md +0 -203
- package/docs/project/bindgen.md +0 -225
- package/docs/project/building-windows.md +0 -162
- package/docs/project/contributing.md +0 -347
- package/docs/project/internals/build-process-for-ci.md +0 -75
- package/docs/project/licensing.md +0 -73
- package/docs/project/roadmap.md +0 -87
- package/docs/quickstart.md +0 -157
- package/docs/runtime/autoimport.md +0 -94
- package/docs/runtime/bun-apis.md +0 -207
- package/docs/runtime/bunfig.md +0 -772
- package/docs/runtime/debugger.md +0 -325
- package/docs/runtime/env.md +0 -253
- package/docs/runtime/hot.md +0 -145
- package/docs/runtime/index.md +0 -312
- package/docs/runtime/jsx.md +0 -385
- package/docs/runtime/loaders.md +0 -130
- package/docs/runtime/modules.md +0 -320
- package/docs/runtime/nodejs-apis.md +0 -463
- package/docs/runtime/plugins.md +0 -561
- package/docs/runtime/shell.md +0 -605
- package/docs/runtime/typescript.md +0 -139
- package/docs/runtime/web-apis.md +0 -128
- package/docs/test/configuration.md +0 -154
- package/docs/test/coverage.md +0 -142
- package/docs/test/discovery.md +0 -85
- package/docs/test/dom.md +0 -75
- package/docs/test/examples/concurrent-test-glob.md +0 -132
- package/docs/test/hot.md +0 -15
- package/docs/test/lifecycle.md +0 -81
- package/docs/test/mocks.md +0 -313
- package/docs/test/reporters.md +0 -117
- package/docs/test/runtime-behavior.md +0 -95
- package/docs/test/snapshots.md +0 -68
- package/docs/test/time.md +0 -126
- package/docs/test/writing.md +0 -825
- package/docs/typescript.md +0 -53
package/docs/project/asan.md
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
# ASAN Builds for Bun
|
|
2
|
-
|
|
3
|
-
This document explains how to use and configure ASAN (Address Sanitizer) builds for Bun.
|
|
4
|
-
|
|
5
|
-
> **Note**: ASAN builds are available in CI for Linux and are configured to help identify memory issues in release builds.
|
|
6
|
-
|
|
7
|
-
## What is ASAN?
|
|
8
|
-
|
|
9
|
-
ASAN (Address Sanitizer) is a memory error detector for C/C++ and Zig code. It can detect:
|
|
10
|
-
|
|
11
|
-
- Use-after-free
|
|
12
|
-
- Heap buffer overflow
|
|
13
|
-
- Stack buffer overflow
|
|
14
|
-
- Global buffer overflow
|
|
15
|
-
- Use-after-return
|
|
16
|
-
- Use-after-scope
|
|
17
|
-
- Initialization order bugs
|
|
18
|
-
- Memory leaks
|
|
19
|
-
|
|
20
|
-
## ASAN Builds in CI
|
|
21
|
-
|
|
22
|
-
Bun CI includes ASAN builds to catch memory errors. These builds are configured with:
|
|
23
|
-
|
|
24
|
-
- Release optimizations for speed
|
|
25
|
-
- ASAN instrumentation for memory error detection
|
|
26
|
-
- Assertions enabled for both Bun and WebKit
|
|
27
|
-
|
|
28
|
-
The CI pipeline automatically:
|
|
29
|
-
|
|
30
|
-
- Builds a special ASAN-enabled release build for Linux
|
|
31
|
-
- Runs all tests to thoroughly check for memory issues
|
|
32
|
-
- Uses reduced parallelism to avoid memory pressure during testing
|
|
33
|
-
- Applies suppressions for known false positives
|
|
34
|
-
- Extends test timeouts to accommodate ASAN overhead
|
|
35
|
-
- Includes ASAN builds in release artifacts for debugging purposes
|
|
36
|
-
|
|
37
|
-
## Local ASAN Builds
|
|
38
|
-
|
|
39
|
-
To build Bun with ASAN locally, you can use the npm script:
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
# Build a release build with ASAN and assertions (recommended)
|
|
43
|
-
bun run build:asan
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
Or manually with CMake:
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
# Debug build with ASAN
|
|
50
|
-
cmake -B build -DCMAKE_BUILD_TYPE=Debug -DENABLE_ASAN=ON
|
|
51
|
-
|
|
52
|
-
# Release build with ASAN
|
|
53
|
-
cmake -B build -DCMAKE_BUILD_TYPE=Release -DENABLE_ASAN=ON
|
|
54
|
-
|
|
55
|
-
# Release build with ASAN and assertions
|
|
56
|
-
cmake -B build -DCMAKE_BUILD_TYPE=Release -DENABLE_ASAN=ON -DENABLE_ASSERTIONS=ON
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## Running with ASAN
|
|
60
|
-
|
|
61
|
-
When running an ASAN build, you can configure behavior with environment variables:
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
# Basic ASAN options - leak detection disabled (recommended)
|
|
65
|
-
ASAN_OPTIONS=detect_leaks=0:halt_on_error=0:detect_odr_violation=0 ./build/bun-asan
|
|
66
|
-
|
|
67
|
-
# If you really need leak detection (will produce A LOT of noise)
|
|
68
|
-
# ASAN_OPTIONS=detect_leaks=1:leak_check_at_exit=1:halt_on_error=0 ./build/bun-asan
|
|
69
|
-
# LSAN_OPTIONS=suppressions=lsan.supp:print_suppressions=1 ./build/bun-asan
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
> **Warning**: Enabling leak detection will generate excessive noise due to deliberately uncollected memory in WebKit and other components. It's recommended to keep leak detection disabled and focus on other memory errors like use-after-free, buffer overflows, etc.
|
|
73
|
-
|
|
74
|
-
## Other Memory Error Types
|
|
75
|
-
|
|
76
|
-
ASAN can detect several types of memory errors:
|
|
77
|
-
|
|
78
|
-
1. **Use-after-free**: When a program continues to use memory after it's been freed
|
|
79
|
-
2. **Buffer overflow**: When a program writes beyond the bounds of allocated memory
|
|
80
|
-
3. **Stack overflow**: When a function's stack usage exceeds available space
|
|
81
|
-
4. **Memory corruption**: Often caused by writing to invalid memory locations
|
|
82
|
-
5. **Use-after-return**: When a function returns a pointer to stack memory that's no longer valid
|
|
83
|
-
|
|
84
|
-
When an error is detected, ASAN will print a helpful report showing:
|
|
85
|
-
|
|
86
|
-
- The type of error
|
|
87
|
-
- The memory address where the error occurred
|
|
88
|
-
- A stack trace showing the code path that led to the error
|
|
89
|
-
- Information about the memory allocation/deallocation (if relevant)
|
|
90
|
-
|
|
91
|
-
Example error output:
|
|
92
|
-
|
|
93
|
-
```
|
|
94
|
-
==1234==ERROR: AddressSanitizer: heap-use-after-free on address 0x614000000044 at pc 0x55d8e2ac1f14...
|
|
95
|
-
READ of size 4 at 0x614000000044 thread T0
|
|
96
|
-
#0 0x55d8e2ac1f14 in main example.c:10
|
|
97
|
-
#1 0x7f91e6f5e0b2 in __libc_start_main...
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## Understanding ASAN Reports
|
|
101
|
-
|
|
102
|
-
ASAN reports contain detailed information about memory errors:
|
|
103
|
-
|
|
104
|
-
```
|
|
105
|
-
==12345==ERROR: AddressSanitizer: heap-use-after-free on address 0x7f7ddab8c084
|
|
106
|
-
READ of size 4 at 0x7f7ddab8c084 thread T0
|
|
107
|
-
#0 0x43b45a in Function source/file.cpp:123:45
|
|
108
|
-
#1 0x44af90 in AnotherFunction source/file.cpp:234:10
|
|
109
|
-
...
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
Key components of the report:
|
|
113
|
-
|
|
114
|
-
- Error type (heap-use-after-free, heap-buffer-overflow, etc.)
|
|
115
|
-
- Operation (READ/WRITE) and size
|
|
116
|
-
- Stack trace showing where the error occurred
|
|
117
|
-
- Information about the allocated/freed memory
|
|
118
|
-
|
|
119
|
-
## Best Practices
|
|
120
|
-
|
|
121
|
-
1. Run tests with ASAN builds regularly
|
|
122
|
-
2. Add suppressions only for well-understood false positives
|
|
123
|
-
3. Fix real issues promptly - ASAN errors indicate real problems
|
|
124
|
-
4. Consider using ASAN in debug builds during development
|
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
Bun is designed for speed. Hot paths are extensively profiled and benchmarked. The source code for all of Bun's public benchmarks can be found in the [`/bench`](https://github.com/oven-sh/bun/tree/main/bench) directory of the Bun repo.
|
|
2
|
-
|
|
3
|
-
## Measuring time
|
|
4
|
-
|
|
5
|
-
To precisely measure time, Bun offers two runtime APIs functions:
|
|
6
|
-
|
|
7
|
-
1. The Web-standard [`performance.now()`](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) function
|
|
8
|
-
2. `Bun.nanoseconds()` which is similar to `performance.now()` except it returns the current time since the application started in nanoseconds. You can use `performance.timeOrigin` to convert this to a Unix timestamp.
|
|
9
|
-
|
|
10
|
-
## Benchmarking tools
|
|
11
|
-
|
|
12
|
-
When writing your own benchmarks, it's important to choose the right tool.
|
|
13
|
-
|
|
14
|
-
- For microbenchmarks, a great general-purpose tool is [`mitata`](https://github.com/evanwashere/mitata).
|
|
15
|
-
- For load testing, you _must use_ an HTTP benchmarking tool that is at least as fast as `Bun.serve()`, or your results will be skewed. Some popular Node.js-based benchmarking tools like [`autocannon`](https://github.com/mcollina/autocannon) are not fast enough. We recommend one of the following:
|
|
16
|
-
- [`bombardier`](https://github.com/codesenberg/bombardier)
|
|
17
|
-
- [`oha`](https://github.com/hatoo/oha)
|
|
18
|
-
- [`http_load_test`](https://github.com/uNetworking/uSockets/blob/master/examples/http_load_test.c)
|
|
19
|
-
- For benchmarking scripts or CLI commands, we recommend [`hyperfine`](https://github.com/sharkdp/hyperfine).
|
|
20
|
-
|
|
21
|
-
## Measuring memory usage
|
|
22
|
-
|
|
23
|
-
Bun has two heaps. One heap is for the JavaScript runtime and the other heap is for everything else.
|
|
24
|
-
|
|
25
|
-
{% anchor id="bunjsc" /%}
|
|
26
|
-
|
|
27
|
-
### JavaScript heap stats
|
|
28
|
-
|
|
29
|
-
The `bun:jsc` module exposes a few functions for measuring memory usage:
|
|
30
|
-
|
|
31
|
-
```ts
|
|
32
|
-
import { heapStats } from "bun:jsc";
|
|
33
|
-
console.log(heapStats());
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
{% details summary="View example statistics" %}
|
|
37
|
-
|
|
38
|
-
```ts
|
|
39
|
-
{
|
|
40
|
-
heapSize: 1657575,
|
|
41
|
-
heapCapacity: 2872775,
|
|
42
|
-
extraMemorySize: 598199,
|
|
43
|
-
objectCount: 13790,
|
|
44
|
-
protectedObjectCount: 62,
|
|
45
|
-
globalObjectCount: 1,
|
|
46
|
-
protectedGlobalObjectCount: 1,
|
|
47
|
-
// A count of every object type in the heap
|
|
48
|
-
objectTypeCounts: {
|
|
49
|
-
CallbackObject: 25,
|
|
50
|
-
FunctionExecutable: 2078,
|
|
51
|
-
AsyncGeneratorFunction: 2,
|
|
52
|
-
'RegExp String Iterator': 1,
|
|
53
|
-
FunctionCodeBlock: 188,
|
|
54
|
-
ModuleProgramExecutable: 13,
|
|
55
|
-
String: 1,
|
|
56
|
-
UnlinkedModuleProgramCodeBlock: 13,
|
|
57
|
-
JSON: 1,
|
|
58
|
-
AsyncGenerator: 1,
|
|
59
|
-
Symbol: 1,
|
|
60
|
-
GetterSetter: 68,
|
|
61
|
-
ImportMeta: 10,
|
|
62
|
-
DOMAttributeGetterSetter: 1,
|
|
63
|
-
UnlinkedFunctionCodeBlock: 174,
|
|
64
|
-
RegExp: 52,
|
|
65
|
-
ModuleLoader: 1,
|
|
66
|
-
Intl: 1,
|
|
67
|
-
WeakMap: 4,
|
|
68
|
-
Generator: 2,
|
|
69
|
-
PropertyTable: 95,
|
|
70
|
-
'Array Iterator': 1,
|
|
71
|
-
JSLexicalEnvironment: 75,
|
|
72
|
-
UnlinkedFunctionExecutable: 2067,
|
|
73
|
-
WeakSet: 1,
|
|
74
|
-
console: 1,
|
|
75
|
-
Map: 23,
|
|
76
|
-
SparseArrayValueMap: 14,
|
|
77
|
-
StructureChain: 19,
|
|
78
|
-
Set: 18,
|
|
79
|
-
'String Iterator': 1,
|
|
80
|
-
FunctionRareData: 3,
|
|
81
|
-
JSGlobalLexicalEnvironment: 1,
|
|
82
|
-
Object: 481,
|
|
83
|
-
BigInt: 2,
|
|
84
|
-
StructureRareData: 55,
|
|
85
|
-
Array: 179,
|
|
86
|
-
AbortController: 2,
|
|
87
|
-
ModuleNamespaceObject: 11,
|
|
88
|
-
ShadowRealm: 1,
|
|
89
|
-
'Immutable Butterfly': 103,
|
|
90
|
-
Primordials: 1,
|
|
91
|
-
'Set Iterator': 1,
|
|
92
|
-
JSGlobalProxy: 1,
|
|
93
|
-
AsyncFromSyncIterator: 1,
|
|
94
|
-
ModuleRecord: 13,
|
|
95
|
-
FinalizationRegistry: 1,
|
|
96
|
-
AsyncIterator: 1,
|
|
97
|
-
InternalPromise: 22,
|
|
98
|
-
Iterator: 1,
|
|
99
|
-
CustomGetterSetter: 65,
|
|
100
|
-
Promise: 19,
|
|
101
|
-
WeakRef: 1,
|
|
102
|
-
InternalPromisePrototype: 1,
|
|
103
|
-
Function: 2381,
|
|
104
|
-
AsyncFunction: 2,
|
|
105
|
-
GlobalObject: 1,
|
|
106
|
-
ArrayBuffer: 2,
|
|
107
|
-
Boolean: 1,
|
|
108
|
-
Math: 1,
|
|
109
|
-
CallbackConstructor: 1,
|
|
110
|
-
Error: 2,
|
|
111
|
-
JSModuleEnvironment: 13,
|
|
112
|
-
WebAssembly: 1,
|
|
113
|
-
HashMapBucket: 300,
|
|
114
|
-
Callee: 3,
|
|
115
|
-
symbol: 37,
|
|
116
|
-
string: 2484,
|
|
117
|
-
Performance: 1,
|
|
118
|
-
ModuleProgramCodeBlock: 12,
|
|
119
|
-
JSSourceCode: 13,
|
|
120
|
-
JSPropertyNameEnumerator: 3,
|
|
121
|
-
NativeExecutable: 290,
|
|
122
|
-
Number: 1,
|
|
123
|
-
Structure: 1550,
|
|
124
|
-
SymbolTable: 108,
|
|
125
|
-
GeneratorFunction: 2,
|
|
126
|
-
'Map Iterator': 1
|
|
127
|
-
},
|
|
128
|
-
protectedObjectTypeCounts: {
|
|
129
|
-
CallbackConstructor: 1,
|
|
130
|
-
BigInt: 1,
|
|
131
|
-
RegExp: 2,
|
|
132
|
-
GlobalObject: 1,
|
|
133
|
-
UnlinkedModuleProgramCodeBlock: 13,
|
|
134
|
-
HashMapBucket: 2,
|
|
135
|
-
Structure: 41,
|
|
136
|
-
JSPropertyNameEnumerator: 1
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
{% /details %}
|
|
142
|
-
|
|
143
|
-
JavaScript is a garbage-collected language, not reference counted. It's normal and correct for objects to not be freed immediately in all cases, though it's not normal for objects to never be freed.
|
|
144
|
-
|
|
145
|
-
To force garbage collection to run manually:
|
|
146
|
-
|
|
147
|
-
```js
|
|
148
|
-
Bun.gc(true); // synchronous
|
|
149
|
-
Bun.gc(false); // asynchronous
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
Heap snapshots let you inspect what objects are not being freed. You can use the `bun:jsc` module to take a heap snapshot and then view it with Safari or WebKit GTK developer tools. To generate a heap snapshot:
|
|
153
|
-
|
|
154
|
-
```ts
|
|
155
|
-
import { generateHeapSnapshot } from "bun";
|
|
156
|
-
|
|
157
|
-
const snapshot = generateHeapSnapshot();
|
|
158
|
-
await Bun.write("heap.json", JSON.stringify(snapshot, null, 2));
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
To view the snapshot, open the `heap.json` file in Safari's Developer Tools (or WebKit GTK)
|
|
162
|
-
|
|
163
|
-
1. Open the Developer Tools
|
|
164
|
-
2. Click "Timeline"
|
|
165
|
-
3. Click "JavaScript Allocations" in the menu on the left. It might not be visible until you click the pencil icon to show all the timelines
|
|
166
|
-
4. Click "Import" and select your heap snapshot JSON
|
|
167
|
-
|
|
168
|
-
{% image alt="Import heap json" src="https://user-images.githubusercontent.com/709451/204428943-ba999e8f-8984-4f23-97cb-b4e3e280363e.png" caption="Importing a heap snapshot" /%}
|
|
169
|
-
|
|
170
|
-
Once imported, you should see something like this:
|
|
171
|
-
|
|
172
|
-
{% image alt="Viewing heap snapshot in Safari" src="https://user-images.githubusercontent.com/709451/204429337-b0d8935f-3509-4071-b991-217794d1fb27.png" caption="Viewing heap snapshot in Safari Dev Tools" /%}
|
|
173
|
-
|
|
174
|
-
> The [web debugger](https://bun.com/docs/runtime/debugger#inspect) also offers the timeline feature which allows you to track and examine the memory usage of the running debug session.
|
|
175
|
-
|
|
176
|
-
### Native heap stats
|
|
177
|
-
|
|
178
|
-
Bun uses mimalloc for the other heap. To report a summary of non-JavaScript memory usage, set the `MIMALLOC_SHOW_STATS=1` environment variable. and stats will print on exit.
|
|
179
|
-
|
|
180
|
-
```js
|
|
181
|
-
MIMALLOC_SHOW_STATS=1 bun script.js
|
|
182
|
-
|
|
183
|
-
# will show something like this:
|
|
184
|
-
heap stats: peak total freed current unit count
|
|
185
|
-
reserved: 64.0 MiB 64.0 MiB 0 64.0 MiB not all freed!
|
|
186
|
-
committed: 64.0 MiB 64.0 MiB 0 64.0 MiB not all freed!
|
|
187
|
-
reset: 0 0 0 0 ok
|
|
188
|
-
touched: 128.5 KiB 128.5 KiB 5.4 MiB -5.3 MiB ok
|
|
189
|
-
segments: 1 1 0 1 not all freed!
|
|
190
|
-
-abandoned: 0 0 0 0 ok
|
|
191
|
-
-cached: 0 0 0 0 ok
|
|
192
|
-
pages: 0 0 53 -53 ok
|
|
193
|
-
-abandoned: 0 0 0 0 ok
|
|
194
|
-
-extended: 0
|
|
195
|
-
-noretire: 0
|
|
196
|
-
mmaps: 0
|
|
197
|
-
commits: 0
|
|
198
|
-
threads: 0 0 0 0 ok
|
|
199
|
-
searches: 0.0 avg
|
|
200
|
-
numa nodes: 1
|
|
201
|
-
elapsed: 0.068 s
|
|
202
|
-
process: user: 0.061 s, system: 0.014 s, faults: 0, rss: 57.4 MiB, commit: 64.0 MiB
|
|
203
|
-
```
|
package/docs/project/bindgen.md
DELETED
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
{% callout %}
|
|
2
|
-
|
|
3
|
-
This document is for maintainers and contributors to Bun, and describes internal implementation details.
|
|
4
|
-
|
|
5
|
-
{% /callout %}
|
|
6
|
-
|
|
7
|
-
The new bindings generator, introduced to the codebase in Dec 2024, scans for
|
|
8
|
-
`*.bind.ts` to find function and class definition, and generates glue code to
|
|
9
|
-
interop between JavaScript and native code.
|
|
10
|
-
|
|
11
|
-
There are currently other code generators and systems that achieve similar
|
|
12
|
-
purposes. The following will all eventually be completely phased out in favor of
|
|
13
|
-
this one:
|
|
14
|
-
|
|
15
|
-
- "Classes generator", converting `*.classes.ts` for custom classes.
|
|
16
|
-
- "JS2Native", allowing ad-hoc calls from `src/js` to native code.
|
|
17
|
-
|
|
18
|
-
## Creating JS Functions in Zig
|
|
19
|
-
|
|
20
|
-
Given a file implementing a simple function, such as `add`
|
|
21
|
-
|
|
22
|
-
```zig#src/bun.js/math.zig
|
|
23
|
-
pub fn add(global: *jsc.JSGlobalObject, a: i32, b: i32) !i32 {
|
|
24
|
-
return std.math.add(i32, a, b) catch {
|
|
25
|
-
// Binding functions can return `error.OutOfMemory` and `error.JSError`.
|
|
26
|
-
// Others like `error.Overflow` from `std.math.add` must be converted.
|
|
27
|
-
// Remember to be descriptive.
|
|
28
|
-
return global.throwPretty("Integer overflow while adding", .{});
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const gen = bun.gen.math; // "math" being this file's basename
|
|
33
|
-
|
|
34
|
-
const std = @import("std");
|
|
35
|
-
const bun = @import("bun");
|
|
36
|
-
const jsc = bun.jsc;
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
Then describe the API schema using a `.bind.ts` function. The binding file goes next to the Zig file.
|
|
40
|
-
|
|
41
|
-
```ts#src/bun.js/math.bind.ts
|
|
42
|
-
import { t, fn } from 'bindgen';
|
|
43
|
-
|
|
44
|
-
export const add = fn({
|
|
45
|
-
args: {
|
|
46
|
-
global: t.globalObject,
|
|
47
|
-
a: t.i32,
|
|
48
|
-
b: t.i32.default(1),
|
|
49
|
-
},
|
|
50
|
-
ret: t.i32,
|
|
51
|
-
});
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
This function declaration is equivalent to:
|
|
55
|
-
|
|
56
|
-
```ts
|
|
57
|
-
/**
|
|
58
|
-
* Throws if zero arguments are provided.
|
|
59
|
-
* Wraps out of range numbers using modulo.
|
|
60
|
-
*/
|
|
61
|
-
declare function add(a: number, b: number = 1): number;
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
The code generator will provide `bun.gen.math.jsAdd`, which is the native
|
|
65
|
-
function implementation. To pass to JavaScript, use
|
|
66
|
-
`bun.gen.math.createAddCallback(global)`. JS files in `src/js/` may use
|
|
67
|
-
`$bindgenFn("math.bind.ts", "add")` to get a handle to the implementation.
|
|
68
|
-
|
|
69
|
-
## Strings
|
|
70
|
-
|
|
71
|
-
The type for receiving strings is one of [`t.DOMString`](https://webidl.spec.whatwg.org/#idl-DOMString), [`t.ByteString`](https://webidl.spec.whatwg.org/#idl-ByteString), and [`t.USVString`](https://webidl.spec.whatwg.org/#idl-USVString). These map directly to their WebIDL counterparts, and have slightly different conversion logic. Bindgen will pass BunString to native code in all cases.
|
|
72
|
-
|
|
73
|
-
When in doubt, use DOMString.
|
|
74
|
-
|
|
75
|
-
`t.UTF8String` can be used in place of `t.DOMString`, but will call `bun.String.toUTF8`. The native callback gets `[]const u8` (WTF-8 data) passed to native code, freeing it after the function returns.
|
|
76
|
-
|
|
77
|
-
TLDRs from WebIDL spec:
|
|
78
|
-
|
|
79
|
-
- ByteString can only contain valid latin1 characters. It is not safe to assume bun.String is already in 8-bit format, but it is extremely likely.
|
|
80
|
-
- USVString will not contain invalid surrogate pairs, aka text that can be represented correctly in UTF-8.
|
|
81
|
-
- DOMString is the loosest but also most recommended strategy.
|
|
82
|
-
|
|
83
|
-
## Function Variants
|
|
84
|
-
|
|
85
|
-
A `variants` can specify multiple variants (also known as overloads).
|
|
86
|
-
|
|
87
|
-
```ts#src/bun.js/math.bind.ts
|
|
88
|
-
import { t, fn } from 'bindgen';
|
|
89
|
-
|
|
90
|
-
export const action = fn({
|
|
91
|
-
variants: [
|
|
92
|
-
{
|
|
93
|
-
args: {
|
|
94
|
-
a: t.i32,
|
|
95
|
-
},
|
|
96
|
-
ret: t.i32,
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
args: {
|
|
100
|
-
a: t.DOMString,
|
|
101
|
-
},
|
|
102
|
-
ret: t.DOMString,
|
|
103
|
-
},
|
|
104
|
-
]
|
|
105
|
-
});
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
In Zig, each variant gets a number, based on the order the schema defines.
|
|
109
|
-
|
|
110
|
-
```zig
|
|
111
|
-
fn action1(a: i32) i32 {
|
|
112
|
-
return a;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
fn action2(a: bun.String) bun.String {
|
|
116
|
-
return a;
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
## `t.dictionary`
|
|
121
|
-
|
|
122
|
-
A `dictionary` is a definition for a JavaScript object, typically as a function inputs. For function outputs, it is usually a smarter idea to declare a class type to add functions and destructuring.
|
|
123
|
-
|
|
124
|
-
## Enumerations
|
|
125
|
-
|
|
126
|
-
To use [WebIDL's enumeration](https://webidl.spec.whatwg.org/#idl-enums) type, use either:
|
|
127
|
-
|
|
128
|
-
- `t.stringEnum`: Create and codegen a new enum type.
|
|
129
|
-
- `t.zigEnum`: Derive a bindgen type off of an existing enum in the codebase.
|
|
130
|
-
|
|
131
|
-
An example of `stringEnum` as used in `fmt.zig` / `bun:internal-for-testing`
|
|
132
|
-
|
|
133
|
-
```ts
|
|
134
|
-
export const Formatter = t.stringEnum(
|
|
135
|
-
"highlight-javascript",
|
|
136
|
-
"escape-powershell",
|
|
137
|
-
);
|
|
138
|
-
|
|
139
|
-
export const fmtString = fn({
|
|
140
|
-
args: {
|
|
141
|
-
global: t.globalObject,
|
|
142
|
-
code: t.UTF8String,
|
|
143
|
-
formatter: Formatter,
|
|
144
|
-
},
|
|
145
|
-
ret: t.DOMString,
|
|
146
|
-
});
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
WebIDL strongly encourages using kebab case for enumeration values, to be consistent with existing Web APIs.
|
|
150
|
-
|
|
151
|
-
### Deriving enums from Zig code
|
|
152
|
-
|
|
153
|
-
TODO: zigEnum
|
|
154
|
-
|
|
155
|
-
## `t.oneOf`
|
|
156
|
-
|
|
157
|
-
A `oneOf` is a union between two or more types. It is represented by `union(enum)` in Zig.
|
|
158
|
-
|
|
159
|
-
TODO:
|
|
160
|
-
|
|
161
|
-
## Attributes
|
|
162
|
-
|
|
163
|
-
There are set of attributes that can be chained onto `t.*` types. On all types there are:
|
|
164
|
-
|
|
165
|
-
- `.required`, in dictionary parameters only
|
|
166
|
-
- `.optional`, in function arguments only
|
|
167
|
-
- `.default(T)`
|
|
168
|
-
|
|
169
|
-
When a value is optional, it is lowered to a Zig optional.
|
|
170
|
-
|
|
171
|
-
Depending on the type, there are more attributes available. See the type definitions in auto-complete for more details. Note that one of the above three can only be applied, and they must be applied at the end.
|
|
172
|
-
|
|
173
|
-
### Integer Attributes
|
|
174
|
-
|
|
175
|
-
Integer types allow customizing the overflow behavior with `clamp` or `enforceRange`
|
|
176
|
-
|
|
177
|
-
```ts
|
|
178
|
-
import { t, fn } from "bindgen";
|
|
179
|
-
|
|
180
|
-
export const add = fn({
|
|
181
|
-
args: {
|
|
182
|
-
global: t.globalObject,
|
|
183
|
-
// enforce in i32 range
|
|
184
|
-
a: t.i32.enforceRange(),
|
|
185
|
-
// clamp to u16 range
|
|
186
|
-
b: t.u16,
|
|
187
|
-
// enforce in arbitrary range, with a default if not provided
|
|
188
|
-
c: t.i32.enforceRange(0, 1000).default(5),
|
|
189
|
-
// clamp to arbitrary range, or null
|
|
190
|
-
d: t.u16.clamp(0, 10).optional,
|
|
191
|
-
},
|
|
192
|
-
ret: t.i32,
|
|
193
|
-
});
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
Various Node.js validator functions such as `validateInteger`, `validateNumber`, and more are available. Use these when implementing Node.js APIs, so the error messages match 1:1 what Node would do.
|
|
197
|
-
|
|
198
|
-
Unlike `enforceRange`, which is taken from WebIDL, `validate*` functions are much more strict on the input they accept. For example, Node's numerical validator check `typeof value === 'number'`, while WebIDL uses `ToNumber` for lossy conversion.
|
|
199
|
-
|
|
200
|
-
```ts
|
|
201
|
-
import { t, fn } from "bindgen";
|
|
202
|
-
|
|
203
|
-
export const add = fn({
|
|
204
|
-
args: {
|
|
205
|
-
global: t.globalObject,
|
|
206
|
-
// throw if not given a number
|
|
207
|
-
a: t.f64.validateNumber(),
|
|
208
|
-
// valid in i32 range
|
|
209
|
-
a: t.i32.validateInt32(),
|
|
210
|
-
// f64 within safe integer range
|
|
211
|
-
b: t.f64.validateInteger(),
|
|
212
|
-
// f64 in given range
|
|
213
|
-
c: t.f64.validateNumber(-10000, 10000),
|
|
214
|
-
},
|
|
215
|
-
ret: t.i32,
|
|
216
|
-
});
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
## Callbacks
|
|
220
|
-
|
|
221
|
-
TODO
|
|
222
|
-
|
|
223
|
-
## Classes
|
|
224
|
-
|
|
225
|
-
TODO
|