private function doCopy()

in src/Copier.php [153:211]


    private function doCopy(array &$context): GuzzleHttp\Promise\Promise
    {
        return GuzzleHttp\Promise\Coroutine::of(function () use (&$context) {

            // get object meta
            if (!isset($context['meta_prop'])) {
                /**
                 * @var Models\CopyObjectRequest $sourceRequest 
                 */                
                $sourceRequest = $context['request'];
                $request = new Models\HeadObjectRequest();
                Utils::copyRequest($request, $sourceRequest);
                if ($sourceRequest->sourceBucket != null) {
                    $request->bucket = $sourceRequest->sourceBucket;
                }
                $request->key = $sourceRequest->sourceKey;
                $request->versionId = $sourceRequest->sourceVersionId;
                yield $this->client->headObjectAsync($request)->then(
                    function (Models\HeadObjectResult $result) use (&$context) {
                        $context['total_size'] = $result->contentLength;
                        $context['meta_prop'] = $result;
                    },
                );
            }

            self::adjustPartsize($context);

            if ($context['total_size'] <= $context['multipart_copy_threshold']) {
                yield $this->singleCopy($context);
            } else if (self::canUseShallowCopy($context)) {
                // Use singleCopy first, 
                // and then use multipartCopy if you encounter an timeout error
                $ctx_errors = [];
                yield $this->singleCopy($context)->otherwise(
                    function ($reason) use (&$ctx_errors) {
                        $ctx_errors[] = $reason;
                    },
                );

                if (!empty($ctx_errors)) {
                    //TODO yield $this->multipartCopy($context);
                    throw end($ctx_errors);
                }
            } else {
                yield $this->multipartCopy($context);
            }
        })->then(
            function ($result) use (&$context) {
                return $context['copy_result'];
            },
            function ($reason) use (&$context) {
                return GuzzleHttp\Promise\Create::rejectionFor(new Exception\CopyException(
                    $context['upload_id'] ?? '',
                    $context['path'] ?? '',
                    $reason
                ));
            }
        );
    }