ceramicnetwork / js-did

A simple interface to interact with DIDs that conform to the DID-provider interface.
Other
95 stars 28 forks source link

`safeSend` Uses A Callback Innappropriately #194

Open dysbulic opened 1 month ago

dysbulic commented 1 month ago

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 })