libp2p
    Preparing search index...

    Module @libp2p/dcutr

    Direct Connection Upgrade through Relay (DCUtR) is a protocol that allows two nodes to connect to each other who would otherwise be prevented doing so due to being behind NATed connections or firewalls.

    The protocol involves making a relayed connection between the two peers and using the relay to synchronize connection timings so that they dial each other at precisely the same moment.

    import { createLibp2p } from 'libp2p'
    import { circuitRelayTransport } from '@libp2p/circuit-relay-v2'
    import { tcp } from '@libp2p/tcp'
    import { identify } from '@libp2p/identify'
    import { dcutr } from '@libp2p/dcutr'
    import { multiaddr } from '@multiformats/multiaddr'

    const node = await createLibp2p({
    transports: [
    circuitRelayTransport(),
    tcp()
    ],
    services: {
    identify: identify(),
    dcutr: dcutr()
    }
    })

    // QmTarget is a peer that is behind a NAT, supports TCP and has a relay
    // reservation
    const ma = multiaddr('/ip4/.../p2p/QmRelay/p2p-circuit/p2p/QmTarget')
    await node.dial(ma)

    // after a while the connection should automatically get upgraded to a
    // direct connection (e.g. non-limited)
    while (true) {
    const connections = node.getConnections()

    if (connections.find(conn => conn.limits == null)) {
    console.info('have direct connection')
    break
    } else {
    console.info('have relayed connection')

    // wait a few seconds to see if it's succeeded yet
    await new Promise<void>((resolve) => {
    setTimeout(() => resolve(), 5000)
    })
    }
    }

    @libp2p/dcutr

    libp2p.io Discuss codecov CI

    Implementation of the DCUtR Protocol

    About

    Direct Connection Upgrade through Relay (DCUtR) is a protocol that allows two nodes to connect to each other who would otherwise be prevented doing so due to being behind NATed connections or firewalls.

    The protocol involves making a relayed connection between the two peers and using the relay to synchronize connection timings so that they dial each other at precisely the same moment.

    import { createLibp2p } from 'libp2p'
    import { circuitRelayTransport } from '@libp2p/circuit-relay-v2'
    import { tcp } from '@libp2p/tcp'
    import { identify } from '@libp2p/identify'
    import { dcutr } from '@libp2p/dcutr'
    import { multiaddr } from '@multiformats/multiaddr'

    const node = await createLibp2p({
    transports: [
    circuitRelayTransport(),
    tcp()
    ],
    services: {
    identify: identify(),
    dcutr: dcutr()
    }
    })

    // QmTarget is a peer that is behind a NAT, supports TCP and has a relay
    // reservation
    const ma = multiaddr('/ip4/.../p2p/QmRelay/p2p-circuit/p2p/QmTarget')
    await node.dial(ma)

    // after a while the connection should automatically get upgraded to a
    // direct connection (e.g. non-limited)
    while (true) {
    const connections = node.getConnections()

    if (connections.find(conn => conn.limits == null)) {
    console.info('have direct connection')
    break
    } else {
    console.info('have relayed connection')

    // wait a few seconds to see if it's succeeded yet
    await new Promise<void>((resolve) => {
    setTimeout(() => resolve(), 5000)
    })
    }
    }

    Install

    $ npm i @libp2p/dcutr
    

    Loading this module through a script tag will make its exports available as Libp2pDcutr in the global namespace.

    <script src="https://unpkg.com/@libp2p/dcutr/dist/index.min.js"></script>
    

    API Docs

    License

    Licensed under either of

    Contribution

    Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

    Interfaces

    DCUtRServiceComponents
    DCUtRServiceInit

    Variables

    multicodec

    Functions

    dcutr