opentok
Advanced tools
Comparing version 2.16.0 to 2.17.0
@@ -1,2 +0,1 @@ | ||
var request = require('request'); | ||
var errors = require('./errors'); | ||
@@ -6,2 +5,3 @@ var pkg = require('../package.json'); | ||
var generateJwt = require('./generateJwt'); | ||
var fetch = require('node-fetch'); | ||
@@ -15,3 +15,3 @@ // functions | ||
'X-OPENTOK-AUTH': generateJwt(config), | ||
Accept: 'application/json' | ||
Accept: 'application/json', | ||
}; | ||
@@ -196,13 +196,31 @@ }; | ||
var rurl = config.apiEndpoint + '/v2/project/' + config.apiKey + path; | ||
request.defaults(_.pick(config, 'proxy', 'timeout'))( | ||
const headers = generateHeaders(config); | ||
if (body && ['POST', 'PATCH', 'PUT'].includes(method)) { | ||
headers['Content-Type'] = 'application/json'; | ||
} | ||
Promise.resolve(fetch( | ||
rurl, | ||
{ | ||
url: rurl, | ||
method: method, | ||
headers: generateHeaders(config), | ||
json: body | ||
}, | ||
callback | ||
); | ||
body: body ? JSON.stringify(body) : null, | ||
headers: headers, | ||
} | ||
)) | ||
.then(async (response) => { | ||
const otResponse = { | ||
statusCode: response.status, | ||
} | ||
let body = await response.text(); | ||
callback(null, otResponse, body) | ||
}) | ||
.catch(async (error) => { | ||
callback(error); | ||
}); | ||
}; | ||
exports.listArchives = function (config, options, callback) { | ||
@@ -246,3 +264,3 @@ var qs = []; | ||
else { | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body))); | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body || { statusCode: response.statusCode, statusMessage: response.statusMessage }))); | ||
} | ||
@@ -294,23 +312,29 @@ } | ||
callback(err); | ||
return; | ||
} | ||
else if (response.statusCode !== 200) { | ||
if (response && response.statusCode === 404) { | ||
try { | ||
body = JSON.parse(body); | ||
} catch {} | ||
switch (response.statusCode) { | ||
case 404: | ||
callback(new errors.ArchiveError('Session not found')); | ||
} | ||
else if (response && response.statusCode === 403) { | ||
return; | ||
case 403: | ||
callback(new errors.AuthError('Invalid API key or secret')); | ||
} | ||
else if (response && response.statusCode === 409) { | ||
return; | ||
case 409: | ||
callback(new errors.ArchiveError('Recording already in progress or session not using OpenTok Media Router')); | ||
} | ||
else { | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body))); | ||
} | ||
return; | ||
case 200: | ||
if (body.status !== 'started') { | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body || { statusCode: response.statusCode, statusMessage: response.statusMessage }))); | ||
return; | ||
} | ||
callback(null, new Archive(config, body)); | ||
return; | ||
default: | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body || { statusCode: response.statusCode, statusMessage: response.statusMessage }))); | ||
} | ||
else if (body.status !== 'started') { | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body))); | ||
} | ||
else { | ||
callback(null, new Archive(config, body)); | ||
} | ||
} | ||
@@ -336,20 +360,27 @@ ); | ||
callback(err); | ||
return; | ||
} | ||
else if (response.statusCode !== 200) { | ||
if (response && response.statusCode === 404) { | ||
let responseJson = {}; | ||
try { | ||
responseJson = JSON.parse(body); | ||
} catch { | ||
} | ||
switch (response?.statusCode) { | ||
case 200: | ||
callback(null, new Archive(config, responseJson)); | ||
break; | ||
case 404: | ||
callback(new errors.ArchiveError('Archive not found')); | ||
} | ||
else if (response && response.statusCode === 409) { | ||
callback(new errors.ArchiveError(body.message)); | ||
} | ||
else if (response && response.statusCode === 403) { | ||
break; | ||
case 409: | ||
callback(new errors.ArchiveError(responseJson.message)); | ||
break; | ||
case 403: | ||
callback(new errors.AuthError('Invalid API key or secret')); | ||
} | ||
else { | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body))); | ||
} | ||
break; | ||
default: | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify({ statusCode: response.statusCode, statusMessage: response.statusMessage }))); | ||
} | ||
else { | ||
callback(null, new Archive(config, body)); | ||
} | ||
} | ||
@@ -381,16 +412,17 @@ ); | ||
} | ||
if (err || response.statusCode !== 200) { | ||
if (response && response.statusCode === 404) { | ||
switch(response.statusCode) { | ||
case 200: | ||
callback(null, new Archive(config, body)); | ||
return; | ||
case 404: | ||
callback(new errors.ArchiveError('Archive not found')); | ||
} | ||
else if (response && response.statusCode === 403) { | ||
return; | ||
case 403: | ||
callback(new errors.AuthError('Invalid API key or secret')); | ||
} | ||
else { | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body))); | ||
} | ||
return; | ||
default: | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body || { statusCode: response.statusCode, statusMessage: response.statusMessage }))); | ||
} | ||
else { | ||
callback(null, new Archive(config, body)); | ||
} | ||
} | ||
@@ -445,3 +477,3 @@ ); | ||
else { | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body))); | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body || { statusCode: response.statusCode, statusMessage: response.statusMessage }))); | ||
} | ||
@@ -512,18 +544,18 @@ } | ||
function deleteArchiveCallback(err, response, body) { | ||
if (err || response.statusCode !== 204) { | ||
if (response && response.statusCode === 404) { | ||
switch (response.statusCode) { | ||
case 204: | ||
callback(null); | ||
return; | ||
case 404: | ||
callback(new errors.ArchiveError('Archive not found')); | ||
} | ||
else if (response && response.statusCode === 403) { | ||
return | ||
case 403: | ||
callback(new errors.AuthError('Invalid API key or secret')); | ||
} | ||
else { | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body))); | ||
} | ||
return; | ||
default: | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body || { statusCode: response.statusCode, statusMessage: response.statusMessage }))); | ||
return; | ||
} | ||
else { | ||
callback(null); | ||
} | ||
} | ||
); | ||
}; |
@@ -1,2 +0,1 @@ | ||
var request = require('request'); | ||
var errors = require('./errors'); | ||
@@ -6,15 +5,40 @@ var pkg = require('../package.json'); | ||
var generateJwt = require('./generateJwt'); | ||
const fetch = require('node-fetch'); | ||
var api = function (config, method, path, body, callback) { | ||
var rurl = config.apiEndpoint + '/v2/project/' + config.apiKey + path; | ||
request.defaults(_.pick(config, 'proxy', 'timeout'))({ | ||
url: rurl, | ||
method: method, | ||
headers: { | ||
'X-OPENTOK-AUTH': generateJwt(config), | ||
'User-Agent': 'OpenTok-Node-SDK/' + pkg.version + | ||
(config.uaAddendum ? ' ' + config.uaAddendum : '') | ||
}, | ||
json: body | ||
}, callback); | ||
const headers = { | ||
'X-OPENTOK-AUTH': generateJwt(config), | ||
'User-Agent': 'OpenTok-Node-SDK/' + pkg.version | ||
+ (config.uaAddendum ? ' ' + config.uaAddendum : '') | ||
}; | ||
if (body && ['POST', 'PATCH', 'PUT'].includes(method)) { | ||
headers['Content-Type'] = 'application/json'; | ||
} | ||
Promise.resolve(fetch( | ||
rurl, | ||
{ | ||
method: method, | ||
body: body ? JSON.stringify(body) : null, | ||
headers: headers, | ||
} | ||
)) | ||
.then(async (response) => { | ||
const otResponse = { | ||
statusCode: response.status, | ||
} | ||
let body = await response.text(); | ||
try { | ||
body = JSON.parse(body) | ||
} catch (error) { | ||
} | ||
callback(null, otResponse, body) | ||
}) | ||
.catch(async (error) => { | ||
callback(error); | ||
}); | ||
}; | ||
@@ -45,23 +69,26 @@ | ||
api(config, 'GET', '/callback', null, function (err, response, body) { | ||
if (!err && body) { | ||
try { | ||
body = JSON.parse(body); | ||
} | ||
catch (_err) { | ||
err = _err; | ||
} | ||
if (err) { | ||
callback(err); | ||
} | ||
if (err || Math.floor(response.statusCode / 100) !== 2) { | ||
if (response && response.statusCode === 403) { | ||
try { | ||
body = JSON.parse(body); | ||
} | ||
catch (_err) { | ||
err = _err; | ||
} | ||
switch (response.statusCode) { | ||
case 200: | ||
callback(null, body.map(function (item) { | ||
return new Callback(config, item); | ||
})); | ||
return; | ||
case 403: | ||
callback(new errors.AuthError('Invalid API key or secret')); | ||
} | ||
else { | ||
callback(new errors.RequestError('Unexpected response from OpenTok')); | ||
} | ||
return; | ||
default: | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body || { statusCode: response.statusCode, statusMessage: response.statusMessage }))); | ||
return; | ||
} | ||
else { | ||
callback(null, body.map(function (item) { | ||
return new Callback(config, item); | ||
})); | ||
} | ||
}); | ||
@@ -85,17 +112,18 @@ }; | ||
callback(err); | ||
return; | ||
} | ||
else if (Math.floor(response.statusCode / 100) !== 2) { | ||
if (response && response.statusCode === 404) { | ||
switch(response.statusCode) { | ||
case 200: | ||
callback(null, new Callback(config, body)); | ||
return; | ||
case 404: | ||
callback(new errors.CallbackError('Callback event not found')); | ||
} | ||
else if (response && response.statusCode === 403) { | ||
return; | ||
case 403: | ||
callback(new errors.AuthError('Invalid API key or secret')); | ||
} | ||
else { | ||
callback(new errors.RequestError('Unexpected response from OpenTok')); | ||
} | ||
return; | ||
default: | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body || { statusCode: response.statusCode, statusMessage: response.statusMessage }))); | ||
} | ||
else { | ||
callback(null, new Callback(config, body)); | ||
} | ||
}); | ||
@@ -113,23 +141,30 @@ }; | ||
api( | ||
config, 'DELETE', '/callback/' + encodeURIComponent(callbackId), {}, | ||
function (err, response) { | ||
config, | ||
'DELETE', | ||
'/callback/' + encodeURIComponent(callbackId), | ||
null, | ||
function (err, response, body) { | ||
if (err) { | ||
callback(err); | ||
return; | ||
} | ||
else if (Math.floor(response.statusCode / 100) !== 2) { | ||
if (response && response.statusCode === 404) { | ||
switch (response.statusCode) { | ||
case 204: | ||
callback(null); | ||
return; | ||
case 404: | ||
callback(new errors.CallbackError('Callback not found')); | ||
} | ||
else if (response && response.statusCode === 403) { | ||
return; | ||
case 403: | ||
callback(new errors.AuthError('Invalid API key or secret')); | ||
} | ||
else { | ||
callback(new errors.RequestError('Unexpected response from OpenTok')); | ||
} | ||
return; | ||
default: | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body || { | ||
statusCode: response.statusCode, | ||
statusMessage: response.statusMessage | ||
}))); | ||
} | ||
else { | ||
callback(null); | ||
} | ||
} | ||
); | ||
}; |
@@ -1,3 +0,2 @@ | ||
var requestRoot = require('request'); | ||
var request = requestRoot; | ||
var request = require('needle'); | ||
var _ = require('lodash'); | ||
@@ -57,3 +56,3 @@ var generateJwt = require('./generateJwt'); | ||
if ('request' in this.c) { | ||
request = requestRoot.defaults(this.c.request); | ||
request.defaults(this.c.request); | ||
} | ||
@@ -66,8 +65,8 @@ | ||
request.post( | ||
this.c.apiUrl + this.c.endpoints.createSession, | ||
opts, | ||
{ | ||
// TODO: only works while apiUrl is always up to the domain, without the ending slash | ||
url: this.c.apiUrl + this.c.endpoints.createSession, | ||
form: opts, | ||
json: true, | ||
headers: this.generateHeaders() | ||
}, | ||
@@ -81,6 +80,6 @@ function (err, resp, body) { | ||
if (resp.statusCode === 403) { | ||
return cb(new Error('An authentication error occurred: (' + | ||
resp.statusCode + | ||
') ' + | ||
JSON.stringify(body))); | ||
return cb(new Error('An authentication error occurred: (' | ||
+ resp.statusCode | ||
+ ') ' | ||
+ JSON.stringify(body))); | ||
} | ||
@@ -90,6 +89,6 @@ | ||
if (resp.statusCode >= 500 && resp.statusCode <= 599) { | ||
return cb(new Error('A server error occurred: (' + | ||
resp.statusCode + | ||
') ' + | ||
JSON.stringify(body))); | ||
return cb(new Error('A server error occurred: (' | ||
+ resp.statusCode | ||
+ ') ' | ||
+ JSON.stringify(body))); | ||
} | ||
@@ -121,5 +120,4 @@ | ||
if (opts.sessionId) { | ||
url = | ||
this.c.apiUrl + | ||
this.c.endpoints.playDTMFToSession | ||
url = this.c.apiUrl | ||
+ this.c.endpoints.playDTMFToSession | ||
.replace(/<%apiKey%>/g, this.c.apiKey) | ||
@@ -129,5 +127,4 @@ .replace(/<%sessionId%>/g, opts.sessionId); | ||
if (opts.connectionId) { | ||
url = | ||
this.c.apiUrl + | ||
this.c.endpoints.playDTMFToClient | ||
url = this.c.apiUrl | ||
+ this.c.endpoints.playDTMFToClient | ||
.replace(/<%apiKey%>/g, this.c.apiKey) | ||
@@ -139,7 +136,7 @@ .replace(/<%sessionId%>/g, opts.sessionId) | ||
request.post( | ||
url, | ||
{ | ||
url: url, | ||
json: { | ||
digits: opts.digits | ||
}, | ||
digits: opts.digits | ||
}, | ||
{ | ||
headers: this.generateHeaders() | ||
@@ -161,5 +158,4 @@ }, | ||
Client.prototype.forceMuteStream = function (opts, cb) { | ||
var url = | ||
this.c.apiUrl + | ||
this.c.endpoints.forceMuteStream | ||
var url = this.c.apiUrl | ||
+ this.c.endpoints.forceMuteStream | ||
.replace(/<%apiKey%>/g, this.c.apiKey) | ||
@@ -170,4 +166,5 @@ .replace(/<%sessionId%>/g, opts.sessionId) | ||
request.post( | ||
url, | ||
{}, | ||
{ | ||
url: url, | ||
headers: this.generateHeaders() | ||
@@ -189,5 +186,4 @@ }, | ||
Client.prototype.forceMuteAll = function (opts, cb) { | ||
var url = | ||
this.c.apiUrl + | ||
this.c.endpoints.forceMute | ||
var url = this.c.apiUrl | ||
+ this.c.endpoints.forceMute | ||
.replace(/<%apiKey%>/g, this.c.apiKey) | ||
@@ -199,5 +195,5 @@ .replace(/<%sessionId%>/g, opts.sessionId); | ||
request.post( | ||
url, | ||
opts.options, | ||
{ | ||
url: url, | ||
json: opts.options, | ||
headers: this.generateHeaders() | ||
@@ -219,5 +215,4 @@ }, | ||
Client.prototype.disableForceMute = function (opts, cb) { | ||
var url = | ||
this.c.apiUrl + | ||
this.c.endpoints.forceMute | ||
var url = this.c.apiUrl | ||
+ this.c.endpoints.forceMute | ||
.replace(/<%apiKey%>/g, this.c.apiKey) | ||
@@ -231,5 +226,5 @@ .replace(/<%sessionId%>/g, opts.sessionId); | ||
request.post( | ||
url, | ||
options, | ||
{ | ||
url: url, | ||
json: options, | ||
headers: this.generateHeaders() | ||
@@ -251,18 +246,16 @@ }, | ||
Client.prototype.setArchiveLayout = function setArchiveLayout(opts, cb) { | ||
var url = | ||
this.c.apiUrl + | ||
this.c.endpoints.setArchiveLayout | ||
var url = this.c.apiUrl | ||
+ this.c.endpoints.setArchiveLayout | ||
.replace(/<%apiKey%>/g, this.c.apiKey) | ||
.replace(/<%archiveId%>/g, opts.archiveId); | ||
request.put( | ||
url, | ||
{ | ||
url: url, | ||
headers: this.generateHeaders(), | ||
json: true, | ||
body: { | ||
type: opts.type, | ||
stylesheet: opts.stylesheet || undefined, | ||
screenshareType: opts.screenshareType || undefined | ||
} | ||
type: opts.type, | ||
stylesheet: opts.stylesheet || undefined, | ||
screenshareType: opts.screenshareType || undefined | ||
}, | ||
{ | ||
headers: this.generateHeaders() | ||
}, | ||
function requestCallback(err, resp, body) { | ||
@@ -281,9 +274,9 @@ if (err) { | ||
Client.prototype.startBroadcast = function (opts, cb) { | ||
var url = | ||
this.c.apiUrl + | ||
this.c.endpoints.startBroadcast.replace(/<%apiKey%>/g, this.c.apiKey); | ||
var url = this.c.apiUrl | ||
+ this.c.endpoints.startBroadcast.replace(/<%apiKey%>/g, this.c.apiKey); | ||
request.post( | ||
url, | ||
opts, | ||
{ | ||
url: url, | ||
json: opts, | ||
headers: this.generateHeaders() | ||
@@ -294,8 +287,7 @@ }, | ||
if (resp.statusCode === 200) { | ||
// Success | ||
return cb(null, JSON.stringify(body)); | ||
if (resp.statusCode !== 200) { | ||
return cb(new Error('(' + resp.statusCode + ') ' + JSON.stringify(body))); | ||
} | ||
return cb(new Error('(' + resp.statusCode + ') ' + JSON.stringify(body))); | ||
return cb(null, JSON.stringify(body)); | ||
} | ||
@@ -309,19 +301,22 @@ ); | ||
request.patch({ | ||
url: url, | ||
json: opts, | ||
headers: this.generateHeaders() | ||
}, function (err, resp, body) { | ||
if (err) return cb(new Error('The request failed')); | ||
if (resp.statusCode === 204) { | ||
return cb(null, JSON.stringify(body)); | ||
request.patch( | ||
url, | ||
opts, | ||
{ | ||
headers: this.generateHeaders() | ||
}, | ||
function (err, resp, body) { | ||
if (err) return cb(new Error('The request failed')); | ||
if (resp.statusCode === 204) { | ||
return cb(null, JSON.stringify(body)); | ||
} | ||
return cb(new Error('(' + resp.statusCode + ') ' + JSON.stringify(body))); | ||
} | ||
return cb(new Error('(' + resp.statusCode + ') ' + JSON.stringify(body))); | ||
}); | ||
); | ||
}; | ||
Client.prototype.stopBroadcast = function (broadcastId, cb) { | ||
var url = | ||
this.c.apiUrl + | ||
this.c.endpoints.stopBroadcast | ||
var url = this.c.apiUrl | ||
+ this.c.endpoints.stopBroadcast | ||
.replace(/<%apiKey%>/g, this.c.apiKey) | ||
@@ -331,4 +326,5 @@ .replace(/<%broadcastId%>/g, broadcastId); | ||
request.post( | ||
url, | ||
{}, | ||
{ | ||
url: url, | ||
headers: this.generateHeaders() | ||
@@ -350,10 +346,9 @@ }, | ||
Client.prototype.getBroadcast = function getBroadcast(broadcastId, cb) { | ||
var url = | ||
this.c.apiUrl + | ||
this.c.endpoints.getBroadcast | ||
var url = this.c.apiUrl | ||
+ this.c.endpoints.getBroadcast | ||
.replace(/<%apiKey%>/g, this.c.apiKey) | ||
.replace(/<%broadcastId%>/g, broadcastId); | ||
request.get( | ||
url, | ||
{ | ||
url: url, | ||
headers: this.generateHeaders() | ||
@@ -374,10 +369,9 @@ }, | ||
Client.prototype.listBroadcasts = function listBroadcasts(queryString, cb) { | ||
var baseUrl = | ||
this.c.apiUrl + | ||
this.c.endpoints.listBroadcasts.replace(/<%apiKey%>/g, this.c.apiKey); | ||
var baseUrl = this.c.apiUrl | ||
+ this.c.endpoints.listBroadcasts.replace(/<%apiKey%>/g, this.c.apiKey); | ||
var url = queryString.length > 0 ? baseUrl + '?' + queryString : baseUrl; | ||
var parsedBody; | ||
request.get( | ||
url, | ||
{ | ||
url: url, | ||
headers: this.generateHeaders() | ||
@@ -405,18 +399,16 @@ }, | ||
Client.prototype.setBroadcastLayout = function setBroadcastLayout(opts, cb) { | ||
var url = | ||
this.c.apiUrl + | ||
this.c.endpoints.setBroadcastLayout | ||
var url = this.c.apiUrl | ||
+ this.c.endpoints.setBroadcastLayout | ||
.replace(/<%apiKey%>/g, this.c.apiKey) | ||
.replace(/<%broadcastId%>/g, opts.broadcastId); | ||
request.put( | ||
url, | ||
{ | ||
url: url, | ||
headers: this.generateHeaders(), | ||
json: true, | ||
body: { | ||
type: opts.type, | ||
stylesheet: opts.stylesheet || undefined, | ||
screenshareType: opts.screenshareType || undefined | ||
} | ||
type: opts.type, | ||
stylesheet: opts.stylesheet || undefined, | ||
screenshareType: opts.screenshareType || undefined | ||
}, | ||
{ | ||
headers: this.generateHeaders() | ||
}, | ||
function requestCallback(err, resp, body) { | ||
@@ -435,12 +427,11 @@ if (err) { | ||
Client.prototype.websocketConnect = function websocketConnect(opts, cb) { | ||
var url = | ||
this.c.apiUrl + | ||
this.c.endpoints.audioStreamer | ||
var url = this.c.apiUrl + this.c.endpoints.audioStreamer | ||
.replace(/<%apiKey%>/g, this.c.apiKey); | ||
request.post( | ||
url, | ||
opts, | ||
{ | ||
url: url, | ||
headers: this.generateHeaders(), | ||
json: opts | ||
json: true | ||
}, | ||
@@ -464,16 +455,14 @@ function requestCallback(err, resp, body) { | ||
) { | ||
var url = | ||
this.c.apiUrl + | ||
this.c.endpoints.setStreamClassLists | ||
var url = this.c.apiUrl | ||
+ this.c.endpoints.setStreamClassLists | ||
.replace(/<%apiKey%>/, this.c.apiKey) | ||
.replace(/<%sessionId%>/g, sessionId); | ||
request.put( | ||
url, | ||
{ | ||
url: url, | ||
headers: this.generateHeaders(), | ||
json: true, | ||
body: { | ||
items: classListArray | ||
} | ||
items: classListArray | ||
}, | ||
{ | ||
headers: this.generateHeaders() | ||
}, | ||
function requestCallback(err, resp, body) { | ||
@@ -492,12 +481,12 @@ if (err) return cb(new Error('The request failed: ' + err)); | ||
// handle server errors | ||
return cb(new Error('A server error occurred: (' + | ||
resp.statusCode + | ||
') ' + | ||
JSON.stringify(body))); | ||
return cb(new Error('A server error occurred: (' | ||
+ resp.statusCode | ||
+ ') ' | ||
+ JSON.stringify(body))); | ||
} | ||
} | ||
return cb(new Error('An unexpected error occurred: (' + | ||
resp.statusCode + | ||
') ' + | ||
JSON.stringify(body))); | ||
return cb(new Error('An unexpected error occurred: (' | ||
+ resp.statusCode | ||
+ ') ' | ||
+ JSON.stringify(body))); | ||
} | ||
@@ -509,6 +498,6 @@ ); | ||
request.post( | ||
this.c.apiUrl + this.c.endpoints.dial, | ||
opts, | ||
{ | ||
// TODO: only works while apiUrl is always up to the domain, without the ending slash | ||
url: this.c.apiUrl + this.c.endpoints.dial, | ||
json: opts, | ||
headers: this.generateHeaders() | ||
@@ -546,5 +535,4 @@ }, | ||
Client.prototype.getStream = function getStream(sessionId, streamId, cb) { | ||
var url = | ||
this.c.apiUrl + | ||
this.c.endpoints.getStream | ||
var url = this.c.apiUrl | ||
+ this.c.endpoints.getStream | ||
.replace(/<%apiKey%>/g, this.c.apiKey) | ||
@@ -554,4 +542,4 @@ .replace(/<%streamId%>/g, streamId) | ||
request.get( | ||
url, | ||
{ | ||
url: url, | ||
headers: this.generateHeaders() | ||
@@ -572,10 +560,9 @@ }, | ||
Client.prototype.listStreams = function listStreams(sessionId, cb) { | ||
var url = | ||
this.c.apiUrl + | ||
this.c.endpoints.listStreams | ||
var url = this.c.apiUrl | ||
+ this.c.endpoints.listStreams | ||
.replace(/<%apiKey%>/g, this.c.apiKey) | ||
.replace(/<%sessionId%>/g, sessionId); | ||
request.get( | ||
url, | ||
{ | ||
url: url, | ||
headers: this.generateHeaders() | ||
@@ -603,5 +590,5 @@ }, | ||
'User-Agent': | ||
'OpenTok-Node-SDK/' + | ||
pkg.version + | ||
(this.c.uaAddendum ? ' ' + this.c.uaAddendum : ''), | ||
'OpenTok-Node-SDK/' | ||
+ pkg.version | ||
+ (this.c.uaAddendum ? ' ' + this.c.uaAddendum : ''), | ||
'X-OPENTOK-AUTH': generateJwt(this.c), | ||
@@ -608,0 +595,0 @@ Accept: 'application/json' |
@@ -1,2 +0,1 @@ | ||
var request = require('request'); | ||
var errors = require('./errors'); | ||
@@ -6,4 +5,5 @@ var pkg = require('../package.json'); | ||
var generateJwt = require('./generateJwt'); | ||
var fetch = require('node-fetch'); | ||
var api = function (config, method, session, connection, body, callback) { | ||
var api = function (config, method, session, connection, body, callback) { | ||
var rurl = config.apiEndpoint + '/v2/project/' + config.apiKey + '/session/' + session; | ||
@@ -13,12 +13,33 @@ if (connection) { | ||
} | ||
request.defaults(_.pick(config, 'proxy', 'timeout'))({ | ||
url: rurl, | ||
method: method, | ||
headers: { | ||
const headers = { | ||
'X-OPENTOK-AUTH': generateJwt(config), | ||
'User-Agent': 'OpenTok-Node-SDK/' + pkg.version + | ||
(config.uaAddendum ? ' ' + config.uaAddendum : '') | ||
}, | ||
json: body | ||
}, callback); | ||
}; | ||
if (body) { | ||
headers['Content-Type'] = 'application/json'; | ||
} | ||
Promise.resolve(fetch( | ||
rurl, | ||
{ | ||
method: method, | ||
body: body ? JSON.stringify(body) : null, | ||
headers: headers, | ||
} | ||
)) | ||
.then(async (response) => { | ||
const otResponse = { | ||
statusCode: response.status, | ||
statusMessage: response.statusText | ||
} | ||
let body = await response.text(); | ||
callback(null, otResponse, body); | ||
}) | ||
.catch(async (error) => { | ||
/* istanbul ignore next */ | ||
callback(error); | ||
}); | ||
}; | ||
@@ -33,3 +54,3 @@ | ||
} | ||
return api(config, 'DELETE', sessionId, connectionId, null, function (err, response) { | ||
return api(config, 'DELETE', sessionId, connectionId, null, function (err, response, body) { | ||
if (err || Math.floor(response.statusCode / 100) !== 2) { | ||
@@ -43,3 +64,3 @@ if (response && response.statusCode === 403) { | ||
else { | ||
callback(new errors.RequestError('Unexpected response from OpenTok')); | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body || { statusCode: response.statusCode, statusMessage: response.statusMessage }))); | ||
} | ||
@@ -46,0 +67,0 @@ } |
/* eslint-env es2018 */ | ||
const errors = require('./errors'); | ||
const request = require('request'); | ||
const fetch = require('node-fetch'); | ||
const { version } = require('../package.json'); | ||
@@ -23,4 +23,2 @@ const _ = require('lodash'); | ||
* | ||
* @property {Number} updatedAt | ||
** | ||
* @property {Number} upddatedAt | ||
@@ -66,3 +64,3 @@ * The time at which the render was created, in milliseconds since the UNIX epoch. | ||
{ | ||
method = 'GET', | ||
method, | ||
config, | ||
@@ -86,11 +84,24 @@ path, | ||
request.defaults(_.pick(config, 'proxy', 'timeout'))( | ||
const requestHeaders = generateHeaders(config, headers) | ||
if (body && ['POST', 'PATCH', 'PUT'].includes(method)) { | ||
requestHeaders['Content-Type'] = 'application/json'; | ||
} | ||
Promise.resolve(fetch( | ||
rurl, | ||
{ | ||
url: rurl.href, | ||
method: method, | ||
headers: generateHeaders(config, headers), | ||
json: body | ||
}, | ||
callback | ||
); | ||
body: body ? JSON.stringify(body) : null, | ||
headers: requestHeaders, | ||
} | ||
)) | ||
.then(async (response) => { | ||
const otResponse = { | ||
statusCode: response.status, | ||
} | ||
callback(null, otResponse, await response.json()) | ||
}) | ||
.catch(async (error) => { | ||
callback(error); | ||
}); | ||
}; | ||
@@ -156,7 +167,10 @@ | ||
/** | ||
* Return a list of {@link Render} objects, representing Experience composer in any status | ||
* Return a list of {@link Render} objects, representing Experience Composer in any status | ||
* | ||
* @param {Object} config - API configuration settings {@see OpenTok.listRenders} | ||
* @param {Object} options - Optional parameters for the API call {@see OpenTok.listRenders} | ||
* @param {Function} callback - Call back function | ||
* @param {Function} callback - Callback function | ||
* | ||
* @method #listRenders | ||
* @memberof Render | ||
*/ | ||
@@ -192,7 +206,10 @@ exports.listRenders = (config, options, callback) => { | ||
/** | ||
* Gets an {@link Render} object for the given render ID. | ||
* Gets a {@link Render} object for the given render ID. | ||
* | ||
* @param {Object} config - API config {@see OpenTok} | ||
* @param {String} renderId - The Render ID to fetch | ||
* @param {Function} callback - Call back function | ||
* @param {Function} callback - Callback function | ||
* | ||
* @method #getRender | ||
* @memberof Render | ||
*/ | ||
@@ -212,3 +229,3 @@ exports.getRender = (config, renderId, callback) => { | ||
/** | ||
* Starts an Experience composer for an OpenTok session. | ||
* Starts an Experience Composer for an OpenTok session. | ||
* | ||
@@ -218,3 +235,6 @@ * | ||
* @param {Object} options - Optional parameters for the API call {@see OpenTok.startRender} | ||
* @param {Function} callback - Call back function | ||
* @param {Function} callback - Callback function | ||
* | ||
* @method #startRender | ||
* @memberof Render | ||
*/ | ||
@@ -247,3 +267,6 @@ exports.startRender = (config, options, callback) => { | ||
* @param {String} renderId - The Render ID to fetch | ||
* @param {Function} callback - Call back function | ||
* @param {Function} callback - Callback function | ||
* | ||
* @method #stopRender | ||
* @memberof Render | ||
*/ | ||
@@ -250,0 +273,0 @@ exports.stopRender = (config, renderId, callback) => { |
@@ -1,2 +0,1 @@ | ||
var request = require('request'); | ||
var errors = require('./errors'); | ||
@@ -6,2 +5,3 @@ var pkg = require('../package.json'); | ||
var generateJwt = require('./generateJwt'); | ||
const fetch = require('node-fetch'); | ||
@@ -14,12 +14,37 @@ var api = function (config, method, session, connection, body, callback) { | ||
rurl += '/signal'; | ||
request.defaults(_.pick(config, 'proxy', 'timeout'))({ | ||
url: rurl, | ||
method: method, | ||
headers: { | ||
'X-OPENTOK-AUTH': generateJwt(config), | ||
'User-Agent': 'OpenTok-Node-SDK/' + pkg.version + | ||
(config.uaAddendum ? ' ' + config.uaAddendum : '') | ||
}, | ||
json: body | ||
}, callback); | ||
const requestHeaders = { | ||
'X-OPENTOK-AUTH': generateJwt(config), | ||
'User-Agent': 'OpenTok-Node-SDK/' + pkg.version | ||
+ (config.uaAddendum ? ' ' + config.uaAddendum : '') | ||
}; | ||
if (body && ['POST', 'PATCH', 'PUT'].includes(method)) { | ||
requestHeaders['Content-Type'] = 'application/json'; | ||
} | ||
Promise.resolve(fetch( | ||
rurl, | ||
{ | ||
method: method, | ||
body: body ? JSON.stringify(body) : null, | ||
headers: requestHeaders, | ||
} | ||
)) | ||
.then(async (response) => { | ||
const otResponse = { | ||
statusCode: response.status, | ||
} | ||
let body = await response.text(); | ||
try { | ||
body = JSON.parse(body) | ||
} catch (error) { | ||
} | ||
callback(null, otResponse, body) | ||
}) | ||
.catch(async (error) => { | ||
callback(error); | ||
}); | ||
}; | ||
@@ -39,3 +64,3 @@ | ||
} | ||
return api(config, 'POST', sessionId, connectionId, payload, function (err, response) { | ||
return api(config, 'POST', sessionId, connectionId, payload, function (err, response, body) { | ||
if (err || Math.floor(response.statusCode / 100) !== 2) { | ||
@@ -49,3 +74,3 @@ if (response && response.statusCode === 403) { | ||
else { | ||
callback(new errors.RequestError('Unexpected response from OpenTok')); | ||
callback(new errors.RequestError('Unexpected response from OpenTok: ' + JSON.stringify(body || { statusCode: response.statusCode, statusMessage: response.statusMessage }))); | ||
} | ||
@@ -52,0 +77,0 @@ } |
{ | ||
"name": "opentok", | ||
"description": "OpenTok server-side SDK", | ||
"version": "2.16.0", | ||
"version": "2.17.0", | ||
"homepage": "https://github.com/opentok/opentok-node", | ||
@@ -61,2 +61,5 @@ "repository": { | ||
"main": "lib/opentok.js", | ||
"files": [ | ||
"lib/" | ||
], | ||
"scripts": { | ||
@@ -70,3 +73,5 @@ "test": "npm run test-no-lint && npm run jasmine_node", | ||
"jasmine_node": "jasmine spec/opentok_spec.js", | ||
"report-coverage": "cross-env NODE_ENV=test nyc --reporter=text-lcov mocha > coverage.lcov" | ||
"report-coverage": "npm run mocha-coverage && npm run jasmine-coverage", | ||
"mocha-coverage": "cross-env NODE_ENV=test nyc --reporter=text-lcov mocha > mocha.lcov", | ||
"jasmine-coverage": "cross-env NODE_ENV=test nyc --reporter=text-lcov jasmine-node spec > jasmine.lcov" | ||
}, | ||
@@ -77,18 +82,20 @@ "engines": { | ||
"devDependencies": { | ||
"chai": "4.3.7", | ||
"chai": "4.3.10", | ||
"cross-env": "7.0.3", | ||
"eslint": "8.31.0", | ||
"eslint": "8.51.0", | ||
"eslint-config-airbnb-base": "15.0.0", | ||
"eslint-plugin-import": "2.26.0", | ||
"jasmine": "4.5.0", | ||
"eslint-plugin-import": "2.28.1", | ||
"jasmine": "5.1.0", | ||
"jasmine-node": "1.16.0", | ||
"mocha": "10.2.0", | ||
"nock": "13.2.9", | ||
"nock": "13.3.6", | ||
"nyc": "15.1.0" | ||
}, | ||
"dependencies": { | ||
"jsonwebtoken": "9.0.0", | ||
"jsonwebtoken": "9.0.2", | ||
"lodash": "4.17.21", | ||
"opentok-token": "1.1.1", | ||
"request": "2.88.2" | ||
"needle": "3.2.0", | ||
"node-fetch": "2.7.0", | ||
"opentok-token": "1.1.1" | ||
} | ||
} |
Sorry, the diff of this file is too big to display
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
spdx disjunction for an artifact's license information
Licensespdx disjunction for an artifact's license information
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 3 instances in 1 package
spdx disjunction for an artifact's license information
Licensespdx disjunction for an artifact's license information
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Mixed license
License(Experimental) Package contains multiple licenses.
Found 1 instance in 1 package
1
0
165679
5
10
16
3878
6
+ Addedneedle@3.2.0
+ Addednode-fetch@2.7.0
+ Addeddebug@3.2.7(transitive)
+ Addediconv-lite@0.6.3(transitive)
+ Addedjsonwebtoken@9.0.2(transitive)
+ Addedlodash.includes@4.3.0(transitive)
+ Addedlodash.isboolean@3.0.3(transitive)
+ Addedlodash.isinteger@4.0.4(transitive)
+ Addedlodash.isnumber@3.0.3(transitive)
+ Addedlodash.isplainobject@4.0.6(transitive)
+ Addedlodash.isstring@4.0.1(transitive)
+ Addedlodash.once@4.1.1(transitive)
+ Addedneedle@3.2.0(transitive)
+ Addednode-fetch@2.7.0(transitive)
+ Addedsax@1.4.1(transitive)
+ Addedtr46@0.0.3(transitive)
+ Addedwebidl-conversions@3.0.1(transitive)
+ Addedwhatwg-url@5.0.0(transitive)
- Removedrequest@2.88.2
- Removedajv@6.12.6(transitive)
- Removedasn1@0.2.6(transitive)
- Removedassert-plus@1.0.0(transitive)
- Removedasynckit@0.4.0(transitive)
- Removedaws-sign2@0.7.0(transitive)
- Removedaws4@1.13.0(transitive)
- Removedbcrypt-pbkdf@1.0.2(transitive)
- Removedcaseless@0.12.0(transitive)
- Removedcombined-stream@1.0.8(transitive)
- Removedcore-util-is@1.0.2(transitive)
- Removeddashdash@1.14.1(transitive)
- Removeddelayed-stream@1.0.0(transitive)
- Removedecc-jsbn@0.1.2(transitive)
- Removedextend@3.0.2(transitive)
- Removedextsprintf@1.3.0(transitive)
- Removedfast-deep-equal@3.1.3(transitive)
- Removedfast-json-stable-stringify@2.1.0(transitive)
- Removedforever-agent@0.6.1(transitive)
- Removedform-data@2.3.3(transitive)
- Removedgetpass@0.1.7(transitive)
- Removedhar-schema@2.0.0(transitive)
- Removedhar-validator@5.1.5(transitive)
- Removedhttp-signature@1.2.0(transitive)
- Removedis-typedarray@1.0.0(transitive)
- Removedisstream@0.1.2(transitive)
- Removedjsbn@0.1.1(transitive)
- Removedjson-schema@0.4.0(transitive)
- Removedjson-schema-traverse@0.4.1(transitive)
- Removedjson-stringify-safe@5.0.1(transitive)
- Removedjsonwebtoken@9.0.0(transitive)
- Removedjsprim@1.4.2(transitive)
- Removedmime-db@1.52.0(transitive)
- Removedmime-types@2.1.35(transitive)
- Removedoauth-sign@0.9.0(transitive)
- Removedperformance-now@2.1.0(transitive)
- Removedpsl@1.9.0(transitive)
- Removedpunycode@2.3.1(transitive)
- Removedqs@6.5.3(transitive)
- Removedrequest@2.88.2(transitive)
- Removedsshpk@1.18.0(transitive)
- Removedtough-cookie@2.5.0(transitive)
- Removedtunnel-agent@0.6.0(transitive)
- Removedtweetnacl@0.14.5(transitive)
- Removeduri-js@4.4.1(transitive)
- Removeduuid@3.4.0(transitive)
- Removedverror@1.10.0(transitive)
Updatedjsonwebtoken@9.0.2