NAME

Net::BitTorrent::Protocol::PeerHandler - High-level Peer Protocol Orchestrator

SYNOPSIS

# Inherits from BEP 06, which inherits from BEP 52, then BEP 11, etc.
use Net::BitTorrent::Protocol::PeerHandler;

my $handler = Net::BitTorrent::Protocol::PeerHandler->new(
    infohash => $ih,
    peer_id   => $id,
    features  => { bep06 => 1, bep10 => 1 }
);

# Link to the high-level Peer object
$handler->set_peer( $peer );

# Feed raw data from the transport
$handler->receive_data( $raw_bytes );

DESCRIPTION

Net::BitTorrent::Protocol::PeerHandler is the "brain" of the Peer Wire Protocol implementation. It utilizes multiple inheritance (via the class feature) to consolidate all supported BitTorrent extensions into a single, unified interface.

It works closely with Net::BitTorrent::Peer to manage the lifecycle of a connection:

1. Handshake: Negotiates protocol version (v1 vs v2) and reserved bits.
2. Extensions: If BEP 10 is negotiated, it exchanges extended handshakes to discover support for PEX, Metadata, etc.
3. Steady State: Dispatches standard messages (Piece, Request) and extensions (PEX, Merkle hashes) to the high-level Peer object.

Supported Extensions:

  • BEP 03: Standard Handshake and Core Messages (Choke, Have, Request, etc.)

  • BEP 06 (Fast): Reduced latency messages (Allowed Fast, Suggest Piece, Reject)

  • BEP 09 (Metadata): UT_METADATA exchange for Magnet links.

  • BEP 10 (Extension): Capability negotiation.

  • BEP 11 (PEX): Peer Exchange.

  • BEP 52 (v2): Merkle Tree synchronization (HASHES, HASH_REQUEST).

  • BEP 55 (Holepunch): NAT traversal support.

METHODS

set_peer( $peer )

Associates the handler with a Peer object.

$handler->set_peer( $peer_obj );

Expected parameters:

$peer

The Net::BitTorrent::Peer object.

handshake event

Emitted when a PWP handshake is completed.

$proto->on( handshake => sub ( $self, $infohash, $peer_id ) { ... } );

Expected parameters:

$infohash

The 20 or 32-byte infohash.

$peer_id

The 20-byte peer ID.

ext_handshake event

Emitted when an extended handshake is received.

$proto->on( ext_handshake => sub ( $self, $data ) { ... } );

Expected parameters:

$data

The decoded handshake dictionary.

metadata_request event

Emitted when a metadata request is received.

$proto->on( metadata_request => sub ( $self, $piece ) { ... } );

Expected parameters:

$piece

The piece index.

metadata_data event

Emitted when metadata data is received.

$proto->on( metadata_data => sub ( $self, $piece, $total_size, $data ) { ... } );

Expected parameters:

$piece

The piece index.

$total_size

The total metadata size.

$data

The piece data.

metadata_reject event

Emitted when a metadata request is rejected.

$proto->on( metadata_reject => sub ( $self, $piece ) { ... } );

Expected parameters:

$piece

The piece index.

hash_request event

Emitted when a Merkle tree hash request is received (BEP 52).

$proto->on( hash_request => sub ( $self, $root, $proof_layer, $base_layer, $index, $length ) { ... } );

Expected parameters:

$root

The 32-byte Merkle root.

$proof_layer

The proof layer index.

$base_layer

The base layer index.

$index

The starting index.

$length

The number of hashes.

hashes event

Emitted when Merkle tree hashes are received.

$proto->on( hashes => sub ( $self, $root, $proof_layer, $base_layer, $index, $length, $hashes ) { ... } );

Expected parameters:

$root

The 32-byte Merkle root.

$proof_layer

The proof layer.

$base_layer

The base layer.

$index

The starting index.

$length

The number of hashes.

$hashes

The binary hashes.

hash_reject event

Emitted when a hash request is rejected.

$proto->on( hash_reject => sub ( $self, $root, $proof_layer, $base_layer, $index, $length ) { ... } );

Expected parameters:

$root

The 32-byte Merkle root.

$proof_layer

The proof layer.

$base_layer

The base layer.

$index

The starting index.

$length

The number of hashes.

pex event

Emitted when PEX data is received.

$proto->on( pex => sub ( $self, $added, $dropped, $added6, $dropped6 ) { ... } );

Expected parameters:

$added

Added IPv4 peers.

$dropped

Dropped IPv4 peers.

$added6

Added IPv6 peers.

$dropped6

Dropped IPv6 peers.

hp_rendezvous event

Emitted when a holepunch rendezvous is requested.

$proto->on( hp_rendezvous => sub ( $self, $id ) { ... } );

Expected parameters:

$id

The target peer ID.

hp_connect event

Emitted when a holepunch connect instruction is received.

$proto->on( hp_connect => sub ( $self, $ip, $port ) { ... } );

Expected parameters:

$ip

The IP address.

$port

The port number.

hp_error event

Emitted when a holepunch error is received.

$proto->on( hp_error => sub ( $self, $err ) { ... } );

Expected parameters:

$err

The error code.

peer( )

Returns the associated Peer object.

my $p = $handler->peer();

AUTHOR

Sanko Robinson <sanko@cpan.org>

COPYRIGHT

Copyright (C) 2008-2026 by Sanko Robinson.

This library is free software; you can redistribute it and/or modify it under the terms of the Artistic License 2.0.