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;