{"_id":"@emdzej/ediabasx-server","_rev":"6-23851ab32c042d93104b156537a53acc","name":"@emdzej/ediabasx-server","dist-tags":{"latest":"0.8.0"},"versions":{"0.6.0":{"name":"@emdzej/ediabasx-server","version":"0.6.0","_id":"@emdzej/ediabasx-server@0.6.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ediabasx#readme","bugs":{"url":"https://github.com/emdzej/ediabasx/issues"},"dist":{"shasum":"b28ee68119ae987cde378d582305ba8c75f28c3d","tarball":"https://registry.npmjs.org/@emdzej/ediabasx-server/-/ediabasx-server-0.6.0.tgz","fileCount":11,"integrity":"sha512-1f/P2P1L2HlPY1Fanlz3TJEkdranTdcGWcWiozfm7xZBlzJPNjeixBl8CKQ8M0VFZDWKL2UYqu7IC2L2EKga8A==","signatures":[{"sig":"MEYCIQD5acNFgd+Ytcfzmh1aZEVFYRICZ4I16mG2BMXRrd61HgIhAK4iOD079DHBKQ+DQkpJ6iEcjv0kgvwJHDzE0EpN8tO1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":60478},"main":"dist/index.js","type":"module","_from":"file:emdzej-ediabasx-server-0.6.0.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc -p tsconfig.json -w --preserveWatchOutput","lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/2145f7bfd08a28b0b3f4c1ee17d6f08d/emdzej-ediabasx-server-0.6.0.tgz","_integrity":"sha512-1f/P2P1L2HlPY1Fanlz3TJEkdranTdcGWcWiozfm7xZBlzJPNjeixBl8CKQ8M0VFZDWKL2UYqu7IC2L2EKga8A==","repository":{"url":"git+https://github.com/emdzej/ediabasx.git","type":"git"},"_npmVersion":"11.16.0","description":"EdiabasX JSON-RPC server — run diagnostic jobs remotely over TCP or WebSocket.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","@emdzej/ediabasx-core":"0.6.0","@emdzej/bimmerz-logger":"^0.1.2","@emdzej/ediabasx-ediabas":"0.6.0","@emdzej/ediabasx-interfaces":"0.6.0","@emdzej/ediabasx-best-parser":"0.6.0","@emdzej/ediabasx-host-config":"0.6.0","@emdzej/ediabasx-interface-base":"0.6.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/ws":"^8.5.0","@types/node":"^22.13.5"},"_npmOperationalInternal":{"tmp":"tmp/ediabasx-server_0.6.0_1780499529729_0.636945258163232","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@emdzej/ediabasx-server","version":"0.6.1","_id":"@emdzej/ediabasx-server@0.6.1","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ediabasx#readme","bugs":{"url":"https://github.com/emdzej/ediabasx/issues"},"dist":{"shasum":"98939c97d785761abb1ee35233cd7a77c1b734ab","tarball":"https://registry.npmjs.org/@emdzej/ediabasx-server/-/ediabasx-server-0.6.1.tgz","fileCount":11,"integrity":"sha512-awYwnWzsrY9cTT2Oe3HMqpUZGmbpYpaBF9JMEsHD9YZc42D+CT5J2ggMWp/LdFlgd0LisLIsCbxdIRHgp9TCyQ==","signatures":[{"sig":"MEUCIQCC9/jJywjDVl5XZcqg84xnmku3O6xt+S17mUm8UJT3cgIgVxXT/nrLFGPPXgWvnmEtgU5q9hTk7O1LmRbuXBXjya0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":68275},"main":"dist/index.js","type":"module","_from":"file:emdzej-ediabasx-server-0.6.1.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc -p tsconfig.json -w --preserveWatchOutput","lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/49ce4a17d530ce51a81412694f3c4579/emdzej-ediabasx-server-0.6.1.tgz","_integrity":"sha512-awYwnWzsrY9cTT2Oe3HMqpUZGmbpYpaBF9JMEsHD9YZc42D+CT5J2ggMWp/LdFlgd0LisLIsCbxdIRHgp9TCyQ==","repository":{"url":"git+https://github.com/emdzej/ediabasx.git","type":"git"},"_npmVersion":"11.16.0","description":"EdiabasX JSON-RPC server — run diagnostic jobs remotely over TCP or WebSocket.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","@emdzej/ediabasx-core":"0.6.1","@emdzej/bimmerz-logger":"^0.1.2","@emdzej/ediabasx-ediabas":"0.6.1","@emdzej/ediabasx-interfaces":"0.6.1","@emdzej/ediabasx-best-parser":"0.6.1","@emdzej/ediabasx-host-config":"0.6.1","@emdzej/ediabasx-interface-base":"0.6.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/ws":"^8.5.0","@types/node":"^22.13.5"},"_npmOperationalInternal":{"tmp":"tmp/ediabasx-server_0.6.1_1780604612861_0.017863786835719875","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@emdzej/ediabasx-server","version":"0.6.2","_id":"@emdzej/ediabasx-server@0.6.2","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ediabasx#readme","bugs":{"url":"https://github.com/emdzej/ediabasx/issues"},"dist":{"shasum":"dfbb68968ea2d46f78608b6fddc45d72dcc6315f","tarball":"https://registry.npmjs.org/@emdzej/ediabasx-server/-/ediabasx-server-0.6.2.tgz","fileCount":11,"integrity":"sha512-iEG96C7xuX9CLjbbNqxtKkuAEiG4RhM+W8Ta7kRPKgjE/sC54IimoaODOOLNo80KDuZT8wBKUEwHNphh9bBOag==","signatures":[{"sig":"MEYCIQCyY4hFoiBDllkK8l2FhOBuDkIuZl/2ZvAHQ0GuM6HNgQIhAOt3/SFGwtV/Q98isuS2nmaePaUY9XjdzufPOqFRBih4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69586},"main":"dist/index.js","type":"module","_from":"file:emdzej-ediabasx-server-0.6.2.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc -p tsconfig.json -w --preserveWatchOutput","lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/022a5a1950470881dd860f65724e4dd1/emdzej-ediabasx-server-0.6.2.tgz","_integrity":"sha512-iEG96C7xuX9CLjbbNqxtKkuAEiG4RhM+W8Ta7kRPKgjE/sC54IimoaODOOLNo80KDuZT8wBKUEwHNphh9bBOag==","repository":{"url":"git+https://github.com/emdzej/ediabasx.git","type":"git"},"_npmVersion":"11.16.0","description":"EdiabasX JSON-RPC server — run diagnostic jobs remotely over TCP or WebSocket.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","@emdzej/ediabasx-core":"0.6.2","@emdzej/bimmerz-logger":"^0.1.2","@emdzej/ediabasx-ediabas":"0.6.2","@emdzej/ediabasx-interfaces":"0.6.2","@emdzej/ediabasx-best-parser":"0.6.2","@emdzej/ediabasx-host-config":"0.6.2","@emdzej/ediabasx-interface-base":"0.6.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/ws":"^8.5.0","@types/node":"^22.13.5"},"_npmOperationalInternal":{"tmp":"tmp/ediabasx-server_0.6.2_1780649494423_0.11300992636459406","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@emdzej/ediabasx-server","version":"0.7.0","_id":"@emdzej/ediabasx-server@0.7.0","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ediabasx#readme","bugs":{"url":"https://github.com/emdzej/ediabasx/issues"},"dist":{"shasum":"5f15d205186a7399bb59d12e07e93df0b9ded510","tarball":"https://registry.npmjs.org/@emdzej/ediabasx-server/-/ediabasx-server-0.7.0.tgz","fileCount":11,"integrity":"sha512-aN3vnPIbPuM9B8o1BBxaeGN2FQHx44sZ/rnAm92XjM2jMOpg17w6GvAEoqRZv7hxLbW95spdAEheWnjNZdOZqw==","signatures":[{"sig":"MEYCIQDzEZ+71Z/a4XHQFfpmlfHjjGYBA+2m0gzOuld1igpUTgIhALDqzVvijna2Imqm0YHiQAhRIwbDZsNNAfguU+STUT7/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":69586},"main":"dist/index.js","type":"module","_from":"file:emdzej-ediabasx-server-0.7.0.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc -p tsconfig.json -w --preserveWatchOutput","lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/7e3d904a231b7b38a79703d215b2e366/emdzej-ediabasx-server-0.7.0.tgz","_integrity":"sha512-aN3vnPIbPuM9B8o1BBxaeGN2FQHx44sZ/rnAm92XjM2jMOpg17w6GvAEoqRZv7hxLbW95spdAEheWnjNZdOZqw==","repository":{"url":"git+https://github.com/emdzej/ediabasx.git","type":"git"},"_npmVersion":"11.16.0","description":"EdiabasX JSON-RPC server — run diagnostic jobs remotely over TCP or WebSocket.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","@emdzej/ediabasx-core":"0.7.0","@emdzej/bimmerz-logger":"^0.1.2","@emdzej/ediabasx-ediabas":"0.7.0","@emdzej/ediabasx-interfaces":"0.7.0","@emdzej/ediabasx-best-parser":"0.7.0","@emdzej/ediabasx-host-config":"0.7.0","@emdzej/ediabasx-interface-base":"0.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/ws":"^8.5.0","@types/node":"^22.13.5"},"_npmOperationalInternal":{"tmp":"tmp/ediabasx-server_0.7.0_1780655270998_0.2809849316400459","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@emdzej/ediabasx-server","version":"0.7.1","_id":"@emdzej/ediabasx-server@0.7.1","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"homepage":"https://github.com/emdzej/ediabasx#readme","bugs":{"url":"https://github.com/emdzej/ediabasx/issues"},"dist":{"shasum":"d90280341f0a913bf0ef9baa89a64e67b4aed01d","tarball":"https://registry.npmjs.org/@emdzej/ediabasx-server/-/ediabasx-server-0.7.1.tgz","fileCount":15,"integrity":"sha512-6ynMnlAIRlNzAKuYoB1wqN2uDr/nqEi3DXS1R+zGdLvXKu3iqnjQ4w4Mem0NwCNIm+AC4Q+0OhGPoy7aNDjnsw==","signatures":[{"sig":"MEUCIFo/PJK3gpE9dPCLx+4q+l1n87dqOp/5oizO7UtQZSx4AiEAutMIQN5PMyXZabFwMOD7C5lq/SeMlAZpChM5uyXnRVw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77645},"main":"dist/index.js","type":"module","_from":"file:emdzej-ediabasx-server-0.7.1.tgz","types":"dist/index.d.ts","scripts":{"dev":"tsc -p tsconfig.json -w --preserveWatchOutput","lint":"eslint .","test":"vitest run --passWithNoTests","build":"tsc -p tsconfig.json","typecheck":"tsc --noEmit"},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/d37aeda67d2505ef924a96a41b35bfbf/emdzej-ediabasx-server-0.7.1.tgz","_integrity":"sha512-6ynMnlAIRlNzAKuYoB1wqN2uDr/nqEi3DXS1R+zGdLvXKu3iqnjQ4w4Mem0NwCNIm+AC4Q+0OhGPoy7aNDjnsw==","repository":{"url":"git+https://github.com/emdzej/ediabasx.git","type":"git"},"_npmVersion":"11.16.0","description":"EdiabasX JSON-RPC server — run diagnostic jobs remotely over TCP or WebSocket.","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^8.18.0","@emdzej/ediabasx-core":"0.7.1","@emdzej/bimmerz-logger":"^0.1.2","@emdzej/ediabasx-ediabas":"0.7.1","@emdzej/ediabasx-interfaces":"0.7.1","@emdzej/ediabasx-best-parser":"0.7.1","@emdzej/ediabasx-host-config":"0.7.1","@emdzej/ediabasx-interface-base":"0.7.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"@types/ws":"^8.5.0","@types/node":"^22.13.5"},"_npmOperationalInternal":{"tmp":"tmp/ediabasx-server_0.7.1_1780679494081_0.17268109643538554","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@emdzej/ediabasx-server","version":"0.8.0","description":"EdiabasX JSON-RPC server — run diagnostic jobs remotely over TCP or WebSocket.","type":"module","main":"dist/index.js","types":"dist/index.d.ts","dependencies":{"@emdzej/bimmerz-logger":"^0.1.2","ws":"^8.18.0","@emdzej/ediabasx-core":"0.8.0","@emdzej/ediabasx-best-parser":"0.8.0","@emdzej/ediabasx-host-config":"0.8.0","@emdzej/ediabasx-ediabas":"0.8.0","@emdzej/ediabasx-interface-base":"0.8.0","@emdzej/ediabasx-interfaces":"0.8.0"},"devDependencies":{"@types/node":"^22.13.5","@types/ws":"^8.5.0"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/emdzej/ediabasx.git"},"scripts":{"build":"tsc -p tsconfig.json","test":"vitest run --passWithNoTests","lint":"eslint .","typecheck":"tsc --noEmit","dev":"tsc -p tsconfig.json -w --preserveWatchOutput"},"_id":"@emdzej/ediabasx-server@0.8.0","bugs":{"url":"https://github.com/emdzej/ediabasx/issues"},"homepage":"https://github.com/emdzej/ediabasx#readme","_integrity":"sha512-XyOsVMbnTUfBeAQ9N/6wzJ9o8d39djISL30JvN9Hq/oTanuo8Fjunpk5pbOOHsbWnefcfhBgtJU3NfF+T3NKeQ==","_resolved":"/private/var/folders/7h/x_w_580x4s9dq3sq11tpvzkwy3nbj8/T/49dd16f8bd8e3725d7d0aa0c8823980e/emdzej-ediabasx-server-0.8.0.tgz","_from":"file:emdzej-ediabasx-server-0.8.0.tgz","_nodeVersion":"22.22.1","_npmVersion":"11.16.0","dist":{"integrity":"sha512-XyOsVMbnTUfBeAQ9N/6wzJ9o8d39djISL30JvN9Hq/oTanuo8Fjunpk5pbOOHsbWnefcfhBgtJU3NfF+T3NKeQ==","shasum":"26ac6113dc4aa882b4f863624a428ada9a505351","tarball":"https://registry.npmjs.org/@emdzej/ediabasx-server/-/ediabasx-server-0.8.0.tgz","fileCount":15,"unpackedSize":77645,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDjDlwAxqKCQ3g2q+uO55n7J6V2wH5kl5pbtMOxkdawPQIhALjGo1PSgGyz7EMSK2iIFY42lkJDaGYehA1u4BpjaHOS"}]},"_npmUser":{"name":"emdzej","email":"michal@jaskolski.pro"},"directories":{},"maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ediabasx-server_0.8.0_1783328621413_0.5982877634630765"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-03T15:12:09.605Z","modified":"2026-07-06T09:03:41.643Z","0.6.0":"2026-06-03T15:12:09.856Z","0.6.1":"2026-06-04T20:23:33.051Z","0.6.2":"2026-06-05T08:51:34.690Z","0.7.0":"2026-06-05T10:27:51.179Z","0.7.1":"2026-06-05T17:11:34.242Z","0.8.0":"2026-07-06T09:03:41.549Z"},"bugs":{"url":"https://github.com/emdzej/ediabasx/issues"},"homepage":"https://github.com/emdzej/ediabasx#readme","repository":{"type":"git","url":"git+https://github.com/emdzej/ediabasx.git"},"description":"EdiabasX JSON-RPC server — run diagnostic jobs remotely over TCP or WebSocket.","maintainers":[{"name":"emdzej","email":"michal@jaskolski.pro"}],"readme":"# @emdzej/ediabasx-server\n\nJSON-RPC server for [EdiabasX](https://github.com/emdzej/ediabasx) — run diagnostic jobs remotely over TCP or WebSocket. One machine owns the cable and the SGBD files; clients connect and execute jobs via the `IEdiabas` contract.\n\n## Install\n\n```bash\npnpm add @emdzej/ediabasx-server\n```\n\n## Usage\n\n```ts\nimport { EdiabasServer } from \"@emdzej/ediabasx-server\";\nimport { createInterface } from \"@emdzej/ediabasx-interfaces\";\n\nconst iface = createInterface(\"kdcan\", {\n  port: \"/dev/cu.usbserial-A50285BI\",\n  baudRate: 9600,\n});\n\nconst server = new EdiabasServer({\n  sgbdPath: \"/path/to/ecu/files\",\n  interface: iface,\n  port: 6802,\n  transport: \"websocket\", // or \"tcp\"\n});\n\nawait server.start();\n```\n\n## JSON-RPC methods\n\nAll requests follow [JSON-RPC 2.0](https://www.jsonrpc.org/specification). Requests without an `id` are treated as notifications (fire-and-forget).\n\n| Method | Params | Returns | Purpose |\n|---|---|---|---|\n| `init` | — | `{ ok: true }` | Ensure the shared Ediabas's transport is connected. **Idempotent** — does not replace the persistent Ediabas instance the server owns; just primes per-client state for the next job. |\n| `end` | — | `{ ok: true }` | Clear per-client cached results. **Does not** disconnect the shared Ediabas (other clients may still be using it). The transport is torn down only via `server.stop()`. |\n| `job` | `{ ecu, job, params? }` | `{ sets: EdiabasResultSet[] }` | Execute a job — resolves bare ECU names via `sgbdPath`. `sets[0]` is the system set; `sets[1..N]` are data sets. See [Result-set shape](#result-set-shape) below. |\n| `resultSets` | — | `{ count }` | Number of **data** sets from the last job (excludes the system set at index 0). Matches `apiResultSets`. |\n| `resultText` | `{ name, set }` | `{ value }` | Read a text result. `set=0` reads the system set; `set>=1` reads data set N. |\n| `resultInt` | `{ name, set }` | `{ value }` | Same indexing as `resultText`. |\n| `resultReal` | `{ name, set }` | `{ value }` | Same indexing as `resultText`. |\n| `resultBinary` | `{ name, set }` | `{ value: number[] }` | Same indexing as `resultText`. |\n| `resultFormat` | `{ name, set }` | `{ format }` | Same indexing as `resultText`. |\n| `state` | — | `{ state }` | Current server state (`ready` / `busy` / `error` / `break`) |\n| `break` | — | `{ ok: true }` | Signal a break |\n| `errorCode` | — | `{ code }` | Last error code |\n| `errorText` | — | `{ text }` | Last error message |\n| `info` | — | connection / server metadata | Server and connection status |\n\nThe `job` method is the primary entry point — it resolves the ECU name, loads the SGBD (skipped if the same ECU is targeted by consecutive jobs — INITIALISIERUNG and IDENT/swap state stays warm across calls), executes the job, and returns all result sets in one response. The granular `resultText` / `resultInt` / etc. accessors operate on the cached results from the last `job` call, matching the native EDIABAS C API pattern.\n\n### Result-set shape\n\n`job` returns `{ sets: EdiabasResultSet[] }` where `sets` follows the native EDIABAS C-API convention (also used by `Ediabas.executeJob` and mirrored in C# `EdiabasNet._resultSets`):\n\n- **`sets[0]` — system set.** Always present. Contains `VARIANTE`, `OBJECT`, `JOBNAME`, `SAETZE` (data-set count) plus the persistent system-results accumulator (`ECU`, `ORIGIN`, `REVISION`, `AUTHOR`, `COMMENT`, `PACKAGE`, `SPRACHE`, `JOB_STATUS`, …). Materialised fresh per job.\n- **`sets[1..N]` — data sets.** One per `enewset` plus the trailing batch (whatever the job emitted after the last `enewset`). Multi-record jobs (e.g. `FS_LESEN`) emit one set per record.\n\nEach `EdiabasResultEntry` carries `name`, `type`, `value` and optional `unit` / `comment` — all preserved on the wire.\n\n### Single-Ediabas-per-server lifecycle\n\nThe server holds **one** `Ediabas` instance for its lifetime — lazily created on the first `init`, never replaced. Multiple clients connecting do **not** trigger transport teardown / re-INITIALISIERUNG / variant-swap re-runs. Subsequent jobs against the same ECU also skip a redundant `loadSgbd`, preserving the cached `initialized` / `identRan` / `systemResults` state. The transport is closed only when the server itself stops.\n\n## Transports\n\n- **`websocket`** (default) — one JSON-RPC message per WebSocket frame. Works from browsers and Node 22+.\n- **`tcp`** — newline-delimited JSON-RPC over raw TCP. Node-only, lowest overhead.\n\n## CLI\n\n```bash\n# Start the server\nediabasx serve --sgbd-path ~/ECU \\\n  --interface kdcan --serial-port /dev/cu.usbserial-A50285BI\n\n# With Bimmerz Connect relay (NAT traversal, no port forwarding)\nediabasx serve --connect \\\n  --sgbd-path ~/ECU --interface kdcan --serial-port /dev/cu.usbserial-A50285BI\n\n# Interactive server config wizard\nediabasx serve configure\n```\n\n## Bimmerz Connect (relay)\n\n`attachStandardWebSocket(ws)` accepts a pre-connected standard `WebSocket` — used by the CLI's `--connect` flag to tunnel JSON-RPC through the `connect.bimmerz.app` relay. In relay-only mode (no `--host`/`--port`), call `ensureBroadcastSink()` and `bindSignalHandlers()` directly instead of `start()`.\n\n```ts\nimport { accept } from \"@emdzej/swsrs-client\";\n\nconst peer = await accept({ relayURL, sessionId, token });\nserver.attachStandardWebSocket(peer.socket);\nserver.ensureBroadcastSink();\nserver.bindSignalHandlers();\n```\n\n## Architecture\n\nThe server is single-tenant: one active session at a time, matching the physical bus reality. Requests are queued sequentially via an internal promise chain — no concurrent job execution. The shared `Ediabas` instance is created on first `init` and lives for the server's lifetime (see [Single-Ediabas-per-server lifecycle](#single-ediabas-per-server-lifecycle)).\n\n## See also\n\n- [`@emdzej/ediabasx-client`](../ediabasx-client) — remote and in-process `IEdiabas` implementations.\n- [`@emdzej/ediabasx-core`](../core) — shared `IEdiabas` interface and wire types.\n- [`@emdzej/ediabasx-interfaces`](../interfaces) — the lower-level gateway (raw interface forwarding, no SGBD layer).\n\n## License\n\n[PolyForm Noncommercial 1.0.0](../../LICENSE).\n","readmeFilename":"README.md"}