File: lib/marionette/drivers/moz-tcp.js
(function(module, ns) {
try {
if (!window.navigator.mozTCPSocket) {
return;
}
} catch(e) {
return;
}
var TCPSocket = navigator.mozTCPSocket;
var Responder = ns.require('responder');
var ON_REGEX = /^on/;
/**
* Horrible hack to work around
* missing stuff in TCPSocket & add
* node compatible api.
*/
function SocketWrapper(host, port, options) {
var events = new Responder();
var eventMethods = [
'on',
'addEventListener',
'removeEventListener',
'once',
'emit'
];
var rawSocket = TCPSocket.open(host, port, options);
var eventList = [
'onopen',
'ondrain',
'ondata',
'onerror',
'onclose'
];
eventList.forEach(function(method) {
rawSocket[method] = function(method, data) {
var emitData;
if ('data' in data) {
emitData = data.data;
} else {
emitData = data;
}
events.emit(method, emitData);
}.bind(socket, method.substr(2));
});
var socket = Object.create(rawSocket);
eventMethods.forEach(function(method) {
socket[method] = events[method].bind(events);
});
return socket;
}
var Abstract, CommandStream, Responder;
Abstract = ns.require('drivers/abstract');
CommandStream = ns.require('command-stream');
/** TCP **/
Tcp.Socket = SocketWrapper;
/**
* Connects to gecko marionette server using mozTCP api.
*
*
* // default options are fine for b2g-desktop
* // or a device device /w port forwarding.
* var tcp = new Marionette.Drivers.MozTcp();
*
* tcp.connect(function() {
* // ready to use with client
* });
*
*
* @class Marionette.Drivers.MozTcp
* @extends Marionette.Drivers.Abstract
* @constructor
* @param {Object} options connection options.
* @param {String} [options.host="127.0.0.1"] ip/host.
* @param {Numeric} [options.port="2828"] marionette server port.
*/
function Tcp(options) {
if (typeof(options)) {
options = {};
}
Abstract.call(this, options);
this.connectionId = 0;
this.host = options.host || '127.0.0.1';
this.port = options.port || 2828;
}
Tcp.prototype = Object.create(Abstract.prototype);
/**
* Sends a command to the server.
*
* @param {Object} cmd remote marionette command.
*/
Tcp.prototype._sendCommand = function _sendCommand(cmd) {
this.client.send(cmd);
};
/**
* Opens TCP socket for marionette client.
*/
Tcp.prototype._connect = function connect() {
var client, self = this;
this.socket = new Tcp.Socket(this.host, this.port);
client = this.client = new CommandStream(this.socket);
this.client.on('command', this._onClientCommand.bind(this));
};
/**
* Receives command from server.
*
* @param {Object} data response from marionette server.
*/
Tcp.prototype._onClientCommand = function(data) {
this._onDeviceResponse({
id: this.connectionId,
response: data
});
};
/**
* Closes connection to marionette.
*/
Tcp.prototype._close = function close() {
if (this.socket && this.socket.close) {
this.socket.close();
}
};
/** export */
module.exports = exports = Tcp;
}.apply(
this,
(this.Marionette) ?
[Marionette('drivers/moz-tcp'), Marionette] :
[module, require('../../lib/marionette/marionette')]
));