{"_id":"@beta-gamer/angular","_rev":"4-a8a57d54a220fc2cdefc0abaeea48b30","name":"@beta-gamer/angular","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.1":{"name":"@beta-gamer/angular","version":"0.1.1","license":"MIT","_id":"@beta-gamer/angular@0.1.1","maintainers":[{"name":"iamsupreme.developers","email":"danybeloved@gmail.com"}],"homepage":"https://github.com/acetennyson/beta-gamer-sdk#readme","bugs":{"url":"https://github.com/acetennyson/beta-gamer-sdk/issues"},"dist":{"shasum":"74fdbb51c8d4be28e0aec5a5f01141ba1379b005","tarball":"https://registry.npmjs.org/@beta-gamer/angular/-/angular-0.1.1.tgz","fileCount":5,"integrity":"sha512-7iyRwZifvGAtzWY+DnI6BDnKk2d7100+a+/yjQsVmoYXOxhs0gvLDbnf5ZkaDniwRi0CvJJ9uFR5E+c1cRyigA==","signatures":[{"sig":"MEYCIQDylFugcELD1H8yCtiCkF5kdigq4EHNt/SoQDxDYSrWiAIhAPcBJ5F7U1qhcImaAJbkeGZGoGkDaBBt9UQ5jsboTNSR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38387},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"364b93c20530e7d0d628eb976191ab9f1a06b52a","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --external @angular/core --external @angular/common --external rxjs --external socket.io-client --watch","build":"tsup src/index.ts --format cjs,esm --dts --external @angular/core --external @angular/common --external rxjs --external socket.io-client"},"_npmUser":{"name":"iamsupreme.developers","email":"danybeloved@gmail.com"},"repository":{"url":"git+https://github.com/acetennyson/beta-gamer-sdk.git","type":"git"},"_npmVersion":"11.10.0","description":"Angular SDK for Beta Gamer GaaS — composable game components","directories":{},"_nodeVersion":"22.14.0","dependencies":{"socket.io-client":"^4.8.1"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.0.0","typescript":"^5","@angular/core":"^17.0.0","@angular/common":"^17.0.0"},"peerDependencies":{"rxjs":">=7","@angular/core":">=16","@angular/common":">=16"},"_npmOperationalInternal":{"tmp":"tmp/angular_0.1.1_1773760626313_0.15029910398937663","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@beta-gamer/angular","version":"0.1.2","license":"MIT","_id":"@beta-gamer/angular@0.1.2","maintainers":[{"name":"iamsupreme.developers","email":"danybeloved@gmail.com"}],"homepage":"https://github.com/acetennyson/beta-gamer-sdk#readme","bugs":{"url":"https://github.com/acetennyson/beta-gamer-sdk/issues"},"dist":{"shasum":"f98b59c552e1a8b11dc2f515ad690ed34a28a84e","tarball":"https://registry.npmjs.org/@beta-gamer/angular/-/angular-0.1.2.tgz","fileCount":6,"integrity":"sha512-g3xR0IVrg9oh4+CiaT1QwjkliuB2E7dMcaRCAQ1QGccG7qSdBsRde+xe5IEvS6AgGlbS/R7r9CjQG1+0/oObNg==","signatures":[{"sig":"MEQCIF/Q1Okodlwp1ZdF+clA8OHEAsL8x8NyMZrKhVltYS2jAiA7tRHA/ryagdOH+5v76qbR34bMvmJd/LPMiE8pYKP+uA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44695},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"baa94f19cb0d8ef84f54748153edc12c23f54f04","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --external @angular/core --external @angular/common --external rxjs --external socket.io-client --watch","build":"tsup src/index.ts --format cjs,esm --dts --external @angular/core --external @angular/common --external rxjs --external socket.io-client"},"_npmUser":{"name":"iamsupreme.developers","email":"danybeloved@gmail.com"},"repository":{"url":"git+https://github.com/acetennyson/beta-gamer-sdk.git","type":"git"},"_npmVersion":"11.10.0","description":"Angular SDK for Beta Gamer GaaS — composable game components","directories":{},"_nodeVersion":"22.14.0","dependencies":{"socket.io-client":"^4.8.1"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.0.0","typescript":"^5","@angular/core":"^17.0.0","@angular/common":"^17.0.0"},"peerDependencies":{"rxjs":">=7","@angular/core":">=16","@angular/common":">=16"},"_npmOperationalInternal":{"tmp":"tmp/angular_0.1.2_1773776389661_0.12414052141565768","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@beta-gamer/angular","version":"0.1.3","license":"MIT","_id":"@beta-gamer/angular@0.1.3","maintainers":[{"name":"iamsupreme.developers","email":"danybeloved@gmail.com"}],"homepage":"https://github.com/acetennyson/beta-gamer-sdk#readme","bugs":{"url":"https://github.com/acetennyson/beta-gamer-sdk/issues"},"dist":{"shasum":"31378135ff4ed485c1b0252d324cd1327999d3fe","tarball":"https://registry.npmjs.org/@beta-gamer/angular/-/angular-0.1.3.tgz","fileCount":6,"integrity":"sha512-87CZzV72xGzXSWdO0SVV7MAEZzXyWBcprEnE7fXXWQXNicQCgLQ7q4iMpdLnzzXgAGRdAkIBcnp+1SByOvIxPA==","signatures":[{"sig":"MEUCIDoOOntkzHwPq/MCTvCHQBUYXLJWkl53Kfuaqm58ZmxJAiEA6wD2BzS51pa9IIMVCTAQ8VtgHApgTHjepFCifRRLX6s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58248},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"43d151520b59b81e061356fb481bd4920c07ae69","scripts":{"dev":"tsup src/index.ts --format cjs,esm --dts --external @angular/core --external @angular/common --external rxjs --external socket.io-client --watch","build":"tsup src/index.ts --format cjs,esm --dts --external @angular/core --external @angular/common --external rxjs --external socket.io-client"},"_npmUser":{"name":"iamsupreme.developers","email":"danybeloved@gmail.com"},"repository":{"url":"git+https://github.com/acetennyson/beta-gamer-sdk.git","type":"git"},"_npmVersion":"11.10.0","description":"Angular SDK for Beta Gamer GaaS — composable game components","directories":{},"_nodeVersion":"22.14.0","dependencies":{"socket.io-client":"^4.8.1"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.0","tsup":"^8.0.0","typescript":"^5","@angular/core":"^17.0.0","@angular/common":"^17.0.0"},"peerDependencies":{"rxjs":">=7","@angular/core":">=16","@angular/common":">=16"},"_npmOperationalInternal":{"tmp":"tmp/angular_0.1.3_1774103474522_0.0233087210678129","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@beta-gamer/angular","version":"0.1.4","description":"Angular SDK for Beta Gamer GaaS — composable game components","main":"./dist/index.js","module":"./dist/index.mjs","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.js","types":"./dist/index.d.ts"}},"scripts":{"build":"tsup src/index.ts --format cjs,esm --dts --external @angular/core --external @angular/common --external rxjs --external socket.io-client","dev":"tsup src/index.ts --format cjs,esm --dts --external @angular/core --external @angular/common --external rxjs --external socket.io-client --watch"},"peerDependencies":{"@angular/common":">=16","@angular/core":">=16","rxjs":">=7"},"dependencies":{"socket.io-client":"^4.8.1"},"devDependencies":{"@angular/common":"^17.0.0","@angular/core":"^17.0.0","rxjs":"^7.8.0","tsup":"^8.0.0","typescript":"^5"},"repository":{"type":"git","url":"git+https://github.com/acetennyson/beta-gamer-sdk.git"},"license":"MIT","gitHead":"36668cd5a3db705371099d82b3892dc340728df4","_id":"@beta-gamer/angular@0.1.4","bugs":{"url":"https://github.com/acetennyson/beta-gamer-sdk/issues"},"homepage":"https://github.com/acetennyson/beta-gamer-sdk#readme","_nodeVersion":"22.14.0","_npmVersion":"11.10.0","dist":{"integrity":"sha512-qmAfDs32Fe1SRoAxQyuhNmcFmOx7eqknP7+OKX5lVEepy8yKQHVGYkN3Ra214hYODgf1XSrbLT0cPa/oGHqEKw==","shasum":"2e0bedbc5653043d69277885b1a46e4c361de673","tarball":"https://registry.npmjs.org/@beta-gamer/angular/-/angular-0.1.4.tgz","fileCount":6,"unpackedSize":58248,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIFVj/LfyupqAwDOlKhuwoTk8WhqJSEaRwmTGVAAdi1FwAiBQ5kTeOlEgjtjUxFYZKmg9MVj+elBHyrr2kUCwnEA0PA=="}]},"_npmUser":{"name":"iamsupreme.developers","email":"danybeloved@gmail.com"},"directories":{},"maintainers":[{"name":"iamsupreme.developers","email":"danybeloved@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/angular_0.1.4_1774130923305_0.0917675791647996"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-17T15:17:06.168Z","modified":"2026-03-21T22:08:43.572Z","0.1.1":"2026-03-17T15:17:06.451Z","0.1.2":"2026-03-17T19:39:49.816Z","0.1.3":"2026-03-21T14:31:14.694Z","0.1.4":"2026-03-21T22:08:43.456Z"},"bugs":{"url":"https://github.com/acetennyson/beta-gamer-sdk/issues"},"license":"MIT","homepage":"https://github.com/acetennyson/beta-gamer-sdk#readme","repository":{"type":"git","url":"git+https://github.com/acetennyson/beta-gamer-sdk.git"},"description":"Angular SDK for Beta Gamer GaaS — composable game components","maintainers":[{"name":"iamsupreme.developers","email":"danybeloved@gmail.com"}],"readme":"# @beta-gamer/angular\n\nAngular SDK for [Beta Gamer](https://beta-gamer.com) — embed multiplayer games into your app as standalone components. You control the layout, we handle the game logic, matchmaking, and real-time sync.\n\n## Installation\n\n```bash\nnpm install @beta-gamer/angular\n```\n\n## Requirements\n\n- Angular 16+\n- A Beta Gamer tenant account and API key → [beta-gamer.com](https://beta-gamer.com)\n\n## Quick start\n\n**1. Create a session from your backend** (never expose your API key on the client)\n\n```ts\nconst res = await fetch('https://api.beta-gamer.com/v1/sessions', {\n  method: 'POST',\n  headers: {\n    'Authorization': 'Bearer bg_live_xxxx',\n    'Content-Type': 'application/json',\n  },\n  body: JSON.stringify({\n    game: 'chess',\n    matchType: 'matchmaking',\n    players: [{ id: 'user_123', displayName: 'Alex' }],\n  }),\n});\nconst { sessionToken } = await res.json();\n```\n\n**2. Initialise the service and render a board**\n\n```ts\n// app.component.ts\nimport { Component, inject, OnInit } from '@angular/core';\nimport { BetaGamerService, ChessBoardComponent } from '@beta-gamer/angular';\n\n@Component({\n  standalone: true,\n  imports: [ChessBoardComponent],\n  template: `\n    <bg-chess-board\n      style=\"width:100%;height:500px\"\n      [showCoords]=\"true\"\n      [showLastMove]=\"true\"\n      [showLegalMoves]=\"true\"\n      orientation=\"auto\"\n      (onLeave)=\"handleLeave()\"\n    />\n  `,\n})\nexport class AppComponent implements OnInit {\n  private svc = inject(BetaGamerService);\n\n  ngOnInit() {\n    this.svc.init('<SESSION_TOKEN>', 'https://api.beta-gamer.com');\n  }\n\n  handleLeave() {\n    // navigate away or show a lobby screen\n  }\n}\n```\n\n## Service\n\n### `BetaGamerService`\n\nInjectable service — call `init()` once with the session token.\n\n```ts\nsvc.init(token: string, serverUrl?: string, socketPath?: string, connectSocket?: boolean)\n```\n\n> **`connectSocket`** (default `true`) — set to `false` when using only board components. Board components load the game in an iframe with their own socket. A second socket with the same token causes duplicate connections and AFK/turn bugs.\n\n| Signal | Type | Description |\n|--------|------|-------------|\n| `svc.session` | `Signal<Session>` | Current session (game, matchType, players) |\n| `svc.gameState` | `Signal<GameState>` | Live game state (status, winner, reason) |\n| `svc.token` | `string` | Raw JWT session token |\n| `svc.socket` | `Socket` | Raw Socket.IO socket for custom events |\n\n## Components\n\nAll components are standalone — import only what you need.\n\n### Shared (all games)\n\n| Component | Selector | Inputs | Description |\n|-----------|----------|--------|-------------|\n| `PlayerCardComponent` | `<bg-player-card>` | `[player]` (`\"self\"` \\| `\"opponent\"`) | Player name + active-turn indicator |\n| `TimerComponent` | `<bg-timer>` | `[player]`, `[initialSeconds]?` | Live countdown clock |\n\n### Chess — `ChessBoardComponent`\n\nSelector: `<bg-chess-board>`\n\n| Input | Type | Default | Description |\n|-------|------|---------|-------------|\n| `[serverUrl]` | `string` | `'https://api.beta-gamer.com'` | Base URL of the Beta Gamer server |\n| `[showAfkWarning]` | `boolean` | `true` | Show the built-in AFK countdown banner |\n| `[showCoords]` | `boolean` | `true` | Show rank/file labels (a–h, 1–8) around the board |\n| `[showLastMove]` | `boolean` | `true` | Highlight the from/to squares of the last move |\n| `[showLegalMoves]` | `boolean` | `true` | Show dots on squares where the selected piece can legally move |\n| `[orientation]` | `'white' \\| 'black' \\| 'auto'` | `'auto'` | Which color is at the bottom. `'auto'` uses the color assigned in `game:started` |\n| `(onLeave)` | `EventEmitter<void>` | — | Emitted when the player taps Leave or exits the game-over modal |\n\n### Checkers — `CheckersBoardComponent`\n\nSelector: `<bg-checkers-board>`\n\n| Input | Type | Default | Description |\n|-------|------|---------|-------------|\n| `[serverUrl]` | `string` | `'https://api.beta-gamer.com'` | Base URL of the Beta Gamer server |\n| `[showAfkWarning]` | `boolean` | `true` | Show the built-in AFK countdown banner |\n| `[showLastMove]` | `boolean` | `true` | Highlight the from/to squares of the last move |\n| `[orientation]` | `'red' \\| 'black' \\| 'auto'` | `'auto'` | Which color is at the bottom. `'auto'` uses the color assigned in `game:started` |\n| `(onLeave)` | `EventEmitter<void>` | — | Emitted when the player taps Leave or exits the game-over modal |\n\n### Connect 4 — `Connect4BoardComponent`\n\nSelector: `<bg-connect4-board>`\n\n| Input | Type | Default | Description |\n|-------|------|---------|-------------|\n| `[serverUrl]` | `string` | `'https://api.beta-gamer.com'` | Base URL of the Beta Gamer server |\n| `[showAfkWarning]` | `boolean` | `true` | Show the built-in AFK countdown banner |\n| `(onLeave)` | `EventEmitter<void>` | — | Emitted when the player taps Leave or exits the game-over modal |\n\n### Tic-tac-toe — `TictactoeBoardComponent`\n\nSelector: `<bg-tictactoe-board>`\n\n| Input | Type | Default | Description |\n|-------|------|---------|-------------|\n| `[serverUrl]` | `string` | `'https://api.beta-gamer.com'` | Base URL of the Beta Gamer server |\n| `[showAfkWarning]` | `boolean` | `true` | Show the built-in AFK countdown banner |\n| `(onLeave)` | `EventEmitter<void>` | — | Emitted when the player taps Leave or exits the game-over modal |\n\n### Other components\n\n| Component | Selector | Inputs | Game |\n|-----------|----------|--------|------|\n| `ChessMoveHistoryComponent` | `<bg-chess-move-history>` | — | chess |\n| `ChessCapturedPiecesComponent` | `<bg-chess-captured-pieces>` | `[player]` | chess |\n| `Connect4ScoreComponent` | `<bg-connect4-score>` | — | connect4 |\n| `SubwayRunnerGameComponent` | `<bg-subway-runner-game>` | — | subway-runner |\n| `SubwayRunnerScoreComponent` | `<bg-subway-runner-score>` | — | subway-runner |\n| `SubwayRunnerLivesComponent` | `<bg-subway-runner-lives>` | — | subway-runner |\n\n> **`[showAfkWarning]`** (default `true`) — set to `false` to hide the built-in AFK countdown banner and implement your own using the `{game}:afk_warning` / `{game}:afk_warning_cleared` socket events via `svc.socket`.\n\n## Listening to game events\n\n```ts\nimport { inject, OnInit } from '@angular/core';\nimport { BetaGamerService } from '@beta-gamer/angular';\n\nexport class MyComponent implements OnInit {\n  private svc = inject(BetaGamerService);\n\n  ngOnInit() {\n    this.svc.socket.on('chess:afk_warning', ({ playerId, secondsRemaining }) => {\n      console.log('AFK warning for', playerId, secondsRemaining);\n    });\n  }\n}\n```\n\n## Supported games\n\n`chess` · `checkers` · `connect4` · `tictactoe` · `subway-runner`\n\n## Links\n\n- [Documentation](https://beta-gamer.com/docs)\n- [Dashboard](https://beta-gamer.com/dashboard)\n- [React SDK](https://www.npmjs.com/package/@beta-gamer/react)\n- [React Native SDK](https://www.npmjs.com/package/@beta-gamer/react-native)\n","readmeFilename":"README.md"}