UNPKG

react-say

Version:

[![npm version](https://badge.fury.io/js/react-say.svg)](https://badge.fury.io/js/react-say) [![Build Status](https://travis-ci.org/compulim/react-say.svg?branch=master)](https://travis-ci.org/compulim/react-say)

223 lines (184 loc) 16.1 kB
"use strict"; 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==