diff --git a/src/websocket.js b/src/websocket.js
index e16b584..e2c5abf 100644
--- a/src/websocket.js
+++ b/src/websocket.js
@@ -25,7 +25,6 @@
var http = require('http');
-var ws = require('websocket-server');
var ltx = require('ltx');
var util = require('util');
var uuid = require('node-uuid');
@@ -56,7 +55,8 @@ const STREAM_OPENED = 2;
// https://github.com/superfeedr/strophejs/tree/protocol-ed
//
-exports.createServer = function(bosh_server) {
+exports.createServer = function(bosh_server, webSocket) {
+ webSocket = webSocket || require('websocket-server');
// State information for XMPP streams
var sn_state = { };
@@ -81,8 +81,41 @@ exports.createServer = function(bosh_server) {
var wsep = new WebSocketEventPipe(bosh_server);
- var websocket_server = ws.createServer({
- server: bosh_server.server,
+ var connect_event = '';
+ var send_proc = '';
+ var createWebSocketServer = '';
+
+ function setWSSpecificParameters(webSocket) {
+ if (webSocket.createServer) {
+ connect_event = 'connection';
+ send_proc = function(conn, data) {
+ return conn.send(data);
+ };
+ createWebSocketServer = function(options) {
+ return webSocket.createServer(options);
+ };
+ } else {
+ connect_event = 'connect';
+ send_proc = function(conn, data) {
+ return conn.sendUTF(data);
+ };
+ createWebSocketServer = function(options) {
+ return new webSocket.server(options);
+ };
+ }
+ }
+
+ setWSSpecificParameters(webSocket);
+
+ var websocket_server = createWebSocketServer({
+ // For draft-10
+ httpServer: bosh_server.server,
+ autoAcceptConnections: true,
+
+ // For pre-draft-10
+ server: bosh_server.server,
+
+ // Common to both
subprotocol: 'xmpp'
});
@@ -97,14 +130,14 @@ exports.createServer = function(bosh_server) {
'xml:lang': 'en',
'from': to
}).toString();
- sstate.conn.send(ss_xml);
+ send_proc(sstate.conn, ss_xml);
});
wsep.on('response', function(response, sstate) {
// Send the data back to the client
// TODO: Handle send() failed
- sstate.conn.send(response.toString());
+ send_proc(sstate.conn, response.toString());
});
wsep.on('terminate', function(sstate, had_error) {
@@ -118,7 +151,7 @@ exports.createServer = function(bosh_server) {
sstate.conn.close();
});
- websocket_server.on('connection', function(conn) {
+ websocket_server.on(connect_event, function(conn) {
var stream_name = uuid();
// Note: xmpp-proxy.js relies on the session object
@@ -144,7 +177,15 @@ exports.createServer = function(bosh_server) {
sn_state[stream_name] = sstate;
conn.on('message', function(message) {
- message = '' + message + '';
+ if (!message.type || (message.type && message.type === 'utf8')) {
+ message = '' + message + '';
+ }
+
+ if (message.type && message.type === 'binary') {
+ console.log("Binary not supported..."); // TODO use log4js
+ return;
+ }
+
log.debug("%s - Processing: %s", stream_name, message);
// XML parse the message
@@ -179,8 +220,7 @@ exports.createServer = function(bosh_server) {
sstate.to = ss_node.attrs.to;
wsep.emit('stream-add', sstate, ss_node.attrs);
- }
- else if (sstate.stream_state === STREAM_OPENED) {
+ } else if (sstate.stream_state === STREAM_OPENED) {
// Restart the current stream
wsep.emit('stream-restart', sstate, ss_node.attrs);
}