@webex/webex-server
Version:
.
199 lines (191 loc) • 6.49 kB
JavaScript
;
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
_Object$defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _apply = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/apply"));
var _fs = _interopRequireDefault(require("fs"));
var _util = _interopRequireDefault(require("util"));
var _bodyParser = _interopRequireDefault(require("body-parser"));
var _express = _interopRequireDefault(require("express"));
var _expressValidator = _interopRequireDefault(require("express-validator"));
var _expressSession = _interopRequireDefault(require("express-session"));
var _lodash = require("lodash");
var _webex = _interopRequireDefault(require("./webex"));
var _memoryStore = _interopRequireDefault(require("./memory-store"));
/*!
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
*/
/* eslint-disable camelcase */
/* eslint-disable no-console */
// express induces more callbacks than usual
/* eslint-disable max-nested-callbacks */ // eslint-disable-next-line
var router = _express.default.Router();
var _default = exports.default = router;
router.use(_bodyParser.default.json());
router.use((0, _expressValidator.default)());
router.use((0, _expressSession.default)({
resave: true,
saveUninitialized: true,
secret: 'keyboardcat',
store: new _memoryStore.default()
}));
/**
* Return the details for a given session
* @type {Function}
*/
router.get('/session', function (req, res) {
var webex = req.session.webex;
if (!webex) {
res.status(404).end();
return;
}
res.status(200).send({
webex: webex.serialize()
}).end();
});
/**
* Initialize a webex instance, connect it to mercury, and set a session cookie.
* @type {Function}
*/
router.put('/session', function (req, res, next) {
req.checkBody('clientId').notEmpty();
req.checkBody('clientSecret').notEmpty();
req.checkBody('redirectUri').notEmpty();
req.checkBody('scope').notEmpty();
req.checkBody('user').notEmpty();
req.checkBody('user.token').notEmpty();
req.checkBody('user.token.access_token').notEmpty();
req.checkBody('user.token.token_type').notEmpty();
req.checkBody('user.token.expires_in').notEmpty();
req.getValidationResult().then(function (result) {
if (!result.isEmpty()) {
console.info(result.array());
res.status(400).send("".concat(result.array()[0].param, " is missing"));
return;
}
var webex = new _webex.default({
credentials: req.body.user.token,
config: {
credentials: {
client_id: req.body.clientId,
client_secret: req.body.clientSecret,
redirect_uri: req.body.redirectUri,
scope: req.body.scope
}
}
});
req.session.webex = webex;
webex.internal.mercury.connect().then(function () {
return res.status(200).send({
webex: webex
}).end();
}).catch(function (err) {
console.error(err);
next(err);
});
});
});
/**
* Disconnect a webex instance and unregister its device
*/
router.delete('/session', function (req, res, next) {
var webex = req.session.webex;
if (!webex) {
res.status(404).send({
err: 'no webex instance found for session'
}).end();
return;
}
webex.internal.mercury.disconnect().then(function () {
req.session.destroy(function (err) {
if (err) {
next(err);
return;
}
res.status(204).end();
});
}).catch(function (err) {
req.session.destroy(function (err2) {
if (err2) {
next(err2);
return;
}
next(err);
});
});
});
router.post('/session/invoke/internal/conversation/share', function (req, res) {
console.info('invoke conversation share called');
var webex = req.session.webex;
if (!webex) {
console.info('invoke: No session found - did you forget to hit /session?');
res.status(404).send({
message: 'No session found - did you forget to hit /session?'
}).end();
return;
}
var share = webex.internal.conversation.makeShare(req.body[0]);
req.body[1].files.forEach(function (fileJson) {
var file = _fs.default.readFileSync(fileJson.path); // eslint-disable-line no-sync
file.name = fileJson.displayName;
share.add(file);
});
console.info('invoke: invoking "conversation.share" with arguments\n', _util.default.inspect(req.body));
webex.internal.conversation.share(req.body[0], share).then(function (result) {
res.status(200).send(result).end();
}).catch(function (reason) {
console.log(reason);
res.status(400).send({
message: 'An error occured while processing your request',
error: reason.toString(),
upstreamStatusCode: reason.statusCode,
upstreamResponse: reason.body
}).end();
});
});
/**
* Invoke an sdk method.
*/
router.post(/^\/session\/invoke\/.*/, function (req, res) {
console.info('invoke called');
var webex = req.session.webex;
if (!webex) {
console.info('invoke: No session found - did you forget to hit /session?');
res.status(404).send({
message: 'No session found - did you forget to hit /session?'
}).end();
return;
}
var invokePath = req.url.substr(req.url.indexOf('invoke') + 7);
var keypath = invokePath.split('/');
var method = (0, _lodash.get)(webex, keypath.join('.'));
console.info(111, method, keypath);
var methodName = keypath.pop();
console.info(222, methodName);
var context = (0, _lodash.get)(webex, keypath.join('.'));
if (!context) {
context = webex;
}
console.info(333, context);
var label = "webex.".concat(keypath.join('.'), ".").concat(methodName, "()");
console.info("invoke: invoking \"".concat(label, "\" with arguments\n"), _util.default.inspect(req.body));
(0, _apply.default)(method, context, req.body).then(function (result) {
console.info("invoke: successfully invoked \"".concat(label, "\""));
res.status(200).send(result).end();
}).catch(function (reason) {
console.error({
req: req,
err: reason
}, "invoke: \"".concat(label, "\" failed with error"));
res.status(502).send({
message: 'An error occured while processing your request',
error: reason.toString(),
upstreamStatusCode: reason.statusCode,
upstreamResponse: reason.body
}).end();
});
});
//# sourceMappingURL=session.js.map