UNPKG

cozy-intent

Version:

Event-based library allowing interactions between React-Native and React applications

251 lines (208 loc) 10.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.NativeService = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _postMe = require("post-me"); var _api = require("../../api"); var _utils = require("../../utils"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } var log = (0, _postMe.debug)('NativeService'); var NativeService = /*#__PURE__*/function () { function NativeService(_localMethods) { var _this = this; var messengerService = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _api.NativeMessenger; (0, _classCallCheck2.default)(this, NativeService); (0, _defineProperty2.default)(this, "messengerService", void 0); (0, _defineProperty2.default)(this, "localMethods", void 0); (0, _defineProperty2.default)(this, "messengerRegister", {}); (0, _defineProperty2.default)(this, "updateLocalMethods", function (localMethods) { _this.localMethods = localMethods; }); (0, _defineProperty2.default)(this, "getUri", function (source) { return new URL(source.nativeEvent.url).hostname.toLowerCase(); }); (0, _defineProperty2.default)(this, "parseNativeEvent", function (_ref) { var nativeEvent = _ref.nativeEvent; return JSON.parse(nativeEvent.data); }); (0, _defineProperty2.default)(this, "isPostMeMessage", function (message) { return message.type === _api.strings.postMeSignature; }); (0, _defineProperty2.default)(this, "isInitMessage", function (message) { return message.message === _api.strings.webviewIsRendered; }); (0, _defineProperty2.default)(this, "registerWebview", function (uri, slug, ref) { log(_api.strings.logging.registering(uri)); if (_this.messengerRegister[uri]) return log((0, _utils.interpolate)(_api.strings.errorRegisterWebview, { uri: uri })); var messenger = new _this.messengerService(ref); _this.messengerRegister = _objectSpread(_objectSpread({}, _this.messengerRegister), {}, (0, _defineProperty2.default)({}, uri, { messenger: (0, _utils.isNativeDevMode)() ? (0, _api.DebugNativeMessenger)(messenger) : messenger, slug: slug })); log(_api.strings.logging.registered(uri)); }); (0, _defineProperty2.default)(this, "unregisterWebview", function (uri) { log(_api.strings.logging.unregistering(uri)); if (!_this.messengerRegister[uri]) return log((0, _utils.interpolate)(_api.strings.errorUnregisterWebview, { uri: uri })); delete _this.messengerRegister[uri]; log(_api.strings.logging.unregistered(uri)); }); (0, _defineProperty2.default)(this, "initWebview", /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(messenger) { return _regenerator.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return (0, _postMe.ParentHandshake)(messenger, _this.localMethods, _api.numbers.maxAttempts); case 2: return _context.abrupt("return", _context.sent); case 3: case "end": return _context.stop(); } } }, _callee); })); return function (_x) { return _ref2.apply(this, arguments); }; }()); (0, _defineProperty2.default)(this, "tryEmit", /*#__PURE__*/function () { var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(event, componentId) { var parsedEvent; return _regenerator.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (_this.isNativeEvent(event)) { _context2.next = 2; break; } return _context2.abrupt("return"); case 2: parsedEvent = _this.parseNativeEvent(event); if (parsedEvent.methodName === 'setFlagshipUI' && (0, _utils.isFlagshipUiArgsArray)(parsedEvent.args)) { parsedEvent.args[0].componentId = componentId; } if (parsedEvent.methodName === 'setTheme' && Array.isArray(parsedEvent.args) && (0, _utils.isThemeArg)(parsedEvent.args[0])) { parsedEvent.args[0] = { homeTheme: parsedEvent.args[0], componentId: componentId }; } if (!_this.isInitMessage(parsedEvent)) { _context2.next = 9; break; } _context2.next = 8; return _this.tryInit(event); case 8: return _context2.abrupt("return", _context2.sent); case 9: if (_this.isPostMeMessage(parsedEvent)) _this.tryOnMessage(event, parsedEvent); case 10: case "end": return _context2.stop(); } } }, _callee2); })); return function (_x2, _x3) { return _ref3.apply(this, arguments); }; }()); (0, _defineProperty2.default)(this, "tryInit", /*#__PURE__*/function () { var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(event) { var uri, messengerToInit; return _regenerator.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: uri = _this.getUri(event); messengerToInit = _this.messengerRegister[uri]; _context3.prev = 2; if (messengerToInit) { _context3.next = 5; break; } throw new Error((0, _utils.interpolate)(_api.strings.errorNoMessengerToInit, { uri: uri })); case 5: _context3.next = 7; return _this.initWebview(messengerToInit.messenger); case 7: messengerToInit.connection = _context3.sent; _context3.next = 13; break; case 10: _context3.prev = 10; _context3.t0 = _context3["catch"](2); log((0, _utils.interpolate)(_api.strings.errorParentHandshake, { uri: uri, errorMessage: (0, _utils.getErrorMessage)(_context3.t0) })); case 13: case "end": return _context3.stop(); } } }, _callee3, null, [[2, 10]]); })); return function (_x4) { return _ref4.apply(this, arguments); }; }()); (0, _defineProperty2.default)(this, "tryOnMessage", function (event, message) { var _message$args; var webviewUri = _this.getUri(event); var registeredWebview = _this.messengerRegister[webviewUri]; if (registeredWebview === undefined) { return log((0, _utils.interpolate)(_api.strings.errorEmitMessage, { webviewUri: webviewUri })); } (_message$args = message.args) === null || _message$args === void 0 ? void 0 : _message$args.unshift({ slug: registeredWebview.slug }); registeredWebview.messenger.onMessage(message); }); (0, _defineProperty2.default)(this, "getHostname", function (uri) { try { return new URL(uri).hostname.toLowerCase(); } catch (_unused) { return uri; } }); (0, _defineProperty2.default)(this, "call", function (uri, methodName) { var _this$messengerRegist, _this$messengerRegist2, _this$messengerRegist3; for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } return (_this$messengerRegist = _this.messengerRegister[_this.getHostname(uri)]) === null || _this$messengerRegist === void 0 ? void 0 : (_this$messengerRegist2 = _this$messengerRegist.connection) === null || _this$messengerRegist2 === void 0 ? void 0 : (_this$messengerRegist3 = _this$messengerRegist2.remoteHandle()).call.apply(_this$messengerRegist3, [methodName].concat(args)); }); this.messengerService = messengerService; this.localMethods = _localMethods; } (0, _createClass2.default)(NativeService, [{ key: "isNativeEvent", value: function isNativeEvent(object) { return object.nativeEvent.data !== undefined; } }]); return NativeService; }(); exports.NativeService = NativeService;