{"_id":"@30k/starcomm-client","_rev":"9-9c69a645d0f3cf922ba5d7100f689a2e","name":"@30k/starcomm-client","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.0":{"name":"@30k/starcomm-client","version":"0.1.0","keywords":["star-comms","starcomms","star-citizen","voip","api-client"],"license":"MIT","_id":"@30k/starcomm-client@0.1.0","maintainers":[{"name":"bombitmanbomb","email":"esnow@rootkit.org"}],"dist":{"shasum":"a1ee148bbbd64af19ebadde430220fc1d2fd9fd2","tarball":"https://registry.npmjs.org/@30k/starcomm-client/-/starcomm-client-0.1.0.tgz","fileCount":7,"integrity":"sha512-S2Uw0bXhqtXsMeuRoYrVTwTI48nQFzOZOUnnDpV2/URn4eqS/hgTRG8CVY+PKC47ATpsMTYzSs/f5PpESL0WIQ==","signatures":[{"sig":"MEUCIQDNmrQi2SQ1bu6Nj4x+xgP9ygnpnbdunSZjXMIwTEcvywIgdOLNvdJV6wyFU4AVhHtHZARhnFwQcr5ByR4P53PrfUg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104443},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"296aa0d54fe8109ddf7f3a7ff54f261c96812df5","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","fmt":"oxfmt --write src/","docs":"typedoc","lint":"oxlint src/","build":"tsup src/index.ts --format cjs,esm --dts","clean":"rm -rf dist","release":"pnpm run build && changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bombitmanbomb","email":"esnow@rootkit.org"},"_npmVersion":"10.9.4","description":"TypeScript API client for Star Comms shard Owner API","directories":{},"_nodeVersion":"22.21.1","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","oxfmt":"^0.56.0","oxlint":"^1.71.0","typedoc":"^0.27.9","typescript":"^5.5.0"},"_npmOperationalInternal":{"tmp":"tmp/starcomm-client_0.1.0_1782506991323_0.6097363915397882","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@30k/starcomm-client","version":"0.1.1","keywords":["star-comms","starcomms","star-citizen","voip","api-client"],"license":"MIT","_id":"@30k/starcomm-client@0.1.1","maintainers":[{"name":"bombitmanbomb","email":"esnow@rootkit.org"}],"dist":{"shasum":"8d285c29269425e585a571bf6cebe4bff5275a87","tarball":"https://registry.npmjs.org/@30k/starcomm-client/-/starcomm-client-0.1.1.tgz","fileCount":7,"integrity":"sha512-bK4MB2tv1ar6GdL/NYO+jUlgtbFkmWv4qFxWL/BpeT1v00kZEaxb9aR6EC+EnSe1H8NIdzk+YMEZjm76qxRz2w==","signatures":[{"sig":"MEYCIQDUDaG3GZx361Ym2sT5WhLZXBD9xVBJ8tcXwXidxncFTgIhAI71XepwNZDDcxcXboghaOMC4/wEU1X2pLnRvEz6dbPZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":104985},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"7c25968192ac9725626643c80b166200c56394c5","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","fmt":"oxfmt --write src/","docs":"typedoc","lint":"oxlint src/","build":"tsup src/index.ts --format cjs,esm --dts","clean":"rm -rf dist","release":"pnpm run build && changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bombitmanbomb","email":"esnow@rootkit.org"},"_npmVersion":"10.9.4","description":"TypeScript API client for Star Comms shard Owner API","directories":{},"_nodeVersion":"22.21.1","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","oxfmt":"^0.56.0","oxlint":"^1.71.0","typedoc":"^0.27.9","typescript":"^5.5.0","@changesets/cli":"^2.31.0","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/starcomm-client_0.1.1_1782510063241_0.2691246610263227","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@30k/starcomm-client","version":"0.2.0","keywords":["star-comms","starcomms","star-citizen","voip","api-client"],"license":"MIT","_id":"@30k/starcomm-client@0.2.0","maintainers":[{"name":"bombitmanbomb","email":"esnow@rootkit.org"}],"dist":{"shasum":"ae2b024f23d79663835236ee04142a3e8d69e2cb","tarball":"https://registry.npmjs.org/@30k/starcomm-client/-/starcomm-client-0.2.0.tgz","fileCount":7,"integrity":"sha512-tXlrMUC1Af8lAIG1w5A4GaBK3RbU7gPuLWoVVj5Oc4G1bietIeOnui+qxDnkPV/I8plSzZZiozTp5nEAjQx5KA==","signatures":[{"sig":"MEUCICBWLFvnUOT2Z6rqlMzhpHu3rp97i/Febge/si+BRab3AiEAuvSPQzYolorVBOjcStJpDPJWgqnEDFuSnuAwWlIsr9I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":126149},"main":"dist/index.js","_from":"file:30k-starcomm-client-0.2.0.tgz","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","fmt":"oxfmt --write src/","docs":"typedoc","lint":"oxlint src/","build":"tsup src/index.ts --format cjs,esm --dts","clean":"rm -rf dist","release":"pnpm run build && changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bombitmanbomb","email":"esnow@rootkit.org"},"_resolved":"C:\\Users\\bombi\\AppData\\Local\\Temp\\78a1579d6607b558ba8352ed6c8a1baa\\30k-starcomm-client-0.2.0.tgz","_integrity":"sha512-tXlrMUC1Af8lAIG1w5A4GaBK3RbU7gPuLWoVVj5Oc4G1bietIeOnui+qxDnkPV/I8plSzZZiozTp5nEAjQx5KA==","_npmVersion":"10.9.4","description":"TypeScript API client for Star Comms shard Owner API","directories":{},"_nodeVersion":"22.21.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","oxfmt":"^0.56.0","oxlint":"^1.71.0","typedoc":"^0.27.9","typescript":"^5.5.0","@changesets/cli":"^2.31.0","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/starcomm-client_0.2.0_1782522292323_0.5107533707880079","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@30k/starcomm-client","version":"0.2.1","keywords":["star-comms","starcomms","star-citizen","voip","api-client"],"license":"MIT","_id":"@30k/starcomm-client@0.2.1","maintainers":[{"name":"bombitmanbomb","email":"esnow@rootkit.org"}],"dist":{"shasum":"3dd9c29f6706b347493f7d9a18618c7433db7226","tarball":"https://registry.npmjs.org/@30k/starcomm-client/-/starcomm-client-0.2.1.tgz","fileCount":7,"integrity":"sha512-k68eEMVEkznRStM156T7IkJw9AdJZFj76lSHZM+ZyFB4Sn0C2O5Vq2KBW9XulyUoUMRrDQYlxgjKh15OGRCLGw==","signatures":[{"sig":"MEUCIQCPbx79TXzHL40BA5CDKR1DVjOckD+C90awG2IespA7KgIgUQ3ucvoYjcMITfd5q8pkXodNmE8SriruuKPJPObZjNI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":126946},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"179cd95013351c96bd011257e8e7416e2a6febfe","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","fmt":"oxfmt --write src/","docs":"typedoc","lint":"oxlint src/","build":"tsup src/index.ts --format cjs,esm --dts","clean":"rm -rf dist","release":"pnpm run build && changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bombitmanbomb","email":"esnow@rootkit.org"},"_npmVersion":"10.9.4","description":"TypeScript API client for Star Comms shard Owner API","directories":{},"_nodeVersion":"22.21.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","oxfmt":"^0.56.0","oxlint":"^1.71.0","typedoc":"^0.27.9","typescript":"^5.5.0","@changesets/cli":"^2.31.0","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/starcomm-client_0.2.1_1782620731296_0.36334586683966874","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@30k/starcomm-client","version":"0.3.0","keywords":["star-comms","starcomms","star-citizen","voip","api-client"],"license":"MIT","_id":"@30k/starcomm-client@0.3.0","maintainers":[{"name":"bombitmanbomb","email":"esnow@rootkit.org"}],"dist":{"shasum":"2960257f7dba11e05072cf46ea7f0de7180faaa8","tarball":"https://registry.npmjs.org/@30k/starcomm-client/-/starcomm-client-0.3.0.tgz","fileCount":7,"integrity":"sha512-7CB1YiwviKGnYmILND/d0Wr05Gmo48+iWCsIQZxtUv+K0h2WnI5hUuyF5HeVauUSOVmnlYQH6r8bNQNlU8A15g==","signatures":[{"sig":"MEYCIQD5SwXIkGcoTdLDEULmhiRjgtG1IzqVz77Qhu8XV2QevAIhAL/Bsv68BavSei5eqfp2rYvluNUNrxZw7XgCxia7HMYz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":158237},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"00a23680c72cf96a93a0a6f7f9d636b3449d235f","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","fmt":"oxfmt --write src/","docs":"typedoc","lint":"oxlint src/","build":"tsup src/index.ts --format cjs,esm --dts","clean":"rm -rf dist","release":"pnpm run build && changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bombitmanbomb","email":"esnow@rootkit.org"},"_npmVersion":"10.9.4","description":"TypeScript API client for Star Comms shard Owner API","directories":{},"_nodeVersion":"22.21.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","oxfmt":"^0.56.0","oxlint":"^1.71.0","typedoc":"^0.27.9","typescript":"^5.5.0","@changesets/cli":"^2.31.0","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/starcomm-client_0.3.0_1783353777458_0.02380167840636993","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@30k/starcomm-client","version":"0.4.0","keywords":["star-comms","starcomms","star-citizen","voip","api-client"],"license":"MIT","_id":"@30k/starcomm-client@0.4.0","maintainers":[{"name":"bombitmanbomb","email":"esnow@rootkit.org"}],"dist":{"shasum":"470d040ce4ce3bee20563e03141396056983faab","tarball":"https://registry.npmjs.org/@30k/starcomm-client/-/starcomm-client-0.4.0.tgz","fileCount":7,"integrity":"sha512-EThL+JVQhTc3DQRh7uq+drS8NAN8sd4M4ehwiasNyzB6UVsAfBaKg3HdL2j+QnWL1w3CTX+t48ZPAKUED4XSXQ==","signatures":[{"sig":"MEUCIFd78/JAl8uMyKYZLkxZQhIYi9IEwEYmqmEFOwj/m2IGAiEA/kemwe2cadMsA0Off9I23k9VH7tfVl5s+NXPXndTaFU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":169649},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"4648fe2fdfbb8cab2377b5d5ea150f694a6bb672","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","fmt":"oxfmt --write src/","docs":"typedoc","lint":"oxlint src/","build":"tsup src/index.ts --format cjs,esm --dts","clean":"rm -rf dist","release":"pnpm run build && changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bombitmanbomb","email":"esnow@rootkit.org"},"_npmVersion":"10.9.4","description":"TypeScript API client for Star Comms shard Owner API","directories":{},"_nodeVersion":"22.21.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","oxfmt":"^0.56.0","oxlint":"^1.71.0","typedoc":"^0.27.9","typescript":"^5.5.0","@changesets/cli":"^2.31.0","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/starcomm-client_0.4.0_1783526670772_0.5412114579409892","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@30k/starcomm-client","version":"0.4.1","keywords":["star-comms","starcomms","star-citizen","voip","api-client"],"license":"MIT","_id":"@30k/starcomm-client@0.4.1","maintainers":[{"name":"bombitmanbomb","email":"esnow@rootkit.org"}],"dist":{"shasum":"e2610908c9fed29462d9201e3810095e0194a446","tarball":"https://registry.npmjs.org/@30k/starcomm-client/-/starcomm-client-0.4.1.tgz","fileCount":7,"integrity":"sha512-QmJNEKu7NZvBTPHzOMzNBZwfohLRN1BCOwe4ZVUA94GweLIFF5AT9S581TYVn1R39/bd2qbR0XT5G3YneqTNwQ==","signatures":[{"sig":"MEYCIQDjdSowep4WUN+Z8mC/DV4KMYbyswOuxwomqfRQxqc3hgIhAP3y4FeCCjL6W0zfQFBCJebw+8p3DFt73KyUu8ma4qCY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171831},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"ce3c1ae30696035a84de96715f0d1b80c52e6c46","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","fmt":"oxfmt --write src/","docs":"typedoc","lint":"oxlint src/","build":"tsup src/index.ts --format cjs,esm --dts","clean":"rm -rf dist","release":"pnpm run build && changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bombitmanbomb","email":"esnow@rootkit.org"},"_npmVersion":"10.9.4","description":"TypeScript API client for Star Comms shard Owner API","directories":{},"_nodeVersion":"22.21.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","oxfmt":"^0.56.0","oxlint":"^1.71.0","typedoc":"^0.27.9","typescript":"^5.5.0","@changesets/cli":"^2.31.0","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/starcomm-client_0.4.1_1783528854354_0.9537703616136313","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@30k/starcomm-client","version":"0.5.0","keywords":["star-comms","starcomms","star-citizen","voip","api-client"],"license":"MIT","_id":"@30k/starcomm-client@0.5.0","maintainers":[{"name":"bombitmanbomb","email":"esnow@rootkit.org"}],"dist":{"shasum":"1726a8b1591be48fc22f83a44231679acaf42fdb","tarball":"https://registry.npmjs.org/@30k/starcomm-client/-/starcomm-client-0.5.0.tgz","fileCount":7,"integrity":"sha512-BKZPhBuQ9KE0QY2p/YQqWQ07Y36ALcmrE+lpyqfrstHiXX0/m/CYAy1NiK8sIAv9n8pgDL7BFhAjU6ETBWCZTQ==","signatures":[{"sig":"MEUCIFXhIZ3AlTTWAX79Tz/lIgqfF87/qu4mzu1TEH1klU/rAiEAkDrSLjqYE6aQFUU1sfT0oufqQBc0V1Y0sxQSbyMNU5o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201373},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"4b7713962ee9ca0cfed4475da8564babae6e633f","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --watch","fmt":"oxfmt --write src/","docs":"typedoc","lint":"oxlint src/","build":"tsup src/index.ts --format cjs,esm --dts","clean":"rm -rf dist","release":"pnpm run build && changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc --noEmit"},"_npmUser":{"name":"bombitmanbomb","email":"esnow@rootkit.org"},"_npmVersion":"10.9.4","description":"TypeScript API client for Star Comms shard Owner API","directories":{},"_nodeVersion":"22.21.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","oxfmt":"^0.56.0","oxlint":"^1.71.0","typedoc":"^0.27.9","typescript":"^5.5.0","@changesets/cli":"^2.31.0","@changesets/changelog-github":"^0.7.0"},"_npmOperationalInternal":{"tmp":"tmp/starcomm-client_0.5.0_1785125417883_0.15930613620168144","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@30k/starcomm-client","version":"0.6.0","description":"TypeScript API client for Star Comms shard Owner API","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"build":"tsup src/index.ts --format cjs,esm --dts","dev":"tsup src/index.ts --format cjs,esm --dts --watch","clean":"rm -rf dist","typecheck":"tsc --noEmit","docs":"typedoc","lint":"oxlint src/","fmt":"oxfmt --write src/","changeset":"changeset","version":"changeset version","release":"pnpm run build && changeset publish"},"keywords":["star-comms","starcomms","star-citizen","voip","api-client"],"license":"MIT","devDependencies":{"@changesets/changelog-github":"^0.7.0","@changesets/cli":"^2.31.0","@types/ws":"^8.18.1","oxfmt":"^0.56.0","oxlint":"^1.71.0","tsup":"^8.0.0","typedoc":"^0.27.9","typescript":"^5.5.0"},"engines":{"node":">=18.0.0"},"publishConfig":{"access":"public"},"dependencies":{"ws":"^8.21.3"},"_id":"@30k/starcomm-client@0.6.0","gitHead":"67726bb910a3e04f03b4933efd92fae4fe027e0d","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-Ndl2xdfT/R1QcEys9PtxZA6OMhwqW8ZZNPv4ie3yF8SyNOXQ58/kHJ/rrqPycaCnfpOfBA8mFfc1Vb+64FLNYg==","shasum":"987595ef9d4602601f666283f17bc703b96e741f","tarball":"https://registry.npmjs.org/@30k/starcomm-client/-/starcomm-client-0.6.0.tgz","fileCount":7,"unpackedSize":247531,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCvY2MkmpIR/cLJ/A33AnHLS/pEK7UgtLJevwrGukcYAgIgBnreUhfhybvdgTGNWew1GuxmnHkA3/OsggXW7T7U+NY="}]},"_npmUser":{"name":"bombitmanbomb","email":"esnow@rootkit.org"},"directories":{},"maintainers":[{"name":"bombitmanbomb","email":"esnow@rootkit.org"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/starcomm-client_0.6.0_1786736918266_0.9317124946179776"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-26T20:49:51.153Z","modified":"2026-08-14T19:48:38.623Z","0.1.0":"2026-06-26T20:49:51.507Z","0.1.1":"2026-06-26T21:41:03.380Z","0.2.0":"2026-06-27T01:04:52.484Z","0.2.1":"2026-06-28T04:25:31.438Z","0.3.0":"2026-07-06T16:02:57.604Z","0.4.0":"2026-07-08T16:04:30.901Z","0.4.1":"2026-07-08T16:40:54.512Z","0.5.0":"2026-07-27T04:10:18.026Z","0.6.0":"2026-08-14T19:48:38.460Z"},"license":"MIT","keywords":["star-comms","starcomms","star-citizen","voip","api-client"],"description":"TypeScript API client for Star Comms shard Owner API","maintainers":[{"name":"bombitmanbomb","email":"esnow@rootkit.org"}],"readme":"# @30k/starcomm-client\r\n\r\nTypeScript client for the [Star Comms](https://star-comms.org) shard Owner API. Zero dependencies, uses native `fetch` (Node 18+, Bun, Deno, browsers).\r\n\r\n## Install\r\n\r\n```bash\r\npnpm add @30k/starcomm-client\r\n```\r\n\r\n## Usage\r\n\r\n```typescript\r\nimport { StarCommsClient } from \"@30k/starcomm-client\";\r\n\r\nconst client = new StarCommsClient({\r\n  baseUrl: \"http://your-shard:25588\",\r\n  ownerApiKey: \"scok_your_key_here\",\r\n});\r\n\r\nconst status = await client.status.get();\r\nawait client.assignments.assign(\"discord_user_id\", 1);\r\nawait client.comms.sendAcars(\"Fleet departing!\");\r\n```\r\n\r\n## Docs\r\n\r\nFull API documentation: [30k-inc.github.io/starcomm-client](https://30k-inc.github.io/starcomm-client/index.html)\r\n\r\n## Config\r\n\r\n| Option | Type | Default | Description |\r\n|--------|------|---------|-------------|\r\n| `baseUrl` | `string` | — | Shard URL (no trailing slash) |\r\n| `ownerApiKey` | `string` | — | Owner key (`scok_...`) |\r\n| `serviceKey` | `string?` | — | Service key (`scsk_...`) for audio listening |\r\n| `shardToken` | `string?` | — | Shard token for debug endpoint |\r\n| `timeoutMs` | `number?` | `10000` | Request timeout |\r\n| `connectTimeoutMs` | `number?` | `30000` | Connection timeout for streaming endpoints |\r\n| `fetch` | `typeof fetch?` | `globalThis.fetch` | Custom fetch impl |\r\n\r\n## Audio Listener\r\n\r\nListen-only voice connection that receives Opus audio frames and PTT events from shard nets. Requires a service key (`scsk_...`) obtained from the shard API key management.\r\n\r\n```typescript\r\nconst client = new StarCommsClient({\r\n  baseUrl: \"http://your-shard:25588\",\r\n  ownerApiKey: \"scok_...\",\r\n  serviceKey: \"scsk_...\",\r\n});\r\n\r\n// Event handlers\r\nclient.audio.on(\"ptt.start\", (evt) => {\r\n  console.log(`${evt.displayName} keyed up on net ${evt.netId}`);\r\n});\r\n\r\nclient.audio.on(\"ptt.stop\", (evt) => {\r\n  console.log(`${evt.displayName} stopped on net ${evt.netId}`);\r\n});\r\n\r\nclient.audio.on(\"audio\", (frame) => {\r\n  // frame.netId — which net\r\n  // frame.userId — who's transmitting\r\n  // frame.opus  — raw Opus data (Uint8Array)\r\n});\r\n\r\n// Lifecycle events\r\nclient.audio.on(\"connected\", ({ guildId }) => console.log(\"Connected to\", guildId));\r\nclient.audio.on(\"disconnected\", ({ reason }) => console.warn(\"Lost:\", reason));\r\nclient.audio.on(\"reconnected\", ({ attempt }) => console.log(\"Back after\", attempt, \"tries\"));\r\nclient.audio.on(\"error\", ({ reason }) => console.error(reason));\r\n\r\n// Connect and listen on specific nets\r\nawait client.audio.listen({\r\n  guildId: \"your_guild_id\",\r\n  nets: [1, 2, 3],\r\n});\r\n\r\n// Dynamic net management (no reconnect needed)\r\nawait client.audio.addNet(4);\r\nawait client.audio.removeNet(1);\r\nclient.audio.nets; // [2, 3, 4]\r\n\r\n// Stop and cleanup\r\nawait client.audio.stop();\r\n```\r\n\r\n### Audio Options\r\n\r\n| Option | Type | Default | Description |\r\n|--------|------|---------|-------------|\r\n| `guildId` | `string` | — | Discord guild ID |\r\n| `nets` | `number[]?` | `[]` | Initial nets to listen on |\r\n| `displayName` | `string?` | `\"\"` | Name shown in shard roster |\r\n| `autoReconnect` | `boolean?` | `true` | Reconnect on connection loss |\r\n| `initialDelayMs` | `number?` | `2000` | First reconnect delay |\r\n| `maxDelayMs` | `number?` | `30000` | Max reconnect delay |\r\n| `maxAttempts` | `number?` | `Infinity` | Max reconnect attempts |\r\n\r\n## Event Stream & Reconnection\r\n\r\nThe client includes a built-in SSE event stream with automatic reconnection:\r\n\r\n```typescript\r\n// Listen for events\r\nclient.on(\"user.joined\", (event) => {\r\n  console.log(event.data.displayName, \"connected\");\r\n});\r\n\r\nclient.on(\"ready-check.started\", (event) => {\r\n  console.log(`Ready check initiated by ${event.data.initiatorName}, ${event.data.participantCount} participants`);\r\n});\r\n\r\nclient.on(\"ready-check.completed\", (event) => {\r\n  const { summary } = event.data;\r\n  console.log(`Ready check done: ${summary.ready}/${summary.total} ready`);\r\n});\r\n\r\n// Lifecycle hooks\r\nclient.onLifecycle(\"stream.disconnected\", ({ reason }) => {\r\n  console.warn(\"Stream lost:\", reason);\r\n});\r\nclient.onLifecycle(\"stream.reconnected\", ({ attempt }) => {\r\n  console.log(\"Back online after\", attempt, \"attempts\");\r\n});\r\n\r\n// Connect with reconnection options (all optional)\r\nawait client.connect({\r\n  autoReconnect: true,   // default: true\r\n  initialDelayMs: 1000,  // default: 1000\r\n  maxDelayMs: 30000,     // default: 30000\r\n  maxAttempts: Infinity,  // default: Infinity\r\n});\r\n\r\n// Intentional disconnect (won't trigger reconnection)\r\nclient.disconnect();\r\n```\r\n\r\n## Ready Checks\r\n\r\n20-second attendance polls targeting connected operators. Templates define reusable configs; sessions are live instances.\r\n\r\n```typescript\r\n// List templates\r\nconst { readyChecks } = await client.readyChecks.list();\r\n\r\n// Create a template\r\nconst { readyCheck } = await client.readyChecks.upsert({\r\n  message: \"Fleet departing in 2 minutes — confirm ready\",\r\n  color: \"#34CD84\",\r\n  target: { everyone: true },\r\n});\r\n\r\n// Start a session\r\nconst { session, summary } = await client.readyChecks.start(readyCheck.id, \"Fleet Commander\");\r\nconsole.log(`${summary.total} participants, expires at ${session.expiresAt}`);\r\n\r\n// Poll session status\r\nconst status = await client.readyChecks.getSession(session.id);\r\nconsole.log(`${status.summary.ready}/${status.summary.total} ready`);\r\n\r\n// Remove a template\r\nawait client.readyChecks.remove(readyCheck.id);\r\n```\r\n\r\n## ACARS Alerts\r\n\r\nBroadcast short text alerts to all connected operators:\r\n\r\n```typescript\r\nawait client.comms.sendAcars(\"Fleet departing in 60 seconds\", {\r\n  senderName: \"Fleet Commander\",\r\n  durationMs: 8500,\r\n  alertType: \"emergency\", // \"critical\" | \"emergency\" | \"non-emergency\"\r\n});\r\n```\r\n\r\n## Error Handling\r\n\r\nAll methods throw `StarCommsError` on failure:\r\n\r\n```typescript\r\nimport { StarCommsError } from \"@30k/starcomm-client\";\r\n\r\ntry {\r\n  await client.assignments.assign(\"bad_id\", 99);\r\n} catch (err) {\r\n  if (err instanceof StarCommsError) {\r\n    console.error(err.statusCode, err.message);\r\n  }\r\n}\r\n```\r\n\r\n## SSE Event Types\r\n\r\n| Event | Data Fields |\r\n|-------|-------------|\r\n| `user.joined` | `userId`, `displayName`, `transport`, `nets` |\r\n| `user.left` | `userId`, `displayName`, `transport` |\r\n| `ptt.start` | `userId`, `displayName`, `netId` |\r\n| `ptt.stop` | `userId`, `displayName`, `netId`, `reason?` |\r\n| `operation.opened` | `open` |\r\n| `operation.closed` | `open` |\r\n| `assignments.changed` | `source?`, `action?`, `userId?`, `netId?`, `keyId?` |\r\n| `config.changed` | `keyId?`, `action?`, `uid?`, `preset?` |\r\n| `client.disconnected` | `userId`, `keyId`, `disconnected` |\r\n| `acars.sent` | `id`, `text`, `durationMs`, `alertType`, `senderId`, `senderName`, `source`, `routed` |\r\n| `ready-check.configured` | `templateId`, `keyId?` |\r\n| `ready-check.removed` | `templateId`, `keyId?` |\r\n| `ready-check.started` | `sessionId`, `templateId`, `initiatorId`, `initiatorName`, `participantCount`, `expiresAt` |\r\n| `ready-check.response` | `sessionId`, `userId`, `name`, `status`, `respondedAt` |\r\n| `ready-check.completed` | `sessionId`, `templateId`, `summary` |\r\n\r\n## Local Client (Desktop Companion)\r\n\r\nA standalone WebSocket client for communicating with the StarComm desktop application's Mobile Remote interface. Completely independent from the shard Owner API client — no API keys required, just the pairing token from StarComm's settings.\r\n\r\n### Setup\r\n\r\nIn StarComm desktop: **Settings → Mobile Remote → Enable APK companion link**. Note the LAN control port and pairing token.\r\n\r\n### Usage\r\n\r\n```typescript\r\nimport { StarCommsLocalClient } from \"@30k/starcomm-client\";\r\n\r\nconst local = new StarCommsLocalClient({\r\n  token: \"your_pairing_token\",  // from StarComm settings\r\n  // host: \"127.0.0.1\",         // default; use LAN IP for remote access\r\n  // port: 8798,                // default; matches StarComm's \"LAN control port\"\r\n  debug: true,                  // enable console logging (optional)\r\n});\r\n\r\n// Listen for state updates\r\nlocal.on(\"snapshot\", (snapshot) => {\r\n  console.log(`Connected as ${snapshot.displayName}`);\r\n  console.log(`Guild: ${snapshot.guildName}`);\r\n  console.log(`Channels: ${snapshot.channels.length}`);\r\n});\r\n\r\nlocal.on(\"error\", (err) => {\r\n  console.error(\"StarComm error:\", err.message);\r\n});\r\n\r\n// Lifecycle events\r\nlocal.onLifecycle(\"connected\", () => console.log(\"Connected\"));\r\nlocal.onLifecycle(\"disconnected\", ({ reason }) => console.warn(\"Disconnected:\", reason));\r\nlocal.onLifecycle(\"reconnecting\", ({ attempt }) => console.log(\"Reconnecting...\", attempt));\r\n\r\n// Connect (returns a Promise — resolves when socket is open)\r\nawait local.connect();\r\n\r\n// Access the latest snapshot at any time\r\nconsole.log(local.snapshot?.channels);\r\n```\r\n\r\n### PTT (Push-to-Talk)\r\n\r\nThree modes available:\r\n\r\n```typescript\r\n// ptt.start — momentary (like holding a physical PTT button)\r\n// Releases automatically if no keepalive is sent.\r\nlocal.pttStart(netId);\r\n\r\n// ptt.hold — toggle/latch mode (tap to lock on, tap again or stop to release)\r\n// Use this for programmatic PTT that should stay active.\r\nlocal.pttHold(netId);\r\n\r\n// ptt.stop — release PTT on a net\r\nlocal.pttStop(netId);\r\n```\r\n\r\nFor sustained transmission, use `pttHold()` + `pttStop()`:\r\n\r\n```typescript\r\nlocal.pttHold(255);      // latch transmit on net 255\r\n// ... do things ...\r\nlocal.pttStop(255);      // release\r\n```\r\n\r\n### Admin Commands\r\n\r\nOnly work when the connected user has admin access (`snapshot.access.isAdmin === true`):\r\n\r\n```typescript\r\n// Assign/unassign a user to a net\r\nlocal.adminAssign(\"userId\", netId);\r\nlocal.adminUnassign(\"userId\", netId);\r\n\r\n// Disconnect a user\r\nlocal.adminDisconnect(\"userId\");\r\n\r\n// Broadcast an ACARS alert\r\nlocal.adminAcars(\"Fleet departing in 60 seconds\");\r\n```\r\n\r\n### Config\r\n\r\n| Option | Type | Default | Description |\r\n|--------|------|---------|-------------|\r\n| `token` | `string` | — | Pairing token (required) |\r\n| `host` | `string?` | `\"127.0.0.1\"` | StarComm host IP |\r\n| `port` | `number?` | `8798` | LAN control port |\r\n| `autoReconnect` | `boolean?` | `true` | Auto-reconnect on disconnect |\r\n| `initialDelayMs` | `number?` | `1000` | First reconnect delay |\r\n| `maxDelayMs` | `number?` | `15000` | Max reconnect delay |\r\n| `maxAttempts` | `number?` | `Infinity` | Max reconnect attempts |\r\n| `debug` | `boolean?` | `false` | Log all messages to console |\r\n\r\n### Snapshot Structure\r\n\r\nThe snapshot is sent immediately on connection and again whenever state changes:\r\n\r\n```typescript\r\ninterface LocalSnapshot {\r\n  type: \"snapshot\";\r\n  protocol: string;           // \"starcomms-client-companion\"\r\n  protocolVersion: number;    // 1\r\n  app: string;                // \"star-comms-client\"\r\n  version: string;            // e.g. \"1.50.3\"\r\n  connected: boolean;\r\n  pairedDevices: number;\r\n  userId: string;             // Discord user ID\r\n  displayName: string;\r\n  guildId: string;\r\n  guildName: string;\r\n  operationOpen: boolean;\r\n  socketStatus: string;       // \"connected\" | \"disconnected\" | ...\r\n  activeNetId: number;        // -1 = none\r\n  activeGuildId: string;\r\n  relay: { guildId, guildName, voiceEndpoint, udpVoiceEndpoint, shardName, shardActive, operationOpen };\r\n  access: { isAdmin, isFullAdmin, canCustomizeTheme };\r\n  ptt: { active, netId, channel, color };\r\n  overlay: { transmitting, transmitChannel, transmitColor, tag, language, labels, receiving[] };\r\n  receiving: [];              // users currently transmitting\r\n  channels: Channel[];        // all visible nets with members, volume, mute state\r\n  admin?: { canAssign, canManageNets, canSendAcars, acarsEnabled, acarsDurationMs, streamerMode, users[], channels[] };\r\n}\r\n```\r\n\r\n### Health Check\r\n\r\nBefore connecting via WebSocket, you can verify reachability with a plain HTTP call:\r\n\r\n```\r\nGET http://<host>:<port>/health\r\n→ {\"ok\":true,\"app\":\"star-comms-local-control\",\"port\":8798,\"clients\":1}\r\n```\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md"}