UNPKG

botframework-webchat-component

Version:
240 lines (193 loc) 19.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = downscaleImageToDataURLUsingWorker; exports.checkSupport = checkSupport; var _blobToArrayBuffer = _interopRequireDefault(require("./blobToArrayBuffer")); var _downscaleImageToDataURLUsingWorker = _interopRequireDefault(require("./downscaleImageToDataURLUsingWorker.worker")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure 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 _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 _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } 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 createWorker(fn) { var blob = new Blob(["(".concat(fn, ")()")], { type: 'text/javascript' }); var url = window.URL.createObjectURL(blob); return new Promise(function (resolve, reject) { var worker = new Worker(url); worker.onerror = function (_ref) { var error = _ref.error, message = _ref.message; return reject(error || new Error(message)); }; worker.onmessage = function (_ref2) { var data = _ref2.data; return data === 'ready' && resolve(worker); }; }).finally(function () { window.URL.revokeObjectURL(url); }); } var workerPromise; function getWorker() { return _getWorker.apply(this, arguments); } // We are using a lazy-check because: // 1. OffscreenCanvas.getContext has a toll // 2. Developers could bring polyfills function _getWorker() { _getWorker = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() { var worker; return regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: if (!workerPromise) { _context3.next = 6; break; } _context3.next = 3; return workerPromise; case 3: worker = _context3.sent; _context3.next = 11; break; case 6: workerPromise = createWorker(_downscaleImageToDataURLUsingWorker.default); _context3.next = 9; return workerPromise; case 9: worker = _context3.sent; worker.addEventListener('error', function () { // Current worker errored out, will create a new worker next time. workerPromise = null; worker.terminate(); }); case 11: return _context3.abrupt("return", worker); case 12: case "end": return _context3.stop(); } } }, _callee3); })); return _getWorker.apply(this, arguments); } var checkSupportOffscreenCanvas = function checkSupportOffscreenCanvas() { var hasOffscreenCanvas = typeof window.OffscreenCanvas !== 'undefined' && (typeof window.OffscreenCanvas.prototype.convertToBlob !== 'undefined' || typeof window.OffscreenCanvas.prototype.toBlob !== 'undefined'); var isOffscreenCanvasSupportGetContext2D; if (hasOffscreenCanvas) { try { new OffscreenCanvas(1, 1).getContext('2d'); isOffscreenCanvasSupportGetContext2D = true; } catch (err) { isOffscreenCanvasSupportGetContext2D = false; } } return typeof window.createImageBitmap !== 'undefined' && hasOffscreenCanvas && isOffscreenCanvasSupportGetContext2D; }; var checkSupportWebWorkerPromise; function checkSupportWebWorker() { return checkSupportWebWorkerPromise || (checkSupportWebWorkerPromise = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { var worker; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(typeof window.MessageChannel === 'undefined' || typeof window.Worker === 'undefined')) { _context.next = 2; break; } return _context.abrupt("return", false); case 2: _context.prev = 2; _context.next = 5; return createWorker('function(){postMessage("ready")}'); case 5: worker = _context.sent; _context.next = 11; break; case 8: _context.prev = 8; _context.t0 = _context["catch"](2); return _context.abrupt("return", false); case 11: worker.terminate(); return _context.abrupt("return", true); case 13: case "end": return _context.stop(); } } }, _callee, null, [[2, 8]]); }))()); } var checkSupportPromise; function checkSupport() { return checkSupportPromise || (checkSupportPromise = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { var results; return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.prev = 0; _context2.next = 3; return Promise.all([checkSupportOffscreenCanvas(), checkSupportWebWorker()]); case 3: results = _context2.sent; return _context2.abrupt("return", results.every(function (result) { return result; })); case 7: _context2.prev = 7; _context2.t0 = _context2["catch"](0); return _context2.abrupt("return", false); case 10: case "end": return _context2.stop(); } } }, _callee2, null, [[0, 7]]); }))()); } function downscaleImageToDataURLUsingWorker(blob, maxWidth, maxHeight, type, quality) { return new Promise(function (resolve, reject) { var _MessageChannel = new MessageChannel(), port1 = _MessageChannel.port1, port2 = _MessageChannel.port2; port1.onmessage = function (_ref5) { var _ref5$data = _ref5.data, error = _ref5$data.error, result = _ref5$data.result; if (error) { var err = new Error(error.message); err.stack = error.stack; reject(err); } else { resolve(result); } port1.close(); port2.close(); }; Promise.all([(0, _blobToArrayBuffer.default)(blob), getWorker()]).then(function (_ref6) { var _ref7 = _slicedToArray(_ref6, 2), arrayBuffer = _ref7[0], worker = _ref7[1]; return worker.postMessage({ arrayBuffer: arrayBuffer, maxHeight: maxHeight, maxWidth: maxWidth, quality: quality, type: type }, [arrayBuffer, port2]); }); }); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9VdGlscy9kb3duc2NhbGVJbWFnZVRvRGF0YVVSTC9kb3duc2NhbGVJbWFnZVRvRGF0YVVSTFVzaW5nV29ya2VyLmpzIl0sIm5hbWVzIjpbImNyZWF0ZVdvcmtlciIsImZuIiwiYmxvYiIsIkJsb2IiLCJ0eXBlIiwidXJsIiwid2luZG93IiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ3b3JrZXIiLCJXb3JrZXIiLCJvbmVycm9yIiwiZXJyb3IiLCJtZXNzYWdlIiwiRXJyb3IiLCJvbm1lc3NhZ2UiLCJkYXRhIiwiZmluYWxseSIsInJldm9rZU9iamVjdFVSTCIsIndvcmtlclByb21pc2UiLCJnZXRXb3JrZXIiLCJ3b3JrZXJGdW5jdGlvbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJ0ZXJtaW5hdGUiLCJjaGVja1N1cHBvcnRPZmZzY3JlZW5DYW52YXMiLCJoYXNPZmZzY3JlZW5DYW52YXMiLCJPZmZzY3JlZW5DYW52YXMiLCJwcm90b3R5cGUiLCJjb252ZXJ0VG9CbG9iIiwidG9CbG9iIiwiaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0R2V0Q29udGV4dDJEIiwiZ2V0Q29udGV4dCIsImVyciIsImNyZWF0ZUltYWdlQml0bWFwIiwiY2hlY2tTdXBwb3J0V2ViV29ya2VyUHJvbWlzZSIsImNoZWNrU3VwcG9ydFdlYldvcmtlciIsIk1lc3NhZ2VDaGFubmVsIiwiY2hlY2tTdXBwb3J0UHJvbWlzZSIsImNoZWNrU3VwcG9ydCIsImFsbCIsInJlc3VsdHMiLCJldmVyeSIsInJlc3VsdCIsImRvd25zY2FsZUltYWdlVG9EYXRhVVJMVXNpbmdXb3JrZXIiLCJtYXhXaWR0aCIsIm1heEhlaWdodCIsInF1YWxpdHkiLCJwb3J0MSIsInBvcnQyIiwic3RhY2siLCJjbG9zZSIsInRoZW4iLCJhcnJheUJ1ZmZlciIsInBvc3RNZXNzYWdlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOztBQUNBOzs7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LEtBQWQsQ0FBeEUsQ0FEdUQ7QUFBQSxLQUF6RDtBQUdELEdBckJNLENBQVA7QUFzQkQiLCJzb3VyY2VSb290IjoiY29tcG9uZW50Oi8vLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBibG9iVG9BcnJheUJ1ZmZlciBmcm9tICcuL2Jsb2JUb0FycmF5QnVmZmVyJztcbmltcG9ydCB3b3JrZXJGdW5jdGlvbiBmcm9tICcuL2Rvd25zY2FsZUltYWdlVG9EYXRhVVJMVXNpbmdXb3JrZXIud29ya2VyJztcblxuZnVuY3Rpb24gY3JlYXRlV29ya2VyKGZuKSB7XG4gIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYCgke2ZufSkoKWBdLCB7IHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnIH0pO1xuICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHdvcmtlciA9IG5ldyBXb3JrZXIodXJsKTtcblxuICAgIHdvcmtlci5vbmVycm9yID0gKHsgZXJyb3IsIG1lc3NhZ2UgfSkgPT4gcmVqZWN0KGVycm9yIHx8IG5ldyBFcnJvcihtZXNzYWdlKSk7XG4gICAgd29ya2VyLm9ubWVzc2FnZSA9ICh7IGRhdGEgfSkgPT4gZGF0YSA9PT0gJ3JlYWR5JyAmJiByZXNvbHZlKHdvcmtlcik7XG4gIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gIH0pO1xufVxuXG5sZXQgd29ya2VyUHJvbWlzZTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0V29ya2VyKCkge1xuICBsZXQgd29ya2VyO1xuXG4gIGlmICh3b3JrZXJQcm9taXNlKSB7XG4gICAgd29ya2VyID0gYXdhaXQgd29ya2VyUHJvbWlzZTtcbiAgfSBlbHNlIHtcbiAgICB3b3JrZXJQcm9taXNlID0gY3JlYXRlV29ya2VyKHdvcmtlckZ1bmN0aW9uKTtcblxuICAgIHdvcmtlciA9IGF3YWl0IHdvcmtlclByb21pc2U7XG4gICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgLy8gQ3VycmVudCB3b3JrZXIgZXJyb3JlZCBvdXQsIHdpbGwgY3JlYXRlIGEgbmV3IHdvcmtlciBuZXh0IHRpbWUuXG4gICAgICB3b3JrZXJQcm9taXNlID0gbnVsbDtcbiAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB3b3JrZXI7XG59XG5cbi8vIFdlIGFyZSB1c2luZyBhIGxhenktY2hlY2sgYmVjYXVzZTpcbi8vIDEuIE9mZnNjcmVlbkNhbnZhcy5nZXRDb250ZXh0IGhhcyBhIHRvbGxcbi8vIDIuIERldmVsb3BlcnMgY291bGQgYnJpbmcgcG9seWZpbGxzXG5cbmNvbnN0IGNoZWNrU3VwcG9ydE9mZnNjcmVlbkNhbnZhcyA9ICgpID0+IHtcbiAgY29uc3QgaGFzT2Zmc2NyZWVuQ2FudmFzID1cbiAgICB0eXBlb2Ygd2luZG93Lk9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAodHlwZW9mIHdpbmRvdy5PZmZzY3JlZW5DYW52YXMucHJvdG90eXBlLmNvbnZlcnRUb0Jsb2IgIT09ICd1bmRlZmluZWQnIHx8XG4gICAgICB0eXBlb2Ygd2luZG93Lk9mZnNjcmVlbkNhbnZhcy5wcm90b3R5cGUudG9CbG9iICE9PSAndW5kZWZpbmVkJyk7XG4gIGxldCBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRHZXRDb250ZXh0MkQ7XG5cbiAgaWYgKGhhc09mZnNjcmVlbkNhbnZhcykge1xuICAgIHRyeSB7XG4gICAgICBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDEpLmdldENvbnRleHQoJzJkJyk7XG4gICAgICBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRHZXRDb250ZXh0MkQgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaXNPZmZzY3JlZW5DYW52YXNTdXBwb3J0R2V0Q29udGV4dDJEID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cuY3JlYXRlSW1hZ2VCaXRtYXAgIT09ICd1bmRlZmluZWQnICYmIGhhc09mZnNjcmVlbkNhbnZhcyAmJiBpc09mZnNjcmVlbkNhbnZhc1N1cHBvcnRHZXRDb250ZXh0MkQ7XG59O1xuXG5sZXQgY2hlY2tTdXBwb3J0V2ViV29ya2VyUHJvbWlzZTtcblxuZnVuY3Rpb24gY2hlY2tTdXBwb3J0V2ViV29ya2VyKCkge1xuICByZXR1cm4gKFxuICAgIGNoZWNrU3VwcG9ydFdlYldvcmtlclByb21pc2UgfHxcbiAgICAoY2hlY2tTdXBwb3J0V2ViV29ya2VyUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdy5NZXNzYWdlQ2hhbm5lbCA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHdpbmRvdy5Xb3JrZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgbGV0IHdvcmtlcjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgd29ya2VyID0gYXdhaXQgY3JlYXRlV29ya2VyKCdmdW5jdGlvbigpe3Bvc3RNZXNzYWdlKFwicmVhZHlcIil9Jyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB3b3JrZXIudGVybWluYXRlKCk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pKCkpXG4gICk7XG59XG5cbmxldCBjaGVja1N1cHBvcnRQcm9taXNlO1xuXG5mdW5jdGlvbiBjaGVja1N1cHBvcnQoKSB7XG4gIHJldHVybiAoXG4gICAgY2hlY2tTdXBwb3J0UHJvbWlzZSB8fFxuICAgIChjaGVja1N1cHBvcnRQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChbY2hlY2tTdXBwb3J0T2Zmc2NyZWVuQ2FudmFzKCksIGNoZWNrU3VwcG9ydFdlYldvcmtlcigpXSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHMuZXZlcnkocmVzdWx0ID0+IHJlc3VsdCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pKCkpXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRvd25zY2FsZUltYWdlVG9EYXRhVVJMVXNpbmdXb3JrZXIoYmxvYiwgbWF4V2lkdGgsIG1heEhlaWdodCwgdHlwZSwgcXVhbGl0eSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHsgcG9ydDEsIHBvcnQyIH0gPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcblxuICAgIHBvcnQxLm9ubWVzc2FnZSA9ICh7IGRhdGE6IHsgZXJyb3IsIHJlc3VsdCB9IH0pID0+IHtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IoZXJyb3IubWVzc2FnZSk7XG5cbiAgICAgICAgZXJyLnN0YWNrID0gZXJyb3Iuc3RhY2s7XG5cbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9XG5cbiAgICAgIHBvcnQxLmNsb3NlKCk7XG4gICAgICBwb3J0Mi5jbG9zZSgpO1xuICAgIH07XG5cbiAgICBQcm9taXNlLmFsbChbYmxvYlRvQXJyYXlCdWZmZXIoYmxvYiksIGdldFdvcmtlcigpXSkudGhlbigoW2FycmF5QnVmZmVyLCB3b3JrZXJdKSA9PlxuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsgYXJyYXlCdWZmZXIsIG1heEhlaWdodCwgbWF4V2lkdGgsIHF1YWxpdHksIHR5cGUgfSwgW2FycmF5QnVmZmVyLCBwb3J0Ml0pXG4gICAgKTtcbiAgfSk7XG59XG5cbmV4cG9ydCB7IGNoZWNrU3VwcG9ydCB9O1xuIl19