{"ref":"artifact:datazoode-erpl-node-rfc","page":"/artifacts/datazoode-erpl-node-rfc","json":"/artifacts/datazoode-erpl-node-rfc.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"datazoode-erpl-node-rfc","name":"erpl-node-rfc","artifact_type":"package","ecosystem":"abap","domain":"integration-and-messaging","origin_ring":"independent","use_as":"dependency","description":{"one_line":"An SAP RFC client for Node.js and TypeScript that implements the protocol in Rust and ships prebuilt for seven platforms behind node-rfc's API, so there is no SAP NW RFC SDK to download.","short":"RFC client for Node.js and TypeScript without the NW RFC SDK","what_it_solves":"SAP archived node-rfc, and `npm install node-rfc` never worked on its own: it is a C++ addon over the licence-gated SAP NW RFC SDK, roughly 30 MB of C libraries and ICU you register with SAP for and keep on the loader path at run time, built locally with node-gyp and a Python toolchain. This package implements the RFC protocol in Rust, in a crate the maintainer calls erpl-proto, and ships the addon prebuilt for seven platforms: Linux x64 and arm64 on glibc and musl, macOS x64 and arm64, Windows x64. The surface above it is node-rfc's own TypeScript layer, adapted under Apache-2.0, so `Client`, `Pool`, `Throughput`, `Server`, the error shapes, the promise and callback form of every method and `sapnwrfc.ini` destinations are that library's, the destinations parsed by this package rather than by the SDK. Compatibility is measured rather than asserted: `examples/run_both.sh` runs one program under SAP's node-rfc 3.3.1 on the real SDK and under this package and diffs the output field by field.","when_not_to_use":"BUSL-1.1 rather than node-rfc's Apache-2.0, so a product you distribute has to be read against the licence and its Additional Use Grant first, and the source is closed: the GitHub repository is the issue tracker and the documentation, nothing else. `RfcServerOptions.bgRfcHandlers` raises instead of accepting handlers, so a server receiving inbound bgRFC units is outside what this does. An ABAP `MESSAGE`-raised failure still arrives with its T100 template rather than the rendered sentence, and the dump name is not reported as `key` for that case.","to_build_on_it":"With the source closed, the way in is the issue tracker, where the maintainer asks a report to say what SAP's node-rfc did with the same input; `examples/run_both.sh` runs one program under both and diffs the output, and that is how every bug found so far was found."},"links":{"npm":"https://www.npmjs.com/package/erpl-node-rfc","repo":"https://github.com/DataZooDE/erpl-node-rfc-issues","homepage":"https://erpl.io","docs":"https://github.com/DataZooDE/erpl-node-rfc-issues/blob/main/MIGRATION.md"},"maintainers":["actor:datazoode"],"compat":{"runtimes":["node"],"typed":true},"type_properties":{"placement":{"value":"own-process","sources":[{"url":"https://github.com/DataZooDE/erpl-node-rfc-issues","title":"erpl-node-rfc — README","checked":"2026-10-18","quote":"const client = new Client({ ashost: \"…\", sysnr: \"00\", client: \"001\", user: \"…\", passwd: \"…\" });"}]},"distribution":{"value":["npm"],"sources":[{"url":"https://github.com/DataZooDE/erpl-node-rfc-issues","title":"erpl-node-rfc — README","checked":"2026-10-18","quote":"npm install erpl-node-rfc"}]}},"provides":[{"capability":"capability:rfc-connectivity","what_it_does":"Calls RFC-enabled ABAP function modules from Node.js over its own Rust implementation of the RFC protocol, shipped prebuilt in the package, so no SAP NW RFC SDK is present on the machine; pooling, throughput tracking and `sapnwrfc.ini` destinations come with it, and inbound bgRFC handlers raise instead of being accepted.","sources":[{"url":"https://www.npmjs.com/package/erpl-node-rfc","title":"erpl-node-rfc — README","checked":"2026-10-17","quote":"**SAP RFC client for Node.js and TypeScript, with no SAP NW RFC SDK.**"},{"url":"https://github.com/DataZooDE/erpl-node-rfc-issues","title":"DataZooDE/erpl-node-rfc-issues — README","checked":"2026-10-17","quote":"It implements the RFC protocol in **pure Rust** and ships prebuilt binaries"},{"url":"https://raw.githubusercontent.com/DataZooDE/erpl-node-rfc-issues/main/MIGRATION.md","title":"erpl-node-rfc — Migrating from SAP node-rfc","checked":"2026-10-17","quote":"| `sapnwrfc.ini` destinations (`{ dest: \"...\" }`) | works — parsed by this package |"}]}],"connects":[{"ref":"external:abap-platform","interface":"rfc","kind":"data","direction":"outbound","for":"Opens a connection to an application server from the host, gateway and client in the configuration or from a `sapnwrfc.ini` destination, and calls RFC-enabled function modules on it.","sources":[{"url":"https://www.npmjs.com/package/erpl-node-rfc","title":"erpl-node-rfc — README","checked":"2026-10-17","quote":"**SAP RFC client for Node.js and TypeScript, with no SAP NW RFC SDK.**"},{"url":"https://raw.githubusercontent.com/DataZooDE/erpl-node-rfc-issues/main/MIGRATION.md","title":"erpl-node-rfc — Migrating from SAP node-rfc","checked":"2026-10-17","quote":"| `Client`: `open`, `close`, `ping`, `call`, `invoke`, `connect`, `cancel` | works |"}]}],"interfaces":[{"key":"rfc-server","kind":"api","protocol":"rfc","direction":"in","for":"A server that is started and has functions added to it, so a caller can reach a function implemented in the Node process; a server receiving inbound bgRFC units is the one surface that raises.","sources":[{"url":"https://raw.githubusercontent.com/DataZooDE/erpl-node-rfc-issues/main/MIGRATION.md","title":"erpl-node-rfc — Migrating from SAP node-rfc","checked":"2026-10-17","quote":"| `Server`: `start`, `stop`, `addFunction`, `removeFunction`, `getFunctionDescription` | works |"},{"url":"https://raw.githubusercontent.com/DataZooDE/erpl-node-rfc-issues/main/MIGRATION.md","title":"erpl-node-rfc — Migrating from SAP node-rfc","checked":"2026-10-17","quote":"node-rfc's client has no bgRFC surface at all, so this affects only a server"}]}],"provenance":{"discovered_via":[{"source":"source:npm"}],"first_seen":"2026-10-17"},"drafted_with_ai":true,"contributors":["actor:jrosskopf"]},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"good","evidence":"2 months since release"},{"label":"Continuity","tier":"fair","evidence":"1 contributor, 1 publisher, org-owned"},{"label":"Repository","tier":"good","evidence":"pushed 2026-09, not archived"}],"compatibility":[{"label":"Declared for","tier":"fair","evidence":"nothing declared"},{"label":"Survived majors","tier":"unknown","evidence":"not read on ABAP: its lines run side by side"},{"label":"Maintainer's CI","tier":"fair","evidence":"no CI configured"}],"practice":[{"label":"Tests","tier":"good","evidence":"npm test"},{"label":"Docs","tier":"good","evidence":"docs site, README 4 KB"},{"label":"Changelog","tier":"good","evidence":"CHANGELOG in the repo"}],"reach":[{"value":2,"unit":"installs/week"},{"value":0,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-26","latest_version":"2026.9.8","majors":{"2026":{"version":"2026.9.5","date":"2026-09-05"}},"license":"BUSL-1.1","first_release":"2026-09-05","last_release":"2026-09-05","releases":4,"cadence_days":0,"maintainers":1,"repository":"git+https://github.com/DataZooDE/erpl-node-rfc-issues.git","repository_directory":null,"peer_cds":null,"dependencies":2,"node_engine":"^18 || >= 20","test_script":true,"types":true,"downloads_weekly":2,"downloads_monthly":29,"stars":0,"forks":0,"open_issues":0,"archived":false,"pushed_at":"2026-09-05","license_spdx":null,"org_owned":true,"default_branch":"main","created_at":"2026-09-05T05:41:16Z","open_prs":0,"tree_truncated":false,"test_files":0,"workflows":0,"other_ci":false,"readme_bytes":4169,"docs_files":0,"changelog":true,"license_file":true,"dts_files":0,"first_commit":"2026-09-05","last_commit":"2026-09-05","commits":1,"contributors":1,"readme_path":"README.md","readme_sha":"78c865f05efdfcc78ba7d16351f21aecb35a6965","months_since_release":2,"dormant":false,"repo_read":"2026-10-26"},"release_notes":{"license":"BUSL-1.1","quotable":true,"source":{"kind":"repo","path":"CHANGELOG.md","ref":"main","url":"https://github.com/DataZooDE/erpl-node-rfc-issues/blob/main/CHANGELOG.md"},"format":"headings","releases":[{"version":"2026.9.8","date":"2026-09-05","date_source":"registry","heading":"2026.9.8","url":"https://github.com/DataZooDE/erpl-node-rfc-issues/blob/main/CHANGELOG.md#202698","sections":[],"hash":"fc296cb9f55a8427"},{"version":"2026.9.7","date":"2026-09-05","date_source":"registry","heading":"2026.9.7","url":"https://github.com/DataZooDE/erpl-node-rfc-issues/blob/main/CHANGELOG.md#202697","sections":[],"hash":"437a88cfe7901d75"},{"version":"2026.9.6","date":"2026-09-05","date_source":"registry","heading":"2026.9.6","url":"https://github.com/DataZooDE/erpl-node-rfc-issues/blob/main/CHANGELOG.md#202696","sections":[],"hash":"ee14c2d363626254"},{"version":"2026.9.5","date":"2026-09-05","date_source":"registry","heading":"2026.9.5","url":"https://github.com/DataZooDE/erpl-node-rfc-issues/blob/main/CHANGELOG.md#202695","sections":[{"kind":"other","heading":"The ABAP error taxonomy, settled by measurement","items":4},{"kind":"other","heading":"Settled before the release","items":2},{"kind":"other","heading":"The packaging was not what the plan specified","items":4},{"kind":"other","heading":"ping() reports false as well as the error","items":0},{"kind":"other","heading":"Two that this system cannot decide","items":2},{"kind":"other","heading":"Known gap: two metadata round trips per first call, and the lead on it","items":0},{"kind":"other","heading":"cancel(), and the per-call timeout","items":0},{"kind":"other","heading":"A metadata lookup is a call, and is counted","items":0},{"kind":"other","heading":"client.release()","items":0},{"kind":"other","heading":"Errors are plain objects, as the reference's are","items":0},{"kind":"other","heading":"Green","items":0},{"kind":"other","heading":"Two defects the suite found that nothing else would have","items":0},{"kind":"other","heading":"The work now runs off the event loop","items":2},{"kind":"dependencies","heading":"Known: the callback spec is order-dependent","items":0},{"kind":"other","heading":"Pool and Throughput","items":0},{"kind":"other","heading":"What is built","items":7},{"kind":"other","heading":"Server","items":0},{"kind":"other","heading":"The differential: no differences","items":0},{"kind":"other","heading":"Packaging","items":0},{"kind":"other","heading":"Values are encoded against the declared type, not guessed from the value","items":0},{"kind":"other","heading":"Wrong type, out of range, and unconvertible are three different things","items":3},{"kind":"other","heading":"Integer width, and the shape of a type error","items":0},{"kind":"other","heading":"A name the interface does not declare","items":0},{"kind":"other","heading":"A Throughput counts the caller's calls, not the library's","items":0},{"kind":"other","heading":"What the remaining red actually is","items":2},{"kind":"fix","heading":"Two fixtures the reference's suite needs and a4h does not have","items":0},{"kind":"fix","heading":"The ABAP error taxonomy, and a fix in erpl-proto","items":0},{"kind":"other","heading":"What is next, in order","items":0}],"hash":"7815641d0e3394a7"}],"versions":[{"version":"2026.9.8","date":"2026-09-05"},{"version":"2026.9.7","date":"2026-09-05"},{"version":"2026.9.6","date":"2026-09-05"},{"version":"2026.9.5","date":"2026-09-05"}],"crawled_at":"2026-10-25"},"edges":{"maintainers":[{"ref":"actor:datazoode","name":"DataZoo GmbH","json":"/actors/datazoode.json"}],"contributors":[{"ref":"actor:jrosskopf","name":"Joachim Rosskopf","json":"/actors/jrosskopf.json"}],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}