{"_id":"@voltras/node-sdk","_rev":"27-97c9ce339ba480bfc93f6a64b2cb478b","name":"@voltras/node-sdk","dist-tags":{"latest":"0.15.0"},"versions":{"0.1.0":{"name":"@voltras/node-sdk","version":"0.1.0","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"name":"Voltra"},"license":"MIT","_id":"@voltras/node-sdk@0.1.0","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"7eb3818e39c06136f8376f9ff7390705615ebd63","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.1.0.tgz","fileCount":203,"integrity":"sha512-RkrebHAeIJ7Ve4pzlKvitaic/7PSI6DfbEfLrQ/m7Ni8dUkJwBedjwSHhgEt0Xa/MJjj1KmszT+lCcQEGcD4AQ==","signatures":[{"sig":"MEUCIQCzZ6uDf593ZGT7p1tDnBudBsJKi+p37PTWYLxckOzJ0QIgGKTQWNV8wIvjp1VxoWVnPAKBE74bYPWqcO0BfMP7hyQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":760769},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}}},"gitHead":"dcb004528a7bf6326e124a225716dba735077c7b","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test"},"_npmUser":{"name":"hjewkes","email":"HJewkes@gmail.com"},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.27.0","prettier":"^3.4.0","typescript":"~5.8.2","@types/node":"^20.0.0","lint-staged":"^15.3.0","@types/react":"^19.0.0","@commitlint/cli":"^19.6.0","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^19.6.0"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.1.0_1769115917475_0.7017125549355463","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@voltras/node-sdk","version":"0.1.1","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"name":"Voltra"},"license":"MIT","_id":"@voltras/node-sdk@0.1.1","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"e8b6ac951ff6a777846a8ffa2111aa615ef3c932","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.1.1.tgz","fileCount":203,"integrity":"sha512-V4bzR8qyn85TyRb2amfsfGN4YulkofGjt/7Gfx/I8rc+/GO/oddAf2f5NeiAZRzD+4/Q13oeMExyWyCMrqSgRw==","signatures":[{"sig":"MEUCIQCDjdtwbfe/IHOyAg5gyJjeQPoz7nkQopptpCfapK8sPQIgH0LtDS15nbeAXj6M4OjgS85hm8kll3mqXtBagVVkAWY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":767930},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}}},"gitHead":"75152cb57802568353542cd4a5f5911dd285f6a2","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test"},"_npmUser":{"name":"hjewkes","email":"HJewkes@gmail.com"},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.27.0","prettier":"^3.4.0","typescript":"~5.8.2","@types/node":"^20.0.0","lint-staged":"^15.3.0","@types/react":"^19.0.0","@commitlint/cli":"^19.6.0","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^19.6.0"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.1.1_1769117154284_0.7593981345344358","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@voltras/node-sdk","version":"0.1.2","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"name":"Voltra"},"license":"MIT","_id":"@voltras/node-sdk@0.1.2","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"dcd2c187d3bfaa6e45fdf6aea4720f34ea504003","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.1.2.tgz","fileCount":203,"integrity":"sha512-udiWt5Qt5iNtcUnTISPO7yzXzvpSsHViIzFxm3RMjhp2vnsn4qML/SxhEu0+/b9N0iFl8erERMIBI8VjF+slQA==","signatures":[{"sig":"MEUCIDoscvoYD6UrGLQxYCOfHLRJhdk6B5QMcduviQCPivxFAiEAnleeyXLPVSFcUThJxE3C9g5w7+cQdqEvSjYDBf8stqM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":769602},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}}},"gitHead":"c481136c4480db39988bba0cae9e49bc2d6fe43d","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test"},"_npmUser":{"name":"hjewkes","email":"HJewkes@gmail.com"},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.27.0","prettier":"^3.4.0","typescript":"~5.8.2","@types/node":"^20.0.0","lint-staged":"^15.3.0","@types/react":"^19.0.0","@commitlint/cli":"^19.6.0","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^19.6.0"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.1.2_1769121681810_0.8582760777647085","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@voltras/node-sdk","version":"0.2.0","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"name":"Voltra"},"license":"MIT","_id":"@voltras/node-sdk@0.2.0","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"e3a1cde54b1e2bf3f38e10ef363194a90bd43788","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.2.0.tgz","fileCount":255,"integrity":"sha512-Sy3P8lz/nMRSGkFFQyycZ0o5Nz1AizgmQtFdiqmcfLSNSSrp67y8qdMfs+IrKEkmbRo5ZyYXqFq1bs5KB3Bg3w==","signatures":[{"sig":"MEUCIACIKyuO0MTqKoLp/DxqCUv4nTtge0khlI3/XzBdXHPUAiEAmPxo5mZ9nepjLm9KWv2vERSWtkEIHKYLOLqe1JfoRUw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":802124},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}}},"gitHead":"39de8fcbc378aacc72089d3dcf8c862b15897ac2","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/generators/encode-protocol.ts"},"_npmUser":{"name":"hjewkes","email":"HJewkes@gmail.com"},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.2.0_1771178572946_0.512847095354255","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@voltras/node-sdk","version":"0.2.1","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.2.1","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"17bfc4e645ead765c54350ce54f599020c212c13","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.2.1.tgz","fileCount":255,"integrity":"sha512-mKZhYMpzXt2qZE3b5TAIvdPX/H3fHyNP3P1BwEyjkbhCF20dw80TysWRufQ1u8U7cOP71bF1rL4og4dKcjnUaA==","signatures":[{"sig":"MEUCIQDBR9TxaOdMfIpxruwjZeeV4r05VgHHzfl40wxm4wbDNwIgFqOZsXh4VLUmuKQHOmmZf74W4uiXnJKDj95RVE4hudg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":803228},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}}},"gitHead":"7982611423c7f32d0ca5a1623d7c006200205901","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"hjewkes","email":"HJewkes@gmail.com"},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"20.20.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.2.1_1771189255088_0.767016196344396","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@voltras/node-sdk","version":"0.3.0","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.3.0","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"e88d71651d7e975d3f65d1ab3d274e937a718292","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.3.0.tgz","fileCount":261,"integrity":"sha512-soOmn114YhR81u4TC1mabuFJWUvlcfIRH39EqMzroP12FtcmXWkdMs44raWV7IQ7Br9QCiIfry6GRGOSUbplYw==","signatures":[{"sig":"MEYCIQDp6fN4MyH0ns218G8aGBs9Lq7SHCBbjnfQ+VEl0gkdJQIhALdB1vLUSQ/mH4nZkX0psSA04KCKL/RRkzgXnUBFhNXq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":838337},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}}},"gitHead":"d5f0b71bf927446a5a625c01b4e102e8ee1310db","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.6.2","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.13.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.3.0_1771301562979_0.5502153630219311","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@voltras/node-sdk","version":"0.4.0","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.4.0","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"b5124890ca80984cd90e6ee91dc7116497024df1","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.4.0.tgz","fileCount":298,"integrity":"sha512-gUILEx7/uKU9mo1S+UNzimUzBwe5fgz1u3wvkTqPjN3Kw6/Qep/NDOii0ZHLf4gt3kbxEO6jifQeFWhaqHRtOw==","signatures":[{"sig":"MEUCICAWzMykuBmBumd34oXjLXmkvA0hiCAamcmrFqfdVILKAiEAjYHYSR08S9QrBwjpXHHtFf6t84fwAZqwUOHZNom9W1c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":956741},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/esm/bluetooth/adapters/web.js"},"require":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/cjs/bluetooth/adapters/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}}},"gitHead":"7a312ccfd9f9a5bcf517aa4b738a6e9a0b24d5d9","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.4.0_1777906913211_0.19953211095238776","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@voltras/node-sdk","version":"0.4.1","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.4.1","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"4d4f8f6c368f1f96686a9fe3d5579ccf8c5ce6f2","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.4.1.tgz","fileCount":298,"integrity":"sha512-J3sdDaBQzryEHDC/luxQPA+EqzuX/nrLe3IphdemnnuS06+GiMxbQtAv4bQJjXJClu8FI0lMZBkHks4Aabmg4g==","signatures":[{"sig":"MEYCIQCbtbPqlqTVhSpf0aM/7+vHXouL9EpQA0+1f+zM5b9clQIhAJjFrj2Z9iHH/rt7VpPYyYMe/f6AntSwqAtlO6mIYv6L","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":957430},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/esm/bluetooth/adapters/web.js"},"require":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/cjs/bluetooth/adapters/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}}},"gitHead":"d33d00c8d70d3297469a626359e22fce72c06759","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.4.1_1777951326859_0.46393574082823674","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@voltras/node-sdk","version":"0.4.2","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.4.2","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"c54f1e619f42f1d4571796e4fc4c82887757b5ea","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.4.2.tgz","fileCount":298,"integrity":"sha512-lIVtcS1sg7fmB9ieNx8tS/4+e+KepZPppmXCdGX6aaVxZ/9A0WfbJTSCsbGVNpM/Jh1cHIRiYzbBuy9j82FexA==","signatures":[{"sig":"MEUCIQCFxmWk5R2QBAHrP3r+Us+yI4lWUWBG7Cf6uq2Fmgvj3QIgfl8MP7fFhaQbJLMf+pBUeG8ovH2BKPhdFmTPQPeczok=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":957704},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/esm/bluetooth/adapters/web.js"},"require":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/cjs/bluetooth/adapters/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}}},"gitHead":"7def7756d50c9ac5f82907f5c1d9bfc40a7b3272","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.4.2_1777995176436_0.15824518086498673","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@voltras/node-sdk","version":"0.5.0","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.5.0","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"c6007218dc9675e6eaf85192c3c2480e5437d0e4","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.5.0.tgz","fileCount":328,"integrity":"sha512-EoaMb84uVu7mP/V3YxT2gWPgSIhd50olzha34rCruULeUFWfQOxQ7qAbzQUtt8zVj8amhjHFzkpSPYeqlIeHdg==","signatures":[{"sig":"MEQCIEmDGsNw3Gg4lrV/TLGu3AIpgqQDDvvToCvQouO4ROLeAiBSYGOg1gyWnXFyZhI2lRn0A35sVV4vL2Bmq6U4NXs4Og==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1192252},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/esm/bluetooth/adapters/web.js"},"require":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/cjs/bluetooth/adapters/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}}},"gitHead":"ab8362dec5cfb76eff461e533daab7f7772b9fc7","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.5.0_1778045923184_0.8538262138860022","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@voltras/node-sdk","version":"0.6.0","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.6.0","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"99bf1aeeb8cd196842a719a7757efb3742b670f6","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.6.0.tgz","fileCount":328,"integrity":"sha512-I3vJxl5FYBU2T/2CZ9pkw2qi4rsX24tC83trkFfnXQRVJQOyxOq8r1YUhQ2oUTf6NwrCY9m2udVZDHY2o/pKmA==","signatures":[{"sig":"MEUCICRCahtfmmt6qscMxMzZj2yYZSjTTNCCGa7KUprZ9tFrAiEApc/p5OwYdBuC54uZ373lRxA22tGCkZQurupA4mZZV2Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1338231},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/esm/bluetooth/adapters/web.js"},"require":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/cjs/bluetooth/adapters/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}}},"gitHead":"51174aa94ee755719af7e99e81d93f77d6bad490","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.6.0_1778071312682_0.3948874029163709","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@voltras/node-sdk","version":"0.6.1","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.6.1","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"f784babba6465e9756de61afa83427271b848d0c","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.6.1.tgz","fileCount":328,"integrity":"sha512-7kp+1lUqlKfGWhQv/QHTZMuFovb5BdQidRP4kxmOmShnqrCHJKrdNQRXiaR8rAGtr8azDwg/B1ei0c50oPLtPg==","signatures":[{"sig":"MEUCIQDUpmOimQ3DllFPgt6hrie/FGKh+AKwAnJVSbb41zTs9QIgOT3hxfv5LtnrF5/DNRoCViFbkFjpRMQxZiRMP/OsBfQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1338545},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/esm/bluetooth/adapters/web.js"},"require":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/cjs/bluetooth/adapters/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}}},"gitHead":"892c0c2fccd3b0cef6d5453c5b42666f37d17d9b","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.6.1_1778110430578_0.36497938888981185","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@voltras/node-sdk","version":"0.7.0","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.7.0","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"843dfd8e8713a340126ceaf9ae17b946e46c7edf","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.7.0.tgz","fileCount":346,"integrity":"sha512-QjrAsKFHfPbmWBI7Vko+/Fk+7/e7MaobKAPa5MRGjnxkbz/CJDdS269s107lEQPvcnZuuGuLAh7CgUKAfe1OgQ==","signatures":[{"sig":"MEYCIQCF0BSQFpNWGm24ELRutng6x6CJbD+Z7D366fVqiXN5bQIhAMXrX01THjEItGSUmfboZR3n+KK6PEcGYJuZmo5H1tKS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1570081},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/esm/bluetooth/adapters/web.js"},"require":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/cjs/bluetooth/adapters/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}}},"gitHead":"2cad62294b7285e38dffbf871262ba2dc8556ae3","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.7.0_1778136700637_0.7214089675218112","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@voltras/node-sdk","version":"0.7.1","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.7.1","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"f26f564b1916e26311bcf0945c7e4b91de9b5f32","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.7.1.tgz","fileCount":346,"integrity":"sha512-qFdQdU6IK0XCI4CID+CyZgQ+jPEDOei36N+71NXgHNhlj+8Pja1e2L7ULw6QOTx6VpBwxuyy1NSnbv7FgdJyqg==","signatures":[{"sig":"MEQCIFhSW8Y3TPsLE3DtLjJb7lCmf6GV+a0O3U52LMdQNeAlAiB3UWSGDIezaunBuUb1QpYwu5Xu29WJDBOQd66kqQu/WA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1578930},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/esm/bluetooth/adapters/web.js"},"require":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/cjs/bluetooth/adapters/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}}},"gitHead":"1cee19f4334a4aa9d1a920828f438347b76b7eb4","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.7.1_1778155524817_0.6309002902940573","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@voltras/node-sdk","version":"0.7.2","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.7.2","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"0a332f0e49e6191f0e5243cdd7f4dd391eb5c181","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.7.2.tgz","fileCount":346,"integrity":"sha512-GdH4sGLOpYoXbK55UDtwe5Ymkg6VmAhTcdoL3v1E9RYhHvn3yyPICBN3qPYZuTvP4/9OpwbuNhz6kDq8kvrnsQ==","signatures":[{"sig":"MEYCIQDFjejM5M5GR8kEYkgXx60lJpzKqY4w7kqAq5QJbjSG0AIhAJxZ3pTf1jYDiN3tICIre9YG9w5QrODhZWnjUZq87STl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.7.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1591736},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/esm/bluetooth/adapters/web.js"},"require":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/cjs/bluetooth/adapters/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}}},"gitHead":"045036d9421fc66f736cd999be84cb55e38d1132","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.7.2_1778180513154_0.6171585119297269","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@voltras/node-sdk","version":"0.8.0","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.8.0","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"e42fe71b66f8672ad1c1426531a34182111fc0b7","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.8.0.tgz","fileCount":364,"integrity":"sha512-BQVVbp/A+iJKiPTz3s9ByrVL49HbEK9Vu60m1kdW16JFPBGHzn039Z1xQ/vcfm7fZjlEJwy8px4bXnGlsq6qRw==","signatures":[{"sig":"MEUCIAxLKIpPjPaUQIXmReSD+yHbmr7Dz1G6rnx2/3rLudOcAiEAoBW6kBlCLL+cITCAvwgAD4yjT2jmtfx5qBHQr8ej60E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1831745},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/esm/bluetooth/adapters/web.js"},"require":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/cjs/bluetooth/adapters/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}},"./node-noble":{"import":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/esm/bluetooth/adapters/node-noble.js"},"require":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/cjs/bluetooth/adapters/node-noble.js"}}},"gitHead":"7c8a2d55d230dc4b5194390c68876ddfae67b1d4","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0","@stoprocent/noble":"^2.5.3"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.8.0_1778302531356_0.021059170217953227","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@voltras/node-sdk","version":"0.9.0","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.9.0","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"b882372b2ec9838b2bc51efbfa55d7653bff0dba","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.9.0.tgz","fileCount":364,"integrity":"sha512-4t9wcSI4Awx3NVP2vu0jSn/novldHfmll0tYg9BPcHS9TGF0owUqP/mO2J3c6no1mzmQjsc02baCuH1J9M2UXA==","signatures":[{"sig":"MEYCIQCH2hRfqVujPLAoRFM61IdT7TwC8IpqOEE7NXz4COrXMAIhAPhxtqllcg6KORCItxnWQN+6Lipehx61XPD2ovVQe/9J","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1834986},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/esm/bluetooth/adapters/web.js"},"require":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/cjs/bluetooth/adapters/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}},"./node-noble":{"import":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/esm/bluetooth/adapters/node-noble.js"},"require":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/cjs/bluetooth/adapters/node-noble.js"}}},"gitHead":"0afd90b3e0fc8c5d4b020a4c7981583ef3dd96c5","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0","@stoprocent/noble":"^2.5.3"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.9.0_1778329268819_0.10901219721714872","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@voltras/node-sdk","version":"0.10.0","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.10.0","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"011ce11060e685be1e200f2ff56eacd8a7df5f61","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.10.0.tgz","fileCount":376,"integrity":"sha512-NOmRy4bAYDXDLRUbhq/Q0K5QPiSONgTM4/mq4UQhI0N83Fyh5b9gdP2VqpqZ59Vn8HqZHOhdJ02gaQxNAxgo5A==","signatures":[{"sig":"MEUCIQDMW66kB5m76YgKqdVgaukSJYS5R2tVP59OC6BuK3VdWQIgXVnsJjhFmkPKqw+LwWxhw+O13WbPXZvj/NQm9GK81sQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1936741},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/esm/bluetooth/adapters/web.js"},"require":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/cjs/bluetooth/adapters/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}},"./testing":{"import":{"types":"./dist/types/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/types/testing/index.d.ts","default":"./dist/cjs/testing/index.js"}},"./node-noble":{"import":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/esm/bluetooth/adapters/node-noble.js"},"require":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/cjs/bluetooth/adapters/node-noble.js"}}},"gitHead":"319795ab1c748534207c68abbd45b84d6354aa33","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@emnapi/core":"^1.10.0","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","@emnapi/runtime":"^1.10.0","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0","@stoprocent/noble":"^2.5.3"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.10.0_1778421093629_0.5220340744172511","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"@voltras/node-sdk","version":"0.10.1","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.10.1","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"e51b284c7b03d76e0e07d6022833e29dd62acc8c","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.10.1.tgz","fileCount":376,"integrity":"sha512-W1OW5rUG3tMw+1svFG7NzBIEulYge2Yi3QWGNnZJZzqh/J0q30NKB1DW8EK79yJfQrOl9p3AVDk+592teAQUrw==","signatures":[{"sig":"MEYCIQD98SaHlfy2ewpZ0vjVI1szAZfK3VEpyUVn9/sD9eepYQIhAITSAL/NW4conEHlNdvHGTo946dgAshraG6612Zd3toA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.10.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1944716},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/esm/bluetooth/adapters/web.js"},"require":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/cjs/bluetooth/adapters/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}},"./testing":{"import":{"types":"./dist/types/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/types/testing/index.d.ts","default":"./dist/cjs/testing/index.js"}},"./node-noble":{"import":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/esm/bluetooth/adapters/node-noble.js"},"require":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/cjs/bluetooth/adapters/node-noble.js"}}},"gitHead":"a1e2f9e49c1ea359fadda7b095cc1937dd390001","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@emnapi/core":"^1.10.0","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","@emnapi/runtime":"^1.10.0","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0","@stoprocent/noble":"^2.5.3"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.10.1_1778442487322_0.26900569140815844","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@voltras/node-sdk","version":"0.11.0","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.11.0","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"a81ac6696c37bd632d5eed3cf49cefe5dbf78e01","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.11.0.tgz","fileCount":376,"integrity":"sha512-9+n61H3Di0/mYzAov/nypjT90hxh4IvNx9+mxqKaWWbaLVMlTi6QxCGpxKU6FWLTaNdKvLZAeb306wUyDQhqKw==","signatures":[{"sig":"MEYCIQDCjugfXbLEXdkkcJSYaDWAEHKQxurYwuzcX1D8wiWx7gIhAK33SX+Nc3sSPDcFZsboNaDH1FKaxZh+6U9Fis9Cewd/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1973650},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/esm/bluetooth/adapters/web.js"},"require":{"types":"./dist/types/bluetooth/adapters/web.d.ts","default":"./dist/cjs/bluetooth/adapters/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}},"./testing":{"import":{"types":"./dist/types/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/types/testing/index.d.ts","default":"./dist/cjs/testing/index.js"}},"./node-noble":{"import":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/esm/bluetooth/adapters/node-noble.js"},"require":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/cjs/bluetooth/adapters/node-noble.js"}}},"gitHead":"fe86f18c118565df04f8e13e5bf239030350ef5b","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^9.18.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","typescript":"~5.9.3","@types/node":"^25.2.3","lint-staged":"^16.2.7","@emnapi/core":"^1.10.0","@types/react":"^19.0.0","@commitlint/cli":"^20.4.1","@emnapi/runtime":"^1.10.0","typescript-eslint":"^8.21.0","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^20.4.1"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0","@stoprocent/noble":"^2.5.3"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.11.0_1778682926279_0.5728464129330515","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@voltras/node-sdk","version":"0.12.0","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.12.0","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"798c779f29eb6b773e79513725e7f33c98579524","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.12.0.tgz","fileCount":406,"integrity":"sha512-cVkaFOfNB7YLJHCXikqBxk794FuZDPNK3r0Xvt0fNBVKPnltueHMb1wnlfCehdzvCLqB12irGUkgvnceItwIEQ==","signatures":[{"sig":"MEUCIQDyL22mTUlhxgHbywud1WlmSX+IggKrb80zq7hk3qLGxgIgaTYiRg4chYPYcr87ikh7TOVfWKfQqGZzWvP8I+JonQ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2102483},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"browser":{"types":"./dist/types/entries/web.d.ts","default":"./dist/esm/entries/web.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"},"react-native":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/entries/web.d.ts","default":"./dist/esm/entries/web.js"},"require":{"types":"./dist/types/entries/web.d.ts","default":"./dist/cjs/entries/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}},"./testing":{"import":{"types":"./dist/types/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/types/testing/index.d.ts","default":"./dist/cjs/testing/index.js"}},"./node-noble":{"import":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/esm/bluetooth/adapters/node-noble.js"},"require":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/cjs/bluetooth/adapters/node-noble.js"}}},"gitHead":"f3885b6c4820f3dc03ae1f15c592cac58557e151","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts src/entries/web.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.16.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^10.3.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","@eslint/js":"^10.0.1","typescript":"~6.0.3","@types/node":"^25.2.3","lint-staged":"^17.0.4","@emnapi/core":"^1.10.0","@types/react":"^19.0.0","@commitlint/cli":"^21.0.1","@emnapi/runtime":"^1.10.0","typescript-eslint":"^8.62.1","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^21.2.0"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0","@stoprocent/noble":"^2.5.3"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.12.0_1785258151092_0.0883398215538942","host":"s3://npm-registry-packages-npm-production"}},"0.12.1":{"name":"@voltras/node-sdk","version":"0.12.1","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.12.1","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"a19f6e579d6f0ada38fb110408d4f6c7449a5bc6","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.12.1.tgz","fileCount":406,"integrity":"sha512-mVsluiEOV/azrw7OIOeH1DJvw7XbUMIR4GOXRFrXTNA8wbCtDYE2t7CsJ7zUb8/3oOCv/9qNvj4ZwVjG4x7wHA==","signatures":[{"sig":"MEUCIGZKEd14+xsO9K/jxHbNtd0OnZ6qE9n8BfNec7/BMO94AiEAxevpLvdTJyCKKiepx03iJfaFfvoI1nZJfvYe+voIksw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.12.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2106443},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"browser":{"types":"./dist/types/entries/web.d.ts","default":"./dist/esm/entries/web.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"},"react-native":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"}},"./web":{"import":{"types":"./dist/types/entries/web.d.ts","default":"./dist/esm/entries/web.js"},"require":{"types":"./dist/types/entries/web.d.ts","default":"./dist/cjs/entries/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}},"./testing":{"import":{"types":"./dist/types/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/types/testing/index.d.ts","default":"./dist/cjs/testing/index.js"}},"./node-noble":{"import":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/esm/bluetooth/adapters/node-noble.js"},"require":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/cjs/bluetooth/adapters/node-noble.js"}}},"gitHead":"d4e75ad48c7dc1091ed7fd10089282dfe186ad69","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts src/entries/web.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"overrides":{"tar":"^7.5.21"},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.16.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^10.3.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","@eslint/js":"^10.0.1","typescript":"~6.0.3","@types/node":"^25.2.3","lint-staged":"^17.0.4","@emnapi/core":"^1.10.0","@types/react":"^19.0.0","@commitlint/cli":"^21.0.1","@emnapi/runtime":"^1.10.0","typescript-eslint":"^8.62.1","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^21.2.0"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0","@stoprocent/noble":"^2.5.3"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.12.1_1785342164935_0.6806857441744434","host":"s3://npm-registry-packages-npm-production"}},"0.12.2":{"name":"@voltras/node-sdk","version":"0.12.2","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.12.2","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"33c14ab1558ecf7a58d3cc6ee3e5f3db6e340d0f","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.12.2.tgz","fileCount":412,"integrity":"sha512-XN2mCMX1tWixVl4A3w+2eB6hK8KjYy+d36mSjveHZ2jTnufXTTCWqW2zkCJXhLkwhmIVoPvOLSWO7U1skpas4g==","signatures":[{"sig":"MEUCIQD+kGIund2IXzSKV4Jih/+RktmRfTvlRrj0GeJ8yhVbfAIgbpgKaUyKo6R250tWZSt+fE2E39ET9PcZ4aZV28A/olk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.12.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2153517},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"browser":{"types":"./dist/types/entries/web.d.ts","default":"./dist/esm/entries/web.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"},"react-native":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/cjs/entries/react-native.js"}},"./web":{"import":{"types":"./dist/types/entries/web.d.ts","default":"./dist/esm/entries/web.js"},"require":{"types":"./dist/types/entries/web.d.ts","default":"./dist/cjs/entries/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}},"./testing":{"import":{"types":"./dist/types/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/types/testing/index.d.ts","default":"./dist/cjs/testing/index.js"}},"./node-noble":{"import":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/esm/bluetooth/adapters/node-noble.js"},"require":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/cjs/bluetooth/adapters/node-noble.js"}},"./react-native":{"import":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/esm/entries/react-native.js"},"require":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/cjs/entries/react-native.js"}}},"gitHead":"2f54bcd1df81a1ad1ea33c43ee92d93a0b6aa155","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts src/entries/web.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"overrides":{"tar":"^7.5.21"},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.16.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^10.3.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","@eslint/js":"^10.0.1","typescript":"~6.0.3","@types/node":"^25.2.3","lint-staged":"^17.0.4","@emnapi/core":"^1.10.0","@types/react":"^19.0.0","@commitlint/cli":"^21.0.1","@emnapi/runtime":"^1.10.0","typescript-eslint":"^8.62.1","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^21.2.0"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0","@stoprocent/noble":"^2.5.3"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.12.2_1785346173721_0.7823638476430681","host":"s3://npm-registry-packages-npm-production"}},"0.12.3":{"name":"@voltras/node-sdk","version":"0.12.3","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.12.3","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"ff154f4203ca3d92061474230753293bb43721da","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.12.3.tgz","fileCount":412,"integrity":"sha512-r/znbn7FNXlx1bsT3cdHqXF7S0WTzwoRwEpgcsasQlzqxXbOsuQdzsngaMqdKJb0eVxsbp+OassWMzL7PnqZMA==","signatures":[{"sig":"MEUCIEcCp6shSp4oTLh9MY7+2tDkG0f16h2IA4tltAhjzBgWAiEA/SfR2Q+fyEj3v5ygHGAjlUNn8qUDSxuInWQi1cFfW8A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.12.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2158335},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"browser":{"types":"./dist/types/entries/web.d.ts","default":"./dist/esm/entries/web.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"},"react-native":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/cjs/entries/react-native.js"}},"./web":{"import":{"types":"./dist/types/entries/web.d.ts","default":"./dist/esm/entries/web.js"},"require":{"types":"./dist/types/entries/web.d.ts","default":"./dist/cjs/entries/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}},"./testing":{"import":{"types":"./dist/types/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/types/testing/index.d.ts","default":"./dist/cjs/testing/index.js"}},"./node-noble":{"import":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/esm/bluetooth/adapters/node-noble.js"},"require":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/cjs/bluetooth/adapters/node-noble.js"}},"./react-native":{"import":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/esm/entries/react-native.js"},"require":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/cjs/entries/react-native.js"}}},"gitHead":"a53804e46c87a9064bc776d0e9ecedc2e66867fe","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts src/entries/web.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"overrides":{"tar":"^7.5.21"},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.16.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^10.3.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","@eslint/js":"^10.0.1","typescript":"~6.0.3","@types/node":"^25.2.3","lint-staged":"^17.0.4","@emnapi/core":"^1.10.0","@types/react":"^19.0.0","@commitlint/cli":"^21.0.1","@emnapi/runtime":"^1.10.0","typescript-eslint":"^8.62.1","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^21.2.0"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0","@stoprocent/noble":"^2.5.3"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.12.3_1785347468741_0.8687812983177892","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@voltras/node-sdk","version":"0.13.0","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.13.0","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"f51d7590b2eb3b3804714de5a72ec75b26bd95b8","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.13.0.tgz","fileCount":412,"integrity":"sha512-vMj5Sj1QT+TyhWJ04UFMd/i7NTPIAKqV0QkNNmcVuQ8nlfZy6yFONNZTmv+ApOn7wd1LoUMpiFF469YIQGk45w==","signatures":[{"sig":"MEQCIDPqVn+5NH4h4tJPImxFWzOGv5KY/VzwydEeeH3+1JLsAiBzygKdKsGiPvLSG/Ds/5DmkVzs9YqWa2rwojTXg8Km2g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.13.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2161691},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"browser":{"types":"./dist/types/entries/web.d.ts","default":"./dist/esm/entries/web.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"},"react-native":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/cjs/entries/react-native.js"}},"./web":{"import":{"types":"./dist/types/entries/web.d.ts","default":"./dist/esm/entries/web.js"},"require":{"types":"./dist/types/entries/web.d.ts","default":"./dist/cjs/entries/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}},"./testing":{"import":{"types":"./dist/types/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/types/testing/index.d.ts","default":"./dist/cjs/testing/index.js"}},"./node-noble":{"import":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/esm/bluetooth/adapters/node-noble.js"},"require":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/cjs/bluetooth/adapters/node-noble.js"}},"./react-native":{"import":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/esm/entries/react-native.js"},"require":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/cjs/entries/react-native.js"}}},"gitHead":"1602f53e1aff9de88f8e31bef60ea8ee0a118df8","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts src/entries/web.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"overrides":{"tar":"^7.5.21"},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^10.3.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","@eslint/js":"^10.0.1","typescript":"~6.0.3","@types/node":"^25.2.3","lint-staged":"^17.0.4","@emnapi/core":"^1.10.0","@types/react":"^19.0.0","@commitlint/cli":"^21.0.1","@emnapi/runtime":"^1.10.0","typescript-eslint":"^8.62.1","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^21.2.0"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0","@stoprocent/noble":"^2.5.3"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.13.0_1788883048992_0.9317883478637128","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@voltras/node-sdk","version":"0.14.0","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","_id":"@voltras/node-sdk@0.14.0","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"da662812cd03f571f0e7f6ce6a89753d37833a22","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.14.0.tgz","fileCount":412,"integrity":"sha512-4tsIDTUuJBo5dEkCSTnw1W3/cXxObobVGwhQpaD57k8HB2uiWve7wH1cuBUMIUHZBNXknRkGjzAc1U5EQpQIWA==","signatures":[{"sig":"MEUCIQDuVO7cYJ0bq5NNAu8z7q6ZRv+/wVmkkPd839KA37NEOgIgQ6kkArD2kPbeof79eLLkwWgjb6xjdzPkC6Oxsg1cTUY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.14.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2179627},"main":"./dist/cjs/index.js","types":"./dist/types/index.d.ts","module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"browser":{"types":"./dist/types/entries/web.d.ts","default":"./dist/esm/entries/web.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"},"react-native":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/cjs/entries/react-native.js"}},"./web":{"import":{"types":"./dist/types/entries/web.d.ts","default":"./dist/esm/entries/web.js"},"require":{"types":"./dist/types/entries/web.d.ts","default":"./dist/cjs/entries/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}},"./testing":{"import":{"types":"./dist/types/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/types/testing/index.d.ts","default":"./dist/cjs/testing/index.js"}},"./node-noble":{"import":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/esm/bluetooth/adapters/node-noble.js"},"require":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/cjs/bluetooth/adapters/node-noble.js"}},"./react-native":{"import":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/esm/entries/react-native.js"},"require":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/cjs/entries/react-native.js"}}},"gitHead":"58c4ef7abe56b604addbe230ef5aa257c6829898","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts src/entries/web.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","generate:protocol":"npx tsx ../voltra-private/build.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"overrides":{"tar":"^7.5.21"},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"sideEffects":false,"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^10.3.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","@eslint/js":"^10.0.1","typescript":"~6.0.3","@types/node":"^25.2.3","lint-staged":"^17.0.4","@emnapi/core":"^1.10.0","@types/react":"^19.0.0","@commitlint/cli":"^21.0.1","@emnapi/runtime":"^1.10.0","typescript-eslint":"^8.62.1","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^21.2.0"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0","@stoprocent/noble":"^2.5.3"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/node-sdk_0.14.0_1788960415600_0.44241321376999587","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"_id":"@voltras/node-sdk@0.15.0","bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"dist":{"shasum":"765c06e39f39bfb71e25848376bcd26d59b0571b","tarball":"https://registry.npmjs.org/@voltras/node-sdk/-/node-sdk-0.15.0.tgz","fileCount":442,"integrity":"sha512-+jglfu86eT1tQCEaCWKbl2XRC/E5bNTgNRKx3zvetuzXMbdcBU6Go60L67bHQYknzNlDnKHLnMhpJdUen+5PEg==","signatures":[{"sig":"MEUCIQCibfZVYmiTvvAKR6RHF//f2eBntyrCTsUTO8mNvJ0lEwIgOSYiGe1dkBAXy1Gg3v/u3Sw89PryprhnW7RfnSpZXhM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHyKRZdJUOIf77tQg9F1zGEL6cfnW7Qr1vAQ7iUtCszDAiEAkc/qTVA/QxHD5Sah9B5wrhZZdJNdd+gjdOcn3y4X4eM="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@voltras%2fnode-sdk@0.15.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2288267},"main":"./dist/cjs/index.js","name":"@voltras/node-sdk","types":"./dist/types/index.d.ts","author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"module":"./dist/esm/index.js","engines":{"node":">=20.0.0"},"exports":{".":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"browser":{"types":"./dist/types/entries/web.d.ts","default":"./dist/esm/entries/web.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.js"},"react-native":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/cjs/entries/react-native.js"}},"./web":{"import":{"types":"./dist/types/entries/web.d.ts","default":"./dist/esm/entries/web.js"},"require":{"types":"./dist/types/entries/web.d.ts","default":"./dist/cjs/entries/web.js"}},"./node":{"import":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/esm/bluetooth/adapters/node.js"},"require":{"types":"./dist/types/bluetooth/adapters/node.d.ts","default":"./dist/cjs/bluetooth/adapters/node.js"}},"./react":{"import":{"types":"./dist/types/react/index.d.ts","default":"./dist/esm/react/index.js"},"require":{"types":"./dist/types/react/index.d.ts","default":"./dist/cjs/react/index.js"}},"./native":{"import":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/esm/bluetooth/adapters/native.js"},"require":{"types":"./dist/types/bluetooth/adapters/native.d.ts","default":"./dist/cjs/bluetooth/adapters/native.js"}},"./testing":{"import":{"types":"./dist/types/testing/index.d.ts","default":"./dist/esm/testing/index.js"},"require":{"types":"./dist/types/testing/index.d.ts","default":"./dist/cjs/testing/index.js"}},"./node-noble":{"import":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/esm/bluetooth/adapters/node-noble.js"},"require":{"types":"./dist/types/bluetooth/adapters/node-noble.d.ts","default":"./dist/cjs/bluetooth/adapters/node-noble.js"}},"./react-native":{"import":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/esm/entries/react-native.js"},"require":{"types":"./dist/types/entries/react-native.d.ts","default":"./dist/cjs/entries/react-native.js"}}},"gitHead":"4ed1070fa8e8f2adaa5becd6c18ef6eb56e25f0a","license":"MIT","scripts":{"lint":"eslint src","test":"vitest run","build":"npm run clean && npm run build:esm && npm run build:cjs && npm run build:esm-pkg","clean":"rm -rf dist","format":"prettier --write \"src/**/*.ts\" \"eslint-rules/**/*.mjs\"","prepare":"husky","ci:local":"npm run lint && npm run format:check && npm run typecheck && npm run test && npm run build","docs:api":"typedoc --out docs/api src/index.ts src/entries/web.ts","lint:fix":"eslint src --fix","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc -p tsconfig.esm.json && tsc-alias -p tsconfig.esm.json --resolve-full-paths && node scripts/inject-esm-require-shim.mjs","typecheck":"tsc --noEmit","test:watch":"vitest","format:check":"prettier --check \"src/**/*.ts\" \"eslint-rules/**/*.mjs\"","audit:privacy":"bash scripts/audit-privacy.sh","build:esm-pkg":"node -e \"require('node:fs').writeFileSync('dist/esm/package.json', JSON.stringify({type:'module'},null,2))\"","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build && npm run test","verify:generated":"bash scripts/verify-generated.sh","generate:protocol":"npx tsx ../voltra-private/build.ts","audit:privacy:self-test":"bash scripts/audit-privacy-self-test.sh"},"version":"0.15.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:47430afb-b52d-448e-bdf4-12937aff40bb"}},"homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"overrides":{"tar":"^7.5.21"},"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"SDK for connecting to and controlling Voltra fitness devices","directories":{},"lint-staged":{"*.ts":["eslint --fix","prettier --write"]},"maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"sideEffects":false,"_nodeVersion":"24.20.0","_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","eslint":"^10.3.0","vitest":"^4.0.17","typedoc":"^0.28.17","prettier":"^3.4.0","tsc-alias":"^1.8.17","@eslint/js":"^10.0.1","typescript":"~6.0.3","@types/node":"^25.2.3","lint-staged":"^17.0.4","@emnapi/core":"^1.10.0","@types/react":"^19.0.0","@commitlint/cli":"^21.0.1","@emnapi/runtime":"^1.10.0","typescript-eslint":"^8.62.1","@vitest/coverage-v8":"^4.0.0","@types/web-bluetooth":"^0.0.21","@commitlint/config-conventional":"^21.2.0"},"peerDependencies":{"react":">=17.0.0","react-native-ble-plx":">=3.0.0"},"optionalDependencies":{"webbluetooth":"^3.4.0","@stoprocent/noble":"^2.5.3"},"peerDependenciesMeta":{"react":{"optional":true},"react-native-ble-plx":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/node-sdk_0.15.0_1789727108240_0.04085099438444484"}}},"time":{"created":"2026-01-22T21:05:17.404Z","modified":"2026-09-18T10:25:08.664Z","0.1.0":"2026-01-22T21:05:17.627Z","0.1.1":"2026-01-22T21:25:54.458Z","0.1.2":"2026-01-22T22:41:21.996Z","0.2.0":"2026-02-15T18:02:53.116Z","0.2.1":"2026-02-15T21:00:55.244Z","0.3.0":"2026-02-17T04:12:43.140Z","0.4.0":"2026-05-04T15:01:53.478Z","0.4.1":"2026-05-05T03:22:07.087Z","0.4.2":"2026-05-05T15:32:56.698Z","0.5.0":"2026-05-06T05:38:43.391Z","0.6.0":"2026-05-06T12:41:52.882Z","0.6.1":"2026-05-06T23:33:50.774Z","0.7.0":"2026-05-07T06:51:40.777Z","0.7.1":"2026-05-07T12:05:25.051Z","0.7.2":"2026-05-07T19:01:53.388Z","0.8.0":"2026-05-09T04:55:31.678Z","0.9.0":"2026-05-09T12:21:08.981Z","0.10.0":"2026-05-10T13:51:33.789Z","0.10.1":"2026-05-10T19:48:07.520Z","0.11.0":"2026-05-13T14:35:26.536Z","0.12.0":"2026-07-28T17:02:31.258Z","0.12.1":"2026-07-29T16:22:45.116Z","0.12.2":"2026-07-29T17:29:33.894Z","0.12.3":"2026-07-29T17:51:08.932Z","0.13.0":"2026-09-08T15:57:29.153Z","0.14.0":"2026-09-09T13:26:55.741Z","0.15.0":"2026-09-18T10:25:08.349Z"},"bugs":{"url":"https://github.com/HJewkes/voltra-node-sdk/issues"},"author":{"url":"hjewkes@gmail.com","name":"Henry Jewkes"},"license":"MIT","homepage":"https://github.com/HJewkes/voltra-node-sdk#readme","keywords":["voltra","bluetooth","ble","fitness","sdk","react-native","node","web-bluetooth"],"repository":{"url":"git+https://github.com/HJewkes/voltra-node-sdk.git","type":"git"},"description":"SDK for connecting to and controlling Voltra fitness devices","maintainers":[{"name":"hjewkes","email":"HJewkes@gmail.com"}],"readme":"# @voltras/node-sdk\n\nSDK for connecting to and controlling Voltra fitness devices.\n\n[![npm version](https://img.shields.io/npm/v/@voltras/node-sdk.svg)](https://www.npmjs.com/package/@voltras/node-sdk)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n## What's new in 0.6.0\n\n- **Typed vendor-frame events**: `onPerRep`, `onSummary`, `onSetSummary`,\n  `onInProgress` replace the payload-less `onRepBoundary` / `onSetBoundary`\n  callbacks (which were removed). Each fires with a structured event payload.\n- **Mode-config setters**: `setDamperLevel`, `setAssistMode`,\n  `setBandMaxForce`, `setIsokineticTargetSpeed`, `setIsokineticEccMode`,\n  `setIsokineticEccSpeedLimit`, `setIsokineticEccConstWeight`,\n  `setIsokineticEccOverloadWeight`. `damperLevel` is reflected in\n  `client.settings`.\n- **`@experimental` QoL setters**: `setTelemetryRate`, `setTelemetrySubscribe`,\n  `setCableTrigger`, `setResistanceExperience`. Validated at the protocol\n  level but not yet on-device.\n- **Breaking changes**: see [MIGRATION.md](./MIGRATION.md#migrating-from-05x-to-060).\n\n## Features\n\n- **Device Control**: Configure weight (5-200 lbs, any integer), chains (0-100 lbs), inverse chains (0-100), and eccentric overload (-195 to +195 lbs)\n- **Real-time Telemetry**: Stream position, velocity, and force data during workouts\n- **Device Notifications**: Rep/set boundaries, mode confirmations, settings updates, battery level\n- **Recording Lifecycle**: Stage, start, and stop recording, with the motor state the device reported\n- **Cross-platform**: Web browsers, Node.js, and React Native\n- **Multi-device**: Connect to and control multiple devices simultaneously\n- **React Hooks**: `useVoltraScanner` and `useVoltraDevice` for seamless React integration\n- **TypeScript**: Full type definitions included\n\n## Installation\n\n```bash\nnpm install @voltras/node-sdk\n```\n\n### Platform Dependencies\n\n| Platform | Additional Install |\n|----------|-------------------|\n| Web browsers | None (uses native Bluetooth API) |\n| Node.js | `npm install webbluetooth` (polyfill) |\n| React Native | `npm install react-native-ble-plx` |\n\n## Quick Start\n\nThe typical workflow is: **scan for devices → let user select → connect → configure → workout → disconnect**.\n\n```typescript\nimport { VoltraManager, type DiscoveredDevice, type TelemetryFrame } from '@voltras/node-sdk';\n\n// 1. Create a manager (auto-detects platform)\nconst manager = new VoltraManager();\n\n// 2. Scan for devices\nconst devices = await manager.scan({ timeout: 10000 });\nconsole.log('Found devices:', devices.map(d => d.name));\n\n// 3. Let user select a device (or connect programmatically)\nconst selectedDevice = devices[0]; // In a real app, user would choose\nconst client = await manager.connect(selectedDevice);\n\n// 4. Configure resistance settings\nawait client.setWeight(50);         // 5-200 lbs (any integer)\nawait client.setChains(25);         // 0-100 lbs added as you extend\nawait client.setInverseChains(15);  // 0-100 (see Inverse Chains below)\nawait client.setEccentric(10);      // -195 to +195 lbs on the eccentric\n\n// 5. Subscribe to real-time telemetry\nclient.onFrame((frame: TelemetryFrame) => {\n  console.log(`Position: ${frame.position}, Velocity: ${frame.velocity}, Force: ${frame.force}`);\n});\n\n// 6. Start recording (engages motor)\nawait client.startRecording();\n\n// ... user performs workout ...\n\n// 7. Stop recording (asks the device to release the cable)\nawait client.stopRecording();\n\n// 8. Cleanup\nawait manager.disconnectAll();\nmanager.dispose();\n```\n\n### Convenience Methods\n\nFor simpler scenarios, you can skip manual device selection:\n\n```typescript\n// Connect to first available device\nconst client = await manager.connectFirst();\n\n// Connect by device name\nconst client = await manager.connectByName('VTR-123456');\n```\n\n## Core Concepts\n\n### Resistance Settings\n\nControl the device's resistance in four ways:\n\n| Setting | Range | Description |\n|---------|-------|-------------|\n| **Weight** | 5-200 lbs | Primary resistance (any integer value) |\n| **Chains** | 0-100 lbs | Adds load as you extend, the way a lifting chain does as it leaves the floor |\n| **Inverse Chains** | 0-100 | Sheds load as you extend. **Under review** - see below |\n| **Eccentric** | -195 to +195 lbs | Overload added to (or taken off) the eccentric phase, on top of the weight |\n\n```typescript\n// Set all resistance parameters\nawait client.setWeight(75);          // 75 lbs primary resistance\nawait client.setChains(20);          // up to 20 lbs added at full extension\nawait client.setInverseChains(10);   // see \"Inverse chains\" below\nawait client.setEccentric(-25);      // 25 lbs LESS on the eccentric than the concentric\n\n// Get available values for each setting\nconst weights = client.getAvailableWeights();            // [5, 6, 7, ..., 200]\nconst chains = client.getAvailableChains();              // [0, 1, 2, ..., 100]\nconst inverseChains = client.getAvailableInverseChains(); // [0, 1, 2, ..., 100]\nconst eccentric = client.getAvailableEccentric();         // [-195, -194, ..., 195]\n```\n\n`setEccentric` takes **signed pounds, not a percentage.** `setEccentric(-25)`\nagainst a 75 lb setting means 50 lb on the way down, not 25% of 75. The\nparameter was once named `percent`, which is where the misreading comes from.\n\n#### Inverse chains\n\n**Under review.** `setInverseChains(lbs)` accepts 0-100 today, and\n`client.settings.inverseChains` reports what you last asked for. Whether the\ndevice reads that number as an amount of load or as a choice between a few\nfixed behaviours is being re-checked against the hardware, so treat anything\nother than 0 as \"on\" rather than as a calibrated weight until that lands.\nTracked as VW-407.\n\n### Requested vs confirmed settings\n\nA setter resolving means the write reached the device, not that the device\nadopted it. Three views separate those:\n\n| Property | What it holds |\n|----------|---------------|\n| `settings` | Last-known values. Survives a reconnect; the one to render |\n| `requestedSettings` | Written and not yet echoed back by the device |\n| `confirmedSettings` | Reported by the device on the current connection |\n\n```typescript\nawait client.setWeight(75);\nclient.requestedSettings.weight;  // 75 - asked for\nclient.confirmedSettings.weight;  // undefined - the device has not said so yet\n\n// Once the device reports it, the value moves across:\nclient.confirmedSettings.weight;  // 75\nclient.requestedSettings.weight;  // undefined - no longer outstanding\n```\n\nBoth views reset on disconnect, so a value in `confirmedSettings` always came\nfrom the connection you are on. Subscribe to `onSettingsUpdate` to be told when\none moves across.\n\n### Connection and motor state\n\n`connect()` does not resolve when the writes land. It enters\n`'awaitingAcceptance'` and resolves only once the device reports that it\naccepted the connection, then reads device state back once. Control writes are\nrefused while that is pending, and `client.hasConfirmedState` says whether the\nread has been answered. Anything switching exhaustively on `connectionState`\nneeds a case for `'awaitingAcceptance'`.\n\n`client.motorState` is what the device last said about the cable motor:\n`'engaged'` and `'unloaded'` are reports, `'pending'` means a motor command is\nwritten and unanswered, and `'unknown'` means we do not know - including after\na failed write and on every fresh connection.\n\n### Recording Lifecycle\n\n```typescript\n// Option 1: Simple start/stop (stages the device if needed)\nawait client.startRecording();  // Stages then starts\n// ... workout ...\nawait client.stopRecording();   // Asks the device to release (state: 'idle')\n\n// Option 2: Stage ahead of time for lower latency between sets\nawait client.prepareRecording();  // Stages the device (state: 'ready')\nawait client.startRecording();    // Instant start, engages the motor (state: 'active')\nawait client.endSet();            // Release but stay staged (state: 'ready')\nawait client.startRecording();    // Next set instant start\nawait client.stopRecording();     // Release and stand down (state: 'idle')\n\n// Monitor recording state\nconsole.log(client.recordingState);  // 'idle' | 'preparing' | 'ready' | 'active' | 'stopping'\nconsole.log(client.isRecording);     // true when state === 'active'\nconsole.log(client.motorState);      // what the device last reported\n```\n\n`prepareRecording()` **stages the device; it does not engage the motor.** The\nmotor engages on `startRecording()`. Staging ahead of time is what makes the\nnext `startRecording()` a single write instead of a write plus a settling\ndelay.\n\n`stopRecording()` and `endSet()` send the device the same release. They differ\nonly in the recording state the client aims for afterwards (`'idle'` versus\n`'ready'`); neither exits a separate device-side \"workout mode\".\n\nA stop counts as a stop only once the device confirms the release. Without that\nreport `recordingState` stays `'stopping'` and `motorState` is `'unknown'`,\nwhich is retryable rather than a false all-clear. A failed write throws instead\nof being swallowed.\n\n### Real-time Telemetry\n\nReceive movement data at ~11 Hz when recording:\n\n```typescript\n// Subscribe to telemetry frames\nconst unsubscribe = client.onFrame((frame) => {\n  console.log({\n    sequence: frame.sequence,   // Packet sequence number\n    timestamp: frame.timestamp, // Unix ms when received\n    phase: frame.phase,         // MovementPhase enum\n    position: frame.position,   // Position in movement (0-600)\n    velocity: frame.velocity,   // Current velocity\n    force: frame.force,         // Force being applied\n  });\n});\n\n// Unsubscribe when done\nunsubscribe();\n```\n\n### Events and Notifications\n\nThe SDK provides a comprehensive event system for real-time device notifications:\n\n```typescript\n// Subscribe to all events with full type safety\nclient.subscribe((event) => {\n  switch (event.type) {\n    // Connection events\n    case 'connectionStateChanged':\n      console.log('State:', event.state);\n      // 'disconnected' | 'connecting' | 'authenticating' | 'connected'\n      break;\n    case 'connected':\n      console.log(`Connected to ${event.deviceName}`);\n      break;\n    case 'disconnected':\n      console.log(`Disconnected from ${event.deviceId}`);\n      break;\n\n    // Recording events\n    case 'recordingStateChanged':\n      console.log('Recording:', event.state);\n      break;\n\n    // Telemetry events\n    case 'frame':\n      console.log('Telemetry:', event.frame);\n      break;\n\n    // Typed vendor-frame events (0.6.0+)\n    case 'perRep':\n      // Fires twice per rep — pull start (event.event.phase === 'pull')\n      // and return start (event.event.phase === 'return')\n      console.log('Per-rep frame:', event.event);\n      break;\n    case 'inProgress':\n      // ~1 Hz heartbeat with peak/current force, velocity, target weight\n      console.log('In-progress beat:', event.event);\n      break;\n    case 'summary':\n      // Fires once at end-of-set\n      console.log('Set complete:', event.event);\n      break;\n    case 'preSummary':\n      // Fires ~3s before the final rep\n      console.log('Pre-summary:', event.event);\n      break;\n\n    // Device notification events\n    case 'modeConfirmed':\n      console.log('Mode confirmed:', event.mode);\n      break;\n    case 'settingsUpdate':\n      console.log('Device settings:', event.settings);\n      break;\n    case 'batteryUpdate':\n      console.log('Battery:', event.battery, '%');\n      break;\n\n    case 'error':\n      console.error('Error:', event.error);\n      break;\n  }\n});\n```\n\n#### Convenience Subscription Methods\n\nSubscribe to specific event types with dedicated methods:\n\n```typescript\n// Telemetry frames (~11 Hz during recording)\nconst unsubFrame = client.onFrame((frame) => {\n  updateUI(frame.position, frame.velocity, frame.force);\n});\n\n// Per-rep events (typed payload, fires twice per rep)\nconst unsubPerRep = client.onPerRep((event) => {\n  // event.phase: 'pull' | 'return'\n  // event.repCount, event.setCounter, event.targetWeightTenths\n  if (event.phase === 'pull') {\n    repCount++;\n    playRepSound();\n  }\n});\n\n// End-of-set summary (typed payload)\nconst unsubSummary = client.onSummary((event) => {\n  // event.schemaVersion, event.setCounter, event.repCount, event.raw\n  logSetComplete(event.repCount);\n});\n\n// In-progress heartbeat (~1 Hz, typed payload — use sparingly).\n// Every field is a per-rep mean the device repeats until the next rep.\nconst unsubInProgress = client.onInProgress((event) => {\n  // event.meanPullForceTenths, event.meanReturnForceTenths,\n  // event.meanReturnSpeedMmPerSec, event.pullVolumeRawTenths\n  updateForceGauge(event.meanPullForceTenths);\n});\n\n// Per-set summary (renamed from onPreSummary in 0.9.0)\nconst unsubSetSummary = client.onSetSummary((event) => {\n  // event.totalPullMovingTimeMs, event.repCount, event.targetWeightTenths\n  showSetSummary(event.totalPullMovingTimeMs);\n});\n\n// Mode confirmations (after setMode())\nconst unsubMode = client.onModeConfirmed((mode) => {\n  console.log('Mode now active:', mode);\n});\n\n// Settings updates (device reports current state)\nconst unsubSettings = client.onSettingsUpdate((settings) => {\n  // settings: { baseWeight?, chains?, eccentric?, trainingMode? }\n  syncUIWithDevice(settings);\n});\n\n// Battery level updates\nconst unsubBattery = client.onBatteryUpdate((battery) => {\n  showBatteryIndicator(battery);\n});\n\n// Connection state changes\nconst unsubConnection = client.onConnectionStateChange((state) => {\n  updateConnectionUI(state);\n});\n\n// Unsubscribe when done\nunsubFrame();\nunsubPerRep();\n// ... etc\n```\n\n### Mode-config setters (0.6.0)\n\nBeyond the four core resistance settings, 0.6.0 adds setters for the\nremaining mode-specific knobs the device exposes. All persist globally and\nresolve on the BLE write completing — they don't wait for a device echo.\n\n```typescript\nawait client.setDamperLevel(5); // Damper mode (UI shows N+1 → \"6\")\nawait client.setAssistMode('on'); // Assist on/off\nawait client.setBandMaxForce(40); // Resistance band max force (15-70 lbs)\nawait client.setIsokineticTargetSpeed(1500); // 1500 mm/s = 1.5 m/s\nawait client.setIsokineticEccMode('isokinetic');\nawait client.setIsokineticEccSpeedLimit(0); // 0 = auto\nawait client.setIsokineticEccConstWeight(50);\nawait client.setIsokineticEccOverloadWeight(75);\n\n// damperLevel is reflected back from the device's settingsUpdate\n// notifications and surfaced on client.settings:\nconsole.log(client.settings.damperLevel); // 5\n\n// @experimental — register-validated only\nawait client.setTelemetryRate(10);\nawait client.setTelemetrySubscribe('all');\nawait client.setCableTrigger('open');\nawait client.setResistanceExperience('intense');\n```\n\n## Platform-Specific Setup\n\n### React Native\n\n```typescript\nimport { VoltraManager } from '@voltras/node-sdk';\n\n// Use forNative() to get React Native BLE support\nconst manager = VoltraManager.forNative();\n\n// Rest of the API is identical\nconst devices = await manager.scan();\nconst client = await manager.connect(devices[0]);\n```\n\n### React Hooks\n\n```tsx\nimport { useMemo, useState } from 'react';\nimport { VoltraManager, type DiscoveredDevice, type VoltraClient } from '@voltras/node-sdk';\nimport { useVoltraScanner, useVoltraDevice } from '@voltras/node-sdk/react';\n\nfunction WorkoutScreen() {\n  const manager = useMemo(() => VoltraManager.forNative(), []);\n  const [client, setClient] = useState<VoltraClient | null>(null);\n\n  // Scanner hook - manages scan state and discovered devices\n  const { devices, isScanning, scan, error: scanError } = useVoltraScanner(manager);\n\n  // Device hook - tracks connection state and telemetry\n  const { connectionState, isConnected, isRecording, currentFrame, settings } = useVoltraDevice(client);\n\n  const handleConnect = async (device: DiscoveredDevice) => {\n    const connected = await manager.connect(device);\n    await connected.setWeight(50);\n    setClient(connected);\n  };\n\n  return (\n    <View>\n      {/* Scanning */}\n      {!isConnected && (\n        <>\n          <Button onPress={() => scan({ timeout: 10000 })}>\n            {isScanning ? 'Scanning...' : 'Scan for Devices'}\n          </Button>\n          {devices.map((device) => (\n            <Button key={device.id} onPress={() => handleConnect(device)}>\n              {device.name}\n            </Button>\n          ))}\n        </>\n      )}\n\n      {/* Connected */}\n      {isConnected && (\n        <>\n          <Text>Weight: {settings?.weight} lbs</Text>\n          <Text>Position: {currentFrame?.position ?? '--'}</Text>\n          <Button onPress={() => client?.startRecording()}>Start</Button>\n          <Button onPress={() => client?.stopRecording()}>Stop</Button>\n        </>\n      )}\n    </View>\n  );\n}\n```\n\n## Multi-Device Support\n\nConnect to and control multiple Voltra devices simultaneously:\n\n```typescript\nconst manager = new VoltraManager();\n\n// Listen for connection events\nmanager.onDeviceConnected((client, deviceId, deviceName) => {\n  console.log(`Connected: ${deviceName}`);\n  \n  // Configure each device\n  client.setWeight(50);\n  \n  // Handle telemetry per device\n  client.onFrame((frame) => {\n    console.log(`[${deviceName}] pos=${frame.position}`);\n  });\n});\n\nmanager.onDeviceDisconnected((deviceId) => {\n  console.log(`Disconnected: ${deviceId}`);\n});\n\n// Scan and connect to multiple devices\nconst devices = await manager.scan();\nfor (const device of devices) {\n  await manager.connect(device);\n}\n\n// Access specific client by ID\nconst client = manager.getClient(devices[0].id);\n\n// Or iterate all connected clients\nfor (const client of manager.getAllClients()) {\n  await client.startRecording();\n}\n\n// Disconnect all when done\nawait manager.disconnectAll();\n```\n\n## Error Handling\n\n```typescript\nimport {\n  VoltraSDKError,\n  ConnectionError,\n  AuthenticationError,\n  NotConnectedError,\n  InvalidSettingError,\n  CommandError,\n  TimeoutError,\n} from '@voltras/node-sdk';\n\ntry {\n  await manager.connect(device);\n} catch (error) {\n  if (error instanceof ConnectionError) {\n    console.log('Connection failed:', error.code, error.message);\n  } else if (error instanceof AuthenticationError) {\n    console.log('Device authentication failed');\n  } else if (error instanceof TimeoutError) {\n    console.log('Operation timed out');\n  }\n}\n\ntry {\n  await client.setWeight(999); // Invalid weight\n} catch (error) {\n  if (error instanceof InvalidSettingError) {\n    console.log(`Invalid ${error.setting}: ${error.value}`);\n    console.log('Available values:', error.validValues);\n  }\n}\n```\n\n## Examples\n\nComplete working examples for each platform:\n\n| Platform | Description | Code |\n|----------|-------------|------|\n| **Node.js** | CLI app with scanning, settings, and telemetry | [examples/node/](./examples/node) |\n| **Web** | Interactive browser demo with UI | [examples/web/](./examples/web) |\n| **React Native** | Expo app with hooks | [examples/react-native/](./examples/react-native) |\n\n## API Reference\n\n### VoltraManager\n\nMain entry point - handles device discovery and connection management.\n\n```typescript\n// Create with auto-detection (Node resolves to the noble backend)\nconst manager = new VoltraManager();\n\n// Or specify platform\nconst manager = VoltraManager.forWeb();\nconst manager = VoltraManager.forNodeNoble(); // recommended for Node\nconst manager = VoltraManager.forNode();      // legacy webbluetooth backend\nconst manager = VoltraManager.forNative();\n```\n\n`forNode()` cannot enumerate — its `requestDevice` selects the first matching\ndevice and stops scanning — and is not multi-peripheral-safe. Prefer the\nnoble backend, which auto-detection now selects for you.\n\n| Method | Description |\n|--------|-------------|\n| `scan(options?)` | Scan for Voltra devices |\n| `connect(device)` | Connect to a device, returns `VoltraClient` |\n| `connectFirst(options?)` | Connect to first available device |\n| `connectByName(name, options?)` | Scan and connect by device name |\n| `getClient(deviceId)` | Get client for connected device |\n| `getAllClients()` | Get all connected clients |\n| `disconnect(deviceId)` | Disconnect specific device |\n| `disconnectAll()` | Disconnect all devices |\n| `dispose()` | Clean up all resources |\n| `resolvedPlatform` | Platform actually selected, after auto-detection |\n| `resolvedDeviceNamePrefix` | Effective name prefix, or `undefined` when unfiltered |\n\nThe last two are getters, useful when a scan returns nothing and you need to\nknow what the SDK actually chose:\n\n```typescript\nconsole.log(manager.resolvedPlatform, manager.resolvedDeviceNamePrefix);\n```\n\nSee `examples/node/scan-diagnostics.ts` for a ready-made version that also\nprints everything the backend discovered.\n\nDevices are identified by BLE service UUID, so scanning finds every Voltra\nregardless of its advertised name (including one renamed from the vendor\napp). Name-prefix filtering is opt-in — pass `deviceNamePrefix` to the\nconstructor or to `scan()` if you want to additionally restrict results to\nnames starting with a given string:\n\n```typescript\nconst manager = new VoltraManager({ deviceNamePrefix: 'VTR-' });\n// or per scan:\nconst devices = await manager.scan({ deviceNamePrefix: 'VTR-' });\n```\n\n### VoltraClient\n\nControls a single connected device.\n\n| Method | Description |\n|--------|-------------|\n| `setWeight(lbs)` | Set weight (5-200, any integer) |\n| `setChains(lbs)` | Set chains (0-100) |\n| `setInverseChains(lbs)` | Set inverse chains (0-100); under review, see VW-407 |\n| `setEccentric(overloadLbs)` | Set eccentric overload in signed pounds (-195 to +195) |\n| `setMode(mode)` | Set training mode |\n| `prepareRecording()` | Stage the device for a low-latency start |\n| `startRecording()` | Start recording (engages the motor) |\n| `stopRecording()` | Ask the device to release, then stand down |\n| `endSet()` | Release but stay staged |\n| `refreshDeviceState()` | Ask the device to report weight, motor state and mode |\n| `subscribe(callback)` | Subscribe to all events |\n| `onFrame(callback)` | Subscribe to telemetry frames |\n| `onPerRep(callback)` | Subscribe to typed per-rep events (0.6.0+) |\n| `onSummary(callback)` | Subscribe to end-of-set summary events (0.6.0+) |\n| `onSetSummary(callback)` | Subscribe to per-set summary events (0.9.0+) |\n| `onInProgress(callback)` | Subscribe to ~1 Hz in-progress heartbeats (0.6.0+) |\n| `onModeConfirmed(callback)` | Subscribe to mode confirmation events |\n| `onSettingsUpdate(callback)` | Subscribe to device settings updates |\n| `onBatteryUpdate(callback)` | Subscribe to battery level updates |\n| `onConnectionStateChange(callback)` | Subscribe to connection state changes |\n| `disconnect()` | Disconnect from device |\n| `dispose()` | Clean up resources |\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `connectionState` | string | 'disconnected' \\| 'connecting' \\| 'authenticating' \\| 'awaitingAcceptance' \\| 'connected' |\n| `isConnected` | boolean | Whether connected |\n| `recordingState` | string | 'idle' \\| 'preparing' \\| 'ready' \\| 'active' \\| 'stopping' |\n| `isRecording` | boolean | Whether recording is active |\n| `motorState` | string | 'engaged' \\| 'unloaded' \\| 'pending' \\| 'unknown' - what the device reported |\n| `settings` | object | Last-known { weight, chains, inverseChains, eccentric, mode, battery } |\n| `requestedSettings` | object | Written and not yet echoed back |\n| `confirmedSettings` | object | Reported by the device on this connection |\n| `hasConfirmedState` | boolean | Whether the device has answered the state read |\n| `connectedDeviceId` | string | Connected device ID |\n| `connectedDeviceName` | string | Connected device name |\n\n### TelemetryFrame\n\n```typescript\nimport { MovementPhase } from '@voltras/node-sdk';\n\ninterface TelemetryFrame {\n  sequence: number;         // Packet sequence number\n  timestamp: number;        // Unix ms when received\n  phase: MovementPhase;     // Movement phase (see MovementPhase enum)\n  position: number;         // Position in movement (0-600)\n  velocity: number;         // Current velocity\n  force: number;            // Force being applied (signed)\n}\n\n// MovementPhase enum values:\n// IDLE = 0, CONCENTRIC = 1, HOLD = 2, ECCENTRIC = 3, UNKNOWN = -1\n```\n\n## Documentation\n\n### Getting Started Guides\n\nStep-by-step tutorials for using the SDK in your app:\n\n- [Node.js](./docs/getting-started/node.md) - Build a CLI fitness app\n- [Web Browser](./docs/getting-started/web.md) - Build a web-based workout tracker\n- [React Native](./docs/getting-started/react-native.md) - Build a mobile fitness app\n\n### Technical Deep-Dives\n\n- [Platform Adapters](./docs/concepts/platform-adapters.md) - How adapters work across platforms\n\n### Other\n\n- [Troubleshooting](./docs/troubleshooting.md) - Common issues and solutions\n- [Roadmap](./docs/roadmap/) - Planned features\n\n## License\n\nMIT - see [LICENSE](./LICENSE)\n","readmeFilename":"README.md"}