Skip to content

Commit 57901c8

Browse files
Merge pull request #76 from godaddy/add-bun-warmup-library
Add Go warmup library for JavaScript runtime compatibility
2 parents f68c07e + dad960e commit 57901c8

File tree

6 files changed

+80
-2
lines changed

6 files changed

+80
-2
lines changed

.github/workflows/publish.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
- name: Publish Linux sha256sums
2626
run: scripts/generate-sha256.sh > output/SHA256SUMS
2727
- name: Upload Artifacts
28-
run: scripts/upload-artifacts.sh output/libasherah-x64.h output/libasherah-x64.so output/libasherah-x64.a output/libasherah-x64-archive.h output/libasherah-arm64.h output/libasherah-arm64.so output/libasherah-arm64.a output/libasherah-arm64-archive.h output/SHA256SUMS
28+
run: scripts/upload-artifacts.sh output/libasherah-x64.h output/libasherah-x64.so output/libasherah-x64.a output/libasherah-x64-archive.h output/libasherah-arm64.h output/libasherah-arm64.so output/libasherah-arm64.a output/libasherah-arm64-archive.h output/go-warmup-linux-x64.so output/go-warmup-linux-arm64.so output/SHA256SUMS
2929
env:
3030
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
3131
build-macos:
@@ -43,6 +43,6 @@ jobs:
4343
- name: Publish MacOS sha256sums
4444
run: scripts/generate-sha256.sh > output/SHA256SUMS-darwin
4545
- name: Upload Artifacts
46-
run: scripts/upload-artifacts.sh output/libasherah-darwin-x64.h output/libasherah-x64.dylib output/libasherah-darwin-arm64.h output/libasherah-arm64.dylib output/libasherah-darwin-arm64.a output/libasherah-darwin-x64.a output/libasherah-darwin-x64-archive.h output/libasherah-darwin-arm64-archive.h output/SHA256SUMS-darwin
46+
run: scripts/upload-artifacts.sh output/libasherah-darwin-x64.h output/libasherah-x64.dylib output/libasherah-darwin-arm64.h output/libasherah-arm64.dylib output/libasherah-darwin-arm64.a output/libasherah-darwin-x64.a output/libasherah-darwin-x64-archive.h output/libasherah-darwin-arm64-archive.h output/go-warmup-darwin-x64.dylib output/go-warmup-darwin-arm64.dylib output/SHA256SUMS-darwin
4747
env:
4848
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

GO_WARMUP.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# Go Warmup Library
2+
3+
## Purpose
4+
5+
The `go_warmup` library provides a minimal Go shared library that can be loaded via FFI from JavaScript runtimes to initialize the Go runtime before loading CGO-based N-API modules. This prevents runtime errors that occur when crypto/x509 initialization runs in certain JavaScript runtime environments.
6+
7+
## Background
8+
9+
Some JavaScript runtimes (like Bun) don't properly initialize the Go runtime when loading CGO-based N-API modules, leading to crashes during crypto/x509 initialization. By loading this minimal warmup library first via FFI, we ensure the Go runtime is properly initialized before the main library loads.
10+
11+
## Implementation
12+
13+
The library exports a single function:
14+
- `Warmup() int` - Initializes Go runtime and returns 1
15+
16+
## Build Artifacts
17+
18+
Platform-specific libraries are built and included in releases:
19+
- **Linux x64**: `go-warmup-linux-x64.so`
20+
- **Linux ARM64**: `go-warmup-linux-arm64.so`
21+
- **Darwin x64**: `go-warmup-darwin-x64.dylib`
22+
- **Darwin ARM64**: `go-warmup-darwin-arm64.dylib`
23+
24+
## Usage Example
25+
26+
JavaScript runtimes can use this library to ensure Go runtime compatibility:
27+
28+
```javascript
29+
// Detect runtime and load warmup library if needed
30+
if (typeof Bun !== 'undefined') {
31+
const { dlopen, FFIType } = require('bun:ffi');
32+
const lib = dlopen('path/to/go-warmup-platform.so', {
33+
Warmup: { returns: FFIType.int, args: [] }
34+
});
35+
lib.symbols.Warmup();
36+
}
37+
// Now safe to load CGO-based N-API modules
38+
```
39+
40+
## Testing
41+
42+
The warmup library has been tested with asherah-node in the Bun runtime and confirmed to resolve compatibility issues, enabling full functionality of CGO-based N-API modules.

go_warmup.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//go:build ignore
2+
// +build ignore
3+
4+
package main
5+
6+
import "C"
7+
8+
// Warmup initializes the Go runtime for JavaScript runtime compatibility.
9+
// This function is called via FFI from JavaScript runtimes (like Bun) before
10+
// loading CGO-based N-API modules. It prevents runtime errors that occur when
11+
// crypto/x509 initialization runs in certain JavaScript runtime environments.
12+
//
13+
//export Warmup
14+
func Warmup() C.int {
15+
return 1
16+
}
17+
18+
func main() {}

scripts/macos-build.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,13 @@ mv output/libasherah-x64.h output/libasherah-darwin-x64.h
1919

2020
go test -v -failfast -coverprofile cover.out
2121

22+
# Build Go warmup libraries for JavaScript runtime compatibility
23+
echo "Building Go warmup libraries..."
24+
CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 go build -buildmode=c-shared -ldflags='-s -w' -o output/go-warmup-darwin-arm64.dylib -tags="" go_warmup.go
25+
rm -f output/go_warmup.h # Remove unnecessary header file
26+
27+
CGO_ENABLED=1 GOOS=darwin GOARCH=amd64 go build -buildmode=c-shared -ldflags='-s -w' -o output/go-warmup-darwin-x64.dylib -tags="" go_warmup.go
28+
rm -f output/go_warmup.h # Remove unnecessary header file
29+
2230
find output/ -print0 | xargs -0 file
2331

scripts/ubuntu-build-arm64.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,9 @@ CGO_ENABLED=1 GOOS=linux GODEBUG=cgocheck=0 GOARCH=arm64 CC=aarch64-linux-gnu-gc
88
mv output/libasherah-arm64.h output/libasherah-arm64-archive.h
99
LD_RUN_PATH=\$ORIGIN CGO_ENABLED=1 GODEBUG=cgocheck=0 GOOS=linux GOARCH=arm64 CC=aarch64-linux-gnu-gcc go build -v -buildmode=c-shared -ldflags='-s -w' -o output/libasherah-arm64.so
1010

11+
# Build Go warmup library for JavaScript runtime compatibility
12+
echo "Building Go warmup library for Linux ARM64..."
13+
CGO_ENABLED=1 GOOS=linux GOARCH=arm64 CC=aarch64-linux-gnu-gcc go build -buildmode=c-shared -ldflags='-s -w' -o output/go-warmup-linux-arm64.so -tags="" go_warmup.go
14+
rm -f output/go_warmup.h # Remove unnecessary header file
15+
1116
find output/ -print0 | xargs -0 file

scripts/ubuntu-build-x64.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,10 @@ LD_RUN_PATH=\$ORIGIN CGO_ENABLED=1 GOOS=linux GODEBUG=cgocheck=0 GOARCH=amd64 go
88

99
go test -v -failfast -coverprofile cover.out
1010

11+
# Build Go warmup library for JavaScript runtime compatibility
12+
echo "Building Go warmup library for Linux x64..."
13+
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -buildmode=c-shared -ldflags='-s -w' -o output/go-warmup-linux-x64.so -tags="" go_warmup.go
14+
rm -f output/go_warmup.h # Remove unnecessary header file
15+
1116
find output/ -print0 | xargs -0 file
1217

0 commit comments

Comments
 (0)