Skip to content

Commit

Permalink
Merge pull request #63 from PlayNetwork/v1.3.8
Browse files Browse the repository at this point in the history
V1.3.8 handle exception gracefully when a url doesn't resolve
  • Loading branch information
brozeph committed Jul 6, 2018
2 parents d5197da + a7b3000 commit f4de53a
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 128 deletions.
212 changes: 120 additions & 92 deletions lib/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@ module.exports = function (playerOptions, ensureAuthHeaders, self) {
'use strict';

const
AUTH_ERROR = 401,
AUTH_TOKEN = 'x-authentication-token',
CLIENT_ID = 'x-client-id',
DEFAULT_HOST = 'player-svc.apps.playnetwork.com',
DEFAULT_SECURE = true;
DEFAULT_SECURE = true,
RECONNECT_MS = 60000;

let
req,
Expand Down Expand Up @@ -46,101 +48,127 @@ module.exports = function (playerOptions, ensureAuthHeaders, self) {

self.settings = () => (settings);

self.connect = (socketEventSubscriber) => {
co(function *() {
self.connect = (options, socketEventSubscriber) => co(function *() {
if (validation.isEmpty(socketEventSubscriber)) {
socketEventSubscriber = options;
options = {};
}

if ([
validation.isEmpty(socketEventSubscriber),
validation.isEmpty(socketEventSubscriber.emit),
typeof socketEventSubscriber.emit !== 'function'
].some((val) => val)) {
throw new Error('socketEventSubscriber must be an instance of event.EventEmitter');
}

let
authHeaders = yield ensureAuthHeaders(),
authToken,
clientId,
query,
url;

authToken = authHeaders[AUTH_TOKEN];
clientId = authHeaders[CLIENT_ID];

url = [protocol, '://', options.host || settings.host].join('');
query = ['clientId=', clientId, '&token=', authToken].join('');

socket = new io(url, { 'query' : query});

// fired after a successful connection
socket.on('connect', () => {
let connection = {
'connectionAttempt' : 0,
'isReconnect' : false,
'url' : url
};

socketEventSubscriber.emit('connected', connection);
});

socket.on('connect_error', (err) => {
socketEventSubscriber.emit('error', err);
});

// fired after a successful disconnection connection
socket.on('disconnect', () => {
socketEventSubscriber.emit('disconnected');
});

socket.on('error', (err) => {
err = JSON.parse(err);
socketEventSubscriber.emit('error', err);

if (err.code === AUTH_ERROR) {
socket.disconnect();

// reconnect if failed during authorization
if (options.reconnectOnAuthFailure) {
setTimeout(function() {
self.connect(socketEventSubscriber);
}, RECONNECT_MS);
}
}
});

socket.on('message', (data) => {
socketEventSubscriber.emit('message', data);
});

// remap playerRpc to message specifically for z8 player since
// we don't plan to retrofit the UI anytime soon
socket.on('playerRpc', (data) => {
socketEventSubscriber.emit('message', data);
});

// fired when reconnect is successful
socket.on('reconnect', (attempt) => {
let connection = {
'connectionAttempt' : attempt,
'isReconnect' : true,
'url' : url
};

socketEventSubscriber.emit('connected', connection);
});

// fired upon attempt to reconnect
socket.on('reconnecting', (attempt) => {
let connection = {
'connectionAttempt' : attempt,
'url' : url
};

socketEventSubscriber.emit('reconnecting', connection);
});

socket.on('reconnect_attempt', (attempt) => co(function *() {
let
authHeaders = yield ensureAuthHeaders(),
authToken = authHeaders[AUTH_TOKEN],
clientId = authHeaders[CLIENT_ID],
query,
url;

url = [protocol, '://', settings.host].join('');
query = ['clientId=', clientId, '&', 'token=', authToken].join('');

socket = new io(url, { 'query' : query});

// fired after a successful connection
socket.on('connect', () => {
let connection = {
'connectionAttempt' : 0,
'isReconnect' : false,
'url' : url
};

socketEventSubscriber.emit('connected', connection);
});

socket.on('connect_error', (err) => {
socketEventSubscriber.emit('error', err);
});

// fired after a successful disconnection connection
socket.on('disconnect', () => {
socketEventSubscriber.emit('disconnected');
});

socket.on('error', (err) => {
socketEventSubscriber.emit('error', err);
});

socket.on('message', (data) => {
socketEventSubscriber.emit('message', data);
});

// remap playerRpc to message specifically for z8 player since
// we don't plan to retrofit the UI anytime soon
socket.on('playerRpc', (data) => {
socketEventSubscriber.emit('message', data);
});

// fired when reconnect is successful
socket.on('reconnect', (attempt) => {
let connection = {
'connectionAttempt' : attempt,
'isReconnect' : true,
'url' : url
};

socketEventSubscriber.emit('connected', connection);
});

// fired upon attempt to reconnect
socket.on('reconnecting', (attempt) => {
let connection = {
'connectionAttempt' : attempt,
'headerReset' : false,
'url' : url
};

socketEventSubscriber.emit('reconnecting', connection);
});

socket.on('reconnect_attempt', (attempt) => {
co(function *() {
let
authHeaders = yield ensureAuthHeaders(),
authToken = authHeaders[AUTH_TOKEN],
clientId = authHeaders[CLIENT_ID];

socket.io.opts.query = ['clientId=', clientId, '&', 'token=', authToken].join('');

let connection = {
'connectionAttempt' : attempt,
'headerReset' : true,
'url' : url
};

socketEventSubscriber.emit('reconnecting', connection);
});
});

// fired on reconnect error
socket.on('reconnect_error', (err) => {
socketEventSubscriber.emit('error', err);
});
clientId = authHeaders[CLIENT_ID];

socket.io.opts.query = [
'clientId=',
clientId,
'&token=',
authToken].join('');

let connection = {
'connectionAttempt' : attempt,
'url' : url
};

socketEventSubscriber.emit('reconnecting', connection);
}).catch((ex) => socket.emit('reconnect_error', ex)));

// fired on reconnect error
socket.on('reconnect_error', (err) => {
socketEventSubscriber.emit('error', err);
});
};
});

self.disconnect = () => {
if (!socket) {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "playnetwork-sdk",
"version": "1.3.7",
"version": "1.3.8",
"contributors": [
{
"name": "Joshua Thomas",
Expand Down
7 changes: 1 addition & 6 deletions test/Mocks/mockSocket.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ module.exports = function (opts, self) {

if (configOpts.notifySubscriber.error) {
setTimeout(function() {
MockSocket.prototype.emit.call(self, 'error', new Error(configOpts.notifySubscriber.error.message));
MockSocket.prototype.emit.call(self, 'error', configOpts.notifySubscriber.error);
}, configOpts.notifySubscriber.error.occursAt);
}

Expand Down Expand Up @@ -43,12 +43,7 @@ module.exports = function (opts, self) {

if (configOpts.notifySubscriber.reconnecting) {
setTimeout(function() {
if (configOpts.notifySubscriber.reconnecting.headerReset) {
MockSocket.prototype.emit.call(self, 'reconnect_attempt', configOpts.notifySubscriber.reconnecting.number);
} else {
MockSocket.prototype.emit.call(self, 'reconnecting', configOpts.notifySubscriber.reconnecting.number);
}

}, configOpts.notifySubscriber.reconnecting.occursAt);
}

Expand Down
31 changes: 2 additions & 29 deletions test/lib/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -213,30 +213,6 @@ describe('player', () => {
player.connect(playerSubscriber);
}).timeout(5000);

it('#notify subscriber reconnecting headerReset', (done) => {
let configOpts = {
notifySubscriber : {
reconnecting : {
headerReset : true,
number : 1,
occursAt : 2000
}
}
};

player = mockSocketIOClient.rewire('../../lib/player.js', configOpts)(null, ensureAuthHeaders);

playerSubscriber.on('reconnecting', (connection) => {
if (connection.headerReset) {
return done();
}

return done('Expected headerReset to be true, actual ', connection.headerReset);
});

player.connect(playerSubscriber);
}).timeout(5000);

it('#notify subscriber reconnect_error', (done) => {
let configOpts = {
notifySubscriber : {
Expand All @@ -263,17 +239,14 @@ describe('player', () => {
it('#notify subscriber error for coverage', (done) => {
let configOpts = {
notifySubscriber : {
error : {
message : 'test',
occursAt : 2000
}
error : '{"code":401, "msg":"Unauthorized error"}'
}
};

player = mockSocketIOClient.rewire('../../lib/player.js', configOpts)(null, ensureAuthHeaders);

playerSubscriber.on('error', (err) => {
if (err.message === 'test') {
if (err.code === 401) {
return done();
}

Expand Down

0 comments on commit f4de53a

Please sign in to comment.