Completed
Push — try/statically-access-asset-to... ( e50fad...74c9e7 )
by
unknown
126:59 queued 118:11
created

JSON_Deflate_Array_Codec::decode()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Automattic\Jetpack\Sync;
4
5
use Automattic\Jetpack\Sync\Codec_Interface;
6
7
/**
8
 * An implementation of Automattic\Jetpack\Sync\Codec_Interface that uses gzip's DEFLATE
9
 * algorithm to compress objects serialized using json_encode
10
 */
11
class JSON_Deflate_Array_Codec implements Codec_Interface {
12
	const CODEC_NAME = 'deflate-json-array';
13
14
	public function name() {
15
		return self::CODEC_NAME;
16
	}
17
18
	public function encode( $object ) {
19
		return base64_encode( gzdeflate( $this->json_serialize( $object ) ) );
20
	}
21
22
	public function decode( $input ) {
23
		return $this->json_unserialize( gzinflate( base64_decode( $input ) ) );
24
	}
25
26
	// @see https://gist.github.com/muhqu/820694
27
	protected function json_serialize( $any ) {
28
		if ( function_exists( 'jetpack_json_wrap' ) ) {
29
			return wp_json_encode( jetpack_json_wrap( $any ) );
30
		}
31
		// This prevents fatal error when updating pre 6.0 via the cli command
32
		return wp_json_encode( $this->json_wrap( $any ) );
33
	}
34
35
	protected function json_unserialize( $str ) {
36
		return $this->json_unwrap( json_decode( $str, true ) );
37
	}
38
39 View Code Duplication
	private function json_wrap( &$any, $seen_nodes = array() ) {
40
		if ( is_object( $any ) ) {
41
			$input        = get_object_vars( $any );
42
			$input['__o'] = 1;
43
		} else {
44
			$input = &$any;
45
		}
46
47
		if ( is_array( $input ) ) {
48
			$seen_nodes[] = &$any;
49
50
			$return = array();
51
52
			foreach ( $input as $k => &$v ) {
53
				if ( ( is_array( $v ) || is_object( $v ) ) ) {
54
					if ( in_array( $v, $seen_nodes, true ) ) {
55
						continue;
56
					}
57
					$return[ $k ] = $this->json_wrap( $v, $seen_nodes );
58
				} else {
59
					$return[ $k ] = $v;
60
				}
61
			}
62
63
			return $return;
64
		}
65
66
		return $any;
67
	}
68
69
	private function json_unwrap( $any ) {
70
		if ( is_array( $any ) ) {
71
			foreach ( $any as $k => $v ) {
72
				if ( '__o' === $k ) {
73
					continue;
74
				}
75
				$any[ $k ] = $this->json_unwrap( $v );
76
			}
77
78
			if ( isset( $any['__o'] ) ) {
79
				unset( $any['__o'] );
80
				$any = (object) $any;
81
			}
82
		}
83
84
		return $any;
85
	}
86
}
87