hardhat
Version:
Hardhat is an extensible developer tool that helps smart contract developers increase productivity by reliably bringing together the tools they want.
53 lines • 2.97 kB
JavaScript
import { AsyncMutex } from "@nomicfoundation/hardhat-utils/synchronization";
import { isJsonRpcResponse } from "../json-rpc.js";
import { createHandlersArray } from "../request-handlers/handlers-array.js";
export default async () => {
// This map is essential for managing multiple network connections in Hardhat V3.
// Since Hardhat V3 supports multiple connections, we use this map to track each one
// and associate it with the corresponding handlers array.
// When a connection is closed, its associated handlers array is removed from the map.
// See the "closeConnection" function at the end of the file for more details.
const requestHandlersPerConnection = new WeakMap();
const initializationMutex = new AsyncMutex();
const handlers = {
async onRequest(context, networkConnection, jsonRpcRequest, next) {
let requestHandlers = requestHandlersPerConnection.get(networkConnection);
if (requestHandlers === undefined) {
requestHandlers = await initializationMutex.exclusiveRun(async () => {
// We check again in case another execution of this function
// initialized the handlers while we were waiting for the mutex.
const handlersPerConnectionAfterWaiting = requestHandlersPerConnection.get(networkConnection);
if (handlersPerConnectionAfterWaiting !== undefined) {
return handlersPerConnectionAfterWaiting;
}
const result = await createHandlersArray(networkConnection);
requestHandlersPerConnection.set(networkConnection, result);
return result;
});
}
// We previously cloned here, but the performance impact is significant.
// TODO: ensure the passed in request is not mutated by adapting the
// handlers being applied here. See https://github.com/NomicFoundation/hardhat/issues/8090
let updatedRequest = jsonRpcRequest;
for (const handler of requestHandlers) {
if (!handler.isSupportedMethod(updatedRequest)) {
continue;
}
const newRequestOrResponse = await handler.handle(updatedRequest);
if (isJsonRpcResponse(newRequestOrResponse)) {
return newRequestOrResponse;
}
updatedRequest = newRequestOrResponse;
}
return await next(context, networkConnection, updatedRequest);
},
async closeConnection(context, networkConnection, next) {
if (requestHandlersPerConnection.has(networkConnection) === true) {
requestHandlersPerConnection.delete(networkConnection);
}
return await next(context, networkConnection);
},
};
return handlers;
};
//# sourceMappingURL=network.js.map