att-dhs
Version:
AT&T Developer Hosted Server Library
249 lines (213 loc) • 6.65 kB
JavaScript
/*jslint browser: true, devel: true, node: true, debug: true, todo: true, indent: 2, maxlen: 150, unparam: true*/
/*global require, exports*/
;
var config = require('./att.dhs.config').config,
restify = require('restify'),
clients = {};
function getRestClient(token) {
var restClient,
logger = config.getLogger();
logger.logInfo('dhs.longpoller: getRestClient');
logger.logTrace('token', token);
restClient = restify.createJsonClient({
url: 'https://api.att.com/',
userAgent: 'att-dhs',
accept: 'application/json',
connection: 'keep-alive',
DTN: '1',
headers: {
Authorization: 'Bearer ' + token
},
requestTimeout: 10 * 60 * 1000,
timeout: 5 * 60 * 300
});
return restClient;
}
function deleteClient(sessionId) {
var logger = config.getLogger(),
restClient;
logger.logInfo('dhs.longpoller: deleteClient');
logger.logTrace('Session Id', sessionId);
if (clients[sessionId] === undefined) {
return;
}
restClient = getRestClient(clients[sessionId].token);
logger.logDebug('Deleting Client');
logger.logTrace('Session Id', sessionId);
if (clients.hasOwnProperty(sessionId)) {
delete clients[sessionId];
restClient.del('RTC/v1/sessions/' + sessionId, function (error, req, res, result) {
logger.logDebug('Client Deleted');
logger.logTrace('Delete result', result);
});
}
}
//
//function requestPolling(sessionId) {
// var restClient,
// logger = config.getConfiguration().logger;
//
// logger.logInfo('dhs.longpoller: requestPolling');
// logger.logTrace('Session Id', sessionId);
//
// restClient = getRestClient(clients[sessionId].token);
// restClient.get('RTC/v1/sessions/' + sessionId + '/events', function (error, req, res, result) {
// if (undefined !== error
// && null !== error) {
// options.error(error);
// return;
// }
//
// options.success(result, res);
// });
//}
//
//function onStartClientSuccess(result, res) {
// var logger = config.getConfiguration().logger;
//
// logger.logInfo('dhs.longpoller: onStartClientSuccess');
// logger.logTrace('statusCode', res.statusCode);
//
// if (res.statusCode == 204) {
// logger.logInfo('Started Client Successfully');
// logger.logDebug('Success: no data');
// }
//
// if (res.statusCode == 200) {
// logger.logInfo('Started Client Successfully');
// logger.logDebug('Success: with data');
// logger.logTrace('Success Data', result);
//
// if (Object.keys(result).length > 0) {
// result.events.eventList.forEach(function (element) {
// try {
// socket.sendData('event', element);
// } catch (e) {
// logger.logInfo('Error starting client');
// logger.logError(e);
// // issue with the websocket connection; stop polling
// deleteClient(sessionId);
// }
// });
// }
// }
//
// if (clients[sessionId] !== undefined) {
// requestPolling(sessionId, token);
// }
//
// logger.logDebug('WebSocket :Success');
//}
//
//function onStartClientError(error) {
// var logger = config.getConfiguration().logger;
//
// logger.logInfo('dhs.longpoller: onStartClientError');
// logger.logTrace(error.statusCode);
// logger.logError(error);
//
// if (error.statusCode === 401 /* Unauthorized Request */
// || error.statusCode === 403 /* Session Id not associated with token */
// || error.statusCode === 404 /* Session is expired */) {
// try {
// // attempt to send data, but recover if unable to
// socket.sendData('error', error);
// } catch (e) {
// logger.logInfo('Error message not sent');
// logger.logError(e);
// }
// } else {
// //Retry polling again
// if (clients[sessionId] !== undefined) {
// requestPolling(sessionId);
// }
// }
//}
function startClient(data, socket) {
var options,
sessionId,
token,
requestPolling,
count,
restClient,
logger = config.getLogger();
logger.logInfo('dhs.longpoller: startClient');
logger.logTrace('data', data);
options = {};
count = 0;
sessionId = data.sessionId;
token = data.token;
requestPolling = function () {
logger.logInfo('dhs.longpoller.startClient: requestPolling');
logger.logTrace('Session ID', sessionId);
restClient.get('RTC/v1/sessions/' + sessionId + '/events',
function (error, req, res, result) {
if (undefined !== error
&& null !== error) {
options.error(error);
return;
}
options.success(result, res);
});
};
options.onTimeout = function (result) {
requestPolling(); // if timeout do a long polling
};
options.success = function (result, res) {
count = count + 1;
logger.logInfo('dhs.longpoller.startClient: success');
logger.logTrace('Result', result);
logger.logTrace('Status Code', res.statusCode);
if (res.statusCode === 204) {
logger.logDebug('success: no data');
}
if (res.statusCode === 200) {
logger.logDebug('success: with data');
if (Object.keys(result).length > 0) {
result.events.eventList.forEach(function (element) {
try {
socket.sendData('event', element);
} catch (e) {
logger.logDebug('Error while sending message');
logger.logError(e);
deleteClient(sessionId); // issue with the websocket connection; stop polling
}
});
}
}
if (undefined !== clients[sessionId]) {
requestPolling();
}
logger.logDebug('webSocket: Success');
};
options.error = function (error) {
logger.logInfo('dhs.longpoller.startClient: error');
logger.logTrace('Error object', error);
/**
* 401: Unauthorized Request
* 403: Session Id not associated with token
* 404: Session has expired
*/
if (error.statusCode === 401 || error.statusCode === 403 || error.statusCode === 404) {
try {
socket.sendData('error', error); // Attempt to send data, but recover if unable to
} catch (e) {
logger.logDebug('Error while sending message');
logger.logError(e);
}
} else {
if (clients[sessionId] !== undefined) {
requestPolling(); // Retry polling again
}
}
logger.logDebug('webSocket: Error');
};
restClient = getRestClient(token);
clients[data.sessionId] = socket; // Saving the client before requesting
logger.logTrace('Count of connected clients', Object.keys(clients).length);
requestPolling();
}
exports.longPoller = {
startClient: startClient,
deleteClient: deleteClient
};