js-libp2p icon indicating copy to clipboard operation
js-libp2p copied to clipboard

fix(libp2p): Export Components type for use in apps that use libp2p

Open MichaelJCole opened this issue 1 year ago • 2 comments

Title

fix(libp2p): Export Components type for use in apps that use libp2p

Description

See https://github.com/libp2p/js-libp2p/issues/2452

Notes & open questions

See https://github.com/libp2p/js-libp2p/issues/2452

Change checklist

  • [x] I have performed a self-review of my own code
  • [ ] I have made corresponding changes to the documentation if necessary (this includes comments as well)
  • [ ] I have added tests that prove my fix is effective or that my feature works

MichaelJCole avatar Mar 27 '24 16:03 MichaelJCole

Thanks for opening this.

I'm hesitant to export this interface because it encourages the sort of code where everything depends on everything else. This is why the components field is not part of the libp2p interface and is only used internally within the libp2p module.

Could you speak a bit more to your use-case please?

achingbrain avatar Mar 27 '24 17:03 achingbrain

Hi, I wrote a bit about this in https://github.com/libp2p/js-libp2p/pull/2449#issuecomment-2023373834.

I wrote a bit about the use case in https://github.com/libp2p/js-libp2p/issues/2454

More or less, my use case is an electron app with a configuration similar to Vuze, utorrent, and other peer-to-peer desktop applications. Those applications set expectations for how configurable they should be. Also, I need to help users around NATs and firewalls and etc. Having access to the addressManager is part of it.

I mentioned in the PR, how Typescript only enforces these limitations at compile time. And they can be trivially overridden:

    // @ts-ignore missing components in libp2p types
    const am = libp2p.components.addressManager as DefaultAddressManager

So not including these types is really just making it harder to use. Javascript runtimes don't enforce private members unless you're compiling to ES2021+ and use # at the start of the names. The _name convention is well understood. IMHO, separating the interfaces from classes and putting them into their own package really just makes things harder for everyone.

Here are some screenshots of the UI's

https://vpn.ac/images/tutorials/socks5/qbittorrent1.png https://www.bolehvpn.net/images/utorrent1.jpg https://imgur.com/MQ4zkcA - 10 years old

MichaelJCole avatar Mar 28 '24 02:03 MichaelJCole

I'm closing this issue because I think the underlying problem you mention in #2454 is that your observed addresses are not being confirmed by peers.

Exposing libp2p internals like this will not solve your problem.

If you really, really want to do this, you can @ts-ignore the types, or create a custom service that exposes the methods you want to call, but it seems that your particular network setup is giving AutoNAT problems, or your node hasn't been running for long enough to receive enough confirmations from a diverse enough set of peers, or perhaps both.

achingbrain avatar May 28 '24 14:05 achingbrain