@trezor/connect-web
Version:
High-level javascript interface for Trezor hardware wallet in web environment.
168 lines • 5.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.initIframeLogger = exports.clearTimeout = exports.postMessage = exports.init = exports.dispose = exports.error = exports.timeout = exports.initPromise = exports.origin = exports.instance = void 0;
const tslib_1 = require("tslib");
const ERRORS = tslib_1.__importStar(require("@trezor/connect/lib/constants/errors"));
const events_1 = require("@trezor/connect/lib/events");
const debug_1 = require("@trezor/connect/lib/utils/debug");
const urlUtils_1 = require("@trezor/connect/lib/utils/urlUtils");
const utils_1 = require("@trezor/utils");
const inlineStyles_1 = tslib_1.__importDefault(require("./inlineStyles"));
exports.initPromise = (0, utils_1.createDeferred)();
exports.timeout = 0;
const dispose = () => {
if (exports.instance && exports.instance.parentNode) {
try {
exports.instance.parentNode.removeChild(exports.instance);
}
catch {
}
}
exports.instance = null;
exports.timeout = 0;
};
exports.dispose = dispose;
const handleIframeBlocked = () => {
window.clearTimeout(exports.timeout);
exports.error = ERRORS.TypedError('Init_IframeBlocked');
(0, exports.dispose)();
exports.initPromise.reject(exports.error);
};
const injectStyleSheet = () => {
if (!exports.instance) {
throw ERRORS.TypedError('Init_IframeBlocked');
}
const doc = exports.instance.ownerDocument;
const head = doc.head || doc.getElementsByTagName('head')[0];
const style = document.createElement('style');
style.setAttribute('type', 'text/css');
style.setAttribute('id', 'TrezorConnectStylesheet');
if (style.styleSheet) {
style.styleSheet.cssText = inlineStyles_1.default;
head.appendChild(style);
}
else {
style.appendChild(document.createTextNode(inlineStyles_1.default));
head.append(style);
}
};
const init = async (settings) => {
exports.initPromise = (0, utils_1.createDeferred)();
const existedFrame = document.getElementById('trezorconnect');
if (existedFrame) {
exports.instance = existedFrame;
}
else {
exports.instance = document.createElement('iframe');
exports.instance.frameBorder = '0';
exports.instance.width = '0px';
exports.instance.height = '0px';
exports.instance.style.position = 'absolute';
exports.instance.style.display = 'none';
exports.instance.style.border = '0px';
exports.instance.style.width = '0px';
exports.instance.style.height = '0px';
exports.instance.id = 'trezorconnect';
}
let src;
if (settings.env === 'web') {
const manifestString = settings.manifest ? JSON.stringify(settings.manifest) : 'undefined';
const manifest = `version=${settings.version}&manifest=${encodeURIComponent(btoa(JSON.stringify(manifestString)))}`;
src = `${settings.iframeSrc}?${manifest}`;
}
else {
src = settings.iframeSrc;
}
if (!src.startsWith('http://') && !src.startsWith('https://')) {
return;
}
exports.instance.setAttribute('src', src);
if (navigator.usb) {
exports.instance.setAttribute('allow', 'usb');
}
exports.origin = (0, urlUtils_1.getOrigin)(exports.instance.src);
exports.timeout = window.setTimeout(() => {
exports.initPromise.reject(ERRORS.TypedError('Init_IframeTimeout'));
}, 10000);
const onLoad = () => {
if (!exports.instance) {
exports.initPromise.reject(ERRORS.TypedError('Init_IframeBlocked'));
return;
}
try {
const iframeOrigin = exports.instance.contentWindow?.location.origin;
if (!iframeOrigin || iframeOrigin === 'null') {
handleIframeBlocked();
return;
}
}
catch {
}
let extension;
if (typeof chrome !== 'undefined' &&
chrome.runtime &&
typeof chrome.runtime.onConnect !== 'undefined') {
chrome.runtime.onConnect.addListener(() => { });
extension = chrome.runtime.id;
}
exports.instance.contentWindow?.postMessage({
type: events_1.IFRAME.INIT,
payload: {
settings,
extension,
},
}, exports.origin);
exports.instance.onload = null;
};
if (exports.instance.attachEvent) {
exports.instance.attachEvent('onload', onLoad);
}
else {
exports.instance.onload = onLoad;
}
if (document.body) {
document.body.appendChild(exports.instance);
injectStyleSheet();
}
try {
await exports.initPromise.promise;
}
catch (e) {
if (exports.instance) {
if (exports.instance.parentNode) {
exports.instance.parentNode.removeChild(exports.instance);
}
exports.instance = null;
}
throw e;
}
finally {
window.clearTimeout(exports.timeout);
exports.timeout = 0;
}
};
exports.init = init;
const postMessage = (message) => {
if (!exports.instance) {
throw ERRORS.TypedError('Init_IframeBlocked');
}
exports.instance.contentWindow?.postMessage(message, exports.origin);
};
exports.postMessage = postMessage;
const clearTimeout = () => {
window.clearTimeout(exports.timeout);
};
exports.clearTimeout = clearTimeout;
const initIframeLogger = () => {
const logWriterFactory = () => ({
add: (message) => {
(0, exports.postMessage)({
type: events_1.IFRAME.LOG,
payload: message,
});
},
});
(0, debug_1.setLogWriter)(logWriterFactory);
};
exports.initIframeLogger = initIframeLogger;
//# sourceMappingURL=index.js.map