@finn_gal/patchright-wallet-mock-ts
Version:
Mock Web3 Browser wallets, like Metamask, in Patchright tests.
93 lines • 3.87 kB
JavaScript
;
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