{"_id":"@chempik1234/room-service-js","_rev":"6-c1b3e5faa140a1f1d30dd68dd23015a2","name":"@chempik1234/room-service-js","dist-tags":{"latest":"1.1.1"},"versions":{"1.0.0":{"name":"@chempik1234/room-service-js","version":"1.0.0","keywords":["roomservice","grpc","realtime","multiplayer","gaming","sdk"],"author":"","license":"MIT","_id":"@chempik1234/room-service-js@1.0.0","maintainers":[{"name":"chempik1234","email":"dandijar@yandex.ru"}],"homepage":"https://github.com/yourusername/room-service-js#readme","bugs":{"url":"https://github.com/yourusername/room-service-js/issues"},"dist":{"shasum":"6e5c7ad98cdfe528fff81c994e51f5a1f2c15bce","tarball":"https://registry.npmjs.org/@chempik1234/room-service-js/-/room-service-js-1.0.0.tgz","fileCount":45,"integrity":"sha512-C8QvKTGrtoWSeBn+EDmWk9Q5p0Rq/uyHKjMAqFxlbzVirWI1kGT81cajUF3D282iaaOqbreCtrv+Z0KVZxISqA==","signatures":[{"sig":"MEUCICBumOk5UAjnW4pTORFjEZ8gmtj9jCNO+EDB/TEbpzuBAiEAiTL2F947zfCJOBPHgkXMlmrWBmmF64plRp4TOO4ImU0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142527},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"gitHead":"f0f8eb6c686512f1b652064b6c00dafc70472fe8","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"npm run build-ts","format":"prettier --write \"src/**/*.ts\"","build-ts":"tsc","build:full":"npm run build-proto && npm run build-ts","demo:setup":"bash scripts/setup-demo.sh","test:watch":"jest --watch","build-proto":"bash scripts/build-proto.sh","build:watch":"tsc --watch","prepublishOnly":"npm run build-ts","test:integration":"jest --config jest.integration.config.js"},"_npmUser":{"name":"chempik1234","email":"dandijar@yandex.ru"},"repository":{"url":"git+https://github.com/yourusername/room-service-js.git","type":"git"},"_npmVersion":"11.12.1","description":"JavaScript/TypeScript SDK for RoomService gRPC API - Build real-time multiplayer games easily!","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@grpc/grpc-js":"^1.12.0","@grpc/proto-loader":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/room-service-js_1.0.0_1776782771096_0.9689352180546169","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@chempik1234/room-service-js","version":"1.0.1","keywords":["roomservice","grpc","realtime","multiplayer","gaming","sdk"],"author":"","license":"MIT","_id":"@chempik1234/room-service-js@1.0.1","maintainers":[{"name":"chempik1234","email":"dandijar@yandex.ru"}],"homepage":"https://github.com/yourusername/room-service-js#readme","bugs":{"url":"https://github.com/yourusername/room-service-js/issues"},"dist":{"shasum":"1989f9cee77076a4a78f72d21248930fe7cba831","tarball":"https://registry.npmjs.org/@chempik1234/room-service-js/-/room-service-js-1.0.1.tgz","fileCount":45,"integrity":"sha512-0Lu/5o1jT1ggOBCsq1RNWSKtrEkwsjSP5Ji0ER17XMD2sx5ZjLbZxuMrxaCaruzlxJjb4dKCdvuxTBdrIIWcMw==","signatures":[{"sig":"MEUCIQDw7eFnP2DUi8TIXYj7bSj87zkkpwA2eb4EVRMjV56ppgIgCjWiO0eP8fnuFHPOYwcL42b9WAAZjCXuQ1sN9kqnIOg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142290},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"gitHead":"03e603841b48640b9b7030af76dd6a747fa159e6","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"npm run build-ts","format":"prettier --write \"src/**/*.ts\"","build-ts":"tsc","build:full":"npm run build-proto && npm run build-ts","demo:setup":"bash scripts/setup-demo.sh","test:watch":"jest --watch","build-proto":"bash scripts/build-proto.sh","build:watch":"tsc --watch","prepublishOnly":"npm run build-ts","test:integration":"jest --config jest.integration.config.js"},"_npmUser":{"name":"chempik1234","email":"dandijar@yandex.ru"},"repository":{"url":"git+https://github.com/yourusername/room-service-js.git","type":"git"},"_npmVersion":"11.12.1","description":"JavaScript/TypeScript SDK for RoomService gRPC API - Build real-time multiplayer games easily!","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@grpc/grpc-js":"^1.12.0","@grpc/proto-loader":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/room-service-js_1.0.1_1776790793319_0.14038932986808583","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@chempik1234/room-service-js","version":"1.0.2","keywords":["roomservice","grpc","realtime","multiplayer","gaming","sdk"],"author":"","license":"MIT","_id":"@chempik1234/room-service-js@1.0.2","maintainers":[{"name":"chempik1234","email":"dandijar@yandex.ru"}],"homepage":"https://github.com/yourusername/room-service-js#readme","bugs":{"url":"https://github.com/yourusername/room-service-js/issues"},"dist":{"shasum":"8173885253c4820ab65bdb6cc56cbcbd9bf1125c","tarball":"https://registry.npmjs.org/@chempik1234/room-service-js/-/room-service-js-1.0.2.tgz","fileCount":45,"integrity":"sha512-l2ySOFOF3EsSohigE2eOO6rLF2IQrwp4+CAJQsXBun+fK204B07zTkKGL7lPQW/e45rhzJXFLUzNMBlt7yu9jw==","signatures":[{"sig":"MEYCIQDc1vjPxleVq0aBI8F6D6jgWIOlsu9sQD4L91kbFBW6CAIhAJO3VBGjbrGCD0i8TavR/S+8D4Q/8A4Hs48O7knq+WUr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142768},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"gitHead":"7812b607b442d432760d0f465627468688a5dc0c","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"npm run build-ts","format":"prettier --write \"src/**/*.ts\"","build-ts":"tsc","build:full":"npm run build-proto && npm run build-ts","demo:setup":"bash scripts/setup-demo.sh","test:watch":"jest --watch","build-proto":"bash scripts/build-proto.sh","build:watch":"tsc --watch","prepublishOnly":"npm run build-ts","test:integration":"jest --config jest.integration.config.js"},"_npmUser":{"name":"chempik1234","email":"dandijar@yandex.ru"},"repository":{"url":"git+https://github.com/yourusername/room-service-js.git","type":"git"},"_npmVersion":"11.12.1","description":"JavaScript/TypeScript SDK for RoomService gRPC API - Build real-time multiplayer games easily!","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@grpc/grpc-js":"^1.12.0","@grpc/proto-loader":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/room-service-js_1.0.2_1776794231359_0.32082309335023784","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@chempik1234/room-service-js","version":"1.0.3","keywords":["roomservice","grpc","realtime","multiplayer","gaming","sdk"],"author":"","license":"MIT","_id":"@chempik1234/room-service-js@1.0.3","maintainers":[{"name":"chempik1234","email":"dandijar@yandex.ru"}],"homepage":"https://github.com/yourusername/room-service-js#readme","bugs":{"url":"https://github.com/yourusername/room-service-js/issues"},"dist":{"shasum":"d64fcd94f88f0c15b34dd542338c98025ea3d37c","tarball":"https://registry.npmjs.org/@chempik1234/room-service-js/-/room-service-js-1.0.3.tgz","fileCount":45,"integrity":"sha512-w52Qi8EGaWM4nZCLs6fcuV4IBNCnQUYuDTvQQqQ1k4ZzVdpWsRVQT0LdY0+blRy+ZYisefmm8ejQcVfgK/rZpQ==","signatures":[{"sig":"MEUCIQC1zXQX1GXy+R9NIlyZp17MO7k+jSpoOCmiqaafkgQtOAIgZN6ySehrb8tEm8a7m5Qmy60cI1FpDNMXuAnh7phgG98=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142389},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"gitHead":"269b2525be75017986e34d5eae983fe73ebc67a5","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"npm run build-ts","format":"prettier --write \"src/**/*.ts\"","build-ts":"tsc","build:full":"npm run build-proto && npm run build-ts","demo:setup":"bash scripts/setup-demo.sh","test:watch":"jest --watch","build-proto":"bash scripts/build-proto.sh","build:watch":"tsc --watch","prepublishOnly":"npm run build-ts","test:integration":"jest --config jest.integration.config.js"},"_npmUser":{"name":"chempik1234","email":"dandijar@yandex.ru"},"repository":{"url":"git+https://github.com/yourusername/room-service-js.git","type":"git"},"_npmVersion":"11.12.1","description":"JavaScript/TypeScript SDK for RoomService gRPC API - Build real-time multiplayer games easily!","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@grpc/grpc-js":"^1.12.0","@grpc/proto-loader":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/room-service-js_1.0.3_1776794637011_0.2537767525385697","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@chempik1234/room-service-js","version":"1.1.0","keywords":["roomservice","grpc","realtime","multiplayer","gaming","sdk"],"author":"","license":"MIT","_id":"@chempik1234/room-service-js@1.1.0","maintainers":[{"name":"chempik1234","email":"dandijar@yandex.ru"}],"homepage":"https://github.com/yourusername/room-service-js#readme","bugs":{"url":"https://github.com/yourusername/room-service-js/issues"},"dist":{"shasum":"042732ed4b065bc342c5e3961540aeac7396cc62","tarball":"https://registry.npmjs.org/@chempik1234/room-service-js/-/room-service-js-1.1.0.tgz","fileCount":45,"integrity":"sha512-bncFuy7HdJmT90zxbGGlWPXIK/opgSy/JLYaZVfQ5DjIn+F+myBsG4esrt7TSf00BBqfyCbt8tebhghYjVKrsQ==","signatures":[{"sig":"MEYCIQDXl/bqKzN+m4R4XsWJkchJdJdcV/HSUilVyfRTQytI0wIhAKUssY3h+gQjlI/TzOEE0xALFlQHSMMuGPP2yVYhGxHz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":168545},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=16.0.0"},"gitHead":"afcacf5a2f0b6ed806c4e6db53df5040c4b623f0","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"npm run build-ts","format":"prettier --write \"src/**/*.ts\"","build-ts":"tsc","build:full":"npm run build-proto && npm run build-ts","demo:setup":"bash scripts/setup-demo.sh","test:watch":"jest --watch","build-proto":"bash scripts/build-proto.sh","build:watch":"tsc --watch","prepublishOnly":"npm run build-ts","test:integration":"jest --config jest.integration.config.js"},"_npmUser":{"name":"chempik1234","email":"dandijar@yandex.ru"},"repository":{"url":"git+https://github.com/yourusername/room-service-js.git","type":"git"},"_npmVersion":"11.12.1","description":"JavaScript/TypeScript SDK for RoomService gRPC API - Build real-time multiplayer games easily!","directories":{},"_nodeVersion":"24.11.1","dependencies":{"@grpc/grpc-js":"^1.12.0","@grpc/proto-loader":"^0.8.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.5.0","eslint":"^8.0.0","ts-jest":"^29.1.0","prettier":"^3.0.0","typescript":"^5.0.0","@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/parser":"^6.0.0","@typescript-eslint/eslint-plugin":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/room-service-js_1.1.0_1776947914073_0.140157987784999","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@chempik1234/room-service-js","version":"1.1.1","description":"JavaScript/TypeScript SDK for RoomService gRPC API - Build real-time multiplayer games easily!","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","scripts":{"build":"npm run build-ts","build-proto":"bash scripts/build-proto.sh","build-ts":"tsc","build:full":"npm run build-proto && npm run build-ts","build:watch":"tsc --watch","dev":"tsc --watch","test":"jest","test:watch":"jest --watch","test:integration":"jest --config jest.integration.config.js","prepublishOnly":"npm run build-ts","lint":"eslint src --ext .ts","format":"prettier --write \"src/**/*.ts\"","demo:setup":"bash scripts/setup-demo.sh"},"keywords":["roomservice","grpc","realtime","multiplayer","gaming","sdk"],"author":"","license":"MIT","repository":{"type":"git","url":"git+https://github.com/yourusername/room-service-js.git"},"dependencies":{"@grpc/grpc-js":"^1.12.0","@grpc/proto-loader":"^0.8.0"},"devDependencies":{"@types/jest":"^29.5.0","@types/node":"^20.0.0","@typescript-eslint/eslint-plugin":"^6.0.0","@typescript-eslint/parser":"^6.0.0","eslint":"^8.0.0","jest":"^29.5.0","prettier":"^3.0.0","ts-jest":"^29.1.0","typescript":"^5.0.0"},"engines":{"node":">=16.0.0"},"gitHead":"350c5bf2de0cff5b662352b3cf609248427c4140","_id":"@chempik1234/room-service-js@1.1.1","bugs":{"url":"https://github.com/yourusername/room-service-js/issues"},"homepage":"https://github.com/yourusername/room-service-js#readme","_nodeVersion":"24.11.1","_npmVersion":"11.12.1","dist":{"integrity":"sha512-dB3ukn7c5fGKQfxUuirYgg10fqjc5ISiiHoL/z1ubxNGkDzUxyI4mUTbKHgfms+pruM9f/0pN+YHqAb1O+TmNg==","shasum":"d90a8b030074b92edf3cd29d61b9da44811de426","tarball":"https://registry.npmjs.org/@chempik1234/room-service-js/-/room-service-js-1.1.1.tgz","fileCount":45,"unpackedSize":162949,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCSkQe543Fw1A4Kb4l1U2eb5S9slUVpHIeAA9TLKx1u5AIgCwCa7ep4pAvCJQ51yp+9r/c1tolv/f/WlFl73v0UZKY="}]},"_npmUser":{"name":"chempik1234","email":"dandijar@yandex.ru"},"directories":{},"maintainers":[{"name":"chempik1234","email":"dandijar@yandex.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/room-service-js_1.1.1_1776949879605_0.6977513786320877"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-21T14:46:10.964Z","modified":"2026-04-23T13:11:19.858Z","1.0.0":"2026-04-21T14:46:11.241Z","1.0.1":"2026-04-21T16:59:53.458Z","1.0.2":"2026-04-21T17:57:11.503Z","1.0.3":"2026-04-21T18:03:57.151Z","1.1.0":"2026-04-23T12:38:34.237Z","1.1.1":"2026-04-23T13:11:19.736Z"},"bugs":{"url":"https://github.com/yourusername/room-service-js/issues"},"license":"MIT","homepage":"https://github.com/yourusername/room-service-js#readme","keywords":["roomservice","grpc","realtime","multiplayer","gaming","sdk"],"repository":{"type":"git","url":"git+https://github.com/yourusername/room-service-js.git"},"description":"JavaScript/TypeScript SDK for RoomService gRPC API - Build real-time multiplayer games easily!","maintainers":[{"name":"chempik1234","email":"dandijar@yandex.ru"}],"readme":"# RoomService JavaScript SDK\r\n\r\n> A simple, clean SDK for the RoomService gRPC API - Build real-time multiplayer games easily!\r\n\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\r\n\r\n## Features\r\n\r\n- Easy-to-use API for JavaScript/TypeScript developers\r\n- Full support for RoomService gRPC methods\r\n- Bidirectional streaming support for real-time updates\r\n- TypeScript types included (works with pure JavaScript too)\r\n- Works in Node.js environments\r\n- Handles all the complex gRPC stuff for you\r\n\r\n## Quick Start\r\n\r\n### Installation\r\n\r\n```bash\r\nnpm install room-service-js\r\n```\r\n\r\n### Basic Usage\r\n\r\n```javascript\r\nimport { RoomServiceClient } from 'room-service-js';\r\n\r\n// Initialize client with multi-tenant proxy\r\nconst client = new RoomServiceClient({\r\n  host: 'https://roomservice-proxy-production.up.railway.app', // Full URL works!\r\n  apiKey: 'rs_live_yourtenantid_uuid' // From your control panel\r\n});\r\n\r\n// Create a room\r\nconst roomId = await client.createRoom({\r\n  max_users: '10',\r\n  game_type: 'tic-tac-toe'\r\n});\r\n\r\n// Join the room\r\nawait client.joinRoom(roomId, {\r\n  userId: 'player-1',\r\n  userName: 'Alice'\r\n});\r\n\r\n// Set game data\r\nawait client.setData(roomId, 'player-1', 'board', [\r\n  '', '', '',\r\n  '', '', '',\r\n  '', '', ''\r\n]);\r\n\r\nawait client.setData(roomId, 'player-1', 'turn', 'X');\r\n\r\n// Get room state\r\nconst snapshot = await client.getRoomSnapshot(roomId, 'player-1');\r\nconsole.log('Users:', snapshot.users);\r\nconsole.log('Data:', snapshot.data);\r\n\r\n// Clean up\r\nawait client.close();\r\n```\r\n\r\n### Smart Hostname Handling\r\n\r\nThe SDK automatically handles all these hostname formats:\r\n\r\n```javascript\r\n// All of these work perfectly:\r\nnew RoomServiceClient({ host: 'localhost:50050' })\r\nnew RoomServiceClient({ host: 'roomservice-proxy.up.railway.app' })\r\nnew RoomServiceClient({ host: 'https://roomservice-proxy.up.railway.app' })\r\nnew RoomServiceClient({ host: 'http://roomservice-proxy.up.railway.app' })\r\nnew RoomServiceClient({ host: 'grpc://roomservice-proxy.up.railway.app' })\r\n```\r\n\r\nJust copy the hostname directly from your browser or control panel! 🎉\r\n\r\n## Real-Time Streaming\r\n\r\nFor real-time games and collaborative apps:\r\n\r\n```javascript\r\nimport { RoomServiceClient } from 'room-service-js';\r\n\r\nconst client = new RoomServiceClient();\r\nconst stream = await client.openStream();\r\n\r\n// Listen for events\r\nstream.on('DataEdited', (event) => {\r\n  console.log('Data changed:', event.dataId, event.value);\r\n  // Update your UI here\r\n});\r\n\r\nstream.on('JoinedRoom', (event) => {\r\n  console.log('User joined:', event.user.name);\r\n});\r\n\r\nstream.on('LeftRoom', (event) => {\r\n  console.log('User left');\r\n});\r\n\r\n// Send commands\r\nawait stream.createRoom({ game: 'chess' });\r\nconst roomId = '...';  // Get from RoomCreated event\r\nawait stream.joinRoom(roomId, { userId: 'player-1', userName: 'Alice' });\r\nawait stream.setData(roomId, 'player-1', 'move', 'e2-e4');\r\n\r\n// Later...\r\nawait stream.close();\r\nawait client.close();\r\n```\r\n\r\n## API Reference\r\n\r\n### Room Management\r\n\r\n```javascript\r\n// Create a new room\r\nconst roomId = await client.createRoom({\r\n  max_users: '10',\r\n  game_type: 'chess',\r\n  private: 'true'\r\n});\r\n\r\n// Delete a room (owner only)\r\nawait client.deleteRoom(roomId, 'owner-user-id');\r\n\r\n// List all rooms\r\nconst rooms = await client.listRooms();\r\n\r\n// Get rooms a specific user is in\r\nconst myRooms = await client.getUserActiveRooms('player-1');\r\n```\r\n\r\n### User Management\r\n\r\n```javascript\r\n// Join a room\r\nawait client.joinRoom(roomId, {\r\n  userId: 'player-1',\r\n  userName: 'Alice',\r\n  metadata: { avatar: 'cat.png', country: 'US' }\r\n});\r\n\r\n// Leave a room\r\nawait client.leaveRoom(roomId, 'my-user-id');\r\n\r\n// Kick another user (owner only)\r\nawait client.leaveRoom(roomId, 'owner-id', 'trouble-maker-id');\r\n```\r\n\r\n### Data Operations\r\n\r\n```javascript\r\n// SET - Replace entire value\r\nawait client.setData(roomId, userId, 'game_state', 'active');\r\nawait client.setData(roomId, userId, 'score', 100);\r\nawait client.setData(roomId, userId, 'board', ['', '', 'X', ...]);\r\n\r\n// DELETE - Remove data key\r\nawait client.deleteData(roomId, userId, 'temp_data');\r\n\r\n// APPEND - Add to list\r\nawait client.appendToList(roomId, userId, 'moves', 'e2-e4');\r\n\r\n// REMOVE - Remove from list/map\r\nawait client.removeFromList(roomId, userId, 'players', '0');\r\n```\r\n\r\n### Queries\r\n\r\n```javascript\r\n// Get full room snapshot\r\nconst snapshot = await client.getRoomSnapshot(roomId, userId);\r\nconsole.log(snapshot.data);      // Room data\r\nconsole.log(snapshot.users);     // Array of users\r\nconsole.log(snapshot.roomOptions); // Room options\r\n```\r\n\r\n### Streaming\r\n\r\n```javascript\r\nconst stream = await client.openStream();\r\n\r\n// Listen to all events\r\nstream.on('event', (event) => {\r\n  console.log('Event:', event.type);\r\n});\r\n\r\n// Listen to specific events\r\nstream.on('RoomCreated', (event) => { ... });\r\nstream.on('JoinedRoom', (event) => { ... });\r\nstream.on('LeftRoom', (event) => { ... });\r\nstream.on('DataEdited', (event) => { ... });\r\nstream.on('OwnerChanged', (event) => { ... });\r\nstream.on('FullRoomSnapshot', (event) => { ... });\r\nstream.on('ErrorMessage', (event) => { ... });\r\n\r\n// Send commands via stream\r\nawait stream.createRoom({ game: 'chess' });\r\nawait stream.joinRoom(roomId, { userId, userName });\r\nawait stream.setData(roomId, userId, 'move', 'e2-e4');\r\nawait stream.refreshRoom(roomId, userId);\r\n\r\n// Close stream\r\nawait stream.close();\r\n```\r\n\r\n## Value Types\r\n\r\nThe SDK automatically converts JavaScript values to RoomService types:\r\n\r\n```javascript\r\n// Strings\r\nawait client.setData(roomId, userId, 'status', 'active');\r\n\r\n// Numbers (automatically int or float)\r\nawait client.setData(roomId, userId, 'count', 42);\r\nawait client.setData(roomId, userId, 'price', 3.14);\r\n\r\n// Booleans\r\nawait client.setData(roomId, userId, 'enabled', true);\r\n\r\n// Arrays\r\nawait client.setData(roomId, userId, 'tags', ['game', 'multiplayer']);\r\n\r\n// Objects\r\nawait client.setData(roomId, userId, 'config', {\r\n  maxPlayers: 10,\r\n  private: false\r\n});\r\n\r\n// Nested structures\r\nawait client.setData(roomId, userId, 'playerStats', {\r\n  wins: 5,\r\n  losses: 2,\r\n  history: ['win', 'loss', 'win']\r\n});\r\n```\r\n\r\nFor explicit type control, you can use value helpers:\r\n\r\n```javascript\r\nimport {\r\n  stringValue,\r\n  intValue,\r\n  floatValue,\r\n  boolValue,\r\n  listValue,\r\n  mapValue\r\n} from 'room-service-js';\r\n\r\nawait client.setData(roomId, userId, 'count', intValue(42));\r\nawait client.setData(roomId, userId, 'tags', listValue([\r\n  stringValue('game'),\r\n  stringValue('multiplayer')\r\n]));\r\n```\r\n\r\n## Error Handling\r\n\r\n```javascript\r\nimport { RoomServiceError } from 'room-service-js';\r\n\r\ntry {\r\n  await client.createRoom({ max_users: '10' });\r\n} catch (error) {\r\n  if (error instanceof RoomServiceError) {\r\n    console.error('Error:', error.message);\r\n\r\n    // Check specific error types\r\n    if (error.isAuthenticationError()) {\r\n      console.log('Check your API key');\r\n    } else if (error.isPermissionError()) {\r\n      console.log('You need to be the owner');\r\n    } else if (error.isNotFoundError()) {\r\n      console.log('Room not found');\r\n    } else if (error.isServerError()) {\r\n      console.log('Server error - try again later');\r\n    }\r\n\r\n    // Get user-friendly message\r\n    console.log('User message:', error.getUserMessage());\r\n  }\r\n}\r\n```\r\n\r\n### Multi-Tenant Authentication\r\n\r\nWhen using the RoomService proxy, your API key automatically routes requests to your tenant instance:\r\n\r\n```javascript\r\n// Get your API key from the control panel\r\nconst client = new RoomServiceClient({\r\n  host: 'https://roomservice-proxy.up.railway.app',\r\n  apiKey: 'rs_live_yourtenantid_uuid' // Format: rs_live_tenantid_uuid\r\n});\r\n\r\n// All requests are automatically authenticated with your API key\r\nawait client.createRoom({ game_type: 'chess' });\r\n```\r\n\r\n**Error Codes:**\r\n\r\n| Code | Meaning | Solution |\r\n|------|---------|----------|\r\n| 16 | Unauthenticated | Invalid API key - check control panel |\r\n| 7 | Permission Denied | Tenant may be suspended or insufficient permissions |\r\n| 5 | Not Found | Room doesn't exist |\r\n| 13 | Internal Server Error | RoomService instance down - retry later |\r\n| 14 | Unavailable | Temporary issue - retry later |\r\n| 3 | Invalid Argument | Check command format |\r\n| 8 | Resource Exhausted | Rate limited - retry later |\r\n\r\n## Configuration\r\n\r\n### Environment Variables\r\n\r\n```bash\r\n# RoomService connection (optional, can also pass in constructor)\r\nROOM_SERVICE_HOST=https://roomservice-proxy.up.railway.app\r\nROOM_SERVICE_API_KEY=rs_live_yourtenantid_uuid\r\n```\r\n\r\n### Client Options\r\n\r\n```javascript\r\nconst client = new RoomServiceClient({\r\n  host: 'https://roomservice-proxy.up.railway.app', // RoomService proxy address\r\n  apiKey: 'rs_live_yourtenantid_uuid',              // Your tenant's API key\r\n  secure: false,                                     // Use TLS (default: false)\r\n  timeout: 5000                                      // Request timeout in ms\r\n});\r\n```\r\n\r\n### Multi-Tenant Setup\r\n\r\nFor multi-tenant deployments, use the RoomService proxy:\r\n\r\n```javascript\r\n// 1. Get your API key from the control panel (rs_live_tenantid_uuid)\r\n// 2. Use the proxy hostname\r\nconst client = new RoomServiceClient({\r\n  host: 'https://roomservice-proxy.up.railway.app',\r\n  apiKey: 'rs_live_mytenant_abc123def456'\r\n});\r\n\r\n// The proxy automatically routes your requests to your tenant instance\r\n// No need to specify tenant ID manually!\r\n```\r\n\r\n## Documentation\r\n\r\n- [Getting Started Guide](docs/GETTING_STARTED.md) - Complete setup and first steps\r\n- [API Reference](docs/API_REFERENCE.md) - Full API documentation\r\n- [Streaming Guide](docs/STREAMING_GUIDE.md) - Real-time updates with streaming\r\n- [LLM Prompting Guide](docs/LLM_PROMPTING_GUIDE.md) - How to use with AI assistants\r\n\r\n## Examples\r\n\r\nSee the `examples/` directory for complete examples:\r\n\r\n- **Tic-Tac-Toe** - A complete 2-player game with real-time updates\r\n- **Quick Start** - Simple examples to get you started\r\n\r\n## Requirements\r\n\r\n- Node.js >= 16.0.0\r\n- RoomService backend running (see [Getting Started](docs/GETTING_STARTED.md))\r\n\r\n## Browser Support\r\n\r\nThis SDK currently supports Node.js environments only. For browser applications, create a Node.js backend that uses the SDK and exposes REST/WebSocket endpoints to your frontend.\r\n\r\n## License\r\n\r\nMIT\r\n\r\n## Contributing\r\n\r\nContributions are welcome! Please feel free to submit a Pull Request.\r\n","readmeFilename":"README.md"}