Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Example of how to fallback to alternative websocket library for old protocol clients.
#!/usr/bin/env node
var WebSocketRequest = require('websocket').request;
var http = require('http');
var server = http.createServer(function(request, response) {
console.log((new Date()) + " Received request for " + request.url);
response.writeHead(404);
response.end();
});
server.listen(8080, function() {
console.log((new Date()) + " Server is listening on port 8080");
});
var serverConfig = {
// All options *except* 'httpServer' are required when bypassing
// WebSocketServer.
maxReceivedFrameSize: 0x10000,
maxReceivedMessageSize: 0x100000,
fragmentOutgoingMessages: true,
fragmentationThreshold: 0x4000,
keepalive: true,
keepaliveInterval: 20000,
assembleFragments: true,
// autoAcceptConnections is not applicable when bypassing WebSocketServer
// autoAcceptConnections: false,
disableNagleAlgorithm: true,
closeTimeout: 5000
};
// Handle the upgrade event ourselves instead of using WebSocketServer
server.on('upgrade', function(req, socket, head) {
var wsConnection;
var wsRequest = new WebSocketRequest(socket, req, serverConfig);
try {
wsRequest.readHandshake();
wsConnection = wsRequest.accept(wsRequest.requestedProtocols[0], wsRequest.origin);
// wsConnection is now live and ready for use
}
catch(e) {
console.log("WebSocket Request unsupported by WebSocket-Node: " + e.toString());
return;
// Attempt old websocket library connection here.
// wsConnection = /* some fallback code here */
}
handleWebSocketConnect(wsConnection);
});
function handleWebSocketConnect(connection) {
console.log((new Date()) + " Connection accepted.");
connection.on('message', function(message) {
if (message.type === 'utf8') {
console.log("Received Message: " + message.utf8Data);
connection.sendUTF(message.utf8Data);
}
else if (message.type === 'binary') {
console.log("Received Binary Message of " + message.binaryData.length + " bytes");
connection.sendBytes(message.binaryData);
}
});
connection.on('close', function(connection) {
console.log((new Date()) + " Peer " + connection.remoteAddress + " disconnected.");
});
}
@nicokaiser
Copy link

nicokaiser commented Sep 4, 2011

Did anyone succeed in adding node-websocket-server to this example (to get a fallback for draft75/draft76 connections)?

@theturtle32
Copy link
Author

theturtle32 commented Sep 4, 2011

@nicokaiser I haven't had any reports from anyone.. :-/

@nicokaiser
Copy link

nicokaiser commented Sep 4, 2011

Unfortunately this does not work, "new WebSocketRequest" rejects older protocols (like draft-76) and closes the socket, so fallback libraries cannot do anything in the "catch" block.

@theturtle32
Copy link
Author

theturtle32 commented Sep 5, 2011

@nicokaiser -- As it turns out, you're quite right! Apologies! I've updated it the code in v0.0.16 not to automatically close the connection. That responsibility is deferred to WebSocketServer in the normal case, or you in the case where you're handling the fallback.

@theturtle32
Copy link
Author

theturtle32 commented Sep 5, 2011

I've updated the gist to reflect my update.

@nicokaiser
Copy link

nicokaiser commented Sep 15, 2011

Here is a Gist that implements a working example of a server that handles draft-08/-09/-10 connections with WebSocket-Node and the rest with miksago's node-websocket-server:

https://gist.github.com/1219165

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment