axolotl-pm / nethernet
A NetherNet (WebRTC) transport implementation written in PHP
dev-master
2026-09-01 08:51 UTC
Requires
- php: ^8.1
- php-64bit: *
- ext-encoding: ~1.0.0
- ext-hash: *
- ext-json: *
- ext-openssl: *
- ext-sockets: *
- ext-webrtc: *
- pocketmine/log: ^0.4.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.75
- phpstan/phpstan: 2.1.46
- phpstan/phpstan-phpunit: ^2.0.0
- phpstan/phpstan-strict-rules: ^2.0.0
- phpunit/phpunit: ^10.5.24
This package is auto-updated.
Last update: 2026-09-01 08:56:44 UTC
README
A PHP implementation of NetherNet, the WebRTC DataChannel transport used by Minecraft: Bedrock Edition. Built on ext-webrtc.
Warning
Experimental! The API is not finalized yet and is not shielded by API constraints. Expect things to be changed over release.
Requirements
- PHP 8.1 or newer (64-bit)
ext-webrtcext-openssl,ext-json,ext-sockets
Quick Start
use pocketmine\nethernet\discovery\LanSignaling; use pocketmine\nethernet\discovery\MutableServerDataProvider; use pocketmine\nethernet\discovery\ServerData; use pocketmine\nethernet\identity\ServerIdentity; use pocketmine\nethernet\NetherNetServer; use pocketmine\nethernet\ServerConfiguration; use pocketmine\nethernet\ServerEventListener; use pocketmine\nethernet\session\Reliability; use pocketmine\nethernet\session\Session; use pocketmine\nethernet\signaling\http\HttpSignaling; // 1. Define event listener for client sessions $listener = new class implements ServerEventListener{ public function onSessionOpen(Session $session) : void{ echo "Client connected: " . $session->getNetworkId() . PHP_EOL; } public function onPacketReceive(Session $session, string $payload, Reliability $reliability) : void{ // Handle Minecraft packet payload $session->send($payload, $reliability); } public function onSessionClose(Session $session, ?string $reason) : void{ echo "Client disconnected: " . ($reason ?? "unknown") . PHP_EOL; } }; // 2. Configure server identity and instantiate server $identity = file_exists('server.key') ? ServerIdentity::fromPrivateKeyPem(file_get_contents('server.key')) : ServerIdentity::generate(); $config = new ServerConfiguration(identity: $identity); $server = NetherNetServer::create($config, $listener); // 3. Add signaling transports (HTTP and LAN) $server->addSignaling(new HttpSignaling( negotiator: $server->getNegotiator(), address: '0.0.0.0', port: 19132 )); $serverDataProvider = new MutableServerDataProvider( ServerData::fromPongData("MCPE;Dedicated Server;800;1.21.100;0;20;0;World;Survival;1;19132;19133;") ); $server->addSignaling(new LanSignaling( negotiator: $server->getNegotiator(), serverDataProvider: $serverDataProvider, networkId: 12345678 )); // 4. Start server and run tick loop $server->start(); while($server->isRunning()){ $server->tick(); usleep(10_000); // 10ms tick }