@@ -5,146 +5,146 @@ const Q = require('q');
55const DataLoader = require ( 'dataloader' ) ;
66
77module . exports = fig => {
8- const redis = fig . redis ;
9-
10- const parse = ( resp , opt ) => Q . Promise ( ( resolve , reject ) => {
11- try {
12- if ( resp === '' || resp === null ) {
13- resolve ( resp ) ;
14- }
15- else if ( opt . deserialize ) {
16- resolve ( opt . deserialize ( resp ) ) ;
17- }
18- else {
19- resolve ( JSON . parse ( resp ) ) ;
20- }
21- }
22- catch ( err ) {
23- reject ( err ) ;
8+ const redis = fig . redis ;
9+
10+ const parse = ( resp , opt ) =>
11+ Q . Promise ( ( resolve , reject ) => {
12+ try {
13+ if ( resp === '' || resp === null ) {
14+ resolve ( resp ) ;
15+ } else if ( opt . deserialize ) {
16+ resolve ( opt . deserialize ( resp ) ) ;
17+ } else {
18+ resolve ( JSON . parse ( resp ) ) ;
2419 }
20+ } catch ( err ) {
21+ reject ( err ) ;
22+ }
2523 } ) ;
2624
27- const toString = ( val , opt ) => {
28- if ( val === null ) {
29- return Q ( '' ) ;
30- }
31- else if ( opt . serialize ) {
32- return Q ( opt . serialize ( val ) ) ;
33- }
34- else if ( _ . isObject ( val ) ) {
35- return Q ( JSON . stringify ( val ) ) ;
36- }
37- else {
38- return Q . reject ( new Error ( 'Must be Object or Null' ) ) ;
39- }
40- } ;
41-
42- const makeKey = ( keySpace , key ) => `${ keySpace } :${ key } ` ;
43-
44- const rSetAndGet = ( keySpace , key , rawVal , opt ) => toString ( rawVal , opt )
45- . then ( val => Q . Promise ( ( resolve , reject ) => {
25+ const toString = ( val , opt ) => {
26+ if ( val === null ) {
27+ return Q ( '' ) ;
28+ } else if ( opt . serialize ) {
29+ return Q ( opt . serialize ( val ) ) ;
30+ } else if ( _ . isObject ( val ) ) {
31+ return Q ( JSON . stringify ( val ) ) ;
32+ } else {
33+ return Q . reject ( new Error ( 'Must be Object or Null' ) ) ;
34+ }
35+ } ;
36+
37+ const makeKey = ( keySpace , key ) => `${ keySpace } :${ key } ` ;
38+
39+ const rSetAndGet = ( keySpace , key , rawVal , opt ) =>
40+ toString ( rawVal , opt ) . then ( val =>
41+ Q . Promise ( ( resolve , reject ) => {
4642 const fullKey = makeKey ( keySpace , key ) ;
4743 const multi = redis . multi ( ) ;
4844 multi . set ( fullKey , val ) ;
49- if ( opt . expire ) {
50- multi . expire ( fullKey , opt . expire ) ;
45+ if ( opt . expire ) {
46+ multi . expire ( fullKey , opt . expire ) ;
5147 }
5248 multi . get ( fullKey ) ;
53- multi . exec ( ( err , replies ) => err ?
54- reject ( err ) : parse ( _ . last ( replies ) , opt ) . then ( resolve )
49+ multi . exec (
50+ ( err , replies ) =>
51+ err ? reject ( err ) : parse ( _ . last ( replies ) , opt ) . then ( resolve )
5552 ) ;
56- } ) ) ;
57-
58- const rGet = ( keySpace , key , opt ) => Q . Promise (
59- ( resolve , reject ) => redis . get (
60- makeKey ( keySpace , key ) ,
61- ( err , result ) => err ? reject ( err ) : parse ( result , opt ) . then ( resolve )
62- )
53+ } )
6354 ) ;
6455
65- const rMGet = ( keySpace , keys , opt ) => Q . Promise (
66- ( resolve , reject ) => redis . mget (
67- _ . map ( keys , k => makeKey ( keySpace , k ) ) ,
68- ( err , results ) => err ?
69- reject ( err ) :
70- Q . all ( _ . map ( results , r => parse ( r , opt ) ) ) . then ( resolve )
71- )
56+ const rGet = ( keySpace , key , opt ) =>
57+ Q . Promise ( ( resolve , reject ) =>
58+ redis . get (
59+ makeKey ( keySpace , key ) ,
60+ ( err , result ) => ( err ? reject ( err ) : parse ( result , opt ) . then ( resolve ) )
61+ )
7262 ) ;
7363
74- const rDel = ( keySpace , key ) => Q . Promise ( ( resolve , reject ) => redis . del (
75- makeKey ( keySpace , key ) , ( err , resp ) => err ? reject ( err ) : resolve ( resp )
76- ) ) ;
77-
78- return class RedisDataLoader {
79- constructor ( ks , userLoader , opt ) {
80- const customOptions = [ 'expire' , 'serialize' , 'deserialize' ] ;
81- this . opt = _ . pick ( opt , customOptions ) || { } ;
82- this . keySpace = ks ;
83- this . loader = new DataLoader (
84- keys => rMGet ( this . keySpace , keys , this . opt )
85- . then ( results => Q . all ( _ . map (
86- results ,
87- ( v , i ) => {
88- if ( v === '' ) {
89- return Q ( null ) ;
90- }
91- else if ( v === null ) {
92- return userLoader . load ( keys [ i ] )
93- . then ( resp => rSetAndGet (
94- this . keySpace , keys [ i ] , resp , this . opt
95- ) )
96- . then ( r => r === '' ? null : r ) ;
97- }
98- else {
99- return Q ( v ) ;
100- }
101- }
102- ) ) ) ,
103- _ . omit ( opt , customOptions )
104- ) ;
105- }
106-
107- load ( key ) {
108- return key ?
109- Q ( this . loader . load ( key ) ) :
110- Q . reject ( new TypeError ( 'key parameter is required' ) ) ;
111- }
112-
113- loadMany ( keys ) {
114- return keys ?
115- Q ( this . loader . loadMany ( keys ) ) :
116- Q . reject ( new TypeError ( 'keys parameter is required' ) ) ;
117- }
118-
119- prime ( key , val ) {
120- if ( ! key ) {
121- return Q . reject ( new TypeError ( 'key parameter is required' ) ) ;
122- }
123- else if ( val === undefined ) {
124- return Q . reject ( new TypeError ( 'value parameter is required' ) ) ;
125- }
126- else {
127- return rSetAndGet ( this . keySpace , key , val , this . opt )
128- . then ( r => {
129- this . loader . clear ( key )
130- . prime ( key , r === '' ? null : r ) ;
131- } ) ;
132- }
133- }
134-
135- clear ( key ) {
136- return key ?
137- rDel ( this . keySpace , key ) . then ( ( ) => this . loader . clear ( key ) ) :
138- Q . reject ( new TypeError ( 'key parameter is required' ) ) ;
139- }
64+ const rMGet = ( keySpace , keys , opt ) =>
65+ Q . Promise ( ( resolve , reject ) =>
66+ redis . mget (
67+ _ . map ( keys , k => makeKey ( keySpace , k ) ) ,
68+ ( err , results ) =>
69+ err
70+ ? reject ( err )
71+ : Q . all ( _ . map ( results , r => parse ( r , opt ) ) ) . then ( resolve )
72+ )
73+ ) ;
14074
141- clearAllLocal ( ) {
142- return Q ( this . loader . clearAll ( ) ) ;
143- }
75+ const rDel = ( keySpace , key ) =>
76+ Q . Promise ( ( resolve , reject ) =>
77+ redis . del (
78+ makeKey ( keySpace , key ) ,
79+ ( err , resp ) => ( err ? reject ( err ) : resolve ( resp ) )
80+ )
81+ ) ;
14482
145- clearLocal ( key ) {
146- return Q ( this . loader . clear ( key ) ) ;
147- }
148- } ;
83+ return class RedisDataLoader {
84+ constructor ( ks , userLoader , opt ) {
85+ const customOptions = [ 'expire' , 'serialize' , 'deserialize' ] ;
86+ this . opt = _ . pick ( opt , customOptions ) || { } ;
87+ this . keySpace = ks ;
88+ this . loader = new DataLoader (
89+ keys =>
90+ rMGet ( this . keySpace , keys , this . opt ) . then ( results =>
91+ Q . all (
92+ _ . map ( results , ( v , i ) => {
93+ if ( v === '' ) {
94+ return Q ( null ) ;
95+ } else if ( v === null ) {
96+ return userLoader
97+ . load ( keys [ i ] )
98+ . then ( resp =>
99+ rSetAndGet ( this . keySpace , keys [ i ] , resp , this . opt )
100+ )
101+ . then ( r => ( r === '' ? null : r ) ) ;
102+ } else {
103+ return Q ( v ) ;
104+ }
105+ } )
106+ )
107+ ) ,
108+ _ . omit ( opt , customOptions )
109+ ) ;
110+ }
111+
112+ load ( key ) {
113+ return key
114+ ? Q ( this . loader . load ( key ) )
115+ : Q . reject ( new TypeError ( 'key parameter is required' ) ) ;
116+ }
117+
118+ loadMany ( keys ) {
119+ return keys
120+ ? Q ( this . loader . loadMany ( keys ) )
121+ : Q . reject ( new TypeError ( 'keys parameter is required' ) ) ;
122+ }
123+
124+ prime ( key , val ) {
125+ if ( ! key ) {
126+ return Q . reject ( new TypeError ( 'key parameter is required' ) ) ;
127+ } else if ( val === undefined ) {
128+ return Q . reject ( new TypeError ( 'value parameter is required' ) ) ;
129+ } else {
130+ return rSetAndGet ( this . keySpace , key , val , this . opt ) . then ( r => {
131+ this . loader . clear ( key ) . prime ( key , r === '' ? null : r ) ;
132+ } ) ;
133+ }
134+ }
135+
136+ clear ( key ) {
137+ return key
138+ ? rDel ( this . keySpace , key ) . then ( ( ) => this . loader . clear ( key ) )
139+ : Q . reject ( new TypeError ( 'key parameter is required' ) ) ;
140+ }
141+
142+ clearAllLocal ( ) {
143+ return Q ( this . loader . clearAll ( ) ) ;
144+ }
145+
146+ clearLocal ( key ) {
147+ return Q ( this . loader . clear ( key ) ) ;
148+ }
149+ } ;
149150} ;
150-
0 commit comments