UNPKG

@aeternity/aepp-sdk

Version:
211 lines (183 loc) 9.32 kB
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty"; import _typeof from "@babel/runtime-corejs3/helpers/typeof"; function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) symbols = _filterInstanceProperty(symbols).call(symbols, 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 = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context4; _forEachInstanceProperty(_context4 = ownKeys(Object(source), true)).call(_context4, function (key) { _defineProperty(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context5; _forEachInstanceProperty(_context5 = ownKeys(Object(source))).call(_context5, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; } import _startsWithInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/starts-with"; import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes"; import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys"; import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"; import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter"; import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor"; import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each"; import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors"; import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties"; import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property"; /* * ISC License (ISC) * Copyright (c) 2018 aeternity developers * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ /** * Browser window Post Message connector module * * This is the complement to {@link module:@aeternity/aepp-sdk/es/utils/aepp-wallet-communication/connection}. * @module @aeternity/aepp-sdk/es/utils/aepp-wallet-communication/connection/browser-window-message * @export BrowserWindowMessageConnection * @example import BrowserWindowMessageConnection from '@aeternity/aepp-sdk/es/utils/aepp-wallet-communication/connection/browser-window-message' */ import stampit from '@stamp/it'; import WalletConnection from '.'; import { v4 as uuid } from 'uuid'; import { MESSAGE_DIRECTION } from '../schema'; import { getBrowserAPI, isInIframe } from '../helpers'; /** * Check if connected * @function isConnected * @instance * @rtype () => Boolean * @return {Boolean} Is connected */ function isConnected() { return this.listener; } /** * Connect * @function connect * @instance * @rtype (onMessage: Function) => void * @param {Function} onMessage - Message handler * @return {void} */ function connect(onMessage) { var origin = this.origin; var receiveDirection = this.receiveDirection; var debug = this.debug; var forceOrigin = this.forceOrigin; if (this.listener) throw new Error('You already connected'); this.listener = function (msg, source) { if (!msg || _typeof(msg.data) !== 'object') return; if (!forceOrigin && origin && origin !== msg.origin) return; if (debug) console.log('Receive message: ', msg); if (msg.data.type) { if (msg.data.type !== receiveDirection) return; onMessage(msg.data.data, msg.origin, msg.source); } else { onMessage(msg.data, msg.origin, msg.source); } }; this.subscribeFn(this.listener); } /** * Disconnect * @function disconnect * @instance * @rtype () => void * @return {void} */ function disconnect() { if (!this.listener) throw new Error('You dont have connection. Please connect before'); this.unsubscribeFn(this.listener); this.listener = null; } /** * Send message * @function sendMessage * @instance * @rtype (msg: Object) => void * @param {Object} msg - Message * @return {void} */ function sendMessage(msg) { var message = this.sendDirection ? { type: this.sendDirection, data: msg } : msg; if (this.debug) console.log('Send message: ', message); this.postFn(message); } var getTarget = function getTarget() { var _context; var isExtensionContext = _typeof(getBrowserAPI(true).extension) === 'object'; var isWeb = window && window.location && _startsWithInstanceProperty(_context = window.location.protocol).call(_context, 'http'); var isContentScript = isExtensionContext && isWeb; if (isContentScript) return window; // When we is the main page we need to decide the target by our self // Probably can be implemented some algo for checking DOM for Iframes and somehow decide which Iframe to talk return isInIframe() ? window.parent : undefined; }; /** * BrowserWindowMessageConnection * @function * @alias module:@aeternity/aepp-sdk/es/utils/aepp-wallet-communication/connection/browser-window-message * @rtype Stamp * @param {Object} [params={}] - Initializer object * @param {Object} [params.target=window.parent] - Target window for message * @param {Object} [params.self=window] - Host window for message * @param {Object} [params.origin] - Origin of receiver * @param {Object} [params.sendDirection] - Optional field for wrapping messages in additional structure({ type: 'to_aepp' || 'to_waellet', data }).Used for handling messages netween content script and page * @param {Object} [params.receiveDirection='to_aepp'] - Optional(default: 'to_aepp') field for unwrapping messages from additional structure({ type: 'to_aepp' || 'to_waellet', data }).Used for handling messages netween content script and page * @param {Object} [params.connectionInfo={}] - Connection info object * @param {Boolean} [params.debug=false] - Debug flag * @return {Object} */ export default stampit({ init: function init() { var _context2, _context3, _this = this; var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$connectionInfo = _ref.connectionInfo, connectionInfo = _ref$connectionInfo === void 0 ? {} : _ref$connectionInfo, _ref$target = _ref.target, target = _ref$target === void 0 ? getTarget() : _ref$target, _ref$self = _ref.self, self = _ref$self === void 0 ? window : _ref$self, origin = _ref.origin, sendDirection = _ref.sendDirection, _ref$receiveDirection = _ref.receiveDirection, receiveDirection = _ref$receiveDirection === void 0 ? MESSAGE_DIRECTION.to_aepp : _ref$receiveDirection, _ref$debug = _ref.debug, debug = _ref$debug === void 0 ? false : _ref$debug, _ref$forceOrigin = _ref.forceOrigin, forceOrigin = _ref$forceOrigin === void 0 ? false : _ref$forceOrigin; if (sendDirection && !_includesInstanceProperty(_context2 = _Object$keys(MESSAGE_DIRECTION)).call(_context2, sendDirection)) throw new Error("sendDirection must be one of [".concat(_Object$keys(MESSAGE_DIRECTION), "]")); if (!_includesInstanceProperty(_context3 = _Object$keys(MESSAGE_DIRECTION)).call(_context3, receiveDirection)) throw new Error("receiveDirection must be one of [".concat(_Object$keys(MESSAGE_DIRECTION), "]")); this.connectionInfo = _objectSpread({ id: uuid() }, connectionInfo); var selfP = self; var targetP = target; this.origin = origin; this.debug = debug; this.forceOrigin = forceOrigin; this.sendDirection = sendDirection; this.receiveDirection = receiveDirection; this.subscribeFn = function (listener) { return selfP.addEventListener('message', listener, false); }; this.unsubscribeFn = function (listener) { return selfP.removeEventListener('message', listener, false); }; this.postFn = function (msg) { return targetP.postMessage(msg, _this.origin || '*'); }; if (!this.connectionInfo.id) throw new Error('ID required.'); }, methods: { connect: connect, sendMessage: sendMessage, disconnect: disconnect, isConnected: isConnected } }, WalletConnection); //# sourceMappingURL=browser-window-message.js.map