bun-types 1.3.2-canary.20251105T140650 → 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 (308) hide show
  1. package/docs/README.md +28 -0
  2. package/package.json +1 -1
  3. package/docs/api/binary-data.md +0 -1038
  4. package/docs/api/cc.md +0 -197
  5. package/docs/api/color.md +0 -262
  6. package/docs/api/console.md +0 -57
  7. package/docs/api/cookie.md +0 -449
  8. package/docs/api/dns.md +0 -110
  9. package/docs/api/fetch.md +0 -463
  10. package/docs/api/ffi.md +0 -557
  11. package/docs/api/file-io.md +0 -366
  12. package/docs/api/file-system-router.md +0 -112
  13. package/docs/api/file.md +0 -19
  14. package/docs/api/glob.md +0 -178
  15. package/docs/api/globals.md +0 -387
  16. package/docs/api/hashing.md +0 -319
  17. package/docs/api/html-rewriter.md +0 -334
  18. package/docs/api/http.md +0 -1408
  19. package/docs/api/import-meta.md +0 -69
  20. package/docs/api/node-api.md +0 -14
  21. package/docs/api/redis.md +0 -597
  22. package/docs/api/s3.md +0 -850
  23. package/docs/api/secrets.md +0 -319
  24. package/docs/api/semver.md +0 -52
  25. package/docs/api/spawn.md +0 -582
  26. package/docs/api/sql.md +0 -1374
  27. package/docs/api/sqlite.md +0 -694
  28. package/docs/api/streams.md +0 -230
  29. package/docs/api/tcp.md +0 -221
  30. package/docs/api/transpiler.md +0 -276
  31. package/docs/api/udp.md +0 -123
  32. package/docs/api/utils.md +0 -891
  33. package/docs/api/websockets.md +0 -573
  34. package/docs/api/workers.md +0 -322
  35. package/docs/api/yaml.md +0 -668
  36. package/docs/benchmarks.md +0 -120
  37. package/docs/bun-flavored-toml.md +0 -42
  38. package/docs/bundler/css.md +0 -1028
  39. package/docs/bundler/css_modules.md +0 -145
  40. package/docs/bundler/executables.md +0 -626
  41. package/docs/bundler/fullstack.md +0 -418
  42. package/docs/bundler/hmr.md +0 -234
  43. package/docs/bundler/html.md +0 -349
  44. package/docs/bundler/index.md +0 -1735
  45. package/docs/bundler/intro.md +0 -75
  46. package/docs/bundler/loaders.md +0 -410
  47. package/docs/bundler/macros.md +0 -329
  48. package/docs/bundler/plugins.md +0 -449
  49. package/docs/bundler/vs-esbuild.md +0 -1127
  50. package/docs/cli/add.md +0 -173
  51. package/docs/cli/bun-completions.md +0 -3
  52. package/docs/cli/bun-create.md +0 -338
  53. package/docs/cli/bun-install.md +0 -349
  54. package/docs/cli/bun-upgrade.md +0 -39
  55. package/docs/cli/bunx.md +0 -89
  56. package/docs/cli/filter.md +0 -90
  57. package/docs/cli/info.md +0 -65
  58. package/docs/cli/init.md +0 -85
  59. package/docs/cli/install.md +0 -344
  60. package/docs/cli/link.md +0 -40
  61. package/docs/cli/outdated.md +0 -90
  62. package/docs/cli/patch-commit.md +0 -11
  63. package/docs/cli/pm.md +0 -285
  64. package/docs/cli/publish.md +0 -120
  65. package/docs/cli/remove.md +0 -7
  66. package/docs/cli/run.md +0 -261
  67. package/docs/cli/test.md +0 -397
  68. package/docs/cli/unlink.md +0 -9
  69. package/docs/cli/update.md +0 -129
  70. package/docs/cli/why.md +0 -67
  71. package/docs/contributing/upgrading-webkit.md +0 -57
  72. package/docs/ecosystem/elysia.md +0 -24
  73. package/docs/ecosystem/express.md +0 -37
  74. package/docs/ecosystem/hono.md +0 -18
  75. package/docs/ecosystem/react.md +0 -65
  76. package/docs/ecosystem/stric.md +0 -38
  77. package/docs/guides/binary/arraybuffer-to-array.md +0 -27
  78. package/docs/guides/binary/arraybuffer-to-blob.md +0 -24
  79. package/docs/guides/binary/arraybuffer-to-buffer.md +0 -25
  80. package/docs/guides/binary/arraybuffer-to-string.md +0 -15
  81. package/docs/guides/binary/arraybuffer-to-typedarray.md +0 -39
  82. package/docs/guides/binary/blob-to-arraybuffer.md +0 -14
  83. package/docs/guides/binary/blob-to-dataview.md +0 -14
  84. package/docs/guides/binary/blob-to-stream.md +0 -14
  85. package/docs/guides/binary/blob-to-string.md +0 -15
  86. package/docs/guides/binary/blob-to-typedarray.md +0 -14
  87. package/docs/guides/binary/buffer-to-arraybuffer.md +0 -14
  88. package/docs/guides/binary/buffer-to-blob.md +0 -14
  89. package/docs/guides/binary/buffer-to-readablestream.md +0 -41
  90. package/docs/guides/binary/buffer-to-string.md +0 -25
  91. package/docs/guides/binary/buffer-to-typedarray.md +0 -14
  92. package/docs/guides/binary/dataview-to-string.md +0 -15
  93. package/docs/guides/binary/typedarray-to-arraybuffer.md +0 -25
  94. package/docs/guides/binary/typedarray-to-blob.md +0 -16
  95. package/docs/guides/binary/typedarray-to-buffer.md +0 -14
  96. package/docs/guides/binary/typedarray-to-dataview.md +0 -14
  97. package/docs/guides/binary/typedarray-to-readablestream.md +0 -41
  98. package/docs/guides/binary/typedarray-to-string.md +0 -16
  99. package/docs/guides/deployment/railway.md +0 -157
  100. package/docs/guides/ecosystem/astro.md +0 -72
  101. package/docs/guides/ecosystem/discordjs.md +0 -77
  102. package/docs/guides/ecosystem/docker.md +0 -140
  103. package/docs/guides/ecosystem/drizzle.md +0 -185
  104. package/docs/guides/ecosystem/edgedb.md +0 -228
  105. package/docs/guides/ecosystem/elysia.md +0 -31
  106. package/docs/guides/ecosystem/express.md +0 -40
  107. package/docs/guides/ecosystem/hono.md +0 -39
  108. package/docs/guides/ecosystem/mongoose.md +0 -87
  109. package/docs/guides/ecosystem/neon-drizzle.md +0 -220
  110. package/docs/guides/ecosystem/neon-serverless-postgres.md +0 -55
  111. package/docs/guides/ecosystem/nextjs.md +0 -49
  112. package/docs/guides/ecosystem/nuxt.md +0 -56
  113. package/docs/guides/ecosystem/pm2.md +0 -57
  114. package/docs/guides/ecosystem/prisma.md +0 -141
  115. package/docs/guides/ecosystem/qwik.md +0 -107
  116. package/docs/guides/ecosystem/react.md +0 -50
  117. package/docs/guides/ecosystem/remix.md +0 -78
  118. package/docs/guides/ecosystem/render.md +0 -79
  119. package/docs/guides/ecosystem/sentry.md +0 -52
  120. package/docs/guides/ecosystem/solidstart.md +0 -58
  121. package/docs/guides/ecosystem/ssr-react.md +0 -51
  122. package/docs/guides/ecosystem/stric.md +0 -55
  123. package/docs/guides/ecosystem/sveltekit.md +0 -125
  124. package/docs/guides/ecosystem/systemd.md +0 -113
  125. package/docs/guides/ecosystem/vite.md +0 -71
  126. package/docs/guides/html-rewriter/extract-links.md +0 -68
  127. package/docs/guides/html-rewriter/extract-social-meta.md +0 -93
  128. package/docs/guides/http/cluster.md +0 -66
  129. package/docs/guides/http/fetch-unix.md +0 -33
  130. package/docs/guides/http/fetch.md +0 -24
  131. package/docs/guides/http/file-uploads.md +0 -94
  132. package/docs/guides/http/hot.md +0 -26
  133. package/docs/guides/http/proxy.md +0 -24
  134. package/docs/guides/http/server.md +0 -46
  135. package/docs/guides/http/simple.md +0 -18
  136. package/docs/guides/http/stream-file.md +0 -48
  137. package/docs/guides/http/stream-iterator.md +0 -47
  138. package/docs/guides/http/stream-node-streams-in-bun.md +0 -20
  139. package/docs/guides/http/tls.md +0 -30
  140. package/docs/guides/install/add-dev.md +0 -26
  141. package/docs/guides/install/add-git.md +0 -36
  142. package/docs/guides/install/add-optional.md +0 -25
  143. package/docs/guides/install/add-peer.md +0 -43
  144. package/docs/guides/install/add-tarball.md +0 -33
  145. package/docs/guides/install/add.md +0 -42
  146. package/docs/guides/install/azure-artifacts.md +0 -73
  147. package/docs/guides/install/cicd.md +0 -41
  148. package/docs/guides/install/custom-registry.md +0 -30
  149. package/docs/guides/install/from-npm-install-to-bun-install.md +0 -214
  150. package/docs/guides/install/git-diff-bun-lockfile.md +0 -44
  151. package/docs/guides/install/jfrog-artifactory.md +0 -28
  152. package/docs/guides/install/npm-alias.md +0 -23
  153. package/docs/guides/install/registry-scope.md +0 -38
  154. package/docs/guides/install/trusted.md +0 -46
  155. package/docs/guides/install/workspaces.md +0 -70
  156. package/docs/guides/install/yarnlock.md +0 -44
  157. package/docs/guides/process/argv.md +0 -58
  158. package/docs/guides/process/ctrl-c.md +0 -16
  159. package/docs/guides/process/ipc.md +0 -66
  160. package/docs/guides/process/nanoseconds.md +0 -13
  161. package/docs/guides/process/os-signals.md +0 -39
  162. package/docs/guides/process/spawn-stderr.md +0 -31
  163. package/docs/guides/process/spawn-stdout.md +0 -26
  164. package/docs/guides/process/spawn.md +0 -41
  165. package/docs/guides/process/stdin.md +0 -54
  166. package/docs/guides/read-file/arraybuffer.md +0 -28
  167. package/docs/guides/read-file/buffer.md +0 -19
  168. package/docs/guides/read-file/exists.md +0 -16
  169. package/docs/guides/read-file/json.md +0 -17
  170. package/docs/guides/read-file/mime.md +0 -20
  171. package/docs/guides/read-file/stream.md +0 -26
  172. package/docs/guides/read-file/string.md +0 -22
  173. package/docs/guides/read-file/uint8array.md +0 -21
  174. package/docs/guides/read-file/watch.md +0 -68
  175. package/docs/guides/runtime/build-time-constants.md +0 -293
  176. package/docs/guides/runtime/cicd.md +0 -43
  177. package/docs/guides/runtime/codesign-macos-executable.md +0 -56
  178. package/docs/guides/runtime/define-constant.md +0 -145
  179. package/docs/guides/runtime/delete-directory.md +0 -37
  180. package/docs/guides/runtime/delete-file.md +0 -19
  181. package/docs/guides/runtime/heap-snapshot.md +0 -26
  182. package/docs/guides/runtime/import-html.md +0 -15
  183. package/docs/guides/runtime/import-json.md +0 -44
  184. package/docs/guides/runtime/import-toml.md +0 -30
  185. package/docs/guides/runtime/import-yaml.md +0 -102
  186. package/docs/guides/runtime/read-env.md +0 -32
  187. package/docs/guides/runtime/set-env.md +0 -47
  188. package/docs/guides/runtime/shell.md +0 -40
  189. package/docs/guides/runtime/timezone.md +0 -35
  190. package/docs/guides/runtime/tsconfig-paths.md +0 -29
  191. package/docs/guides/runtime/typescript.md +0 -49
  192. package/docs/guides/runtime/vscode-debugger.md +0 -47
  193. package/docs/guides/runtime/web-debugger.md +0 -82
  194. package/docs/guides/streams/node-readable-to-arraybuffer.md +0 -11
  195. package/docs/guides/streams/node-readable-to-blob.md +0 -11
  196. package/docs/guides/streams/node-readable-to-json.md +0 -12
  197. package/docs/guides/streams/node-readable-to-string.md +0 -12
  198. package/docs/guides/streams/node-readable-to-uint8array.md +0 -11
  199. package/docs/guides/streams/to-array.md +0 -14
  200. package/docs/guides/streams/to-arraybuffer.md +0 -14
  201. package/docs/guides/streams/to-blob.md +0 -14
  202. package/docs/guides/streams/to-buffer.md +0 -15
  203. package/docs/guides/streams/to-json.md +0 -14
  204. package/docs/guides/streams/to-string.md +0 -14
  205. package/docs/guides/streams/to-typedarray.md +0 -22
  206. package/docs/guides/test/bail.md +0 -22
  207. package/docs/guides/test/coverage-threshold.md +0 -60
  208. package/docs/guides/test/coverage.md +0 -44
  209. package/docs/guides/test/happy-dom.md +0 -68
  210. package/docs/guides/test/migrate-from-jest.md +0 -143
  211. package/docs/guides/test/mock-clock.md +0 -48
  212. package/docs/guides/test/mock-functions.md +0 -68
  213. package/docs/guides/test/rerun-each.md +0 -14
  214. package/docs/guides/test/run-tests.md +0 -111
  215. package/docs/guides/test/skip-tests.md +0 -39
  216. package/docs/guides/test/snapshot.md +0 -95
  217. package/docs/guides/test/spy-on.md +0 -46
  218. package/docs/guides/test/svelte-test.md +0 -120
  219. package/docs/guides/test/testing-library.md +0 -92
  220. package/docs/guides/test/timeout.md +0 -15
  221. package/docs/guides/test/todo-tests.md +0 -67
  222. package/docs/guides/test/update-snapshots.md +0 -46
  223. package/docs/guides/test/watch-mode.md +0 -19
  224. package/docs/guides/util/base64.md +0 -15
  225. package/docs/guides/util/deep-equals.md +0 -39
  226. package/docs/guides/util/deflate.md +0 -18
  227. package/docs/guides/util/detect-bun.md +0 -23
  228. package/docs/guides/util/entrypoint.md +0 -17
  229. package/docs/guides/util/escape-html.md +0 -22
  230. package/docs/guides/util/file-url-to-path.md +0 -14
  231. package/docs/guides/util/gzip.md +0 -18
  232. package/docs/guides/util/hash-a-password.md +0 -54
  233. package/docs/guides/util/import-meta-dir.md +0 -13
  234. package/docs/guides/util/import-meta-file.md +0 -13
  235. package/docs/guides/util/import-meta-path.md +0 -13
  236. package/docs/guides/util/javascript-uuid.md +0 -23
  237. package/docs/guides/util/main.md +0 -32
  238. package/docs/guides/util/path-to-file-url.md +0 -14
  239. package/docs/guides/util/sleep.md +0 -22
  240. package/docs/guides/util/version.md +0 -21
  241. package/docs/guides/util/which-path-to-executable-bin.md +0 -15
  242. package/docs/guides/websocket/compression.md +0 -31
  243. package/docs/guides/websocket/context.md +0 -77
  244. package/docs/guides/websocket/pubsub.md +0 -41
  245. package/docs/guides/websocket/simple.md +0 -33
  246. package/docs/guides/write-file/append.md +0 -52
  247. package/docs/guides/write-file/basic.md +0 -44
  248. package/docs/guides/write-file/blob.md +0 -28
  249. package/docs/guides/write-file/cat.md +0 -17
  250. package/docs/guides/write-file/file-cp.md +0 -16
  251. package/docs/guides/write-file/filesink.md +0 -52
  252. package/docs/guides/write-file/response.md +0 -17
  253. package/docs/guides/write-file/stdout.md +0 -21
  254. package/docs/guides/write-file/stream.md +0 -17
  255. package/docs/guides/write-file/unlink.md +0 -16
  256. package/docs/index.md +0 -77
  257. package/docs/install/audit.md +0 -57
  258. package/docs/install/cache.md +0 -59
  259. package/docs/install/catalogs.md +0 -298
  260. package/docs/install/index.md +0 -248
  261. package/docs/install/isolated.md +0 -197
  262. package/docs/install/lifecycle.md +0 -46
  263. package/docs/install/lockfile.md +0 -58
  264. package/docs/install/npmrc.md +0 -105
  265. package/docs/install/overrides.md +0 -73
  266. package/docs/install/patch.md +0 -59
  267. package/docs/install/registries.md +0 -30
  268. package/docs/install/security-scanner-api.md +0 -81
  269. package/docs/install/workspaces.md +0 -114
  270. package/docs/installation.md +0 -327
  271. package/docs/project/asan.md +0 -124
  272. package/docs/project/benchmarking.md +0 -203
  273. package/docs/project/bindgen.md +0 -225
  274. package/docs/project/building-windows.md +0 -162
  275. package/docs/project/contributing.md +0 -347
  276. package/docs/project/internals/build-process-for-ci.md +0 -75
  277. package/docs/project/licensing.md +0 -73
  278. package/docs/project/roadmap.md +0 -87
  279. package/docs/quickstart.md +0 -157
  280. package/docs/runtime/autoimport.md +0 -94
  281. package/docs/runtime/bun-apis.md +0 -207
  282. package/docs/runtime/bunfig.md +0 -772
  283. package/docs/runtime/debugger.md +0 -325
  284. package/docs/runtime/env.md +0 -253
  285. package/docs/runtime/hot.md +0 -145
  286. package/docs/runtime/index.md +0 -312
  287. package/docs/runtime/jsx.md +0 -385
  288. package/docs/runtime/loaders.md +0 -130
  289. package/docs/runtime/modules.md +0 -320
  290. package/docs/runtime/nodejs-apis.md +0 -463
  291. package/docs/runtime/plugins.md +0 -561
  292. package/docs/runtime/shell.md +0 -605
  293. package/docs/runtime/typescript.md +0 -139
  294. package/docs/runtime/web-apis.md +0 -128
  295. package/docs/test/configuration.md +0 -154
  296. package/docs/test/coverage.md +0 -142
  297. package/docs/test/discovery.md +0 -85
  298. package/docs/test/dom.md +0 -75
  299. package/docs/test/examples/concurrent-test-glob.md +0 -132
  300. package/docs/test/hot.md +0 -15
  301. package/docs/test/lifecycle.md +0 -81
  302. package/docs/test/mocks.md +0 -313
  303. package/docs/test/reporters.md +0 -117
  304. package/docs/test/runtime-behavior.md +0 -95
  305. package/docs/test/snapshots.md +0 -68
  306. package/docs/test/time.md +0 -126
  307. package/docs/test/writing.md +0 -825
  308. package/docs/typescript.md +0 -53
@@ -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
- ```
@@ -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