@planx.machina.at/tunnel
v19.150.0
Published
TUN device + smoltcp userspace TCP/IP stack NAPI module for planx vnet (Pattern C privileged daemon)
Readme
@planx.machina.at/tunnel
TUN device + smoltcp userspace TCP/IP stack NAPI module for planx vnet (Pattern C privileged daemon).
Overview
Pattern C 分離 model の native side。 planx-networkd (= root process) が本 NAPI module を load して TUN device + smoltcp Interface + tokio poll loop を起動する。 USER process side の planx daemon は tRPC over unix socket で networkd に接続し、 L4 event のみ boundary を超える。
NAPI exports
setup_vnet({ selfHip, prefix, mtu })→{ ifaceName }addPeerAddress({ hipBytes })/removePeerAddress({ hipBytes })injectTcpData({ connId, payload })/injectTcpClose({ connId })/injectUdpSend({ dstPort, srcAddr, srcPort, payload })onEvent((ev: NetworkdEvent) => void)/offEvent()
Dev build (single platform)
nx build @planx.machina.at/tunnel # release .node (native target only)
nx build:debug @planx.machina.at/tunnel # debug .node
nx test @planx.machina.at/tunnel # cargo test
nx lint @planx.machina.at/tunnel # cargo clippyRelease flow (5 platform fan-out + publish)
5 per-arch package を repo commit して GAR publish するための flow。 Mac local で実行する想定 (= CI では走らせない)。
Prerequisites
brew install zig
rustup target add aarch64-apple-darwin x86_64-apple-darwin \
x86_64-unknown-linux-gnu aarch64-unknown-linux-gnu \
x86_64-unknown-linux-musl
gcloud auth application-default login # or GOOGLE_APPLICATION_CREDENTIALS exportSteps
# 1. 5 platform 分の .node を prebuilt/ に生成
nx prebuild @planx.machina.at/tunnel
# 2. prebuilt/*.node を packages/@planx.machina.at/tunnel-{arch}/ に配布 +
# main package の index.js / index.d.ts を最新化
nx build @planx.machina.at/tunnel
# 3. (commit .node files to repo — Rust source 改修ごとに必要)
git add prebuilt/ ../../../packages/@planx.machina.at/tunnel-*/planx-tunnel.*.node
git commit -m "chore(tunnel): rebuild native binaries"
# 4. 全 publish (= main + 5 per-arch を tag:package run-many で publish)
nx run-many -t deploy -p 'tag:package' --parallel=2Dry run
DRY_RUN=true nx run @planx.machina.at/tunnel:deployPer-arch binaries
| Package | Platform | libc |
| ------------------------------------------------ | ---------------- | ---- |
| @planx.machina.at/tunnel-darwin-arm64 | macOS Apple Silicon | - |
| @planx.machina.at/tunnel-darwin-x64 | macOS Intel | - |
| @planx.machina.at/tunnel-linux-x64-gnu | Linux x86_64 | glibc |
| @planx.machina.at/tunnel-linux-arm64-gnu | Linux ARM64 | glibc |
| @planx.machina.at/tunnel-linux-x64-musl | Linux x86_64 | musl |
main @planx.machina.at/tunnel package が optionalDependencies で各 per-arch を参照し、
runtime に NAPI loader (index.js) が platform 判定で適切な .node を require する。
Troubleshooting
- 401/403 on publish → ~/.npmrc の GAR token 切れ / 権限を確認。
CI では on-merge-to-develop.yml の "Configure Artifact Registry auth" step が token を
供給する (deploy script 自身は auth しない、#4645 で npx auth-refresh を撤去)。
手動で publish する場合のみ
npx google-artifactregistry-authで refresh する。 - napi build で "linker
ccnot found" (Linux cross-compile) →--zigflag が抜けている。prebuild.sh経由で実行する。 cargo: command not found→ rustup PATH 未設定。export PATH="$HOME/.cargo/bin:$PATH"。- prebuilt/*.node が古い →
nx prebuildを re-run してgit addし直す。
