box-ui-elements-mlh
Version:
262 lines (215 loc) • 10.4 kB
JavaScript
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
import Browser from './BrowserUtils';
import ComServerClient from './ComServerClient';
import CONSTANTS from './constants';
var TIMEOUT_MS = 5000;
var EXTENSION_CHECK_DEBOUNCE_TIME = 100;
var extensionRequestTimeout;
function createRequestData(extensions) {
return JSON.stringify({
request_type: 'get_default_application',
extension: extensions
});
}
function createExecuteData(fileId, token, authCode, tokenScope) {
var execData = JSON.stringify({
auth_code: authCode,
auth_token: token,
browser_type: Browser.getName(),
command_type: 'launch_application',
file_id: fileId.toString(),
token_scope: tokenScope
});
return execData;
}
function isBlacklistedExtension(extension) {
var EXTENSION_BLACKLIST = CONSTANTS.EXTENSION_BLACKLIST;
var uppercaseExt = extension.toUpperCase(); // if ext has a leading ., strip it
if (uppercaseExt.charAt(0) === '.') {
uppercaseExt = uppercaseExt.substr(1);
}
return uppercaseExt in EXTENSION_BLACKLIST;
}
var BoxEditInstance = null;
var BoxEdit = /*#__PURE__*/function () {
function BoxEdit() {
_classCallCheck(this, BoxEdit);
if (!(BoxEditInstance instanceof BoxEdit)) {
BoxEditInstance = this;
}
this.extensionRequestQueue = new Map();
return BoxEditInstance;
}
_createClass(BoxEdit, [{
key: "queueGetNativeAppNameFromLocal",
value: function queueGetNativeAppNameFromLocal(extension) {
// There's already a pending or fulfilled request for the appname
if (this.extensionRequestQueue.has(extension)) {
var queueItem = this.extensionRequestQueue.get(extension);
if (!queueItem) {
throw new Error('Race condition re: queueGetNativeAppNameFromLocal');
}
return queueItem.promise;
}
var extensionRequest = {};
var appNameRequestPromise = new Promise(function (resolve, reject) {
extensionRequest.resolve = resolve;
extensionRequest.reject = reject;
});
extensionRequest.promise = appNameRequestPromise;
this.extensionRequestQueue.set(extension, extensionRequest);
return appNameRequestPromise;
}
}, {
key: "checkBoxEditAvailability",
value: function checkBoxEditAvailability() {
return this.getBoxEditAvailability();
}
}, {
key: "getBoxEditAvailability",
value: function getBoxEditAvailability() {
this.client = new ComServerClient(CONSTANTS.BOX_EDIT_APP_NAME);
return this.client.getComServerStatus();
}
}, {
key: "canOpenWithBoxEdit",
value: function () {
var _canOpenWithBoxEdit = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(extensions) {
var _this = this;
var extensionToAppTuples, resultMap;
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
_context2.next = 2;
return Promise.all(extensions.map( /*#__PURE__*/function () {
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(ext) {
var appName, result, _result;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
_context.next = 3;
return _this.getAppForExtension(ext);
case 3:
appName = _context.sent;
result = [ext, appName];
return _context.abrupt("return", result);
case 8:
_context.prev = 8;
_context.t0 = _context["catch"](0);
_result = [ext, ''];
return _context.abrupt("return", _result);
case 12:
case "end":
return _context.stop();
}
}
}, _callee, null, [[0, 8]]);
}));
return function (_x2) {
return _ref.apply(this, arguments);
};
}()));
case 2:
extensionToAppTuples = _context2.sent;
resultMap = new Map();
extensionToAppTuples.forEach(function (tuple) {
return resultMap.set.apply(resultMap, _toConsumableArray(tuple));
});
return _context2.abrupt("return", Promise.resolve(resultMap));
case 6:
case "end":
return _context2.stop();
}
}
}, _callee2);
}));
function canOpenWithBoxEdit(_x) {
return _canOpenWithBoxEdit.apply(this, arguments);
}
return canOpenWithBoxEdit;
}()
}, {
key: "openFile",
value: function openFile(fileID, token) {
// @NOTE. canOpenWithBoxEdit, create token taken care of higher levels
// therefore not ported into React library
// TODO is token the right name?
var executeDataAsString = createExecuteData(fileID, token.data.token, token.data.auth_code, token.data.token_scope);
return this.client.sendCommand(executeDataAsString, TIMEOUT_MS);
}
}, {
key: "getAppForExtension",
value: function getAppForExtension(extension) {
var _this2 = this;
try {
if (isBlacklistedExtension(extension)) {
throw new Error('blacklisted');
}
var applicationSupportRequest = this.queueGetNativeAppNameFromLocal(extension);
if (!extensionRequestTimeout) {
extensionRequestTimeout = setTimeout(function () {
_this2.processExtensionRequestQueue();
}, EXTENSION_CHECK_DEBOUNCE_TIME);
}
return applicationSupportRequest;
} catch (err) {
return Promise.reject();
}
}
}, {
key: "processExtensionRequestQueue",
value: function processExtensionRequestQueue() {
var copyQueue = new Map();
var extensions = [];
this.extensionRequestQueue.forEach(function (value, key) {
copyQueue.set(key, value);
extensions.push(key);
});
this.extensionRequestQueue.clear();
extensionRequestTimeout = null;
var requestData = createRequestData(extensions);
return this.client.sendRequest(requestData).then(function (data) {
if (data && data.default_application_name) {
var defaultApplicationName = data.default_application_name; // @TODO. Reassess.
// This is an odd construction that may not be necessary.
if (Object.prototype.toString.call(defaultApplicationName) === '[object Object]') {
defaultApplicationName = [defaultApplicationName];
}
defaultApplicationName.forEach(function (extensionAppObj) {
var extension = Object.keys(extensionAppObj)[0];
var appName = decodeURIComponent(extensionAppObj[extension]);
if (appName) {
var queueItem = copyQueue.get(extension);
if (queueItem) {
queueItem.resolve(appName);
copyQueue.delete(extension);
}
}
});
} // Reject all remaining items in the queue
extensions.forEach(function (extension) {
var queueItem = copyQueue.get(extension);
if (queueItem) {
queueItem.reject();
}
});
});
}
}]);
return BoxEdit;
}();
export default BoxEdit;
//# sourceMappingURL=BoxEdit.js.map