Dylan Conway
8fad98ffdb
Add Bun.YAML.parse and YAML imports ( #22073 )
...
### What does this PR do?
This PR adds builtin YAML parsing with `Bun.YAML.parse`
```js
import { YAML } from "bun";
const items = YAML.parse("- item1");
console.log(items); // [ "item1" ]
```
Also YAML imports work just like JSON and TOML imports
```js
import pkg from "./package.yaml"
console.log({ pkg }); // { pkg: { name: "pkg", version: "1.1.1" } }
```
### How did you verify your code works?
Added some tests for YAML imports and parsed values.
---------
Co-authored-by: Claude Bot <claude-bot@bun.sh >
Co-authored-by: Claude <noreply@anthropic.com >
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
2025-08-23 06:55:30 -07:00
Jarred Sumner
b1417f494d
add postMessage string benchmark
2025-08-20 14:03:33 -07:00
robobun
e7672b2d04
Add string fast path for postMessage and structuredClone ( #21926 )
...
## Summary
Implements a string fast path optimization for `postMessage` and
`structuredClone` operations that provides significant performance
improvements for string-only data transfer, along with various bug fixes
and infrastructure improvements.
## Key Performance Improvements
**postMessage with Workers:**
- **Small strings (11 chars):** ~5% faster (572ns vs 599ns)
- **Medium strings (14KB):** **~2.7x faster** (528ns vs 1.40μs)
- **Large strings (3MB):** **~660x faster** (540ns vs 356μs)
**Compared to Node.js postMessage:**
- Similar performance for small strings
- Competitive for medium strings
- **~455x faster** for large strings (540ns vs 245μs)
## Implementation Details
The optimization adds a **string fast path** that bypasses full
structured cloning serialization when:
- Input is a pure string (`value.isString()`)
- No transfer list or message ports are involved
- Not being stored persistently
### Core Changes
**String Thread-Safety Utilities (`BunString.cpp/h`):**
- `isCrossThreadShareable()` - Checks if string can be safely shared
across threads
- `toCrossThreadShareable()` - Converts strings to thread-safe form via
`isolatedCopy()`
- Handles edge cases: atoms, symbols, substring slices, external buffers
**Serialization Fast Path (`SerializedScriptValue.cpp`):**
- New `m_fastPathString` field stores string data directly
- Bypasses full object serialization machinery for pure strings
- Creates isolated copies for cross-thread safety
**Deserialization Fast Path:**
- Directly returns JSString from stored string data
- Avoids parsing serialized byte streams
**Updated Flags System (`JSValue.zig`, `Serialization.cpp`):**
- Replaces boolean `forTransfer` with structured `SerializedFlags`
- Supports `forCrossProcessTransfer` and `forStorage` distinctions
**Structured Clone Infrastructure:**
- Moved `structuredClone` implementation to dedicated
`StructuredClone.cpp`
- Added `jsFunctionStructuredCloneAdvanced` for testing with custom
flags
- Improved class serialization compatibility checks (`isForTransfer`,
`isForStorage`)
**IPC Improvements (`ipc.zig`):**
- Fixed race conditions in `SendQueue` by deferring cleanup to next tick
- Proper fd ownership handling with `bun.take()`
- Cached IPC serialize/parse functions for better performance
**BlockList Thread Safety Fixes (`BlockList.zig`):**
- Fixed potential deadlocks by moving mutex locking inside methods
- Added atomic `estimated_size` counter to avoid lock during GC
- Corrected pointer handling in comparison functions
- Improved GC safety in `rules()` method
## Benchmark Results
```
❯ bun-21926 bench/string-postmessage.mjs # This branch
postMessage(11 chars string) 572.24 ns/iter
postMessage(14 KB string) 527.55 ns/iter ← ~2.7x faster
postMessage(3 MB string) 539.70 ns/iter ← ~660x faster
❯ bun-1.2.20 bench/string-postmessage.mjs # Previous
postMessage(11 chars string) 598.76 ns/iter
postMessage(14 KB string) 1.40 µs/iter
postMessage(3 MB string) 356.38 µs/iter
❯ node bench/string-postmessage.mjs # Node.js comparison
postMessage(11 chars string) 569.63 ns/iter
postMessage(14 KB string) 1.46 µs/iter
postMessage(3 MB string) 245.46 µs/iter
```
**Key insight:** The fast path achieves **constant time performance**
regardless of string size (~540ns), while traditional serialization
scales linearly with data size.
## Test Coverage
**New Tests:**
- `test/js/web/structured-clone-fastpath.test.ts` - Fast path memory
usage validation
- `test/js/web/workers/structuredClone-classes.test.ts` - Comprehensive
class serialization tests
- Tests ArrayBuffer transferability
- Tests BunFile cloning with storage/transfer restrictions
- Tests net.BlockList cloning behavior
- Validates different serialization contexts (default, worker, window)
**Enhanced Tests:**
- `test/js/web/workers/structured-clone.test.ts` - Multi-function
testing
- Tests `structuredClone`, `jscSerializeRoundtrip`, and cross-process
serialization
- Validates consistency across different serialization paths
- `test/js/node/cluster.test.ts` - Better error handling and debugging
**Benchmarks:**
- `bench/string-postmessage.mjs` - Worker postMessage performance
comparison
- `bench/string-fastpath.mjs` - Fast path vs traditional serialization
comparison
## Bug Fixes
**BlockList Threading Issues:**
- Fixed potential deadlocks when multiple threads access BlockList
simultaneously
- Moved mutex locks inside methods rather than holding across entire
function calls
- Added atomic size tracking for GC compatibility
- Fixed comparison function pointer handling
**IPC Race Conditions:**
- Fixed race condition where `SendQueue._onAfterIPCClosed()` could be
called on wrong thread
- Deferred cleanup operations to next tick using task queue
- Improved file descriptor ownership with proper `bun.take()` usage
**Structured Clone Compatibility:**
- Enhanced class serialization with proper transfer/storage mode
checking
- Fixed edge cases where non-transferable objects were incorrectly
handled
- Added better error reporting for unsupported clone operations
## Technical Notes
- Thread safety ensured via `String.isolatedCopy()` for cross-VM
transfers
- Memory cost calculation updated to account for string references
- Maintains full compatibility with existing structured clone semantics
- Does not affect object serialization or transfer lists
- Proper cleanup and error handling throughout IPC pipeline
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Meghan Denny <meghan@bun.sh >
2025-08-20 00:25:00 -07:00
Jarred Sumner
4fa69773a3
Introduce Bun.stripANSI ( #21801 )
...
### What does this PR do?
Introduce `Bun.stripANSI`, a SIMD-accelerated drop-in replacement for
the popular `"strip-ansi"` package.
`Bun.stripANSI` performs >10x faster and fixes several bugs in
`strip-ansi`, like [this long-standing
one](https://github.com/chalk/strip-ansi/issues/43 ).
### How did you verify your code works?
There are tests that check the output of `strip-ansi` matches
`Bun.stripANSI`. For cases where `strip-ansi`'s behavior is incorrect,
the expected value is manually provided.
---------
Co-authored-by: Jarred-Sumner <709451+Jarred-Sumner@users.noreply.github.com >
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Claude Bot <claude-bot@bun.sh >
Co-authored-by: Claude <noreply@anthropic.com >
Co-authored-by: taylor.fish <contact@taylor.fish >
2025-08-14 22:42:05 -07:00
Jarred Sumner
7726e5c670
Update node-zlib-brotli.mjs
2025-08-01 14:35:04 -07:00
Jarred Sumner
a6f09228af
Fix
2025-07-14 22:33:59 -07:00
Jarred Sumner
55a9cccac0
bun.sh -> bun.com ( #20909 )
2025-07-10 00:10:43 -07:00
Jarred Sumner
454316ffc3
Implement "node:module"'s findSourceMap and SourceMap class ( #20863 )
...
Co-authored-by: Claude <claude@anthropic.ai >
Co-authored-by: Claude <noreply@anthropic.com >
Co-authored-by: Jarred-Sumner <709451+Jarred-Sumner@users.noreply.github.com >
2025-07-07 23:08:12 -07:00
Joel Shepherd
13c5b0d9cb
Added rapidhash algorithm ( #20163 )
2025-06-03 03:34:35 -07:00
Meghan Denny
d774baa28a
tidyings from 18962 ( #19644 )
2025-05-14 18:47:51 -07:00
Alistair Smith
6e063fa57b
Use "module": "Preserve" ( #19655 )
...
Co-authored-by: Matt Pocock <mattpocockvoice@gmail.com >
2025-05-14 18:43:15 -07:00
Jarred Sumner
1c464c5d14
Add stress test for Bun.serve() routes hot reloading
2025-05-06 03:23:16 -07:00
Jarred Sumner
acf0b68299
Make request.method getter not allocate memory ( #18961 )
2025-04-11 20:59:38 -07:00
Jarred Sumner
02023810ba
Clean up some docs
2025-04-08 03:57:35 -07:00
Alistair Smith
57381d43ed
types: Rewrite to avoid conflicts and allow for doc generation ( #18024 )
...
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
2025-03-25 14:33:30 -07:00
Dylan Conway
73d1b2ff67
Add benchmark for Cipheriv and Decipheriv ( #18394 )
2025-03-21 19:49:44 -07:00
Dylan Conway
a3585ff961
node:crypto: implement hkdf and hkdfSync (#18312 )
2025-03-21 01:03:01 -07:00
Dylan Conway
c820b0c5e1
node:crypto: implement generatePrime(Sync) and checkPrime(Sync) (#18268 )
2025-03-18 11:48:24 -07:00
Dylan Conway
4214cc0aaa
followup #18044 and #17850 ( #18205 )
2025-03-14 21:26:12 -07:00
Dylan Conway
ddfc8555f7
crypto: fix test-crypto-random.js ( #18044 )
...
Co-authored-by: Meghan Denny <meghan@bun.sh >
2025-03-11 18:21:20 -07:00
Kai Tamkun
4a0e982bb2
node:http improvements ( #17093 )
...
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
Co-authored-by: Pham Minh Triet <92496972+Nanome203@users.noreply.github.com >
Co-authored-by: snwy <snwy@snwy.me >
Co-authored-by: Ciro Spaciari <ciro.spaciari@gmail.com >
Co-authored-by: cirospaciari <cirospaciari@users.noreply.github.com >
Co-authored-by: Ben Grant <ben@bun.sh >
2025-03-10 20:19:29 -07:00
Meghan Denny
5ae28d27a0
node: fix buffer includes+indexof ( #16642 )
2025-02-18 13:12:03 -08:00
Jarred Sumner
f29e912a91
Add routes to Bun.serve() ( #17357 )
2025-02-16 00:42:05 -08:00
Ben Kunkle
b44769c751
Glob Match Rewrite ( #16824 )
...
Co-authored-by: Zack Radisic <56137411+zackradisic@users.noreply.github.com >
2025-02-14 06:32:57 -08:00
Meghan Denny
6353fa4806
node:buffer: fix read ( #17299 )
2025-02-12 23:37:36 -08:00
chloe caruso
f17ce2b756
hmr fixes ( #17239 )
...
Co-authored-by: Dylan Conway <dylan.conway567@gmail.com >
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
2025-02-12 23:14:02 -08:00
Meghan Denny
180500181f
js: fix Buffer constructor and Buffer.from ( #16731 )
2025-02-07 15:13:21 -08:00
Meghan Denny
93a89e5866
meta: update bun.locks with bun 1.2 ( #16867 )
...
Co-authored-by: nektro <5464072+nektro@users.noreply.github.com >
2025-01-29 01:47:43 -08:00
Dylan Conway
7410da9c71
fix(install): bun.lockb -> bun.lock with incorrect optional peer dependencies ( #16743 )
...
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
2025-01-26 04:29:54 -08:00
Jarred Sumner
f1cfb10658
Update buffer-create.mjs
2025-01-24 23:37:41 -08:00
pfg
b0c5a7655d
Update docs for bun.lock ( #16585 )
2025-01-21 22:09:23 -08:00
Jarred Sumner
427f60c7b2
Update README.md
2025-01-21 07:55:41 -08:00
Jarred Sumner
3395435c6a
benches
2025-01-21 07:55:41 -08:00
Jarred Sumner
246936a7a4
Add express folder
2025-01-21 07:55:41 -08:00
Meghan Denny
5971406183
meta: migrate bun to the text lockfile ( #16462 )
...
Co-authored-by: nektro <5464072+nektro@users.noreply.github.com >
2025-01-17 22:37:26 +00:00
Jarred Sumner
274859584d
Add docs for html imports
2025-01-15 16:33:24 -08:00
Don Isaac
81ecf7556c
ci: repair lint setup and run it in CI ( #15720 )
...
Co-authored-by: Don Isaac <don@bun.sh >
2025-01-08 07:12:18 +00:00
Jarred Sumner
912a2cbc12
Expose some no-ops ( #16125 )
...
Co-authored-by: Jarred-Sumner <Jarred-Sumner@users.noreply.github.com >
2025-01-03 13:57:46 -08:00
Jarred Sumner
ab8fe1a6c3
Bump
2025-01-02 21:17:47 -08:00
Jarred Sumner
19191659cf
Avoid resolving substrings in bun:sqlite and Buffer.byteLength ( #16092 )
2024-12-31 19:48:33 -08:00
Jarred Sumner
608101c975
Add zlib microbenchmark
...
need to improve this
2024-12-24 04:20:24 -08:00
Michael H
b54137174b
Bench updates ( #15029 )
...
Co-authored-by: RiskyMH <RiskyMH@users.noreply.github.com >
2024-11-08 23:15:24 -08:00
Ciro Spaciari
2f2a24f625
bench: fix grpc and scripts ( #14638 )
2024-10-17 13:30:47 -07:00
Ciro Spaciari
2d0b557ff7
add grpc-js bench ( #14601 )
2024-10-16 11:11:53 -07:00
Dylan Conway
7283453eed
use memset_patternN in Buffer.fill ( #14599 )
2024-10-15 21:16:57 -07:00
Ashcon Partovi
27a157b6c1
Improve command detection in CMake
2024-10-01 13:50:15 -07:00
Zack Radisic
274e5a2022
CSS Parser ( #14122 )
...
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com >
2024-09-26 13:39:26 -07:00
Wilmer Paulino
6f27b5559d
Switch RSA asymmetric sign implementation to BoringSSL ( #14125 )
2024-09-25 01:12:50 -07:00
Jarred Sumner
d9d4cff303
Micro-optimize path.resolve(), path.resolve("") ( #13930 )
2024-09-14 01:42:49 -04:00
Jarred Sumner
ff6f8bd2d1
Update path-resolve.mjs
2024-09-12 15:00:52 -07:00