Decoding with Callbacks

Added in version 4.2.

Callback decoding may be useful if you don’t need a complete decoding result. Examples:

  • Bencode validation

  • Extraction of specific values

Callback Decoder Object

Decoder object can be configured on creation and used multiple times:

<?php

use Arokettu\Bencode\CallbackDecoder;

$decoder = new CallbackDecoder(bigInt: Bencode\BigInt::INTERNAL);
$callback = function (array $keys, mixed $value) {
    // ...
}
// all calls available:
$decoder->decode($encoded, $callback);
$decoder->decodeStream($stream, $callback);
$decoder->load($filename, $callback);

Callback

Callback can be any callable with signature (array $keys, mixed $value): ?bool. For a callable object this signature can be enforced by the interface Arokettu\Bencode\Types\CallbackHandler. The callback is called for every encountered scalar. Empty lists and dictionaries will not trigger the callback. If the callback returns false, the parser quits.

Arguments

  • $keys. An array of keys of lists and dictionaries. Int keys refer to lists. String keys refer to dictionaries.

  • $value. A scalar value nested by $keys.

Example

Count files for v1 torrent:

<?php

use Arokettu\Bencode\CallbackDecoder;

$file = 'torrent_file.torrent';
$decoder = new CallbackDecoder();

$count = 0;
$decoder->load($file, function (array $keys) use (&$count) {
    if ($keys[0] === 'info' && $keys[1] === 'files' && $keys[3] === 'path') {
        $count += 1;
    }
});

echo $count, PHP_EOL;