@aeternity/aepp-sdk
Version:
SDK for the æternity blockchain
211 lines (183 loc) • 9.32 kB
JavaScript
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