{"_id":"@alliumcloud/spatial-comms","_rev":"43-340c7e0248d7fdf2c5e16eb9fd75aba3","name":"@alliumcloud/spatial-comms","dist-tags":{"latest":"2.0.6"},"versions":{"1.0.1":{"name":"@alliumcloud/spatial-comms","version":"1.0.1","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.1","maintainers":[{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk","bugs":{"url":"https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk/issues"},"dist":{"shasum":"d24217a984e4c22f2253c9841cb97baaee64b107","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.1.tgz","fileCount":8,"integrity":"sha512-8Fwbvpm2WiFqgOJlLvVYqk/AB6QLqKZ1/1jfip6hQTth1YrnC29gTxpYjlxkQ/4bu5Aek9O0DzQIJBc04mytPA==","signatures":[{"sig":"MEQCIB+FmvmHfQT9cnJI+auPsOlkUpjVvmxeCXeQlE02PxiQAiAbcHMAoVOG35u2/oj4/KuM9AQBEwgWt/3C4TPxplDFYw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":912242},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","browser":true,"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"cd4e9934e1565a45f2c8f45c67a8bd8e08bc5c0a","scripts":{"dev":"tsup --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","lint:fix":"eslint src/**/*.ts --fix","typecheck":"tsc --noEmit","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run typecheck && npm run build"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"repository":{"url":"git+https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"sideEffects":false,"_nodeVersion":"24.8.0","dependencies":{"stream-chat":"^8.0.0","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","tsup":"^8.0.0","husky":"^9.1.7","dotenv":"^17.3.1","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.1_1778906677573_0.1812157318674481","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@alliumcloud/spatial-comms","version":"1.0.2","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.2","maintainers":[{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk","bugs":{"url":"https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk/issues"},"dist":{"shasum":"f3ce922b8573dca379317d71a71b46f381470a65","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.2.tgz","fileCount":8,"integrity":"sha512-7WBJsVTYZHs86gjComTilG8SBk6Epzz0bzjscIu8giwEziybYgk2lf8UZxrDVGx9PtjlQq9gRhMxYluWwlUkOg==","signatures":[{"sig":"MEUCIQCZuwLMq4JI4ZHcfW3L2+0q5VUDtgyGMqBPz5Rgn9cJWgIgBjAcTlOq1M6dc3Ccjhj4AEJLkAWkeAxx5NSuva/fvvk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":912299},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","browser":true,"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"4922064209d3d30951968fc82ef355eac8c706c8","scripts":{"dev":"tsup --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","lint:fix":"eslint src/**/*.ts --fix","typecheck":"tsc --noEmit","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run typecheck && npm run build"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"repository":{"url":"git+https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"sideEffects":false,"_nodeVersion":"24.8.0","dependencies":{"stream-chat":"^8.0.0","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","tsup":"^8.0.0","husky":"^9.1.7","dotenv":"^17.3.1","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.2_1778907480555_0.2501928234059969","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@alliumcloud/spatial-comms","version":"1.0.3","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.3","maintainers":[{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk","bugs":{"url":"https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk/issues"},"dist":{"shasum":"7ef445a721d3604bcc4d4f5b8d679be97a9f145e","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.3.tgz","fileCount":8,"integrity":"sha512-g3N9dlR/Rrz+CwYgOPcCx0Vs6tMnz3kmZ9luMa4Zpkv3gQP2oaii9hgycy1vum7ONC6yR031IU7wpaMht0S5dw==","signatures":[{"sig":"MEUCIQDejKCjM3tc33iMrS1v0h4203tXH4C2x4NzHdf2VVlibQIgbpIs4DsqSzeQF0+aM5OzBZDQNWZ/zLJ3hK6Hy37FUB4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":913639},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","browser":true,"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"a2c1dce43f3489ed9aec06e10c9d85fb5da0822e","scripts":{"dev":"tsup --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","lint:fix":"eslint src/**/*.ts --fix","typecheck":"tsc --noEmit","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run typecheck && npm run build"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"repository":{"url":"git+https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"sideEffects":false,"_nodeVersion":"24.8.0","dependencies":{"stream-chat":"^8.0.0","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","tsup":"^8.0.0","husky":"^9.1.7","dotenv":"^17.3.1","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.3_1779083653656_0.7151197039803368","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@alliumcloud/spatial-comms","version":"1.0.4","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.4","maintainers":[{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk","bugs":{"url":"https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk/issues"},"dist":{"shasum":"d75c8862f9bc6da08426931b1949b43c1f22aa5b","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.4.tgz","fileCount":8,"integrity":"sha512-vRGWG4brzUHCSe8pn1i+wlYTxhfQ+Mto+mp/rlCiegs6PiqsAb5HBZYVII/rnLaGwhIyiDhGjwqKFP7A5INAkg==","signatures":[{"sig":"MEUCIFjXix+rTlUdYXOfXXJYa7ojBWBk1Zikl64uG5P1GvDqAiEA8IcinFVe1qWARDF3MehM9zIpvr9ybitjCiddzQhCK0c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1073205},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","browser":true,"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"f356cad40d76fb7a714915c42514d48992f0c3c4","scripts":{"dev":"tsup --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","lint:fix":"eslint src/**/*.ts --fix","typecheck":"tsc --noEmit","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run typecheck && npm run build"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"repository":{"url":"git+https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"sideEffects":false,"_nodeVersion":"24.8.0","dependencies":{"stream-chat":"^8.0.0","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","tsup":"^8.0.0","husky":"^9.1.7","dotenv":"^17.3.1","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.4_1779603593902_0.9599279084223107","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@alliumcloud/spatial-comms","version":"1.0.5","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5","maintainers":[{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk","bugs":{"url":"https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk/issues"},"dist":{"shasum":"40bf9d015392c1a28606bda6fed00b304f088111","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5.tgz","fileCount":8,"integrity":"sha512-S6g6DwvA+y4nktUUGEMM41QAkaPTs0UA5kj+rY1icO6jwVnuG1oh0ehBvVh/R+mL6E/Oqn3mMiIPFDFaZ0OeBA==","signatures":[{"sig":"MEUCIQCZxlFp5cvTdyO4KDF64AyaIrRlMm5ruSuJl/QXdEyGZQIgdfc9JkTRJWFhYySN7SN5SKxGxM+L4Uah4+ZqNjtMtqg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1073213},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","browser":true,"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","browser":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"baa4ca1abc23ee5d1215a35a56bcccd96cd0f5d7","scripts":{"dev":"tsup --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","lint:fix":"eslint src/**/*.ts --fix","typecheck":"tsc --noEmit","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run typecheck && npm run build"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"repository":{"url":"git+https://github.com/New-Game-Plus-Inc/odyssey-mediasoup-sdk.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"sideEffects":false,"_nodeVersion":"24.8.0","dependencies":{"stream-chat":"^8.0.0","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","tsup":"^8.0.0","husky":"^9.1.7","dotenv":"^17.3.1","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5_1779650533682_0.17250933440165483","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-dev.0":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-dev.0","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-dev.0","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"cacf191b11b29b8abc178a329d0ef3e254df83e9","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-dev.0.tgz","fileCount":8,"integrity":"sha512-irF8SJPUXpFXhk+SylmHZ4IIdXa+D5L20TkwvFi0wN6LcCNMYHH1LeulnY4gEC8xccGuxu6C60Lipr97jmoHDQ==","signatures":[{"sig":"MEUCIQCEkl9HCyv3zX7r/bKR7DCDZ5M48AINABb8v50vY9GUFwIgMMeAM/hsKe9576bw2cZsYRs1CzOmw71scJz2nudGQJM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1156289},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"dae87c04f95b7c88f04aca077d08ae8c6848e205","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"npm run build && npm publish","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"npm version prerelease --preid=dev && npm run build && npm publish --tag=dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","dotenv":"^17.4.2","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-dev.0_1782381984658_0.1421876438341898","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-dev.3":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-dev.3","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-dev.3","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"e1e53ff20f5e4c241654be04ec2d9b2c520a527f","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-dev.3.tgz","fileCount":8,"integrity":"sha512-GTybTyxeZyLShtQWFrDPnXipWti5SjyCjp54rUSHaZzjoGvjCDphGFNq1zmrOZwS3O1u5k7m7zlFo85jRHXxCg==","signatures":[{"sig":"MEQCICsHbPYYYMR8rzicwknXs3Tt8zQR1V6wGMv9s22//n6vAiAvyxl+TD5G5fOLcVmPz9HcQEgLVVEdFZAaaAzHbi4qcw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1163943},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"0175dd691250ccd3d1a20c3c2151365ad46549ad","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"npm run build && npm publish","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"npm version prerelease --preid=dev && npm run build && npm publish --tag=dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","dotenv":"^17.4.2","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-dev.3_1782414620796_0.3293428854968141","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-testing.3":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-testing.3","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-testing.3","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"788778e21b44f171d4eafa44ddcb69a55dc2a514","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-testing.3.tgz","fileCount":8,"integrity":"sha512-mb3iywGEK4398pgJYKt85RttD/vR63FqfpWKT6ZTXLE8ab8NfAXQC2usFRyespYHPF7ZFpI9Io468IknoETadw==","signatures":[{"sig":"MEUCIDQWO9ffBDUde93GfGqEAEGMoNdqFlY18jqgS/NeOI9BAiEAnt8S8V9q7hu8FjJpPnS8cq4zBp5sTGYkoSDGYTYOHso=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1164146},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"9e6c0917f0daaf01e260efa1e8fc89ba6063e5f5","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-testing.3_1782629657263_0.923281855959273","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-dev.5":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-dev.5","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-dev.5","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"cf59d4c59ef0957e68ba7fd8bf357af5675d9ec9","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-dev.5.tgz","fileCount":8,"integrity":"sha512-aEbG6Tvvb00GYlbbCg25VQlhAdaUCeeIFx8F8PxdZzj+SsKVUuyPq88nlz+nGj5QTWparNvA4plPRqtrZtteDg==","signatures":[{"sig":"MEUCIHJtpnaiwTNIwNrP4A8E0+le0jspAEcE90qAMnDUjtjPAiEAuZOXEgDbpWa1u79a4iG8+z/SFFKA2ci75aj/lNOJS34=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1162496},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"9afe1a62bb2dbee43ab9ee0bb3904cf46ec87b77","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-dev.5_1782668483567_0.30165240151836925","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-testing.5":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-testing.5","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-testing.5","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"d1c83e08431a7c0eda2a29b49bee26b1054bdffb","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-testing.5.tgz","fileCount":8,"integrity":"sha512-GwirpGfs3TYvreDy3v/9+N4o5klfazV9YEgBCDCdYGlLU43nUr5R6o5UMNe02Y4nOUv/b3y67dc2TNZWUexC8A==","signatures":[{"sig":"MEYCIQD38VWQZQsEHSY+pEwl3R5nAQsg1EGeaVDHQz1GNgLYaQIhAOCGf+zLXY/hhHzmDJycu+wtZK/rY1ijBtCRCLljFDkS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1162508},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"2ae1beb90af7a7fd634954520b31b8bb8d034798","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-testing.5_1782671391546_0.7665127339388693","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-dev.7":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-dev.7","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-dev.7","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"662023a90681c7a7afae113736c876bdcea984c3","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-dev.7.tgz","fileCount":8,"integrity":"sha512-z9h1t2oDPt1nyQeoKoRh/darcwThhuSPwa9mWJxPkxMrvRbairzhHQZfQFna/P7GhUC/fcj0BHJg1n95Or9UAg==","signatures":[{"sig":"MEUCIAoCil0r+9PFga5nMuz38bSpoyb8SMjHlNo3X5p3yQuSAiEA6GkRSdcxZjDMuwLHvwZ/d032/GYSonbv8dTM6MhaxeU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1106375},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"ad14321506371e2965d5e314e953d306d1b96160","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-dev.7_1783157845087_0.16692868849443787","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-testing.7":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-testing.7","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-testing.7","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"5928b47b7e9b234c07cf270ca1d5ba1faf05a732","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-testing.7.tgz","fileCount":8,"integrity":"sha512-Z+aqu6oxbmY2WxMhwpuWbVuE0Jm7BJddwZEXk1GYkiuJWNLvZDu/RConYwrmcUNmMOwahDqaAgPcIoufvxZbhA==","signatures":[{"sig":"MEQCIDSSCNgmhNYaraiXoHt8IPL801nC9wm0aISdRiWZUjHiAiBjOu+8sgcJqSmnVoxXVwBm3Oxm5IKOFmMAWfGfNYroqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1106387},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"0a9d52f397ce6c6f57d798c09a58fdff43a145b6","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-testing.7_1783236973122_0.9646650119906865","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-testing.8":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-testing.8","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-testing.8","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"57ddf64b083f419876067ea6c0299191152d1af5","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-testing.8.tgz","fileCount":8,"integrity":"sha512-/BTGNR9Udy9AajcM++vnNj2CiRvGPekVJX62B1gvwG53EiSI0E6ZInA7CFhl+xpMZuAYABlFvakwAEN/yzZ5Bw==","signatures":[{"sig":"MEQCIBN22WsnsCJYSDiO8+XAHhXoFP07sQeo6mkEo22vBXPcAiAY6ztTUzI0wyAUpc1HolbQeFbJ7UeYDbs8Q/iUuQ1Jdw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1106387},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"c8a6c61516e4709c431afadb0ebdacfab61a85c4","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-testing.8_1783237567518_0.7068302145458283","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-dev.11":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-dev.11","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-dev.11","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"4f08dabd0764007220bdce7201abfdc4693c33c0","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-dev.11.tgz","fileCount":8,"integrity":"sha512-GHoOMV0C/FiEmCl8QF196w37bjTmgh8/FQRxV2IyICQqtwDuMUxMyCJiqF8N4juurvCI2FkQeNZyuWYB2UmClw==","signatures":[{"sig":"MEQCICxMfG8B88EGHEPBkoWhX4BV/Kh4ieLLmw37Qc92uvjaAiB297kUDI9a1Mz6c4N9RGCgRa3O9yVrRL+zK+Kz7TzXhA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1107334},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"16da73a900bc25952c9239ccac03f8c763b6f276","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-dev.11_1783363786299_0.9483614580252693","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-dev.12":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-dev.12","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-dev.12","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"b3c96056015ec5d75b95e754f5104abd35416a44","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-dev.12.tgz","fileCount":8,"integrity":"sha512-+CY6jK8IM4sxB5ZW/4R7plcm0iykDCBadMFuu9jiOAIal77A7yMPQIK2ApWVVzvWIsdSLpni3arN09fEbipg0A==","signatures":[{"sig":"MEYCIQCBXngKuTj7UpSqup2U+KseFYfTZ3frJAHa5q2E1IW3iAIhAPIKCgGiW4i/aUpcslgfrN+DBRuUfXFjKwWbto9ut0bU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1116730},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"d89717c2f3a635d66c47a6b0a7797482815f11c7","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-dev.12_1783365538052_0.7055962121153974","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-dev.14":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-dev.14","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-dev.14","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"ad310734f32769a2e1a20c0775201335b1e57e67","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-dev.14.tgz","fileCount":8,"integrity":"sha512-fPxSCEAFVghpG+ktcp9wJpu3FLqBz6Amt4w0ZtkL5K1BUDg5UEM2qLKSfBLRkMbchnUQPBhQ42aw6yr8+xyF5g==","signatures":[{"sig":"MEUCIF1jqnr8B+AdF+28gMi4MOjSF7LvuHVyNKMAh09VAatlAiEAyWmueqaSE4uIi/rx8cfP1bPUC/7d6Y+kK99r7Wg2tRU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1120546},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"9618d61aba565e02152f93d0a60c2520bf2effbb","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-dev.14_1783369125887_0.08376878612725602","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-testing.11":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-testing.11","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-testing.11","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"cd9b916be02073f4df18cb39febe17972901cd34","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-testing.11.tgz","fileCount":8,"integrity":"sha512-t7XxRzN5YfM4/W36WJqi6DVO+Jw19FLW+KEJv1IZfKTbqlsujc6fabgN89J9vVmeEk7Jb+Wkxf4+3q/fS8q7pw==","signatures":[{"sig":"MEQCICqdE/BPVqsngQ2Iu/fiJJmMww/+8/8LLMCymF2sNkQpAiAc7eG7ayNNsU1WDAFQC85iMLM8Coe0d52rQBNkOl5VUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1116742},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"008e54a1f1568686688a2e0db671cd46853fb7ee","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-testing.11_1783372553809_0.037351773407655164","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@alliumcloud/spatial-comms","version":"1.0.6","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.6","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"d2973c6d667e271c0a4c5f04ce799670ad04e5fa","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.6.tgz","fileCount":8,"integrity":"sha512-6QpXc0dMMCo54aUgdySqifjqH+AONEm+lphVCtQLH71N/heNuA1S0YwtO3N7VEWNX9G8oNfbPNcBIYcq09xscQ==","signatures":[{"sig":"MEYCIQDOQqmIcq6j/jxxJGQTEapgkjXx5IZtZaYmcoOvKbtOXAIhAIIqiV+TEm67Up05kFyb9c2O3bOnVS+ZPAScgYN455bF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1116725},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"3d9408e56b8202bb7ec760f732baa2221b14add4","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.6_1783407342639_0.45326075862453963","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-dev.16":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-dev.16","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-dev.16","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"eaa4210e9ea91278f052c8248a3792877ec11634","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-dev.16.tgz","fileCount":8,"integrity":"sha512-K3pQgdspIseGI1stnsS8KzhC5sIrn2yrFMpaSFu94bNwqgTwcLaFGQlHZcs3hDL8QME/l6KjxbcLAjUs09TWew==","signatures":[{"sig":"MEUCIGEKne6X5rAjNNrBOSPTsPz8P3dFRvZYBmhWtlJ7XTwzAiEA7heE0sTUMDsxlYDLX2IrfOVma8gcTf6ep30Ysey/vsk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126494},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"50ab88e607054b572c2bf67264d3d949925a00b5","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-dev.16_1783451144964_0.5990375701630735","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-testing.12":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-testing.12","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-testing.12","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"e12cf0e8e1d583adbf1fd965cd6ba6dafb22449e","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-testing.12.tgz","fileCount":8,"integrity":"sha512-Ea/bhke0CQzeAKM+9uYKfLYDkvcr5xvU/GhZjMzuVtjjoBPwtzdIwcDsu5/hxH9OGnoPvvIXiNWIJbsWEVVbPg==","signatures":[{"sig":"MEUCICWwGWVAT5E79xAD9SlrSp6F+HiUKI4757KbwOqQ5efMAiEA4aYsFy6/0nqtFyrCOEWlA2i7KpG79eIeoW+s+eZeugU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126506},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"c977fb9f1fae96be2dd7db08635f36cd198b00c3","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-testing.12_1783451604670_0.35482394649708815","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-dev.17":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-dev.17","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-dev.17","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"b4cfae9b212568635bb82cb27e832a1068e46d49","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-dev.17.tgz","fileCount":8,"integrity":"sha512-j9+6Ej4aexC5c8QCnxlgn+aGxNGVPPvapkn0/cifIRkjRoY4WqEEoEE/r39Aov5qcdPVWUq/cviRUkQfaREhZg==","signatures":[{"sig":"MEUCID0mb4QGfiP6bb/kDEz1jel4nIjq/GFsFl3J/Jz3QIbqAiEA4ePHSmHr6weEN4mtQg/OuZot8MjMAOZK3OeN6CL1X44=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126494},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"b81a982dd5ca54f42dee51295a1f8980591714ed","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-dev.17_1783500073558_0.623945335959682","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-testing.13":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-testing.13","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-testing.13","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"e13f65bfa981ddaf0a561c7485642148f1dd1a36","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-testing.13.tgz","fileCount":8,"integrity":"sha512-KKRaZfi+VP3wcjXE6UJJnm3fjJgclLnD1cduR8giXqBV9RH1WsZ/e3Zh/chC9nOwEi34fwbUw8X11dVVaZkgng==","signatures":[{"sig":"MEUCIQC0s8bWrvaJKeZbrNxOWY/u/9qr7+QErIoBQtjSfISs5gIgI8GFPJIZ9BFjyr48XAb/OAMmi9DgmI+Hl0dzgQOPFeI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126506},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"82558215e4ed21a3491e1a0378ff13dddb8268e1","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-testing.13_1783500109045_0.37168542647885827","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@alliumcloud/spatial-comms","version":"1.0.7","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.7","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"4703848f51aba1dace9f468f028f33b4a3390b41","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.7.tgz","fileCount":8,"integrity":"sha512-um9vQGo5ljARLISnggjZq3CNKz2VGR/XErmNMA/WW3g3GqntuiNXGPsPi+xGPBJr0bUcLPHq9X/IeiWwTrNogg==","signatures":[{"sig":"MEUCIEAWQcgihjBSQRtQDEeiJbunIkiitCUxyFU3e6OSyHboAiEAl7HS2jZ2lCMFbHECKOsm+qm7GHT6+Bs0siFO8yDaxgw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126489},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"1224c3d83c774ba3d943a792adb51508c1f4d19d","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.7_1783500148985_0.5887899030093615","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-dev.18":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-dev.18","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-dev.18","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"5daf456230114311d317740ff2a9f2acbca33cb3","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-dev.18.tgz","fileCount":8,"integrity":"sha512-P/pqyxFd8QMj+SRlTaTa0mgnHrfz4ttjXjRmTX1wzkLuAlNcSoiyBVQD5cNyDlf6MvI6an+ct6NXBfkIOWg/yQ==","signatures":[{"sig":"MEUCIQCC9k76q59oBm5dQ75HssDciqOnrxAUFPWUbWv8OgeAYwIgLhfcI8bI6T2Z69EA8yAZG+reoDWQSDf68o1CIUhjHpo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126494},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"7d2732b70c77cf5e21a8acde51419bac81564d1d","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-dev.18_1783502310837_0.04861491037607912","host":"s3://npm-registry-packages-npm-production"}},"1.0.5-testing.14":{"name":"@alliumcloud/spatial-comms","version":"1.0.5-testing.14","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.5-testing.14","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"871673baaada83aa73ddd24752185b01a396b242","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.5-testing.14.tgz","fileCount":8,"integrity":"sha512-/9oLZdkRXABwxp/ibFHIzKyn85PYm75/nSBfpw59Qpydx8stQ7FNCQuNhzjFe3yt1vmOI2Nxv3veUlTxBl3aqQ==","signatures":[{"sig":"MEUCIGARJThoEbN/mz1gE0Y48YRjdIteMnycu6gjos7Oed6OAiEA22tc++3VntIsyAu1O3EGeTlW3UwMAboXbsMQ+3OucHU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126506},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"dadda04addb8cab181cdb882e25d441d33ebbafb","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"deprecated":"internal prerelease — use @alliumcloud/spatial-comms-internal","repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.5-testing.14_1783502340797_0.4732057277915096","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@alliumcloud/spatial-comms","version":"1.0.8","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.8","maintainers":[{"name":"sk7575","email":"suvrajit@odyssey.stream"},{"name":"ashik.odyssey","email":"ashik@odyssey.stream"},{"name":"mahinabid","email":"mahin@odyssey.stream"},{"name":"odyssey_naim","email":"naim@odyssey.stream"},{"name":"odyssey.stream","email":"reid@odyssey.stream"},{"name":"imran6554","email":"imran@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"4b087e028204a9f901ebb38ac1f7e353a4059337","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.8.tgz","fileCount":8,"integrity":"sha512-6GlwAv7WBPtilqMWr+fVGcbZNE3EI0MJaRFEg1YYDFd5Y2w1SxMzZMa9wnqr5yd53ccThmoeS6W/nHQbwYdbgQ==","signatures":[{"sig":"MEQCIG3W3HE7uMKL/IkiAY2BYq+BbbOBxkmX/DDKvsQI3MxlAiA6jRDkPlycg+9EfUsEpy1UtDWLZ09CiuBzRULZQkO+xw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126489},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"38a39199401449fa746c0b3bb56bfe1c3f078583","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"export BUILD_ENV=dev && npm version prerelease --preid=dev && npm run build && npm publish --tag dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"export BUILD_ENV=testing && npm version prerelease --preid=testing && npm run build && npm publish --tag testing"},"_npmUser":{"name":"imran6554","email":"imran@odyssey.stream"},"repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.8_1783502414824_0.9454734526333608","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"@alliumcloud/spatial-comms","version":"1.0.9","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@1.0.9","maintainers":[{"name":"odyssey.stream","email":"reid@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"7504a985cf8708ab935179a99fb15edca316726e","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-1.0.9.tgz","fileCount":8,"integrity":"sha512-cbyDPznGsEwbduwTFIDBXaMUsZw5f7LQT57V8+PoZpXiqaIPsEPglLwXBsd3WMe1WDXjBcRIcdbXFqVYpNm6SA==","signatures":[{"sig":"MEYCIQCnJ/FAMQXgcPdSDzPeZhvx6NTz15/xP2KhSSFnsquZBgIhAIWDmH//TkOLmLsgm1SfTTKDqhNl5dhJBbeBOddfpWpT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126369},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"2847e65a1b9e5ffafcbdb1074a7ae17e1cdc66fc","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"export BUILD_ENV=prod && npm version patch && npm run build && npm publish --tag latest --access public","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"node scripts/release-internal.js dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"node scripts/release-internal.js testing"},"_npmUser":{"name":"odyssey.stream","email":"reid@odyssey.stream"},"repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_1.0.9_1783528952407_0.7039762873430297","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@alliumcloud/spatial-comms","version":"2.0.3","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@2.0.3","maintainers":[{"name":"odyssey.stream","email":"reid@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"761f94cd08692fa03a2c32caa17efdf27c1e332d","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-2.0.3.tgz","fileCount":8,"integrity":"sha512-ixOoo1+Ay6oik+OfCSu1uVyvuG6caiPHlCXdCIzlSQeOf3d0Dp58VYhXLvYCnKu1ExC+/2Z3XsWymH2uHor5zg==","signatures":[{"sig":"MEUCIQCU4da1I37LIX9exOdUnCbn6kkVwpvrfyMgAe+rZfL+QQIgBRDURzNIn743PZ8soAL0IDYGrkTaK/IGanywPtj6T3Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126433},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"c4970641e56be514e51a991da7cf1ded4bdb6cec","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"cross-env-shell BUILD_ENV=prod \"npm version patch && npm run build && npm publish --tag latest --access public && git push --follow-tags\"","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"node scripts/release-internal.js dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"node scripts/release-internal.js testing"},"_npmUser":{"name":"odyssey.stream","email":"reid@odyssey.stream"},"repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.6.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.8.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_2.0.3_1783987238459_0.4990278151468659","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"@alliumcloud/spatial-comms","version":"2.0.4","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@2.0.4","maintainers":[{"name":"odyssey.stream","email":"reid@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"80ec3e3792d87d5b76823bb164fef38023e42f84","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-2.0.4.tgz","fileCount":8,"integrity":"sha512-tjviF5Y9t0luLlbcKnxYdo2C9dLbGBMrL+XEkd9h6XCEe2zeVDOYtb52b0nAmeC4IClNeJgzeAX80qRnW4d7iA==","signatures":[{"sig":"MEUCIFZPL/goGw0DdUTAusVku2V9hdjhu/bqH4W1CzcH59Y1AiEA+EiURzWhOIcarqQZuEBrgQMqZ5TtuFhWAbFhfd0nAeU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126431},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"9a07a7776f3cbc669f5a449c0ba7ebe2ad2929a0","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"cross-env-shell BUILD_ENV=prod \"npm version patch && npm run build && npm publish --tag latest --access public && git push --follow-tags\"","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"node scripts/release-internal.js dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"node scripts/release-internal.js testing"},"_npmUser":{"name":"odyssey.stream","email":"reid@odyssey.stream"},"repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.16.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.18.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_2.0.4_1784137416655_0.4000725994604115","host":"s3://npm-registry-packages-npm-production"}},"2.0.5":{"name":"@alliumcloud/spatial-comms","version":"2.0.5","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","_id":"@alliumcloud/spatial-comms@2.0.5","maintainers":[{"name":"odyssey.stream","email":"reid@odyssey.stream"}],"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"dist":{"shasum":"92ad2e30207771488670fd28c967dcdeac1207ad","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-2.0.5.tgz","fileCount":8,"integrity":"sha512-COi2zEm+zBOnlpfk6QPMgZXy6n6CSAf3szNOLPEg72lkZlRfDFbnrayI1SOXCpi90dQrHgouVvwAG+9N4T6y5Q==","signatures":[{"sig":"MEQCIH2LXhZWZ6eriY8oOReERYfYqQChOQqbjNJ950CjxcVpAiAzPa2/7zZhw+eaq8uulLaQfmrr0gta5XijnzoyXEvqKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1126433},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"0c649daf555d41df40d037b1cf2b1f8d07f7f8c3","scripts":{"dev":"tsc --watch","lint":"eslint src/**/*.ts","pack":"npm run build && npm pack","test":"jest","build":"tsup","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","format":"prettier --write \"src/**/*.ts\"","prepare":"husky","release":"cross-env-shell BUILD_ENV=prod \"npm version patch && npm run build && npm publish --tag latest --access public && git push --follow-tags\"","lint:fix":"eslint src/**/*.ts --fix","clean:logs":"node scripts/remove-console-logs.js","publish:npm":"npm publish --access public","release:dev":"node scripts/release-internal.js dev","format:check":"prettier --check \"src/**/*.ts\"","version:major":"npm version major","version:minor":"npm version minor","version:patch":"npm version patch","prepublishOnly":"npm run build","release:testing":"node scripts/release-internal.js testing"},"_npmUser":{"name":"odyssey.stream","email":"reid@odyssey.stream"},"repository":{"url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git","type":"git"},"_npmVersion":"11.16.0","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","directories":{},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"_nodeVersion":"24.18.0","dependencies":{"events":"^3.3.0","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3","@tensorflow/tfjs":"^4.11.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.0.0","tsup":"^8.5.1","husky":"^9.1.7","eslint":"^9.39.2","globals":"^17.1.0","prettier":"^3.8.1","cross-env":"^10.1.0","typescript":"^5.0.0","@types/jest":"^29.0.0","@types/node":"^20.0.0","lint-staged":"^16.2.7","typescript-eslint":"^8.54.0","@typescript-eslint/parser":"^8.54.0","@typescript-eslint/eslint-plugin":"^8.54.0"},"_npmOperationalInternal":{"tmp":"tmp/spatial-comms_2.0.5_1784143986448_0.38300099420370515","host":"s3://npm-registry-packages-npm-production"}},"2.0.6":{"name":"@alliumcloud/spatial-comms","version":"2.0.6","description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","publishConfig":{"access":"public"},"main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsup","dev":"tsc --watch","test":"jest","lint":"eslint src/**/*.ts","lint:fix":"eslint src/**/*.ts --fix","format":"prettier --write \"src/**/*.ts\"","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run build","publish:npm":"npm publish --access public","release:dev":"node scripts/release-internal.js dev","release:testing":"node scripts/release-internal.js testing","release":"cross-env-shell BUILD_ENV=prod \"npm version patch && npm run build && npm publish --tag latest --access public && git push --follow-tags\"","pack":"npm run build && npm pack","version:patch":"npm version patch","version:minor":"npm version minor","version:major":"npm version major","clean:logs":"node scripts/remove-console-logs.js","deploy":"node scripts/remove-console-logs.js && npm run build && echo '✅ Ready for deployment!'","prepare":"husky"},"lint-staged":{"src/**/*.ts":["prettier --write","eslint --fix"]},"keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"author":{"name":"New Game Plus Inc"},"license":"MIT","dependencies":{"@tensorflow/tfjs":"^4.11.0","events":"^3.3.0","mediasoup-client":"^3.6.90","socket.io-client":"^4.7.2","stream-chat":"^9.41.1","webrtc-adapter":"^8.2.3"},"devDependencies":{"@types/jest":"^29.0.0","@types/node":"^20.0.0","@typescript-eslint/eslint-plugin":"^8.54.0","@typescript-eslint/parser":"^8.54.0","cross-env":"^10.1.0","eslint":"^9.39.2","globals":"^17.1.0","husky":"^9.1.7","jest":"^29.0.0","lint-staged":"^16.2.7","prettier":"^3.8.1","tsup":"^8.5.1","typescript":"^5.0.0","typescript-eslint":"^8.54.0"},"repository":{"type":"git","url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git"},"homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","gitHead":"295a46e60116ab3d70fc730eb1d2855204dbf7ef","_id":"@alliumcloud/spatial-comms@2.0.6","bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-g1DwA2AsefSHwuiMqIbxrTw7w/QWQdA1Jwlvqu4YlrDagajyBXkBCoRRkPCdTZuEVreKUiKTc0I4siEiZyTGog==","shasum":"85d0c1b1e6960815fd5fd0bb2749a88d310b95d9","tarball":"https://registry.npmjs.org/@alliumcloud/spatial-comms/-/spatial-comms-2.0.6.tgz","fileCount":8,"unpackedSize":1142855,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDmdlc3dX/tMpV1DDksE6Bdl7RPUBb9Ip6n9GiMTIpB3wIgIyIq0xb8kYcF23kgU3r3J4RE7GY0wdoidu2xy8lwStg="}]},"_npmUser":{"name":"odyssey.stream","email":"reid@odyssey.stream"},"directories":{},"maintainers":[{"name":"odyssey.stream","email":"reid@odyssey.stream"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/spatial-comms_2.0.6_1788860335606_0.07400948812384622"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-16T04:44:37.513Z","modified":"2026-09-08T09:38:55.969Z","1.0.1":"2026-05-16T04:44:37.754Z","1.0.2":"2026-05-16T04:58:00.704Z","1.0.3":"2026-05-18T05:54:13.929Z","1.0.4":"2026-05-24T06:19:54.063Z","1.0.5":"2026-05-24T19:22:13.843Z","1.0.5-dev.0":"2026-06-25T10:06:24.830Z","1.0.5-dev.3":"2026-06-25T19:10:20.989Z","1.0.5-testing.3":"2026-06-28T06:54:17.414Z","1.0.5-dev.5":"2026-06-28T17:41:23.750Z","1.0.5-testing.5":"2026-06-28T18:29:51.721Z","1.0.5-dev.7":"2026-07-04T09:37:25.258Z","1.0.5-testing.7":"2026-07-05T07:36:13.274Z","1.0.5-testing.8":"2026-07-05T07:46:07.681Z","1.0.5-dev.11":"2026-07-06T18:49:46.485Z","1.0.5-dev.12":"2026-07-06T19:18:58.245Z","1.0.5-dev.14":"2026-07-06T20:18:46.119Z","1.0.5-testing.11":"2026-07-06T21:15:53.983Z","1.0.6":"2026-07-07T06:55:42.786Z","1.0.5-dev.16":"2026-07-07T19:05:45.136Z","1.0.5-testing.12":"2026-07-07T19:13:24.864Z","1.0.5-dev.17":"2026-07-08T08:41:13.716Z","1.0.5-testing.13":"2026-07-08T08:41:49.195Z","1.0.7":"2026-07-08T08:42:29.138Z","1.0.5-dev.18":"2026-07-08T09:18:31.046Z","1.0.5-testing.14":"2026-07-08T09:19:00.955Z","1.0.8":"2026-07-08T09:20:15.045Z","1.0.9":"2026-07-08T16:42:32.638Z","2.0.3":"2026-07-14T00:00:38.612Z","2.0.4":"2026-07-15T17:43:36.805Z","2.0.5":"2026-07-15T19:33:06.615Z","2.0.6":"2026-09-08T09:38:55.783Z"},"bugs":{"url":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test/issues"},"author":{"name":"New Game Plus Inc"},"license":"MIT","homepage":"https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test","keywords":["spatial-audio","webrtc","mediasoup","conference","real-time","audio","video","odyssey"],"repository":{"type":"git","url":"git+https://github.com/New-Game-Plus-Inc/mediasoup-sdk-test.git"},"description":"Allium Spatial Communications SDK - A powerful and flexible WebRTC-based SDK for spatial audio and video communication, built on top of mediasoup.","maintainers":[{"name":"odyssey.stream","email":"reid@odyssey.stream"}],"readme":"# odyssey-spatial-comms\n\n> WebRTC spatial audio & video SDK — built on mediasoup, Web Audio API, and TensorFlow noise suppression.\n\n[![npm version](https://img.shields.io/npm/v/odyssey-spatial-comms)](https://www.npmjs.com/package/odyssey-spatial-comms)\n[![license](https://img.shields.io/npm/l/odyssey-spatial-comms)](LICENSE)\n\n---\n```\nUE → GameStream.vue (handleDataIngress)\n     ↓  emits localSpatialData (mitt)\n     ↓  dispatches mediasoup/updatePosition\nMediaSoupHub.vue → sdk.setListenerFromLSD()      ← LISTENER orientation\nStore → sdk.updatePosition() → socket \"update-position\"\n     ↓\nmediasoup-server → broadcasts \"participant-position-updated\"\n     ↓\nSDK listeners.ts → spatialAudioManager.updateSpatialAudio()  ← SPEAKER position\n     ↓\nSpatialAudioChannel.ts → applySpatialForParticipant() → pan/gain\n\n```\n\n\n## Spatial Audio Spec (authoritative)\n\n`SPATIAL AUDIO = GAIN{distance} + PANNING{L,R}` per receiving listener.\n\n### Distance → Gain (quadratic, range 0.5 m – 15 m)\n\nFormula: `gain% = 100 · (1 − norm)²`, where `norm = (d − 0.5) / (15 − 0.5)`.\nQuadratic falloff is perceived ~linearly by the human ear (matches the spec\n\"interpolate on a logarithmic scale so it feels linear\").\n\n| Distance | Gain % | |\n|---:|---:|---|\n| ≤ 0.5 m | 100 | full volume |\n| 1 m   | ~94 | |\n| 2 m   | ~80 | |\n| 3 m   | ~68 | |\n| 5 m   | ~55 | |\n| 7 m   | ~36 | |\n| 10 m  | ~17 | |\n| 13 m  | ~3  | |\n| ≥ 15 m | 0 | **hard cutoff (silent)** — smoothed over ~100 ms |\n\n### Angle → Panning (linear triangle, full 360°)\n\nAngle is measured CLOCKWISE from the listener's forward axis.\n`|pan| = 1 − |(|θ| − 90°)/90°|`, sign = sign(θ). NOT `sin(θ)`.\n\n| Angle (CW) | L % | R % | meaning |\n|---:|---:|---:|---|\n| 0°   | 100 | 100 | directly in front       |\n| 45°  |  50 | 100 | front-right             |\n| 90°  |   0 | 100 | right ear only          |\n| 135° |  50 | 100 | back-right (mirror 45°) |\n| 180° | 100 | 100 | directly behind         |\n| 225° | 100 |  50 | back-left  (mirror 135°)|\n| 270° | 100 |   0 | left ear only           |\n| 315° | 100 |  50 | front-left              |\n\nVoice band 80–300 Hz is emphasised (band-pass + dynamic low-pass) to keep\nspeech intelligible at low gain.\n\n### Combined (example)\n\n| Position of speaker (rel. to listener) | dist | angle | L %, R %, Gain % |\n|---|---:|---:|---|\n| in front, intimate     | 0.5 m | 0°  | 100 / 100 / 100 |\n| front-right, intimate  | 0.5 m | 45° |  50 / 100 / 100 |\n| right side, mid range  | 3 m   | 90° |   0 / 100 / 68  |\n| behind, far            | 10 m  | 180°| 100 / 100 / 17  |\n| left side, edge        | 14 m  | 270°| 100 /   0 / ~0  |\n| anywhere, beyond cutoff| 15.1 m| any | 0 / 0 / 0 (silent) |\n\n---\n\n## Installation\n\n**npm**\n```bash\nnpm install odyssey-spatial-comms\n```\n\n**yarn**\n```bash\nyarn add odyssey-spatial-comms\n```\n\n**pnpm**\n```bash\npnpm add odyssey-spatial-comms\n```\n\n---\n\n## Quick Start\n\n> **`SpatialCommsSDK.create()` signature** (current, ≥ 1.0.37):\n>\n> ```ts\n> SpatialCommsSDK.create(\n>   apiKey: string,           // SDK key issued by payment service\n>   userToken: string,        // user JWT (RS256, your auth provider)\n>   jwksUri?: string,         // optional — your own JWKS endpoint\n>   spatialOptions?: SpatialAudioOptions,\n> )\n> ```\n>\n> **The server URL is baked in at build time** via the `ODYSSEY_SERVER_URL`\n> env var consumed by `tsup.config.ts`. It is NOT a runtime argument. To point\n> the SDK at a different SFU, rebuild the bundle with a different\n> `ODYSSEY_SERVER_URL`.\n\n### React / Next.js\n```tsx\nimport { SpatialCommsSDK } from 'odyssey-spatial-comms';\n\n// Create once when the user enters a space — type is inferred automatically\nconst client = SpatialCommsSDK.create(\n  process.env.NEXT_PUBLIC_ODYSSEY_API_KEY!,\n  userJwtFromAuthProvider,\n  process.env.NEXT_PUBLIC_JWKS_URI,   // optional\n);\n\n// Resume audio context on first user gesture (required by all browsers)\nawait client.resumeAudio();\n\n// Listen for events (see Events section for the full catalogue)\nclient.on('room-joined', (data) => console.log('joined', data));\nclient.on('new-participant', (p) => console.log('user joined', p.userId));\n\n// Join a room\nawait client.joinRoom({\n  roomId: 'my-room',\n  userId: 'user-123',\n  deviceId: 'device-123',\n  position: { x: 0, y: 0, z: 0 },\n  direction: { x: 0, y: 0, z: 1 },\n  userName: 'Alice',          // optional — shown to other participants\n  userEmail: 'alice@co.com', // optional\n});\n\n// Publish microphone\nconst stream = await navigator.mediaDevices.getUserMedia({ audio: true });\nawait client.produceTrack(stream.getAudioTracks()[0]);\n\n// Update 3D position every time the user moves (~10Hz)\nclient.updatePosition(\n  { x: 1.0, y: 0.0, z: 5.0 },    // world position in meters\n  { x: 0, y: 0, z: 1 },           // forward direction (unit vector)\n  { rot: { x: 0, y: 45, z: 0 } }  // rotation: pitch, yaw, roll (degrees)\n);\n\n// Leave\nclient.leaveRoom();\n```\n\n### Vue 3 (Composition API)\n```ts\nimport { SpatialCommsSDK } from 'odyssey-spatial-comms';\nimport type { OdysseySpatialCommsHandle } from 'odyssey-spatial-comms';\nimport { onMounted, onUnmounted, ref } from 'vue';\n\nconst client = ref<OdysseySpatialCommsHandle | null>(null);\n\nonMounted(() => {\n  client.value = SpatialCommsSDK.create(apiKey, userToken);\n\n  client.value.on('room-joined', () => console.log('connected!'));\n  client.value.on('new-participant', (p) => console.log('user joined', p.userId));\n\n  client.value.joinRoom({\n    roomId: 'my-room',\n    userId: 'user-123',\n    deviceId: 'device-123',\n    position: { x: 0, y: 0, z: 0 },\n    direction: { x: 0, y: 0, z: 1 },\n  });\n});\n\nonUnmounted(() => client.value?.leaveRoom());\n```\n\n### Plain TypeScript / Vanilla JS\n```ts\nimport { SpatialCommsSDK } from 'odyssey-spatial-comms';\n\nconst client = SpatialCommsSDK.create(apiKey, userToken);\n\nclient.on('room-joined', () => console.log('connected!'));\n\nawait client.joinRoom({\n  roomId: 'lobby',\n  userId: 'user-1',\n  deviceId: 'device-1',\n  position: { x: 0, y: 0, z: 0 },\n  direction: { x: 0, y: 0, z: 1 },\n});\n```\n\n### Next.js — dynamic import (browser-only SDK)\n```ts\n// pages/space.tsx or app/space/page.tsx\nimport dynamic from 'next/dynamic';\n\n// Must be dynamic — SDK uses Web Audio API (browser only)\nconst SpaceRoom = dynamic(() => import('../components/SpaceRoom'), { ssr: false });\n```\n\n```ts\n// components/SpaceRoom.tsx\nimport { useEffect, useRef } from 'react';\nimport { SpatialCommsSDK } from 'odyssey-spatial-comms';\nimport type { OdysseySpatialCommsHandle } from 'odyssey-spatial-comms';\n\nexport default function SpaceRoom() {\n  const clientRef = useRef<OdysseySpatialCommsHandle | null>(null);\n\n  useEffect(() => {\n    const client = SpatialCommsSDK.create(apiKey, userToken);\n    clientRef.current = client;\n\n    client.on('room-joined', async () => {\n      await client.resumeAudio();\n      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      await client.produceTrack(stream.getAudioTracks()[0]);\n    });\n\n    client.joinRoom({\n      roomId: 'space-1',\n      userId: 'user-1',\n      deviceId: 'dev-1',\n      position: { x: 0, y: 0, z: 0 },\n      direction: { x: 0, y: 0, z: 1 },\n    });\n\n    return () => { client.leaveRoom(); };\n  }, []);\n\n  return <div>Space loaded</div>;\n}\n```\n\n### TypeScript — if you need the type explicitly\n```ts\nimport { SpatialCommsSDK } from 'odyssey-spatial-comms';\nimport type { OdysseySpatialCommsHandle } from 'odyssey-spatial-comms';\n\n// Option A: let TypeScript infer it (recommended — no import needed)\nconst client = SpatialCommsSDK.create(apiKey, userToken);\n\n// Option B: explicit type annotation (only needed for refs/stores)\nconst clientRef: OdysseySpatialCommsHandle | null = null;\n\n// Option C: derive the type from the factory (no import needed)\ntype OdysseyClient = ReturnType<typeof SpatialCommsSDK.create>;\n```\n\n---\n\n## Peer Dependencies\n\nThese are **not bundled** — install them in your own project:\n\n```bash\nnpm install socket.io-client mediasoup-client @tensorflow/tfjs webrtc-adapter\n```\n\n---\n\n## Key API\n\n| Method | Description |\n|---|---|\n| `SpatialCommsSDK.create(apiKey, userToken, jwksUri?, spatialOptions?)` | Create a new SDK client (server URL is baked in at build time) |\n| `client.joinRoom({ roomId, userId, deviceId, position, direction, userName?, userEmail?, bodyHeight?, bodyShape? })` | Join a room |\n| `client.leaveRoom()` | Leave the current room |\n| `client.updatePosition(position, direction, spatialData?)` | Update 3D position in space |\n| `client.produceTrack(track, { isScreenshare? })` | Publish a local audio/video track |\n| `client.stopScreenShare()` / `client.stopVideoProducer()` | Tear down individual producers |\n| `client.setMasterMuted(muted)` / `client.getMasterMuted()` | Mute/unmute all incoming audio |\n| `client.initializeMLNoiseSuppression(modelPath, workletUrl?)` | Enable TF.js noise suppression |\n| `client.enhanceOutgoingAudioTrack(track)` | Pipe a mic track through the noise suppressor |\n| `client.setListenerPosition(pos, orientation)` / `client.setListenerFromLSD(...)` | Set spatial audio listener |\n| `client.sendHuddleInvite(pid)` / `acceptHuddleInvite(id)` / `rejectHuddleInvite(id)` | Private 1:1 huddle invites |\n| `client.joinHuddle()` / `client.leaveHuddle()` | Group huddle (`odyssey-huddle`) |\n| `client.getParticipantChannel(pid)` / `getCurrentChannel()` | Channel query helpers |\n| `client.muteParticipant(pid)` | Host-only remote mute |\n| `client.startSpaceLiveBroadcast()` / `stopSpaceLiveBroadcast()` / `getSpaceLiveBroadcastStatus(cb)` | 3D-cast lifecycle |\n| `client.updateUserToken(newToken)` | Hot-swap JWT before the current one expires |\n| `client.on(event, handler)` / `client.off(event, handler)` | Subscribe / unsubscribe |\n| `client.chat.init / sendMessage / sendNotification / leave / onMessage` | Stream Chat helpers |\n\n---\n\n## Events\n\nFull `OdysseyEvent` union (see [src/types/events.ts](src/types/events.ts)):\n\n```ts\nclient.on('connected', () => { ... });\nclient.on('disconnected', () => { ... });\nclient.on('room-joined', (data: RoomJoinedEvent) => { ... });\nclient.on('all-participants-update', (participants: Participant[]) => { ... });\nclient.on('new-participant', (p: Participant) => { ... });\nclient.on('participant-left', (pid: string) => { ... });\nclient.on('producer-created', (data) => { ... });\nclient.on('consumer-created', ({ participant, track, consumer, isScreenshare, appData }) => { ... });\nclient.on('consumer-closed',  ({ consumerId, participantId, kind, isScreenshare }) => { ... });\nclient.on('participant-media-state-updated', (p: Participant) => { ... });\nclient.on('participant-position-updated',    (p: Participant) => { ... });\nclient.on('participant-channel-changed',     (data) => { ... });\nclient.on('huddle-invite-received', (data) => { ... });\nclient.on('private-huddle-started', (data) => { ... });\nclient.on('huddle-updated',         (data) => { ... });\nclient.on('huddle-invite-rejected', (data) => { ... });\nclient.on('huddle-ended',           (data) => { ... });\nclient.on('mute-requested',         (data) => { ... });\nclient.on('space-live-broadcast-available', (data: SpaceLiveBroadcastAvailableEvent) => { ... });\nclient.on('space-live-broadcast-stopped',   (data: SpaceLiveBroadcastStoppedEvent) => { ... });\nclient.on('error', (err: Error) => { ... });\n```\n\n> Audio tracks are NOT exposed via a separate `track-added` event — they are\n> wired into the spatial chain internally by the SDK. Use `consumer-created`\n> if you need the raw `MediaStreamTrack` (e.g. for video tile rendering).\n\n---\n\n## Complete Flow: Frontend → Server → SDK\n\n```\n[1] UNREAL ENGINE\n    Sends: pos=(4130, 220, 700) cm  (X=forward, Y=right, Z=up)\n\n         │\n         ▼\n\n[2] FRONTEND (Vue / React)\n    Transform Unreal coords → Standard + cm → meters:\n\n    position = {\n      x: unrealPos.y / 100,  // UE Y (right)   → X (right)   = 2.2m\n      y: unrealPos.z / 100,  // UE Z (up)       → Y (up)      = 7.0m\n      z: unrealPos.x / 100   // UE X (forward)  → Z (forward) = 41.3m\n    }\n\n    Calls:\n      sdk.updatePosition(position, direction, { rot })\n      sdk.setListenerFromLSD(position, cameraPos, lookAtPos, rot)\n\n         │\n         ▼\n\n[3] SDK → SERVER  (socket.emit \"update-position\")\n    Sends: { participantId, position, direction, rot }\n\n         │\n         ▼\n\n[4] SERVER (pass-through mode)\n    1. Receive position from client\n    2. Auto-detect units: if maxAxis > 50 → divide by 100 (cm→m safety net)\n    3. No smoothing: pass real-time position straight through\n    4. Broadcast normalized position (meters) to all other clients\n\n         │\n         ▼\n\n[5] SDK — receiving remote participant positions\n    socket.on(\"participant-position-updated\") triggers:\n    1. normalizePositionUnits()  — backup unit check (maxAxis > 50 → /100)\n    2. snapPosition()            — ignore movements < 15cm (anti-jitter)\n    3. computeHeadPosition()     — add +1.6m Y for head height\n    4. calculateLogarithmicGain()— dB-linear (10^(dB/20)) over 0.5m→15m, hard cutoff @ 15m\n    5. calculatePanning()        — linear triangle wave in angle (0°→0, 45°→0.5, 90°→1)\n    6. Web Audio nodes updated   — GainNode + StereoPannerNode ramped smoothly\n       NB: listener rotation (setListenerFromLSD / setListenerPosition) re-pans every\n           cached speaker immediately — listener changes no longer wait for a remote position.\n```\n\n---\n\n## What Happens on a Sudden 5m Position Jump\n\n```\nSCENARIO: Person teleports from 2m away → 7m away instantly\n\nStep 1 — SERVER detects jump > 5m\n         Lerps 30% toward new position each frame:\n\n         Frame 1:  2.0m → 3.5m   (30% of 5m gap)\n         Frame 2:  3.5m → 4.55m\n         Frame 3:  4.55m → 5.29m\n         Frame 4:  5.29m → 5.80m\n         Frame N:  ... converges to 7m\n\nStep 2 — SDK receives the smoothed intermediate positions\n         Recalculates dB-linear gain for each step (1m≈79%, 2m≈49%, 5m≈12%):\n           3.5m  → ~26% gain\n           4.55m → ~17% gain\n           5.29m → ~12% gain\n\nStep 3 — Web Audio smooths each gain change\n         gainNode.gain.setTargetAtTime(newGain, now, 0.05)\n         ≈ 150ms smooth ramp per step  →  zero clicks or pops\n```\n\n## Coordinate System (World Space)\n\nAll spatial calculations are performed relative to a **world origin (datum)** at `(0, 0, 0)`:\n\n```\n                    +Z (Forward/North)\n                      ↑\n                   10 |\n                      |        B (15, 8) ← Speaker\n                    8 |       /\n                      |      / 5.83m distance\n                    6 |     /\n                      |    /\n                    5 | A (10, 5) ← YOU (Listener, facing 0°)\n                      | ↑\n                    3 | | Your right ear →\n                      | |\n                    1 |\n                      |\n                    0 +--+--+--+--+--+--+--+--+--→ +X (Right/East)\n                      0  2  4  6  8 10 12 14 16\n                     \n                    ↙ (into page)\n                  +Y (Up/Height)\n```\n\n**Key Points:**\n- **Datum (0,0,0)**: World origin - all positions measured from here\n- **X-axis**: Right/Left (positive = right, negative = left)\n- **Y-axis**: Up/Down (height above ground)\n- **Z-axis**: Forward/Back (positive = forward/north, negative = back/south)\n- **Distance**: 3D Euclidean distance = `√(Δx² + Δy² + Δz²)`\n- **Panning**: Calculated from X-Z plane position relative to listener rotation\n\n**Coordinate Transform (Unreal → Standard):**\n```javascript\n// Unreal: X=forward, Y=right, Z=up\n// Standard SDK: X=right, Y=up, Z=forward\nposition = {\n  x: unrealPos.y / 100,  // UE Y (right) → X (right)\n  y: unrealPos.z / 100,  // UE Z (up) → Y (up)\n  z: unrealPos.x / 100   // UE X (forward) → Z (forward)\n}\n```\n\n---\n\n## Feature Highlights\n\n- 🔌 **One factory to rule it all** – `SpatialCommsSDK.create(serverUrl)` wires transports, producers, consumers, and room state.\n- 🧭 **Accurate pose propagation** – `updatePosition()` streams listener pose to the SFU while `participant-position-updated` keeps the local store in sync.\n- 🎧 **Studio-grade spatial audio** – each remote participant gets a dedicated Web Audio graph: `ML denoiser (ScriptProcessorNode) → limiter → high-pass → low-pass → stereo panner → adaptive gain → master compressor`. ML denoiser is a trained 3-layer GRU model (872K params, val_loss=0.1636) running fully client-side via TensorFlow.js.\n- 🎚️ **Crystal-Clear Audio Processing** – A finely-tuned audio pipeline featuring a gentle compressor, multi-stage filtering, and a smart denoiser prevents audio dropouts and echo. The result is a more natural, continuous voice without distracting artifacts.\n- 🧭 **Position-based spatial panning** – `updatePosition` forwards positions to Web Audio which calculates panning based on WHERE the speaker is relative to the listener (not which way they face). Uses listener's right-vector projection with 5m pan radius for natural left/right placement.\n- 🤖 **ML Noise Suppression (Active)** – TensorFlow.js GRU model (`odyssey_adaptive_denoiser`) runs as a `ScriptProcessorNode` wired as the **first node** in every participant's audio chain. Loads non-blocking in the background; operates in pass-through mode until the model is ready, then switches to ML denoising automatically. No fallback — if it fails, the error is logged to console.\n- 🔄 **ICE Connection Stability** – Automatic ICE restart on transport disconnect for robust connections. SDK requests ICE restart from server when transport enters `disconnected` state, enabling faster recovery from network issues without full reconnection.\n\n---\n\n## Audio Flow (Server ↔ Browser)\n\n```\n┌──────────────┐   update-position   ┌──────────────┐   pose + tracks   ┌──────────────────┐\n│ Browser LSD  │ ──────────────────▶ │ MediaSoup SFU│ ────────────────▶ │ SDK Event Bus     │\n│ (Unreal data)│                     │ + Socket.IO  │                   │ (EventManager)    │\n└──────┬───────┘                     └──────┬───────┘                   └──────────┬────────┘\n       │                                    │                                  track + pose\n       │                                    │                                       ▼\n       │                           ┌────────▼────────┐                      ┌──────────────────┐\n       │ audio RTP                 │  consumer-created│                      │ SpatialAudioMgr   │\n       └──────────────────────────▶│  setup per-user │◀──────────────────────│  (Web Audio API)  │\n                                   └────────┬────────┘                      │  - Denoiser       │\n                                            │                               │  - HP / LP        │\n                                            │                               │  - StereoPanner   │\n                                            ▼                               │  - Gain + Comp    │\n                                       Web Audio Graph                      └──────────┬───────┘\n                                            │                                          │\n                                            ▼                                          ▼\n                                    Listener ears (Left/Right)                  System Output\n```\n\n### Remote audio source node (Chrome WebRTC quirk, SDK ≥ 1.0.37)\n\nEach remote `MediaStreamTrack` is fed into the spatial graph via\n`audioContext.createMediaStreamSource(stream)`. In Chrome, the WebRTC decoder\nwill NOT push frames into a Web Audio graph unless an `HTMLMediaElement` is\nalso actively consuming the same `MediaStream`. The SDK therefore creates a\nhidden \"phantom\" `<audio>` element per participant\n(`srcObject = stream`, `autoplay = true`, `volume = 0`, appended to\n`document.body`) purely to keep the decoder running. The element itself is\nsilent; the spatial chain is what the listener hears.\n\nSymptom if you break this: pan/gain math runs but `AnalyserNode.signalDetected`\nis `false` and nothing is audible (the failure mode in 1.0.36, fixed in 1.0.37).\n\n### Multi-device participants\n\n`participantId = ${userId}:${deviceId}`. Two browser tabs / two devices signed\nin to the same account are **two distinct participants** — each gets its own\nspatial chain, distance gain, and stereo pan. Hearing your own voice from a\nsecond device is the intended behaviour, not a duplicate-consumer bug. Audit\nlogs print `pid=first8…last6` so entries with the same userId prefix can be\ndistinguished by their deviceId suffix.\n\n---\n\n## Video Flow (Capture ↔ Rendering)\n\n```\n┌──────────────┐   produceTrack   ┌──────────────┐   RTP   ┌──────────────┐\n│ getUserMedia │ ───────────────▶ │ MediaSoup SDK│ ──────▶ │ MediaSoup SFU│\n└──────┬───────┘                  │ (Odyssey)    │         └──────┬───────┘\n       │                          └──────┬───────┘                │\n       │                   consumer-created │ track                │\n       ▼                                  ▼                       │\n┌──────────────┐                   ┌──────────────┐                │\n│ Vue/React UI │ ◀─────────────── │ SDK Event Bus │ ◀──────────────┘\n│ (muted video │                   │ exposes media │\n│  elements)   │                   │ tracks        │\n└──────────────┘                   └──────────────┘\n```\n\n**Video Track Flow:**\n1. **Capture**: `getUserMedia()` captures video from camera or screen\n2. **Produce**: `sdk.produceTrack(track, { isScreenshare: true })` sends to SFU\n3. **Route**: MediaSoup SFU routes video RTP to other participants\n4. **Consume**: SDK receives `consumer-created` event with video track\n5. **Render**: UI attaches track to muted `<video>` element (audio handled separately)\n\n---\n\n## Web Audio Algorithms\n\n**Coordinate normalization** – Unreal sends centimeters; SpatialAudioManager auto-detects large values and converts to meters once.\n\n**360° angle-based stereo panning** — `setListenerFromLSD()` calculates the listener's right-ear vector from their yaw (`rot.y`). When `updateSpatialAudio()` runs, it uses `atan2` to calculate the angle from listener to speaker, then applies a **linear triangle wave** in the angle: `|pan| = 1 − |(|θ| − 90°)/90°|`, sign = sign(θ). At 45° the spec is exactly 0.5 (NOT 0.71 from `sin`). This gives **full left/right separation** at ±90°. Speaker's rotation is ignored — only their position relative to listener matters.\n\n**Dynamic distance gain** — `updateSpatialAudio()` measures distance from listener → source and applies a **quadratic** falloff (0.5 m – 15 m range): `gain% = 100 · (1 − norm)²`, where `norm = (d − 0.5) / (15 − 0.5)`. Voices fade from 100% (≤0.5 m) to **complete silence at 15 m+** (hard cutoff, smoothed over ~100 ms). Quadratic falloff is perceived approximately linearly by the human ear. Distance is calculated from listener's HEAD position to participant's HEAD position (body + 1.6 m height). The chain runs through a `masterCompressor` node (threshold −24 dB, ratio 4:1) before `masterGain = 1.5` — the compressor is **enabled** as a soft limiter to prevent clipping when multiple speakers overlap.\n\n**Noise handling** – a TensorFlow.js GRU model (`odyssey_adaptive_denoiser`, 872K params, val_loss=0.1636) runs in a ScriptProcessorNode as the FIRST node in every participant's chain, applying a learned spectral mask before the high/low-pass filters. Audio passes through unchanged until the model finishes loading, then ML denoising becomes active automatically with no user action required.\n\n---\n\n## Spatial Audio System (CLOCKWISE Rotation)\n\n### Core Algorithm (Full 360° Support)\n\nThe panning calculation uses **position-based projection** onto the listener's right-ear axis:\n\n```typescript\n// Step 1: Calculate listener's right vector from yaw (CLOCKWISE rotation)\nconst yawRad = (rot.y * Math.PI) / 180;\nlistenerRight = {\n  x: Math.cos(yawRad),\n  z: -Math.sin(yawRad)  // NEGATIVE sine for CLOCKWISE rotation\n};\n\n// Step 2: Vector from listener to speaker\nvecToSource = {\n  x: speakerPos.x - listenerPos.x,\n  z: speakerPos.z - listenerPos.z\n};\n\n// Step 3: Calculate forward vector (90° CW from right)\nlistenerForward = { x: -listenerRight.z, z: listenerRight.x };\n\n// Step 4: Project onto both axes\ndxLocal = vecToSource.x * listenerRight.x + vecToSource.z * listenerRight.z;  // Right/Left\ndzLocal = vecToSource.x * listenerForward.x + vecToSource.z * listenerForward.z;  // Front/Back\n\n// Step 5: Calculate angle using atan2 (gives -π to +π radians)\nangleToSource = Math.atan2(dxLocal, dzLocal);\n\n// Step 6: Convert to pan value using a linear triangle wave (range -1 to +1)\n//   |pan| = 1 − |(|θ°| − 90°)/90°|, with sign = sign(θ)\n//   At 45° the spec is exactly 0.5 (NOT 0.71 from sin); at 90° = ±1.0; at 0/180° = 0.\n//   90° (right) = +1.0, 270° (left) = -1.0, 0°/180° (front/back) = 0.0\nconst absDeg = Math.abs(angleToSource) * 180 / Math.PI;\nconst absPan = 1 - Math.abs((absDeg - 90) / 90);\nrawPan = Math.sign(angleToSource) * absPan;\n\n// Step 7: Apply smoothing to prevent jitter\nsmoothedPan = smoothPanValue(participantId, rawPan);\n```\n\n### Key Principles\n\n| Principle                  | Description                                                 |\n|----------------------------|-------------------------------------------------------------|\n| **Position-based**         | Panning based on WHERE speaker is, NOT where they're looking |\n| **Listener yaw matters**   | Your `rot.y` determines which direction is \"right\"          |\n| **Speaker rotation ignored** | Their facing direction does NOT affect panning            |\n| **Full 360° support**       | cos/sin trigonometry handles any angle automatically        |\n\n### Listener Right Vector by Yaw (CLOCKWISE Rotation)\n\n| Yaw   | Facing    | listenerRight (x, z) | Right Ear Faces | Left Ear Faces |\n|-------|-----------|----------------------|-----------------|----------------|\n| 0°    | +Z (fwd)  | (1.0, 0.0)           | +X              | -X             |\n| 90°   | +X (right)| (0.0, -1.0)          | -Z              | +Z             |\n| 180°  | -Z (back) | (-1.0, 0.0)          | -X              | +X             |\n| 270°  | -X (left) | (0.0, 1.0)           | +Z              | -Z             |\n\n### Pan Value to Left/Right Gain\n\n| panValue | Left Ear | Right Ear | Angle        | Description    |\n|----------|----------|-----------|--------------|----------------|\n| -1.0     | 100%     | 0%        | 270° (left)  | Full LEFT      |\n| -0.71    | 85%      | 15%       | 315°/225°    | Diagonal LEFT  |\n| 0.0      | 50%      | 50%       | 0°/180°      | CENTER         |\n| +0.71    | 15%      | 85%       | 45°/135°     | Diagonal RIGHT |\n| +1.0     | 0%       | 100%      | 90° (right)  | Full RIGHT     |\n\n---\n\n## Anti-Jitter Smoothing (3 Layers)\n\n### Layer 1: Gain Change Threshold Filter (2.5%)\n```typescript\nconst GAIN_CHANGE_THRESHOLD = 0.025; // 2.5%\nif (Math.abs(newGain - currentGain) / 100 < GAIN_CHANGE_THRESHOLD) {\n  return currentGain; // Ignore micro-jitter (movements ≤40cm)\n}\n```\n\n### Layer 2: Adaptive EMA for Pan\n```typescript\n// Normal: 70% smoothing for stability\nsmoothedPan = previousPan * 0.7 + newPan * 0.3;\n\n// Near center: 50% smoothing for moderate response\nif (bothNearCenter) {\n  smoothedPan = previousPan * 0.5 + newPan * 0.5;\n}\n\n// Full flip (likely jitter): 85% HEAVY smoothing\nif (signFlipped && panChange > 1.0) {\n  smoothedPan = previousPan * 0.85 + newPan * 0.15;\n}\n```\n\n### Layer 3: Audio API Ramp Time\n```typescript\nstereoPanner.pan.setTargetAtTime(panValue, currentTime, 0.08);  // 80ms pan\ngainNode.gain.setTargetAtTime(gainValue, currentTime, 0.05);    // 50ms gain\n```\n\n---\n\n## Distance-Based Gain: Quadratic Falloff (HARD CUTOFF at 15m)\n\n| Distance       | Gain   | Description                      |\n|:---------------|:------:|:---------------------------------|\n| `0.0 - 0.5m`   | 100%   | Full volume (intimate)           |\n| `1.0m`         | ~90%   | Very close - still loud          |\n| `2.0m`         | ~72%   | Normal talking - NOTICEABLE      |\n| `3.0m`         | ~57%   | Across table - CLEARLY QUIETER   |\n| `5.0m`         | ~33%   | Across room - MUCH QUIETER       |\n| `7.0m`         | ~17%   | Far end of room - very faint     |\n| `10.0m`        | ~4%    | Barely audible                   |\n| `≥15.0m`       | **0%** | **Silent (HARD CUTOFF)**         |\n\n**CUBIC EXPONENTIAL falloff formula:**\n```typescript\nprivate calculateLogarithmicGain(distance: number): number {\n  const minDistance = 0.5;   // Full volume at 0.5m or closer\n  const maxDistance = 15.0;  // Silent at 15m or farther - HARD CUTOFF\n\n  if (distance <= minDistance) return 100;  // Full volume\n  if (distance >= maxDistance) return 0;    // Silent - HARD CUTOFF\n\n  // CUBIC: (1 - normalized)³ for NOTICEABLE volume changes\n  const range = maxDistance - minDistance;  // 14.5m\n  const normalizedDistance = (distance - minDistance) / range;\n  const remainingRatio = 1 - normalizedDistance;\n  \n  return 100 * remainingRatio * remainingRatio * remainingRatio;\n}\n```\n\n**Why Cubic (not Linear or Quadratic)?**\n- **Linear**: Too gradual - hard to notice volume changes\n- **Quadratic**: Not steep enough for 15m range  \n- **Cubic**: Perfect balance - clearly noticeable with proper 15m silence\n\n**Smoothing:** Web Audio's `setTargetAtTime()` handles all smoothing:\n```typescript\n// Time constant 0.05 = ~150ms smooth transition (no clicks)\ngainNode.gain.setTargetAtTime(gainValue, currentTime, 0.05);\n```\n\n**Note:** Master compressor is **DISABLED** to ensure gain changes are clearly audible.\n\n---\n\n## Audio Stability System\n\n### Layer 1: Gain Change Threshold Filter (2.5%)\n```typescript\nconst GAIN_CHANGE_THRESHOLD = 0.025; // 2.5%\nif (Math.abs(newGain - currentGain) / 100 < GAIN_CHANGE_THRESHOLD) {\n  return currentGain; // Ignore micro-jitter (movements ≤40cm)\n}\n```\n\n### Layer 2: SDK Position Snapping  \n```\npositionSnapThreshold = 40cm\nIf movement < 40cm → use cached position (ignores pixel streaming jitter)\n```\n\n### Layer 3: Web Audio Smoothing\n```typescript\n// Gain changes are smoothed by Web Audio API directly\n// 50ms time constant for smooth transitions\ngainNode.gain.setTargetAtTime(gainValue, currentTime, 0.05);  // 150ms smooth\nstereoPanner.pan.setTargetAtTime(panValue, currentTime, 0.08);  // 240ms smooth\n```\n\n**Why simplified?** Previous rate-limiting was causing gain to get stuck at low values. Web Audio's built-in smoothing is sufficient and more reliable.\n\n---\n\n## Enterprise-Grade Gain Smoothing\n\n**Problem Solved:** With 40+ people in a room, rapid position updates (60+ Hz) caused **instantaneous gain changes** that created audible clicks, pops, and \"pit pit\" crackling noise. This was caused by `setValueAtTime()` creating waveform discontinuities.\n```\nThrottling = \"Wait a bit before doing the same thing again\" to prevent overload! 🎯\nPerson walking 10 meters:\n\nWithout Throttling:\n|||||||||||||||||||||||||||||||||||||  600 updates\n↑ Every single tiny movement = update\nResult: Clicks, pops, CPU overload 😖\n\nWith Throttling (16ms):\n|  |  |  |  |  |  |  |  |  |  60 updates\n↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑\n16ms gaps between updates\nResult: Smooth, efficient, perfect 😎\n```\n### The Solution: Intelligent Throttling + Adaptive Ramping\n\n```typescript\n// OLD (Causes Clicks):\nnodes.gain.gain.setValueAtTime(gainValue, currentTime);  // ❌ Instant jump\n\n// NEW (Butter Smooth):\nnodes.gain.gain.cancelScheduledValues(currentTime);\nnodes.gain.gain.setValueAtTime(lastGain, currentTime);\nnodes.gain.gain.linearRampToValueAtTime(gainValue, currentTime + rampTime);  // ✅ Smooth transition\n```\n\n### Performance Characteristics\n\n| Participant Count | Position Updates/sec | Throttled Updates/sec | CPU Impact | Audio Quality |\n|:-----------------:|:--------------------:|:---------------------:|:----------:|:-------------:|\n| **2-5**           | ~300                 | ~60                   | Low        | Perfect ✅    |\n| **10**            | ~600                 | ~120                  | Low        | Perfect ✅    |\n| **20**            | ~1,200               | ~240                  | Medium     | Perfect ✅    |\n| **40**            | ~2,400               | ~480                  | Medium     | Perfect ✅    |\n| **100**           | ~6,000               | ~600                  | Medium     | Perfect ✅    |\n\n### Intelligent Throttling Logic\n\n```typescript\n// Throttle: Skip update if too recent AND gain change is small\nconst isSignificantChange = gainDelta > 0.1;  // >10% change\nif (timeSinceLastUpdate < 16ms && !isSignificantChange) {\n  return;  // Skip this update, wait for next frame\n}\n```\n\n**Key Features:**\n- ✅ **Time-based throttling**: Maximum 60Hz per participant (16ms interval)\n- ✅ **Significance bypass**: Large changes (>10%) bypass throttle immediately\n- ✅ **Per-participant tracking**: Each person has independent throttle state\n- ✅ **Standing participants**: Minimal updates when not moving (saves CPU)\n\n### Adaptive Ramp Time\n\nThe system automatically adjusts ramp time based on gain change magnitude:\n\n| Gain Change | Ramp Time | User Experience |\n|:-----------:|:---------:|:----------------|\n| **< 5%**    | 15ms      | Instant feel, imperceptible smoothing |\n| **5-20%**   | 15-35ms   | Smooth transition, natural |\n| **20-30%**  | 35-45ms   | Very smooth, no artifacts |\n| **> 30%**   | 50ms      | Ultra smooth, prevents any clicking |\n\n**Formula:**\n```typescript\nrampTime = Math.min(\n  0.015 + (gainDelta * 0.1),  // Base 15ms + scaled by change\n  0.050                        // Max 50ms cap\n);\n```\n\n### Real-World Scenarios\n\n| Scenario | Behavior | Result |\n|----------|----------|--------|\n| **Person walking nearby** | Small gain changes → 15-25ms ramps | Feels instant, zero clicks |\n| **Person runs past you** | Large gain changes → 40-50ms ramps | Smooth volume sweep |\n| **40 people, 20 moving** | ~1200 updates → throttled to ~240 | Perfect audio, low CPU |\n| **Person stands still** | Updates skipped entirely | Zero CPU usage |\n| **Person teleports close** | >10% change bypasses throttle | Immediate volume update |\n\n### Error Handling & Fallback\n\n```typescript\ntry {\n  // Smooth ramping\n  nodes.gain.gain.linearRampToValueAtTime(gainValue, currentTime + rampTime);\n} catch (err) {\n  // Fallback: Direct value setting (rare edge case)\n  console.warn(`Gain scheduling failed, using instant set:`, err);\n  nodes.gain.gain.value = gainValue;\n}\n```\n\n### Why This Works\n\n**Root Cause:** Instantaneous gain changes create **waveform discontinuities**:\n```\nOld Method:                    New Method:\nVolume                         Volume\n  ↑                              ↑\n  │     ╱╲    ╱╲                │     ╱╲    ╱╲\n  │    ╱  ╲  ╱  ╲               │    ╱  ╲  ╱  ╲\n  │   ╱    ╲╱    ╲              │   ╱    ╲╱    ╲\n  │  ╱            ╲             │  ╱            ╲\n  │ ╱              ╲            │ ╱              ╲\n──┼────────────────────→ Time  ──┼────────────────────→ Time\n  0  ← JUMP! Click here!        0  ← Smooth ramp here!\n```\n\n**Technical Details:**\n- Rapid gain jumps = discontinuous waveform = audible click\n- With 60Hz position updates × 40 people = 2400 potential clicks/sec\n- Linear ramping = continuous waveform = zero artifacts\n- Throttling reduces update frequency by ~60% (saves CPU + audio thread)\n\n### Network Resilience\n\n**Server-Side:**\n```typescript\n// Opus codec with Forward Error Correction\nuseinbandfec: 1  // Automatically recovers lost packets\nptime: 20        // 20ms frames for low latency\n```\n\n**Why Non-Spatial Audio Worked Fine:**\n- Non-spatial audio: Single static gain value, rarely changes\n- Spatial audio: Per-frame position updates = rapid gain changes\n- **The issue wasn't network** - it was rapid gain value changes in Web Audio API\n\n---\n\n## 🎛️ Audio Processing Settings\n\n> **Design Goal:** Crystal clear voice with no echo, pumping, or bathroom effect.\n\n### 🔊 Master Compressor\n\n| Setting       | Value     | Purpose                              |\n|:--------------|:---------:|:-------------------------------------|\n| Threshold     | `-18 dB`  | Only compress loud peaks             |\n| Knee          | `40 dB`   | Soft knee for natural sound          |\n| Ratio         | `3:1`     | Gentle compression, no pumping       |\n| Attack        | `10 ms`   | Fast enough to catch peaks           |\n| Release       | `150 ms`  | Fast release prevents echo tail      |\n| Master Gain   | `1.0`     | Unity gain for clean signal          |\n\n### 🎚️ Filter Chain\n\n| Filter          | Frequency   | Q Value | Purpose                         |\n|:----------------|:-----------:|:-------:|:--------------------------------|\n| Highpass        | `100 Hz`    | `0.5`   | Remove room boom/rumble         |\n| Lowpass         | `10 kHz`    | `0.5`   | Open sound, no ringing          |\n| Voice Boost     | `180 Hz`    | `0.5`   | ❌ **Disabled** (prevents echo) |\n| Dynamic Lowpass | `12 kHz`    | `0.5`   | Natural treble preservation     |\n\n### 🛡️ Per-Participant Limiter\n\n| Setting    | Value     | Purpose                               |\n|:-----------|:---------:|:--------------------------------------|\n| Threshold  | `-6 dB`   | Only activate near clipping           |\n| Knee       | `3 dB`    | Hard knee = true limiter              |\n| Ratio      | `20:1`    | High ratio catches peaks cleanly      |\n| Attack     | `1 ms`    | Ultra-fast peak catching              |\n| Release    | `50 ms`   | Fast release = no pumping             |\n\n### 🎤 Denoiser (ML — GRU ScriptProcessorNode)\n\n| Parameter         | Value                     | Purpose                                           |\n|:------------------|:-------------------------:|:--------------------------------------------------|\n| Model             | `odyssey_adaptive_denoiser` | 3-layer GRU, UINT8 quantized TF.js              |\n| Params            | 872,448                   | Trained 100 epochs, val_loss=0.1636               |\n| Buffer size       | 4096 samples (~85ms)      | ScriptProcessorNode synchronous processing        |\n| Backend           | WebGL (GPU)               | Reported at load: `[MLNoiseSuppressor] TF.js backend ready: webgl` |\n| Pass-through      | Yes (while loading)       | Audio unaffected until model is ready             |\n| Normalization     | mean=0.3953, std=0.1442   | Stats loaded from `normalization_stats.json`      |\n\n---\n\n## 🔗 Audio Chain\n\n```\n┌──────────────────────────────────────────────────────────────────────────────────────────┐\n│                              AUDIO PROCESSING CHAIN                                      │\n├──────────────────────────────────────────────────────────────────────────────────────────┤\n│                                                                                          │\n│  MediaStream  ML Denoiser    Per-Participant                        Spatial    Master    │\n│    Source   → (GRU model) →    Limiter     → Filters →             Panner  → Compressor │\n│      │            │               │             │                    │           │       │\n│      ▼            ▼               ▼             ▼                    ▼           ▼       │\n│  [WebRTC]  [ScriptProcessor  [Peak Catch]  [HP 100Hz]          [Stereo      [3:1 Ratio] │\n│   Track     872K GRU model]   [-6dB]        LP 10kHz]           L/R Pan]     Output     │\n│             (pass-through                                                                │\n│              while loading)                                                              │\n└──────────────────────────────────────────────────────────────────────────────────────────┘\n```\n\n**Detailed Chain:**\n```\nSource → MLScriptProcessor (GRU denoiser) → Limiter → HighPass(100Hz) → VoiceBand → LowPass(10kHz) → \nDynamicLP(12kHz) → MonoDownmix → StereoUpmix → StereoPanner → Gain → MasterCompressor → Output\n```\n\n---\n\n## Spatial Audio Flowchart\n\n```\n┌─────────────────────────────────────────────────────────────────────────────┐\n│                           SPATIAL AUDIO PIPELINE                            │\n└─────────────────────────────────────────────────────────────────────────────┘\n\n    ┌──────────────────┐         ┌──────────────────┐\n    │   LISTENER DATA  │         │   SPEAKER DATA   │\n    │  pos, rot (yaw)  │         │   pos (x, y, z)  │\n    └────────┬─────────┘         └────────┬─────────┘\n             │                            │\n             ▼                            │\n    ┌──────────────────┐                  │\n    │ Calculate Right  │                  │\n    │     Vector       │                  │\n    │ cos(yaw), -sin() │                  │\n    └────────┬─────────┘                  │\n             │                            │\n             ▼                            ▼\n    ┌─────────────────────────────────────────────┐\n    │           VECTOR TO SPEAKER                 │\n    │  vecToSource = speakerPos - listenerPos     │\n    └──────────────────────┬──────────────────────┘\n                           │\n                           ▼\n    ┌─────────────────────────────────────────────┐\n    │            DOT PRODUCT (Projection)         │\n    │  dxLocal = vecToSource · listenerRight      │\n    │  (positive = RIGHT, negative = LEFT)        │\n    └──────────────────────┬──────────────────────┘\n                           │\n              ┌────────────┴────────────┐\n              ▼                         ▼\n    ┌──────────────────┐      ┌──────────────────┐\n    │   NORMALIZE PAN  │      │ CALCULATE DIST   │\n    │ sin(atan2(dx,dz))│      │ dist = |vecTo|   │\n    │  range: -1 to +1 │      │ 0.5m → 15m range │\n    └────────┬─────────┘      └────────┬─────────┘\n             │                         │\n             ▼                         ▼\n    ┌──────────────────┐      ┌──────────────────┐\n    │ ANTI-JITTER      │      │ EXPONENTIAL GAIN │\n    │ - Threshold 2.5% │      │ gain = (1-norm)² │\n    │ - EMA 70%        │      │ × 100%           │\n    │ - Ramp 80ms      │      │ 0% at 15m        │\n    └────────┬─────────┘      └────────┬─────────┘\n             │                         │\n             ▼                         ▼\n    ┌──────────────────┐      ┌──────────────────┐\n    │   StereoPanner   │      │    GainNode      │\n    │  L/R balance     │      │   volume         │\n    └────────┬─────────┘      └────────┬─────────┘\n             │                         │\n             └──────────┬──────────────┘\n                        ▼\n              ┌──────────────────┐\n              │  AUDIO OUTPUT    │\n              │  (headphones)    │\n              └──────────────────┘\n```\n\n---\n\n## 360° Spatial Audio Diagram (Top View)\n\n```\n                        0° (Front)\n                     L100%  R100%\n                         ↑\n                         │\n          315°           │           45°\n        L100% R58%       │       L58% R100%\n              ↖         │         ↗\n                ↖       │       ↗\n                  ↖     │     ↗\n                    ↖   │   ↗\n  270° ←─────────────── 🎧 ───────────────→ 90°\n (Left)            Listener            (Right)\nL100% R40%          yaw=0°           L40% R100%\n                    ↙   │   ↘\n                  ↙     │     ↘\n                ↙       │       ↘\n              ↙         │         ↘\n        L100% R58%       │       L58% R100%\n          225°           │           135°\n                         │\n                         ↓\n                     L100%  R100%\n                     180° (Behind)\n\n    Legend:\n    - 🎧 = Listener at origin, facing 0° (forward)\n    - Angles = Speaker position around listener\n    - L/R % = Left/Right ear volume for speaker at that position\n```\n\n---\n\n## Configuration\n\n| Parameter              | Value  | Description                 |\n|------------------------|--------|-----------------------------|\n| `positionPanRadius`    | 5.0m   | Distance for full L/R pan   |\n| `nearDistance`         | 0.5m   | Full gain threshold         |\n| `farDistance`          | 10.0m  | Silence threshold           |\n| `panSmoothingFactor`   | 0.5    | Normal smoothing            |\n| `panChangeThreshold`   | 0.02   | Jitter ignore threshold     |\n| `panRampTime`          | 0.15s  | Audio transition time       |\n| `headHeight`           | 1.6m   | Added to body Y             |\n\n---\n\n## Console Logs Reference\n\n```javascript\n// Mediasoup server URL being used\n[Odyssey] Connecting to MediaSoup server: https://...\n\n// ML model loading\n[MLNoiseSuppressor] Initializing TF.js backend: webgl\n[MLNoiseSuppressor] Model loaded — 872,448 params | backend: webgl\n[Odyssey] ML Noise Suppression loaded and active\n\n// ML model failure (audio still works — pass-through mode)\n[Odyssey] ML Noise Suppression failed to load: <error>\n\n// ML active per participant\n[SpatialAudioChannel] ML noise suppression ACTIVE — model loaded from <url>\n\n// Listener position update\n📍 [SDK Listener] pos=(x, y, z) rot=(pitch, yaw, roll)\n\n// Speaker position received\n🎧 [SDK Rx] <id> bodyPos=(x, y, z) rot=(pitch, yaw, roll)\n\n// Spatial audio calculation\n🎧 SPATIAL AUDIO [<id>] dist=Xm dxLocal=Xm rawPan=X smoothPan=X pan(L=X%,R=X%) gain=X% listenerRight=(x,z) vecToSrc=(x,z)\n```\n\n---\n\n## Server Contract (Socket.IO Events)\n\n| Event                            | Direction        | Payload                                                                      |\n|----------------------------------|------------------|-----------------------------------------------------------------------------|\n| `join-room`                      | client → server  | `{roomId, userId, deviceId, position, direction}`                           |\n| `room-joined`                    | server → client  | `RoomJoinedData` (router caps, participants snapshot)                       |\n| `update-position`                | client → server  | `{participantId, conferenceId, position, direction, rot, cameraDistance}`   |\n| `participant-position-updated`   | server → client  | `{participantId, position, direction, rot, mediaState, pan}`                |\n| `consumer-created`               | server → client  | `{participantId, track(kind), position, direction, appData}`                |\n| `participant-media-state-updated`| server → client  | `{participantId, mediaState}`                                               |\n| `all-participants-update`        | server → client  | `{roomId, participants[]}`                                                  |\n| `new-participant`                | server → client  | `{participantId, userId, position, direction}`                              |\n| `participant-left`               | server → client  | `{participantId}`                                                           |\n\n### Position Data Types (Critical for Spatial Audio)\n\nThe SDK sends **three separate data types** to the server for accurate spatial audio:\n\n| Data Type    | Structure                        | Description                                                   |\n|--------------|----------------------------------|---------------------------------------------------------------|\n| `position`   | `{x, y, z}` in meters            | World coordinates - WHERE the player is located               |\n| `direction`  | `{x, y, z}` normalized vector    | Forward direction - which way the player is LOOKING (unit vector) |\n| `rot`        | `{x, y, z}` in degrees           | Euler rotation angles - pitch(x), **yaw(y)**, roll(z)         |\n\n**IMPORTANT**: `rot.y` (yaw) is **critical** for spatial audio left/right ear calculation:\n- The listener's yaw determines their ear orientation\n- `listenerRight = { x: cos(yaw), z: -sin(yaw) }`\n- Speakers are panned based on their position projected onto listener's right axis\n\n```typescript\n// Frontend sends all 3 data types:\nsdk.updatePosition(position, direction, {\n  rot,           // Rotation angles (pitch, yaw, roll) in degrees\n  cameraDistance,\n  screenPos,\n});\n\n// Server broadcasts to other clients:\nsocket.emit(\"participant-position-updated\", {\n  position,   // World coordinates\n  direction,  // Forward vector\n  rot,        // Rotation angles - yaw used for L/R audio\n  ...\n});\n```\n\n---\n\n## Noise-Cancellation Stack (What's Included)\n\n| Layer                         | Purpose                                                                                                                         |\n|-------------------------------|--------------------------------------------------------------------------------------------------------------------------------|\n| **Adaptive denoiser worklet** | Learns each participant's noise floor in real time, applies multi-band downward expander plus dynamic low/high-pass shaping    |\n| **speechBoost**               | Lifts the low/mid band only when speech confidence is high, keeping consonants bright without reintroducing floor noise        |\n| **highBandGate**              | Clamps constant fan hiss in the 4–12 kHz band whenever speechPresence is low                                                   |\n| **Silence gate**              | If energy stays below `silenceFloor` for configurable hold window, track ramps to true silence, wakes instantly on voice return|\n| **Classic filters**           | Fixed high-pass (80Hz) / low-pass (8kHz) shave off rumble and hiss before signals reach the panner                             |\n\n**Configuration example:**\n```typescript\nconst sdk = SpatialCommsSDK.create(serverUrl, {\n  denoiser: {\n    threshold: 0.008,\n    maxReduction: 0.88,\n    hissCut: 0.52,\n    holdMs: 260,\n    voiceBoost: 0.65,\n    voiceSensitivity: 0.33,\n    voiceEnhancement: true,\n    silenceFloor: 0.00075,\n    silenceHoldMs: 520,\n    silenceReleaseMs: 160,\n    speechBoost: 0.35,\n    highBandGate: 0.7,\n    highBandAttack: 0.25,\n    highBandRelease: 0.12,\n  },\n});\n```\n\n---\n\n## How Spatial Audio Is Built\n\n| Step                          | Description                                                                                                                                                           |\n|-------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| **1. Telemetry ingestion**    | Each LSD packet is passed through `setListenerFromLSD(listenerPos, cameraPos, lookAtPos, rot)` so the Web Audio listener matches the player's real head/camera pose  |\n| **2. Per-participant graph**  | When `consumer-created` yields a remote audio track, `setupSpatialAudioForParticipant()` spins up: `Source → Compressor → Denoiser → HP → LP → StereoPanner → Gain`   |\n| **3. Position updates**       | Every `participant-position-updated` event calls `updateSpatialAudio(participantId, position, rot)`. Position feeds panning, rot provides listener's yaw             |\n| **4. Distance-aware gain**    | The manager computes Euclidean distance to each remote participant and applies inverse distance law with exponential falloff (0.5m–15m range) for more perceptible volume changes |\n| **5. Anti-jitter smoothing**  | 3-layer system: threshold filter (0.02), EMA smoothing (0.5), SNAP behavior (0.2 for direction changes)                                                              |\n| **6. Left/right rendering**   | StereoPannerNode outputs processed signal with accurate L/R separation based on position projection                                                                  |\n\n---\n\n## Integration Checklist\n\n- [ ] **Instantiate once per page/tab** and keep it in a store (Vuex, Redux, Zustand, etc.)\n- [ ] **Pipe LSD/Lap data** from your rendering engine into `updatePosition()` + `setListenerFromLSD()` at ~10 Hz\n- [ ] **Render videos muted** – never attach remote audio tracks straight to DOM; let `SpatialAudioManager` own playback\n- [ ] **Resume audio context** – call `sdk.resumeAudio()` on first user interaction (required by browsers)\n- [ ] **Handle consumer-created** – attach video tracks to UI, audio is handled automatically by spatial audio\n- [ ] **Monitor logs** – browser console shows `🎧 SDK`, `📍 SDK`, and `🎚️ [Spatial Audio]` statements for every critical hop\n- [ ] **Push avatar telemetry** back to Unreal so `remoteSpatialData` can render minimaps/circles\n\n---\n\n## Core Modules\n\n| File                        | Purpose                                                                              |\n|-----------------------------|--------------------------------------------------------------------------------------|\n| `src/index.ts`              | `SpatialCommsSDK.create()` – socket lifecycle, producers/consumers, event surface    |\n| `src/core/MediasoupManager.ts`        | Transport helpers for produce/consume/resume                                                                    |\n| `src/channels/spatial/SpatialAudioChannel.ts` | Web Audio orchestration (listener transforms, per-participant chains, ML denoiser node) |\n| `src/audio/MLNoiseSuppressor.ts`      | TensorFlow.js GRU denoiser — `odyssey_adaptive_denoiser` model, 872K params, val_loss=0.1636               |\n| `src/core/EventManager.ts`            | Lightweight EventEmitter used by the entire SDK                                                                 |\n| `src/types/index.ts`                  | TypeScript interfaces for Position, Direction, Participant, MediaState, etc.                                    |\n\n---\n\n## Development Tips\n\n- Run `npm install && npm run build` inside `odyssey-mediasoup-sdk` to publish a fresh build\n- Use `npm run dev` while iterating so TypeScript outputs live under `dist/`\n- The SDK targets evergreen browsers; Safari <16.4 needs WebGL support for TF.js (all modern Safari versions have this)\n- Have questions or want to extend the SDK? Start with `SpatialAudioManager` – that's where most of the \"real-world\" behavior (distance feel, stereo cues, denoiser) lives\n- **ML Noise Suppression**: Initialized automatically at SDK startup using the `odyssey_adaptive_denoiser` model from `public/odyssey_adaptive_denoiser/model.json`. No manual call needed. Watch browser console for `[Odyssey] ML Noise Suppression loaded and active`\n\n---\n\n## Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Build\nnpm run build\n\n# Watch mode\nnpm run dev\n\n# Type check only\nnpm run typecheck\n```\n\n---\n\n## Related Documentation\n\n- [HEAD_POSITION_DATA_FLOW.md](HEAD_POSITION_DATA_FLOW.md) – Detailed panning algorithm with 360° tables\n- [SPATIAL_AUDIO_IMPLEMENTATION.md](SPATIAL_AUDIO_IMPLEMENTATION.md) – Implementation summary with examples\n- [audio-position-wisecalulation.md](audio-position-wisecalulation.md) – Position-wise calculation reference\n","readmeFilename":"README.md"}