UNPKG

@finn_gal/patchright-wallet-mock-ts

Version:

Mock Web3 Browser wallets, like Metamask, in Patchright tests.

93 lines 3.87 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.installMockWallet = installMockWallet; const createWallet_1 = require("./createWallet"); const cors_1 = __importDefault(require("cors")); const crypto_1 = require("crypto"); const express_1 = __importDefault(require("express")); const net_1 = __importDefault(require("net")); let wallets = new Map(); async function installMockWallet({ debug, ...params }) { const freePort = await new Promise(res => { const srv = net_1.default.createServer(); srv.listen(0, () => { const port = srv.address().port; srv.close((err) => res(port)); }); }); const app = (0, express_1.default)(); app.use((0, cors_1.default)({ origin: '*', methods: ['POST'], allowedHeaders: ['Content-Type'] })); app.use(express_1.default.json()); app.post('/eip1193', async (req, res) => { const { method, params, uuid, debug } = req.body; const wallet = wallets.get(uuid); if (!wallet) return res.status(400).json({ error: 'Wallet not found' }); try { const result = await wallet.request({ method, params }); if (debug) console.log('WALLET', uuid.substring(0, 8), 'REQUEST', method, params, 'RESULT', result); res.json(result); } catch (error) { if (debug) console.log('WALLET', uuid.substring(0, 8), 'REQUEST', method, params, 'ERROR', error); res.status(500).json({ error: error.message }); } }); app.listen(freePort); const browserOrPage = params.page; const wallet = 'wallet' in params ? params.wallet : (0, createWallet_1.createWallet)(params.account, params.transports, params.defaultChain); const uuid = (0, crypto_1.randomUUID)(); wallets.set(uuid, wallet); await browserOrPage.addInitScript(({ uuid, debug, freePort }) => { window.eip1193Request = async ({ method, params }) => { try { const response = await fetch(`http://localhost:${freePort}/eip1193`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ method, params, uuid, debug }) }); const result = await response.json(); if (!response.ok) throw new Error(result.error || 'Request failed'); return result; } catch (e) { if (debug) console.error('EIP-1193 Error:', e); throw e; } }; function announceMockWallet() { const provider = { request: async (request) => { return await window.eip1193Request({ ...request, uuid, debug }); }, on: () => { }, removeListener: () => { } }; const info = { uuid, name: 'MetaMask', icon: '', rdns: 'io.metamask' }; const detail = { info, provider }; const announceEvent = new CustomEvent('eip6963:announceProvider', { detail: Object.freeze(detail) }); window.dispatchEvent(announceEvent); window.ethereum = provider; } announceMockWallet(); window.addEventListener('eip6963:requestProvider', () => announceMockWallet()); window.addEventListener('DOMContentLoaded', () => announceMockWallet()); }, { uuid, debug, freePort }); } //# sourceMappingURL=installMockWallet.js.map