diff --git a/src/danog/MadelineProto/MTProtoTools/Files.php b/src/danog/MadelineProto/MTProtoTools/Files.php index 32e2bb29..96ff6ff5 100644 --- a/src/danog/MadelineProto/MTProtoTools/Files.php +++ b/src/danog/MadelineProto/MTProtoTools/Files.php @@ -410,6 +410,12 @@ trait Files * @var Deferred[] */ private $read = []; + /** + * Read promises (write lenth). + * + * @var int[] + */ + private $wrote = []; /** * Write promises. * @@ -476,6 +482,7 @@ trait Files { $offset /= $this->partSize; $this->write[$offset]->resolve($data); + $this->wrote[$offset] = strlen($data); return $this->read[$offset]->promise(); } /** @@ -487,7 +494,8 @@ trait Files */ public function callback(...$params): void { - $this->read[$this->offset++]->resolve(); + $offset = $this->offset++; + $this->read[$offset]->resolve($this->wrote[$offset]); if ($this->cb) { Tools::callFork(($this->cb)(...$params)); } @@ -1079,6 +1087,7 @@ trait Files $this->logger->logger('Waiting for lock of file to download...'); $unlock = yield \danog\MadelineProto\Tools::flock($file, LOCK_EX); + $this->logger->logger('Got lock of file to download'); try { yield $this->downloadToStream($message_media, $stream, $cb, $size, -1); @@ -1262,16 +1271,17 @@ trait Files if ($res) { $size += $res; } - return (bool) $res; }); $promises[] = $previous_promise; if (!($key % $parallel_chunks)) { // 20 mb at a time, for a typical bandwidth of 1gbps - $res = array_sum(yield \danog\MadelineProto\Tools::all($promises)); - if ($res !== count($promises)) { - $promises = []; - break; + $res = yield \danog\MadelineProto\Tools::all($promises); + $promises = []; + foreach ($res as $r) { + if (!$r) { + break 2; + } } $time = \microtime(true) - $start; @@ -1393,6 +1403,8 @@ trait Files } continue; } + $res['bytes'] = (string) $res['bytes']; + if ($cdn === false && $res['type']['_'] === 'storage.fileUnknown' && $res['bytes'] === '') { $datacenter = 0; } @@ -1423,7 +1435,7 @@ trait Files if (!$seekable) { yield $offset['previous_promise']; } - $res = yield $callable((string) $res['bytes'], $offset['offset'] + $offset['part_start_at']); + $res = yield $callable($res['bytes'], $offset['offset'] + $offset['part_start_at']); $cb(); return $res; } while (true); diff --git a/tests/testing.php b/tests/testing.php index 61f493a4..bd0010c7 100755 --- a/tests/testing.php +++ b/tests/testing.php @@ -101,11 +101,11 @@ $MadelineProto->loop(function () use ($MadelineProto) { if (!\getenv('TRAVIS_COMMIT') && \stripos(yield $MadelineProto->readline('Do you want to make a call? (y/n): '), 'y') !== false) { $controller = yield $MadelineProto->requestCall(\getenv('TEST_SECRET_CHAT'))->play('input.raw')->then('input.raw')->playOnHold(['input.raw'])->setOutputFile('output.raw'); while ($controller->getCallState() < \danog\MadelineProto\VoIP::CALL_STATE_READY) { - yield $MadelineProto->getUpdates(); + yield $MadelineProto->sleep(1); } $MadelineProto->logger($controller->configuration); while ($controller->getCallState() < \danog\MadelineProto\VoIP::CALL_STATE_ENDED) { - yield $MadelineProto->getUpdates(); + yield $MadelineProto->sleep(1); } } @@ -273,10 +273,15 @@ var_dump(time()-$t); foreach ($media as $type => $inputMedia) { $MadelineProto->logger("Sending $type"); - $type = yield $MadelineProto->messages->sendMedia(['peer' => $peer, 'media' => $inputMedia, 'message' => '['.$message.'](mention:'.$mention.')', 'parse_mode' => 'markdown']); - yield $MadelineProto->downloadToDir($media = yield $MadelineProto->messages->uploadMedia(['peer' => '@me', 'media' => $inputMedia]), '/tmp'); + yield $MadelineProto->messages->sendMedia(['peer' => $peer, 'media' => $inputMedia, 'message' => '['.$message.'](mention:'.$mention.')', 'parse_mode' => 'markdown']); + $MadelineProto->logger("Uploading $type"); + $media = yield $MadelineProto->messages->uploadMedia(['peer' => '@me', 'media' => $inputMedia]); + $MadelineProto->logger("Downloading $type"); + yield $MadelineProto->downloadToDir($media, '/tmp'); + $MadelineProto->logger("Re-sending $type"); $inputMedia['file'] = $media; yield $MadelineProto->messages->uploadMedia(['peer' => '@me', 'media' => $inputMedia]); + $MadelineProto->logger("Done $type"); } }