js-did
js-did copied to clipboard
`safeSend` Uses A Callback Innappropriately
Description
In @didtools/pkh-ethereum, there is a safeSend function defined in the utils file which handles performing a call to an RPC endpoint for the Ethereum blockchain. This method uses a callback to retrieve the value from the send function, which doesn't take a callback, but instead returns a promise.
Technical Information
Part of the definition of safeSend is as follows:
… if (provider.sendAsync || provider.send) {
const sendFunc = (provider.sendAsync ? provider.sendAsync : provider.send).bind(provider);
const request = encodeRpcMessage(method, params);
return new Promise((resolve, reject)=>{
sendFunc(request, (error, response)=>{
if (error) reject(error);
if (response.error) {
const error = new Error(response.error.message);
error.code = response.error.code;
error.data = response.error.data;
reject(error);
}
resolve(response.result);
});
});
}
The problem is that the Legacy Provider API only defines a callback for sendAsync. Regular send returns a promise.
As expected ethers v6 send follows this format and a call to getAccountId or (more importantly) EthereumWebAuth.getAuthMethod will fail silently when the call is performed and the result is returned as a promise rather than in a callback.
Additionally
The part of safeSend that uses the request method looks like:
return provider.request({ method, params }).then(
(response: any) => response,
(error: any) => { throw error },
)
According to the documentation, I'm pretty sure that should be:
return provider.request({ method, params })
.then((response: any) => response)
.catch((error: any) => { throw error })