22
33namespace React \Dns \Query ;
44
5+ use React \Cache \CacheInterface ;
56use React \Dns \Model \Message ;
67use React \Dns \Model \Record ;
8+ use React \Promise \When ;
79
810class RecordCache
911{
10- private $ records = array ();
12+ private $ cache ;
13+ private $ expiredAt ;
14+
15+ public function __construct (CacheInterface $ cache )
16+ {
17+ $ this ->cache = $ cache ;
18+ }
1119
1220 public function lookup (Query $ query )
1321 {
1422 $ id = $ this ->serializeQueryToIdentity ($ query );
15- $ records = isset ($ this ->records [$ id ]) ? $ this ->records [$ id ]->all () : array ();
1623
17- return $ records ;
24+ $ expiredAt = $ this ->expiredAt ;
25+
26+ return $ this ->cache
27+ ->get ($ id )
28+ ->then (function ($ value ) use ($ query , $ expiredAt ) {
29+ $ recordBag = unserialize ($ value );
30+
31+ if (null !== $ expiredAt && $ expiredAt <= $ query ->currentTime ) {
32+ return When::reject ();
33+ }
34+
35+ return $ recordBag ->all ();
36+ });
1837 }
1938
2039 public function storeResponseMessage ($ currentTime , Message $ message )
@@ -27,15 +46,28 @@ public function storeResponseMessage($currentTime, Message $message)
2746 public function storeRecord ($ currentTime , Record $ record )
2847 {
2948 $ id = $ this ->serializeRecordToIdentity ($ record );
30- $ this ->records [$ id ] = isset ($ this ->records [$ id ]) ? $ this ->records [$ id ] : new RecordBag ();
31- $ this ->records [$ id ]->set ($ currentTime , $ record );
49+
50+ $ cache = $ this ->cache ;
51+
52+ $ this ->cache
53+ ->get ($ id )
54+ ->then (
55+ function ($ value ) {
56+ return unserialize ($ value );
57+ },
58+ function ($ e ) {
59+ return new RecordBag ();
60+ }
61+ )
62+ ->then (function ($ recordBag ) use ($ id , $ currentTime , $ record , $ cache ) {
63+ $ recordBag ->set ($ currentTime , $ record );
64+ $ cache ->set ($ id , serialize ($ recordBag ));
65+ });
3266 }
3367
3468 public function expire ($ currentTime )
3569 {
36- foreach ($ this ->records as $ recordBag ) {
37- $ recordBag ->expire ($ currentTime );
38- }
70+ $ this ->expiredAt = $ currentTime ;
3971 }
4072
4173 public function serializeQueryToIdentity (Query $ query )
0 commit comments