aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/ramsey/uuid/src/Nonstandard
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/ramsey/uuid/src/Nonstandard')
-rw-r--r--vendor/ramsey/uuid/src/Nonstandard/Fields.php133
-rw-r--r--vendor/ramsey/uuid/src/Nonstandard/Uuid.php38
-rw-r--r--vendor/ramsey/uuid/src/Nonstandard/UuidBuilder.php88
-rw-r--r--vendor/ramsey/uuid/src/Nonstandard/UuidV6.php133
4 files changed, 392 insertions, 0 deletions
diff --git a/vendor/ramsey/uuid/src/Nonstandard/Fields.php b/vendor/ramsey/uuid/src/Nonstandard/Fields.php
new file mode 100644
index 000000000..927bc6a26
--- /dev/null
+++ b/vendor/ramsey/uuid/src/Nonstandard/Fields.php
@@ -0,0 +1,133 @@
+<?php
+
+/**
+ * This file is part of the ramsey/uuid library
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @copyright Copyright (c) Ben Ramsey <ben@benramsey.com>
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Nonstandard;
+
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Fields\SerializableFieldsTrait;
+use Ramsey\Uuid\Rfc4122\FieldsInterface;
+use Ramsey\Uuid\Rfc4122\VariantTrait;
+use Ramsey\Uuid\Type\Hexadecimal;
+
+use function bin2hex;
+use function dechex;
+use function hexdec;
+use function sprintf;
+use function str_pad;
+use function strlen;
+use function substr;
+
+use const STR_PAD_LEFT;
+
+/**
+ * Nonstandard UUID fields do not conform to the RFC 4122 standard
+ *
+ * Since some systems may create nonstandard UUIDs, this implements the
+ * Rfc4122\FieldsInterface, so that functionality of a nonstandard UUID is not
+ * degraded, in the event these UUIDs are expected to contain RFC 4122 fields.
+ *
+ * Internally, this class represents the fields together as a 16-byte binary
+ * string.
+ *
+ * @psalm-immutable
+ */
+final class Fields implements FieldsInterface
+{
+ use SerializableFieldsTrait;
+ use VariantTrait;
+
+ /**
+ * @var string
+ */
+ private $bytes;
+
+ /**
+ * @param string $bytes A 16-byte binary string representation of a UUID
+ *
+ * @throws InvalidArgumentException if the byte string is not exactly 16 bytes
+ */
+ public function __construct(string $bytes)
+ {
+ if (strlen($bytes) !== 16) {
+ throw new InvalidArgumentException(
+ 'The byte string must be 16 bytes long; '
+ . 'received ' . strlen($bytes) . ' bytes'
+ );
+ }
+
+ $this->bytes = $bytes;
+ }
+
+ public function getBytes(): string
+ {
+ return $this->bytes;
+ }
+
+ public function getClockSeq(): Hexadecimal
+ {
+ $clockSeq = hexdec(bin2hex(substr($this->bytes, 8, 2))) & 0x3fff;
+
+ return new Hexadecimal(str_pad(dechex($clockSeq), 4, '0', STR_PAD_LEFT));
+ }
+
+ public function getClockSeqHiAndReserved(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 8, 1)));
+ }
+
+ public function getClockSeqLow(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 9, 1)));
+ }
+
+ public function getNode(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 10)));
+ }
+
+ public function getTimeHiAndVersion(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 6, 2)));
+ }
+
+ public function getTimeLow(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 0, 4)));
+ }
+
+ public function getTimeMid(): Hexadecimal
+ {
+ return new Hexadecimal(bin2hex(substr($this->bytes, 4, 2)));
+ }
+
+ public function getTimestamp(): Hexadecimal
+ {
+ return new Hexadecimal(sprintf(
+ '%03x%04s%08s',
+ hexdec($this->getTimeHiAndVersion()->toString()) & 0x0fff,
+ $this->getTimeMid()->toString(),
+ $this->getTimeLow()->toString()
+ ));
+ }
+
+ public function getVersion(): ?int
+ {
+ return null;
+ }
+
+ public function isNil(): bool
+ {
+ return false;
+ }
+}
diff --git a/vendor/ramsey/uuid/src/Nonstandard/Uuid.php b/vendor/ramsey/uuid/src/Nonstandard/Uuid.php
new file mode 100644
index 000000000..5a7a33347
--- /dev/null
+++ b/vendor/ramsey/uuid/src/Nonstandard/Uuid.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * This file is part of the ramsey/uuid library
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @copyright Copyright (c) Ben Ramsey <ben@benramsey.com>
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Nonstandard;
+
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Uuid as BaseUuid;
+use Ramsey\Uuid\UuidInterface;
+
+/**
+ * Nonstandard\Uuid is a UUID that doesn't conform to RFC 4122
+ *
+ * @psalm-immutable
+ */
+final class Uuid extends BaseUuid implements UuidInterface
+{
+ public function __construct(
+ Fields $fields,
+ NumberConverterInterface $numberConverter,
+ CodecInterface $codec,
+ TimeConverterInterface $timeConverter
+ ) {
+ parent::__construct($fields, $numberConverter, $codec, $timeConverter);
+ }
+}
diff --git a/vendor/ramsey/uuid/src/Nonstandard/UuidBuilder.php b/vendor/ramsey/uuid/src/Nonstandard/UuidBuilder.php
new file mode 100644
index 000000000..0c8927738
--- /dev/null
+++ b/vendor/ramsey/uuid/src/Nonstandard/UuidBuilder.php
@@ -0,0 +1,88 @@
+<?php
+
+/**
+ * This file is part of the ramsey/uuid library
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @copyright Copyright (c) Ben Ramsey <ben@benramsey.com>
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Nonstandard;
+
+use Ramsey\Uuid\Builder\UuidBuilderInterface;
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Exception\UnableToBuildUuidException;
+use Ramsey\Uuid\UuidInterface;
+use Throwable;
+
+/**
+ * Nonstandard\UuidBuilder builds instances of Nonstandard\Uuid
+ *
+ * @psalm-immutable
+ */
+class UuidBuilder implements UuidBuilderInterface
+{
+ /**
+ * @var NumberConverterInterface
+ */
+ private $numberConverter;
+
+ /**
+ * @var TimeConverterInterface
+ */
+ private $timeConverter;
+
+ /**
+ * @param NumberConverterInterface $numberConverter The number converter to
+ * use when constructing the Nonstandard\Uuid
+ * @param TimeConverterInterface $timeConverter The time converter to use
+ * for converting timestamps extracted from a UUID to Unix timestamps
+ */
+ public function __construct(
+ NumberConverterInterface $numberConverter,
+ TimeConverterInterface $timeConverter
+ ) {
+ $this->numberConverter = $numberConverter;
+ $this->timeConverter = $timeConverter;
+ }
+
+ /**
+ * Builds and returns a Nonstandard\Uuid
+ *
+ * @param CodecInterface $codec The codec to use for building this instance
+ * @param string $bytes The byte string from which to construct a UUID
+ *
+ * @return Uuid The Nonstandard\UuidBuilder returns an instance of
+ * Nonstandard\Uuid
+ *
+ * @psalm-pure
+ */
+ public function build(CodecInterface $codec, string $bytes): UuidInterface
+ {
+ try {
+ return new Uuid(
+ $this->buildFields($bytes),
+ $this->numberConverter,
+ $codec,
+ $this->timeConverter
+ );
+ } catch (Throwable $e) {
+ throw new UnableToBuildUuidException($e->getMessage(), (int) $e->getCode(), $e);
+ }
+ }
+
+ /**
+ * Proxy method to allow injecting a mock, for testing
+ */
+ protected function buildFields(string $bytes): Fields
+ {
+ return new Fields($bytes);
+ }
+}
diff --git a/vendor/ramsey/uuid/src/Nonstandard/UuidV6.php b/vendor/ramsey/uuid/src/Nonstandard/UuidV6.php
new file mode 100644
index 000000000..05586b3eb
--- /dev/null
+++ b/vendor/ramsey/uuid/src/Nonstandard/UuidV6.php
@@ -0,0 +1,133 @@
+<?php
+
+/**
+ * This file is part of the ramsey/uuid library
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ *
+ * @copyright Copyright (c) Ben Ramsey <ben@benramsey.com>
+ * @license http://opensource.org/licenses/MIT MIT
+ */
+
+declare(strict_types=1);
+
+namespace Ramsey\Uuid\Nonstandard;
+
+use DateTimeImmutable;
+use DateTimeInterface;
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Exception\DateTimeException;
+use Ramsey\Uuid\Exception\InvalidArgumentException;
+use Ramsey\Uuid\Lazy\LazyUuidFromString;
+use Ramsey\Uuid\Rfc4122\FieldsInterface as Rfc4122FieldsInterface;
+use Ramsey\Uuid\Rfc4122\UuidInterface;
+use Ramsey\Uuid\Rfc4122\UuidV1;
+use Ramsey\Uuid\Uuid;
+use Throwable;
+
+use function hex2bin;
+use function str_pad;
+use function substr;
+
+use const STR_PAD_LEFT;
+
+/**
+ * Ordered-time, or version 6, UUIDs include timestamp, clock sequence, and node
+ * values that are combined into a 128-bit unsigned integer
+ *
+ * @link https://github.com/uuid6/uuid6-ietf-draft UUID version 6 IETF draft
+ * @link http://gh.peabody.io/uuidv6/ "Version 6" UUIDs
+ *
+ * @psalm-immutable
+ */
+final class UuidV6 extends Uuid implements UuidInterface
+{
+ /**
+ * Creates a version 6 (time-based) UUID
+ *
+ * @param Rfc4122FieldsInterface $fields The fields from which to construct a UUID
+ * @param NumberConverterInterface $numberConverter The number converter to use
+ * for converting hex values to/from integers
+ * @param CodecInterface $codec The codec to use when encoding or decoding
+ * UUID strings
+ * @param TimeConverterInterface $timeConverter The time converter to use
+ * for converting timestamps extracted from a UUID to unix timestamps
+ */
+ public function __construct(
+ Rfc4122FieldsInterface $fields,
+ NumberConverterInterface $numberConverter,
+ CodecInterface $codec,
+ TimeConverterInterface $timeConverter
+ ) {
+ if ($fields->getVersion() !== Uuid::UUID_TYPE_PEABODY) {
+ throw new InvalidArgumentException(
+ 'Fields used to create a UuidV6 must represent a '
+ . 'version 6 (ordered-time) UUID'
+ );
+ }
+
+ parent::__construct($fields, $numberConverter, $codec, $timeConverter);
+ }
+
+ /**
+ * Returns a DateTimeInterface object representing the timestamp associated
+ * with the UUID
+ *
+ * @return DateTimeImmutable A PHP DateTimeImmutable instance representing
+ * the timestamp of a version 6 UUID
+ */
+ public function getDateTime(): DateTimeInterface
+ {
+ $time = $this->timeConverter->convertTime($this->fields->getTimestamp());
+
+ try {
+ return new DateTimeImmutable(
+ '@'
+ . $time->getSeconds()->toString()
+ . '.'
+ . str_pad($time->getMicroseconds()->toString(), 6, '0', STR_PAD_LEFT)
+ );
+ } catch (Throwable $e) {
+ throw new DateTimeException($e->getMessage(), (int) $e->getCode(), $e);
+ }
+ }
+
+ /**
+ * Converts this UUID into an instance of a version 1 UUID
+ */
+ public function toUuidV1(): UuidV1
+ {
+ $hex = $this->getHex()->toString();
+ $hex = substr($hex, 7, 5)
+ . substr($hex, 13, 3)
+ . substr($hex, 3, 4)
+ . '1' . substr($hex, 0, 3)
+ . substr($hex, 16);
+
+ /** @var LazyUuidFromString $uuid */
+ $uuid = Uuid::fromBytes((string) hex2bin($hex));
+
+ return $uuid->toUuidV1();
+ }
+
+ /**
+ * Converts a version 1 UUID into an instance of a version 6 UUID
+ */
+ public static function fromUuidV1(UuidV1 $uuidV1): UuidV6
+ {
+ $hex = $uuidV1->getHex()->toString();
+ $hex = substr($hex, 13, 3)
+ . substr($hex, 8, 4)
+ . substr($hex, 0, 5)
+ . '6' . substr($hex, 5, 3)
+ . substr($hex, 16);
+
+ /** @var LazyUuidFromString $uuid */
+ $uuid = Uuid::fromBytes((string) hex2bin($hex));
+
+ return $uuid->toUuidV6();
+ }
+}