99
1010namespace OC \Snowflake ;
1111
12- use OCP \Snowflake \IDecoder ;
13- use OCP \Snowflake \IGenerator ;
12+ use OCP \Snowflake \ISnowflakeDecoder ;
13+ use OCP \Snowflake \ISnowflakeGenerator ;
14+ use OCP \Snowflake \Snowflake ;
1415use Override ;
1516
1617/**
2021 *
2122 * @since 33.0.0
2223 */
23- final class Decoder implements IDecoder {
24+ final class SnowflakeDecoder implements ISnowflakeDecoder {
2425 #[Override]
2526 public function decode (string $ snowflakeId ): array {
2627 if (!ctype_digit ($ snowflakeId )) {
@@ -35,7 +36,7 @@ public function decode(string $snowflakeId): array {
3536 $ data ['createdAt ' ] = new \DateTimeImmutable (
3637 sprintf (
3738 '@%d.%03d ' ,
38- $ data ['seconds ' ] + IGenerator ::TS_OFFSET + intdiv ($ data ['milliseconds ' ], 1000 ),
39+ $ data ['seconds ' ] + ISnowflakeGenerator ::TS_OFFSET + intdiv ($ data ['milliseconds ' ], 1000 ),
3940 $ data ['milliseconds ' ] % 1000 ,
4041 )
4142 );
@@ -51,11 +52,11 @@ private function decode64bits(int $snowflakeId): array {
5152 $ milliseconds = $ secondHalf >> 22 ;
5253
5354 return [
54- 'seconds ' => $ seconds ,
55- 'milliseconds ' => $ milliseconds ,
5655 'serverId ' => ($ secondHalf >> 13 ) & 0x1FF ,
5756 'sequenceId ' => $ secondHalf & 0xFFF ,
5857 'isCli ' => (bool )(($ secondHalf >> 12 ) & 0x1 ),
58+ 'seconds ' => $ seconds ,
59+ 'milliseconds ' => $ milliseconds ,
5960 ];
6061 }
6162
@@ -88,12 +89,12 @@ private function convertBase16(string $decimal): string {
8889 $ hex = '' ;
8990 $ digits = '0123456789ABCDEF ' ;
9091
91- while (strlen ( $ decimal) > 0 && $ decimal !== '0 ' ) {
92+ while ($ decimal !== '' && $ decimal !== '0 ' ) {
9293 $ remainder = 0 ;
9394 $ newDecimal = '' ;
9495
9596 // Perform division by 16 manually for arbitrary precision
96- for ($ i = 0 ; $ i < strlen ($ decimal ); $ i ++) {
97+ for ($ i = 0 , $ iMax = strlen ($ decimal ); $ i < $ iMax ; $ i ++) {
9798 $ digit = (int )$ decimal [$ i ];
9899 $ current = $ remainder * 10 + $ digit ;
99100
@@ -104,7 +105,7 @@ private function convertBase16(string $decimal): string {
104105 } else {
105106 $ remainder = $ current ;
106107 // Only add quotient digit if we already have some digits in result
107- if (strlen ( $ newDecimal) > 0 ) {
108+ if ($ newDecimal !== '' ) {
108109 $ newDecimal .= '0 ' ;
109110 }
110111 }
@@ -119,4 +120,9 @@ private function convertBase16(string $decimal): string {
119120
120121 return str_pad ($ hex , 16 , '0 ' , STR_PAD_LEFT );
121122 }
123+
124+ public function decodeToSnowflake (string $ snowflakeId ): Snowflake {
125+ $ data = $ this ->decode ($ snowflakeId );
126+ return Snowflake::fromArray ($ data );
127+ }
122128}
0 commit comments