botframework-webchat-component
Version:
React component of botframework-webchat
240 lines (193 loc) • 19.6 kB
JavaScript
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
;