{"_id":"@artnet-bridge/artnet","name":"@artnet-bridge/artnet","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"@artnet-bridge/artnet","version":"0.0.1","type":"module","description":"ArtNet protocol implementation for ArtNet Bridge","main":"dist/esm/index.js","scripts":{"clean":"artnet-build clean","build":"artnet-build","build-clean":"artnet-build --clean"},"engines":{"node":">=22.13.0"},"repository":{"type":"git","url":"git+https://github.com/Apollon77/artnet-bridge.git"},"author":{"name":"Ingo Fischer"},"license":"MIT","bugs":{"url":"https://github.com/Apollon77/artnet-bridge/issues"},"homepage":"https://github.com/Apollon77/artnet-bridge","devDependencies":{"@types/node":"^22.0.0"},"publishConfig":{"access":"public"},"_id":"@artnet-bridge/artnet@0.0.1","gitHead":"f385fba87fe9fc24f47490ac6c0e0fbe5dff9e8c","types":"./dist/esm/index.d.ts","_nodeVersion":"22.18.0","_npmVersion":"10.9.3","dist":{"integrity":"sha512-FU0DMsWp1nMKLH2nPNIl4ZBrlIgtE55ufADTLyX/vwK3mztELSNFxJ/oSzGyILBiS/37h1N776x4DWJMKv1BTw==","shasum":"e9c35a406d97298a307c9411eee8f20df11858a1","tarball":"https://registry.npmjs.org/@artnet-bridge/artnet/-/artnet-0.0.1.tgz","fileCount":30,"unpackedSize":67052,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDM/XyNx6jo025oyy6Ur2FfeDGH3Fe3SRmJI055uZZPNAiEAnzF3ksDblysQSPl89RTuCnEoYA0YpEr0czO86Yj9JoU="}]},"_npmUser":{"name":"apollon77","email":"github@fischer-ka.de"},"directories":{},"maintainers":[{"name":"apollon77","email":"github@fischer-ka.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/artnet_0.0.1_1774812247182_0.5780206253892362"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-29T19:24:07.072Z","0.0.1":"2026-03-29T19:24:07.320Z","modified":"2026-03-29T19:24:07.597Z"},"maintainers":[{"name":"apollon77","email":"github@fischer-ka.de"}],"description":"ArtNet protocol implementation for ArtNet Bridge","homepage":"https://github.com/Apollon77/artnet-bridge","repository":{"type":"git","url":"git+https://github.com/Apollon77/artnet-bridge.git"},"author":{"name":"Ingo Fischer"},"bugs":{"url":"https://github.com/Apollon77/artnet-bridge/issues"},"license":"MIT","readme":"# @artnet-bridge/artnet\n\nArt-Net protocol implementation for Node.js. Zero external dependencies -- uses only `node:dgram`.\n\n## What This Package Does\n\nImplements the Art-Net protocol for sending and receiving DMX data over UDP. Supports the core opcodes needed for DMX bridging:\n\n- `OpOutput` (0x5000) -- DMX data\n- `OpPoll` (0x2000) -- discovery poll\n- `OpPollReply` (0x2100) -- reply to polls\n\nPacket formats follow the Art-Net specification (reference PDF at `docs/art-net.pdf`).\n\n## ArtNetReceiver\n\nListens for Art-Net UDP packets and emits typed events.\n\n```typescript\nimport { ArtNetReceiver } from \"@artnet-bridge/artnet\";\n\nconst receiver = new ArtNetReceiver({\n  bindAddress: \"0.0.0.0\",  // default\n  port: 6454,              // default (Art-Net standard port)\n});\n\nreceiver.on(\"dmx\", (universe, data) => {\n  // universe: 0-based universe number\n  // data: Uint8Array of up to 512 DMX channel values\n  console.log(`Universe ${universe}: channel 1 = ${data[0]}`);\n});\n\nreceiver.on(\"poll\", (info) => {\n  console.log(`Poll from ${info.address}:${info.port}`);\n});\n\nreceiver.on(\"error\", (err) => {\n  console.error(\"Receiver error:\", err);\n});\n\nawait receiver.start();\n\n// Later:\nawait receiver.stop();\n```\n\n### Events\n\n| Event | Arguments | Description |\n|-------|-----------|-------------|\n| `dmx` | `(universe: number, data: Uint8Array)` | DMX data received |\n| `poll` | `(info: { address, port })` | ArtPoll received |\n| `packet` | `(packet: ArtNetPacket, rinfo)` | Any valid Art-Net packet |\n| `error` | `(error: Error)` | Socket error |\n\n## ArtNetSender\n\nSends Art-Net UDP packets. Useful both as a production component and as a test simulator.\n\n```typescript\nimport { ArtNetSender } from \"@artnet-bridge/artnet\";\n\nconst sender = new ArtNetSender({\n  targetAddress: \"255.255.255.255\",  // default (broadcast)\n  port: 6454,                        // default\n});\n\n// Send DMX data\nconst dmxData = new Uint8Array(512);\ndmxData[0] = 255;  // Channel 1 = full\ndmxData[1] = 128;  // Channel 2 = half\nsender.sendDmx(0, dmxData);  // universe 0\n\n// Send a poll\nsender.sendPoll();\n\n// Clean up\nsender.close();\n```\n\n### API\n\n| Method | Description |\n|--------|-------------|\n| `sendDmx(universe, data, sequence?)` | Send an OpOutput packet. Sequence 0 = disabled. |\n| `sendPoll()` | Send an OpPoll packet |\n| `close()` | Close the UDP socket |\n\n## Low-Level Packet Functions\n\nFor direct packet construction and parsing:\n\n```typescript\nimport {\n  parsePacket,\n  serializeDmxPacket,\n  serializePollPacket,\n  serializePollReplyPacket,\n} from \"@artnet-bridge/artnet\";\n```\n\n## Partial DMX Frames\n\nArtNet controllers can send partial DMX frames containing anywhere from 2 to 512 channels. The bridge accumulates partial frames per universe -- channels not included in the current frame retain their previous values. This supports both full-frame controllers (always 512 channels) and optimized controllers that only send changed channels.\n\n## Protocol Compliance\n\n- Art-Net header validation (\"Art-Net\\0\")\n- Protocol version field (14)\n- 15-bit Port-Address for universe numbering\n- DMX data length: 2-512 bytes, even-padded per spec\n\n## Usage as Test Simulator\n\n`ArtNetSender` works as a standalone DMX simulator for testing. Point it at localhost or a specific IP to feed test data into an `ArtNetReceiver`:\n\n```typescript\nconst sender = new ArtNetSender({ targetAddress: \"127.0.0.1\" });\nconst data = new Uint8Array(512);\n\n// Ramp channel 1 from 0 to 255\nfor (let i = 0; i <= 255; i++) {\n  data[0] = i;\n  sender.sendDmx(0, data);\n  await new Promise(resolve => setTimeout(resolve, 20));\n}\n\nsender.close();\n```\n","readmeFilename":"README.md","_rev":"1-cc4682ab25a9bef45dfde7186e3b4de5"}