From ba70685e592d991e2ccf0b979af7d29d0fb68fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mert=20Can=20Alt=C4=B1n?= Date: Fri, 26 Jan 2024 21:09:44 +0300 Subject: [PATCH] add webSocket example (#2626) * add webSocket example * lint * refactor: Organize proxy-related code into separate files * refactor: Organize proxy-related code into separate files * feat: move websocket instance to separate file --------- Co-authored-by: Mert Can Altin --- examples/proxy/index.js | 2 - examples/proxy/websocket.js | 89 +++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 examples/proxy/websocket.js diff --git a/examples/proxy/index.js b/examples/proxy/index.js index 5f35049203e..4cf8bc61b16 100644 --- a/examples/proxy/index.js +++ b/examples/proxy/index.js @@ -45,5 +45,3 @@ async function run () { } run() - -// TODO: Add websocket example. diff --git a/examples/proxy/websocket.js b/examples/proxy/websocket.js new file mode 100644 index 00000000000..324d0531c57 --- /dev/null +++ b/examples/proxy/websocket.js @@ -0,0 +1,89 @@ +const { Pool, Client } = require('../../') +const http = require('http') +const proxy = require('./proxy') +const WebSocket = require('ws') + +const pool = new Pool('http://localhost:4001', { + connections: 256, + pipelining: 1 +}) + +function createWebSocketServer () { + const wss = new WebSocket.Server({ noServer: true }) + + wss.on('connection', ws => { + ws.on('message', message => { + console.log(`Received message: ${message}`) + ws.send('Received your message!') + }) + }) + + return wss +} + +async function run () { + await Promise.all([ + new Promise(resolve => { + // Proxy + http.createServer((req, res) => { + proxy({ req, res, proxyName: 'example' }, pool).catch(err => { + if (res.headersSent) { + res.destroy(err) + } else { + for (const name of res.getHeaderNames()) { + res.removeHeader(name) + } + res.statusCode = err.statusCode || 500 + res.end() + } + }) + }).listen(4000, resolve) + }), + new Promise(resolve => { + // Upstream + http.createServer((req, res) => { + res.end('hello world') + }).listen(4001, resolve) + }), + new Promise(resolve => { + // WebSocket server + const server = http.createServer((req, res) => { + res.writeHead(200, { 'Content-Type': 'text/plain' }) + res.end('WebSocket server is running!') + }) + + const wss = createWebSocketServer() + + server.on('upgrade', (request, socket, head) => { + wss.handleUpgrade(request, socket, head, ws => { + wss.emit('connection', ws, request) + }) + }) + + server.listen(4002, resolve) + }) + ]) + + const client = new Client('http://localhost:4000') + const { body } = await client.request({ + method: 'GET', + path: '/' + }) + + for await (const chunk of body) { + console.log(String(chunk)) + } + + // WebSocket client + const ws = new WebSocket('ws://localhost:4002') + ws.on('open', () => { + ws.send('Hello, WebSocket Server!') + }) + + ws.on('message', message => { + console.log(`WebSocket Server says: ${message}`) + ws.close() + }) +} + +run()