{"_id":"@bluebottle_gg/league-broadcast-client","_rev":"18-48be7a7115ed3540a0fcb1b8f1c3ec72","name":"@bluebottle_gg/league-broadcast-client","dist-tags":{"latest":"1.13.0"},"versions":{"0.1.0":{"name":"@bluebottle_gg/league-broadcast-client","version":"0.1.0","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@0.1.0","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"708e6bd1b54fcd60b7c658b6f078b03db5e6936e","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-0.1.0.tgz","fileCount":6,"integrity":"sha512-6DXootJjcPG0JvxqobP2tmB07pAMi9SOOBmdRWyyNYRTRchF2dTEKIdH97CKNC8FF6dJaIlUMjKUfZlEgZAkuw==","signatures":[{"sig":"MEUCIQCBjsnxEaMtMDkj3dzlonatpqofwYUNfbEtvEXzibS8pwIgMCxZpgdBdlYBePwhtM8YN3zJbr7Xgk5eDNNduXyCKOI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":148505},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"881c698f8cbaad4cb6e82f2c8749131b9da7c0a8","scripts":{"dev":"tsup --watch","build":"tsup","clean":"rimraf dist","sync-types":"node scripts/sync-types.mjs","prepublishOnly":"npm run build"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.6.2","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"24.5.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"^5.7.2","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_0.1.0_1770747715665_0.2185211797389912","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bluebottle_gg/league-broadcast-client","version":"0.2.0","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@0.2.0","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"fcfe659237ba9c7d0e765ff97d14281d312ff84e","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-0.2.0.tgz","fileCount":6,"integrity":"sha512-i8c6RYgLbwfDVgpzrQlaul+DpegCsG3ikbXaMzXamzVplD9N3JP/2ojaT7rD5aJqX3AQGT/JtZ1WJq2toE8/ZQ==","signatures":[{"sig":"MEQCIDJfkoJclqAJoX+7cNnhkPeiOMQMMz5y4bwfZQKO6/CBAiBXZLm/+wnIcWV/r47wTNuPxeySTfXVy4vbD2CxcAuryw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":304688},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"25a6052b9b3c599ba066fad0e007256cd0ef258a","scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","prepublishOnly":"npm run build"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.6.2","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"24.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"^5.7.2","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_0.2.0_1772623255663_0.4536146737161917","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bluebottle_gg/league-broadcast-client","version":"0.2.1","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@0.2.1","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"bc0711eefa49584a71773a6460c8f66d82b08927","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-0.2.1.tgz","fileCount":6,"integrity":"sha512-one5tg7AoAS8Te436jH8kxTCtGPTP3jdb+AY3KPmuVnTSftC6da1TFwSBTEbZh7GFkxGWlcEB/UI4HuigGi6SA==","signatures":[{"sig":"MEQCID8KeEuFEG6Hhcde327TAmaY2Hb0/p1Q7sbzWyT2BGkZAiBPcJUAHKe4P9e7yEMb5IGTG0jPNZxDGBL8DPgeU8w9Pw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":307490},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"e25251d22ce2cfb83b51c6d429c2c740b86bbd11","scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.6.2","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"24.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.10.5"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_0.2.1_1773248831110_0.25667091868935654","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bluebottle_gg/league-broadcast-client","version":"0.3.0","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@0.3.0","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"0d7459afdbf6af18394ae1dfa3d4a154e242e722","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-0.3.0.tgz","fileCount":6,"integrity":"sha512-OtLzd/F0lVwU+1OnC1kBjb7FfgOKv+uKsCp60dVQ5YhGSXB6ODhqVs2Zwmv6meZYx92yQMgJLoFkYEM3dBNokg==","signatures":[{"sig":"MEUCIQD9aR9eoKEDk+f8nGUpvyCUxGnw2DG74YDcUvbYMak9jQIgZzhScYRBJ59QgUwEuMokZ96v5TIqlHfbpJ957oj7+KY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":951436},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.8.0","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"24.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_0.3.0_1776175007796_0.7822654999375085","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@bluebottle_gg/league-broadcast-client","version":"0.3.1","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@0.3.1","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"2b0bff680f42bb13df44c9ab1875f20d8243ee8e","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-0.3.1.tgz","fileCount":6,"integrity":"sha512-hYoJqlMYGiJx/5D63JEv6PWC8zjkr4eYKjuOWm6NTplyeLpsNzpddXLMA81TCA2iFv4NPyYnuVe+pfyfMFt0DQ==","signatures":[{"sig":"MEQCICYJxaIb3McCtpb1W7tFfGsPZ6WjJ1IdAl/nfdBgl9OLAiBjx+NWypIKwAbsxcBq8UPzfb6cKa8KeKCiN7notB+3ZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":956153},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.8.0","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"24.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_0.3.1_1776288254972_0.652579960831742","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@bluebottle_gg/league-broadcast-client","version":"1.0.0","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@1.0.0","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"0eb2fcdd6c7248d517f57004d892cea4d75358fa","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-1.0.0.tgz","fileCount":6,"integrity":"sha512-BP4W5nv59SOZYl3P/QSiN/QK1EN9wQzSGTvPU6cY4I/4nNK7rsZaw/Im6bb4DBpNSmPM0VFEl3q3YyrLATcsZQ==","signatures":[{"sig":"MEQCIB3A1avCdbS+p1vsGFaWAVKmc75Zy4S+8tKJlIRluk51AiASk9PPSXNCqn74+EI0KXxO4HvcimGBfrBavsL9zIbPvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1049221},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"71bdce321381649cc04605da254a6cda870c73dc","scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.6.2","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"24.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_1.0.0_1777999026588_0.7058829165093334","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bluebottle_gg/league-broadcast-client","version":"1.1.0","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@1.1.0","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"379faac3d65e6d7fc03e25729f06dd46feb22666","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-1.1.0.tgz","fileCount":6,"integrity":"sha512-kxBrcKs55IQiOCtUpbNq0m1LtVsCunri+WepatuZS0HtrEvcul0h++iKMLaEKz5HD7M4mZ0ePQdjMPg+ZC/6VA==","signatures":[{"sig":"MEUCIHYjtJs9mzpn8e7/ymrjEo13TQsUs11Vjq1Mw7PgkNezAiEA5ef4fHxV0Ok1rqVghFIZm17MfmwgvW9Fm2W/iMdIZlE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1072900},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.8.0","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"24.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_1.1.0_1779802261512_0.7892722510633854","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@bluebottle_gg/league-broadcast-client","version":"1.1.1","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@1.1.1","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"ed3f7c20d8604a02a62b30453aff05fece6334c0","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-1.1.1.tgz","fileCount":6,"integrity":"sha512-ztFlmr7iwpnVrGCPqgytyqkDnvQSQwYQ703B5A1+AAk4g87eEJFrmH0QL9EmFnk/g+9ZHobiPbhdM36iBADuRQ==","signatures":[{"sig":"MEUCIAsCXPD3u550jpxdgWxu9K1OsBc0uyToSqUduNVSzP0eAiEAjdlIYHPbQMZ7u2Zm5vUmhrOIIKipNFCXzJy+ouLKwHA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1073031},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.8.0","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"24.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_1.1.1_1780674934791_0.9903488177750781","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bluebottle_gg/league-broadcast-client","version":"1.2.0","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@1.2.0","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"03ef67148cc6beebbaee18888e5fbd709b32b7b0","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-1.2.0.tgz","fileCount":6,"integrity":"sha512-fIz1003poS9URgxmlJ0BhPqYDy+JxicMgLPZtUnUqWIiyilgY0sI6S9AdOgEOKnrstD2a8oT2lZsl8IWWx2CwQ==","signatures":[{"sig":"MEQCIDzLYywKOxHNq0IJ+S49MnsW/0YctoJZf0BherEfqR25AiBfFusLv05UhE9f//QURmgMJ6p+PC8N4U/sVhtqmXT8Vg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1129966},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.13.0","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"24.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_1.2.0_1782994853134_0.5541874802806863","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bluebottle_gg/league-broadcast-client","version":"1.3.0","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@1.3.0","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"9c385e0242507d10d0df6ea0791e1fabc5af5207","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-1.3.0.tgz","fileCount":6,"integrity":"sha512-2jogXg1rKFm0q8Fi+yUO7hoHY5zo6c1pikg0pPEazUMaD6JXmA8JJZJ86aB7BcA95MycVXJcqE+DuB/Mqx0lUA==","signatures":[{"sig":"MEUCIAE75YzE8gUveHhX1rQHosNNqIRuv3NdW0+2Hj78tRksAiEAlvRGXH96tmSHvQ6Fsm4dI/qrtfoQEAXHeHvQIaX9VM4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1131143},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"2956c866b5f8a61b13fbc33521eeb1b4d07a8fef","scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.16.0","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_1.3.0_1783199168720_0.014214357033035752","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@bluebottle_gg/league-broadcast-client","version":"1.3.1","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@1.3.1","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"88ef6953720be4723f6ba7eb67d3735f920a2442","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-1.3.1.tgz","fileCount":6,"integrity":"sha512-xEXDZ1qiGESjz92QluqKTZKD6CQiVcJBm5bYKuFn5czmlsOa79TLjUkfiIbh5OoMP3QYDqQxa/m0EIfHyU0hPw==","signatures":[{"sig":"MEYCIQCOKax5Ki1v1lSHaC6ateLnwccLkko12BZxMB/xa7DgsAIhAIRCU+X6kcxyT/AqVySVkJE6MiM2MzcFm2Oq0cEAG0b/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1137197},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"2d49208521118dafbb3a23d273002bf8de8daa30","scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.16.0","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_1.3.1_1783203112338_0.9892344680844458","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bluebottle_gg/league-broadcast-client","version":"1.4.0","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@1.4.0","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"072c40b280ad263b12bcffdb019e1c39beadfced","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-1.4.0.tgz","fileCount":6,"integrity":"sha512-alD8Q+0EFxLU3u/Eysy58Pncd64bJ/uUzm9cKh/filSgdjhnS8hhj0kG0Up2ha23rhDQsDnSxIh8YfuDUHrOmQ==","signatures":[{"sig":"MEUCIQDMPV880I2EgBGJOWZw9clAvgO/KXtGRhfKTRvbzwzSKAIgfHGj7yCmgyKBdVxPQPTh+kNDVqZ9ERnbHm75J0MMb58=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1189424},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"a6f769fe4b13c5ce966e6e7473194f02bc8a272c","scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.16.0","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_1.4.0_1783295859476_0.029346382397028137","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@bluebottle_gg/league-broadcast-client","version":"1.4.1","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@1.4.1","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"9934b001d50e8bc369818c0601837e3eeefad242","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-1.4.1.tgz","fileCount":6,"integrity":"sha512-AAxjUEp+ypR5ZkKYXsUc1DrEKcIdFdogdshYFf2YljXH1HHgZ5vLlryxmhWJSPeL2UNpsivi7/uiwRDF2h0w8Q==","signatures":[{"sig":"MEQCIDSt7Qu/m+FR0aNIO35faS8pwEdEifJ4R92INXMlg6ZhAiAQ4PkAy7EjEZztos4IT1gaZd0fGEZemqg2nSemj8F3mw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1197528},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.13.0","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"24.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_1.4.1_1783348215158_0.9733210552927032","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@bluebottle_gg/league-broadcast-client","version":"1.5.0","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@1.5.0","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"5395c13db0a6d02643b18ca7f58ff4cc00715f10","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-1.5.0.tgz","fileCount":6,"integrity":"sha512-U1Ha+npEgSdLoDAO1EFF03dyDGKxhciu/9+S46h6seXDDEHE0k6ro7HrKaDlA9cmuiYa13bWb7sgICU61b/HRw==","signatures":[{"sig":"MEQCIA6NOAgxVuJVyAUKY/To4etkMbI2M2jKxQh32eAjND4KAiAfuvb/OFnPkhvck71XaMXUtYTghtjzUVS7w6ec4mASuQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1227481},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.13.0","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"24.17.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_1.5.0_1783705155999_0.9355972311059249","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@bluebottle_gg/league-broadcast-client","version":"1.6.0","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@1.6.0","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"7bbd275be237bb5d288f9c4d87398a13ee5f252d","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-1.6.0.tgz","fileCount":6,"integrity":"sha512-JGvmgmBkiHw4b1ihZI6biMWeVgelphiJtBsULfF2EMS5Rbjch5rzwEirylyfakjki9Mujcb/TNtw2R6nL9uQow==","signatures":[{"sig":"MEUCIAP/8U4LCM9DH+D2YPsELn7UpHLXqUZx76Y/vBV8FtZfAiEAo7NusHUxYrTRsye7SVy5USko0MqrvX4wdtQ1/xotkOQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1638000},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"d6e04b4b7ebe92b8123d3535339d9bc534838c4d","scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.16.0","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_1.6.0_1785938065291_0.5769380139716687","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@bluebottle_gg/league-broadcast-client","version":"1.7.0","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@1.7.0","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"3507d6dfc43e45128d68f4f572a96cf4f3207266","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-1.7.0.tgz","fileCount":6,"integrity":"sha512-cgtLM3mRzXjgeY+qUedsEvSFpxv9nyJ4mW9XaL3u4DXPRYQ+0gLDeRalswmXotaze1rvLXvtXheBHBlM8v84/A==","signatures":[{"sig":"MEQCICq3cGM6WvoVv9u6ZWBiVvzwQYXLzOoNIOwrtE2zYQZVAiBBMJMUDcTuNkwdcUsQFLkvEkWea5syD4w4SHFKKJS+ZA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1638463},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"2a6646e2639d08e7fd8c8bb7be9aee0267b2d9ad","scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.16.0","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_1.7.0_1785939990747_0.21637573450780345","host":"s3://npm-registry-packages-npm-production"}},"1.12.0":{"name":"@bluebottle_gg/league-broadcast-client","version":"1.12.0","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","_id":"@bluebottle_gg/league-broadcast-client@1.12.0","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"dfc0f76310f62c7270848b9aae7af7cd12ca253f","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-1.12.0.tgz","fileCount":6,"integrity":"sha512-90YMvBDA4XLeX1PcqOo70hYPN6Oe3siO+DLjg/F7SFbE+MR/kevkb23obHqu97nUeiPZn1sprWgGr40u80W7vQ==","signatures":[{"sig":"MEUCIFoETlrD6Ex1RWOQMEmGGgv1VS5y0llXXLC3/jd7PwFCAiEAu0EGL9XhqRJge8IUkxZbr2/M3lvoNCfqGZUNdMjTT1o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1649108},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ded92284050907891767289554e3c811fb5c1bfd","scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.16.0","description":"TypeScript client library for League Broadcast game data","directories":{},"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"tmp":"tmp/league-broadcast-client_1.12.0_1786801772117_0.908834765345726","host":"s3://npm-registry-packages-npm-production"}},"1.13.0":{"_id":"@bluebottle_gg/league-broadcast-client@1.13.0","bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"dist":{"shasum":"404104e4ba4b261757761add01bbb0763357c0f4","tarball":"https://registry.npmjs.org/@bluebottle_gg/league-broadcast-client/-/league-broadcast-client-1.13.0.tgz","fileCount":6,"integrity":"sha512-c24LsJ3ut+gZVisvqCUdLuh3uLSqtVUf41Us7W5/a8WHv5X4uRyPqXQF7vDdBBg5Gzt4oxwGk8R1y8aF+ZmLHw==","signatures":[{"sig":"MEUCIQCbJV3I6tH+jaqBx/BLaoddkmir23EwIaZgkGHGc3f1tAIgdLN83lHtVlga1PgRGL9yHR+xvQ+WT3yAwhG+6tR7250=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDfu4x8YVd5cspxFen5gISTz0V/dcVdXI3z9uQFgBqWTgIgEWG2HhTkE/dD1i/2GK+mC95jHMhWqF05dT7jRrwdU38="}],"unpackedSize":1711033},"main":"./dist/index.js","name":"@bluebottle_gg/league-broadcast-client","type":"module","types":"./dist/index.d.ts","author":{"name":"BlueBottleGG"},"module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"license":"GPL-3.0-only","scripts":{"dev":"tsup --watch","test":"tsx test/run.ts","build":"tsup","clean":"rimraf dist","test:ws":"tsx test/run.ts --skip-rest","test:rest":"tsx test/run.ts --skip-ws","type-check":"tsc --noEmit","prepublishOnly":"npm run generate-barrels && npm run build","generate-barrels":"tsx scripts/generate-barrels.ts"},"version":"1.13.0","_npmUser":{"name":"larseble","email":"eble.lars@gmail.com"},"homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"_npmVersion":"11.16.0","description":"TypeScript client library for League Broadcast game data","directories":{},"maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"_nodeVersion":"26.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.3.5","rimraf":"^6.0.1","typescript":"~5.9.3","@types/node":"^22.19.17"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/league-broadcast-client_1.13.0_1790155535913_0.7523096440360602"}}},"time":{"created":"2026-02-10T18:21:55.555Z","modified":"2026-09-23T09:25:36.190Z","0.1.0":"2026-02-10T18:21:55.868Z","0.2.0":"2026-03-04T11:20:55.809Z","0.2.1":"2026-03-11T17:07:11.293Z","0.3.0":"2026-04-14T13:56:47.930Z","0.3.1":"2026-04-15T21:24:15.172Z","1.0.0":"2026-05-05T16:37:06.814Z","1.1.0":"2026-05-26T13:31:01.664Z","1.1.1":"2026-06-05T15:55:34.977Z","1.2.0":"2026-07-02T12:20:53.300Z","1.3.0":"2026-07-04T21:06:08.942Z","1.3.1":"2026-07-04T22:11:52.548Z","1.4.0":"2026-07-05T23:57:39.871Z","1.4.1":"2026-07-06T14:30:15.316Z","1.5.0":"2026-07-10T17:39:16.195Z","1.6.0":"2026-08-05T13:54:25.451Z","1.7.0":"2026-08-05T14:26:30.999Z","1.12.0":"2026-08-15T13:49:32.406Z","1.13.0":"2026-09-23T09:25:35.995Z"},"bugs":{"url":"https://github.com/BlueBottleGG/leaguebroadcast-js-client/issues"},"author":{"name":"BlueBottleGG"},"license":"GPL-3.0-only","homepage":"https://github.com/BlueBottleGG/leaguebroadcast-js-client#readme","keywords":["league-of-legends","league-broadcast","esports","broadcast","websocket","typescript"],"repository":{"url":"git+https://github.com/BlueBottleGG/leaguebroadcast-js-client.git","type":"git"},"description":"TypeScript client library for League Broadcast game data","maintainers":[{"name":"larseble","email":"eble.lars@gmail.com"}],"readme":"# League Broadcast Client\r\n\r\nA TypeScript/JavaScript client library for connecting to the League Broadcast backend and receiving real-time game data.\r\n\r\n## Features\r\n\r\n- 🔌 Automatic WebSocket connection management with reconnection\r\n- 📊 Real-time game state and data updates — in-game **and** pre-game (champion select)\r\n- 🎮 Event-driven architecture for game events (kills, objectives, pick/ban actions, etc.)\r\n- ⚡ **Framework-agnostic reactive store** with fine-grained subscriptions\r\n- 🔄 Works seamlessly with React, Vue, Svelte, Solid, Angular, and vanilla JS\r\n- 📦 TypeScript support with full type definitions\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @bluebottle_gg/league-broadcast-client\r\n```\r\n\r\n## Quick Start\r\n\r\n```typescript\r\nimport {\r\n  LeagueBroadcastClient,\r\n  GameState,\r\n} from \"@bluebottle_gg/league-broadcast-client\";\r\n\r\n// Create client instance\r\nconst client = new LeagueBroadcastClient({\r\n  host: \"localhost\",\r\n  port: 58869,\r\n  autoConnect: true,\r\n});\r\n\r\n// Listen for state updates\r\nclient.onIngameStateUpdate((gameData) => {\r\n  console.log(\"Game time:\", gameData.gameTime);\r\n  console.log(\"Scoreboard:\", gameData.scoreboard);\r\n});\r\n\r\n// Listen for game status changes\r\nclient.onIngameStatusChange((status, isTestingEnv) => {\r\n  if (status === GameState.InGame) {\r\n    console.log(\"Game started!\");\r\n  } else if (status === GameState.OutOfGame) {\r\n    console.log(\"Game ended!\");\r\n  }\r\n});\r\n\r\n// Listen for game events\r\nclient.onIngameEvents({\r\n  onKillFeedEvent: (event) => {\r\n    console.log(\"Kill event:\", event);\r\n  },\r\n  onObjectiveEvent: (event) => {\r\n    console.log(\"Objective taken:\", event);\r\n  },\r\n  onPlayerEvent: (event) => {\r\n    console.log(\"Player event:\", event);\r\n  },\r\n});\r\n```\r\n\r\n## Pre-Game Quick Start\r\n\r\nThe same `LeagueBroadcastClient` also connects to the pre-game WebSocket\r\n(`/ws/pre`) automatically — no second client needed.\r\n\r\n```typescript\r\nimport {\r\n  LeagueBroadcastClient,\r\n  PickBanPhase,\r\n} from \"@bluebottle_gg/league-broadcast-client\";\r\n\r\nconst client = new LeagueBroadcastClient({\r\n  host: \"localhost\",\r\n  port: 58869,\r\n  autoConnect: true,\r\n});\r\n\r\n// Receive state updates every time the server pushes new champ-select data\r\nclient.onChampSelectUpdate((data) => {\r\n  if (!data.isActive) return;\r\n  console.log(\"Phase:\", PickBanPhase[data.timer.phaseName]);\r\n  console.log(\"Time remaining:\", data.timer.timeRemaining);\r\n  console.log(\r\n    \"Blue picks:\",\r\n    data.blueTeam.slots.map((s) => s.champion?.name),\r\n  );\r\n});\r\n\r\n// High-level lifecycle events\r\nclient.onChampSelectEvents({\r\n  onChampSelectStart: () => console.log(\"Draft started!\"),\r\n  onChampSelectEnd: () => console.log(\"Champions locked — game loading\"),\r\n  onAction: (action) => console.log(\"Pick/ban action:\", action),\r\n  onRouteUpdate: (uri) => console.log(\"Frontend route:\", uri),\r\n});\r\n\r\n// Reactive selector (works with React useSyncExternalStore, Svelte $, Vue ref, etc.)\r\nconst timer = client.selectChampSelect((s) => s.champSelectData.timer);\r\nclient.watchChampSelect(\r\n  (s) => s.champSelectData.blueTeam.slots,\r\n  (slots) => console.log(\"Blue picks updated:\", slots),\r\n);\r\n```\r\n\r\n## API Reference\r\n\r\n### LeagueBroadcastClient\r\n\r\n#### Constructor\r\n\r\n```typescript\r\nnew LeagueBroadcastClient(config: LeagueBroadcastClientConfig)\r\n```\r\n\r\n**Config Options:**\r\n\r\n| Option           | Type      | Default      | Description                            |\r\n| ---------------- | --------- | ------------ | -------------------------------------- |\r\n| `host`           | `string`  | **required** | Backend server hostname or IP          |\r\n| `port`           | `number`  | `58869`      | Backend server port                    |\r\n| `ingameWsRoute`  | `string`  | `/ws/in`     | In-game WebSocket endpoint route       |\r\n| `preGameWsRoute` | `string`  | `/ws/pre`    | Pre-game WebSocket endpoint route      |\r\n| `apiRoute`       | `string`  | `/api`       | API endpoint route                     |\r\n| `cacheRoute`     | `string`  | `/cache`     | Cache endpoint route                   |\r\n| `useHttps`       | `boolean` | `false`      | Use WSS/HTTPS instead of WS/HTTP       |\r\n| `autoConnect`    | `boolean` | `true`       | Automatically connect on instantiation |\r\n\r\n#### Methods\r\n\r\n##### Connection Management\r\n\r\n```typescript\r\n// Connect to both in-game and pre-game WebSocket endpoints\r\nawait client.connect(): Promise<void>\r\n\r\n// Disconnect from both endpoints\r\nclient.disconnect(): void\r\n\r\n// Check in-game connection status\r\nclient.isIngameConnected(): boolean\r\n\r\n// Check pre-game connection status\r\nclient.isPreGameConnected(): boolean\r\n```\r\n\r\n##### In-Game Data Access\r\n\r\n```typescript\r\nclient.getIngameData(): ingameFrontendData\r\nclient.getIngameState(): GameState\r\nclient.getGameTime(): number\r\nclient.isInTestingEnvironment(): boolean\r\n```\r\n\r\n`getIngameData().gameTime` is the game time of the most recent backend snapshot, corrected\r\nfor how long that snapshot took to arrive — so it is accurate when it changes, but it only\r\nchanges at the backend's update rate. For timers that have to line up with the ones in the\r\ngame client, read `client.getGameTime()` from an animation frame instead: it advances\r\ncontinuously from the last snapshot and is what `client.timers.*` already uses.\r\n\r\n```typescript\r\nconst tick = () => {\r\n  render(client.getGameTime());\r\n  requestAnimationFrame(tick);\r\n};\r\nrequestAnimationFrame(tick);\r\n```\r\n\r\nRead it through a value quantized to what you actually draw — whole seconds of text, whole\r\ndegrees of a cooldown sweep — so a component re-renders when it changes on screen rather\r\nthan on every frame.\r\n\r\n##### Pre-Game Data Access\r\n\r\n```typescript\r\nclient.getChampSelectData(): champSelectStateData\r\nclient.isChampSelectActive(): boolean\r\n```\r\n\r\n##### URLs\r\n\r\n```typescript\r\nclient.getApiUrl(): string\r\nclient.getCacheUrl(path?: string): string\r\n```\r\n\r\n##### In-Game Event Handlers\r\n\r\n```typescript\r\n// State updates - called when in-game data changes\r\nclient.onIngameStateUpdate(handler: (state: ingameFrontendData) => void): () => void\r\n\r\n// Game status changes - called when game starts/ends\r\nclient.onIngameStatusChange(handler: (status: GameState, isTestingEnv: boolean) => void): () => void\r\n\r\n// Game events - register handlers for various game events\r\nclient.onIngameEvents(handlers: IngameEventHandlers): void\r\n\r\n// In-game connection events\r\nclient.onIngameConnect(handler: () => void): () => void\r\nclient.onIngameDisconnect(handler: () => void): () => void\r\nclient.onIngameError(handler: (error: Event) => void): () => void\r\n```\r\n\r\n##### Pre-Game Event Handlers\r\n\r\n```typescript\r\n// Called on every champ-select state push from the server\r\nclient.onChampSelectUpdate(handler: (state: champSelectStateData) => void): () => void\r\n\r\n// Register handlers for lifecycle and action events\r\nclient.onChampSelectEvents(handlers: ChampSelectEventHandlers): void\r\n\r\n// Pre-game connection events\r\nclient.onPreGameConnect(handler: () => void): () => void\r\nclient.onPreGameDisconnect(handler: () => void): () => void\r\nclient.onPreGameError(handler: (error: Event) => void): () => void\r\n```\r\n\r\nAll event handler registration methods return an unsubscribe function.\r\n\r\n##### In-Game Reactive API\r\n\r\n```typescript\r\n// Subscribe to a fine-grained slice of in-game state\r\nclient.selectIngame<S>(selector: (s: GameStateSnapshot) => S, equalityFn?): Subscribable<S>\r\n\r\n// Watch a value imperatively; callback fires on change\r\nclient.watchIngame<S>(selector, callback, equalityFn?): () => void\r\n\r\n// Direct access to the reactive in-game store\r\nclient.ingameStore: GameStateStore\r\n```\r\n\r\n##### Pre-Game Reactive API\r\n\r\n```typescript\r\n// Subscribe to a fine-grained slice of champ-select state\r\nclient.selectChampSelect<S>(selector: (s: ChampSelectSnapshot) => S, equalityFn?): Subscribable<S>\r\n\r\n// Watch a value imperatively; callback fires on change\r\nclient.watchChampSelect<S>(selector, callback, equalityFn?): () => void\r\n\r\n// Direct access to the reactive pre-game store\r\nclient.preGameStore: ChampSelectStateStore\r\n```\r\n\r\n#### `ChampSelectEventHandlers`\r\n\r\n```typescript\r\ninterface ChampSelectEventHandlers {\r\n  /** Every pick/ban action (hover, lock, ban reveal, phase transition). */\r\n  onAction?: (action: pickBanActionEventArgs) => void;\r\n  /** Fires when champ select becomes active. */\r\n  onChampSelectStart?: () => void;\r\n  /** Fires when champ select ends (isActive becomes false). */\r\n  onChampSelectEnd?: () => void;\r\n  /** Fires when the backend navigates the frontend to a new route. */\r\n  onRouteUpdate?: (uri: string) => void;\r\n}\r\n```\r\n\r\n#### `ChampSelectSnapshot`\r\n\r\nThe snapshot object passed to `selectChampSelect()` / `watchChampSelect()` selectors:\r\n\r\n```typescript\r\ninterface ChampSelectSnapshot {\r\n  readonly champSelectData: champSelectStateData; // Full champ-select state\r\n  readonly isActive: boolean; // Whether draft is in progress\r\n  readonly version: number; // Monotonic version counter\r\n}\r\n```\r\n\r\n#### WebSocket Message Types\r\n\r\n| Message type                   | Handled as                                                                      |\r\n| ------------------------------ | ------------------------------------------------------------------------------- |\r\n| `champion-select-state-update` | Updates `champSelectStateData`, fires `onChampSelectStart` / `onChampSelectEnd` |\r\n| `champion-select-action`       | Fires `onAction`                                                                |\r\n| `frontend-route-update`        | Fires `onRouteUpdate`                                                           |\r\n\r\n---\r\n\r\n### IngameEventHandlers\r\n\r\n```typescript\r\ninterface IngameEventHandlers {\r\n  onPlayerEvent?: (event: playerEvent) => void;\r\n  onTeamEvent?: (event: teamEvent) => void;\r\n  onObjectiveEvent?: (event: objectiveEvent) => void;\r\n  onFirstTowerEvent?: (event: firstTowerEvent) => void;\r\n  onAnnouncementEvent?: (event: announcerEvent) => void;\r\n  onKillFeedEvent?: (event: killFeedEvent) => void;\r\n}\r\n```\r\n\r\n## Reactive API\r\n\r\nThe client includes a **framework-agnostic reactive store** that enables fine-grained subscriptions to specific parts of the game state. The store is compatible with React, Vue, Svelte, Solid, Angular, and vanilla JavaScript.\r\n\r\n### Core Concepts\r\n\r\nThe reactive API is built around **selectors** — functions that extract a slice of state. The backend sends a full snapshot each update, and `null` values explicitly mean “not available / don’t show”. The client uses **structural sharing** to preserve nested object references when values are unchanged, so selectors only re-fire when their content actually changes (with configurable equality comparison for derived values).\r\n\r\n### Quick Examples\r\n\r\n#### Vanilla JavaScript\r\n\r\n```typescript\r\n// Watch a specific value\r\nconst unsubscribe = client.watchIngame(\r\n  (s) => s.gameData.scoreboard?.teams[0]?.kills,\r\n  (kills, prevKills) => {\r\n    console.log(`Blue team kills: ${prevKills} → ${kills}`);\r\n  },\r\n);\r\n\r\n// Clean up when done\r\nunsubscribe();\r\n```\r\n\r\n#### React 18+\r\n\r\n```typescript\r\nimport { useSyncExternalStore } from 'react';\r\n\r\nfunction BlueTeamKills() {\r\n  const slice = client.selectIngame(s => s.gameData.scoreboard?.teams[0]?.kills);\r\n  const kills = useSyncExternalStore(slice.subscribe, slice.getSnapshot);\r\n\r\n  return <div>Blue Kills: {kills ?? 0}</div>;\r\n}\r\n```\r\n\r\n#### Vue 3\r\n\r\n```typescript\r\nimport { ref, onUnmounted } from \"vue\";\r\n\r\nexport default {\r\n  setup() {\r\n    const kills = ref(0);\r\n\r\n    const unsubscribe = client.watchIngame(\r\n      (s) => s.gameData.scoreboard?.teams[0]?.kills,\r\n      (value) => {\r\n        kills.value = value ?? 0;\r\n      },\r\n    );\r\n\r\n    onUnmounted(() => unsubscribe());\r\n\r\n    return { kills };\r\n  },\r\n};\r\n```\r\n\r\n#### Svelte\r\n\r\nThe `Subscribable` returned by `selectIngame()` matches Svelte's store contract:\r\n\r\n```svelte\r\n<script lang=\"ts\">\r\n  const kills = client.selectIngame(s => s.gameData.scoreboard?.teams[0]?.kills);\r\n</script>\r\n\r\n<div>Blue Kills: {$kills ?? 0}</div>\r\n```\r\n\r\n### Reactive Methods\r\n\r\n#### `client.selectIngame(selector, equalityFn?)`\r\n\r\nCreate a subscribable slice that only notifies listeners when the selected value changes.\r\n\r\n```typescript\r\nconst slice = client.selectIngame(\r\n  (s) => s.gameData.gameTime,\r\n  Object.is, // Default equality function (can use shallowEqual for objects)\r\n);\r\n\r\n// Get current value\r\nconst currentTime = slice.getSnapshot();\r\n\r\n// Subscribe to changes\r\nconst unsubscribe = slice.subscribe(() => {\r\n  console.log(\"Game time changed:\", slice.getSnapshot());\r\n});\r\n```\r\n\r\n**Parameters:**\r\n\r\n- `selector: (snapshot: GameStateSnapshot) => T` — Function to extract value from state\r\n- `equalityFn?: (a: T, b: T) => boolean` — Optional equality comparison (defaults to `Object.is`)\r\n\r\n**Returns:** `Subscribable<T>` with:\r\n\r\n- `subscribe(listener: () => void): () => void` — Subscribe to changes\r\n- `getSnapshot(): T` — Get current value\r\n\r\n#### `client.watchIngame(selector, callback, equalityFn?)`\r\n\r\nImperative API for watching a derived value. Callback is invoked whenever the selected value changes.\r\n\r\n```typescript\r\nconst unsubscribe = client.watchIngame(\r\n  (s) => s.gameData.scoreboard?.teams[0]?.kills,\r\n  (kills, prevKills) => {\r\n    console.log(`Kills changed: ${prevKills} → ${kills}`);\r\n  },\r\n);\r\n```\r\n\r\n**Parameters:**\r\n\r\n- `selector: (snapshot: GameStateSnapshot) => T` — Function to extract value\r\n- `callback: (value: T, prev: T) => void` — Called when value changes\r\n- `equalityFn?: (a: T, b: T) => boolean` — Optional equality comparison\r\n\r\n**Returns:** `() => void` — Unsubscribe function\r\n\r\n#### `client.ingameStore`\r\n\r\nDirect access to the `GameStateStore` instance for advanced use cases:\r\n\r\n```typescript\r\n// Get full snapshot\r\nconst snapshot = client.ingameStore.getSnapshot();\r\nconsole.log(\"Game time:\", snapshot.gameData.gameTime);\r\nconsole.log(\"Game state:\", snapshot.gameState);\r\nconsole.log(\"Version:\", snapshot.version);\r\n\r\n// Subscribe to all changes (unfiltered)\r\nconst unsubscribe = client.ingameStore.subscribe(() => {\r\n  console.log(\"Store updated\");\r\n});\r\n\r\n// Watch with immediate callback\r\nclient.ingameStore.watchImmediate(\r\n  (s) => s.gameData.gameTime,\r\n  (time, prevTime) => {\r\n    console.log(`Time: ${prevTime} → ${time}`);\r\n  },\r\n);\r\n```\r\n\r\n### Equality Functions\r\n\r\n#### `Object.is` (default)\r\n\r\nUses strict equality (`===`). Best for primitives and object references:\r\n\r\n```typescript\r\nclient.selectIngame((s) => s.gameData.gameTime); // Uses Object.is by default\r\n```\r\n\r\n#### `shallowEqual`\r\n\r\nCompares objects by their enumerable properties. Use when selecting objects whose identity changes but contents may not:\r\n\r\n```typescript\r\nimport { shallowEqual } from \"@bluebottle_gg/league-broadcast-client\";\r\n\r\nconst stats = client.selectIngame(\r\n  (s) => ({\r\n    kills: s.gameData.scoreboard?.teams[0]?.kills ?? 0,\r\n    deaths: s.gameData.scoreboardBottom?.teams[0]?.players[0]?.deaths ?? 0,\r\n  }),\r\n  shallowEqual, // Only trigger when values change, not object identity\r\n);\r\n```\r\n\r\n### Snapshots\r\n\r\n#### `GameStateSnapshot` (in-game)\r\n\r\n```typescript\r\ninterface GameStateSnapshot {\r\n  readonly gameData: ingameFrontendData; // Full in-game data\r\n  readonly gameState: GameState; // Current game state enum\r\n  readonly version: number; // Monotonic version counter\r\n}\r\n```\r\n\r\n#### `ChampSelectSnapshot` (pre-game)\r\n\r\n```typescript\r\ninterface ChampSelectSnapshot {\r\n  readonly champSelectData: champSelectStateData; // Full champ-select state\r\n  readonly isActive: boolean; // Whether draft is in progress\r\n  readonly version: number; // Monotonic version counter\r\n}\r\n```\r\n\r\n### Performance Tips\r\n\r\n**✅ DO:** Use selectors to watch specific values\r\n\r\n```typescript\r\nclient.watchIngame((s) => s.gameData.scoreboard?.teams[0]?.kills, handleKills);\r\n```\r\n\r\n**❌ DON'T:** Subscribe to entire store and manually filter\r\n\r\n```typescript\r\n// This triggers on EVERY change, even unrelated ones\r\nclient.ingameStore.subscribe(() => {\r\n  const kills = client.ingameStore.getSnapshot().gameData.scoreboard?.teams[0]?.kills;\r\n  handleKills(kills);\r\n});\r\n```\r\n\r\n**✅ DO:** Use `shallowEqual` for derived objects\r\n\r\n```typescript\r\nclient.watchIngame(\r\n  (s) => ({ kills: s.gameData.scoreboard?.teams[0]?.kills ?? 0 }),\r\n  handleStats,\r\n  shallowEqual,\r\n);\r\n```\r\n\r\n**✅ DO:** Select nested objects by reference (structural sharing keeps stable references when unchanged)\r\n\r\n```typescript\r\n// Only triggers when team object reference changes\r\nclient.watchIngame((s) => s.gameData.scoreboard?.teams[0], handleTeam);\r\n```\r\n\r\n**✅ DO:** Handle `null` as “not available”\r\n\r\n```typescript\r\nclient.watchIngame(\r\n  (s) => s.gameData.scoreboard,\r\n  (scoreboard) => {\r\n    if (!scoreboard) {\r\n      hideScoreboard();\r\n      return;\r\n    }\r\n    renderScoreboard(scoreboard);\r\n  },\r\n);\r\n```\r\n\r\n### Framework Integration Examples\r\n\r\nSee [examples/reactivity.ts](examples/reactivity.ts) for complete in-game examples with:\r\n\r\n- React (with `useSyncExternalStore` and custom hooks)\r\n- Vue 3 (Composition API)\r\n- Svelte (native store contract)\r\n- Solid.js\r\n- Angular (with Signals)\r\n- Vanilla JavaScript\r\n\r\nSee [examples/pregame-reactivity.ts](examples/pregame-reactivity.ts) for the equivalent examples using pre-game reactive selectors (`selectChampSelect` / `watchChampSelect`).\r\n\r\n## Examples\r\n\r\nSee the [examples/](examples/) directory for full runnable code.\r\n\r\n| File                                                             | Description                                                             |\r\n| ---------------------------------------------------------------- | ----------------------------------------------------------------------- |\r\n| [examples/usage.ts](examples/usage.ts)                           | In-game usage: state updates, events, cache URLs, scoreboards           |\r\n| [examples/reactivity.ts](examples/reactivity.ts)                 | In-game reactive API across all major frameworks                        |\r\n| [examples/pregame-usage.ts](examples/pregame-usage.ts)           | Pre-game usage: champ select state, pick/ban actions, team compositions |\r\n| [examples/pregame-reactivity.ts](examples/pregame-reactivity.ts) | Pre-game reactive API across all major frameworks                       |\r\n\r\n### Basic In-Game Usage\r\n\r\n```typescript\r\nimport { LeagueBroadcastClient } from \"@bluebottle_gg/league-broadcast-client\";\r\n\r\nconst client = new LeagueBroadcastClient({\r\n  host: \"192.168.1.100\",\r\n  port: 58869,\r\n});\r\n\r\n// Game data is automatically updated in real-time\r\nsetInterval(() => {\r\n  const data = client.getIngameData();\r\n  console.log(\"Current game time:\", data.gameTime);\r\n}, 1000);\r\n```\r\n\r\n### Basic Pre-Game Usage\r\n\r\n```typescript\r\nimport {\r\n  LeagueBroadcastClient,\r\n  PickBanPhase,\r\n} from \"@bluebottle_gg/league-broadcast-client\";\r\n\r\nconst client = new LeagueBroadcastClient({ host: \"192.168.1.100\" });\r\n\r\nclient.onChampSelectEvents({\r\n  onAction: (action) => {\r\n    console.log(\r\n      `Action: ${action.type} — ${action.champion?.name ?? \"hovering\"}`,\r\n    );\r\n  },\r\n});\r\n\r\nclient.watchChampSelect(\r\n  (s) => s.champSelectData.timer.phaseName,\r\n  (phase) => console.log(\"Phase:\", PickBanPhase[phase]),\r\n);\r\n```\r\n\r\n### Full Lifecycle (Draft → In-Game)\r\n\r\n```typescript\r\nimport {\r\n  LeagueBroadcastClient,\r\n  GameState,\r\n} from \"@bluebottle_gg/league-broadcast-client\";\r\n\r\n// One client handles both /ws/in and /ws/pre\r\nconst client = new LeagueBroadcastClient({ host: \"localhost\" });\r\n\r\nclient.onChampSelectEvents({\r\n  onChampSelectStart: () => console.log(\"Draft started\"),\r\n  onChampSelectEnd: () => console.log(\"Game loading\"),\r\n});\r\n\r\nclient.onIngameStatusChange((status) => {\r\n  if (status === GameState.OutOfGame) console.log(\"Returned to lobby\");\r\n});\r\n```\r\n\r\n### React Integration\r\n\r\n```typescript\r\nimport { useEffect, useState } from 'react';\r\nimport { LeagueBroadcastClient, ingameFrontendData, GameState } from '@bluebottle_gg/league-broadcast-client';\r\n\r\nfunction useLeagueBroadcast(host: string, port: number) {\r\n  const [client] = useState(() => new LeagueBroadcastClient({ host, port }));\r\n  const [gameData, setGameData] = useState<ingameFrontendData | null>(null);\r\n  const [gameState, setGameState] = useState<GameState>(GameState.OutOfGame);\r\n\r\n  useEffect(() => {\r\n    const unsubscribeState = client.onIngameStateUpdate((data) => {\r\n      setGameData(data);\r\n    });\r\n\r\n    const unsubscribeStatus = client.onIngameStatusChange((status) => {\r\n      setGameState(status);\r\n    });\r\n\r\n    return () => {\r\n      unsubscribeState();\r\n      unsubscribeStatus();\r\n      client.disconnect();\r\n    };\r\n  }, [client]);\r\n\r\n  return { gameData, gameState, client };\r\n}\r\n\r\n// Usage in component\r\nfunction GameDisplay() {\r\n  const { gameData, gameState } = useLeagueBroadcast('localhost', 58869);\r\n\r\n  if (gameState === GameState.OutOfGame) {\r\n    return <div>No game in progress</div>;\r\n  }\r\n\r\n  return (\r\n    <div>\r\n      <h1>Game Time: {gameData?.gameTime}</h1>\r\n      <div>Blue Team Score: {gameData?.scoreboard?.teams[0]?.totalKills}</div>\r\n      <div>Red Team Score: {gameData?.scoreboard?.teams[1]?.totalKills}</div>\r\n    </div>\r\n  );\r\n}\r\n```\r\n\r\n### Event Handling\r\n\r\n```typescript\r\nimport { LeagueBroadcastClient } from \"@bluebottle_gg/league-broadcast-client\";\r\n\r\nconst client = new LeagueBroadcastClient({\r\n  host: \"localhost\",\r\n  port: 58869,\r\n});\r\n\r\n// Handle all game events\r\nclient.onIngameEvents({\r\n  onKillFeedEvent: (event) => {\r\n    console.log(`${event.killerName} killed ${event.victimName}`);\r\n  },\r\n  onObjectiveEvent: (event) => {\r\n    console.log(`Objective secured: ${event.objectiveType}`);\r\n  },\r\n  onFirstTowerEvent: (event) => {\r\n    console.log(`First tower taken by team ${event.teamId}`);\r\n  },\r\n  onAnnouncementEvent: (event) => {\r\n    console.log(`Announcement: ${event.announcementType}`);\r\n  },\r\n  onPlayerEvent: (event) => {\r\n    console.log(`Player event: ${event.eventType}`);\r\n  },\r\n  onTeamEvent: (event) => {\r\n    console.log(`Team event: ${event.eventType}`);\r\n  },\r\n});\r\n```\r\n\r\n### Manual Connection Control\r\n\r\n```typescript\r\nimport { LeagueBroadcastClient } from \"@bluebottle_gg/league-broadcast-client\";\r\n\r\nconst client = new LeagueBroadcastClient({\r\n  host: \"localhost\",\r\n  port: 58869,\r\n  autoConnect: false, // Don't connect automatically\r\n});\r\n\r\n// Connect manually when ready\r\nasync function connectToGame() {\r\n  try {\r\n    await client.connect();\r\n    console.log(\"Connected successfully!\");\r\n  } catch (error) {\r\n    console.error(\"Connection failed:\", error);\r\n  }\r\n}\r\n\r\n// Disconnect when done\r\nfunction disconnectFromGame() {\r\n  client.disconnect();\r\n  console.log(\"Disconnected\");\r\n}\r\n```\r\n\r\n## License\r\n\r\nGPLv3\r\n","readmeFilename":"README.md"}