summaryrefslogtreecommitdiff
path: root/vendor/aws/aws-sdk-php/src/MultiRegionClient.php
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2022-11-23 21:14:33 +0300
committerAndrew Dolgov <[email protected]>2022-11-23 21:14:33 +0300
commit0c8af4992cb0f7589dcafaad65ada12753c64594 (patch)
tree18e83d068c3e7dd2499331de977782b382279396 /vendor/aws/aws-sdk-php/src/MultiRegionClient.php
initial
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/MultiRegionClient.php')
-rw-r--r--vendor/aws/aws-sdk-php/src/MultiRegionClient.php260
1 files changed, 260 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/MultiRegionClient.php b/vendor/aws/aws-sdk-php/src/MultiRegionClient.php
new file mode 100644
index 0000000..c225e2d
--- /dev/null
+++ b/vendor/aws/aws-sdk-php/src/MultiRegionClient.php
@@ -0,0 +1,260 @@
+<?php
+namespace Aws;
+
+use Aws\Endpoint\PartitionEndpointProvider;
+use Aws\Endpoint\PartitionInterface;
+use Aws\EndpointV2\EndpointProviderV2;
+use Aws\EndpointV2\EndpointDefinitionProvider;
+
+class MultiRegionClient implements AwsClientInterface
+{
+ use AwsClientTrait;
+
+ /** @var AwsClientInterface[] A pool of clients keyed by region. */
+ private $clientPool = [];
+ /** @var callable */
+ private $factory;
+ /** @var PartitionInterface */
+ private $partition;
+ /** @var array */
+ private $args;
+ /** @var array */
+ private $config;
+ /** @var HandlerList */
+ private $handlerList;
+ /** @var array */
+ private $aliases;
+ /** @var callable */
+ private $customHandler;
+
+ public static function getArguments()
+ {
+ $args = array_intersect_key(
+ ClientResolver::getDefaultArguments(),
+ ['service' => true, 'region' => true]
+ );
+ $args['region']['required'] = false;
+
+ return $args + [
+ 'client_factory' => [
+ 'type' => 'config',
+ 'valid' => ['callable'],
+ 'doc' => 'A callable that takes an array of client'
+ . ' configuration arguments and returns a regionalized'
+ . ' client.',
+ 'required' => true,
+ 'internal' => true,
+ 'default' => function (array $args) {
+ $namespace = manifest($args['service'])['namespace'];
+ $klass = "Aws\\{$namespace}\\{$namespace}Client";
+ $region = isset($args['region']) ? $args['region'] : null;
+
+ return function (array $args) use ($klass, $region) {
+ if ($region && empty($args['region'])) {
+ $args['region'] = $region;
+ }
+
+ return new $klass($args);
+ };
+ },
+ ],
+ 'partition' => [
+ 'type' => 'config',
+ 'valid' => ['string', PartitionInterface::class],
+ 'doc' => 'AWS partition to connect to. Valid partitions'
+ . ' include "aws," "aws-cn," and "aws-us-gov." Used to'
+ . ' restrict the scope of the mapRegions method.',
+ 'default' => function (array $args) {
+ $region = isset($args['region']) ? $args['region'] : '';
+ return PartitionEndpointProvider::defaultProvider()
+ ->getPartition($region, $args['service']);
+ },
+ 'fn' => function ($value, array &$args) {
+ if (is_string($value)) {
+ $value = PartitionEndpointProvider::defaultProvider()
+ ->getPartitionByName($value);
+ }
+
+ if (!$value instanceof PartitionInterface) {
+ throw new \InvalidArgumentException('No valid partition'
+ . ' was provided. Provide a concrete partition or'
+ . ' the name of a partition (e.g., "aws," "aws-cn,"'
+ . ' or "aws-us-gov").'
+ );
+ }
+ $ruleset = EndpointDefinitionProvider::getEndpointRuleset(
+ $args['service'],
+ isset($args['version']) ? $args['version'] : 'latest'
+ );
+ $partitions = EndpointDefinitionProvider::getPartitions();
+ $args['endpoint_provider'] = new EndpointProviderV2($ruleset, $partitions);
+ }
+ ],
+ ];
+ }
+
+ /**
+ * The multi-region client constructor accepts the following options:
+ *
+ * - client_factory: (callable) An optional callable that takes an array of
+ * client configuration arguments and returns a regionalized client.
+ * - partition: (Aws\Endpoint\Partition|string) AWS partition to connect to.
+ * Valid partitions include "aws," "aws-cn," and "aws-us-gov." Used to
+ * restrict the scope of the mapRegions method.
+ * - region: (string) Region to connect to when no override is provided.
+ * Used to create the default client factory and determine the appropriate
+ * AWS partition when present.
+ *
+ * @param array $args Client configuration arguments.
+ */
+ public function __construct(array $args = [])
+ {
+ if (!isset($args['service'])) {
+ $args['service'] = $this->parseClass();
+ }
+
+ $this->handlerList = new HandlerList(function (
+ CommandInterface $command
+ ) {
+ list($region, $args) = $this->getRegionFromArgs($command->toArray());
+ $command = $this->getClientFromPool($region)
+ ->getCommand($command->getName(), $args);
+
+ if ($this->isUseCustomHandler()) {
+ $command->getHandlerList()->setHandler($this->customHandler);
+ }
+
+ return $this->executeAsync($command);
+ });
+
+ $argDefinitions = static::getArguments();
+ $resolver = new ClientResolver($argDefinitions);
+ $args = $resolver->resolve($args, $this->handlerList);
+ $this->config = $args['config'];
+ $this->factory = $args['client_factory'];
+ $this->partition = $args['partition'];
+ $this->args = array_diff_key($args, $args['config']);
+ }
+
+ /**
+ * Get the region to which the client is configured to send requests by
+ * default.
+ *
+ * @return string
+ */
+ public function getRegion()
+ {
+ return $this->getClientFromPool()->getRegion();
+ }
+
+ /**
+ * Create a command for an operation name.
+ *
+ * Special keys may be set on the command to control how it behaves,
+ * including:
+ *
+ * - @http: Associative array of transfer specific options to apply to the
+ * request that is serialized for this command. Available keys include
+ * "proxy", "verify", "timeout", "connect_timeout", "debug", "delay", and
+ * "headers".
+ * - @region: The region to which the command should be sent.
+ *
+ * @param string $name Name of the operation to use in the command
+ * @param array $args Arguments to pass to the command
+ *
+ * @return CommandInterface
+ * @throws \InvalidArgumentException if no command can be found by name
+ */
+ public function getCommand($name, array $args = [])
+ {
+ return new Command($name, $args, clone $this->getHandlerList());
+ }
+
+ public function getConfig($option = null)
+ {
+ if (null === $option) {
+ return $this->config;
+ }
+
+ if (isset($this->config[$option])) {
+ return $this->config[$option];
+ }
+
+ return $this->getClientFromPool()->getConfig($option);
+ }
+
+ public function getCredentials()
+ {
+ return $this->getClientFromPool()->getCredentials();
+ }
+
+ public function getHandlerList()
+ {
+ return $this->handlerList;
+ }
+
+ public function getApi()
+ {
+ return $this->getClientFromPool()->getApi();
+ }
+
+ public function getEndpoint()
+ {
+ return $this->getClientFromPool()->getEndpoint();
+ }
+
+ public function useCustomHandler(callable $handler)
+ {
+ $this->customHandler = $handler;
+ }
+
+ private function isUseCustomHandler()
+ {
+ return isset($this->customHandler);
+ }
+
+ /**
+ * @param string $region Omit this argument or pass in an empty string to
+ * allow the configured client factory to apply the
+ * region.
+ *
+ * @return AwsClientInterface
+ */
+ protected function getClientFromPool($region = '')
+ {
+ if (empty($this->clientPool[$region])) {
+ $factory = $this->factory;
+ $this->clientPool[$region] = $factory(
+ array_replace($this->args, array_filter(['region' => $region]))
+ );
+ }
+
+ return $this->clientPool[$region];
+ }
+
+ /**
+ * Parse the class name and return the "service" name of the client.
+ *
+ * @return string
+ */
+ private function parseClass()
+ {
+ $klass = get_class($this);
+
+ if ($klass === __CLASS__) {
+ return '';
+ }
+
+ return strtolower(substr($klass, strrpos($klass, '\\') + 1, -17));
+ }
+
+ private function getRegionFromArgs(array $args)
+ {
+ $region = isset($args['@region'])
+ ? $args['@region']
+ : $this->getRegion();
+ unset($args['@region']);
+
+ return [$region, $args];
+ }
+}