Comparing version 1.0.1-master.efdec9e to 1.1.0
@@ -9,4 +9,18 @@ # Changelog | ||
## [1.1.0] - 2018-10-28 | ||
### Added | ||
- Utterance queue are now controlled by `<Composer>` instance, instead of native `speechSynthesis` for better browser compatibility | ||
- Chrome: does not fire `start` and `end` events if `speak`/`cancel` are called too fast | ||
- Safari: does not play audio or `start` event if the first utterance is not triggered by user event | ||
- Unmounting elements will cancel the speech in progress or pending speech | ||
### Changed | ||
- Lerna bootstrap will no longer hoist | ||
- Playground: Bump to `react@16.6.0`, `react-dom@16.6.0`, and `react-scripts@2.0.5` | ||
### Fixed | ||
- Null reference on `props.speechSynthesis` | ||
## [1.0.0] - 2018-07-09 | ||
### Added | ||
- Initial release |
@@ -7,6 +7,34 @@ 'use strict'; | ||
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; | ||
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); | ||
var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); | ||
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); | ||
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); | ||
var _inherits2 = require('babel-runtime/helpers/inherits'); | ||
var _inherits3 = _interopRequireDefault(_inherits2); | ||
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); | ||
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); | ||
var _regenerator = require('babel-runtime/regenerator'); | ||
var _regenerator2 = _interopRequireDefault(_regenerator); | ||
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); | ||
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); | ||
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); | ||
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); | ||
var _createClass2 = require('babel-runtime/helpers/createClass'); | ||
var _createClass3 = _interopRequireDefault(_createClass2); | ||
var _memoizeOne = require('memoize-one'); | ||
@@ -28,119 +56,180 @@ | ||
var _Utterance = require('./Utterance'); | ||
var _Utterance2 = _interopRequireDefault(_Utterance); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
var SpeechContext = function () { | ||
function SpeechContext(ponyfill) { | ||
(0, _classCallCheck3.default)(this, SpeechContext); | ||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } | ||
this.queueWithCurrent = []; | ||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } | ||
this.cancel = this.cancel.bind(this); | ||
this.cancelAll = this.cancelAll.bind(this); | ||
this.speak = this.speak.bind(this); | ||
function createContext(_ref) { | ||
var speechSynthesis = _ref.speechSynthesis, | ||
speechSynthesisUtterance = _ref.speechSynthesisUtterance; | ||
this.setPonyfill(ponyfill); | ||
} | ||
return { | ||
cancel: function cancel() { | ||
return speechSynthesis.cancel(); | ||
}, | ||
speak: function speak(_ref2) { | ||
var lang = _ref2.lang, | ||
onBoundary = _ref2.onBoundary, | ||
onEnd = _ref2.onEnd, | ||
onError = _ref2.onError, | ||
onStart = _ref2.onStart, | ||
_ref2$pitch = _ref2.pitch, | ||
pitch = _ref2$pitch === undefined ? 1 : _ref2$pitch, | ||
_ref2$rate = _ref2.rate, | ||
rate = _ref2$rate === undefined ? 1 : _ref2$rate, | ||
text = _ref2.text, | ||
voice = _ref2.voice, | ||
_ref2$volume = _ref2.volume, | ||
volume = _ref2$volume === undefined ? 1 : _ref2$volume; | ||
(0, _createClass3.default)(SpeechContext, [{ | ||
key: 'setPonyfill', | ||
value: function setPonyfill(_ref) { | ||
var speechSynthesis = _ref.speechSynthesis, | ||
SpeechSynthesisUtterance = _ref.SpeechSynthesisUtterance; | ||
var utterance = new speechSynthesisUtterance(text); | ||
var targetVoice = void 0; | ||
this.ponyfill = { speechSynthesis: speechSynthesis, SpeechSynthesisUtterance: SpeechSynthesisUtterance }; | ||
} | ||
}, { | ||
key: 'cancel', | ||
value: function () { | ||
var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(id) { | ||
var index; | ||
return _regenerator2.default.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
index = this.queueWithCurrent.findIndex(function (utterance) { | ||
return utterance.id === id; | ||
}); | ||
if (typeof voice === 'function') { | ||
targetVoice = voice.call(speechSynthesis, speechSynthesis.getVoices()); | ||
} else { | ||
var _ref3 = voice || {}, | ||
voiceURI = _ref3.voiceURI; | ||
if (!~index) { | ||
_context.next = 3; | ||
break; | ||
} | ||
targetVoice = voiceURI && [].find.call([].slice.call(speechSynthesis.getVoices()), function (v) { | ||
return v.voiceURI === voiceURI; | ||
}); | ||
return _context.abrupt('return', this.queueWithCurrent[index].cancel()); | ||
case 3: | ||
case 'end': | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, this); | ||
})); | ||
function cancel(_x) { | ||
return _ref2.apply(this, arguments); | ||
} | ||
// Edge will mute if "lang" is set to "" | ||
utterance.lang = lang || ''; | ||
return cancel; | ||
}() | ||
}, { | ||
key: 'cancelAll', | ||
value: function () { | ||
var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2() { | ||
return _regenerator2.default.wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
case 'end': | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2, this); | ||
})); | ||
if (utterance.pitch || utterance.pitch === 0) { | ||
utterance.pitch = pitch; | ||
function cancelAll() { | ||
return _ref3.apply(this, arguments); | ||
} | ||
if (utterance.rate || utterance.rate === 0) { | ||
utterance.rate = rate; | ||
return cancelAll; | ||
}() | ||
}, { | ||
key: 'speak', | ||
value: function speak(utteranceLike) { | ||
// console.debug(`QUEUED: ${ utteranceLike.text }`); | ||
if (utteranceLike.id && this.queueWithCurrent.find(function (_ref4) { | ||
var id = _ref4.id; | ||
return id === utteranceLike.id; | ||
})) { | ||
// Do not queue duplicated speak with same unique ID | ||
// console.debug('NOT QUEUEING DUPE'); | ||
return; | ||
} | ||
// Cognitive Services will error when "voice" is set to "null" | ||
// Edge will error when "voice" is set to "undefined" | ||
if (targetVoice) { | ||
utterance.voice = targetVoice; | ||
var utterance = new _Utterance2.default(utteranceLike); | ||
this.queueWithCurrent = [].concat((0, _toConsumableArray3.default)(this.queueWithCurrent), [utterance]); | ||
if (this.queueWithCurrent.length === 1) { | ||
this._next(); | ||
} | ||
if (utterance.volume || utterance.volume === 0) { | ||
utterance.volume = volume; | ||
return utterance.deferred.promise; | ||
} | ||
}, { | ||
key: '_next', | ||
value: function _next() { | ||
var _this = this; | ||
var utterance = this.queueWithCurrent[0]; | ||
if (!utterance) { | ||
return; | ||
} | ||
utterance.onboundary = onBoundary; | ||
utterance.onend = onEnd; | ||
utterance.onerror = onError; | ||
utterance.onstart = onStart; | ||
var id = utterance.id; | ||
speechSynthesis.speak(utterance); | ||
var promise = utterance.speak(this.ponyfill); | ||
promise.then(function () { | ||
_this.queueWithCurrent = _this.queueWithCurrent.filter(function (utterance) { | ||
return utterance.id !== id; | ||
}); | ||
_this._next(); | ||
}, function () { | ||
// TODO: If the error is due to Safari restriction on user touch | ||
// The next loop on the next audio will also fail because it was not queued with a user touch | ||
_this.queueWithCurrent = _this.queueWithCurrent.filter(function (utterance) { | ||
return utterance.id !== id; | ||
}); | ||
_this._next(); | ||
}); | ||
} | ||
}; | ||
} | ||
}]); | ||
return SpeechContext; | ||
}(); | ||
function getVoices(speechSynthesis) { | ||
return speechSynthesis.getVoices().map(function (_ref4) { | ||
var def = _ref4['default'], | ||
lang = _ref4.lang, | ||
localService = _ref4.localService, | ||
name = _ref4.name, | ||
voiceURI = _ref4.voiceURI; | ||
return { | ||
'default': def, | ||
lang: lang, | ||
localService: localService, | ||
name: name, | ||
voiceURI: voiceURI | ||
}; | ||
}); | ||
} | ||
var Composer = function (_React$Component) { | ||
_inherits(Composer, _React$Component); | ||
(0, _inherits3.default)(Composer, _React$Component); | ||
function Composer(props) { | ||
_classCallCheck(this, Composer); | ||
(0, _classCallCheck3.default)(this, Composer); | ||
var _this = _possibleConstructorReturn(this, (Composer.__proto__ || Object.getPrototypeOf(Composer)).call(this, props)); | ||
var _this2 = (0, _possibleConstructorReturn3.default)(this, (Composer.__proto__ || (0, _getPrototypeOf2.default)(Composer)).call(this, props)); | ||
_this.handleVoicesChanged = _this.handleVoicesChanged.bind(_this); | ||
_this2.handleVoicesChanged = _this2.handleVoicesChanged.bind(_this2); | ||
props.speechSynthesis.onvoiceschanged = _this.handleVoicesChanged; | ||
var voices = []; | ||
_this.mergeContext = (0, _memoizeOne2.default)(function (context, voices) { | ||
return _extends({}, context, { voices: voices }); | ||
if (props.speechSynthesis) { | ||
props.speechSynthesis.addEventListener && props.speechSynthesis.addEventListener('voiceschanged', _this2.handleVoicesChanged); | ||
voices = props.speechSynthesis.getVoices(); | ||
} | ||
_this2.mergeContext = (0, _memoizeOne2.default)(function (_ref5, voices) { | ||
var cancel = _ref5.cancel, | ||
speak = _ref5.speak; | ||
return { | ||
cancel: cancel, | ||
speak: speak, | ||
voices: voices | ||
}; | ||
}); | ||
_this.state = { | ||
context: createContext(props), | ||
voices: getVoices(props.speechSynthesis) | ||
_this2.state = { | ||
context: new SpeechContext({ | ||
speechSynthesis: props.speechSynthesis, | ||
SpeechSynthesisUtterance: props.speechSynthesisUtterance | ||
}), | ||
voices: voices | ||
}; | ||
return _this; | ||
return _this2; | ||
} | ||
_createClass(Composer, [{ | ||
(0, _createClass3.default)(Composer, [{ | ||
key: 'componentWillReceiveProps', | ||
@@ -155,16 +244,20 @@ value: function componentWillReceiveProps(nextProps) { | ||
if (changed) { | ||
this.props.speechSynthesis.onvoiceschanged = null; | ||
this.state.context.cancel(); | ||
if (props.speechSynthesis) { | ||
props.speechSynthesis.removeEventListener && props.speechSynthesis.removeEventListener('voiceschanged', this.handleVoicesChanged); | ||
} | ||
nextProps.speechSynthesis.onvoiceschanged = this.handleVoicesChanged; | ||
this.state.context.setPonyfill({ | ||
speechSynthesis: nextProps.speechSynthesis, | ||
SpeechSynthesisUtterance: nextProps.speechSynthesisUtterance | ||
}); | ||
this.setState(function (_ref5) { | ||
var context = _ref5.context; | ||
var nextVoices = []; | ||
context.cancel(); | ||
if (nextProps.speechSynthesis) { | ||
nextProps.speechSynthesis.addEventListener && nextProps.speechSynthesis.addEventListener('voiceschanged', this.handleVoicesChanged); | ||
nextVoices = nextProps.speechSynthesis.getVoices() || []; | ||
} | ||
return { | ||
context: createContext(nextProps), | ||
voices: getVoices(nextProps.speechSynthesis) | ||
}; | ||
this.setState(function () { | ||
return { voices: nextVoices }; | ||
}); | ||
@@ -174,2 +267,10 @@ } | ||
}, { | ||
key: 'componentWillUnmount', | ||
value: function componentWillUnmount() { | ||
var speechSynthesis = this.props.speechSynthesis; | ||
speechSynthesis && speechSynthesis.removeEventListener && speechSynthesis.removeEventListener('voiceschanged', this.handleVoicesChanged); | ||
} | ||
}, { | ||
key: 'handleVoicesChanged', | ||
@@ -179,6 +280,4 @@ value: function handleVoicesChanged(_ref6) { | ||
var voices = getVoices(target); | ||
this.setState(function () { | ||
return { voices: voices }; | ||
return { voices: target.getVoices() }; | ||
}); | ||
@@ -189,2 +288,4 @@ } | ||
value: function render() { | ||
var _this3 = this; | ||
var props = this.props, | ||
@@ -196,15 +297,20 @@ state = this.state; | ||
return _react2.default.createElement( | ||
_Context2.default.Provider, | ||
{ value: this.mergeContext(state.context, state.voices) }, | ||
typeof children === 'function' ? _react2.default.createElement( | ||
_Context2.default.Consumer, | ||
null, | ||
function (context) { | ||
return children(context); | ||
} | ||
) : children | ||
_Context2.default.Consumer, | ||
null, | ||
function (context) { | ||
return context ? typeof children === 'function' ? children(context) : children : _react2.default.createElement( | ||
_Context2.default.Provider, | ||
{ value: _this3.mergeContext(state.context, state.voices) }, | ||
typeof children === 'function' ? _react2.default.createElement( | ||
_Context2.default.Consumer, | ||
null, | ||
function (context) { | ||
return children(context); | ||
} | ||
) : children | ||
); | ||
} | ||
); | ||
} | ||
}]); | ||
return Composer; | ||
@@ -222,15 +328,5 @@ }(_react2.default.Component); | ||
Composer.propTypes = { | ||
lang: _propTypes2.default.string, | ||
onBoundary: _propTypes2.default.func, | ||
onEnd: _propTypes2.default.func, | ||
onError: _propTypes2.default.func, | ||
onStart: _propTypes2.default.func, | ||
pitch: _propTypes2.default.number, | ||
rate: _propTypes2.default.number, | ||
text: _propTypes2.default.string, | ||
voice: _propTypes2.default.oneOfType([_propTypes2.default.any, _propTypes2.default.func]), | ||
volume: _propTypes2.default.number, | ||
speechSynthesis: _propTypes2.default.any, | ||
speechSynthesisUtterance: _propTypes2.default.any | ||
}; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Db21wb3Nlci5qcyJdLCJuYW1lcyI6WyJjcmVhdGVDb250ZXh0Iiwic3BlZWNoU3ludGhlc2lzIiwic3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlIiwiY2FuY2VsIiwic3BlYWsiLCJsYW5nIiwib25Cb3VuZGFyeSIsIm9uRW5kIiwib25FcnJvciIsIm9uU3RhcnQiLCJwaXRjaCIsInJhdGUiLCJ0ZXh0Iiwidm9pY2UiLCJ2b2x1bWUiLCJ1dHRlcmFuY2UiLCJ0YXJnZXRWb2ljZSIsImNhbGwiLCJnZXRWb2ljZXMiLCJ2b2ljZVVSSSIsImZpbmQiLCJzbGljZSIsInYiLCJvbmJvdW5kYXJ5Iiwib25lbmQiLCJvbmVycm9yIiwib25zdGFydCIsIm1hcCIsImRlZiIsImxvY2FsU2VydmljZSIsIm5hbWUiLCJDb21wb3NlciIsInByb3BzIiwiaGFuZGxlVm9pY2VzQ2hhbmdlZCIsImJpbmQiLCJvbnZvaWNlc2NoYW5nZWQiLCJtZXJnZUNvbnRleHQiLCJjb250ZXh0Iiwidm9pY2VzIiwic3RhdGUiLCJuZXh0UHJvcHMiLCJjaGFuZ2VkIiwic29tZSIsInNldFN0YXRlIiwidGFyZ2V0IiwiY2hpbGRyZW4iLCJSZWFjdCIsIkNvbXBvbmVudCIsImRlZmF1bHRQcm9wcyIsIndpbmRvdyIsIndlYmtpdFNwZWVjaFN5bnRoZXNpcyIsIlNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSIsIndlYmtpdFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImZ1bmMiLCJudW1iZXIiLCJvbmVPZlR5cGUiLCJhbnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7Ozs7Ozs7Ozs7O0FBRUEsU0FBU0EsYUFBVCxPQUdHO0FBQUEsTUFGREMsZUFFQyxRQUZEQSxlQUVDO0FBQUEsTUFEREMsd0JBQ0MsUUFEREEsd0JBQ0M7O0FBQ0QsU0FBTztBQUNMQyxZQUFRO0FBQUEs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LFVBQVF3QyxvQkFBVUcsTUFWQztBQVduQnhELG1CQUFpQnFELG9CQUFVSyxHQVhSO0FBWW5CekQsNEJBQTBCb0Qsb0JBQVVLO0FBWmpCLENBQXJCIiwiZmlsZSI6IkNvbXBvc2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1lbW9pemUgZnJvbSAnbWVtb2l6ZS1vbmUnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCBDb250ZXh0IGZyb20gJy4vQ29udGV4dCc7XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoe1xuICBzcGVlY2hTeW50aGVzaXMsXG4gIHNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZVxufSkge1xuICByZXR1cm4ge1xuICAgIGNhbmNlbDogKCkgPT4gc3BlZWNoU3ludGhlc2lzLmNhbmNlbCgpLFxuICAgIHNwZWFrOiAoe1xuICAgICAgbGFuZyxcbiAgICAgIG9uQm91bmRhcnksXG4gICAgICBvbkVuZCxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBvblN0YXJ0LFxuICAgICAgcGl0Y2ggPSAxLFxuICAgICAgcmF0ZSA9IDEsXG4gICAgICB0ZXh0LFxuICAgICAgdm9pY2UsXG4gICAgICB2b2x1bWUgPSAxXG4gICAgfSkgPT4ge1xuICAgICAgY29uc3QgdXR0ZXJhbmNlID0gbmV3IHNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSh0ZXh0KTtcbiAgICAgIGxldCB0YXJnZXRWb2ljZTtcblxuICAgICAgaWYgKHR5cGVvZiB2b2ljZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0YXJnZXRWb2ljZSA9IHZvaWNlLmNhbGwoc3BlZWNoU3ludGhlc2lzLCBzcGVlY2hTeW50aGVzaXMuZ2V0Vm9pY2VzKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgeyB2b2ljZVVSSSB9ID0gdm9pY2UgfHwge307XG5cbiAgICAgICAgdGFyZ2V0Vm9pY2UgPSB2b2ljZVVSSSAmJiBbXS5maW5kLmNhbGwoW10uc2xpY2UuY2FsbChzcGVlY2hTeW50aGVzaXMuZ2V0Vm9pY2VzKCkpLCB2ID0+IHYudm9pY2VVUkkgPT09IHZvaWNlVVJJKTtcbiAgICAgIH1cblxuICAgICAgLy8gRWRnZSB3aWxsIG11dGUgaWYgXCJsYW5nXCIgaXMgc2V0IHRvIFwiXCJcbiAgICAgIHV0dGVyYW5jZS5sYW5nID0gbGFuZyB8fCAnJztcblxuICAgICAgaWYgKHV0dGVyYW5jZS5waXRjaCB8fCB1dHRlcmFuY2UucGl0Y2ggPT09IDApIHtcbiAgICAgICAgdXR0ZXJhbmNlLnBpdGNoID0gcGl0Y2g7XG4gICAgICB9XG5cbiAgICAgIGlmICh1dHRlcmFuY2UucmF0ZSB8fCB1dHRlcmFuY2UucmF0ZSA9PT0gMCkge1xuICAgICAgICB1dHRlcmFuY2UucmF0ZSA9IHJhdGU7XG4gICAgICB9XG5cbiAgICAgIC8vIENvZ25pdGl2ZSBTZXJ2aWNlcyB3aWxsIGVycm9yIHdoZW4gXCJ2b2ljZVwiIGlzIHNldCB0byBcIm51bGxcIlxuICAgICAgLy8gRWRnZSB3aWxsIGVycm9yIHdoZW4gXCJ2b2ljZVwiIGlzIHNldCB0byBcInVuZGVmaW5lZFwiXG4gICAgICBpZiAodGFyZ2V0Vm9pY2UpIHtcbiAgICAgICAgdXR0ZXJhbmNlLnZvaWNlID0gdGFyZ2V0Vm9pY2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh1dHRlcmFuY2Uudm9sdW1lIHx8IHV0dGVyYW5jZS52b2x1bWUgPT09IDApIHtcbiAgICAgICAgdXR0ZXJhbmNlLnZvbHVtZSA9IHZvbHVtZTtcbiAgICAgIH1cblxuICAgICAgdXR0ZXJhbmNlLm9uYm91bmRhcnkgPSBvbkJvdW5kYXJ5O1xuICAgICAgdXR0ZXJhbmNlLm9uZW5kID0gb25FbmQ7XG4gICAgICB1dHRlcmFuY2Uub25lcnJvciA9IG9uRXJyb3I7XG4gICAgICB1dHRlcmFuY2Uub25zdGFydCA9IG9uU3RhcnQ7XG5cbiAgICAgIHNwZWVjaFN5bnRoZXNpcy5zcGVhayh1dHRlcmFuY2UpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Vm9pY2VzKHNwZWVjaFN5bnRoZXNpcykge1xuICByZXR1cm4gc3BlZWNoU3ludGhlc2lzLmdldFZvaWNlcygpLm1hcCgoe1xuICAgICdkZWZhdWx0JzogZGVmLFxuICAgIGxhbmcsXG4gICAgbG9jYWxTZXJ2aWNlLFxuICAgIG5hbWUsXG4gICAgdm9pY2VVUklcbiAgfSkgPT4gKHtcbiAgICAnZGVmYXVsdCc6IGRlZixcbiAgICBsYW5nLFxuICAgIGxvY2FsU2VydmljZSxcbiAgICBuYW1lLFxuICAgIHZvaWNlVVJJXG4gIH0pKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29tcG9zZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuaGFuZGxlVm9pY2VzQ2hhbmdlZCA9IHRoaXMuaGFuZGxlVm9pY2VzQ2hhbmdlZC5iaW5kKHRoaXMpO1xuXG4gICAgcHJvcHMuc3BlZWNoU3ludGhlc2lzLm9udm9pY2VzY2hhbmdlZCA9IHRoaXMuaGFuZGxlVm9pY2VzQ2hhbmdlZDtcblxuICAgIHRoaXMubWVyZ2VDb250ZXh0ID0gbWVtb2l6ZSgoY29udGV4dCwgdm9pY2VzKSA9PiAoeyAuLi5jb250ZXh0LCB2b2ljZXMgfSkpO1xuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGNvbnRleHQ6IGNyZWF0ZUNvbnRleHQocHJvcHMpLFxuICAgICAgdm9pY2VzOiBnZXRWb2ljZXMocHJvcHMuc3BlZWNoU3ludGhlc2lzKVxuICAgIH07XG4gIH1cblxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIGNvbnN0IHsgcHJvcHMgfSA9IHRoaXM7XG4gICAgY29uc3QgY2hhbmdlZCA9IFtcbiAgICAgICdzcGVlY2hTeW50aGVzaXMnLFxuICAgICAgJ3NwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSdcbiAgICBdLnNvbWUobmFtZSA9PiBuZXh0UHJvcHNbbmFtZV0gIT09IHByb3BzW25hbWVdKTtcblxuICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICB0aGlzLnByb3BzLnNwZWVjaFN5bnRoZXNpcy5vbnZvaWNlc2NoYW5nZWQgPSBudWxsO1xuICAgICAgdGhpcy5zdGF0ZS5jb250ZXh0LmNhbmNlbCgpO1xuXG4gICAgICBuZXh0UHJvcHMuc3BlZWNoU3ludGhlc2lzLm9udm9pY2VzY2hhbmdlZCA9IHRoaXMuaGFuZGxlVm9pY2VzQ2hhbmdlZDtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSgoeyBjb250ZXh0IH0pID0+IHtcbiAgICAgICAgY29udGV4dC5jYW5jZWwoKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRleHQ6IGNyZWF0ZUNvbnRleHQobmV4dFByb3BzKSxcbiAgICAgICAgICB2b2ljZXM6IGdldFZvaWNlcyhuZXh0UHJvcHMuc3BlZWNoU3ludGhlc2lzKVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlVm9pY2VzQ2hhbmdlZCh7IHRhcmdldCB9KSB7XG4gICAgY29uc3Qgdm9pY2VzID0gZ2V0Vm9pY2VzKHRhcmdldCk7XG5cbiAgICB0aGlzLnNldFN0YXRlKCgpID0+ICh7IHZvaWNlcyB9KSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBwcm9wcywgc3RhdGUgfSA9IHRoaXM7XG4gICAgY29uc3QgeyBjaGlsZHJlbiB9ID0gcHJvcHM7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPENvbnRleHQuUHJvdmlkZXIgdmFsdWU9eyB0aGlzLm1lcmdlQ29udGV4dChzdGF0ZS5jb250ZXh0LCBzdGF0ZS52b2ljZXMpIH0+XG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgP1xuICAgICAgICAgICAgPENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgICAgIHsgY29udGV4dCA9PiBjaGlsZHJlbihjb250ZXh0KSB9XG4gICAgICAgICAgICA8L0NvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgOlxuICAgICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgfVxuICAgICAgPC9Db250ZXh0LlByb3ZpZGVyPlxuICAgICk7XG4gIH1cbn1cblxuQ29tcG9zZXIuZGVmYXVsdFByb3BzID0ge1xuICBzcGVlY2hTeW50aGVzaXM6IHdpbmRvdy5zcGVlY2hTeW50aGVzaXMgfHwgd2luZG93LndlYmtpdFNwZWVjaFN5bnRoZXNpcyxcbiAgc3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlOiB3aW5kb3cuU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlIHx8IHdpbmRvdy53ZWJraXRTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2Vcbn07XG5cbkNvbXBvc2VyLnByb3BUeXBlcyA9IHtcbiAgbGFuZzogUHJvcFR5cGVzLnN0cmluZyxcbiAgb25Cb3VuZGFyeTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRW5kOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25FcnJvcjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uU3RhcnQ6IFByb3BUeXBlcy5mdW5jLFxuICBwaXRjaDogUHJvcFR5cGVzLm51bWJlcixcbiAgcmF0ZTogUHJvcFR5cGVzLm51bWJlcixcbiAgdGV4dDogUHJvcFR5cGVzLnN0cmluZyxcbiAgdm9pY2U6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hbnksIFByb3BUeXBlcy5mdW5jXSksXG4gIHZvbHVtZTogUHJvcFR5cGVzLm51bWJlcixcbiAgc3BlZWNoU3ludGhlc2lzOiBQcm9wVHlwZXMuYW55LFxuICBzcGVlY2hTeW50aGVzaXNVdHRlcmFuY2U6IFByb3BUeXBlcy5hbnlcbn07XG4iXX0= | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Db21wb3Nlci5qcyJdLCJuYW1lcyI6WyJTcGVlY2hDb250ZXh0IiwicG9ueWZpbGwiLCJxdWV1ZVdpdGhDdXJyZW50IiwiY2FuY2VsIiwiYmluZCIsImNhbmNlbEFsbCIsInNwZWFrIiwic2V0UG9ueWZpbGwiLCJzcGVlY2hTeW50aGVzaXMiLCJTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UiLCJpZCIsImluZGV4IiwiZmluZEluZGV4IiwidXR0ZXJhbmNlIiwidXR0ZXJhbmNlTGlrZSIsImZpbmQiLCJVdHRlcmFuY2UiLCJsZW5ndGgiLCJfbmV4dCIsImRlZmVycmVkIiwicHJvbWlzZSIsInRoZW4iLCJmaWx0ZXIiLCJDb21wb3NlciIsInByb3BzIiwiaGFuZGxlVm9pY2VzQ2hhbmdlZCIsInZvaWNlcyIsImFkZEV2ZW50TGlzdGVuZXIiLCJnZXRWb2ljZXMiLCJtZXJnZUNvbnRleHQiLCJzdGF0ZSIsImNvbnRleHQiLCJzcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UiLCJuZXh0UHJvcHMiLCJjaGFuZ2VkIiwic29tZSIsIm5hbWUiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwibmV4dFZvaWNlcyIsInNldFN0YXRlIiwidGFyZ2V0IiwiY2hpbGRyZW4iLCJSZWFjdCIsIkNvbXBvbmVudCIsImRlZmF1bHRQcm9wcyIsIndpbmRvdyIsIndlYmtpdFNwZWVjaFN5bnRoZXNpcyIsIndlYmtpdFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsImFueSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7Ozs7SUFFTUEsYTtBQUNKLHlCQUFZQyxRQUFaLEVBQXNCO0FBQUE7O0FBQ3BCLFNBQUtDLGdCQUFMLEdBQXdCLEVBQXhCOztBQUVBLFNBQUtDLE1BQUwsR0FBYyxLQUFLQSxNQUFMLENBQVlDLElBQVos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LFM7O2tCQUF2QnBCLFE7OztBQTJGckJBLFNBQVNxQixZQUFULEdBQXdCO0FBQ3RCcEMsbUJBQWlCcUMsT0FBT3JDLGVBQVAsSUFBMEJxQyxPQUFPQyxxQkFENUI7QUFFdEJkLDRCQUEwQmEsT0FBT3BDLHdCQUFQLElBQW1Db0MsT0FBT0U7QUFGOUMsQ0FBeEI7O0FBS0F4QixTQUFTeUIsU0FBVCxHQUFxQjtBQUNuQnhDLG1CQUFpQnlDLG9CQUFVQyxHQURSO0FBRW5CbEIsNEJBQTBCaUIsb0JBQVVDO0FBRmpCLENBQXJCIiwiZmlsZSI6IkNvbXBvc2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1lbW9pemUgZnJvbSAnbWVtb2l6ZS1vbmUnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCBDb250ZXh0IGZyb20gJy4vQ29udGV4dCc7XG5pbXBvcnQgVXR0ZXJhbmNlIGZyb20gJy4vVXR0ZXJhbmNlJztcblxuY2xhc3MgU3BlZWNoQ29udGV4dCB7XG4gIGNvbnN0cnVjdG9yKHBvbnlmaWxsKSB7XG4gICAgdGhpcy5xdWV1ZVdpdGhDdXJyZW50ID0gW107XG5cbiAgICB0aGlzLmNhbmNlbCA9IHRoaXMuY2FuY2VsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5jYW5jZWxBbGwgPSB0aGlzLmNhbmNlbEFsbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc3BlYWsgPSB0aGlzLnNwZWFrLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLnNldFBvbnlmaWxsKHBvbnlmaWxsKTtcbiAgfVxuXG4gIHNldFBvbnlmaWxsKHsgc3BlZWNoU3ludGhlc2lzLCBTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UgfSkge1xuICAgIHRoaXMucG9ueWZpbGwgPSB7IHNwZWVjaFN5bnRoZXNpcywgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlIH07XG4gIH1cblxuICBhc3luYyBjYW5jZWwoaWQpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucXVldWVXaXRoQ3VycmVudC5maW5kSW5kZXgodXR0ZXJhbmNlID0+IHV0dGVyYW5jZS5pZCA9PT0gaWQpO1xuXG4gICAgaWYgKH5pbmRleCkge1xuICAgICAgcmV0dXJuIHRoaXMucXVldWVXaXRoQ3VycmVudFtpbmRleF0uY2FuY2VsKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2FuY2VsQWxsKCkge1xuICAgIC8vIGNvbnNvbGUuZGVidWcoYENBTkNFTExJTkcgUVVFVUVEIElURU1TOiAkeyB0aGlzLnF1ZXVlV2l0aEN1cnJlbnQubGVuZ3RoIH1gKTtcblxuICAgIC8vIHRoaXMucXVldWVXaXRoQ3VycmVudC5mb3JFYWNoKGVudHJ5ID0+IGVudHJ5LmNhbmNlbGxlZCA9IHRydWUpO1xuXG4gICAgLy8gY29uc3QgY2FuY2VsQWxsID0gUHJvbWlzZS5hbGwodGhpcy5xdWV1ZVdpdGhDdXJyZW50Lm1hcCgoeyBkZWZlcnJlZDogeyBwcm9taXNlIH0gfSkgPT4gcHJvbWlzZS5jYXRjaChlcnIgPT4gMCkpKTtcblxuICAgIC8vIHRoaXMucG9ueWZpbGwuc3BlZWNoU3ludGhlc2lzLmNhbmNlbCgpO1xuXG4gICAgLy8gdHJ5IHtcbiAgICAvLyAgIGF3YWl0IGNhbmNlbEFsbDtcbiAgICAvLyB9IGNhdGNoIChlcnIpIHt9XG5cbiAgICAvLyBjb25zb2xlLmRlYnVnKGBBTEwgQ0FOQ0VMTEVEIE9SIEZJTklTSEVEYCk7XG4gIH1cblxuICBzcGVhayh1dHRlcmFuY2VMaWtlKSB7XG4gICAgLy8gY29uc29sZS5kZWJ1ZyhgUVVFVUVEOiAkeyB1dHRlcmFuY2VMaWtlLnRleHQgfWApO1xuXG4gICAgaWYgKFxuICAgICAgdXR0ZXJhbmNlTGlrZS5pZFxuICAgICAgJiYgdGhpcy5xdWV1ZVdpdGhDdXJyZW50LmZpbmQoKHsgaWQgfSkgPT4gaWQgPT09IHV0dGVyYW5jZUxpa2UuaWQpXG4gICAgKSB7XG4gICAgICAvLyBEbyBub3QgcXVldWUgZHVwbGljYXRlZCBzcGVhayB3aXRoIHNhbWUgdW5pcXVlIElEXG4gICAgICAvLyBjb25zb2xlLmRlYnVnKCdOT1QgUVVFVUVJTkcgRFVQRScpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdXR0ZXJhbmNlID0gbmV3IFV0dGVyYW5jZSh1dHRlcmFuY2VMaWtlKTtcblxuICAgIHRoaXMucXVldWVXaXRoQ3VycmVudCA9IFsuLi50aGlzLnF1ZXVlV2l0aEN1cnJlbnQsIHV0dGVyYW5jZV07XG5cbiAgICBpZiAodGhpcy5xdWV1ZVdpdGhDdXJyZW50Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgdGhpcy5fbmV4dCgpO1xuICAgIH1cblxuICAgIHJldHVybiB1dHRlcmFuY2UuZGVmZXJyZWQucHJvbWlzZTtcbiAgfVxuXG4gIF9uZXh0KCkge1xuICAgIGNvbnN0IHV0dGVyYW5jZSA9IHRoaXMucXVldWVXaXRoQ3VycmVudFswXTtcblxuICAgIGlmICghdXR0ZXJhbmNlKSB7IHJldHVybjsgfVxuXG4gICAgY29uc3QgeyBpZCB9ID0gdXR0ZXJhbmNlO1xuICAgIGNvbnN0IHByb21pc2UgPSB1dHRlcmFuY2Uuc3BlYWsodGhpcy5wb255ZmlsbCk7XG5cbiAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5xdWV1ZVdpdGhDdXJyZW50ID0gdGhpcy5xdWV1ZVdpdGhDdXJyZW50LmZpbHRlcih1dHRlcmFuY2UgPT4gdXR0ZXJhbmNlLmlkICE9PSBpZCk7XG4gICAgICB0aGlzLl9uZXh0KCk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgLy8gVE9ETzogSWYgdGhlIGVycm9yIGlzIGR1ZSB0byBTYWZhcmkgcmVzdHJpY3Rpb24gb24gdXNlciB0b3VjaFxuICAgICAgLy8gICAgICAgVGhlIG5leHQgbG9vcCBvbiB0aGUgbmV4dCBhdWRpbyB3aWxsIGFsc28gZmFpbCBiZWNhdXNlIGl0IHdhcyBub3QgcXVldWVkIHdpdGggYSB1c2VyIHRvdWNoXG4gICAgICB0aGlzLnF1ZXVlV2l0aEN1cnJlbnQgPSB0aGlzLnF1ZXVlV2l0aEN1cnJlbnQuZmlsdGVyKHV0dGVyYW5jZSA9PiB1dHRlcmFuY2UuaWQgIT09IGlkKTtcbiAgICAgIHRoaXMuX25leHQoKTtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb21wb3NlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuXG4gICAgdGhpcy5oYW5kbGVWb2ljZXNDaGFuZ2VkID0gdGhpcy5oYW5kbGVWb2ljZXNDaGFuZ2VkLmJpbmQodGhpcyk7XG5cbiAgICBsZXQgdm9pY2VzID0gW107XG5cbiAgICBpZiAocHJvcHMuc3BlZWNoU3ludGhlc2lzKSB7XG4gICAgICBwcm9wcy5zcGVlY2hTeW50aGVzaXMuYWRkRXZlbnRMaXN0ZW5lciAmJiBwcm9wcy5zcGVlY2hTeW50aGVzaXMuYWRkRXZlbnRMaXN0ZW5lcigndm9pY2VzY2hhbmdlZCcsIHRoaXMuaGFuZGxlVm9pY2VzQ2hhbmdlZCk7XG4gICAgICB2b2ljZXMgPSBwcm9wcy5zcGVlY2hTeW50aGVzaXMuZ2V0Vm9pY2VzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5tZXJnZUNvbnRleHQgPSBtZW1vaXplKCh7IGNhbmNlbCwgc3BlYWsgfSwgdm9pY2VzKSA9PiAoe1xuICAgICAgY2FuY2VsLFxuICAgICAgc3BlYWssXG4gICAgICB2b2ljZXNcbiAgICB9KSk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgY29udGV4dDogbmV3IFNwZWVjaENvbnRleHQoe1xuICAgICAgICBzcGVlY2hTeW50aGVzaXM6IHByb3BzLnNwZWVjaFN5bnRoZXNpcyxcbiAgICAgICAgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlOiBwcm9wcy5zcGVlY2hTeW50aGVzaXNVdHRlcmFuY2VcbiAgICAgIH0pLFxuICAgICAgdm9pY2VzXG4gICAgfTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgY29uc3QgeyBwcm9wcyB9ID0gdGhpcztcbiAgICBjb25zdCBjaGFuZ2VkID0gW1xuICAgICAgJ3NwZWVjaFN5bnRoZXNpcycsXG4gICAgICAnc3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlJ1xuICAgIF0uc29tZShuYW1lID0+IG5leHRQcm9wc1tuYW1lXSAhPT0gcHJvcHNbbmFtZV0pO1xuXG4gICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgIGlmIChwcm9wcy5zcGVlY2hTeW50aGVzaXMpIHtcbiAgICAgICAgcHJvcHMuc3BlZWNoU3ludGhlc2lzLnJlbW92ZUV2ZW50TGlzdGVuZXIgJiYgcHJvcHMuc3BlZWNoU3ludGhlc2lzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3ZvaWNlc2NoYW5nZWQnLCB0aGlzLmhhbmRsZVZvaWNlc0NoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YXRlLmNvbnRleHQuc2V0UG9ueWZpbGwoe1xuICAgICAgICBzcGVlY2hTeW50aGVzaXM6IG5leHRQcm9wcy5zcGVlY2hTeW50aGVzaXMsXG4gICAgICAgIFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZTogbmV4dFByb3BzLnNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZVxuICAgICAgfSk7XG5cbiAgICAgIGxldCBuZXh0Vm9pY2VzID0gW107XG5cbiAgICAgIGlmIChuZXh0UHJvcHMuc3BlZWNoU3ludGhlc2lzKSB7XG4gICAgICAgIG5leHRQcm9wcy5zcGVlY2hTeW50aGVzaXMuYWRkRXZlbnRMaXN0ZW5lciAmJiBuZXh0UHJvcHMuc3BlZWNoU3ludGhlc2lzLmFkZEV2ZW50TGlzdGVuZXIoJ3ZvaWNlc2NoYW5nZWQnLCB0aGlzLmhhbmRsZVZvaWNlc0NoYW5nZWQpO1xuICAgICAgICBuZXh0Vm9pY2VzID0gbmV4dFByb3BzLnNwZWVjaFN5bnRoZXNpcy5nZXRWb2ljZXMoKSB8fCBbXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSgoKSA9PiAoeyB2b2ljZXM6IG5leHRWb2ljZXMgfSkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGNvbnN0IHsgc3BlZWNoU3ludGhlc2lzIH0gPSB0aGlzLnByb3BzO1xuXG4gICAgc3BlZWNoU3ludGhlc2lzICYmIHNwZWVjaFN5bnRoZXNpcy5yZW1vdmVFdmVudExpc3RlbmVyICYmIHNwZWVjaFN5bnRoZXNpcy5yZW1vdmVFdmVudExpc3RlbmVyKCd2b2ljZXNjaGFuZ2VkJywgdGhpcy5oYW5kbGVWb2ljZXNDaGFuZ2VkKTtcbiAgfVxuXG4gIGhhbmRsZVZvaWNlc0NoYW5nZWQoeyB0YXJnZXQgfSkge1xuICAgIHRoaXMuc2V0U3RhdGUoKCkgPT4gKHsgdm9pY2VzOiB0YXJnZXQuZ2V0Vm9pY2VzKCkgfSkpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgcHJvcHMsIHN0YXRlIH0gPSB0aGlzO1xuICAgIGNvbnN0IHsgY2hpbGRyZW4gfSA9IHByb3BzO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxDb250ZXh0LkNvbnN1bWVyPlxuICAgICAgICB7IGNvbnRleHQgPT4gY29udGV4dCA/XG4gICAgICAgICAgICB0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgPyBjaGlsZHJlbihjb250ZXh0KSA6IGNoaWxkcmVuXG4gICAgICAgICAgOlxuICAgICAgICAgICAgPENvbnRleHQuUHJvdmlkZXIgdmFsdWU9eyB0aGlzLm1lcmdlQ29udGV4dChzdGF0ZS5jb250ZXh0LCBzdGF0ZS52b2ljZXMpIH0+XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicgP1xuICAgICAgICAgICAgICAgICAgPENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgICAgICAgICAgIHsgY29udGV4dCA9PiBjaGlsZHJlbihjb250ZXh0KSB9XG4gICAgICAgICAgICAgICAgICA8L0NvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9Db250ZXh0LlByb3ZpZGVyPlxuICAgICAgICB9XG4gICAgICA8L0NvbnRleHQuQ29uc3VtZXI+XG4gICAgKTtcbiAgfVxufVxuXG5Db21wb3Nlci5kZWZhdWx0UHJvcHMgPSB7XG4gIHNwZWVjaFN5bnRoZXNpczogd2luZG93LnNwZWVjaFN5bnRoZXNpcyB8fCB3aW5kb3cud2Via2l0U3BlZWNoU3ludGhlc2lzLFxuICBzcGVlY2hTeW50aGVzaXNVdHRlcmFuY2U6IHdpbmRvdy5TcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UgfHwgd2luZG93LndlYmtpdFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZVxufTtcblxuQ29tcG9zZXIucHJvcFR5cGVzID0ge1xuICBzcGVlY2hTeW50aGVzaXM6IFByb3BUeXBlcy5hbnksXG4gIHNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZTogUHJvcFR5cGVzLmFueVxufTtcbiJdfQ== |
@@ -13,11 +13,5 @@ 'use strict'; | ||
var Context = _react2.default.createContext({ | ||
cancel: function cancel() {}, | ||
getVoices: function getVoices() { | ||
return []; | ||
}, | ||
speak: function speak() {} | ||
}); | ||
var Context = _react2.default.createContext(); | ||
exports.default = Context; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Db250ZXh0LmpzIl0sIm5hbWVzIjpbIkNvbnRleHQiLCJSZWFjdCIsImNyZWF0ZUNvbnRleHQiLCJjYW5jZWwiLCJnZXRWb2ljZXMiLCJzcGVhayJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7Ozs7OztBQUVBLElBQU1BLFVBQVVDLGdCQUFNQyxhQUFOLENBQW9CO0FBQ2xDQyxVQUFRLGtCQUFNLENBQUUsQ0FEa0I7QUFFbENDLGFBQVc7QUFBQSxXQUFNLEVBQU47QUFBQSxHQUZ1QjtBQUdsQ0MsU0FBTyxpQkFBTSxDQUFFO0FBSG1CLENBQXBCLENBQWhCOztrQkFNZUwsTyIsImZpbGUiOiJDb250ZXh0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuY29uc3QgQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQoe1xuICBjYW5jZWw6ICgpID0+IHt9LFxuICBnZXRWb2ljZXM6ICgpID0+IFtdLFxuICBzcGVhazogKCkgPT4ge31cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBDb250ZXh0XG4iXX0= | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Db250ZXh0LmpzIl0sIm5hbWVzIjpbIkNvbnRleHQiLCJSZWFjdCIsImNyZWF0ZUNvbnRleHQiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7Ozs7QUFFQSxJQUFNQSxVQUFVQyxnQkFBTUMsYUFBTixFQUFoQjs7a0JBRWVGLE8iLCJmaWxlIjoiQ29udGV4dC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmNvbnN0IENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KCk7XG5cbmV4cG9ydCBkZWZhdWx0IENvbnRleHRcbiJdfQ== |
@@ -7,2 +7,34 @@ 'use strict'; | ||
var _extends2 = require('babel-runtime/helpers/extends'); | ||
var _extends3 = _interopRequireDefault(_extends2); | ||
var _regenerator = require('babel-runtime/regenerator'); | ||
var _regenerator2 = _interopRequireDefault(_regenerator); | ||
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); | ||
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); | ||
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); | ||
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); | ||
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); | ||
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); | ||
var _createClass2 = require('babel-runtime/helpers/createClass'); | ||
var _createClass3 = _interopRequireDefault(_createClass2); | ||
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); | ||
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); | ||
var _inherits2 = require('babel-runtime/helpers/inherits'); | ||
var _inherits3 = _interopRequireDefault(_inherits2); | ||
var _propTypes = require('prop-types'); | ||
@@ -16,37 +48,115 @@ | ||
var _Context = require('./Context'); | ||
var _Composer = require('./Composer'); | ||
var _Context2 = _interopRequireDefault(_Context); | ||
var _Composer2 = _interopRequireDefault(_Composer); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
var SayButton = function SayButton(props) { | ||
return _react2.default.createElement( | ||
_Context2.default.Consumer, | ||
null, | ||
function (context) { | ||
var SayButton = function (_React$Component) { | ||
(0, _inherits3.default)(SayButton, _React$Component); | ||
function SayButton(props) { | ||
(0, _classCallCheck3.default)(this, SayButton); | ||
var _this = (0, _possibleConstructorReturn3.default)(this, (SayButton.__proto__ || (0, _getPrototypeOf2.default)(SayButton)).call(this, props)); | ||
_this.handleClick = _this.handleClick.bind(_this); | ||
_this.state = { | ||
busy: false, | ||
id: Date.now() + Math.random() | ||
}; | ||
return _this; | ||
} | ||
(0, _createClass3.default)(SayButton, [{ | ||
key: 'componentWillUnmount', | ||
value: function componentWillUnmount() { | ||
this.props.context.cancel(this.state.id); | ||
} | ||
}, { | ||
key: 'handleClick', | ||
value: function handleClick() { | ||
var _this2 = this; | ||
var props = this.props, | ||
state = this.state; | ||
props.onClick && props.onClick(event); | ||
this.setState(function () { | ||
return { busy: true }; | ||
}, (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() { | ||
return _regenerator2.default.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
_context.next = 2; | ||
return props.context.speak({ | ||
id: state.id, | ||
lang: props.lang, | ||
onBoundary: props.onBoundary, | ||
onEnd: props.onEnd, | ||
onError: props.onError, | ||
onStart: props.onStart, | ||
pitch: props.pitch, | ||
rate: props.rate, | ||
text: props.speak, | ||
voice: props.voice, | ||
volume: props.volume | ||
}); | ||
case 2: | ||
_this2.setState(function () { | ||
return { | ||
busy: false | ||
}; | ||
}); | ||
case 3: | ||
case 'end': | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, _this2); | ||
}))); | ||
} | ||
}, { | ||
key: 'render', | ||
value: function render() { | ||
var _props = this.props, | ||
children = _props.children, | ||
disabled = _props.disabled, | ||
busy = this.state.busy; | ||
return _react2.default.createElement( | ||
'button', | ||
{ onClick: function onClick(event) { | ||
context.speak({ | ||
lang: props.lang, | ||
onBoundary: props.onBoundary, | ||
onEnd: props.onEnd, | ||
onError: props.onError, | ||
onStart: props.onStart, | ||
pitch: props.pitch, | ||
rate: props.rate, | ||
text: props.speak, | ||
voice: props.voice, | ||
volume: props.volume | ||
}); | ||
props.onClick && props.onClick(event); | ||
} }, | ||
props.children | ||
{ | ||
disabled: typeof disabled === 'boolean' ? disabled : busy, | ||
onClick: this.handleClick | ||
}, | ||
children | ||
); | ||
} | ||
}]); | ||
return SayButton; | ||
}(_react2.default.Component); | ||
var SayButtonWithContext = function SayButtonWithContext(props) { | ||
return _react2.default.createElement( | ||
_Composer2.default, | ||
{ | ||
speechSynthesis: props.speechSynthesis, | ||
speechSynthesisUtterance: props.speechSynthesisUtterance | ||
}, | ||
function (context) { | ||
return _react2.default.createElement(SayButton, (0, _extends3.default)({ context: context }, props)); | ||
} | ||
); | ||
}; | ||
SayButton.propTypes = { | ||
SayButtonWithContext.propTypes = { | ||
lang: _propTypes2.default.string, | ||
@@ -64,3 +174,3 @@ onBoundary: _propTypes2.default.func, | ||
exports.default = SayButton; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TYXlCdXR0b24uanMiXSwibmFtZXMiOlsiU2F5QnV0dG9uIiwiY29udGV4dCIsInNwZWFrIiwibGFuZyIsInByb3BzIiwib25Cb3VuZGFyeSIsIm9uRW5kIiwib25FcnJvciIsIm9uU3RhcnQiLCJwaXRjaCIsInJhdGUiLCJ0ZXh0Iiwidm9pY2UiLCJ2b2x1bWUiLCJvbkNsaWNrIiwiZXZlbnQiLCJjaGlsZHJlbiIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImZ1bmMiLCJudW1iZXIiLCJvbmVPZlR5cGUiLCJhbnkiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFFQTs7Ozs7O0FBRUEsSUFBTUEsWUFBWSxTQUFaQSxTQUFZO0FBQUEsU0FDaEI7QUFBQyxxQkFBRCxDQUFTLFFBQVQ7QUFBQTtBQUNJO0FBQUEsYUFDQTtBQUFBO0FBQUEsVUFBUSxTQUFVLHdCQUFTO0FBQ3pCQyxvQkFBUUMsS0FBUixDQUFjO0FBQ1pDLG9CQUFNQyxNQUFNRCxJQURBO0FBRVpFLDBCQUFZRCxNQUFNQyxVQUZOO0FBR1pDLHFCQUFPRixNQUFNRSxLQUhEO0FBSVpDLHVCQUFTSCxNQUFNRyxPQUpIO0FBS1pDLHVCQUFTSixNQUFNSSxPQUxIO0FBTVpDLHFCQUFPTCxNQUFNSyxLQU5EO0FBT1pDLG9CQUFNTixNQUFNTSxJQVBBO0FBUVpDLG9CQUFNUCxNQUFNRixLQVJBO0FBU1pVLHFCQUFPUixNQUFNUSxLQVREO0FBVVpDLHNCQUFRVCxNQUFNUztBQVZGLGFBQWQ7QUFZQVQsa0JBQU1VLE9BQU4sSUFBaUJWLE1BQU1VLE9BQU4sQ0FBY0MsS0FBZCxDQUFqQjtBQUNELFdBZEQ7QUFlSVgsY0FBTVk7QUFmVixPQURBO0FBQUE7QUFESixHQURnQjtBQUFBLENBQWxCOztBQXVCQWhCLFVBQVVpQixTQUFWLEdBQXNCO0FBQ3BCZCxRQUFNZSxvQkFBVUMsTUFESTtBQUVwQmQsY0FBWWEsb0JBQVVFLElBRkY7QUFHcEJkLFNBQU9ZLG9CQUFVRSxJQUhHO0FBSXBCYixXQUFTVyxvQkFBVUUsSUFKQztBQUtwQlosV0FBU1Usb0JBQVVFLElBTEM7QUFNcEJYLFNBQU9TLG9CQUFVRyxNQU5HO0FBT3BCWCxRQUFNUSxvQkFBVUcsTUFQSTtBQVFwQm5CLFNBQU9nQixvQkFBVUMsTUFSRztBQVNwQlAsU0FBT00sb0JBQVVJLFNBQVYsQ0FBb0IsQ0FBQ0osb0JBQVVLLEdBQVgsRUFBZ0JMLG9CQUFVRSxJQUExQixDQUFwQixDQVRhO0FBVXBCUCxVQUFRSyxvQkFBVUc7QUFWRSxDQUF0Qjs7a0JBYWVyQixTIiwiZmlsZSI6IlNheUJ1dHRvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQ29udGV4dCBmcm9tICcuL0NvbnRleHQnO1xuXG5jb25zdCBTYXlCdXR0b24gPSBwcm9wcyA9PlxuICA8Q29udGV4dC5Db25zdW1lcj5cbiAgICB7IGNvbnRleHQgPT5cbiAgICAgIDxidXR0b24gb25DbGljaz17IGV2ZW50ID0+IHtcbiAgICAgICAgY29udGV4dC5zcGVhayh7XG4gICAgICAgICAgbGFuZzogcHJvcHMubGFuZyxcbiAgICAgICAgICBvbkJvdW5kYXJ5OiBwcm9wcy5vbkJvdW5kYXJ5LFxuICAgICAgICAgIG9uRW5kOiBwcm9wcy5vbkVuZCxcbiAgICAgICAgICBvbkVycm9yOiBwcm9wcy5vbkVycm9yLFxuICAgICAgICAgIG9uU3RhcnQ6IHByb3BzLm9uU3RhcnQsXG4gICAgICAgICAgcGl0Y2g6IHByb3BzLnBpdGNoLFxuICAgICAgICAgIHJhdGU6IHByb3BzLnJhdGUsXG4gICAgICAgICAgdGV4dDogcHJvcHMuc3BlYWssXG4gICAgICAgICAgdm9pY2U6IHByb3BzLnZvaWNlLFxuICAgICAgICAgIHZvbHVtZTogcHJvcHMudm9sdW1lXG4gICAgICAgIH0pO1xuICAgICAgICBwcm9wcy5vbkNsaWNrICYmIHByb3BzLm9uQ2xpY2soZXZlbnQpO1xuICAgICAgfSB9PlxuICAgICAgICB7IHByb3BzLmNoaWxkcmVuIH1cbiAgICAgIDwvYnV0dG9uPlxuICAgIH1cbiAgPC9Db250ZXh0LkNvbnN1bWVyPlxuXG5TYXlCdXR0b24ucHJvcFR5cGVzID0ge1xuICBsYW5nOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBvbkJvdW5kYXJ5OiBQcm9wVHlwZXMuZnVuYyxcbiAgb25FbmQ6IFByb3BUeXBlcy5mdW5jLFxuICBvbkVycm9yOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25TdGFydDogUHJvcFR5cGVzLmZ1bmMsXG4gIHBpdGNoOiBQcm9wVHlwZXMubnVtYmVyLFxuICByYXRlOiBQcm9wVHlwZXMubnVtYmVyLFxuICBzcGVhazogUHJvcFR5cGVzLnN0cmluZyxcbiAgdm9pY2U6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hbnksIFByb3BUeXBlcy5mdW5jXSksXG4gIHZvbHVtZTogUHJvcFR5cGVzLm51bWJlclxufTtcblxuZXhwb3J0IGRlZmF1bHQgU2F5QnV0dG9uO1xuIl19 | ||
exports.default = SayButtonWithContext; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TYXlCdXR0b24uanMiXSwibmFtZXMiOlsiU2F5QnV0dG9uIiwicHJvcHMiLCJoYW5kbGVDbGljayIsImJpbmQiLCJzdGF0ZSIsImJ1c3kiLCJpZCIsIkRhdGUiLCJub3ciLCJNYXRoIiwicmFuZG9tIiwiY29udGV4dCIsImNhbmNlbCIsIm9uQ2xpY2siLCJldmVudCIsInNldFN0YXRlIiwic3BlYWsiLCJsYW5nIiwib25Cb3VuZGFyeSIsIm9uRW5kIiwib25FcnJvciIsIm9uU3RhcnQiLCJwaXRjaCIsInJhdGUiLCJ0ZXh0Iiwidm9pY2UiLCJ2b2x1bWUiLCJjaGlsZHJlbiIsImRpc2FibGVkIiwiUmVhY3QiLCJDb21wb25lbnQiLCJTYXlCdXR0b25XaXRoQ29udGV4dCIsInNwZWVjaFN5bnRoZXNpcyIsInNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsImZ1bmMiLCJudW1iZXIiLCJvbmVPZlR5cGUiLCJhbnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUVBOzs7Ozs7SUFFTUEsUzs7O0FBQ0oscUJBQVlDLEtBQVosRUFBbUI7QUFBQTs7QUFBQSw0SUFDWEEsS0FEVzs7QUFHakIsVUFBS0MsV0FBTCxHQUFtQixNQUFLQSxXQUFMLENBQWlCQyxJQUFqQixPQUFuQjs7QUFFQSxVQUFLQyxLQUFMLEdBQWE7QUFDWEMsWUFBTSxLQURLO0FBRVhDLFVBQUlDLEtBQUtDLEdBQUwsS0FBYUMsS0FBS0MsTUFBTDtBQUZOLEtBQWI7QUFMaUI7QUFTbEI7Ozs7MkNBRXNCO0FBQ3JCLFdBQUtULEtBQUwsQ0FBV1UsT0FBWCxDQUFtQkMsTUFBbkIsQ0FBMEIsS0FBS1IsS0FBTCxDQUFXRSxFQUFyQztBQUNEOzs7a0NBRWE7QUFBQTs7QUFBQSxVQUNKTCxLQURJLEdBQ2EsSUFEYixDQUNKQSxLQURJO0FBQUEsVUFDR0csS0FESCxHQUNhLElBRGIsQ0FDR0EsS0FESDs7O0FBR1pILFlBQU1ZLE9BQU4sSUFBaUJaLE1BQU1ZLE9BQU4sQ0FBY0MsS0FBZCxDQUFqQjs7QUFFQSxXQUFLQyxRQUFMLENBQWM7QUFBQSxlQUFPLEVBQUVWLE1BQU0sSUFBUixFQUFQO0FBQUEsT0FBZCwyRUFBc0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsdUJBQzlCSixNQUFNVSxPQUFOLENBQWNLLEtBQWQsQ0FBb0I7QUFDeEJWLHNCQUFJRixNQUFNRSxFQURjO0FBRXhCVyx3QkFBTWhCLE1BQU1nQixJQUZZO0FBR3hCQyw4QkFBWWpCLE1BQU1pQixVQUhNO0FBSXhCQyx5QkFBT2xCLE1BQU1rQixLQUpXO0FBS3hCQywyQkFBU25CLE1BQU1tQixPQUxTO0FBTXhCQywyQkFBU3BCLE1BQU1vQixPQU5TO0FBT3hCQyx5QkFBT3JCLE1BQU1xQixLQVBXO0FBUXhCQyx3QkFBTXRCLE1BQU1zQixJQVJZO0FBU3hCQyx3QkFBTXZCLE1BQU1lLEtBVFk7QUFVeEJTLHlCQUFPeEIsTUFBTXdCLEtBVlc7QUFXeEJDLDBCQUFRekIsTUFBTXlCO0FBWFUsaUJBQXBCLENBRDhCOztBQUFBOztBQWVwQyx1QkFBS1gsUUFBTCxDQUFjO0FBQUEseUJBQU87QUFDbkJWLDBCQUFNO0FBRGEsbUJBQVA7QUFBQSxpQkFBZDs7QUFmb0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsT0FBdEM7QUFtQkQ7Ozs2QkFFUTtBQUFBLG1CQUlILElBSkcsQ0FFTEosS0FGSztBQUFBLFVBRUkwQixRQUZKLFVBRUlBLFFBRko7QUFBQSxVQUVjQyxRQUZkLFVBRWNBLFFBRmQ7QUFBQSxVQUdJdkIsSUFISixHQUlILElBSkcsQ0FHTEQsS0FISyxDQUdJQyxJQUhKOzs7QUFNUCxhQUNFO0FBQUE7QUFBQTtBQUNFLG9CQUFXLE9BQU91QixRQUFQLEtBQW9CLFNBQXBCLEdBQWdDQSxRQUFoQyxHQUEyQ3ZCLElBRHhEO0FBRUUsbUJBQVUsS0FBS0g7QUFGakI7QUFJSXlCO0FBSkosT0FERjtBQVFEOzs7RUF4RHFCRSxnQkFBTUMsUzs7QUEyRDlCLElBQU1DLHVCQUF1QixTQUF2QkEsb0JBQXVCO0FBQUEsU0FDM0I7QUFBQyxzQkFBRDtBQUFBO0FBQ0UsdUJBQWtCOUIsTUFBTStCLGVBRDFCO0FBRUUsZ0NBQTJCL0IsTUFBTWdDO0FBRm5DO0FBSUk7QUFBQSxhQUNBLDhCQUFDLFNBQUQsMkJBQVcsU0FBVXRCLE9BQXJCLElBQW9DVixLQUFwQyxFQURBO0FBQUE7QUFKSixHQUQyQjtBQUFBLENBQTdCOztBQVVBOEIscUJBQXFCRyxTQUFyQixHQUFpQztBQUMvQmpCLFFBQU1rQixvQkFBVUMsTUFEZTtBQUUvQmxCLGNBQVlpQixvQkFBVUUsSUFGUztBQUcvQmxCLFNBQU9nQixvQkFBVUUsSUFIYztBQUkvQmpCLFdBQVNlLG9CQUFVRSxJQUpZO0FBSy9CaEIsV0FBU2Msb0JBQVVFLElBTFk7QUFNL0JmLFNBQU9hLG9CQUFVRyxNQU5jO0FBTy9CZixRQUFNWSxvQkFBVUcsTUFQZTtBQVEvQnRCLFNBQU9tQixvQkFBVUMsTUFSYztBQVMvQlgsU0FBT1Usb0JBQVVJLFNBQVYsQ0FBb0IsQ0FBQ0osb0JBQVVLLEdBQVgsRUFBZ0JMLG9CQUFVRSxJQUExQixDQUFwQixDQVR3QjtBQVUvQlgsVUFBUVMsb0JBQVVHO0FBVmEsQ0FBakM7O2tCQWFlUCxvQiIsImZpbGUiOiJTYXlCdXR0b24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IENvbXBvc2VyIGZyb20gJy4vQ29tcG9zZXInO1xuXG5jbGFzcyBTYXlCdXR0b24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuaGFuZGxlQ2xpY2sgPSB0aGlzLmhhbmRsZUNsaWNrLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgYnVzeTogZmFsc2UsXG4gICAgICBpZDogRGF0ZS5ub3coKSArIE1hdGgucmFuZG9tKClcbiAgICB9O1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5wcm9wcy5jb250ZXh0LmNhbmNlbCh0aGlzLnN0YXRlLmlkKTtcbiAgfVxuXG4gIGhhbmRsZUNsaWNrKCkge1xuICAgIGNvbnN0IHsgcHJvcHMsIHN0YXRlIH0gPSB0aGlzO1xuXG4gICAgcHJvcHMub25DbGljayAmJiBwcm9wcy5vbkNsaWNrKGV2ZW50KTtcblxuICAgIHRoaXMuc2V0U3RhdGUoKCkgPT4gKHsgYnVzeTogdHJ1ZSB9KSwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgcHJvcHMuY29udGV4dC5zcGVhayh7XG4gICAgICAgIGlkOiBzdGF0ZS5pZCxcbiAgICAgICAgbGFuZzogcHJvcHMubGFuZyxcbiAgICAgICAgb25Cb3VuZGFyeTogcHJvcHMub25Cb3VuZGFyeSxcbiAgICAgICAgb25FbmQ6IHByb3BzLm9uRW5kLFxuICAgICAgICBvbkVycm9yOiBwcm9wcy5vbkVycm9yLFxuICAgICAgICBvblN0YXJ0OiBwcm9wcy5vblN0YXJ0LFxuICAgICAgICBwaXRjaDogcHJvcHMucGl0Y2gsXG4gICAgICAgIHJhdGU6IHByb3BzLnJhdGUsXG4gICAgICAgIHRleHQ6IHByb3BzLnNwZWFrLFxuICAgICAgICB2b2ljZTogcHJvcHMudm9pY2UsXG4gICAgICAgIHZvbHVtZTogcHJvcHMudm9sdW1lXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSgoKSA9PiAoe1xuICAgICAgICBidXN5OiBmYWxzZVxuICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHByb3BzOiB7IGNoaWxkcmVuLCBkaXNhYmxlZCB9LFxuICAgICAgc3RhdGU6IHsgYnVzeSB9XG4gICAgfSA9IHRoaXM7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGJ1dHRvblxuICAgICAgICBkaXNhYmxlZD17IHR5cGVvZiBkaXNhYmxlZCA9PT0gJ2Jvb2xlYW4nID8gZGlzYWJsZWQgOiBidXN5IH1cbiAgICAgICAgb25DbGljaz17IHRoaXMuaGFuZGxlQ2xpY2sgfVxuICAgICAgPlxuICAgICAgICB7IGNoaWxkcmVuIH1cbiAgICAgIDwvYnV0dG9uPlxuICAgICk7XG4gIH1cbn1cblxuY29uc3QgU2F5QnV0dG9uV2l0aENvbnRleHQgPSBwcm9wcyA9PlxuICA8Q29tcG9zZXJcbiAgICBzcGVlY2hTeW50aGVzaXM9eyBwcm9wcy5zcGVlY2hTeW50aGVzaXMgfVxuICAgIHNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZT17IHByb3BzLnNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSB9XG4gID5cbiAgICB7IGNvbnRleHQgPT5cbiAgICAgIDxTYXlCdXR0b24gY29udGV4dD17IGNvbnRleHQgfSB7IC4uLnByb3BzIH0gLz5cbiAgICB9XG4gIDwvQ29tcG9zZXI+XG5cblNheUJ1dHRvbldpdGhDb250ZXh0LnByb3BUeXBlcyA9IHtcbiAgbGFuZzogUHJvcFR5cGVzLnN0cmluZyxcbiAgb25Cb3VuZGFyeTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRW5kOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25FcnJvcjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uU3RhcnQ6IFByb3BUeXBlcy5mdW5jLFxuICBwaXRjaDogUHJvcFR5cGVzLm51bWJlcixcbiAgcmF0ZTogUHJvcFR5cGVzLm51bWJlcixcbiAgc3BlYWs6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHZvaWNlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuYW55LCBQcm9wVHlwZXMuZnVuY10pLFxuICB2b2x1bWU6IFByb3BUeXBlcy5udW1iZXJcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFNheUJ1dHRvbldpdGhDb250ZXh0XG4iXX0= |
@@ -7,4 +7,34 @@ 'use strict'; | ||
var _createClass = 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); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
var _extends2 = require('babel-runtime/helpers/extends'); | ||
var _extends3 = _interopRequireDefault(_extends2); | ||
var _regenerator = require('babel-runtime/regenerator'); | ||
var _regenerator2 = _interopRequireDefault(_regenerator); | ||
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); | ||
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); | ||
var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); | ||
var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); | ||
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); | ||
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); | ||
var _createClass2 = require('babel-runtime/helpers/createClass'); | ||
var _createClass3 = _interopRequireDefault(_createClass2); | ||
var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); | ||
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); | ||
var _inherits2 = require('babel-runtime/helpers/inherits'); | ||
var _inherits3 = _interopRequireDefault(_inherits2); | ||
var _propTypes = require('prop-types'); | ||
@@ -24,16 +54,10 @@ | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
var SayPrimitive = function (_React$Component) { | ||
(0, _inherits3.default)(SayPrimitive, _React$Component); | ||
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } | ||
function SayPrimitive(props) { | ||
(0, _classCallCheck3.default)(this, SayPrimitive); | ||
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } | ||
var _this = (0, _possibleConstructorReturn3.default)(this, (SayPrimitive.__proto__ || (0, _getPrototypeOf2.default)(SayPrimitive)).call(this, props)); | ||
var Say = function (_React$Component) { | ||
_inherits(Say, _React$Component); | ||
function Say(props) { | ||
_classCallCheck(this, Say); | ||
var _this = _possibleConstructorReturn(this, (Say.__proto__ || Object.getPrototypeOf(Say)).call(this, props)); | ||
_this.handleBoundary = _this.handleBoundary.bind(_this); | ||
@@ -43,9 +67,16 @@ _this.handleEnd = _this.handleEnd.bind(_this); | ||
_this.handleStart = _this.handleStart.bind(_this); | ||
_this.state = { id: Date.now() + Math.random() }; | ||
return _this; | ||
} | ||
_createClass(Say, [{ | ||
(0, _createClass3.default)(SayPrimitive, [{ | ||
key: 'componentWillUnmount', | ||
value: function componentWillUnmount() { | ||
// TODO: Should dequeue self on unmount | ||
this.unmounted = true; | ||
this.props.context.cancel(this.state.id).catch(function (err) { | ||
return 0; | ||
}); | ||
} | ||
@@ -82,39 +113,60 @@ }, { | ||
var _props = this.props, | ||
lang = _props.lang, | ||
pitch = _props.pitch, | ||
rate = _props.rate, | ||
text = _props.speak, | ||
voice = _props.voice, | ||
volume = _props.volume; | ||
(0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() { | ||
var _props, context, lang, pitch, rate, text, voice, volume, id; | ||
return _regenerator2.default.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
_props = _this2.props, context = _props.context, lang = _props.lang, pitch = _props.pitch, rate = _props.rate, text = _props.speak, voice = _props.voice, volume = _props.volume; | ||
id = _this2.state.id; | ||
return _react2.default.createElement( | ||
_Context2.default.Consumer, | ||
null, | ||
function (context) { | ||
return context.speak({ | ||
lang: lang, | ||
onBoundary: _this2.handleBoundary, | ||
onEnd: _this2.handleEnd, | ||
onError: _this2.handleError, | ||
onStart: _this2.handleStart, | ||
pitch: pitch, | ||
rate: rate, | ||
text: text, | ||
voice: voice, | ||
volume: volume | ||
}); | ||
} | ||
); | ||
context.speak({ | ||
id: id, | ||
lang: lang, | ||
onBoundary: _this2.handleBoundary, | ||
onEnd: _this2.handleEnd, | ||
onError: _this2.handleError, | ||
onStart: _this2.handleStart, | ||
pitch: pitch, | ||
rate: rate, | ||
text: text, | ||
voice: voice, | ||
volume: volume | ||
}); | ||
case 3: | ||
case 'end': | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, _this2); | ||
}))().catch(function (err) { | ||
return console.error(err); | ||
}); | ||
return false; | ||
} | ||
}]); | ||
return Say; | ||
return SayPrimitive; | ||
}(_react2.default.Component); | ||
exports.default = Say; | ||
var SayPrimitiveWithContext = function SayPrimitiveWithContext(props) { | ||
return _react2.default.createElement( | ||
_Context2.default.Consumer, | ||
null, | ||
function (context) { | ||
return _react2.default.createElement( | ||
SayPrimitive, | ||
(0, _extends3.default)({ | ||
context: context | ||
}, props), | ||
props.children | ||
); | ||
} | ||
); | ||
}; | ||
Say.propTypes = { | ||
SayPrimitiveWithContext.propTypes = { | ||
lang: _propTypes2.default.string, | ||
@@ -131,2 +183,4 @@ pitch: _propTypes2.default.number, | ||
}; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TYXlQcmltaXRpdmUuanMiXSwibmFtZXMiOlsiU2F5IiwicHJvcHMiLCJoYW5kbGVCb3VuZGFyeSIsImJpbmQiLCJoYW5kbGVFbmQiLCJoYW5kbGVFcnJvciIsImhhbmRsZVN0YXJ0IiwidW5tb3VudGVkIiwiZXZlbnQiLCJvbkJvdW5kYXJ5Iiwib25FbmQiLCJvbkVycm9yIiwib25TdGFydCIsIm5leHRQcm9wcyIsInNwZWFrIiwibGFuZyIsInBpdGNoIiwicmF0ZSIsInRleHQiLCJ2b2ljZSIsInZvbHVtZSIsImNvbnRleHQiLCJSZWFjdCIsIkNvbXBvbmVudCIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsIm51bWJlciIsImZ1bmMiLCJvbmVPZlR5cGUiLCJhbnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUVBOzs7Ozs7Ozs7Ozs7SUFFcUJBLEc7OztBQUNuQixlQUFZQyxLQUFaLEVBQW1CO0FBQUE7O0FBQUEsMEdBQ1hBLEtBRFc7O0FBR2pCLFVBQUtDLGNBQUwsR0FBc0IsTUFBS0EsY0FBTCxDQUFvQkMsSUFBcEIsT0FBdEI7QUFDQSxVQUFLQyxTQUFMLEdBQWlCLE1BQUtBLFNBQUwsQ0FBZUQsSUFBZixPQUFqQjtBQUNBLFVBQUtFLFdBQUwsR0FBbUIsTUFBS0EsV0FBTCxDQUFpQkYsSUFBakIsT0FBbkI7QUFDQSxVQUFLRyxXQUFMLEdBQW1CLE1BQUtBLFdBQUwsQ0FBaUJILElBQWpCLE9BQW5CO0FBTmlCO0FBT2xCOzs7OzJDQUVzQjtBQUNyQixXQUFLSSxTQUFMLEdBQWlCLElBQWpCO0FBQ0Q7OzttQ0FFY0MsSyxFQUFPO0FBQ3BCLE9BQUMsS0FBS0QsU0FBTixJQUFtQixLQUFLTixLQUFMLENBQVdRLFVBQTlCLElBQTRDLEtBQUtSLEtBQUwsQ0FBV1EsVUFBWCxDQUFzQkQsS0FBdEIsQ0FBNUM7QUFDRDs7OzhCQUVTQSxLLEVBQU87QUFDZixPQUFDLEtBQUtELFNBQU4sSUFBbUIsS0FBS04sS0FBTCxDQUFXUyxLQUE5QixJQUF1QyxLQUFLVCxLQUFMLENBQVdTLEtBQVgsQ0FBaUJGLEtBQWpCLENBQXZDO0FBQ0Q7OztnQ0FFV0EsSyxFQUFPO0FBQ2pCLE9BQUMsS0FBS0QsU0FBTixJQUFtQixLQUFLTixLQUFMLENBQVdVLE9BQTlCLElBQXlDLEtBQUtWLEtBQUwsQ0FBV1UsT0FBWCxDQUFtQkgsS0FBbkIsQ0FBekM7QUFDRDs7O2dDQUVXQSxLLEVBQU87QUFDakIsT0FBQyxLQUFLRCxTQUFOLElBQW1CLEtBQUtOLEtBQUwsQ0FBV1csT0FBOUIsSUFBeUMsS0FBS1gsS0FBTCxDQUFXVyxPQUFYLENBQW1CSixLQUFuQixDQUF6QztBQUNEOzs7MENBRXFCSyxTLEVBQVc7QUFDL0IsYUFBT0EsVUFBVUMsS0FBVixLQUFvQixLQUFLYixLQUFMLENBQVdhLEtBQXRDO0FBQ0Q7Ozs2QkFFUTtBQUFBOztBQUFBLG1CQUNtRCxLQUFLYixLQUR4RDtBQUFBLFVBQ0NjLElBREQsVUFDQ0EsSUFERDtBQUFBLFVBQ09DLEtBRFAsVUFDT0EsS0FEUDtBQUFBLFVBQ2NDLElBRGQsVUFDY0EsSUFEZDtBQUFBLFVBQzJCQyxJQUQzQixVQUNvQkosS0FEcEI7QUFBQSxVQUNpQ0ssS0FEakMsVUFDaUNBLEtBRGpDO0FBQUEsVUFDd0NDLE1BRHhDLFVBQ3dDQSxNQUR4Qzs7O0FBR1AsYUFDRTtBQUFDLHlCQUFELENBQVMsUUFBVDtBQUFBO0FBQ0k7QUFBQSxpQkFBV0MsUUFBUVAsS0FBUixDQUFjO0FBQ3ZCQyxzQkFEdUI7QUFFdkJOLHdCQUFZLE9BQUtQLGNBRk07QUFHdkJRLG1CQUFPLE9BQUtOLFNBSFc7QUFJdkJPLHFCQUFTLE9BQUtOLFdBSlM7QUFLdkJPLHFCQUFTLE9BQUtOLFdBTFM7QUFNdkJVLHdCQU51QjtBQU92QkMsc0JBUHVCO0FBUXZCQyxzQkFSdUI7QUFTdkJDLHdCQVR1QjtBQVV2QkM7QUFWdUIsV0FBZCxDQUFYO0FBQUE7QUFESixPQURGO0FBaUJEOzs7O0VBdEQ4QkUsZ0JBQU1DLFM7O2tCQUFsQnZCLEc7OztBQXlEckJBLElBQUl3QixTQUFKLEdBQWdCO0FBQ2RULFFBQU1VLG9CQUFVQyxNQURGO0FBRWRWLFNBQU9TLG9CQUFVRSxNQUZIO0FBR2RWLFFBQU1RLG9CQUFVRSxNQUhGO0FBSWRsQixjQUFZZ0Isb0JBQVVHLElBSlI7QUFLZGxCLFNBQU9lLG9CQUFVRyxJQUxIO0FBTWRqQixXQUFTYyxvQkFBVUcsSUFOTDtBQU9kaEIsV0FBU2Esb0JBQVVHLElBUEw7QUFRZGQsU0FBT1csb0JBQVVDLE1BUkg7QUFTZFAsU0FBT00sb0JBQVVJLFNBQVYsQ0FBb0IsQ0FBQ0osb0JBQVVLLEdBQVgsRUFBZ0JMLG9CQUFVRyxJQUExQixDQUFwQixDQVRPO0FBVWRSLFVBQVFLLG9CQUFVRTtBQVZKLENBQWhCIiwiZmlsZSI6IlNheVByaW1pdGl2ZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQ29udGV4dCBmcm9tICcuL0NvbnRleHQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTYXkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuaGFuZGxlQm91bmRhcnkgPSB0aGlzLmhhbmRsZUJvdW5kYXJ5LmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVFbmQgPSB0aGlzLmhhbmRsZUVuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlRXJyb3IgPSB0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVTdGFydCA9IHRoaXMuaGFuZGxlU3RhcnQuYmluZCh0aGlzKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMudW5tb3VudGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGhhbmRsZUJvdW5kYXJ5KGV2ZW50KSB7XG4gICAgIXRoaXMudW5tb3VudGVkICYmIHRoaXMucHJvcHMub25Cb3VuZGFyeSAmJiB0aGlzLnByb3BzLm9uQm91bmRhcnkoZXZlbnQpO1xuICB9XG5cbiAgaGFuZGxlRW5kKGV2ZW50KSB7XG4gICAgIXRoaXMudW5tb3VudGVkICYmIHRoaXMucHJvcHMub25FbmQgJiYgdGhpcy5wcm9wcy5vbkVuZChldmVudCk7XG4gIH1cblxuICBoYW5kbGVFcnJvcihldmVudCkge1xuICAgICF0aGlzLnVubW91bnRlZCAmJiB0aGlzLnByb3BzLm9uRXJyb3IgJiYgdGhpcy5wcm9wcy5vbkVycm9yKGV2ZW50KTtcbiAgfVxuXG4gIGhhbmRsZVN0YXJ0KGV2ZW50KSB7XG4gICAgIXRoaXMudW5tb3VudGVkICYmIHRoaXMucHJvcHMub25TdGFydCAmJiB0aGlzLnByb3BzLm9uU3RhcnQoZXZlbnQpO1xuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgIHJldHVybiBuZXh0UHJvcHMuc3BlYWsgIT09IHRoaXMucHJvcHMuc3BlYWs7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyBsYW5nLCBwaXRjaCwgcmF0ZSwgc3BlYWs6IHRleHQsIHZvaWNlLCB2b2x1bWUgfSA9IHRoaXMucHJvcHM7XG5cbiAgICByZXR1cm4gKFxuICAgICAgPENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgIHsgY29udGV4dCA9PiBjb250ZXh0LnNwZWFrKHtcbiAgICAgICAgICAgIGxhbmcsXG4gICAgICAgICAgICBvbkJvdW5kYXJ5OiB0aGlzLmhhbmRsZUJvdW5kYXJ5LFxuICAgICAgICAgICAgb25FbmQ6IHRoaXMuaGFuZGxlRW5kLFxuICAgICAgICAgICAgb25FcnJvcjogdGhpcy5oYW5kbGVFcnJvcixcbiAgICAgICAgICAgIG9uU3RhcnQ6IHRoaXMuaGFuZGxlU3RhcnQsXG4gICAgICAgICAgICBwaXRjaCxcbiAgICAgICAgICAgIHJhdGUsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgdm9pY2UsXG4gICAgICAgICAgICB2b2x1bWVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICA8L0NvbnRleHQuQ29uc3VtZXI+XG4gICAgKTtcbiAgfVxufVxuXG5TYXkucHJvcFR5cGVzID0ge1xuICBsYW5nOiBQcm9wVHlwZXMuc3RyaW5nLFxuICBwaXRjaDogUHJvcFR5cGVzLm51bWJlcixcbiAgcmF0ZTogUHJvcFR5cGVzLm51bWJlcixcbiAgb25Cb3VuZGFyeTogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uRW5kOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25FcnJvcjogUHJvcFR5cGVzLmZ1bmMsXG4gIG9uU3RhcnQ6IFByb3BUeXBlcy5mdW5jLFxuICBzcGVhazogUHJvcFR5cGVzLnN0cmluZyxcbiAgdm9pY2U6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5hbnksIFByb3BUeXBlcy5mdW5jXSksXG4gIHZvbHVtZTogUHJvcFR5cGVzLm51bWJlclxufTtcbiJdfQ== | ||
exports.default = SayPrimitiveWithContext; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TYXlQcmltaXRpdmUuanMiXSwibmFtZXMiOlsiU2F5UHJpbWl0aXZlIiwicHJvcHMiLCJoYW5kbGVCb3VuZGFyeSIsImJpbmQiLCJoYW5kbGVFbmQiLCJoYW5kbGVFcnJvciIsImhhbmRsZVN0YXJ0Iiwic3RhdGUiLCJpZCIsIkRhdGUiLCJub3ciLCJNYXRoIiwicmFuZG9tIiwidW5tb3VudGVkIiwiY29udGV4dCIsImNhbmNlbCIsImNhdGNoIiwiZXZlbnQiLCJvbkJvdW5kYXJ5Iiwib25FbmQiLCJvbkVycm9yIiwib25TdGFydCIsIm5leHRQcm9wcyIsInNwZWFrIiwibGFuZyIsInBpdGNoIiwicmF0ZSIsInRleHQiLCJ2b2ljZSIsInZvbHVtZSIsImNvbnNvbGUiLCJlcnJvciIsImVyciIsIlJlYWN0IiwiQ29tcG9uZW50IiwiU2F5UHJpbWl0aXZlV2l0aENvbnRleHQiLCJjaGlsZHJlbiIsInByb3BUeXBlcyIsIlByb3BUeXBlcyIsInN0cmluZyIsIm51bWJlciIsImZ1bmMiLCJvbmVPZlR5cGUiLCJhbnkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUVBOzs7Ozs7SUFFTUEsWTs7O0FBQ0osd0JBQVlDLEtBQVosRUFBbUI7QUFBQTs7QUFBQSxrSkFDWEEsS0FEVzs7QUFHakIsVUFBS0MsY0FBTCxHQUFzQixNQUFLQSxjQUFMLENBQW9CQyxJQUFwQixPQUF0QjtBQUNBLFVBQUtDLFNBQUwsR0FBaUIsTUFBS0EsU0FBTCxDQUFlRCxJQUFmLE9BQWpCO0FBQ0EsVUFBS0UsV0FBTCxHQUFtQixNQUFLQSxXQUFMLENBQWlCRixJQUFqQixPQUFuQjtBQUNBLFVBQUtHLFdBQUwsR0FBbUIsTUFBS0EsV0FBTCxDQUFpQkgsSUFBakIsT0FBbkI7O0FBRUEsVUFBS0ksS0FBTCxHQUFhLEVBQUVDLElBQUlDLEtBQUtDLEdBQUwsS0FBYUMsS0FBS0MsTUFBTCxFQUFuQixF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bENsQixTQUFPZSxvQkFBVUMsTUFSaUI7QUFTbENYLFNBQU9VLG9CQUFVSSxTQUFWLENBQW9CLENBQUNKLG9CQUFVSyxHQUFYLEVBQWdCTCxvQkFBVUcsSUFBMUIsQ0FBcEIsQ0FUMkI7QUFVbENaLFVBQVFTLG9CQUFVRTtBQVZnQixDQUFwQzs7a0JBYWVMLHVCIiwiZmlsZSI6IlNheVByaW1pdGl2ZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQ29udGV4dCBmcm9tICcuL0NvbnRleHQnO1xuXG5jbGFzcyBTYXlQcmltaXRpdmUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcblxuICAgIHRoaXMuaGFuZGxlQm91bmRhcnkgPSB0aGlzLmhhbmRsZUJvdW5kYXJ5LmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVFbmQgPSB0aGlzLmhhbmRsZUVuZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaGFuZGxlRXJyb3IgPSB0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcyk7XG4gICAgdGhpcy5oYW5kbGVTdGFydCA9IHRoaXMuaGFuZGxlU3RhcnQuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuc3RhdGUgPSB7IGlkOiBEYXRlLm5vdygpICsgTWF0aC5yYW5kb20oKSB9O1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgLy8gVE9ETzogU2hvdWxkIGRlcXVldWUgc2VsZiBvbiB1bm1vdW50XG4gICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlO1xuXG4gICAgdGhpcy5wcm9wcy5jb250ZXh0LmNhbmNlbCh0aGlzLnN0YXRlLmlkKS5jYXRjaChlcnIgPT4gMCk7XG4gIH1cblxuICBoYW5kbGVCb3VuZGFyeShldmVudCkge1xuICAgICF0aGlzLnVubW91bnRlZCAmJiB0aGlzLnByb3BzLm9uQm91bmRhcnkgJiYgdGhpcy5wcm9wcy5vbkJvdW5kYXJ5KGV2ZW50KTtcbiAgfVxuXG4gIGhhbmRsZUVuZChldmVudCkge1xuICAgICF0aGlzLnVubW91bnRlZCAmJiB0aGlzLnByb3BzLm9uRW5kICYmIHRoaXMucHJvcHMub25FbmQoZXZlbnQpO1xuICB9XG5cbiAgaGFuZGxlRXJyb3IoZXZlbnQpIHtcbiAgICAhdGhpcy51bm1vdW50ZWQgJiYgdGhpcy5wcm9wcy5vbkVycm9yICYmIHRoaXMucHJvcHMub25FcnJvcihldmVudCk7XG4gIH1cblxuICBoYW5kbGVTdGFydChldmVudCkge1xuICAgICF0aGlzLnVubW91bnRlZCAmJiB0aGlzLnByb3BzLm9uU3RhcnQgJiYgdGhpcy5wcm9wcy5vblN0YXJ0KGV2ZW50KTtcbiAgfVxuXG4gIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMpIHtcbiAgICByZXR1cm4gbmV4dFByb3BzLnNwZWFrICE9PSB0aGlzLnByb3BzLnNwZWFrO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7IGNvbnRleHQsIGxhbmcsIHBpdGNoLCByYXRlLCBzcGVhazogdGV4dCwgdm9pY2UsIHZvbHVtZSB9ID0gdGhpcy5wcm9wcztcbiAgICAgIGNvbnN0IHsgaWQgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgIGNvbnRleHQuc3BlYWsoe1xuICAgICAgICBpZCxcbiAgICAgICAgbGFuZyxcbiAgICAgICAgb25Cb3VuZGFyeTogdGhpcy5oYW5kbGVCb3VuZGFyeSxcbiAgICAgICAgb25FbmQ6IHRoaXMuaGFuZGxlRW5kLFxuICAgICAgICBvbkVycm9yOiB0aGlzLmhhbmRsZUVycm9yLFxuICAgICAgICBvblN0YXJ0OiB0aGlzLmhhbmRsZVN0YXJ0LFxuICAgICAgICBwaXRjaCxcbiAgICAgICAgcmF0ZSxcbiAgICAgICAgdGV4dCxcbiAgICAgICAgdm9pY2UsXG4gICAgICAgIHZvbHVtZVxuICAgICAgfSk7XG4gICAgfSkoKS5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5jb25zdCBTYXlQcmltaXRpdmVXaXRoQ29udGV4dCA9IHByb3BzID0+XG4gIDxDb250ZXh0LkNvbnN1bWVyPlxuICAgIHsgY29udGV4dCA9PlxuICAgICAgPFNheVByaW1pdGl2ZVxuICAgICAgICBjb250ZXh0PXsgY29udGV4dCB9XG4gICAgICAgIHsgLi4ucHJvcHMgfVxuICAgICAgPlxuICAgICAgICB7IHByb3BzLmNoaWxkcmVuIH1cbiAgICAgIDwvU2F5UHJpbWl0aXZlPlxuICAgIH1cbiAgPC9Db250ZXh0LkNvbnN1bWVyPlxuXG5TYXlQcmltaXRpdmVXaXRoQ29udGV4dC5wcm9wVHlwZXMgPSB7XG4gIGxhbmc6IFByb3BUeXBlcy5zdHJpbmcsXG4gIHBpdGNoOiBQcm9wVHlwZXMubnVtYmVyLFxuICByYXRlOiBQcm9wVHlwZXMubnVtYmVyLFxuICBvbkJvdW5kYXJ5OiBQcm9wVHlwZXMuZnVuYyxcbiAgb25FbmQ6IFByb3BUeXBlcy5mdW5jLFxuICBvbkVycm9yOiBQcm9wVHlwZXMuZnVuYyxcbiAgb25TdGFydDogUHJvcFR5cGVzLmZ1bmMsXG4gIHNwZWFrOiBQcm9wVHlwZXMuc3RyaW5nLFxuICB2b2ljZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLmFueSwgUHJvcFR5cGVzLmZ1bmNdKSxcbiAgdm9sdW1lOiBQcm9wVHlwZXMubnVtYmVyXG59O1xuXG5leHBvcnQgZGVmYXVsdCBTYXlQcmltaXRpdmVXaXRoQ29udGV4dFxuIl19 |
{ | ||
"name": "react-say", | ||
"version": "1.0.1-master.efdec9e", | ||
"version": "1.1.0", | ||
"description": "A React component that synthesis text into speech using Web Speech API", | ||
@@ -21,5 +21,6 @@ "keywords": [ | ||
"scripts": { | ||
"bootstrap": "lerna bootstrap --hoist", | ||
"build": "lerna run build", | ||
"test": "lerna run test" | ||
"bootstrap": "lerna bootstrap", | ||
"build": "lerna run --stream build", | ||
"test": "lerna run --stream test", | ||
"watch": "lerna run --parallel --stream watch" | ||
}, | ||
@@ -36,22 +37,14 @@ "author": "William Wong <compulim@hotmail.com> (http://compulim.info/)", | ||
"homepage": "https://github.com/compulim/react-say#readme", | ||
"devDependencies": { | ||
"babel-cli": "^6.26.0", | ||
"babel-core": "^6.26.3", | ||
"babel-env": "^2.4.1", | ||
"babel-plugin-transform-object-rest-spread": "^6.26.0", | ||
"babel-preset-stage-3": "^6.24.1", | ||
"jest": "^22.4.4", | ||
"lerna": "^2.11.0", | ||
"react": "^16.4.1", | ||
"react-dom": "^16.4.1", | ||
"react-scripts": "1.1.4", | ||
"rimraf": "^2.6.2" | ||
}, | ||
"dependencies": { | ||
"classnames": "^2.2.6", | ||
"glamor": "^2.20.40" | ||
"event-as-promise": "^1.0.3", | ||
"glamor": "^2.20.40", | ||
"memoize-one": "^4.0.0" | ||
}, | ||
"peerDependencies": { | ||
"react": "^16.4.1" | ||
}, | ||
"devDependencies": { | ||
"lerna": "^2.11.0" | ||
} | ||
} |
@@ -102,10 +102,15 @@ # react-say | ||
* If `<Say>` or `<SayButton>` is unmounted, the utterance will continue to speak | ||
* Web Speech does not support stopping or dequeueing a pending utterance, only to cancel all utterances at once | ||
* Since the utterance is already queued, speaking, or spoken, we cannot stop it and not cancelling other "innocent" utterance | ||
* We decided to let it continue but not firing any events after unmount | ||
* Instead of using the native queue for utterances, we implement our own speech queue for browser compatibility reasons | ||
* Queue is managed by `<Composer>`, all `<Say>` and `<SayButton>` inside the same `<Composer>` will share the same queue | ||
* Native queue does not support partial cancel, when `cancel` is called, all pending utterances are stopped | ||
* If `<Say>` or `<SayButton>` is unmounted, the utterance can be stopped without affecting other pending utterances | ||
* Utterance order can be changed on-the-fly | ||
* Browser quirks | ||
* Chrome: if `cancel` and `speak` are called repeatedly, `speak` will appear to succeed (`speaking === true`) but audio is never played (`start` event is never fired) | ||
* Safari: when speech is not triggered by user event (e.g. mouse click or tap), the speech will not be played | ||
* Workaround: on page load, prime the speech engine by any user events | ||
# Roadmap | ||
* [ ] Prettify playground page | ||
* [x] Prettify playground page | ||
@@ -112,0 +117,0 @@ # Contributions |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
97596
1
17
994
0
123
5
1
+ Addedevent-as-promise@^1.0.3
+ Addedmemoize-one@^4.0.0
+ Addedevent-as-promise@1.1.0(transitive)
+ Addedmemoize-one@4.1.0(transitive)