TypeScript पर WebSocket: उन्नत रीयल-टाइम एप्लिकेशन बनाना
\n\nरीयल-टाइम एप्लिकेशन आधुनिक वेब का एक अनिवार्य हिस्सा बन गए हैं। चैट और सूचनाओं से लेकर ऑनलाइन गेम और ट्रेडिंग प्लेटफॉर्म तक — WebSocket तकनीक क्लाइंट और सर्वर के बीच स्थायी द्विदिश कनेक्शन सुनिश्चित करती है। उन्नत स्तर पर, ऐसी प्रणालियों के विकास के लिए न केवल प्रोटोकॉल की समझ की आवश्यकता होती है, बल्कि दोष-सहिष्णु, स्केलेबल आर्किटेक्चर बनाने की क्षमता भी होती है। इस लेख में, हम सर्वोत्तम अभ्यासों और पैटर्न का उपयोग करके TypeScript पर production-grade WebSocket एप्लिकेशन बनाने का तरीका समझेंगे।
\n\n1. WebSocket सर्वर की आर्किटेक्चर और क्लस्टरीकरण
\n\nएक एकल WebSocket सर्वर वास्तविक प्रोजेक्ट के लोड को संभाल नहीं पाएगा। मुख्य कार्य क्लस्टरीकरण और इंस्टेंस के बीच संदेश आदान-प्रदान को व्यवस्थित करना है। आइए ws लाइब्रेरी और Redis इवेंट बस का उपयोग करके आर्किटेक्चर पर विचार करें।
निर्भरताएँ स्थापित करें:
\nnpm install ws redis ioredis @types/ws @types/ioredis\n\nएक बुनियादी क्लस्टरित सर्वर बनाएँ:
\n\nimport { WebSocketServer, WebSocket } from 'ws';\nimport Redis from 'ioredis';\n\nconst redisPub = new Redis();\nconst redisSub = new Redis();\n\nconst wss = new WebSocketServer({ port: 8080 });\n\n// अंतर-सर्वर संचार के लिए चैनल\nconst CHANNEL = 'ws:messages';\n\nredisSub.subscribe(CHANNEL, (err, count) => {\n if (err) console.error('सब्सक्रिप्शन त्रुटि:', err);\n console.log(`${count} चैनलों की सदस्यता ली`);\n});\n\n// अन्य इंस्टेंस से संदेश प्राप्त करना\nredisSub.on('message', (channel, message) => {\n const parsed = JSON.parse(message);\n wss.clients.forEach((client) => {\n if (client.readyState === WebSocket.OPEN) {\n client.send(parsed.data);\n }\n });\n});\n\nwss.on('connection', (ws) => {\n console.log('नया कनेक्शन');\n\n ws.on('message', (data) => {\n const message = data.toString();\n // सभी इंस्टेंस के लिए Redis में प्रकाशित करें\n redisPub.publish(CHANNEL, JSON.stringify({ data: message }));\n });\n});\n\nलाभ:
\n- \n
- क्षैतिज स्केलिंग — जितने चाहें उतने सर्वर जोड़ें \n
- दोष-सहिष्णुता — एक इंस्टेंस के डाउन होने पर अन्य काम करते रहते हैं \n
- Redis Pub/Sub के माध्यम से एकीकृत संदेश बस \n
2. प्रमाणीकरण और सत्र प्रबंधन
\n\nproduction एप्लिकेशन में, अप्रमाणित कनेक्शन पर भरोसा नहीं किया जा सकता। कनेक्शन स्थापित करते समय JWT के माध्यम से टोकन सत्यापन लागू करें।
\n\njsonwebtoken स्थापित करें:
npm install jsonwebtoken @types/jsonwebtoken\n\nWebSocket प्रमाणीकरण के लिए middleware बनाएँ:
\n\nimport { IncomingMessage } from 'http';\nimport jwt from 'jsonwebtoken';\n\nconst JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';\n\ninterface AuthenticatedSocket extends WebSocket {\n userId?: string;\n}\n\nfunction authenticate(ws: AuthenticatedSocket, req: IncomingMessage): boolean {\n const url = new URL(req.url || '', 'http://localhost');\n const token = url.searchParams.get('token');\n\n if (!token) {\n ws.close(4001, 'टोकन प्रदान नहीं किया गया');\n return false;\n }\n\n try {\n const decoded = jwt.verify(token, JWT_SECRET) as { userId: string };\n ws.userId = decoded.userId;\n console.log(`उपयोगकर्ता ${decoded.userId} प्रमाणित`);\n return true;\n } catch (err) {\n ws.close(4002, 'अमान्य टोकन');\n return false;\n }\n}\n\n// उपयोग\nwss.on('connection', (ws: AuthenticatedSocket, req) => {\n if (!authenticate(ws, req)) return;\n\n ws.on('message', (data) => {\n // अब हम userId जानते हैं\n console.log(`${ws.userId} से संदेश: ${data}`);\n });\n});\n\nसिफारिशें:
\n- \n
- कनेक्शन स्थापित करते समय टोकन को query-पैरामीटर या हेडर के माध्यम से भेजें \n
- अल्पकालिक access-टोकन और refresh-टोकन का उपयोग करें \n
- सत्रों को Redis में स्टोर करें