react-say
Version:
[](https://badge.fury.io/js/react-say) [](https://travis-ci.org/compulim/react-say)
223 lines (184 loc) • 16.1 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _createCustomEvent = _interopRequireDefault(require("./createCustomEvent"));
var _createDeferred = _interopRequireDefault(require("./createDeferred"));
var _createErrorEvent = _interopRequireDefault(require("./createErrorEvent"));
function speakUtterance(_x, _x2, _x3) {
return _speakUtterance.apply(this, arguments);
}
function _speakUtterance() {
_speakUtterance = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(ponyfill, utterance, startCallback) {
var speechSynthesis, startDeferred, errorDeferred, endDeferred, startEvent, finishedSpeaking, endPromise, endEvent;
return _regenerator["default"].wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
speechSynthesis = ponyfill.speechSynthesis;
startDeferred = (0, _createDeferred["default"])();
errorDeferred = (0, _createDeferred["default"])();
endDeferred = (0, _createDeferred["default"])();
utterance.addEventListener('end', endDeferred.resolve);
utterance.addEventListener('error', errorDeferred.resolve);
utterance.addEventListener('start', startDeferred.resolve); // if (speechSynthesis.speaking) {
// console.warn(`ASSERTION: speechSynthesis.speaking should not be truthy before we call speak`);
// }
speechSynthesis.speak(utterance);
_context4.next = 10;
return Promise.race([errorDeferred.promise, startDeferred.promise]);
case 10:
startEvent = _context4.sent;
if (!(startEvent.type === 'error')) {
_context4.next = 13;
break;
}
throw startEvent.error;
case 13:
endPromise = Promise.race([errorDeferred.promise, endDeferred.promise]);
startCallback && startCallback( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
if (finishedSpeaking) {
_context3.next = 4;
break;
}
speechSynthesis.cancel();
_context3.next = 4;
return endPromise;
case 4:
case "end":
return _context3.stop();
}
}
}, _callee3);
})));
_context4.next = 17;
return endPromise;
case 17:
endEvent = _context4.sent;
finishedSpeaking = true; // if (speechSynthesis.speaking) {
// console.warn(`ASSERTION: speechSynthesis.speaking should not be truthy after speak is stopped`);
// }
// console.debug(`ENDED: ${ utterance.text }`);
if (!(endEvent.type === 'error')) {
_context4.next = 21;
break;
}
throw endEvent.error;
case 21:
case "end":
return _context4.stop();
}
}
}, _callee4);
}));
return _speakUtterance.apply(this, arguments);
}
var QueuedUtterance = /*#__PURE__*/function () {
function QueuedUtterance(ponyfill, utterance, _ref) {
var onEnd = _ref.onEnd,
onError = _ref.onError,
onStart = _ref.onStart;
(0, _classCallCheck2["default"])(this, QueuedUtterance);
this._cancelled = false;
this._deferred = (0, _createDeferred["default"])();
this._onEnd = onEnd;
this._onError = onError;
this._onStart = onStart;
this._ponyfill = ponyfill;
this._speaking = false;
this._utterance = utterance;
this.promise = this._deferred.promise;
}
(0, _createClass2["default"])(QueuedUtterance, [{
key: "cancel",
value: function () {
var _cancel = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
this._cancelled = true;
_context.t0 = this._cancel;
if (!_context.t0) {
_context.next = 5;
break;
}
_context.next = 5;
return this._cancel();
case 5:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function cancel() {
return _cancel.apply(this, arguments);
}
return cancel;
}()
}, {
key: "speak",
value: function speak() {
var _this = this;
if (this._speaking) {
console.warn("ASSERTION: QueuedUtterance is already speaking or has spoken.");
}
this._speaking = true;
(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
if (!_this._cancelled) {
_context2.next = 2;
break;
}
throw new Error('cancelled');
case 2:
_context2.next = 4;
return speakUtterance(_this._ponyfill, _this._utterance, function (cancel) {
if (_this._cancelled) {
cancel();
throw new Error('cancelled');
} else {
_this._cancel = cancel;
_this._onStart && _this._onStart((0, _createCustomEvent["default"])('start'));
}
});
case 4:
if (!_this._cancelled) {
_context2.next = 6;
break;
}
throw new Error('cancelled');
case 6:
case "end":
return _context2.stop();
}
}
}, _callee2);
}))().then(function () {
_this._onEnd && _this._onEnd((0, _createCustomEvent["default"])('end'));
_this._deferred.resolve();
}, function (error) {
_this._onError && _this._onError((0, _createErrorEvent["default"])(error));
_this._deferred.reject(error);
});
return this.promise;
}
}]);
return QueuedUtterance;
}();
exports["default"] = QueuedUtterance;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9RdWV1ZWRVdHRlcmFuY2UuanMiXSwibmFtZXMiOlsic3BlYWtVdHRlcmFuY2UiLCJwb255ZmlsbCIsInV0dGVyYW5jZSIsInN0YXJ0Q2FsbGJhY2siLCJzcGVlY2hTeW50aGVzaXMiLCJzdGFydERlZmVycmVkIiwiZXJyb3JEZWZlcnJlZCIsImVuZERlZmVycmVkIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlc29sdmUiLCJzcGVhayIsIlByb21pc2UiLCJyYWNlIiwicHJvbWlzZSIsInN0YXJ0RXZlbnQiLCJ0eXBlIiwiZXJyb3IiLCJlbmRQcm9taXNlIiwiZmluaXNoZWRTcGVha2luZyIsImNhbmNlbCIsImVuZEV2ZW50IiwiUXVldWVkVXR0ZXJhbmNlIiwib25FbmQiLCJvbkVycm9yIiwib25TdGFydCIsIl9jYW5jZWxsZWQiLCJfZGVmZXJyZWQiLCJfb25FbmQiLCJfb25FcnJvciIsIl9vblN0YXJ0IiwiX3BvbnlmaWxsIiwiX3NwZWFraW5nIiwiX3V0dGVyYW5jZSIsIl9jYW5jZWwiLCJjb25zb2xlIiwid2FybiIsIkVycm9yIiwidGhlbiIsInJlamVjdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7U0FFZUEsYzs7Ozs7a0dBQWYsa0JBQThCQyxRQUE5QixFQUF3Q0MsU0FBeEMsRUFBbURDLGFBQW5EO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNVQyxZQUFBQSxlQURWLEdBQzhCSCxRQUQ5QixDQUNVRyxlQURWO0FBR1FDLFlBQUFBLGFBSFIsR0FHd0IsaUNBSHhCO0FBSVFDLFlBQUFBLGFBSlIsR0FJd0IsaUNBSnhCO0FBS1FDLFlBQUFBLFdBTFIsR0FLc0IsaUNBTHRCO0FBT0VMLFlBQUFBLFNBQVMsQ0FBQ00sZ0JBQVYsQ0FBMkIsS0FBM0IsRUFBa0NELFdBQVcsQ0FBQ0UsT0FBOUM7QUFDQVAsWUFBQUEsU0FBUyxDQUFDTSxnQkFBVixDQUEyQixPQUEzQixFQUFvQ0YsYUFBYSxDQUFD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LEVBQWtDLFVBQUFiLE1BQU0sRUFBSTtBQUM5RCxzQkFBSSxLQUFJLENBQUNNLFVBQVQsRUFBcUI7QUFDbkJOLG9CQUFBQSxNQUFNO0FBRU4sMEJBQU0sSUFBSWlCLEtBQUosQ0FBVSxXQUFWLENBQU47QUFDRCxtQkFKRCxNQUlPO0FBQ0wsb0JBQUEsS0FBSSxDQUFDSCxPQUFMLEdBQWVkLE1BQWY7QUFDQSxvQkFBQSxLQUFJLENBQUNVLFFBQUwsSUFBaUIsS0FBSSxDQUFDQSxRQUFMLENBQWMsbUNBQWtCLE9BQWxCLENBQWQsQ0FBakI7QUFDRDtBQUNGLGlCQVRtQixDQUxyQjs7QUFBQTtBQUFBLHFCQWdCSyxLQUFJLENBQUNKLFVBaEJWO0FBQUE7QUFBQTtBQUFBOztBQUFBLHNCQWlCUyxJQUFJVyxLQUFKLENBQVUsV0FBVixDQWpCVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQUFELEtBbUJLQyxJQW5CTCxDQW1CVSxZQUFNO0FBQ2QsUUFBQSxLQUFJLENBQUNWLE1BQUwsSUFBZSxLQUFJLENBQUNBLE1BQUwsQ0FBWSxtQ0FBa0IsS0FBbEIsQ0FBWixDQUFmOztBQUNBLFFBQUEsS0FBSSxDQUFDRCxTQUFMLENBQWVqQixPQUFmO0FBQ0QsT0F0QkQsRUFzQkcsVUFBQU8sS0FBSyxFQUFJO0FBQ1YsUUFBQSxLQUFJLENBQUNZLFFBQUwsSUFBaUIsS0FBSSxDQUFDQSxRQUFMLENBQWMsa0NBQWlCWixLQUFqQixDQUFkLENBQWpCOztBQUNBLFFBQUEsS0FBSSxDQUFDVSxTQUFMLENBQWVZLE1BQWYsQ0FBc0J0QixLQUF0QjtBQUNELE9BekJEO0FBMkJBLGFBQU8sS0FBS0gsT0FBWjtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyZWF0ZUN1c3RvbUV2ZW50IGZyb20gJy4vY3JlYXRlQ3VzdG9tRXZlbnQnO1xuaW1wb3J0IGNyZWF0ZURlZmVycmVkIGZyb20gJy4vY3JlYXRlRGVmZXJyZWQnO1xuaW1wb3J0IGNyZWF0ZUVycm9yRXZlbnQgZnJvbSAnLi9jcmVhdGVFcnJvckV2ZW50JztcblxuYXN5bmMgZnVuY3Rpb24gc3BlYWtVdHRlcmFuY2UocG9ueWZpbGwsIHV0dGVyYW5jZSwgc3RhcnRDYWxsYmFjaykge1xuICBjb25zdCB7IHNwZWVjaFN5bnRoZXNpcyB9ID0gcG9ueWZpbGw7XG5cbiAgY29uc3Qgc3RhcnREZWZlcnJlZCA9IGNyZWF0ZURlZmVycmVkKCk7XG4gIGNvbnN0IGVycm9yRGVmZXJyZWQgPSBjcmVhdGVEZWZlcnJlZCgpO1xuICBjb25zdCBlbmREZWZlcnJlZCA9IGNyZWF0ZURlZmVycmVkKCk7XG5cbiAgdXR0ZXJhbmNlLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGVuZERlZmVycmVkLnJlc29sdmUpO1xuICB1dHRlcmFuY2UuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBlcnJvckRlZmVycmVkLnJlc29sdmUpO1xuICB1dHRlcmFuY2UuYWRkRXZlbnRMaXN0ZW5lcignc3RhcnQnLCBzdGFydERlZmVycmVkLnJlc29sdmUpO1xuXG4gIC8vIGlmIChzcGVlY2hTeW50aGVzaXMuc3BlYWtpbmcpIHtcbiAgLy8gICBjb25zb2xlLndhcm4oYEFTU0VSVElPTjogc3BlZWNoU3ludGhlc2lzLnNwZWFraW5nIHNob3VsZCBub3QgYmUgdHJ1dGh5IGJlZm9yZSB3ZSBjYWxsIHNwZWFrYCk7XG4gIC8vIH1cblxuICBzcGVlY2hTeW50aGVzaXMuc3BlYWsodXR0ZXJhbmNlKTtcblxuICBjb25zdCBzdGFydEV2ZW50ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICBlcnJvckRlZmVycmVkLnByb21pc2UsXG4gICAgc3RhcnREZWZlcnJlZC5wcm9taXNlXG4gIF0pO1xuXG4gIGlmIChzdGFydEV2ZW50LnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICB0aHJvdyBzdGFydEV2ZW50LmVycm9yO1xuICB9XG5cbiAgbGV0IGZpbmlzaGVkU3BlYWtpbmc7XG4gIGNvbnN0IGVuZFByb21pc2UgPSBQcm9taXNlLnJhY2UoW1xuICAgIGVycm9yRGVmZXJyZWQucHJvbWlzZSxcbiAgICBlbmREZWZlcnJlZC5wcm9taXNlXG4gIF0pO1xuXG4gIHN0YXJ0Q2FsbGJhY2sgJiYgc3RhcnRDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFmaW5pc2hlZFNwZWFraW5nKSB7XG4gICAgICBzcGVlY2hTeW50aGVzaXMuY2FuY2VsKCk7XG4gICAgICBhd2FpdCBlbmRQcm9taXNlO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgZW5kRXZlbnQgPSBhd2FpdCBlbmRQcm9taXNlO1xuXG4gIGZpbmlzaGVkU3BlYWtpbmcgPSB0cnVlO1xuXG4gIC8vIGlmIChzcGVlY2hTeW50aGVzaXMuc3BlYWtpbmcpIHtcbiAgLy8gICBjb25zb2xlLndhcm4oYEFTU0VSVElPTjogc3BlZWNoU3ludGhlc2lzLnNwZWFraW5nIHNob3VsZCBub3QgYmUgdHJ1dGh5IGFmdGVyIHNwZWFrIGlzIHN0b3BwZWRgKTtcbiAgLy8gfVxuXG4gIC8vIGNvbnNvbGUuZGVidWcoYEVOREVEOiAkeyB1dHRlcmFuY2UudGV4dCB9YCk7XG5cbiAgaWYgKGVuZEV2ZW50LnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICB0aHJvdyBlbmRFdmVudC5lcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBRdWV1ZWRVdHRlcmFuY2Uge1xuICBjb25zdHJ1Y3Rvcihwb255ZmlsbCwgdXR0ZXJhbmNlLCB7IG9uRW5kLCBvbkVycm9yLCBvblN0YXJ0IH0pIHtcbiAgICB0aGlzLl9jYW5jZWxsZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9kZWZlcnJlZCA9IGNyZWF0ZURlZmVycmVkKCk7XG4gICAgdGhpcy5fb25FbmQgPSBvbkVuZDtcbiAgICB0aGlzLl9vbkVycm9yID0gb25FcnJvcjtcbiAgICB0aGlzLl9vblN0YXJ0ID0gb25TdGFydDtcbiAgICB0aGlzLl9wb255ZmlsbCA9IHBvbnlmaWxsO1xuICAgIHRoaXMuX3NwZWFraW5nID0gZmFsc2U7XG4gICAgdGhpcy5fdXR0ZXJhbmNlID0gdXR0ZXJhbmNlO1xuXG4gICAgdGhpcy5wcm9taXNlID0gdGhpcy5fZGVmZXJyZWQucHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIGNhbmNlbCgpIHtcbiAgICB0aGlzLl9jYW5jZWxsZWQgPSB0cnVlO1xuICAgIHRoaXMuX2NhbmNlbCAmJiBhd2FpdCB0aGlzLl9jYW5jZWwoKTtcbiAgfVxuXG4gIHNwZWFrKCkge1xuICAgIGlmICh0aGlzLl9zcGVha2luZykge1xuICAgICAgY29uc29sZS53YXJuKGBBU1NFUlRJT046IFF1ZXVlZFV0dGVyYW5jZSBpcyBhbHJlYWR5IHNwZWFraW5nIG9yIGhhcyBzcG9rZW4uYCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3BlYWtpbmcgPSB0cnVlO1xuXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jYW5jZWxsZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgc3BlYWtVdHRlcmFuY2UodGhpcy5fcG9ueWZpbGwsIHRoaXMuX3V0dGVyYW5jZSwgY2FuY2VsID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbmNlbGxlZCkge1xuICAgICAgICAgIGNhbmNlbCgpO1xuXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9jYW5jZWwgPSBjYW5jZWw7XG4gICAgICAgICAgdGhpcy5fb25TdGFydCAmJiB0aGlzLl9vblN0YXJ0KGNyZWF0ZUN1c3RvbUV2ZW50KCdzdGFydCcpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLl9jYW5jZWxsZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5jZWxsZWQnKTtcbiAgICAgIH1cbiAgICB9KSgpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5fb25FbmQgJiYgdGhpcy5fb25FbmQoY3JlYXRlQ3VzdG9tRXZlbnQoJ2VuZCcpKTtcbiAgICAgIHRoaXMuX2RlZmVycmVkLnJlc29sdmUoKTtcbiAgICB9LCBlcnJvciA9PiB7XG4gICAgICB0aGlzLl9vbkVycm9yICYmIHRoaXMuX29uRXJyb3IoY3JlYXRlRXJyb3JFdmVudChlcnJvcikpO1xuICAgICAgdGhpcy5fZGVmZXJyZWQucmVqZWN0KGVycm9yKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLnByb21pc2U7XG4gIH1cbn1cbiJdfQ==