Repository navigation
Conversation
…sport - PosixTransport (packages/ecr17/posix, macOS/Linux): a port of WinsockTransport with the same contract (write-free MSG_PEEK pre-send probe, one drop signal, no byte consumed) plus no SIGPIPE (MSG_NOSIGNAL / SO_NOSIGPIPE). It has 14 loopback tests, run by cpp-tests on Linux. The opt-in real-terminal test now uses the host's production transport, and the test-only PosixTcpTransport is gone. - Node.js API: src/ (TypeScript Ecr17Client with the same API and types as @padosoft/react-native-ecr17, built with tsdown through @padosoft/config) over node/addon.cpp (Node-API 8, cmake-js). Each client has one worker thread, so commands never block the event loop or libuv's thread pool. Results and events share one ordered queue, so a command's events always arrive before its result. An idle client doesn't keep the process alive. A throwing listener surfaces as uncaughtException. - 17 Node tests drive TypeScript -> addon -> core -> TCP against a scripted fake terminal. The money-safety test (a payment interrupted by a drop goes out exactly once, and sendLastResult recovers it) was mutation-checked. - CI: node.yml builds and tests the addon on linux-x64, linux-arm64, darwin-arm64 and win32-x64, and runs typecheck + tsdown. The release workflow calls it and ships packages/ecr17/prebuilds/<platform>-<arch>/ecr17.node. - Docs: apps/docs/docs/nodejs.md, the core README, the main README (feature table, roadmap, tests), AGENTS.md, LESSON.md, PROGRESS.md. Verified locally on macOS: 114 C++ tests, 17 Node tests (30 consecutive clean runs), and the teardown scenarios (never closed, process.exit with a pending command, close during a command, throwing listener), which all exit 0. Linux and Windows are verified by CI only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CI's GESCAT_NPM_TOKEN gets 401 from GitHub Packages, so the TS job now strips the private deps like ts-checks: it typechecks with a self-contained tsconfig.ci.json (the preset's strict options) and builds with tsdown --no-config and the preset's flags. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…node The core npm package (@padosoft/ecr17) goes back to pure C++ source: protocol, session, money-safe client, and the POSIX + Winsock transports, plus its pod, Swift package and Expo plugin. Every API package layers on it: the React Native binding, and now @padosoft/ecr17-node (src/, node/, test/, dist/ and prebuilds/), version 2.0.0 in lockstep with the core. - node/CMakeLists.txt finds the core through -DECR17_DIR, then Node resolution of @padosoft/ecr17, then the monorepo sibling (CI installs no workspace). - CI, release (prebuilds, dist), strip-private-deps, .gitignore, READMEs, the docs page, AGENTS, LESSON and PROGRESS now use the new package. - A missing addon no longer hangs the Node suite: setup closes the fake terminal when the client can't be created. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
47PADO47
added this pull request to stack #27
October 6, 2026 00:35
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #26.
The layering is now one C++ core with thin API packages on top:
@padosoft/ecr17-nodehas the samecreateEcr17Client, methods, requests, results and events as@padosoft/react-native-ecr17. It runs on the same C++ client through Node-API, so the money-safety logic still exists only once.PosixTransport(in the core,packages/ecr17/posix, macOS/Linux) is a port ofWinsockTransport: write-freeMSG_PEEKpre-send probe, one drop signal, and noSIGPIPE. It has 14 loopback tests, run bycpp-testson Linux. The real-terminal test now uses it, and the test-onlyPosixTcpTransportis removed.packages/ecr17-node/node/addon.cpp, Node-API 8, cmake-js): requests go in, the core's raw structs come out, andsrc/mappers.tsmirrorsHybridEcr17Client.cpp.-DECR17_DIR, Node resolution, or the monorepo sibling.src/): built with tsdown through@padosoft/config(ESM + CJS). The addon is loaded frombuild/Release/orprebuilds/<platform>-<arch>/, or fromECR17_NODE_ADDONif set.sendLastResultrecovers it. It was mutation-checked.node.ymlbuilds and tests the addon on linux-x64, linux-arm64, darwin-arm64 and win32-x64. It also typechecks with a self-containedtsconfig.ci.json, because CI's token gets 401 on the private@padosoft/config, and builds with tsdown. The release workflow calls it and ships the prebuilds.Bugs found and fixed while testing:
Verified locally on macOS:
CI was green on all four platforms on the previous push.
Not done:
@padosoft/ecr17still depends on the unpublished@padosoft/native-modules.docs-sitetoapps/docsin the Cloudflare dashboard.Next, per the agreed plan: a separate PR that switches the RN binding to
PosixTransporton iOS and Android and removes the Swift/Kotlin transports. It's gated on a real-terminal test.🤖 Generated with Claude Code