From 11d9db1dbb9e2d9ad4c340492f91e4c82c0d54be Mon Sep 17 00:00:00 2001 From: alvin0319 Date: Mon, 22 Sep 2025 19:49:20 +0900 Subject: [PATCH 1/3] Fix for ext-encoding@1.0.0 --- composer.json | 2 +- src/SendQueue.php | 11 ++++---- src/frame/Acknowledgement.php | 40 +++++++++++++------------- src/frame/ConnectionClose.php | 18 +++++++----- src/frame/ConnectionRequest.php | 7 +++-- src/frame/ConnectionResponse.php | 16 +++++++---- src/frame/Frame.php | 7 +++-- src/frame/MTURequest.php | 12 ++++---- src/frame/MTUResponse.php | 12 ++++---- src/frame/Pack.php | 48 +++++++++++++++++--------------- src/frame/StreamClose.php | 12 ++++---- src/frame/StreamData.php | 20 +++++++------ src/frame/StreamRequest.php | 12 ++++---- src/frame/StreamResponse.php | 17 ++++++----- 14 files changed, 131 insertions(+), 103 deletions(-) diff --git a/composer.json b/composer.json index 1a054fb..8473946 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ } ], "require": { - "ext-encoding": "*", + "ext-encoding": "^1.0.0", "ext-sockets": "*", "symfony/filesystem": "^7.1" }, diff --git a/src/SendQueue.php b/src/SendQueue.php index 14d0f29..202c50d 100644 --- a/src/SendQueue.php +++ b/src/SendQueue.php @@ -4,7 +4,7 @@ namespace cooldogedev\spectral; -use pmmp\encoding\ByteBuffer; +use pmmp\encoding\ByteBufferWriter; use function array_shift; use function count; use function min; @@ -14,11 +14,11 @@ final class SendQueue { private array $queue = []; private int $mss = Protocol::MIN_PACKET_SIZE; - private ByteBuffer $pk; + private ByteBufferWriter $pk; public function __construct() { - $this->pk = new ByteBuffer(); + $this->pk = new ByteBufferWriter(); $this->pk->reserve(Protocol::MAX_PACKET_SIZE); } @@ -57,14 +57,13 @@ public function pack(int $window): ?string array_shift($this->queue); $this->pk->writeByteArray($entry); } - return $this->pk->toString(); + return $this->pk->getData(); } public function flush(): void { $this->pk->clear(); - $this->pk->setReadOffset(0); - $this->pk->setWriteOffset(0); + $this->pk->setOffset(0); } public function clear(): void diff --git a/src/frame/Acknowledgement.php b/src/frame/Acknowledgement.php index 694c955..4f585bb 100644 --- a/src/frame/Acknowledgement.php +++ b/src/frame/Acknowledgement.php @@ -4,7 +4,9 @@ namespace cooldogedev\spectral\frame; -use pmmp\encoding\ByteBuffer; +use pmmp\encoding\ByteBufferReader; +use pmmp\encoding\ByteBufferWriter; +use pmmp\encoding\LE; use function count; final class Acknowledgement extends Frame @@ -30,27 +32,27 @@ public function id(): int return FrameIds::ACKNOWLEDGEMENT; } - public function encode(ByteBuffer $buf): void + public function encode(ByteBufferWriter $buf): void { - $buf->writeSignedLongLE($this->delay); - $buf->writeUnsignedIntLE($this->max); - $buf->writeUnsignedIntLE(count($this->ranges)); - foreach ($this->ranges as $range) { - $buf->writeUnsignedIntLE($range[0]); - $buf->writeUnsignedIntLE($range[1]); - } + LE::writeSignedLong($buf, $this->delay); + LE::writeUnsignedInt($buf, $this->max); + LE::writeUnsignedInt($buf, count($this->ranges)); + foreach ($this->ranges as $range) { + LE::writeUnsignedInt($buf, $range[0]); + LE::writeUnsignedInt($buf, $range[1]); + } } - public function decode(ByteBuffer $buf): void + public function decode(ByteBufferReader $buf): void { - $this->delay = $buf->readSignedLongLE(); - $this->max = $buf->readUnsignedIntLE(); - $length = $buf->readUnsignedIntLE(); - for ($i = 0; $i < $length; $i++) { - $this->ranges[$i] = [ - $buf->readUnsignedIntLE(), - $buf->readUnsignedIntLE(), - ]; - } + $this->delay = LE::readSignedLong($buf); + $this->max = LE::readUnsignedInt($buf); + $length = LE::readUnsignedInt($buf); + for ($i = 0; $i < $length; $i++) { + $this->ranges[$i] = [ + LE::readUnsignedInt($buf), + LE::readUnsignedInt($buf) + ]; + } } } diff --git a/src/frame/ConnectionClose.php b/src/frame/ConnectionClose.php index f14789c..314fd1e 100644 --- a/src/frame/ConnectionClose.php +++ b/src/frame/ConnectionClose.php @@ -4,7 +4,10 @@ namespace cooldogedev\spectral\frame; -use pmmp\encoding\ByteBuffer; +use pmmp\encoding\Byte; +use pmmp\encoding\ByteBufferReader; +use pmmp\encoding\ByteBufferWriter; +use pmmp\encoding\LE; use function strlen; final class ConnectionClose extends Frame @@ -30,16 +33,17 @@ public function id(): int return FrameIds::CONNECTION_CLOSE; } - public function encode(ByteBuffer $buf): void + public function encode(ByteBufferWriter $buf): void { - $buf->writeUnsignedByte($this->code); - $buf->writeUnsignedIntLE(strlen($this->message)); +// $buf->writeUnsignedByte($this->code); +// $buf->writeUnsignedIntLE(strlen($this->message)); + Byte::writeUnsigned($buf, $this->code); $buf->writeByteArray($this->message); } - public function decode(ByteBuffer $buf): void + public function decode(ByteBufferReader $buf): void { - $this->code = $buf->readUnsignedByte(); - $this->message = $buf->readByteArray($buf->readUnsignedIntLE()); + $this->code = Byte::readUnsigned($buf); + $this->message = $buf->readByteArray(LE::readUnsignedInt($buf)); } } diff --git a/src/frame/ConnectionRequest.php b/src/frame/ConnectionRequest.php index 64fd599..f5726b0 100644 --- a/src/frame/ConnectionRequest.php +++ b/src/frame/ConnectionRequest.php @@ -4,7 +4,8 @@ namespace cooldogedev\spectral\frame; -use pmmp\encoding\ByteBuffer; +use pmmp\encoding\ByteBufferReader; +use pmmp\encoding\ByteBufferWriter; final class ConnectionRequest extends Frame { @@ -18,7 +19,7 @@ public function id(): int return FrameIds::CONNECTION_REQUEST; } - public function encode(ByteBuffer $buf): void {} + public function encode(ByteBufferWriter $buf): void {} - public function decode(ByteBuffer $buf): void {} + public function decode(ByteBufferReader $buf): void {} } diff --git a/src/frame/ConnectionResponse.php b/src/frame/ConnectionResponse.php index 6e71166..c02058f 100644 --- a/src/frame/ConnectionResponse.php +++ b/src/frame/ConnectionResponse.php @@ -4,7 +4,11 @@ namespace cooldogedev\spectral\frame; +use pmmp\encoding\Byte; use pmmp\encoding\ByteBuffer; +use pmmp\encoding\ByteBufferReader; +use pmmp\encoding\ByteBufferWriter; +use pmmp\encoding\LE; final class ConnectionResponse extends Frame { @@ -27,15 +31,15 @@ public function id(): int return FrameIds::CONNECTION_RESPONSE; } - public function encode(ByteBuffer $buf): void + public function encode(ByteBufferWriter $buf): void { - $buf->writeSignedLongLE($this->connectionID); - $buf->writeUnsignedByte($this->response); + LE::writeSignedLong($buf, $this->connectionID); + Byte::writeUnsigned($buf, $this->response); } - public function decode(ByteBuffer $buf): void + public function decode(ByteBufferReader $buf): void { - $this->connectionID = $buf->readSignedLongLE(); - $this->response = $buf->readUnsignedByte(); + $this->connectionID = LE::readSignedLong($buf); + $this->response = Byte::readUnsigned($buf); } } diff --git a/src/frame/Frame.php b/src/frame/Frame.php index fb30fc3..fb650ec 100644 --- a/src/frame/Frame.php +++ b/src/frame/Frame.php @@ -4,13 +4,14 @@ namespace cooldogedev\spectral\frame; -use pmmp\encoding\ByteBuffer; +use pmmp\encoding\ByteBufferReader; +use pmmp\encoding\ByteBufferWriter; abstract class Frame { abstract public function id(): int; - abstract public function encode(ByteBuffer $buf): void; + abstract public function encode(ByteBufferWriter $buf): void; - abstract public function decode(ByteBuffer $buf): void; + abstract public function decode(ByteBufferReader $buf): void; } diff --git a/src/frame/MTURequest.php b/src/frame/MTURequest.php index 521ed1e..dc68aad 100644 --- a/src/frame/MTURequest.php +++ b/src/frame/MTURequest.php @@ -4,7 +4,9 @@ namespace cooldogedev\spectral\frame; -use pmmp\encoding\ByteBuffer; +use pmmp\encoding\ByteBufferReader; +use pmmp\encoding\ByteBufferWriter; +use pmmp\encoding\LE; use function str_repeat; final class MTURequest extends Frame @@ -23,15 +25,15 @@ public function id(): int return FrameIds::MTU_REQUEST; } - public function encode(ByteBuffer $buf): void + public function encode(ByteBufferWriter $buf): void { - $buf->writeSignedLongLE($this->mtu); + LE::writeSignedLong($buf, $this->mtu); $buf->writeByteArray(str_repeat("\x00", $this->mtu - 8)); } - public function decode(ByteBuffer $buf): void + public function decode(ByteBufferReader $buf): void { - $this->mtu = $buf->readSignedLongLE(); + $this->mtu = LE::readSignedLong($buf); $buf->readByteArray($this->mtu - 8); } } diff --git a/src/frame/MTUResponse.php b/src/frame/MTUResponse.php index 13f53dd..7c4a903 100644 --- a/src/frame/MTUResponse.php +++ b/src/frame/MTUResponse.php @@ -4,7 +4,9 @@ namespace cooldogedev\spectral\frame; -use pmmp\encoding\ByteBuffer; +use pmmp\encoding\ByteBufferReader; +use pmmp\encoding\ByteBufferWriter; +use pmmp\encoding\LE; final class MTUResponse extends Frame { @@ -22,13 +24,13 @@ public function id(): int return FrameIds::MTU_RESPONSE; } - public function encode(ByteBuffer $buf): void + public function encode(ByteBufferWriter $buf): void { - $buf->writeSignedLongLE($this->mtu); + LE::writeSignedLong($buf, $this->mtu); } - public function decode(ByteBuffer $buf): void + public function decode(ByteBufferReader $buf): void { - $this->mtu = $buf->readSignedLongLE(); + $this->mtu = LE::readSignedLong($buf); } } diff --git a/src/frame/Pack.php b/src/frame/Pack.php index 74c38c8..b5de799 100644 --- a/src/frame/Pack.php +++ b/src/frame/Pack.php @@ -5,47 +5,52 @@ namespace cooldogedev\spectral\frame; use cooldogedev\spectral\Protocol; -use pmmp\encoding\ByteBuffer; +use pmmp\encoding\ByteBufferReader; +use pmmp\encoding\ByteBufferWriter; +use pmmp\encoding\LE; +use function strlen; final class Pack { - private static ?ByteBuffer $buf = null; + private static ?ByteBufferWriter $writeBuf = null; public static function packSingle(Frame $fr): string { - $buf = Pack::getBuffer(); - $buf->writeUnsignedIntLE($fr->id()); + $buf = Pack::getWriter(); + LE::writeUnsignedInt($buf, $fr->id()); $fr->encode($buf); - return $buf->toString(); + return $buf->getData(); } public static function pack(int $connectionID, int $sequenceID, string $frames): string { - $buf = Pack::getBuffer(); + $buf = Pack::getWriter(); $buf->writeByteArray(Protocol::MAGIC); - $buf->writeSignedLongLE($connectionID); - $buf->writeUnsignedIntLE($sequenceID); + LE::writeSignedLong($buf, $connectionID); + LE::writeUnsignedInt($buf, $sequenceID); $buf->writeByteArray($frames); - return $buf->toString(); + return $buf->getData(); } public static function unpack(string $payload): ?array { - $buf = Pack::getBuffer(); if (strlen($payload) < Protocol::PACKET_HEADER_SIZE) { return null; } - $buf->writeByteArray($payload); + $buf = new ByteBufferReader($payload); if ($buf->readByteArray(4) !== Protocol::MAGIC) { return null; } - $connectionID = $buf->readSignedLongLE(); - $sequenceID = $buf->readUnsignedIntLE(); +// $connectionID = $buf->readSignedLongLE(); +// $sequenceID = $buf->readUnsignedIntLE(); + $connectionID = LE::readSignedLong($buf); + $sequenceID = LE::readSignedLong($buf); $frames = []; - while ($buf->getUsedLength() > $buf->getReadOffset()) { - $fr = Pool::getFrame($buf->readUnsignedIntLE()); + $len = strlen($payload); + while ($len - $buf->getUnreadLength() > $buf->getOffset()) { + $fr = Pool::getFrame(LE::readUnsignedInt($buf)); if ($fr === null) { break; } @@ -55,14 +60,13 @@ public static function unpack(string $payload): ?array return [$connectionID, $sequenceID, $frames]; } - private static function getBuffer(): ByteBuffer + private static function getWriter(): ByteBufferWriter { - if (Pack::$buf === null) { - Pack::$buf = new ByteBuffer(); + if (Pack::$writeBuf === null) { + Pack::$writeBuf = new ByteBufferWriter(); } - Pack::$buf->setReadOffset(0); - Pack::$buf->setWriteOffset(0); - Pack::$buf->clear(); - return Pack::$buf; + Pack::$writeBuf->setOffset(0); + Pack::$writeBuf->clear(); + return Pack::$writeBuf; } } diff --git a/src/frame/StreamClose.php b/src/frame/StreamClose.php index fb9635b..98be7b5 100644 --- a/src/frame/StreamClose.php +++ b/src/frame/StreamClose.php @@ -4,7 +4,9 @@ namespace cooldogedev\spectral\frame; -use pmmp\encoding\ByteBuffer; +use pmmp\encoding\ByteBufferReader; +use pmmp\encoding\ByteBufferWriter; +use pmmp\encoding\LE; final class StreamClose extends Frame { @@ -22,13 +24,13 @@ public function id(): int return FrameIds::STREAM_CLOSE; } - public function encode(ByteBuffer $buf): void + public function encode(ByteBufferWriter $buf): void { - $buf->writeSignedLongLE($this->streamID); + LE::writeSignedLong($buf, $this->streamID); } - public function decode(ByteBuffer $buf): void + public function decode(ByteBufferReader $buf): void { - $this->streamID = $buf->readSignedLongLE(); + $this->streamID = LE::readSignedLong($buf); } } diff --git a/src/frame/StreamData.php b/src/frame/StreamData.php index d9ccec2..d6a4318 100644 --- a/src/frame/StreamData.php +++ b/src/frame/StreamData.php @@ -4,7 +4,9 @@ namespace cooldogedev\spectral\frame; -use pmmp\encoding\ByteBuffer; +use pmmp\encoding\ByteBufferReader; +use pmmp\encoding\ByteBufferWriter; +use pmmp\encoding\LE; use function strlen; final class StreamData extends Frame @@ -27,18 +29,18 @@ public function id(): int return FrameIds::STREAM_DATA; } - public function encode(ByteBuffer $buf): void + public function encode(ByteBufferWriter $buf): void { - $buf->writeSignedLongLE($this->streamID); - $buf->writeUnsignedIntLE($this->sequenceID); - $buf->writeUnsignedIntLE(strlen($this->payload)); + LE::writeSignedLong($buf, $this->streamID); + LE::writeUnsignedInt($buf, $this->sequenceID); + LE::writeUnsignedInt($buf, strlen($this->payload)); $buf->writeByteArray($this->payload); } - public function decode(ByteBuffer $buf): void + public function decode(ByteBufferReader $buf): void { - $this->streamID = $buf->readSignedLongLE(); - $this->sequenceID = $buf->readUnsignedIntLE(); - $this->payload = $buf->readByteArray($buf->readUnsignedIntLE()); + $this->streamID = LE::readSignedLong($buf); + $this->sequenceID = LE::readUnsignedInt($buf); + $this->payload = $buf->readByteArray(LE::readUnsignedInt($buf)); } } diff --git a/src/frame/StreamRequest.php b/src/frame/StreamRequest.php index 09d3bf1..cc0cd11 100644 --- a/src/frame/StreamRequest.php +++ b/src/frame/StreamRequest.php @@ -4,7 +4,9 @@ namespace cooldogedev\spectral\frame; -use pmmp\encoding\ByteBuffer; +use pmmp\encoding\ByteBufferReader; +use pmmp\encoding\ByteBufferWriter; +use pmmp\encoding\LE; final class StreamRequest extends Frame { @@ -22,13 +24,13 @@ public function id(): int return FrameIds::STREAM_REQUEST; } - public function encode(ByteBuffer $buf): void + public function encode(ByteBufferWriter $buf): void { - $buf->writeSignedLongLE($this->streamID); + LE::writeSignedLong($buf, $this->streamID); } - public function decode(ByteBuffer $buf): void + public function decode(ByteBufferReader $buf): void { - $this->streamID = $buf->readSignedLongLE(); + $this->streamID = LE::readSignedLong($buf); } } diff --git a/src/frame/StreamResponse.php b/src/frame/StreamResponse.php index 1b24b60..fcaa81d 100644 --- a/src/frame/StreamResponse.php +++ b/src/frame/StreamResponse.php @@ -4,7 +4,10 @@ namespace cooldogedev\spectral\frame; -use pmmp\encoding\ByteBuffer; +use pmmp\encoding\Byte; +use pmmp\encoding\ByteBufferReader; +use pmmp\encoding\ByteBufferWriter; +use pmmp\encoding\LE; final class StreamResponse extends Frame { @@ -27,15 +30,15 @@ public function id(): int return FrameIds::STREAM_RESPONSE; } - public function encode(ByteBuffer $buf): void + public function encode(ByteBufferWriter $buf): void { - $buf->writeSignedLongLE($this->streamID); - $buf->writeUnsignedByte($this->response); + LE::writeSignedLong($buf, $this->streamID); + Byte::writeUnsigned($buf, $this->response); } - public function decode(ByteBuffer $buf): void + public function decode(ByteBufferReader $buf): void { - $this->streamID = $buf->readSignedLongLE(); - $this->response = $buf->readUnsignedByte(); + $this->streamID = LE::readSignedLong($buf); + $this->response = Byte::readUnsigned($buf); } } From b736a33d46f9d28beaafaf7850fa3a42dbbd2063 Mon Sep 17 00:00:00 2001 From: alvin0319 Date: Mon, 22 Sep 2025 20:02:05 +0900 Subject: [PATCH 2/3] fix --- src/frame/ConnectionClose.php | 1 + src/frame/Pack.php | 5 +---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/frame/ConnectionClose.php b/src/frame/ConnectionClose.php index 314fd1e..158304c 100644 --- a/src/frame/ConnectionClose.php +++ b/src/frame/ConnectionClose.php @@ -38,6 +38,7 @@ public function encode(ByteBufferWriter $buf): void // $buf->writeUnsignedByte($this->code); // $buf->writeUnsignedIntLE(strlen($this->message)); Byte::writeUnsigned($buf, $this->code); + LE::writeUnsignedInt($buf, strlen($this->message)); $buf->writeByteArray($this->message); } diff --git a/src/frame/Pack.php b/src/frame/Pack.php index b5de799..e318cfa 100644 --- a/src/frame/Pack.php +++ b/src/frame/Pack.php @@ -43,13 +43,10 @@ public static function unpack(string $payload): ?array return null; } -// $connectionID = $buf->readSignedLongLE(); -// $sequenceID = $buf->readUnsignedIntLE(); $connectionID = LE::readSignedLong($buf); $sequenceID = LE::readSignedLong($buf); $frames = []; - $len = strlen($payload); - while ($len - $buf->getUnreadLength() > $buf->getOffset()) { + while ($buf->getUnreadLength() > 0) { $fr = Pool::getFrame(LE::readUnsignedInt($buf)); if ($fr === null) { break; From 847ee7f8be58a14bc296f0ae9edd820c473ecd2e Mon Sep 17 00:00:00 2001 From: alvin0319 Date: Mon, 22 Sep 2025 20:23:47 +0900 Subject: [PATCH 3/3] fix --- src/frame/Pack.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frame/Pack.php b/src/frame/Pack.php index e318cfa..121a621 100644 --- a/src/frame/Pack.php +++ b/src/frame/Pack.php @@ -44,7 +44,7 @@ public static function unpack(string $payload): ?array } $connectionID = LE::readSignedLong($buf); - $sequenceID = LE::readSignedLong($buf); + $sequenceID = LE::readUnsignedInt($buf); $frames = []; while ($buf->getUnreadLength() > 0) { $fr = Pool::getFrame(LE::readUnsignedInt($buf));