node-ws-multi-proxy 触った

ので、メモ。
subtleGradient/node-ws-multi-proxy · GitHub

There are some WebSocket servers that only support a single connected client at a time.
You may want to connect multiple clients to that same server.
This lets you do that.

まだモジュールのコードは読んでないけど、簡単なUsage 載ってるので、まるっと github のコード丸写しで試してみた

proxy.js

var WSP = require('ws-multi-proxy').WebSocketProxy
//  , ws   = require('ws')
  , http = require('http')
  , fs   = require('fs')
  , html = './test.html'
  , port = 3210
;

var app = http.createServer(function (req,res) {
              fs.readFile(html, "utf-8", function (err, data) {
                  if (err) {
                      console.log(err);
                      res.writeHead(404);
                      res.end(err.toString());
                      return;
                  }
                  console.log(data.length);
                  res.writeHead(200, {'Content-Type' : 'text/html'});
                  res.end(data);
              });
          }).listen(port)
  , wssConfig = { server : app }
  , proxy     = new WSP({ webSocketServer : wssConfig })
;

proxy.mutateDataFromServer =
proxy.mutateDataFromClient = function (data, sender, receiver) {
    if (data.myCustomToken != receiver.myCustomToken)
        return false;

    data.value += " lol, augmented value";
    return data;
};

console.log('app start to listen on port' + port);

test.html

<!doctype html>
<meta charset="utf-8" />
<title>WebSocket Test</title>
<script language="javascript" type="text/javascript">
var wsUri = "ws://localhost:3210/proxy/ws://echo.websocket.org";
//"ws://echo.websocket.org/";
var output;
function init() {
    output = document.getElementById("output");
    testWebSocket();
}
function testWebSocket() {
    websocket = new WebSocket(wsUri);
    websocket.onopen = function(evt) { onOpen(evt) };
    websocket.onclose = function(evt) { onClose(evt) };
    websocket.onmessage = function(evt) { onMessage(evt) };
    websocket.onerror = function(evt) { onError(evt) };
}
function onOpen(evt) {
    writeToScreen("CONNECTED");
    doSend("WebSocket rocks");
}
function onClose(evt) { writeToScreen("DISCONNECTED"); }
function onMessage(evt) {
    writeToScreen('<span style="color: blue;">RESPONSE: '
                + evt.data
                + '</span>'
    );
    websocket.close();
}
function onError(evt) {
    writeToScreen('<span style="color: red;">ERROR:</span> '
                + evt.data);
}
function doSend(message) {
    writeToScreen("SENT: " + message);
    websocket.send(message);
}
function writeToScreen(message) {
    var pre = document.createElement("p");
    pre.style.wordWrap = "break-word";
    pre.innerHTML = message;
    output.appendChild(pre);
}
window.addEventListener("load", init, false);
</script>
<h2>WebSocket Test</h2>
<div id="output"></div>
</html>

ターミナルから node proxy.js で、サーバーを立ち上げる
Chrome で http://127.0.0.1:3210/ を開く
うまくいくとこんな感じ
f:id:ishiduca:20120509170924p:plain