{"_id":"@bitfocusas/calrec-cscp","_rev":"8-64edbb1d0b6d9f56c843ae8d9a7129cb","name":"@bitfocusas/calrec-cscp","dist-tags":{"latest":"1.3.3"},"versions":{"1.2.1":{"name":"@bitfocusas/calrec-cscp","version":"1.2.1","keywords":[],"author":{"name":"Bitfocus AS","email":"william@bitfocus.io"},"license":"MIT","_id":"@bitfocusas/calrec-cscp@1.2.1","maintainers":[{"name":"willosof","email":"william.viker@gmail.com"},{"name":"haakon","email":"haakon.nessjoen@gmail.com"}],"dist":{"shasum":"d7f67dce5813984e110c0a184b340e61bdf36077","tarball":"https://registry.npmjs.org/@bitfocusas/calrec-cscp/-/calrec-cscp-1.2.1.tgz","fileCount":45,"integrity":"sha512-QAA9MhfvhvCpt8P6VkTDRj7606FcuUzXpmlfcsG6VmtZCgYRFVz8icUcb0hif6aa+Ml24HJfbDKDFWQ1yTn6Ng==","signatures":[{"sig":"MEQCIB2BJx2C2u7U8ukNM5y4YGFJkGTzvf5TiGoAkaoFBDLIAiBcEqNYmVd0nPEY3jNr+BgT9dR7RSbWW31bHCR+yKTnGg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":324466},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"1c979612c86833d088a1228a8d821088c8a8bbd4","scripts":{"dev":"tsc --watch","lint":"npx @biomejs/biome lint --write src/","test":"jest","build":"tsc","check":"npx @biomejs/biome check --write src/","format":"npx @biomejs/biome format --write src/","examples":"ts-node src/examples.ts","test:help":"echo 'Available test commands:' && echo '  npm test              - Run all tests (default output)' && echo '  npm run test:verbose   - Run tests with verbose output' && echo '  npm run test:pretty    - Run tests with verbose output and colors' && echo '  npm run test:watch     - Run tests in watch mode' && echo '  npm run test:watch:pretty - Run tests in watch mode with verbose output' && echo '  npm run test:coverage  - Run tests with coverage report' && echo '  npm run test:integration - Run only integration tests' && echo '  npm run test:unit      - Run only unit tests' && echo '  npm run test:no-integration - Run tests without integration tests' && echo '  npm run test:integration-only - Run only integration tests (requires console)'","test:unit":"jest converters.test.ts protocol.test.ts","test:watch":"jest --watch","test:pretty":"jest --verbose --colors --no-coverage","test:verbose":"jest --verbose","test:coverage":"jest --coverage","test:integration":"jest client.test.ts","test:watch:pretty":"jest --watch --verbose --colors","test:no-integration":"SKIP_INTEGRATION_TESTS=true jest","test:integration-only":"RUN_INTEGRATION_TESTS=true jest client.test.ts"},"_npmUser":{"name":"willosof","email":"william.viker@gmail.com"},"_npmVersion":"10.9.2","description":"A Node.js client for basic control and monitoring of Calrec consoles via the CSCP protocol","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ts-node":"^10.9.2","typescript":"^5.8.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.5","ts-jest":"^29.4.0","@types/jest":"^30.0.0","@biomejs/biome":"2.0.6"},"_npmOperationalInternal":{"tmp":"tmp/calrec-cscp_1.2.1_1753799367042_0.008491675604648696","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@bitfocusas/calrec-cscp","version":"1.2.3","keywords":[],"author":{"name":"Bitfocus AS","email":"william@bitfocus.io"},"license":"MIT","_id":"@bitfocusas/calrec-cscp@1.2.3","maintainers":[{"name":"willosof","email":"william.viker@gmail.com"},{"name":"haakon","email":"haakon.nessjoen@gmail.com"}],"dist":{"shasum":"1b34a7302f7765d88320c668b7e570ef16bf7aa9","tarball":"https://registry.npmjs.org/@bitfocusas/calrec-cscp/-/calrec-cscp-1.2.3.tgz","fileCount":45,"integrity":"sha512-UM1DbEzT1McFid8+kFNWofbwCHs88bxEtdNG+9n+o3pZ2CJ9CBy8/dfW8UW49qj5FXbVz4DM3rOXyISf5i9oBA==","signatures":[{"sig":"MEQCIDbszoZiokVcur2nO6D9yDr1BN3Qlt2PhKATVOCy6bafAiBrQHnpl43SEVaQlhnbQcx1XRioiSf2FLoFlXv6EEzgdw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":324564},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"ce7d2589aaec853406d1e8ca926dc9d4f58c2168","scripts":{"dev":"tsc --watch","lint":"npx @biomejs/biome lint --write src/","test":"jest","build":"tsc","check":"npx @biomejs/biome check --write src/","format":"npx @biomejs/biome format --write src/","examples":"ts-node src/examples.ts","test:help":"echo 'Available test commands:' && echo '  npm test              - Run all tests (default output)' && echo '  npm run test:verbose   - Run tests with verbose output' && echo '  npm run test:pretty    - Run tests with verbose output and colors' && echo '  npm run test:watch     - Run tests in watch mode' && echo '  npm run test:watch:pretty - Run tests in watch mode with verbose output' && echo '  npm run test:coverage  - Run tests with coverage report' && echo '  npm run test:integration - Run only integration tests' && echo '  npm run test:unit      - Run only unit tests' && echo '  npm run test:no-integration - Run tests without integration tests' && echo '  npm run test:integration-only - Run only integration tests (requires console)'","test:unit":"jest converters.test.ts protocol.test.ts","test:watch":"jest --watch","test:pretty":"jest --verbose --colors --no-coverage","test:verbose":"jest --verbose","test:coverage":"jest --coverage","test:integration":"jest client.test.ts","test:watch:pretty":"jest --watch --verbose --colors","test:no-integration":"SKIP_INTEGRATION_TESTS=true jest","test:integration-only":"RUN_INTEGRATION_TESTS=true jest client.test.ts"},"_npmUser":{"name":"willosof","email":"william.viker@gmail.com"},"_npmVersion":"10.9.7","description":"A Node.js client for basic control and monitoring of Calrec consoles via the CSCP protocol","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ts-node":"^10.9.2","typescript":"^5.8.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.5","ts-jest":"^29.4.0","@types/jest":"^30.0.0","@biomejs/biome":"2.0.6"},"_npmOperationalInternal":{"tmp":"tmp/calrec-cscp_1.2.3_1779880698841_0.49397346717881363","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@bitfocusas/calrec-cscp","version":"1.2.4","keywords":[],"author":{"name":"Bitfocus AS","email":"william@bitfocus.io"},"license":"MIT","_id":"@bitfocusas/calrec-cscp@1.2.4","maintainers":[{"name":"willosof","email":"william.viker@gmail.com"},{"name":"haakon","email":"haakon.nessjoen@gmail.com"}],"dist":{"shasum":"b4345c68eef5b95a6e16547540cefbb28620c484","tarball":"https://registry.npmjs.org/@bitfocusas/calrec-cscp/-/calrec-cscp-1.2.4.tgz","fileCount":46,"integrity":"sha512-kcAqYv7fU1ZWtYrbwEr+82k0iinB3FsIpXtrd9U5XCtdUcja5Whcc1BM6q0KEqWevbV3KGY/fAYAVvndQ4UsvQ==","signatures":[{"sig":"MEUCIQDh+I7uhpBhDObKbQ9kN+UaACdMfzryH3RNwzt9TMLBsAIgNZxZQtr+8afAMNXPdfkCywOQ1OjVI0TYDsFfcCCgmmo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":325633},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"0a3034acbfc11bca907f4b699f3c9e7f7332a4d5","scripts":{"dev":"tsc --watch","lint":"npx @biomejs/biome lint --write src/","test":"jest","build":"tsc","check":"npx @biomejs/biome check --write src/","format":"npx @biomejs/biome format --write src/","examples":"ts-node src/examples.ts","test:help":"echo 'Available test commands:' && echo '  npm test              - Run all tests (default output)' && echo '  npm run test:verbose   - Run tests with verbose output' && echo '  npm run test:pretty    - Run tests with verbose output and colors' && echo '  npm run test:watch     - Run tests in watch mode' && echo '  npm run test:watch:pretty - Run tests in watch mode with verbose output' && echo '  npm run test:coverage  - Run tests with coverage report' && echo '  npm run test:integration - Run only integration tests' && echo '  npm run test:unit      - Run only unit tests' && echo '  npm run test:no-integration - Run tests without integration tests' && echo '  npm run test:integration-only - Run only integration tests (requires console)'","test:unit":"jest converters.test.ts protocol.test.ts","test:watch":"jest --watch","test:pretty":"jest --verbose --colors --no-coverage","test:verbose":"jest --verbose","test:coverage":"jest --coverage","test:integration":"jest client.test.ts","test:watch:pretty":"jest --watch --verbose --colors","test:no-integration":"SKIP_INTEGRATION_TESTS=true jest","test:integration-only":"RUN_INTEGRATION_TESTS=true jest client.test.ts"},"_npmUser":{"name":"willosof","email":"william.viker@gmail.com"},"_npmVersion":"10.9.7","description":"A Node.js client for basic control and monitoring of Calrec consoles via the CSCP protocol","directories":{},"_nodeVersion":"22.22.2","dependencies":{"ts-node":"^10.9.2","typescript":"^5.8.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.5","ts-jest":"^29.4.0","@types/jest":"^30.0.0","@biomejs/biome":"2.0.6"},"_npmOperationalInternal":{"tmp":"tmp/calrec-cscp_1.2.4_1779891051663_0.9900873733065632","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bitfocusas/calrec-cscp","version":"1.3.0","keywords":[],"author":{"name":"Bitfocus AS","email":"william@bitfocus.io"},"license":"MIT","_id":"@bitfocusas/calrec-cscp@1.3.0","maintainers":[{"name":"willosof","email":"william.viker@gmail.com"},{"name":"bitfocus-sa","email":"sa@bitfocus.io"},{"name":"haakon","email":"haakon.nessjoen@gmail.com"},{"name":"bryce-seifert","email":"bryce.seifert@me.com"}],"homepage":"https://github.com/bitfocus/node-calrec-cscp#readme","bugs":{"url":"https://github.com/bitfocus/node-calrec-cscp/issues"},"dist":{"shasum":"8c9e5ab325bd5a8a4fe8079e23790f3f3fd04168","tarball":"https://registry.npmjs.org/@bitfocusas/calrec-cscp/-/calrec-cscp-1.3.0.tgz","fileCount":51,"integrity":"sha512-A3GoCqSe+R+CYnppt5xxNBRof/OyJUigi9eUYbFw+DWgz+HLbOIrDLQDtavsdZvN25t6tMVqbDCofjPSdq9Esw==","signatures":[{"sig":"MEUCIGotDlmvom6pYjGQ5BooE+fZjPQfHmR92EMlW8DLrLzGAiEA2mKhoJDbXSxiEH7XBlC5dBS21eypWrKPQeuTNOmTeLs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":388467},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"3d6ea9dcd804db1ca63ad2bb9d2a392c5a5af7d9","scripts":{"dev":"tsc --watch","lint":"npx @biomejs/biome lint --write src/","test":"jest","build":"tsc","check":"npx @biomejs/biome check --write src/","format":"npx @biomejs/biome format --write src/","examples":"ts-node src/examples.ts","test:help":"echo 'Available test commands:' && echo '  npm test              - Run all tests (default output)' && echo '  npm run test:verbose   - Run tests with verbose output' && echo '  npm run test:pretty    - Run tests with verbose output and colors' && echo '  npm run test:watch     - Run tests in watch mode' && echo '  npm run test:watch:pretty - Run tests in watch mode with verbose output' && echo '  npm run test:coverage  - Run tests with coverage report' && echo '  npm run test:integration - Run only integration tests' && echo '  npm run test:unit      - Run only unit tests' && echo '  npm run test:no-integration - Run tests without integration tests' && echo '  npm run test:integration-only - Run only integration tests (requires console)'","test:unit":"jest converters.test.ts protocol.test.ts","test:watch":"jest --watch","test:pretty":"jest --verbose --colors --no-coverage","test:verbose":"jest --verbose","test:coverage":"jest --coverage","test:integration":"jest client.test.ts","test:watch:pretty":"jest --watch --verbose --colors","test:no-integration":"SKIP_INTEGRATION_TESTS=true jest","test:integration-only":"RUN_INTEGRATION_TESTS=true jest client.test.ts"},"_npmUser":{"name":"bryce-seifert","email":"bryce.seifert@me.com"},"repository":{"url":"git+https://github.com/bitfocus/node-calrec-cscp.git","type":"git"},"_npmVersion":"11.19.0","description":"A Node.js client for basic control and monitoring of Calrec consoles via the CSCP protocol","directories":{},"_nodeVersion":"26.7.0","dependencies":{"ts-node":"^10.9.2","typescript":"^5.8.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.5","ts-jest":"^29.4.0","@types/jest":"^30.0.0","@biomejs/biome":"2.0.6"},"_npmOperationalInternal":{"tmp":"tmp/calrec-cscp_1.3.0_1787243111475_0.7498680001373905","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@bitfocusas/calrec-cscp","version":"1.3.2","keywords":[],"author":{"name":"Bitfocus AS","email":"william@bitfocus.io"},"license":"MIT","_id":"@bitfocusas/calrec-cscp@1.3.2","maintainers":[{"name":"willosof","email":"william.viker@gmail.com"},{"name":"bitfocus-sa","email":"sa@bitfocus.io"},{"name":"haakon","email":"haakon.nessjoen@gmail.com"},{"name":"bryce-seifert","email":"bryce.seifert@me.com"}],"homepage":"https://github.com/bitfocus/node-calrec-cscp#readme","bugs":{"url":"https://github.com/bitfocus/node-calrec-cscp/issues"},"dist":{"shasum":"f10a8f1a2175d8d6f49c5a38bc83866aac54496d","tarball":"https://registry.npmjs.org/@bitfocusas/calrec-cscp/-/calrec-cscp-1.3.2.tgz","fileCount":13,"integrity":"sha512-fgwhvFiwpYHaj1a/AMzxucYeqWNqC0Nx0wTwkeXc6gAwIyu57DAWxC4twS5+gVW5rdrWarK20Yu28mMAVv3Wqw==","signatures":[{"sig":"MEUCIEEqNZFWfLMS2jxuGASyB1LS651ZSrdF8RH8KkXqa7yyAiEA01HV/TAuXEhzSKmHb1bTO1lMC4HYHnYAaW30B7ypDww=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEgdt2sFlJgHS1okQT0LqY5whEVzQZPDsDunEtNY9k2aAiEA4RPFRS8geroV4Xgt6Y+XIMIyaofHP2g/AQz1ASNBVqs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":133680},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"a6e7ee25903f576ff9cc48b4c144431625e82e02","scripts":{"dev":"tsc -p tsconfig.build.json --watch","lint":"npx @biomejs/biome lint --write src/","test":"jest","build":"npm run clean && tsc -p tsconfig.build.json","check":"npx @biomejs/biome check --write src/","clean":"node --eval \"require('fs').rmSync('dist',{recursive:true,force:true})\"","format":"npx @biomejs/biome format --write src/","prepack":"npm run build","test:help":"echo 'Available test commands:' && echo '  npm test              - Run all tests (default output)' && echo '  npm run test:verbose   - Run tests with verbose output' && echo '  npm run test:pretty    - Run tests with verbose output and colors' && echo '  npm run test:watch     - Run tests in watch mode' && echo '  npm run test:watch:pretty - Run tests in watch mode with verbose output' && echo '  npm run test:coverage  - Run tests with coverage report' && echo '  npm run test:integration - Run only integration tests' && echo '  npm run test:unit      - Run only unit tests' && echo '  npm run test:no-integration - Run tests without integration tests' && echo '  npm run test:integration-only - Run only integration tests (requires console)'","test:unit":"jest converters.test.ts protocol.test.ts","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:pretty":"jest --verbose --colors --no-coverage","test:verbose":"jest --verbose","test:coverage":"jest --coverage","test:integration":"jest client.test.ts","test:watch:pretty":"jest --watch --verbose --colors","test:no-integration":"SKIP_INTEGRATION_TESTS=true jest","test:integration-only":"RUN_INTEGRATION_TESTS=true jest client.test.ts"},"_npmUser":{"name":"willosof","email":"william.viker@gmail.com"},"repository":{"url":"git+https://github.com/bitfocus/node-calrec-cscp.git","type":"git"},"_npmVersion":"10.9.7","description":"A Node.js client for basic control and monitoring of Calrec consoles via the CSCP protocol","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.5","ts-jest":"^29.4.0","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node":"^24.5.2","@biomejs/biome":"2.0.6"},"_npmOperationalInternal":{"tmp":"tmp/calrec-cscp_1.3.2_1790611077656_0.21134901205344758","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"_id":"@bitfocusas/calrec-cscp@1.3.3","bugs":{"url":"https://github.com/bitfocus/node-calrec-cscp/issues"},"dist":{"shasum":"98ac702258834fadb4b0c2c51f6f9a9614ad6795","tarball":"https://registry.npmjs.org/@bitfocusas/calrec-cscp/-/calrec-cscp-1.3.3.tgz","fileCount":13,"integrity":"sha512-BMdTY6gDk4Ttt9ERv9mKQdOMJmVMMMo6YTmrHqmo7Ak1NG2ETRnGwBaUpsTzJJ/yvk4zdtP5a0HtdPf1bkm8rg==","signatures":[{"sig":"MEUCIC4uK7ZrrvFnhKdO1endk0PJ3gDAVSId0R7ABdAXnTOIAiEAzf+baY4Eln03KTWTdadj6jJf5gwpG4spgBFyS9cPF5Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC2sGjFeUED6yIm3ui9gWf0kXbt9Eudv+LEADObDMIs7AIgebfc78C+c1w6DLPidEXhdiHjIyHSEJ5qqmn+AL1cQrs="}],"unpackedSize":133166},"main":"./dist/index.js","name":"@bitfocusas/calrec-cscp","types":"./dist/index.d.ts","author":{"name":"Bitfocus AS","email":"william@bitfocus.io"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"cc7b99312b8d0b0da47fe699c3fd58ce5a6ffb41","license":"MIT","scripts":{"dev":"tsc -p tsconfig.build.json --watch","lint":"npx @biomejs/biome lint --write src/","test":"jest","build":"npm run clean && tsc -p tsconfig.build.json","check":"npx @biomejs/biome check --write src/","clean":"node --eval \"require('fs').rmSync('dist',{recursive:true,force:true})\"","format":"npx @biomejs/biome format --write src/","prepack":"npm run build","test:help":"echo 'Available test commands:' && echo '  npm test              - Run all tests (default output)' && echo '  npm run test:verbose   - Run tests with verbose output' && echo '  npm run test:pretty    - Run tests with verbose output and colors' && echo '  npm run test:watch     - Run tests in watch mode' && echo '  npm run test:watch:pretty - Run tests in watch mode with verbose output' && echo '  npm run test:coverage  - Run tests with coverage report' && echo '  npm run test:integration - Run only integration tests' && echo '  npm run test:unit      - Run only unit tests' && echo '  npm run test:no-integration - Run tests without integration tests' && echo '  npm run test:integration-only - Run only integration tests (requires console)'","test:unit":"jest converters.test.ts protocol.test.ts","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:pretty":"jest --verbose --colors --no-coverage","test:verbose":"jest --verbose","test:coverage":"jest --coverage","test:integration":"jest client.test.ts","test:watch:pretty":"jest --watch --verbose --colors","test:no-integration":"SKIP_INTEGRATION_TESTS=true jest","test:integration-only":"RUN_INTEGRATION_TESTS=true jest client.test.ts"},"version":"1.3.3","_npmUser":{"name":"bryce-seifert","email":"bryce.seifert@me.com"},"homepage":"https://github.com/bitfocus/node-calrec-cscp#readme","keywords":[],"repository":{"url":"git+https://github.com/bitfocus/node-calrec-cscp.git","type":"git"},"_npmVersion":"11.19.0","description":"A Node.js client for basic control and monitoring of Calrec consoles via the CSCP protocol","directories":{},"maintainers":[{"name":"willosof","email":"william.viker@gmail.com"},{"name":"bitfocus-sa","email":"sa@bitfocus.io"},{"name":"haakon","email":"haakon.nessjoen@gmail.com"},{"name":"bryce-seifert","email":"bryce.seifert@me.com"}],"sideEffects":false,"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.5","ts-jest":"^29.4.0","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node":"^24.5.2","@biomejs/biome":"2.0.6"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/calrec-cscp_1.3.3_1790623586226_0.5288547281371361"}}},"time":{"created":"2025-07-29T14:29:26.978Z","modified":"2026-09-28T19:26:26.566Z","1.2.1":"2025-07-29T14:29:27.218Z","1.2.3":"2026-05-27T11:18:19.008Z","1.2.4":"2026-05-27T14:10:51.841Z","1.3.0":"2026-08-20T16:25:11.664Z","1.3.2":"2026-09-28T15:57:57.756Z","1.3.3":"2026-09-28T19:26:26.364Z"},"bugs":{"url":"https://github.com/bitfocus/node-calrec-cscp/issues"},"author":{"name":"Bitfocus AS","email":"william@bitfocus.io"},"license":"MIT","homepage":"https://github.com/bitfocus/node-calrec-cscp#readme","keywords":[],"repository":{"url":"git+https://github.com/bitfocus/node-calrec-cscp.git","type":"git"},"description":"A Node.js client for basic control and monitoring of Calrec consoles via the CSCP protocol","maintainers":[{"name":"willosof","email":"william.viker@gmail.com"},{"name":"bitfocus-sa","email":"sa@bitfocus.io"},{"name":"haakon","email":"haakon.nessjoen@gmail.com"},{"name":"bryce-seifert","email":"bryce.seifert@me.com"}],"readme":"# Calrec CSCP Protocol Client\n\n[![npm version](https://badge.fury.io/js/@bitfocusas%2Fcalrec-cscp.svg)](https://badge.fury.io/js/@bitfocusas%2Fcalrec-cscp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA Node.js client library for communicating with Calrec audio consoles using the CSCP (Calrec Serial Control Protocol). This library provides a robust, type-safe interface for basic control and monitoring of Calrec mixing consoles over TCP/IP.\n\n## Features\n\n- 🔌 **TCP/IP Communication** - Connect to Calrec consoles over network\n- 🎛️ **Basic Console Control** - Control faders, mutes, routing, and more\n- 📡 **Real-time Monitoring** - Receive live updates from the console\n- 🔄 **Auto-reconnection** - Automatic reconnection on connection loss\n- 💓 **Heartbeat** - Notices a console that has gone away even when the socket stays open\n- 🛡️ **Type Safety** - Full TypeScript support with detailed type definitions\n- 🎯 **Event-driven** - Clean event-based API for state changes\n- 📊 **Unit Conversion** - Built-in dB/level conversion utilities\n- ⚙️ **Configurable Timing** - Runtime-configurable protocol timing settings\n- 🚀 **Async/Await** - Modern async API with robust error handling\n\n## What This Module Provides\n\nThis library implements a subset of the Calrec CSCP protocol, providing control over:\n\n- **Fader Control**: Level, mute (cut), PFL, and labels\n- **Main Fader Control**: Level, PFL, and labels for main outputs\n- **Auxiliary Routing**: Route channels to auxiliary outputs (V20+ consoles)\n- **Main Routing**: Route channels to main outputs (V21+ consoles)\n- **Stereo Image Control**: Configure stereo image settings (V21+ consoles)\n- **Console Information**: Get console details and protocol version\n\n**Note**: This is not a complete console control solution. Calrec consoles offer many more features and capabilities that are not covered by this protocol implementation. This library provides a solid foundation for basic control and monitoring tasks.\n\n## Installation\n\n```bash\nnpm install @bitfocusas/calrec-cscp\n```\n\n## Quick Start\n\n```typescript\nimport { CalrecClient } from '@bitfocusas/calrec-cscp';\n\n// Create a client instance with custom settings\nconst client = new CalrecClient(\n  {\n    host: '192.168.1.100', // Your Calrec console IP\n    port: 3322,            // Your configured TCP port\n    maxFaderCount: 42,     // Maximum number of faders (1-192)\n    maxMainCount: 3,       // Maximum number of main outputs (optional, default: 3)\n    autoReconnect: true,\n    reconnectInterval: 5000,\n  },\n  {\n    // Optional: Custom protocol timing settings\n    globalCommandRateMs: 10,      // Minimum ms between any command\n    faderLevelRateMs: 100,        // Minimum ms between fader level commands\n    commandResponseTimeoutMs: 20,  // Timeout for command responses\n  }\n);\n\n// Set up event listeners\nclient.on('ready', async () => {\n  console.log('Connected and ready!');\n  \n  // Example: Update settings at runtime\n  client.updateSettings({\n    faderLevelRateMs: 50, // Faster fader updates\n  });\n});\n\nclient.on('faderLevelChange', (faderId, level) => {\n  console.log(`Fader ${faderId} level changed to ${level}`);\n});\n\nclient.on('error', (error) => {\n  console.error('Connection error:', error);\n});\n\n// Connect to the console (now async)\nawait client.connect();\n```\n\n## Usage Examples\n\n### Basic Console Control\n\n```typescript\nimport { CalrecClient } from '@bitfocusas/calrec-cscp';\n\nconst client = new CalrecClient({\n  host: '192.168.1.100',\n  port: 3322,\n  maxFaderCount: 42, // Maximum number of faders (1-192)\n  maxMainCount: 3,   // Maximum number of main outputs (optional, default: 3)\n});\n\nclient.on('ready', async () => {\n  try {\n    // Get console information (optional - console may not respond)\n    try {\n      const consoleInfo = await client.getConsoleInfo();\n      console.log('Console:', consoleInfo.deskLabel);\n      console.log('Max faders:', consoleInfo.maxFaders);\n    } catch (error) {\n      console.log('Console info not available, using configured values');\n    }\n    \n    // Get configured fader count\n    const maxFaders = client.getMaxFaderCount();\n    console.log('Configured max faders:', maxFaders);\n    \n    // Set fader level (0-1023 range)\n    await client.setFaderLevel(1, 500);\n    \n    // Set fader level in dB\n    await client.setFaderLevelDb(1, -10);\n    \n    // Mute/unmute a fader\n    await client.setFaderCut(1, true);\n    \n    // Get fader label\n    const label = await client.getFaderLabel(1);\n    console.log('Fader 1 label:', label);\n  } catch (error) {\n    console.error('Operation failed:', error);\n  }\n});\n\n// Connect to the console\nawait client.connect();\n```\n\n### Advanced Routing Control\n\n```typescript\nclient.on('ready', async () => {\n  try {\n    // Set aux routing (route fader 1 to aux 1 and 2)\n    await client.setAuxRouting(1, [true, true, false, false]);\n    \n    // Set stereo image for a fader\n    await client.setStereoImage(1, { leftToBoth: true, rightToBoth: false });\n    \n    // Get fader assignment\n    const assignment = await client.getFaderAssignment(1);\n    console.log('Fader 1 assignment:', assignment);\n  } catch (error) {\n    console.error('Routing operation failed:', error);\n  }\n});\n\n// Monitor aux routing changes\nclient.on('auxRoutingChange', (auxId, routes) => {\n  console.log(`Aux ${auxId} routing changed:`, routes);\n});\n```\n\n### Real-time Monitoring\n\n```typescript\n// Monitor all fader changes\nclient.on('faderLevelChange', (faderId, level) => {\n  console.log(`Fader ${faderId}: ${level}`);\n});\n\nclient.on('faderCutChange', (faderId, isCut) => {\n  console.log(`Fader ${faderId} ${isCut ? 'muted' : 'unmuted'}`);\n});\n\nclient.on('faderLabelChange', (faderId, label) => {\n  console.log(`Fader ${faderId} label: ${label}`);\n});\n\nclient.on('faderAssignmentChange', (assignment) => {\n  console.log('Fader assignment changed:', assignment);\n});\n\nclient.on('stereoImageChange', (faderId, image) => {\n  console.log(`Fader ${faderId} stereo image:`, image);\n});\n```\n\n### Connection Management\n\n```typescript\n// Monitor connection state\nclient.on('connectionStateChange', (state) => {\n  console.log('Connection state:', state);\n});\n\nclient.on('connect', () => {\n  console.log('Connected to console');\n});\n\nclient.on('disconnect', () => {\n  console.log('Disconnected from console');\n});\n\n// Manual disconnect (now async)\nawait client.disconnect();\n```\n\n#### Detecting a Lost Console\n\nA network outage does not close a TCP socket, so a client that only waits for\nsocket events keeps reporting `connected` long after the console is gone. Once the\nlink goes quiet the client probes it with a console info read; after\n`heartbeatMaxMisses` unanswered probes it emits `error`, then `disconnect`, and\nreconnects if `autoReconnect` is enabled. Worst-case detection time is\n`heartbeatIntervalMs * (heartbeatMaxMisses + 1)` — 15 seconds by default.\n\nReconnect attempts are bounded by `connectTimeoutMs`, because a host that is off\nthe network never answers a SYN and the OS would otherwise spend well over a\nminute retrying a single attempt.\n\n```typescript\nconst client = new CalrecClient(\n  { host: '192.168.1.100', port: 3322, maxFaderCount: 42 },\n  {\n    heartbeatIntervalMs: 5000, // 0 disables heartbeats\n    heartbeatMaxMisses: 2,\n  }\n);\n\nclient.on('error', (error) => {\n  // \"Console stopped responding: 2 heartbeat probe(s) unanswered, ...\"\n  console.error(error.message);\n});\n```\n\n### Error Handling\n\n```typescript\n// Error handling\nclient.on('error', (error) => {\n  console.error('Client error:', error.message);\n});\n\n// Handle errors in async operations\ntry {\n  await client.setFaderLevel(1, 500);\n} catch (error) {\n  if (error.message.includes('NAK')) {\n    console.error('Protocol error - command rejected by console');\n  } else if (error.message.includes('timeout')) {\n    console.error('Command timed out');\n  } else if (error.message.includes('not connected')) {\n    console.error('Client is not connected');\n  } else {\n    console.error('Unexpected error:', error);\n  }\n}\n```\n\n## API Reference\n\n### CalrecClient\n\nThe main client class for communicating with Calrec consoles. This client provides access to a subset of the console's capabilities through the CSCP protocol.\n\n#### Constructor\n\n```typescript\nnew CalrecClient(options: CalrecClientOptions, settings?: CalrecClientSettings)\n```\n\n**Options:**\n- `host: string` - Console IP address\n- `port: number` - TCP port number\n- `autoReconnect?: boolean` - Enable auto-reconnection (default: true)\n- `reconnectInterval?: number` - Reconnection delay in ms (default: 5000)\n- `maxFaderCount?: number` - Maximum number of faders (for validation)\n\n**Settings:**\n- `globalCommandRateMs?: number` - Minimum ms between any command (default: 10)\n- `faderLevelRateMs?: number` - Minimum ms between fader level commands (default: 100)\n- `commandResponseTimeoutMs?: number` - Timeout for command responses (default: 500)\n- `initializationTimeoutMs?: number` - Timeout for console info/name during connect (default: 200)\n- `connectTimeoutMs?: number` - How long a connection attempt may take (default: 5000)\n- `heartbeatIntervalMs?: number` - How often an idle connection is probed (default: 5000, `0` disables)\n- `heartbeatMaxMisses?: number` - Unanswered probes tolerated before the connection is treated as lost (default: 2)\n\n#### Methods\n\n##### Connection Management\n- `connect(): Promise<void>` - Connect to the console\n- `disconnect(): Promise<void>` - Disconnect from the console\n- `getState(): ClientState` - Get current client state\n- `getConnectionState(): ConnectionState` - Get connection state\n- `updateSettings(settings: CalrecClientSettings): void` - Update protocol settings at runtime\n\n##### Console Information\n- `getConsoleInfo(): Promise<ConsoleInfo>` - Get console information\n- `getConsoleName(): Promise<string>` - Get console name\n\n##### Fader Control\n- `setFaderLevel(faderId: number, level: number): Promise<void>` - Set fader level (0-1023)\n- `getFaderLevel(faderId: number): Promise<number>` - Get fader level\n- `setFaderLevelDb(faderId: number, db: number): Promise<void>` - Set fader level in dB\n- `getFaderLevelDb(faderId: number): Promise<number>` - Get fader level in dB\n- `setFaderCut(faderId: number, isCut: boolean): Promise<void>` - Mute/unmute fader\n- `getFaderCut(faderId: number): Promise<boolean>` - Get fader cut state\n- `getFaderLabel(faderId: number): Promise<string>` - Get fader label\n- `setFaderPfl(faderId: number, isPfl: boolean): Promise<void>` - Set fader PFL state\n- `getFaderPfl(faderId: number): Promise<boolean>` - Get fader PFL state\n- `getFaderAssignment(faderId: number): Promise<FaderAssignment>` - Get fader assignment\n\n##### Main Fader Control\n- `setMainFaderLevelDb(mainId: number, db: number): Promise<void>` - Set main fader level in dB\n- `getMainFaderLevelDb(mainId: number): Promise<number>` - Get main fader level in dB\n- `setMainFaderPfl(mainId: number, isPfl: boolean): Promise<void>` - Set main fader PFL state\n- `getMainPfl(mainId: number): Promise<boolean>` - Get main fader PFL state\n- `getMainFaderLabel(mainId: number): Promise<string>` - Get main fader label\n\n##### Routing Control (V20+)\n- `getAvailableAux(): Promise<boolean[]>` - Get available auxiliary outputs\n- `setAuxRouting(auxId: number, routes: boolean[]): Promise<void>` - Set aux routing\n- `getAuxSendRouting(auxId: number): Promise<boolean[]>` - Get aux routing\n- `setAuxOutputLevel(auxId: number, level: number): Promise<void>` - Set aux output level\n- `getAuxOutputLevel(auxId: number): Promise<number>` - Get aux output level\n\n##### Main Routing Control (V21+)\n- `getAvailableMains(): Promise<boolean[]>` - Get available main outputs\n- `setRouteToMain(mainId: number, routes: boolean[]): Promise<void>` - Set main routing\n\n##### Stereo Image Control (V21+)\n- `setStereoImage(faderId: number, image: StereoImage): Promise<void>` - Set stereo image\n- `getStereoImage(faderId: number): Promise<StereoImage>` - Get stereo image\n\n#### Events\n\nThe client extends EventEmitter and provides the following events:\n\n##### Connection Events\n- `connect` - Connected to console\n- `disconnect` - Disconnected from console\n- `ready` - Client fully initialized and ready\n- `error` - Connection or protocol error\n- `connectionStateChange` - Connection state changed\n\n##### Fader Events\n- `faderLevelChange` - Fader level changed\n- `faderCutChange` - Fader mute state changed\n- `faderPflChange` - Fader PFL state changed\n- `faderLabelChange` - Fader label changed\n- `faderAssignmentChange` - Fader assignment changed\n\n##### Main Fader Events\n- `mainLevelChange` - Main fader level changed\n- `mainPflChange` - Main fader PFL state changed\n- `mainLabelChange` - Main fader label changed\n\n##### Aux Events\n- `availableAuxesChange` - Available auxes changed\n- `auxRoutingChange` - Aux routing changed\n- `auxOutputLevelChange` - Aux output level changed\n\n##### Main Routing Events\n- `availableMainsChange` - Available mains changed\n- `mainRoutingChange` - Main routing changed\n\n##### Stereo Image Events\n- `stereoImageChange` - Stereo image settings changed\n\n##### Other Events\n- `unsolicitedMessage` - Raw unsolicited message received (only for truly unknown commands)\n\n### Protocol levels\n\nThe snippets above follow the protocol level a console supports:\n\n- **V1**: Basic commands (all consoles)\n- **V20**: V1 + Auxiliary send routing extensions\n- **V21**: V20 + Channel/Group routing to mains extensions\n\n### Types\n\nThe library exports detailed TypeScript types:\n\n```typescript\nimport {\n  ConnectionState,\n  CalrecClientOptions,\n  CalrecClientSettings,\n  ConsoleInfo,\n  FaderAssignment,\n  AudioType,\n  AudioWidth,\n  StereoImage,\n  NakError,\n  ClientState,\n  ParsedMessage,\n  CalrecClientEvents\n} from '@bitfocusas/calrec-cscp';\n```\n\n### Converters\n\nUtility functions for converting between different units:\n\n```typescript\nimport {\n  dbToChannelLevel,\n  dbToMainLevel,\n  channelLevelToDb,\n  mainLevelToDb\n} from '@bitfocusas/calrec-cscp';\n```\n\n## Configuration\n\n### Console Setup\n\n1. Configure your Calrec console to enable CSCP over TCP/IP\n2. Set the appropriate IP address and port\n3. Ensure network connectivity between your application and the console\n\n### Protocol Timing Settings\n\nThe library allows you to configure protocol timing for optimal performance:\n\n```typescript\nconst client = new CalrecClient(\n  { host: '192.168.1.100', port: 3322 },\n  {\n    globalCommandRateMs: 10,      // Minimum ms between any command\n    faderLevelRateMs: 100,        // Minimum ms between fader level commands\n    commandResponseTimeoutMs: 20,  // Timeout for command responses\n  }\n);\n\n// Update settings at runtime\nclient.updateSettings({\n  faderLevelRateMs: 50, // Faster fader updates\n});\n```\n\n### Network Requirements\n\n- TCP/IP connectivity to the console\n- Port access (typically 3322, but configurable)\n- Stable network connection for reliable operation\n\n## Error Handling\n\nThe library provides detailed error handling with informative error messages:\n\n```typescript\nclient.on('error', (error) => {\n  console.error('Client error:', error.message);\n});\n\n// Handle specific error types\ntry {\n  await client.setFaderLevel(1, 500);\n} catch (error) {\n  if (error.message.includes('NAK')) {\n    console.error('Protocol error - command rejected by console');\n  } else if (error.message.includes('timeout')) {\n    console.error('Command timed out');\n  } else if (error.message.includes('not connected')) {\n    console.error('Client is not connected');\n  } else {\n    console.error('Unexpected error:', error);\n  }\n}\n```\n\n## Development\n\nThis repository contains TypeScript source only. `dist/` is build output and is not committed. `npm pack` and `npm publish` compile it automatically before the package is packed.\n\n### Building from Source\n\n```bash\ngit clone https://github.com/bitfocus/node-calrec-cscp.git\ncd node-calrec-cscp\nnpm install\nnpm run build\nnpm test\n```\n\n### Code Quality\n\n```bash\nnpm run lint    # Lint code\nnpm run format  # Format code\nnpm run check   # Run all checks\n```\n\n### Testing\n\nThe library includes both unit tests and integration tests. Integration tests require a physical Calrec console for full testing.\n\n## Contributing\n\nWe welcome contributions! This library is provided free of charge by Bitfocus AS to the audio community as a useful tool for basic Calrec console control.\n\n### How to Contribute\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Make your changes\n4. Add tests if applicable\n5. Run the linter and formatter (`npm run check`)\n6. Commit your changes (`git commit -m 'Add amazing feature'`)\n7. Push to the branch (`git push origin feature/amazing-feature`)\n8. Open a Pull Request\n\n### Development Guidelines\n\n- Follow the existing code style (enforced by Biome)\n- Add TypeScript types for all new features\n- Include JSDoc comments for public APIs\n- Test your changes thoroughly\n- Update documentation as needed\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Support\n\n- **Issues**: [GitHub Issues](https://github.com/bitfocus/node-calrec-cscp/issues)\n- **Documentation**: This README and inline code documentation\n- **Email**: william@bitfocus.io\n\n**Note**: This is a community project. While we strive to help with issues, support is provided on a best-effort basis.\n\n## Acknowledgments\n\n- Calrec Audio for the CSCP protocol specification\n- All contributors who help improve this library\n- The audio community for feedback and testing\n\n---\n\n**Made with ❤️ by Bitfocus AS** ","readmeFilename":"README.md"}