Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
319 changes: 248 additions & 71 deletions .github/workflows/CI.yml

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,4 @@ Following ["Publish It" section from `napi-rs` docs](https://napi.rs/docs/introd
3. Send that as a Pull Request to GitHub. Ensure that the commit message consisting **only** of `x.y.z` - this is how the CI decides to publish to `npm`!

`NPM_TOKEN` is part of the repo secrets, generated [like this](https://httptoolkit.com/blog/automatic-npm-publish-gha/).
# Cross-platform build trigger Fri Aug 29 03:27:55 PM +07 2025
90 changes: 90 additions & 0 deletions README_ARM64.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# @replit/ruspty - ARM64 Linux Support

This is a fork of [@replit/ruspty](https://github.com/replit/ruspty) with added support for ARM64 Linux (aarch64-unknown-linux-gnu).

## What's Changed

### 1. ARM64 Architecture Support
- Added `aarch64-unknown-linux-gnu` to supported platforms in `package.json`
- Created npm package configuration for ARM64 Linux binary

### 2. Sandbox Compatibility Fix
- Made sandbox module x86_64-specific since it uses architecture-specific registers (rsi, rdx)
- Added conditional compilation: `#[cfg(all(target_os = "linux", target_arch = "x86_64"))]`
- Graceful fallback on ARM64 with warning message

## Building for ARM64

### Prerequisites
```bash
# Install Rust toolchain
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
```

### Build Steps
```bash
# Install dependencies
npm install

# Build native binary
npm run build

# The ARM64 binary will be created as:
# ruspty.linux-arm64-gnu.node
```

## Testing

### Direct Binary Test
```bash
node test-direct.js
```

Output should show:
```
✅ PTY created successfully!
🎉 ARM64 native binary is working!
```

## Integration with Battle Framework

This fork is used by the Battle terminal testing framework to provide real PTY support on ARM64 Linux systems.

### Usage in package.json
```json
"dependencies": {
"@replit/ruspty": "file:../ruspty"
}
```

## Platform Support Matrix

| Platform | Architecture | Status | Binary |
|----------|-------------|--------|--------|
| Linux | x86_64 | ✅ Original | ruspty.linux-x64-gnu.node |
| Linux | ARM64 | ✅ This Fork | ruspty.linux-arm64-gnu.node |
| macOS | x86_64 | ✅ Original | ruspty.darwin-x64.node |
| macOS | ARM64 | ✅ Original | ruspty.darwin-arm64.node |
| Windows | Any | ❌ | Not supported |

## Known Limitations

1. **Sandbox feature**: Not available on ARM64 (x86_64 only)
- Uses x86_64-specific CPU registers
- Non-critical for most use cases

2. **Manual compilation required**: No prebuilt binaries for ARM64 yet
- Must build from source
- Requires Rust toolchain

## Contributing

To contribute ARM64 support upstream:
1. Test thoroughly on ARM64 hardware
2. Update CI/CD to build ARM64 binaries
3. Submit PR to original ruspty repository

## License

MIT (same as original ruspty)
36 changes: 18 additions & 18 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.android-arm64.node');
} else {
nativeBinding = require('@replit/ruspty-android-arm64');
nativeBinding = require('@akaoio/ruspty-android-arm64');
}
} catch (e) {
loadError = e;
Expand All @@ -56,7 +56,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.android-arm-eabi.node');
} else {
nativeBinding = require('@replit/ruspty-android-arm-eabi');
nativeBinding = require('@akaoio/ruspty-android-arm-eabi');
}
} catch (e) {
loadError = e;
Expand All @@ -76,7 +76,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.win32-x64-msvc.node');
} else {
nativeBinding = require('@replit/ruspty-win32-x64-msvc');
nativeBinding = require('@akaoio/ruspty-win32-x64-msvc');
}
} catch (e) {
loadError = e;
Expand All @@ -90,7 +90,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.win32-ia32-msvc.node');
} else {
nativeBinding = require('@replit/ruspty-win32-ia32-msvc');
nativeBinding = require('@akaoio/ruspty-win32-ia32-msvc');
}
} catch (e) {
loadError = e;
Expand All @@ -104,7 +104,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.win32-arm64-msvc.node');
} else {
nativeBinding = require('@replit/ruspty-win32-arm64-msvc');
nativeBinding = require('@akaoio/ruspty-win32-arm64-msvc');
}
} catch (e) {
loadError = e;
Expand All @@ -122,7 +122,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.darwin-universal.node');
} else {
nativeBinding = require('@replit/ruspty-darwin-universal');
nativeBinding = require('@akaoio/ruspty-darwin-universal');
}
break;
} catch {}
Expand All @@ -135,7 +135,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.darwin-x64.node');
} else {
nativeBinding = require('@replit/ruspty-darwin-x64');
nativeBinding = require('@akaoio/ruspty-darwin-x64');
}
} catch (e) {
loadError = e;
Expand All @@ -149,7 +149,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.darwin-arm64.node');
} else {
nativeBinding = require('@replit/ruspty-darwin-arm64');
nativeBinding = require('@akaoio/ruspty-darwin-arm64');
}
} catch (e) {
loadError = e;
Expand All @@ -168,7 +168,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.freebsd-x64.node');
} else {
nativeBinding = require('@replit/ruspty-freebsd-x64');
nativeBinding = require('@akaoio/ruspty-freebsd-x64');
}
} catch (e) {
loadError = e;
Expand All @@ -185,7 +185,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.linux-x64-musl.node');
} else {
nativeBinding = require('@replit/ruspty-linux-x64-musl');
nativeBinding = require('@akaoio/ruspty-linux-x64-musl');
}
} catch (e) {
loadError = e;
Expand All @@ -198,7 +198,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.linux-x64-gnu.node');
} else {
nativeBinding = require('@replit/ruspty-linux-x64-gnu');
nativeBinding = require('@akaoio/ruspty-linux-x64-gnu');
}
} catch (e) {
loadError = e;
Expand All @@ -214,7 +214,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.linux-arm64-musl.node');
} else {
nativeBinding = require('@replit/ruspty-linux-arm64-musl');
nativeBinding = require('@akaoio/ruspty-linux-arm64-musl');
}
} catch (e) {
loadError = e;
Expand All @@ -227,7 +227,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.linux-arm64-gnu.node');
} else {
nativeBinding = require('@replit/ruspty-linux-arm64-gnu');
nativeBinding = require('@akaoio/ruspty-linux-arm64-gnu');
}
} catch (e) {
loadError = e;
Expand All @@ -243,7 +243,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.linux-arm-musleabihf.node');
} else {
nativeBinding = require('@replit/ruspty-linux-arm-musleabihf');
nativeBinding = require('@akaoio/ruspty-linux-arm-musleabihf');
}
} catch (e) {
loadError = e;
Expand All @@ -256,7 +256,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.linux-arm-gnueabihf.node');
} else {
nativeBinding = require('@replit/ruspty-linux-arm-gnueabihf');
nativeBinding = require('@akaoio/ruspty-linux-arm-gnueabihf');
}
} catch (e) {
loadError = e;
Expand All @@ -272,7 +272,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.linux-riscv64-musl.node');
} else {
nativeBinding = require('@replit/ruspty-linux-riscv64-musl');
nativeBinding = require('@akaoio/ruspty-linux-riscv64-musl');
}
} catch (e) {
loadError = e;
Expand All @@ -285,7 +285,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.linux-riscv64-gnu.node');
} else {
nativeBinding = require('@replit/ruspty-linux-riscv64-gnu');
nativeBinding = require('@akaoio/ruspty-linux-riscv64-gnu');
}
} catch (e) {
loadError = e;
Expand All @@ -300,7 +300,7 @@ switch (platform) {
if (localFileExisted) {
nativeBinding = require('./ruspty.linux-s390x-gnu.node');
} else {
nativeBinding = require('@replit/ruspty-linux-s390x-gnu');
nativeBinding = require('@akaoio/ruspty-linux-s390x-gnu');
}
} catch (e) {
loadError = e;
Expand Down
2 changes: 1 addition & 1 deletion npm/darwin-arm64/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@replit/ruspty-darwin-arm64",
"version": "3.5.2",
"version": "3.5.8",
"os": [
"darwin"
],
Expand Down
2 changes: 1 addition & 1 deletion npm/darwin-x64/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@replit/ruspty-darwin-x64",
"version": "3.5.2",
"version": "3.5.8",
"os": [
"darwin"
],
Expand Down
22 changes: 22 additions & 0 deletions npm/linux-arm64-gnu/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# `@replit/ruspty-linux-arm64-gnu`

This is the **aarch64-unknown-linux-gnu** binary for `@replit/ruspty`

## ARM64 Linux Support

This binary provides native PTY support for ARM64 Linux systems (aarch64).

### Requirements
- Linux ARM64 (aarch64) architecture
- glibc 2.17 or later

### Building from source
If you need to rebuild this binary:

```bash
cd ../../
npm install
npm run build
```

The binary will be generated as `ruspty.linux-arm64-gnu.node`
18 changes: 18 additions & 0 deletions npm/linux-arm64-gnu/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "@akaoio/ruspty-linux-arm64-gnu",
"version": "3.5.8",
"os": [
"linux"
],
"cpu": [
"arm64"
],
"main": "ruspty.linux-arm64-gnu.node",
"files": [
"ruspty.linux-arm64-gnu.node"
],
"license": "MIT",
"engines": {
"node": ">= 10"
}
}
2 changes: 1 addition & 1 deletion npm/linux-x64-gnu/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@replit/ruspty-linux-x64-gnu",
"version": "3.5.2",
"version": "3.5.8",
"os": [
"linux"
],
Expand Down
29 changes: 25 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading