mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
230 lines
6.4 KiB
JavaScript
230 lines
6.4 KiB
JavaScript
|
define(['lib/stapes', 'api/Socket', 'utils/Tools'], function (Stapes, Socket, tools) {
|
||
|
'use strict';
|
||
|
return Socket.subclass(/** @lends WebSocket.prototype */{
|
||
|
DEBUG: false,
|
||
|
|
||
|
handle: null,
|
||
|
|
||
|
/**
|
||
|
* @type {function}
|
||
|
*/
|
||
|
currentResponseCallback: null,
|
||
|
|
||
|
/**
|
||
|
* @type {function}
|
||
|
*/
|
||
|
currentErrorCallback: null,
|
||
|
|
||
|
/**
|
||
|
* Temporary buffer for incoming data
|
||
|
* @type {Uint8Array}
|
||
|
*/
|
||
|
inputBuffer: null,
|
||
|
inputBufferIndex: 0,
|
||
|
readBufferTimerId: null,
|
||
|
|
||
|
/**
|
||
|
* @class WebSocket
|
||
|
* @extends Socket
|
||
|
* @constructs
|
||
|
*/
|
||
|
constructor: function () {
|
||
|
this.inputBuffer = new Uint8Array(4096);
|
||
|
this.inputBufferIndex = 0;
|
||
|
},
|
||
|
|
||
|
create: function (onSuccess, onError) {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('[DEBUG] Creating socket...');
|
||
|
}
|
||
|
|
||
|
if (onSuccess) {
|
||
|
onSuccess();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
isConnected: function (resultCallback) {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('[DEBUG] Checking if socket is connected...');
|
||
|
}
|
||
|
|
||
|
if (!this.handle) {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('[DEBUG] Socket not created');
|
||
|
}
|
||
|
|
||
|
if (resultCallback) {
|
||
|
resultCallback(false);
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (resultCallback) {
|
||
|
if (this.handle.readyState === WebSocket.OPEN) {
|
||
|
resultCallback(true);
|
||
|
} else {
|
||
|
resultCallback(false);
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
|
||
|
connect: function (server, onSuccess, onError) {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('[DEBUG] Connecting to peer ' + server.address + ':' + server.port);
|
||
|
}
|
||
|
|
||
|
this.currentErrorCallback = onError;
|
||
|
|
||
|
this.handle = new WebSocket('ws://' + server.address + ':' + server.port);
|
||
|
this.handle.onmessage = this.onDataReceived.bind(this);
|
||
|
this.handle.onclose = function () {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('onClose');
|
||
|
}
|
||
|
}.bind(this);
|
||
|
this.handle.onerror = function () {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('[ERROR]: ');
|
||
|
}
|
||
|
|
||
|
if (this.currentErrorCallback) {
|
||
|
this.currentErrorCallback('WebSocket error');
|
||
|
this.currentErrorCallback = null;
|
||
|
}
|
||
|
}.bind(this);
|
||
|
this.handle.onopen = function () {
|
||
|
if (onSuccess) {
|
||
|
onSuccess();
|
||
|
}
|
||
|
};
|
||
|
},
|
||
|
|
||
|
close: function (onSuccess, onError) {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('[DEBUG] Closing socket...');
|
||
|
}
|
||
|
|
||
|
if (this.handle) {
|
||
|
this.handle.close();
|
||
|
if (onSuccess) {
|
||
|
onSuccess();
|
||
|
}
|
||
|
} else {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('[DEBUG] Socket not created');
|
||
|
}
|
||
|
|
||
|
if (onError) {
|
||
|
onError('Socket handle is invalid');
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
|
||
|
write: function (data, onSuccess, onError) {
|
||
|
var dataToSend = null, dataType = typeof (data);
|
||
|
|
||
|
if (this.DEBUG) {
|
||
|
console.log('[DEBUG] writing to socket...');
|
||
|
}
|
||
|
|
||
|
if (!this.handle) {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('[DEBUG] Socket not created');
|
||
|
}
|
||
|
|
||
|
if (onError) {
|
||
|
onError('Socket handle is invalid');
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this.isConnected(function (connected) {
|
||
|
if (connected) {
|
||
|
if (dataType === 'string') {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('> ' + data);
|
||
|
}
|
||
|
//dataToSend = tools.str2ab(data);
|
||
|
dataToSend = data;
|
||
|
} else {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('> ' + tools.ab2hexstr(data));
|
||
|
}
|
||
|
dataToSend = data;
|
||
|
}
|
||
|
|
||
|
this.currentErrorCallback = onError;
|
||
|
this.handle.send(dataToSend);
|
||
|
|
||
|
if (onSuccess) {
|
||
|
onSuccess();
|
||
|
}
|
||
|
} else {
|
||
|
if (onError) {
|
||
|
onError('No connection to peer');
|
||
|
}
|
||
|
}
|
||
|
}.bind(this));
|
||
|
|
||
|
},
|
||
|
|
||
|
read: function (onSuccess, onError) {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('[DEBUG] reading from socket...');
|
||
|
}
|
||
|
|
||
|
if (!this.handle) {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('[DEBUG] socket not created');
|
||
|
}
|
||
|
|
||
|
if (onError) {
|
||
|
onError('Socket handle is invalid');
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this.isConnected(function (connected) {
|
||
|
if (!connected) {
|
||
|
this.currentResponseCallback = null;
|
||
|
this.currentErrorCallback = null;
|
||
|
|
||
|
if (onError) {
|
||
|
onError('No connection to peer');
|
||
|
}
|
||
|
}
|
||
|
}.bind(this));
|
||
|
|
||
|
if (onSuccess) {
|
||
|
this.currentResponseCallback = onSuccess;
|
||
|
}
|
||
|
|
||
|
if (onError) {
|
||
|
this.currentErrorCallback = onError;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* Data receiption callback
|
||
|
* @private
|
||
|
* @param event
|
||
|
*/
|
||
|
onDataReceived: function (event) {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('[DEBUG] received data...');
|
||
|
}
|
||
|
|
||
|
if (this.handle && event.data) {
|
||
|
if (this.DEBUG) {
|
||
|
console.log('< ' + event.data);
|
||
|
}
|
||
|
|
||
|
if (this.currentResponseCallback) {
|
||
|
this.currentResponseCallback(tools.str2ab(event.data));
|
||
|
this.currentResponseCallback = null;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}, true);
|
||
|
});
|