cordova-plugin-websocket-server
Version:
Cordova WebSocket Server Plugin
113 lines (99 loc) • 4.02 kB
JavaScript
var exec = require('cordova/exec');
var fail = function(o) {
console.error("Error " + JSON.stringify(o));
};
var connections = [];
var WebSocketServer = {
getInterfaces : function(success, failure) {
return exec(success, failure, "WebSocketServer", "getInterfaces", []);
},
start : function(port, options, success, failure) {
return exec(function(result) {
switch (result.action) {
case 'onFailure':
connections = [];
var callback = options[result.action];
if (callback) {
callback(result.addr, result.port, result.reason);
}
break;
case 'onOpen':
var conn = result.conn;
conn.state = 'open';
connections[conn.uuid] = conn;
var callback = options[result.action];
if (callback) {
callback(conn);
}
break;
case 'onMessage':
var conn = connections[result.uuid];
if (conn) {
var callback = options[result.action];
if (callback) {
if(result.is_binary) {
// convert Base64 string to ArrayBuffer
var binary_string = window.atob(result.msg);
var len = binary_string.length;
var bytes = new Uint8Array(len);
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
callback(conn, bytes.buffer);
}
else {
callback(conn, result.msg);
}
}
}
break;
case 'onClose':
var conn = connections[result.uuid];
if (conn) {
conn.state = 'closed';
delete connections[conn.uuid];
var callback = options[result.action];
if (callback) {
callback(conn, result.code, result.reason, result.wasClean);
}
}
break;
default:
connections = [];
if (success) {
success(result.addr, result.port);
}
}
}, failure, "WebSocketServer", "start", [ port, options.origins, options.protocols, options.tcpNoDelay ]);
},
stop : function(success, failure) {
return exec(function(result) {
connections = [];
if (success) {
success(result.addr, result.port);
}
}, failure, "WebSocketServer", "stop", []);
},
send : function(conn, msg) {
if (typeof msg == "string") {
// send text frame (websocket opcode 1)
return exec(null, fail, "WebSocketServer", "send", [ conn.uuid, msg ]);
} else {
// convert any iterable object to Base64 string
var binary_string = '';
var bytes = new Uint8Array(msg);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary_string += String.fromCharCode(bytes[i]);
}
var msg_base64 = window.btoa(binary_string);
// send binary frame (websocket opcode 2)
return exec(null, fail, "WebSocketServer", "send_binary", [ conn.uuid, msg_base64 ]);
}
},
close : function(conn, code, reason) {
return exec(null, fail, "WebSocketServer", "close", [ conn.uuid, code, reason ]);
}
};
module.exports = WebSocketServer;
;