id: afa854d124934a3b84b43349f878da8f
parent_id: 8f68379306a24cf1a090fbf7c669144a
item_type: 1
item_id: c994139aac9245c79da7923dbe8579b3
item_updated_time: 1784277452777
title_diff: "[{\"diffs\":[[1,\"Browser Extension — Firefox Plugin for Rust Backend\"]],\"start1\":0,\"start2\":0,\"length1\":0,\"length2\":51}]"
body_diff: "[{\"diffs\":[[1,\"# Browser Extension — Firefox Plugin for Rust Backend\\\n\\\nDesign for a Firefox browser extension that interfaces with the super-marvin Rust backend for live poker play.\\\n\\\n---\\\n\\\n## Architecture\\\n\\\n```\\\nFirefox Extension ←→ Communication Layer ←→ Rust Backend (super-marvin)\\\n     (JS/TS)              (WebSocket/REST)        (holdem_bots)\\\n```\\\n\\\nThe extension captures game state from browser poker tables and relays it to the Rust backend for decision-making. The backend returns actions which the extension executes.\\\n\\\n---\\\n\\\n## Extension Structure\\\n\\\n```\\\nfirefox-extension/\\\n├── manifest.json          # Manifest V3\\\n├── background.js          # Service worker — manages backend connection\\\n├── content-scripts/\\\n│   └── main.js            # Injected into poker pages — scrapes game state\\\n├── popup/\\\n│   ├── popup.html         # Status/control UI\\\n│   ├── popup.js\\\n│   └── popup.css\\\n├── options/\\\n│   ├── options.html       # Settings (backend URL, session config)\\\n│   └── options.js\\\n└── icons/\\\n```\\\n\\\n---\\\n\\\n## Communication: Backend Protocol\\\n\\\n### Recommended: WebSocket + JSON\\\n\\\nSimple, language-agnostic, real-time, well-supported in both JS and Rust.\\\n\\\n**Message format:**\\\n```json\\\n{\\\n  \\\"session_id\\\": \\\"sess123\\\",\\\n  \\\"type\\\": \\\"game_state | action_request | action_response\\\",\\\n  \\\"payload\\\": { ... },\\\n  \\\"request_id\\\": \\\"uuid\\\"\\\n}\\\n```\\\n\\\n**Extension → Backend:**\\\n```javascript\\\nws.send(JSON.stringify({\\\n    type: \\\"action_request\\\",\\\n    payload: { hand: \\\"Ah Ks\\\", board: \\\"Ts 7h 2h\\\", pot: 150, ... }\\\n}));\\\n```\\\n\\\n**Backend → Extension:**\\\n```json\\\n{ \\\"type\\\": \\\"action_response\\\", \\\"payload\\\": { \\\"action\\\": \\\"raise\\\", \\\"amount\\\": 300 } }\\\n```\\\n\\\n### For Scale: Message Queue + WebSocket Gateway\\\n\\\nIf multiple clients/sessions are needed:\\\n\\\n```\\\nExtension ←WebSocket→ Gateway ←MQ→ Rust Workers\\\n                              ↕\\\n                        Session Store (Redis)\\\n```\\\n\\\nUse RabbitMQ or NATS for backend routing; Redis for session state; WebSocket for real-time extension communication.\\\n\\\n### Alternative: gRPC with Protobuf\\\nType-safe across languages, efficient binary protocol, built-in versioning. Overkill for single-client use but ideal if multiple client types are planned.\\\n\\\n---\\\n\\\n## IDE Setup\\\n\\\n### JetBrains IntelliJ IDEA Ultimate (Recommended)\\\nSingle IDE for both extension (JS/TS) and backend (Rust):\\\n- **Plugins:** Rust / RustRover, WebExtensions API Support, TOML\\\n- **Tools:** `web-ext` CLI for Firefox extension dev, `cargo` for Rust backend\\\n\\\n### Alternative: RustRover + WebStorm combo\\\n- RustRover for the Rust backend\\\n- WebStorm for the extension\\\n\\\n### Development Workflow\\\n```bash\\\n# Terminal 1: Start Rust backend\\\ncargo run\\\n\\\n# Terminal 2: Start extension in dev mode\\\nweb-ext run --target=firefox-desktop --reload\\\n\\\n# Debug: Firefox → about:debugging → Load Temporary Add-on → manifest.json\\\n```\\\n\\\n---\\\n\\\n## Native Messaging (Direct Extension ↔ Rust)\\\n\\\nFor low-latency local-only communication without a server:\\\n\\\n**manifest.json:**\\\n```json\\\n{\\\n  \\\"permissions\\\": [\\\"nativeMessaging\\\"],\\\n  \\\"background\\\": { \\\"scripts\\\": [\\\"background.js\\\"] }\\\n}\\\n```\\\n\\\n**background.js:**\\\n```javascript\\\nconst RUST_APP = 'com.supermarvin.bot';\\\nconst port = chrome.runtime.connectNative(RUST_APP);\\\n\\\nchrome.runtime.onMessage.addListener((req, sender, respond) => {\\\n    port.postMessage(req);\\\n    port.onMessage.addListener(respond);\\\n    return true; // async response\\\n});\\\n```\\\n\\\nThe Rust side registers a native messaging host that reads stdin JSON and writes stdout JSON.\\\n\\\n---\\\n\\\n## Docker Setup (for MQ + Redis architecture)\\\n\\\n```yaml\\\n# docker-compose.yml\\\nservices:\\\n  redis:\\\n    image: redis:7-alpine\\\n    ports: [\\\"6379:6379\\\"]\\\n  rabbitmq:\\\n    image: rabbitmq:3-management\\\n    ports: [\\\"5672:5672\\\", \\\"15672:15672\\\"]\\\n  backend:\\\n    build: ./backend\\\n    environment:\\\n      - REDIS_URL=redis://redis:6379\\\n      - MQ_URL=amqp://rabbitmq:5672\\\n```\"]],\"start1\":0,\"start2\":0,\"length1\":0,\"length2\":3740}]"
metadata_diff: {"new":{"id":"c994139aac9245c79da7923dbe8579b3","parent_id":"2c8da247905946c3aa19eb4936e16323","latitude":"48.20817430","longitude":"16.37381890","altitude":"0.0000","author":"","source_url":"","is_todo":0,"todo_due":0,"todo_completed":0,"source":"joplin-desktop","source_application":"net.cozic.joplin-desktop","application_data":"","order":0,"markup_language":1,"is_shared":0,"share_id":"","conflict_original_id":"","master_key_id":"","user_data":"","deleted_time":1784277452777,"user_updated_time":1780225235866},"deleted":[]}
encryption_cipher_text: 
encryption_applied: 0
updated_time: 2026-08-29T11:01:24.410Z
created_time: 2026-07-17T08:46:47.396Z
is_locked: 0
type_: 13