@cosmos-kit/terra-extension
Version:
cosmos-kit wallet connector
135 lines (134 loc) • 4.62 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
const _excluded = ["error"],
_excluded2 = ["purgeQueue"],
_excluded3 = ["error"],
_excluded4 = ["error"],
_excluded5 = ["error"];
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) { _defineProperty(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; }
import { Extension } from '@terra-money/feather.js';
function isValidResult(_ref) {
let {
error
} = _ref,
payload = _objectWithoutProperties(_ref, _excluded);
if (typeof payload.success !== 'boolean') {
return false;
} else if (typeof payload.result === 'undefined' && typeof error === 'undefined') {
return false;
}
return true;
}
export class TerraExtension {
// resolvers
constructor() {
_defineProperty(this, "extension", void 0);
_defineProperty(this, "identifier", 'station');
_defineProperty(this, "_inTransactionProgress", false);
_defineProperty(this, "connectResolvers", new Set());
_defineProperty(this, "infoResolvers", new Set());
_defineProperty(this, "signResolvers", new Map());
}
get isAvailable() {
return this.extension.isAvailable;
}
async init() {
this.extension = new Extension();
this.onResponse();
}
async connect() {
return new Promise((...resolver) => {
this.connectResolvers.add(resolver);
this.extension.connect();
});
}
async info() {
return new Promise((...resolver) => {
this.infoResolvers.add(resolver);
this.extension.info();
});
}
disconnect() {
this.connectResolvers.clear();
this.infoResolvers.clear();
this.signResolvers.clear();
}
async sign(_ref2) {
let {
purgeQueue = true
} = _ref2,
data = _objectWithoutProperties(_ref2, _excluded2);
return new Promise((...resolver) => {
this._inTransactionProgress = true;
const id = this.extension.sign(_objectSpread(_objectSpread({}, data), {}, {
purgeQueue
}));
this.signResolvers.set(id, resolver);
setTimeout(() => {
if (this.signResolvers.has(id)) {
this.signResolvers.delete(id);
if (this.signResolvers.size === 0) {
this._inTransactionProgress = false;
}
}
}, 1000 * 120);
});
}
onResponse() {
this.extension.on('onConnect', result => {
if (!result) return;
const {
error
} = result,
payload = _objectWithoutProperties(result, _excluded3);
for (const [resolve, reject] of this.connectResolvers) {
if (error) {
reject(error);
} else {
resolve(payload);
}
}
this.connectResolvers.clear();
});
this.extension.on('onInterchainInfo', result => {
if (!result) return;
const {
error
} = result,
payload = _objectWithoutProperties(result, _excluded4);
for (const [resolve, reject] of this.infoResolvers) {
if (error) {
reject(error);
} else {
resolve(payload);
}
}
this.infoResolvers.clear();
});
this.extension.on('onSign', result => {
if (!result || !isValidResult(result)) {
return;
}
const {
error
} = result,
payload = _objectWithoutProperties(result, _excluded5);
if (this.signResolvers.has(payload.id)) {
const [resolve, reject] = this.signResolvers.get(payload.id);
if (!payload.success) {
reject(error);
} else if (resolve) {
resolve({
name: 'onSign',
payload
});
}
this.signResolvers.delete(payload.id);
if (this.signResolvers.size === 0) {
this._inTransactionProgress = false;
}
}
});
}
}