safe-apps-sdk
Version:
SDK developed to integrate third-party apps with Safe app.
77 lines • 3.37 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
const messageFormatter_1 = require("./messageFormatter");
class PostMessageCommunicator {
constructor(allowedOrigins = null, debugMode = false) {
this.allowedOrigins = null;
this.callbacks = new Map();
this.debugMode = false;
this.isServer = typeof window === 'undefined';
this.isValidMessage = ({ origin, data, source }) => {
const emptyOrMalformed = !data;
const sentFromParentEl = !this.isServer && source === window.parent;
const majorVersionNumber = typeof data.version !== 'undefined' && parseInt(data.version.split('.')[0]);
const allowedSDKVersion = majorVersionNumber >= 1;
let validOrigin = true;
if (Array.isArray(this.allowedOrigins)) {
validOrigin = this.allowedOrigins.find((regExp) => regExp.test(origin)) !== undefined;
}
return !emptyOrMalformed && sentFromParentEl && allowedSDKVersion && validOrigin;
};
this.logIncomingMessage = (msg) => {
console.info(`Safe Apps SDK v1: A message was received from origin ${msg.origin}. `, msg.data);
};
this.onParentMessage = (msg) => {
if (this.isValidMessage(msg)) {
this.debugMode && this.logIncomingMessage(msg);
this.handleIncomingMessage(msg.data);
}
};
this.handleIncomingMessage = (payload) => {
const { id } = payload;
const cb = this.callbacks.get(id);
if (cb) {
cb(payload);
this.callbacks.delete(id);
}
};
this.send = (method, params) => {
const request = messageFormatter_1.MessageFormatter.makeRequest(method, params);
if (this.isServer) {
throw new Error("Window doesn't exist");
}
window.parent.postMessage(request, '*');
return new Promise((resolve, reject) => {
this.callbacks.set(request.id, (response) => {
if (!response.success) {
reject(new Error(response.error));
return;
}
resolve(response);
});
});
};
this.allowedOrigins = allowedOrigins;
this.debugMode = debugMode;
if (!this.isServer) {
window.addEventListener('message', this.onParentMessage);
}
}
}
exports.default = PostMessageCommunicator;
__exportStar(require("./methods"), exports);
//# sourceMappingURL=index.js.map