{"_id":"@sendspin/sendspin-js","_rev":"16-af53c5ab1e356ae145cb79c64bb69338","name":"@sendspin/sendspin-js","dist-tags":{"legacy":"2.0.6","latest":"5.0.0"},"versions":{"0.1.0":{"name":"@sendspin/sendspin-js","version":"0.1.0","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@0.1.0","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"108a77573519b0c7cdf26856faef31eba7be3c06","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-0.1.0.tgz","fileCount":47,"integrity":"sha512-PwScNikMcOru6CT5kVhsLanxSW2ekPqSXSdFgNecWjzSorI857Ede/C29HfSx8THctXxPEcWsjd3MOcA+RrLqw==","signatures":[{"sig":"MEUCIQDSZHndb0iorL8DeDR3BxSiSMOTegZKfJeYvcOI23yuagIgdTQax1uHImTAsy8+KJFZOASeEaQ6WNeiFr/cCuFhUVk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":331440},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"fb431516a720c3ec2dfccbdec2be5a1e210d212f","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"11.9.0","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"25.6.1","dependencies":{"opus-encdec":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","prettier":"3.8.1","typescript":"^5.9.3","concurrently":"^9.2.1","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.5","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_0.1.0_1771919826883_0.8284266467872123","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@sendspin/sendspin-js","version":"2.0.1","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@2.0.1","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"9212dae65dc239ce5e60cd0712d96ee84fc75622","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-2.0.1.tgz","fileCount":35,"integrity":"sha512-Q9kIwcjVuU+6VZ8vPhqBB5Ijfw47Ec03XI3Z8qj6cWId7IEb9Sywe1dtjHUKsdHaRZ5M27l/X2MErCg867ydYQ==","signatures":[{"sig":"MEUCIQCyR3RkIkb+uXGpoqDhSvE23XPWX8SyTIuXUBSnvFn0CAIgMQDs6d49FETI/SuQBmg/3iyAe9jb4QzJ1flWL3GWTzM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@2.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":289775},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"7c23ec21816c3bd1d862c614ae2cee49268cf5c5","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"11.10.1","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"20.20.0","dependencies":{"opus-encdec":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","prettier":"3.8.1","typescript":"^5.9.3","concurrently":"^9.2.1","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.5","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_2.0.1_1771920298078_0.03319272439428955","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@sendspin/sendspin-js","version":"2.0.2","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@2.0.2","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"f68398637d4380813a58334f937e8eb5d8a0c83a","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-2.0.2.tgz","fileCount":35,"integrity":"sha512-Jgt71t6kzhcaXWs5hAiYOgN00hshw0UBjHXEgODaH7BsyakTptb6mfRBFnsMU0ML7mqOhViy0JPyctnzjYmEWg==","signatures":[{"sig":"MEYCIQDt85uBA5BK7rfC+TnN+04FNDvR0XBN7LvKNFUqMEr76gIhAJVUdezAWWrBf1ySw+UDo7vMxFZ5hZUgnfCSs98BH0hw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@2.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":334154},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ce20a81a4883e4d031033bd6fe06f62bbcd81912","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"11.11.0","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"20.20.0","dependencies":{"opus-encdec":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","prettier":"3.8.1","typescript":"^5.9.3","concurrently":"^9.2.1","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.5","@rollup/plugin-commonjs":"^29.0.1","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_2.0.2_1772725429211_0.17941415947558448","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@sendspin/sendspin-js","version":"2.0.3","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@2.0.3","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"15c4b3feaaff30f1c1280cc5b0391001025e354c","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-2.0.3.tgz","fileCount":35,"integrity":"sha512-UTNiqMQASqHvpmI9sGhCi+I369WgCQ1xX354ryqeBCC1CfQczHJUhgHhGnfdwLm0ctVYtQgKOyIzJLvM8onT5Q==","signatures":[{"sig":"MEUCIQCDULncQVda1PfMWD3OGhTKKSzHT4lG3B5PjmiDIwdzTwIgZvgzUHVPn4C/MUY8xruKMaRIm7SOKl9dZ3qgnnRF7uY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@2.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":350295},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"d4d3580260501649698796246ab22fcd49009bdf","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"11.11.0","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"20.20.0","dependencies":{"opus-encdec":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","prettier":"3.8.1","typescript":"^5.9.3","concurrently":"^9.2.1","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.5","@rollup/plugin-commonjs":"^29.0.1","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_2.0.3_1772805360636_0.6459055043532584","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"@sendspin/sendspin-js","version":"2.0.4","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@2.0.4","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"bc8e8054109c4f04670724ad322ea519429eae35","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-2.0.4.tgz","fileCount":35,"integrity":"sha512-cP8vRTA7cx8Vi/hQ8/mspvUe1vcZrvRwGEYRWNwAyrBxT9r+EtPQr6t7E6n2mupFnwVyCqH2iTxCv23WQOxySA==","signatures":[{"sig":"MEUCIFSmqHGWqvD/mj/BUcN2QAH2I/rAPhSrHAjSTwyCLSkSAiEAuZIoAgGuvsxmcIXGvg0uQb8pBUYcj8mXi73v7bwL1Jc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@2.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":352532},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"1b4191156731f24c8056aa7bd4022fa54fd511f1","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"11.12.0","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"20.20.1","dependencies":{"opus-encdec":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","prettier":"3.8.1","typescript":"^5.9.3","concurrently":"^9.2.1","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.5","@rollup/plugin-commonjs":"^29.0.1","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_2.0.4_1774271488935_0.799440545164178","host":"s3://npm-registry-packages-npm-production"}},"2.0.5":{"name":"@sendspin/sendspin-js","version":"2.0.5","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@2.0.5","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"7bcd64340f36d1027a59d949199873a5771c0c02","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-2.0.5.tgz","fileCount":35,"integrity":"sha512-bfCV4EDWTnRO+C5anWktKP2pSLKBCPrQkN9vwLhwq2OC8VFAwaEFgfWDjtYQ6AIfk25PQtqc6Rs5cnEebB1jYg==","signatures":[{"sig":"MEQCIBmm/kdGZryl/nYaLQfcLP+V4GrNJSDW38GYMFLosy8bAiAneMw71a9Y80vSFYksGHyO/+wqEj4bDwYJaP7Mjm7BQw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@2.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":353890},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"421bf0c851a45f7c6e8270128f7144ee8e56cbda","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"11.12.0","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"20.20.1","dependencies":{"opus-encdec":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","prettier":"3.8.1","typescript":"^5.9.3","concurrently":"^9.2.1","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.5","@rollup/plugin-commonjs":"^29.0.1","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_2.0.5_1774372096740_0.7323542321850207","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@sendspin/sendspin-js","version":"3.0.0","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@3.0.0","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"8ddc9646f932e4925d08f5c0a2420d96e4f4bf87","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-3.0.0.tgz","fileCount":35,"integrity":"sha512-C89F50mt4JJgMmdFDSHTsYju1icWq9DNcd8248PUcuFxOsN3pLkS0PH8WvXauXAohpMHPsYix7PrB6POogVCNA==","signatures":[{"sig":"MEQCIHJc/xpI8vhWobs8x3ZI7podoXHyT1uOtmln/aJVjrmvAiAPULfjwCy/0DzfBYq0jtYUot3JsHK8t01m3sqD21nW6Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":351927},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"6ca9517bc94661e2dd5056aca23ba99968d82f8c","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"11.12.1","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"20.20.2","dependencies":{"opus-encdec":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","prettier":"3.8.1","typescript":"^6.0.2","concurrently":"^9.2.1","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.5","@rollup/plugin-commonjs":"^29.0.1","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_3.0.0_1775727748899_0.49730416632999086","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@sendspin/sendspin-js","version":"3.0.1","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@3.0.1","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"6663335dcd42f1c490cbaac31ac520201a41f84e","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-3.0.1.tgz","fileCount":35,"integrity":"sha512-tO/hGtSrojtn2xyVNxuzlrUjuI2sIOW1M9X0d1gOREbNjbIAAZA6O5Y8bOSBkruH1LdBiVjDjcgeBV0qMN/HnA==","signatures":[{"sig":"MEYCIQC/Qd01gpK0e2zSBS1xceCEKvTD0v9CxO1Y3Gl9e3lc5AIhANV06E8s4Z07nRGNAqiz/400h/TNIXC4rJffe8Y0YXrx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@3.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":351590},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"c76757cfd1b1dd3bda4fedb66e8bedde9f97761e","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"11.12.1","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"20.20.2","dependencies":{"opus-encdec":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","prettier":"3.8.1","typescript":"^6.0.2","concurrently":"^9.2.1","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.5","@rollup/plugin-commonjs":"^29.0.1","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_3.0.1_1775813813405_0.6319099615798422","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"@sendspin/sendspin-js","version":"3.0.2","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@3.0.2","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"7acec8e495086460b029317ea1581a2c4666fcf6","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-3.0.2.tgz","fileCount":35,"integrity":"sha512-UHZGABa+sTRQotowYntmd72WeVb376sWB7niNvPbzOfH1CFpLRraS/gNBbnk6VmjQeGf7BSBhQLh4LTD4xHVUg==","signatures":[{"sig":"MEUCIQDrjoLs1onOLDOQGlY97c/UCDxyDu82RRLm0EiXl7LAVAIgECcRZZDBI8OPm3hZFibi/hrvVfUpwHn1+aIVOW3+oVc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@3.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":362491},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"c9388a6a1d098d5c9304d850f25838ffb7fd588f","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"11.12.1","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"20.20.2","dependencies":{"opus-encdec":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","prettier":"3.8.1","typescript":"^6.0.2","concurrently":"^9.2.1","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.5","@rollup/plugin-commonjs":"^29.0.1","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_3.0.2_1776080179137_0.46595835704883215","host":"s3://npm-registry-packages-npm-production"}},"3.0.3":{"name":"@sendspin/sendspin-js","version":"3.0.3","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@3.0.3","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"3a908694b3b696f666e5b5fdfeb2621a2c8944bf","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-3.0.3.tgz","fileCount":35,"integrity":"sha512-fGSlfxm5iuNLxaTOFFBarP2ZY7jA8B/sOQxYP4Z9jgImF2L8TA3aYO3xbg1uTTbrkpnSa5vZsB+lmOZK0nM+Cw==","signatures":[{"sig":"MEUCIHobZDoy5Eg8KU6vUvLHOT4lG2s8EZq0ZU/slw/iyAiCAiEAmh9u7D1WCB9iZg6alKPL8jxeEPD2RLCIMU5Gqg0tIKI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@3.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":362813},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"7f388ca24d897c77229e71d8831c68fce9b9bc0d","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"11.12.1","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"20.20.2","dependencies":{"opus-encdec":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","prettier":"3.8.2","typescript":"^6.0.2","concurrently":"^9.2.1","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.5","@rollup/plugin-commonjs":"^29.0.1","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_3.0.3_1776257590491_0.5304712172027135","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"@sendspin/sendspin-js","version":"3.1.0","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@3.1.0","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"b62b6447dcb4740bf3c61aafc20097b21f9de63e","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-3.1.0.tgz","fileCount":71,"integrity":"sha512-tljpoE7JwGIvAMk9M+UBGKkur4ME1RyZRxIV/FFJ0trp6fJOC5bWjewaO8bgm9ybEKO64su5PMbn/u63YzlaMQ==","signatures":[{"sig":"MEUCIDVo659pVBmdqGE2Mr17pH43HZutBKGq2TNf6AVraWsLAiEAhr4pYTu+YCqSn++Q06ipwt3OVsWVSU+AxY9n95W2juE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@3.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":402382},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f64929f988d95b6049e2b6022004a2081680dba4","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"11.12.1","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"20.20.2","dependencies":{"opus-encdec":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","prettier":"3.8.3","typescript":"^6.0.2","concurrently":"^9.2.1","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.5","@rollup/plugin-commonjs":"^29.0.1","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_3.1.0_1776889523819_0.6051563089229914","host":"s3://npm-registry-packages-npm-production"}},"2.0.6":{"name":"@sendspin/sendspin-js","version":"2.0.6","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@2.0.6","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"266c878a523be4982ea42bcd31f9ac618b86924c","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-2.0.6.tgz","fileCount":35,"integrity":"sha512-bPW1fmauH2Gvn7jZ9umrksljL7UgPRyZ2oZbiJ7PxL6Tcd6TnLLcw0AHvb+DhGFvRkcueXSBm7/u7jmUEfY4Og==","signatures":[{"sig":"MEQCIBlZ/cd1xcvuvRcwR7xF/pkGnkdDxpmEGOYUxn1gWeLWAiBdJ2Uk3XmVkou06ygTqkJfJUmMeZhog7igN9tWMbxIdA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@2.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":360456},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f573641e3816777c2a6a527def6fa054970a86b1","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"11.13.0","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"20.20.2","dependencies":{"opus-encdec":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","prettier":"3.8.1","typescript":"^5.9.3","concurrently":"^9.2.1","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.5","@rollup/plugin-commonjs":"^29.0.1","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_2.0.6_1777295600277_0.7974893008119976","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"@sendspin/sendspin-js","version":"3.2.0","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@3.2.0","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"504b8cc10c61722ea02541b4dc98ce1005e82ed7","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-3.2.0.tgz","fileCount":75,"integrity":"sha512-sxMibcr9eiue5yT0viXxCruq8LTRSEzaz9epmhSp3Qe4gHcksE+JwFOTEJfgkY5kJBmPq22CkYlyvJXcHacK2g==","signatures":[{"sig":"MEUCIQC9dGZrNl9gWhSyGpIOUDDE1cav8FR4YGaVuTgd0fe6+gIgcE12KEI6VOhndpH0hwGAqtKiwgENTuLngOWyAfkhizg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@3.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":416507},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"680ef5c1647138fd5c088f0c728fc8902a760de2","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","test":"vitest run","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"11.16.0","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"24.16.0","dependencies":{"opus-encdec":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.20.0","husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","vitest":"^4.1.4","prettier":"3.8.3","@types/ws":"^8.18.1","typescript":"^6.0.2","concurrently":"^10.0.3","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.6","@rollup/plugin-commonjs":"^29.0.1","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_3.2.0_1780911262774_0.7908417871665654","host":"s3://npm-registry-packages-npm-production"}},"3.2.1":{"name":"@sendspin/sendspin-js","version":"3.2.1","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@3.2.1","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"be59057472e27b65742b7faea26e383e1cb4e4ef","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-3.2.1.tgz","fileCount":75,"integrity":"sha512-FlnHUV2hppNg/W3yIvV0v9XmDkHE/tbmHkc2/wWDE9CMfqNdCkGhaTsd4cRa4n5FafS3wTDccceFtPvNiacKvg==","signatures":[{"sig":"MEYCIQCdGOF1ifpGeUJ9+csjh8PfopcwvkBhosg2RSoVL/Qc4QIhAMSiOwNTa6XrEKrdeR8GXi44LRzasvGQQr1hEWwfUCU7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@3.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":421484},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"830e8f1062b44746606b368e7e8823fe565f8b3c","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","test":"vitest run","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"12.0.1","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"24.18.0","dependencies":{"opus-encdec":"^0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.20.0","husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","vitest":"^4.1.4","prettier":"3.9.4","@types/ws":"^8.18.1","typescript":"^6.0.2","concurrently":"^10.0.3","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.6","@rollup/plugin-commonjs":"^29.0.1","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_3.2.1_1784292656457_0.6248840517950838","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"name":"@sendspin/sendspin-js","version":"4.0.0","keywords":["audio","streaming","music-assistant"],"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","_id":"@sendspin/sendspin-js@4.0.0","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"dist":{"shasum":"a520fd0bb06344802873b26bd6f2c45d5b861d17","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-4.0.0.tgz","fileCount":143,"integrity":"sha512-PbPLZIzaeSQVKYKYI2bT+YPhE8RdhlHmLE6Ifr7yCZEx8KEOKkRbLmvzWvvEl+9fu9GsxafVs9VxXbJAiW8reA==","signatures":[{"sig":"MEYCIQDGwq1g4wp8xkUH+/RyuExYgspL/5uH/f6l9UhY4TLgtwIhANLHqfhIaaCmFEEiYmL12IADLG/4Z5py79jFyJg9FfnH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@4.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":615999},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=16.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8ba96a1612da806e0b0ea78ac84f945988b1b6fd","scripts":{"dev":"tsc --watch","lint":"eslint . --fix --ignore-path .gitignore","test":"vitest run","build":"tsc","prepare":"husky","prebuild":"node scripts/bundle-silent-audio.js","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","test:watch":"vitest","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"repository":{"url":"git+https://github.com/Sendspin/sendspin-js.git","type":"git"},"_npmVersion":"12.0.2","description":"TypeScript client library for the Sendspin synchronized audio protocol","directories":{},"_nodeVersion":"24.18.0","dependencies":{"opus-encdec":"^0.1.1","@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","@noble/ciphers":"^1.2.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.20.0","husky":"^9.1.7","serve":"^14.2.5","eslint":"8.57.1","rollup":"^4.54.0","vitest":"^4.1.4","prettier":"3.9.6","@types/ws":"^8.18.1","typescript":"^6.0.2","concurrently":"^10.0.3","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.6","@rollup/plugin-commonjs":"^29.0.1","@typescript-eslint/parser":"6.21.0","@rollup/plugin-node-resolve":"^16.0.3","@typescript-eslint/eslint-plugin":"7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sendspin-js_4.0.0_1785918380991_0.3443557812172324","host":"s3://npm-registry-packages-npm-production"}},"5.0.0":{"name":"@sendspin/sendspin-js","version":"5.0.0","type":"module","description":"TypeScript client library for the Sendspin synchronized audio protocol","main":"dist/index.js","module":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"scripts":{"prebuild":"node scripts/bundle-silent-audio.js","build":"tsc","dev":"tsc --watch","dev-server":"rm -rf public/dev && concurrently \"tsc --watch\" \"rollup -c --watch\" \"serve . -l 6001\"","pretest":"node scripts/bundle-silent-audio.js","test":"vitest run","test:watch":"vitest","lint":"eslint . --fix --ignore-path .gitignore","prepare":"husky","prepublishOnly":"npm run build"},"keywords":["audio","streaming","music-assistant"],"license":"Apache-2.0","author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"repository":{"type":"git","url":"git+https://github.com/Sendspin/sendspin-js.git"},"homepage":"https://github.com/Sendspin/sendspin-js#readme","bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"engines":{"node":">=16.0.0"},"devDependencies":{"@rollup/plugin-commonjs":"^29.0.1","@rollup/plugin-node-resolve":"^16.0.3","@types/ws":"^8.18.1","@typescript-eslint/eslint-plugin":"7.0.0","@typescript-eslint/parser":"6.21.0","concurrently":"^10.0.3","eslint":"8.57.1","eslint-config-prettier":"10.1.8","eslint-plugin-prettier":"5.5.6","husky":"^9.1.7","prettier":"3.9.6","rollup":"^4.54.0","serve":"^14.2.5","typescript":"^6.0.2","vitest":"^4.1.4","ws":"^8.20.0"},"publishConfig":{"access":"public"},"dependencies":{"@noble/ciphers":"^1.2.1","@noble/curves":"^1.8.1","@noble/hashes":"^1.7.1","opus-encdec":"^0.1.1"},"gitHead":"7d103075138dda5c8909045647bb42b33c2d44fc","_id":"@sendspin/sendspin-js@5.0.0","_nodeVersion":"24.18.0","_npmVersion":"12.0.2","dist":{"integrity":"sha512-yRRjPsz6TyR1GzRYO7ur7oAzwZ11tELK1PEp6Ci7fscXOI0JdtP6BbwPhw+/CR0TWQxu/VwtVPtXT9SH/xhzFw==","shasum":"64f32335dc4025b988890a5fdbaf7880f73782e2","tarball":"https://registry.npmjs.org/@sendspin/sendspin-js/-/sendspin-js-5.0.0.tgz","fileCount":147,"unpackedSize":627386,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@sendspin%2fsendspin-js@5.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCiz+OqQqdgVbYTHWL5eIUEucJDtC8Sf8ka1c8NXHzRdAIhAOWFbvUYToJ89dE7QtclrMdtCE5BaV/Enq2KlbzrXojN"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9052880-8f5a-410f-879c-eb8c91754eda"}},"directories":{},"maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sendspin-js_5.0.0_1786441423572_0.023360123333328486"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-24T07:57:06.766Z","modified":"2026-08-11T09:43:44.037Z","0.1.0":"2026-02-24T07:57:07.045Z","2.0.1":"2026-02-24T08:04:58.276Z","2.0.2":"2026-03-05T15:43:49.371Z","2.0.3":"2026-03-06T13:56:00.786Z","2.0.4":"2026-03-23T13:11:29.108Z","2.0.5":"2026-03-24T17:08:16.910Z","3.0.0":"2026-04-09T09:42:29.036Z","3.0.1":"2026-04-10T09:36:53.553Z","3.0.2":"2026-04-13T11:36:19.313Z","3.0.3":"2026-04-15T12:53:10.630Z","3.1.0":"2026-04-22T20:25:24.028Z","2.0.6":"2026-04-27T13:13:20.480Z","3.2.0":"2026-06-08T09:34:22.968Z","3.2.1":"2026-07-17T12:50:56.588Z","4.0.0":"2026-08-05T08:26:21.127Z","5.0.0":"2026-08-11T09:43:43.739Z"},"bugs":{"url":"https://github.com/Sendspin/sendspin-js/issues"},"author":{"name":"Sendspin Protocol Authors","email":"sendspin@openhomefoundation.org"},"license":"Apache-2.0","homepage":"https://github.com/Sendspin/sendspin-js#readme","keywords":["audio","streaming","music-assistant"],"repository":{"type":"git","url":"git+https://github.com/Sendspin/sendspin-js.git"},"description":"TypeScript client library for the Sendspin synchronized audio protocol","maintainers":[{"name":"maximmaxim345","email":"maxim.raznatovski@openhomefoundation.org"},{"name":"balloob","email":"balloob@gmail.com"}],"readme":"# sendspin-js\n\n[![npm](https://img.shields.io/npm/v/@sendspin/sendspin-js.svg)](https://www.npmjs.com/package/@sendspin/sendspin-js)\n\nTypeScript client library implementing the [Sendspin Protocol](https://www.sendspin-audio.com) for clock-synchronized audio streaming.\n\nSee the SDK website to see Sendspin JS in action: https://sendspin.github.io/sendspin-js/\n\n[![A project from the Open Home Foundation](https://www.openhomefoundation.org/badges/ohf-project.png)](https://www.openhomefoundation.org/)\n\n## Example\n\n```typescript\nimport { SendspinPlayer } from '@sendspin/sendspin-js';\n\nconst player = new SendspinPlayer({\n  baseUrl: 'http://your-server:8095',\n  clientName: 'My Web Player',\n  productName: 'My App',\n  // Optional: \"sync\" (default), \"quality\" (no pitch shifts; not recommended for bad networks),\n  // or \"quality-local\" (best for unsynced playback)\n  correctionMode: 'sync',\n  onStateChange: (state) => {\n    // Local player state\n    console.log('Playing:', state.isPlaying);\n    console.log('Volume:', state.volume, 'Muted:', state.muted);\n\n    // Server state (metadata, controller info)\n    if (state.serverState?.metadata) {\n      const meta = state.serverState.metadata;\n      console.log('Track:', meta.title, '-', meta.artist);\n    }\n\n    // Group state (playback state, group info)\n    if (state.groupState) {\n      console.log('Group:', state.groupState.group_name);\n      console.log('Playback:', state.groupState.playback_state);\n    }\n  }\n});\n\nconst connectButton = document.querySelector<HTMLButtonElement>('#connect')!;\nconnectButton.addEventListener('click', async () => {\n  // Keep this as the first awaited work in the click/tap handler.\n  await player.unlock();\n  await player.connect();\n});\n\n// Local volume control (affects this player only)\nplayer.setVolume(80);\nplayer.setMuted(false);\n\n// Send commands to server (controls the source)\nplayer.sendCommand('play');\nplayer.sendCommand('pause');\nplayer.sendCommand('stop');\nplayer.sendCommand('next');\nplayer.sendCommand('previous');\nplayer.sendCommand('volume', { volume: 50 });\nplayer.sendCommand('mute', { mute: true });\nplayer.sendCommand('shuffle');\nplayer.sendCommand('unshuffle');\nplayer.sendCommand('repeat_off');\nplayer.sendCommand('repeat_one');\nplayer.sendCommand('repeat_all');\nplayer.sendCommand('switch');  // Switch group\n\n// Disconnect with reason (optional)\nplayer.disconnect('user_request');\n```\n\nCall `unlock()` directly from a click or tap handler, before any other awaited\nwork, so the browser can initialize or resume audio during the user gesture.\n\n## Advanced configuration\n\n### Bring your own WebSocket\n\nProvide an already-open (or CONNECTING) `WebSocket` via `webSocket` to let the\nplayer adopt it instead of creating a new one. Useful when the connection is\nmanaged by a surrounding app framework. Auto-reconnect is disabled for adopted\nsockets.\n\n```typescript\nconst ws = new WebSocket('ws://your-server:8095/sendspin');\nconst player = new SendspinPlayer({\n  clientName: 'My Player',\n  webSocket: ws,\n});\nawait player.unlock();\nawait player.connect();\n```\n\n### Reconnect behavior\n\nBuilt-in auto-reconnect uses exponential backoff (1s → 15s, unlimited\nattempts). Override the bounds, cap the retry count, or hook callbacks to\ndrive UI and fatal-error paths via `reconnect`.\n\n```typescript\nconst player = new SendspinPlayer({\n  baseUrl: 'http://your-server:8095',\n  reconnect: {\n    baseDelayMs: 1000,\n    maxDelayMs: 15000,\n    maxAttempts: 7,\n    onReconnecting: (attempt) => console.log(`Reconnecting (attempt ${attempt})`),\n    onReconnected: () => console.log('Reconnected'),\n    onExhausted: () => console.log('Giving up'),\n  },\n});\n```\n\nReconnection only applies to connections opened via `baseUrl`; adopted\nsockets (`webSocket`) never auto-reconnect.\n\n### Tuning correction thresholds\n\nOverride the per-mode thresholds that control when/how the scheduler corrects\ndrift. Unspecified fields keep their defaults.\n\n```typescript\nconst player = new SendspinPlayer({\n  baseUrl: 'http://your-server:8095',\n  correctionMode: 'sync',\n  correctionThresholds: {\n    sync: {\n      resyncAboveMs: 400,   // tolerate more drift before hard resync\n      deadbandBelowMs: 2,   // ignore errors under 2ms\n    },\n  },\n});\n```\n\n### Buffer timing\n\nReport the startup lead time and ongoing jitter buffer the player needs to the\nserver via `client/state`. Lower values mean lower latency at the risk of\nunderruns. Defaults are `requiredLeadTimeMs: 250` and `minBufferMs: 250`.\n\n```typescript\nconst player = new SendspinPlayer({\n  baseUrl: 'http://your-server:8095',\n  requiredLeadTimeMs: 250,  // startup warmup (codec init, decode, DAC)\n  minBufferMs: 250,         // ongoing buffer to absorb network jitter\n});\n```\n\nBoth can be updated at runtime, e.g. after measuring real lead time post-warmup\nor on a link-type change. Debounce updates so transient fluctuations don't churn\nserver-side timing.\n\n```typescript\nplayer.setRequiredLeadTimeMs(300);\nplayer.setMinBufferMs(1500);\n```\n\n### Encryption and pairing\n\nEvery connection is encrypted (Noise KKpsk2). By default the SDK connects\nwith an unpaired (Sentinel-PSK) identity; pair with a server to upgrade to a\ntrusted, per-server long-term PSK.\n\n```typescript\nconst player = new SendspinPlayer({\n  baseUrl: 'http://your-server:8095',\n  suite: 'chacha',            // \"chacha\" (default) or \"aesgcm\"\n  unpairedAccess: true,       // admit unpaired playback; default true (see note below)\n  longTermPsks: [\n    { psk: 'base64url-psk', serverId: 'optional-server-id' },\n  ],\n  onPairing: (event, detail) => {\n    // event: \"pending\" | \"started\" | \"finalized\" | \"aborted\"\n    // \"pending\" means the attempt is waiting for openPairingWindow().\n    console.log('Pairing:', event, detail);\n  },\n  // Dynamic PIN pairing: show the derived PIN to the operator (null = hide).\n  // languages carries the operator's spoken-PIN preference, when the server sends one.\n  onPairingPin: (pin, languages) => showPinDialog(pin, languages),\n  minPinLength: 6,            // shortest dynamic PIN this client accepts (4-12)\n  // Advertise \"speaker\" if the app can speak the PIN; `languages` says which language to use.\n  pinOutChannels: ['display'],\n  // Static PIN pairing: this device's fixed 8-digit PIN.\n  staticPin: '31415926',\n  // Where the operator finds each secret, if you know. Any combination of\n  // device | leaflet | operator. Omitted from client/hello when unset.\n  staticPinLocations: ['device', 'leaflet'],\n});\n\nawait player.connect();\n```\n\nUnpaired playback authenticates with the well-known Sentinel PSK, so it is\nexposed to an active man-in-the-middle. While it's on by default, you can set `unpairedAccess: false` to require pairing before any playback.\n\nThe SDK supports all three pairing methods from the spec:\n\n- **Pairing PSK** (always available): transfer the client-bound pairing token.\n- **Dynamic PIN** (enabled by `onPairingPin`): the server starts pairing, the\n  SDK derives a one-time PIN and passes it to `onPairingPin` for display; the\n  operator enters it into the server.\n- **Static PIN** (enabled by `staticPin`): the operator enters this device's\n  fixed 8-digit PIN into the server, then makes a local gesture that calls\n  `player.openPairingWindow()` (window lasts ~5 minutes, one attempt).\n\nSome attempts are **gesture-gated**: the SDK withholds `client/pair-init` until\n`openPairingWindow()` is called, signalling `client/pair-pending` meanwhile and\nfiring `onPairing(\"pending\")`. That applies to every static PIN attempt, and to\ndynamic PIN when the method has escalated or the server picked a PIN shorter\nthan 6 digits. Ten consecutive dynamic-PIN failures escalate the method, and any\nlater success de-escalates it.\n\n```typescript\nconsole.log('Client ID:', player.clientId);              // 43-char base64url pubkey\nconsole.log('Pairing token:', player.pairingToken);      // spec version 0, or null without storage\n\n// Rotate the Pairing PSK (e.g. if it may have leaked)\nconst newPsk = player.rotatePairingPsk();\n\nplayer.openPairingWindow();                      // operator gesture for a gated attempt\nplayer.cancelPairing();                          // abort an in-progress attempt\nplayer.isDynamicPinEscalated();                  // gesture-gated after 10 failures\n```\n\nPairing requires a server speaking the current specification. A non-compliant\nserver announces the pairing method in a field this SDK no longer reads, so the\nactivation arrives without one and the client closes the connection as a\nprotocol error, logging the reason to the console.\n\n`player.pairingToken` is the version 0 token defined by the current specification.\nIdentity and pairing require `storage` (defaults to `localStorage`); without\nit, `clientId` is still generated per session but `pairingPsk`,\n`pairingToken`, and `rotatePairingPsk()` return `null`.\n\nApps that key their own state on the client id can read it before a player\nexists. A player built afterwards on the same storage adopts this identity.\n\n```typescript\nimport { loadSendspinClientIdentity } from '@sendspin/sendspin-js';\n\nconst { clientId, pairingPsk, pairingToken } = loadSendspinClientIdentity();\n```\n\n### Core + scheduler as separate layers\n\nApps that need the decoded PCM stream (e.g. visualizers) can use\n`SendspinCore` on its own and skip the playback layer. `SendspinCore` emits\n`DecodedAudioChunk` events; `AudioScheduler` is the Web Audio consumer that\n`SendspinPlayer` wires for you.\n\n```typescript\nimport { SendspinCore } from '@sendspin/sendspin-js';\n\nconst core = new SendspinCore({\n  baseUrl: 'http://your-server:8095',\n});\n\ncore.onAudioData = (chunk) => {\n  // chunk.samples: Float32Array per channel\n  // chunk.sampleRate, chunk.serverTimeUs, chunk.generation\n};\n\nawait core.connect();\n```\n\n## Local development\n\n```\nyarn dev-server\n```\n\nThen browse to http://localhost:6001\n\n## Testing\n\nThe E2E tests run directly against\n[aiosendspin](https://github.com/Sendspin/aiosendspin). Bootstrap the `.venv`\nonce:\n\n```\n./scripts/setup.sh\n```\n\nThen:\n\n```\nyarn test         # unit + E2E\nyarn test:watch   # watch mode\n```\n\nTo run a single suite, pass the path: `npx vitest run tests/unit` or\n`npx vitest run tests/e2e`.\n","readmeFilename":"README.md"}