{"_id":"@bountyboard/arcade-sdk","_rev":"15-f13b4f14034f74e242f7f23c732ab5eb","name":"@bountyboard/arcade-sdk","dist-tags":{"latest":"1.4.8"},"versions":{"1.0.0":{"name":"@bountyboard/arcade-sdk","version":"1.0.0","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"license":"MIT","_id":"@bountyboard/arcade-sdk@1.0.0","maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"}],"homepage":"https://www.bountyboard.gg/arcade/sdk","bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"dist":{"shasum":"7220200d25c62a91946cf692acdd04ec5e8b3e48","tarball":"https://registry.npmjs.org/@bountyboard/arcade-sdk/-/arcade-sdk-1.0.0.tgz","fileCount":23,"integrity":"sha512-2A2wyxursBevqu/tZHCo7XiGXVqk8Dq5RRhFLPZzw0M3gFDyEKyau9JVmkRNAXiBWwzdciFt4fyASXwGkhMCKg==","signatures":[{"sig":"MEUCIQCBoitc1WsH2c0Pfgyj7wqb4GzqAgbhrNtgYmWyGEkpQwIgTTgTta8yIuDskjoZzMws7PC47IELwy26akvyqkAaQss=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":425075},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./global":{"types":"./dist/global-sdk.d.ts","default":"./dist/global.js"},"./multiplayer":{"types":"./dist/multiplayer.d.ts","import":"./dist/multiplayer.js","require":"./dist/multiplayer.cjs"}},"gitHead":"d3c295431724b2741ea1ff6701072bdb277c18bf","scripts":{"build":"tsup && node scripts/build-global-dts.mjs","clean":"rm -rf dist"},"_npmUser":{"name":"busterbounty","email":"admin@bountyboard.gg"},"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"_npmVersion":"11.16.0","description":"Bounty Board Arcade SDK — leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","directories":{},"sideEffects":true,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/arcade-sdk_1.0.0_1783803145632_0.06136880673391043","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@bountyboard/arcade-sdk","version":"1.0.1","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"license":"MIT","_id":"@bountyboard/arcade-sdk@1.0.1","maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"}],"homepage":"https://www.bountyboard.gg/arcade/sdk","bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"dist":{"shasum":"6199f007ad06bb0ba54f397aa4ad4f95564f813d","tarball":"https://registry.npmjs.org/@bountyboard/arcade-sdk/-/arcade-sdk-1.0.1.tgz","fileCount":23,"integrity":"sha512-Ux1l7r7sHIPcG7DGR2xz9m5vektTPSPFmeMX7GyrQcLR68xbn1l1EupGMKvna7qm+Tu4Ve/GOZ7TUWTTTfE6PQ==","signatures":[{"sig":"MEUCIHuA0LBVWEhHACi7nhUcfoswVgVLt01+qV3fg//ZJx2eAiEAnwF7Aasgmt/lP92fq5E4tqYUdAIQ86N0g8tEApZIgVg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":472267},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./global":{"types":"./dist/global-sdk.d.ts","default":"./dist/global.js"},"./multiplayer":{"types":"./dist/multiplayer.d.ts","import":"./dist/multiplayer.js","require":"./dist/multiplayer.cjs"}},"gitHead":"ba7ca2bfb3cb2231641b988ca596ed880aa79f35","scripts":{"build":"tsup && node scripts/build-global-dts.mjs","clean":"rm -rf dist"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:207f0882-13f7-4395-8944-dd20af853038"}},"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"_npmVersion":"11.18.0","description":"Bounty Board Arcade SDK — leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","directories":{},"sideEffects":true,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/arcade-sdk_1.0.1_1783825693636_0.6676294695596827","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bountyboard/arcade-sdk","version":"1.1.0","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"license":"MIT","_id":"@bountyboard/arcade-sdk@1.1.0","maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"}],"homepage":"https://www.bountyboard.gg/arcade/sdk","bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"dist":{"shasum":"6531f6a03de4fcbd5fd060dfd7f0b38003b2506d","tarball":"https://registry.npmjs.org/@bountyboard/arcade-sdk/-/arcade-sdk-1.1.0.tgz","fileCount":24,"integrity":"sha512-3oumghwvbyCklBHF23LlgwSz1JEcjdEzPds3p38mLkqnjKldFivITf0++zepPkwNlvA41amUiFYUdugACQ453w==","signatures":[{"sig":"MEYCIQD7DkbR637W1a2mZJKGNwHskLyTv8wE4PNkthyTKKGhpgIhAJw3SLl6w2SM96iz8q+i93icQjue9e1Y/JJbnLsriCg+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":486421},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./global":{"types":"./dist/global-sdk.d.ts","default":"./dist/global.js"},"./multiplayer":{"types":"./dist/multiplayer.d.ts","import":"./dist/multiplayer.js","require":"./dist/multiplayer.cjs"}},"gitHead":"d781587c8f4ab19d97b7913d7018ca14d15f14f8","scripts":{"build":"tsup && node scripts/build-global-dts.mjs","clean":"rm -rf dist","prepack":"pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:207f0882-13f7-4395-8944-dd20af853038"}},"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"_npmVersion":"11.18.0","description":"Bounty Board Arcade SDK — leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","directories":{},"sideEffects":true,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/arcade-sdk_1.1.0_1783964485530_0.5228722684314973","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bountyboard/arcade-sdk","version":"1.2.0","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"license":"MIT","_id":"@bountyboard/arcade-sdk@1.2.0","maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"},{"name":"grant_bountyboard","email":"grant@bountyboard.gg"}],"homepage":"https://www.bountyboard.gg/arcade/sdk","bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"dist":{"shasum":"66f86bdc7daa1a615e5f796b849ee10cc6424131","tarball":"https://registry.npmjs.org/@bountyboard/arcade-sdk/-/arcade-sdk-1.2.0.tgz","fileCount":27,"integrity":"sha512-beq8pT4nTq2mWzpOqFhMwD+zmKKvnQVS1+hgb5uC8gpPJBHGSAxSvrjBB4xSZ/buWvQovftZxkAshUp91Sj/EA==","signatures":[{"sig":"MEYCIQCCqec7tKDA4wwU5EhAIcND80OT6vJfcUOnSKk7qP0N8QIhAKhyy4HBDvefVMEWpkhhJq3Roz9pYEI44d65wcbv/Yht","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":594501},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./global":{"types":"./dist/global-sdk.d.ts","default":"./dist/global.js"},"./multiplayer":{"types":"./dist/multiplayer.d.ts","import":"./dist/multiplayer.js","require":"./dist/multiplayer.cjs"}},"gitHead":"d012e9e14b197d60d3e84dbaa31fb45e6604edcf","scripts":{"test":"pnpm --dir ../.. test -- packages/arcade-sdk","build":"tsup && node scripts/build-global-dts.mjs","clean":"rm -rf dist","prepack":"pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:207f0882-13f7-4395-8944-dd20af853038"}},"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"_npmVersion":"11.18.0","description":"Bounty Board Arcade SDK — leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","directories":{},"sideEffects":true,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/arcade-sdk_1.2.0_1784848422759_0.6280119339307975","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@bountyboard/arcade-sdk","version":"1.3.0","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"license":"MIT","_id":"@bountyboard/arcade-sdk@1.3.0","maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"},{"name":"grant_bountyboard","email":"grant@bountyboard.gg"}],"homepage":"https://www.bountyboard.gg/arcade/sdk","bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"dist":{"shasum":"e9f296fe57219def0daecd00e258b893f2317ba9","tarball":"https://registry.npmjs.org/@bountyboard/arcade-sdk/-/arcade-sdk-1.3.0.tgz","fileCount":27,"integrity":"sha512-FSgItUc+cjdVSCDt4aFUT8bYOtZoGRFuCjAvJGci7D36GaHReVyeTQKHseWCoASa6jmUu3jiXLOqIZfuo7c84Q==","signatures":[{"sig":"MEYCIQCMh0NfySuPS3vWHSTotMNKU6gZM9XGSRjl7xuh3VVBVQIhAP6qdFD0n8l2pabhqCIfzMjBthH+l9kSLDAnk+YizG3g","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":731904},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./global":{"types":"./dist/global-sdk.d.ts","default":"./dist/global.js"},"./multiplayer":{"types":"./dist/multiplayer.d.ts","import":"./dist/multiplayer.js","require":"./dist/multiplayer.cjs"}},"gitHead":"bcf01262963161a9d74fb074a6f3d48545e12d7e","scripts":{"test":"pnpm --dir ../.. test -- packages/arcade-sdk","build":"tsup && node scripts/build-global-dts.mjs","clean":"rm -rf dist","prepack":"pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:207f0882-13f7-4395-8944-dd20af853038"}},"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"_npmVersion":"11.18.0","description":"Bounty Board Arcade SDK — leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","directories":{},"sideEffects":true,"_nodeVersion":"24.18.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/arcade-sdk_1.3.0_1785194147190_0.4969993298893236","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bountyboard/arcade-sdk","version":"1.4.0","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"license":"MIT","_id":"@bountyboard/arcade-sdk@1.4.0","maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"},{"name":"grant_bountyboard","email":"grant@bountyboard.gg"}],"homepage":"https://www.bountyboard.gg/arcade/sdk","bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"dist":{"shasum":"3718ed3a31682fd9469e247e5747f4997c962b5d","tarball":"https://registry.npmjs.org/@bountyboard/arcade-sdk/-/arcade-sdk-1.4.0.tgz","fileCount":27,"integrity":"sha512-9MFt1zE/aG23fB0mE85sppNrNGiqTvC+k/BC2jZWVMlLaHJMblPrY51vDv7b2+JIXfAQf0apVwmyWmKot9x0Gw==","signatures":[{"sig":"MEUCIHE++NUE/pKxbfKMVMHK62whdyjeZdANkZV8m61V+Y2SAiEAtGVyftH+y52lFVPvmfhvrRb/paXKEcLCuetM34kixhs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCVYi/n4nPfDm8OZxV4zFRdsdPwEkqbyEy5/gmunDxiVwIgXYw3rDjUetwKG0OAhp9IDQgEOD9MMQT29lc2haj8iMA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":734792},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./global":{"types":"./dist/global-sdk.d.ts","default":"./dist/global.js"},"./multiplayer":{"types":"./dist/multiplayer.d.ts","import":"./dist/multiplayer.js","require":"./dist/multiplayer.cjs"}},"gitHead":"2fd29ec181f5cede25d9e2620f11803987ac8823","scripts":{"test":"pnpm --dir ../.. test -- packages/arcade-sdk","build":"tsup && node scripts/build-global-dts.mjs","clean":"rm -rf dist","prepack":"pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:207f0882-13f7-4395-8944-dd20af853038"}},"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"_npmVersion":"11.18.0","description":"Bounty Board Arcade SDK: leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","directories":{},"sideEffects":true,"_nodeVersion":"24.19.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/arcade-sdk_1.4.0_1788449131591_0.6896422533819355","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@bountyboard/arcade-sdk","version":"1.4.1","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"license":"MIT","_id":"@bountyboard/arcade-sdk@1.4.1","maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"},{"name":"grant_bountyboard","email":"grant@bountyboard.gg"}],"homepage":"https://www.bountyboard.gg/arcade/sdk","bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"dist":{"shasum":"29ab0a9b76a78f7a24ce28be9eab66ebdd908a4d","tarball":"https://registry.npmjs.org/@bountyboard/arcade-sdk/-/arcade-sdk-1.4.1.tgz","fileCount":27,"integrity":"sha512-mRzuscloceoO2IvIFWH0g/fNqiRSuM5arFzyZLSJ2ro7rNOzhjJV+b9sNBRflKHX8RBQxTD9qu/gvPDbhaemgA==","signatures":[{"sig":"MEQCIDeDail7b3yOmQyzPp0xH3V14PFZ8tgP7OKGOC1yAYJyAiAIgmeqB4Q1IMhc8b2EAHE5gzVCWIanMvI2pm1K0gAmug==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEjOHoTHfQ9kVWm193K3M1xaaOcEL7jcBf3+0u2aC+GfAiEA3Lil7w0tP3x5R+Y83t5ZLBDlBmMo739Zom9AlKz8oA4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":735347},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./global":{"types":"./dist/global-sdk.d.ts","default":"./dist/global.js"},"./multiplayer":{"types":"./dist/multiplayer.d.ts","import":"./dist/multiplayer.js","require":"./dist/multiplayer.cjs"}},"gitHead":"3551194a7fb0c2344c9ac9479ba71fc680a32775","scripts":{"test":"pnpm --dir ../.. test -- packages/arcade-sdk","build":"tsup && node scripts/build-global-dts.mjs","clean":"rm -rf dist","prepack":"pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:207f0882-13f7-4395-8944-dd20af853038"}},"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"_npmVersion":"11.18.0","description":"Bounty Board Arcade SDK: leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","directories":{},"sideEffects":true,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/arcade-sdk_1.4.1_1788832524158_0.8446441864833885","host":"s3://npm-registry-packages-npm-production"}},"1.4.2":{"name":"@bountyboard/arcade-sdk","version":"1.4.2","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"license":"MIT","_id":"@bountyboard/arcade-sdk@1.4.2","maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"},{"name":"grant_bountyboard","email":"grant@bountyboard.gg"}],"homepage":"https://www.bountyboard.gg/arcade/sdk","bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"dist":{"shasum":"e3226c16bf816d1b0726ad6115847cb6db37ceee","tarball":"https://registry.npmjs.org/@bountyboard/arcade-sdk/-/arcade-sdk-1.4.2.tgz","fileCount":27,"integrity":"sha512-ppHU2uGkRCta3Hx6hBivIU7FvUv8lbOMEO4lqfhGJr6MJqtJs9cTv1eIaBoGfQUsdGpjf3H/e3ggdJSaHrCDcA==","signatures":[{"sig":"MEUCIF6NmpSuJsRVFxv5OfEXGOWdZ5EwwscixcZxWIslDh/yAiEA16J4ZPL64KU5hfdPzJWk3asPsUmjm9TB6dVceCCbk+A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD5uElnUEER2NwjzkR7C44BAKqMMBF5JXdf9o5siXrQ0wIhAPHEzBgwgEGrFmw/z49G4J406mxmCDVz8GAyPTskdTKe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":735585},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./global":{"types":"./dist/global-sdk.d.ts","default":"./dist/global.js"},"./multiplayer":{"types":"./dist/multiplayer.d.ts","import":"./dist/multiplayer.js","require":"./dist/multiplayer.cjs"}},"gitHead":"089d2e2bc65d2d781eafef5e2e864e4eb1af9dfb","scripts":{"test":"pnpm --dir ../.. test -- packages/arcade-sdk","build":"tsup && node scripts/build-global-dts.mjs","clean":"rm -rf dist","prepack":"pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:207f0882-13f7-4395-8944-dd20af853038"}},"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"_npmVersion":"11.18.0","description":"Bounty Board Arcade SDK: leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","directories":{},"sideEffects":true,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/arcade-sdk_1.4.2_1789054192586_0.7168220462894048","host":"s3://npm-registry-packages-npm-production"}},"1.4.3":{"name":"@bountyboard/arcade-sdk","version":"1.4.3","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"license":"MIT","_id":"@bountyboard/arcade-sdk@1.4.3","maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"},{"name":"grant_bountyboard","email":"grant@bountyboard.gg"}],"homepage":"https://www.bountyboard.gg/arcade/sdk","bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"dist":{"shasum":"71ddb17ca76630599176ea217f050319bc225065","tarball":"https://registry.npmjs.org/@bountyboard/arcade-sdk/-/arcade-sdk-1.4.3.tgz","fileCount":27,"integrity":"sha512-uRMOFuHvEpbLcKO+I3zI6H4rwDzQ+rUdzkG5nttvncn3O43RD2Qh9tH6ZBASmluVDEsDElmrXLsG9+LYnBfRnA==","signatures":[{"sig":"MEYCIQCLkIq/9G65vDQgArdS6iG6jyye7VVcDL+y1pFTW+MvugIhAJNJmroNwK4d9HR3Rk4mU4xkJ6VPFRbf47nemLTxjCzh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFpaNkz0S6r7ziR43Ch4WbdAguwSl//d/gjEo6+C1S2jAiEAl/OOnR/0tycjd9G8aqoS4idPo3QxQzhdzzxex7W85CM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":735751},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./global":{"types":"./dist/global-sdk.d.ts","default":"./dist/global.js"},"./multiplayer":{"types":"./dist/multiplayer.d.ts","import":"./dist/multiplayer.js","require":"./dist/multiplayer.cjs"}},"gitHead":"381a07fd67b79f0d113e85535df4e3bf954baf57","scripts":{"test":"pnpm --dir ../.. test -- packages/arcade-sdk","build":"tsup && node scripts/build-global-dts.mjs","clean":"rm -rf dist","prepack":"pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:207f0882-13f7-4395-8944-dd20af853038"}},"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"_npmVersion":"11.18.0","description":"Bounty Board Arcade SDK: leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","directories":{},"sideEffects":true,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/arcade-sdk_1.4.3_1789337286775_0.7668007126004754","host":"s3://npm-registry-packages-npm-production"}},"1.4.4":{"name":"@bountyboard/arcade-sdk","version":"1.4.4","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"license":"MIT","_id":"@bountyboard/arcade-sdk@1.4.4","maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"},{"name":"grant_bountyboard","email":"grant@bountyboard.gg"}],"homepage":"https://www.bountyboard.gg/arcade/sdk","bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"dist":{"shasum":"d7a9f0b70c89bdcc3beafc28cd69bb9f63581203","tarball":"https://registry.npmjs.org/@bountyboard/arcade-sdk/-/arcade-sdk-1.4.4.tgz","fileCount":27,"integrity":"sha512-It1AeHvQAoGhMRs8yvPbS6tA5yGyUnuFM+o9asI94e1MxeoZtL+iIMoVEstGq4EbKgmylzabwUxjmDjJDtRFsg==","signatures":[{"sig":"MEUCID9v4pKnlZIipJqSIEQ5fxpUl1UhPb4CRWMY0Rlu/H5yAiEA9fbAutdkF8OdoF56U5hR6KSZSpH0txs4GUai+AGTL6o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIH6ssVJ/5PV5wpQD+n43j4VQRtiqNFEh9t/49hux+C2jAiBufXQdYRjQQvBbx/e7klh8Zgc8rlSs0ix1EmX+hZ4VSQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":735924},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./global":{"types":"./dist/global-sdk.d.ts","default":"./dist/global.js"},"./multiplayer":{"types":"./dist/multiplayer.d.ts","import":"./dist/multiplayer.js","require":"./dist/multiplayer.cjs"}},"gitHead":"7d23ed705755be57580aacb495ea6a0b6e6da460","scripts":{"test":"pnpm --dir ../.. test -- packages/arcade-sdk","build":"tsup && node scripts/build-global-dts.mjs","clean":"rm -rf dist","prepack":"pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:207f0882-13f7-4395-8944-dd20af853038"}},"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"_npmVersion":"11.18.0","description":"Bounty Board Arcade SDK: leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","directories":{},"sideEffects":true,"_nodeVersion":"24.20.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/arcade-sdk_1.4.4_1789396304879_0.13845511963938217","host":"s3://npm-registry-packages-npm-production"}},"1.4.5":{"name":"@bountyboard/arcade-sdk","version":"1.4.5","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"license":"MIT","_id":"@bountyboard/arcade-sdk@1.4.5","maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"},{"name":"grant_bountyboard","email":"grant@bountyboard.gg"}],"homepage":"https://www.bountyboard.gg/arcade/sdk","bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"dist":{"shasum":"3a69551c018a0a18dfa70551af3f196ace51f275","tarball":"https://registry.npmjs.org/@bountyboard/arcade-sdk/-/arcade-sdk-1.4.5.tgz","fileCount":27,"integrity":"sha512-EOUA5/wyx9S/2zY7hpsfrpR5sh5UVDWTdpTUbrtwcIOqq+Xjqkw3HKEpetRnP1US8hm6y+Qj5nk4cGgHRN3bqg==","signatures":[{"sig":"MEUCIHp7L7hbMaMfc9noM7B7y8zgDzz86d8ZbcDcczi9W3bpAiEAnziTSghAPJ4Yjtigb23lw5BnNFmnQyHEA5UVpZ+t8kg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD3IoHEey1I1gXogmzj4/Beh/7U55C+0IMqBEEMar9IrAIhAOqdhBCxUZPsxWsPf8dlo4fpe+OnLdhoDPYK3YkmAfOx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":745066},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./global":{"types":"./dist/global-sdk.d.ts","default":"./dist/global.js"},"./multiplayer":{"types":"./dist/multiplayer.d.ts","import":"./dist/multiplayer.js","require":"./dist/multiplayer.cjs"}},"gitHead":"86a2e0ee3de43cb3f49b6d644db2c8661243b5ad","scripts":{"test":"pnpm --dir ../.. test -- packages/arcade-sdk","build":"tsup && node scripts/build-global-dts.mjs","clean":"rm -rf dist","prepack":"pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:207f0882-13f7-4395-8944-dd20af853038"}},"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"_npmVersion":"11.18.0","description":"Bounty Board Arcade SDK: leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","directories":{},"sideEffects":true,"_nodeVersion":"24.21.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/arcade-sdk_1.4.5_1790377370686_0.9502501546418298","host":"s3://npm-registry-packages-npm-production"}},"1.4.6":{"name":"@bountyboard/arcade-sdk","version":"1.4.6","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"license":"MIT","_id":"@bountyboard/arcade-sdk@1.4.6","maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"},{"name":"grant_bountyboard","email":"grant@bountyboard.gg"}],"homepage":"https://www.bountyboard.gg/arcade/sdk","bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"dist":{"shasum":"46eaf30b4d91ef08f54c3053eeb87d0e13d5fc1c","tarball":"https://registry.npmjs.org/@bountyboard/arcade-sdk/-/arcade-sdk-1.4.6.tgz","fileCount":27,"integrity":"sha512-DmOuB4EnFXofhTqysstyV4ZI6Z8RCrFSpjK0Yy1gWrdxwAYoJ+ysTyvNpaVIb+T/wkf7InoQswbTeSyqrESlog==","signatures":[{"sig":"MEYCIQDgM3MPFrGZ4bgycxWXivpqLudbwZ6aSRj3f26bxy6/zQIhAOj1zzQPpPY+TZQO9Ef5Dq2tP89O2qNzRsAIl7TCIB1l","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDtzsfFHqcuiR9Fc5z9QlwQh1qkwYo0cYY1aTlJUSn0YAiEAwBUQK+I1CufvxhwSjWEqiVQzZPOt/qVEAs7VA01Qfgs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":745337},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./global":{"types":"./dist/global-sdk.d.ts","default":"./dist/global.js"},"./multiplayer":{"types":"./dist/multiplayer.d.ts","import":"./dist/multiplayer.js","require":"./dist/multiplayer.cjs"}},"gitHead":"58f278d78d83664115e087124e974e40d1a200c3","scripts":{"test":"pnpm --dir ../.. test -- packages/arcade-sdk","build":"tsup && node scripts/build-global-dts.mjs","clean":"rm -rf dist","prepack":"pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:207f0882-13f7-4395-8944-dd20af853038"}},"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"_npmVersion":"11.18.0","description":"Bounty Board Arcade SDK: leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","directories":{},"sideEffects":true,"_nodeVersion":"24.21.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/arcade-sdk_1.4.6_1790438785026_0.8192377455939814","host":"s3://npm-registry-packages-npm-production"}},"1.4.7":{"name":"@bountyboard/arcade-sdk","version":"1.4.7","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"license":"MIT","_id":"@bountyboard/arcade-sdk@1.4.7","maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"},{"name":"grant_bountyboard","email":"grant@bountyboard.gg"}],"homepage":"https://www.bountyboard.gg/arcade/sdk","bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"dist":{"shasum":"6374b7fa09daf9cbdb803144c78729e1608f3eb5","tarball":"https://registry.npmjs.org/@bountyboard/arcade-sdk/-/arcade-sdk-1.4.7.tgz","fileCount":27,"integrity":"sha512-ZKoNRGtvRGL6saglSbvA3A4FEKXMHyE/a3a6h6aESvehkARWRlkCoZmQjAdnVagLEZe4A5WwrLvw11NSRiKzhw==","signatures":[{"sig":"MEQCIGMIw5DHOGd2u9qogclKTXo5eyHZp2WzqEmMdE/zcF0SAiAeN8xePBuOlqLgKkMBYfI7eRDzxD5Fbp3sAx0Wg5UGjA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIF/e9+vJBSASLObrrtF8msGvASYBJlbCT2GucFcNSeFcAiAYOMu5RPU7kUtm9Lx74oIabMLNGB0c77bXLZRwOu7O+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":745547},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./global":{"types":"./dist/global-sdk.d.ts","default":"./dist/global.js"},"./multiplayer":{"types":"./dist/multiplayer.d.ts","import":"./dist/multiplayer.js","require":"./dist/multiplayer.cjs"}},"gitHead":"92a9fdad63256cda4a228c715a6233565a7ee050","scripts":{"test":"pnpm --dir ../.. test -- packages/arcade-sdk","build":"tsup && node scripts/build-global-dts.mjs","clean":"rm -rf dist","prepack":"pnpm build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"207f0882-13f7-4395-8944-dd20af853038"}},"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"_npmVersion":"11.18.0","description":"Bounty Board Arcade SDK: leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","directories":{},"sideEffects":true,"_nodeVersion":"24.21.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5"},"_npmOperationalInternal":{"tmp":"tmp/arcade-sdk_1.4.7_1790884128432_0.027002327196709253","host":"s3://npm-registry-packages-npm-production"}},"1.4.8":{"_id":"@bountyboard/arcade-sdk@1.4.8","bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"dist":{"shasum":"089c661a2197a2fd33a9351e90425ef8a9c836b7","tarball":"https://registry.npmjs.org/@bountyboard/arcade-sdk/-/arcade-sdk-1.4.8.tgz","fileCount":27,"integrity":"sha512-rCQNeBkj2cZLKCM5DTSv7rWcGZ6YhgdDSPuk4YGT5Uw43PUrgQVuvKC+B1oiQALIRbxsLZYgMuK+qRAmlsvU2A==","signatures":[{"sig":"MEYCIQCYZWhqSAdYUZN+4p/aCywcvruXWCLaLHoMB7ffCIXt/AIhANwy6qD8xzWqOO8oKbbbYfZv4zmRfZimqc40hDU6Rvvf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIB+5/FMGg4aahUBiylGhypu6PG1uRWGJxuZuPYZzBBXXAiEA5R4Y6GxoS9VIBEIPVQB1dkcGk+gRCfvS2GmmMUu62rw="}],"unpackedSize":745787},"main":"./dist/index.cjs","name":"@bountyboard/arcade-sdk","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./global":{"types":"./dist/global-sdk.d.ts","default":"./dist/global.js"},"./multiplayer":{"types":"./dist/multiplayer.d.ts","import":"./dist/multiplayer.js","require":"./dist/multiplayer.cjs"}},"gitHead":"e483905f38e7417b830e5cfe3d2803926b53a382","license":"MIT","scripts":{"test":"pnpm --dir ../.. test -- packages/arcade-sdk","build":"tsup && node scripts/build-global-dts.mjs","clean":"rm -rf dist","prepack":"pnpm build"},"version":"1.4.8","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"207f0882-13f7-4395-8944-dd20af853038"}},"homepage":"https://www.bountyboard.gg/arcade/sdk","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"_npmVersion":"11.18.0","description":"Bounty Board Arcade SDK: leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","directories":{},"maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"},{"name":"grant_bountyboard","email":"grant@bountyboard.gg"}],"sideEffects":true,"_nodeVersion":"24.21.0","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/arcade-sdk_1.4.8_1790907380443_0.922449531194498"}}},"time":{"created":"2026-07-11T20:52:25.466Z","modified":"2026-10-02T02:16:20.760Z","1.0.0":"2026-07-11T20:52:25.768Z","1.0.1":"2026-07-12T03:08:13.777Z","1.1.0":"2026-07-13T17:41:25.678Z","1.2.0":"2026-07-23T23:13:42.909Z","1.3.0":"2026-07-27T23:15:47.369Z","1.4.0":"2026-09-03T15:25:31.693Z","1.4.1":"2026-09-08T01:55:24.245Z","1.4.2":"2026-09-10T15:29:52.682Z","1.4.3":"2026-09-13T22:08:06.864Z","1.4.4":"2026-09-14T14:31:44.974Z","1.4.5":"2026-09-25T23:02:50.781Z","1.4.6":"2026-09-26T16:06:25.129Z","1.4.7":"2026-10-01T19:48:48.543Z","1.4.8":"2026-10-02T02:16:20.544Z"},"bugs":{"url":"https://github.com/zachery-moore/bounty-board/issues"},"license":"MIT","homepage":"https://www.bountyboard.gg/arcade/sdk","keywords":["bountyboard","arcade","game","sdk","leaderboard","html5"],"repository":{"url":"git+https://github.com/zachery-moore/bounty-board.git","type":"git","directory":"packages/arcade-sdk"},"description":"Bounty Board Arcade SDK: leaderboards, cloud saves, rewarded ads, A/B variants, and multiplayer rooms for games on bountyboard.gg","maintainers":[{"name":"busterbounty","email":"admin@bountyboard.gg"},{"name":"grant_bountyboard","email":"grant@bountyboard.gg"}],"readme":"# @bountyboard/arcade-sdk\n\nAdd Bounty Board leaderboards, cloud saves, player display identity, A/B variants,\nrewarded ads, site lock, WebXR playtime, and authoritative multiplayer to an\nHTML5 game.\n\n- Zero runtime dependencies\n- ESM, CommonJS, global, and strict TypeScript declarations\n- Safe to import during SSR or prerendering\n- Safe standalone behavior: the SDK never becomes a requirement for booting or playing\n\n## Quickstart\n\n```bash\nnpm install @bountyboard/arcade-sdk\n```\n\n```ts\nimport { BBArcade } from '@bountyboard/arcade-sdk';\n\n// Optional; call before boot. 'play.yourgame.com' is a placeholder: allow lists\n// the domains YOU host on, and Bounty Board plus localhost are always allowed,\n// so a Bounty-hosted build needs no allow list (or no call at all).\nBBArcade.lockToHost({ allow: ['play.yourgame.com'] });\nvoid BBArcade.init(); // host handshake; awaiting is optional\n\nexport function onGameReady() {\n  BBArcade.gameLoadingFinished();\n}\n\nexport function onRunStart() {\n  BBArcade.gameplayStart();\n}\n\nexport function onScoreChange(score: number) {\n  BBArcade.submitScore(Math.trunc(score));\n}\n\nexport function onPause() {\n  BBArcade.gameplayStop();\n}\n\nexport function onRunEnd(finalScore: number) {\n  BBArcade.gameplayStop();\n  BBArcade.gameOver(Math.trunc(finalScore)); // exactly once per run\n}\n```\n\nNo build step? Load the same SDK as a global:\n\n```html\n<script src=\"https://www.bountyboard.gg/arcade-sdk/v1.js\"></script>\n<script>\n  void BBArcade.init();\n\n  // Call this from your game when assets and the first scene are playable.\n  function onGameReady() {\n    BBArcade.gameLoadingFinished();\n  }\n</script>\n```\n\nThe script tag installs `window.BBArcade`. Do not mix it with the npm package\nin one page. Standalone declarations are available from\n[`/arcade-sdk.d.ts`](https://www.bountyboard.gg/arcade-sdk.d.ts). If a bundler\nspecifically needs the global build, import `@bountyboard/arcade-sdk/global`.\n\nBundle note: importing the package attaches the host `postMessage` listeners\nimmediately (the host pushes its config at load time, so listener timing is\npart of the protocol), so the package is honestly marked `sideEffects: true`\nand will not tree-shake. The full script-tag build is ~55 KB unminified;\nmodule consumers who only use multiplayer still get the whole core.\n\n## Runtime support\n\nnpm versus script tag only changes how the SDK loads. The environment where\nthe game runs determines which host-backed features are available.\n\n| Capability                        | Bounty-hosted upload | Approved URL embed inside Bounty Board | Standalone / own site |\n| --------------------------------- | -------------------- | -------------------------------------- | --------------------- |\n| Lifecycle, scores, host analytics | Supported            | Supported                              | Safe no-op            |\n| Player identity                   | Player or `null`     | Player or `null`                       | `null`                |\n| A/B variants                      | Stable assignment    | Stable assignment                      | Alphabetical control  |\n| Cloud save / load                 | Logged-in players    | Unsupported                            | Unsupported           |\n| Native `localStorage`             | Throws (opaque)      | Works on your origin                   | Works                 |\n| Rewarded ads                      | Approved games       | Unavailable (no payable attribution)   | Unavailable           |\n| Multiplayer                       | Enabled authority    | Enabled authority                      | Unsupported           |\n\nAn externally hosted URL opened directly is standalone play. The same URL\ninside the approved Bounty Board player is a URL embed. Guests are normal:\nidentity resolves `null`, and account-backed promises may reject with\n`code: 'unauthenticated'`.\n\n## Correct lifecycle\n\n```text\nlockToHost() -> init() -> [getPlayer()] -> gameLoadingFinished()\n  -> per run: gameplayStart() -> submitScore()* -> gameplayStop() -> gameOver()\n  -> save() at checkpoints or game over\n```\n\n`gameplayStart()` and `gameplayStop()` bracket active play, not menus. Call\n`gameOver()` exactly once per run and submit integer scores. Pass\n`{ mode: 'daily' }` to both score calls for a shared-seed Daily run.\n\nThe SDK must never be load-bearing. With no host present:\n\n- fire-and-forget signals no-op;\n- `init()` resolves after a short grace;\n- `getPlayer()` resolves `null`;\n- `getVariant()` returns the alphabetically first control;\n- save, load, ads, and multiplayer settle quickly with their documented\n  unsupported/unavailable outcomes.\n\nYour game must still boot and remain fully playable when all of those outcomes\nhappen at once.\n\n## Cloud saves\n\nStore the whole progress model as one string blob (about 1 MB maximum). Save at\ncheckpoints or game over, never in a hot loop.\n\n```ts\nimport type { BBArcadeError } from '@bountyboard/arcade-sdk';\n\nconst blob = JSON.stringify(progress);\n\ntry {\n  await BBArcade.save(blob);\n} catch (error) {\n  const code = (error as BBArcadeError).code;\n  if (code === 'unsupported') localStorage.setItem('progress', blob);\n}\n\ntry {\n  const saved = await BBArcade.load(); // string or null when no save exists\n  if (saved) restore(JSON.parse(saved));\n} catch {\n  restoreStandaloneProgress();\n}\n```\n\nHosted uploads run in an opaque-origin sandbox without `localStorage`; SDK\ncloud save is primary there. URL embeds and standalone builds need their own\nsame-origin storage. Oversized blobs reject `too_large` immediately (a\nclient-side precheck against the same 1 MiB cap the server enforces), and a\nhost that never answers rejects `error` after a 15-second request timeout.\nThe same timeout covers load, variant, and multiplayer ticket requests. Every\nsave/load rejection is a real `Error` with a typed `code`:\n\n```text\nunsupported | unauthenticated | too_large | rejected | error\n```\n\n## Engine exports: the localStorage shim\n\nPrefer `save()`/`load()` when you control the source. The shim is for engine\nruntimes whose storage layer can't be rewired without patching engine\ninternals: GameMaker HTML5 (`ini_open`, `ini_write_*`, and `game_save` all sit\non `localStorage`), Godot, Unity, Construct. It replaces the throwing\n`localStorage` with a Storage-shaped object backed by your cloud save, so those\nbuilds persist per player and across devices with no engine changes.\n\nThe script-tag build installs it at load, so the only requirement is load order:\n\n```html\n<script src=\"https://www.bountyboard.gg/arcade-sdk/v1.js\"></script>\n<script src=\"html5game/YourGame.js\"></script>\n```\n\nModule consumers keep a side-effect-free import and install it themselves,\nbefore any engine code runs:\n\n```ts\nBBArcade.storage.install(); // idempotent; no-op where a real Storage works\n\n// getItem() is synchronous but the cloud read that fills it is not.\nconst mode = await BBArcade.storage.ready(); // 'cloud' | 'memory' | 'native'\nstartGame();\n```\n\nWrites made before hydration are kept and merged with the cloud read (your\nwrite wins; a `removeItem` isn't resurrected), and nothing is pushed to the\nserver until that read has SUCCEEDED. A failed read is retried, and a write\nthat still can't confirm what the player had is refused rather than allowed to\noverwrite it blind, so neither a fresh-start write at boot nor a transport blip\ncan wipe an existing save. `sessionStorage` is shimmed too, but memory-only. Guests and\nstandalone play settle in `memory` mode: storage works for the session and is\nnever persisted. `setItem` throws `QuotaExceededError` past the save cap, like\na real Storage.\n\n`save()`/`load()` keep working alongside it: the player has one save slot, so\nboth halves share it inside a tagged envelope that `load()` unwraps. A raw blob\nwritten before the shim existed reads back untouched.\n\n## Player identity and A/B variants\n\nThe SDK only provides public display identity. It never exposes account ids,\nemails, or roles.\n\n```ts\nconst player = await BBArcade.getPlayer();\nif (player) {\n  greet(player.name);\n  if (player.avatarUrl) drawAvatar(player.avatarUrl);\n}\n\n// Alphabetical first is the standalone/error control: \"control\" here.\nconst variant = await BBArcade.getVariant('start-cta', ['control', 'short-label']);\nrenderStartButton(variant ?? 'control');\n```\n\nAlways handle `getPlayer() === null` and `avatarUrl === null`. Variant\nassignments are stable per player, game, and key. Do not re-randomize them in\nthe client.\n\n`getPlayer()` is a one-shot read of the identity at handshake time. To react\nwhen the player logs in or out mid-session, subscribe to changes:\n\n```ts\nconst unsubscribe = BBArcade.onPlayerChange(player => {\n  // Fires only when the identity actually changes; null means logged out.\n  updateGreeting(player);\n});\n// Later, when the UI is gone: unsubscribe();\n```\n\n## Rewarded ads: prepare, then show from the player gesture\n\nNew integrations should use `prepareRewardedAd()`. Prepare when a natural\nreward panel opens, keep the Watch Ad control disabled until the result is\n`ready`, and call its one-shot `show()` directly inside the click/tap handler.\n\n```ts\nconst button = document.querySelector<HTMLButtonElement>('#watch-ad')!;\nbutton.disabled = true;\n\nconst prepared = await BBArcade.prepareRewardedAd({\n  placement: 'death_revive',\n  reward: 'extra_life',\n  onStart: () => pauseGameAndAudio(),\n});\n\nif (prepared.status === 'ready') {\n  button.disabled = false;\n  button.addEventListener(\n    'click',\n    () => {\n      // Keep first: no await, timer, microtask, or network call before show().\n      const resultPromise = prepared.show();\n      button.disabled = true;\n\n      void resultPromise.then(result => {\n        resumeGameAndAudio();\n        if (result.status === 'viewed') revivePlayer();\n        else keepNormalFallbackAvailable();\n      });\n    },\n    { once: true }\n  );\n} else {\n  keepNormalFallbackAvailable();\n}\n```\n\nOnly the final `status === 'viewed'` grants a reward. `dismissed`,\n`unavailable`, and `error` are non-rewarding; a prepared ad whose break ends\nbefore `show()` is ever called also resolves `dismissed`, never `ready`.\nNever auto-trigger, loop, or auto-retry an ad. `rewardedBreak()` remains for\ncompatibility with shipped games but cannot preserve direct browser user\nactivation in every case.\n\n## Multiplayer rooms\n\nSDK 1.1 adds production room support with bounded `joinData`, observable\nreconnect state, and explicit `trySend()` backpressure. SDK 1.2 adds public\nquick match.\n\nMultiplayer is enabled per game and runs on one of three rails, all behind the\nsame `joinRoom()` transport:\n\n1. **Built-in relay rooms** (the default): every multiplayer-approved game\n   gets hosted casual lobbies with zero server code. The relay owns signed\n   admission, roster, seat capacity, host succession, and rate-guarded public\n   message fan-out; it never interprets payloads, never settles, and never\n   reports results, so relay outcomes are client-trusted. See the\n   [relay room guide](https://www.bountyboard.gg/arcade/sdk/relay-rooms.txt).\n2. **Refereed Bounty-hosted modules**: a curated server module validates\n   inputs, runs the only simulation, and emits authoritative results.\n3. **Registered external authorities**: a mature game keeps its own server\n   with a dedicated ticket key.\n\nThe platform assigns the rail per game slug; clients cannot select it.\n\n```ts\nimport { joinRoom } from '@bountyboard/arcade-sdk/multiplayer';\n\nconst room = await joinRoom({\n  create: true, // or code: 'ABCD', or match: true for public quick match\n  joinData: { avatar: 'golem', mode: 'ffa' }, // untrusted; server validates\n});\n\nshowShareCode(room.code);\nroom.on('snapshot', ({ state }) => renderAuthoritativeState(state));\nroom.on('connection', ({ connected }) => setReconnecting(!connected));\nroom.on('end', ({ results }) => showResults(results)); // finite games only\n\nonPlayerInput(input => {\n  if (!room.trySend(input)) setReconnecting(true);\n});\n\nonExit(() => room.leave());\n```\n\nOn the refereed and external rails, clients send inputs, never authoritative\nstate. On the relay rail, `room.send(data)` fans the payload publicly to every\nplayer (including the sender) in per-tick batches of\n`{ type: 'relay', messages: [{ from, data }] }`; the room's first joiner fixes\nthe seat count with `joinData.roomSize` (an integer 2–64, default 8), the\noldest retained seat is host (`state.hostId`, changes broadcast as\n`{ type: 'relay_host', hostId }`), and traffic is capped at 1 KiB per message,\n15 messages per player per second, and 120 per room per second.\n\nTwo tuning hooks: `joinRoom({ timeoutMs })` overrides how long a join (and\neach reconnect attempt) waits for the server's welcome before rejecting with\n`code: 'error'` (default 10000, clamped to 1000–60000), and `room.latencyMs`\nreports the join-handshake latency (socket open to server welcome, refreshed\non every reconnect; `null` until the first welcome). Treat it as an estimate\nfor tuning render-side smoothing, not a measured RTT.\n\nRooms are lobby-based: each game module declares its player range (up to 64\nper room). `match: true` is public quick match: Bounty Board fills the game's\nopen public room and starts a fresh one when no seat is free; the matched\nroom's `room.code` still works as an invite code. When the last free seat is\nlost to a race the SDK re-matchmakes automatically (up to two retries) before\nrejecting with `code: 'rejected'` and `detail: 'room_full'`. Quick match is\nmutually exclusive with `code`/`create` and is unavailable on external\nauthorities, which run their own rooms.\n\n### Latency model\n\nRefereed and external rooms are state-sync only: the server simulates, clients receive per-viewer\nsnapshots at the room tick rate, and every input takes a network round trip\nbefore its effect appears in a snapshot. There is no built-in client-side\nprediction, interpolation, or rollback. Design for it: turn-based, timing-duel,\nscore-race, and party games feel native; twitch physics (fighting games,\nprecision platform duels) need your own render-side smoothing: interpolate\nbetween snapshots and animate optimistic feedback for the local player's input,\nbut treat the next snapshot as truth. Assume 50-150 ms of input-to-snapshot\nlatency on real connections when tuning game feel. (Relay rooms differ: game\nmessages arrive as public per-tick event batches, and all game rules live in\nyour clients.) Every referee or external authority must:\n\n- validate admission, `joinData`, and every input;\n- clear held controls on disconnect;\n- run the only simulation;\n- serialize only viewer-safe state;\n- return server-authored results for finite games;\n- avoid fabricating `match_end` for endless rooms.\n\n`joinData` is untrusted JSON capped at 1 KiB and must not contain credentials or\nother secrets. External games keep their existing simulation and add only the\nsigned-ticket + SDK envelope at an isolated authenticated endpoint. Read the\npublic [external authoritative server contract](https://www.bountyboard.gg/arcade/sdk/external-authority)\nbefore adapting an existing server.\n\n## Site lock and WebXR\n\n```ts\n// Anti-rehosting deterrent, not DRM. Call before boot. When the embedder\n// can't be read from browser signals (opaque-origin sandbox), the SDK asks\n// the embedding page and blocks if nothing answers within ~5 seconds.\n// The allowed domains below are placeholders for your own; Bounty Board and\n// localhost are allowed by default, so a Bounty-hosted build passes none.\nBBArcade.lockToHost({\n  allow: ['play.yourgame.com', 'preview.yourgame.com'],\n  signed: true,\n});\n\n// WebXR only: keep immersive playtime visible to the host.\nsession.addEventListener('end', () => BBArcade.xrSessionEnd());\nBBArcade.xrSessionStart();\n```\n\n## Test before submitting\n\n- Run the production artifact without a Bounty Board parent and confirm the\n  whole game remains playable.\n- Verify ready, active-play, pause/resume, and exactly-one game-over transitions.\n- Test guest, no-save, unsupported, too-large, and transport-failure save paths.\n- Test rewarded `ready`, `unavailable`, `dismissed`, `error`, and `viewed`; only\n  `viewed` may grant.\n- Test multiplayer disconnect/reconnect, `trySend() === false`, viewer-safe\n  snapshots, and intentional `leave()`.\n- Keep ads and multiplayer controls unavailable until their capabilities are\n  actually ready; do not make the rest of the game wait.\n\nGive coding agents the public\n[agent-readable verification contract](https://www.bountyboard.gg/arcade/sdk/llms.txt).\n\n## API at a glance\n\n| Area          | Calls                                                                                 |\n| ------------- | ------------------------------------------------------------------------------------- |\n| Lifecycle     | `init`, `configure`, `ready` / `gameLoadingFinished`, `gameplayStart`, `gameplayStop` |\n| Scores        | `submitScore`, `gameOver`                                                             |\n| Player data   | `save`, `load`, `storage.install` / `ready` / `flush`, `getPlayer`, `onPlayerChange`, `getVariant` |\n| Rewarded ads  | `prepareRewardedAd`, `rewardedAd`, `rewardedBreak`, `preloadRewardedAds`              |\n| Security / XR | `lockToHost`, `xrSessionStart`, `xrSessionEnd`                                        |\n| Multiplayer   | `joinRoom`, `room.trySend`, `room.on`, `room.leave`, `room.latencyMs`                 |\n\nThe package declarations are the exact type reference. The script-tag build\nexposes multiplayer at `BBArcade.multiplayer.joinRoom(...)`; module consumers\nimport `joinRoom` from `@bountyboard/arcade-sdk/multiplayer`.\n\n## More documentation\n\n- [Human integration guide](https://www.bountyboard.gg/arcade/sdk)\n- [Agent-readable API and integration contract](https://www.bountyboard.gg/arcade/sdk/llms.txt)\n- [Release changelog](https://www.bountyboard.gg/arcade/sdk/changelog.txt)\n- [Game design playbook](https://www.bountyboard.gg/arcade/sdk/game-design-playbook.txt)\n- [External authoritative server contract](https://www.bountyboard.gg/arcade/sdk/external-authority)\n- [Submit a game](https://www.bountyboard.gg/arcade/submit)\n\n## License\n\nMIT licensed.\n","readmeFilename":"README.md"}