1
1
import { SessionData , Store } from "express-session"
2
2
3
- const noop = ( _err ?: unknown , _data ?: any ) => { }
3
+ type Callback = ( _err ?: unknown , _data ?: any ) => any
4
+
5
+ function optionalCb ( err : unknown , data : unknown , cb ?: Callback ) {
6
+ if ( cb ) return cb ( err , data )
7
+ if ( err ) throw err
8
+ return data
9
+ }
4
10
5
11
interface NormalizedRedisClient {
6
12
get ( key : string ) : Promise < string | null >
@@ -96,93 +102,94 @@ export class RedisStore extends Store {
96
102
}
97
103
}
98
104
99
- async get ( sid : string , cb = noop ) {
105
+ async get ( sid : string , cb ?: Callback ) {
100
106
let key = this . prefix + sid
101
107
try {
102
108
let data = await this . client . get ( key )
103
- if ( ! data ) return cb ( )
104
- return cb ( null , await this . serializer . parse ( data ) )
109
+ if ( ! data ) return optionalCb ( null , null , cb )
110
+ return optionalCb ( null , await this . serializer . parse ( data ) , cb )
105
111
} catch ( err ) {
106
- return cb ( err )
112
+ return optionalCb ( err , null , cb )
107
113
}
108
114
}
109
115
110
- async set ( sid : string , sess : SessionData , cb = noop ) {
116
+ async set ( sid : string , sess : SessionData , cb ?: Callback ) {
111
117
let key = this . prefix + sid
112
118
let ttl = this . _getTTL ( sess )
113
119
try {
114
120
if ( ttl > 0 ) {
115
121
let val = this . serializer . stringify ( sess )
116
122
if ( this . disableTTL ) await this . client . set ( key , val )
117
123
else await this . client . set ( key , val , ttl )
118
- return cb ( )
124
+ return optionalCb ( null , null , cb )
119
125
} else {
120
126
return this . destroy ( sid , cb )
121
127
}
122
128
} catch ( err ) {
123
- return cb ( err )
129
+ return optionalCb ( err , null , cb )
124
130
}
125
131
}
126
132
127
- async touch ( sid : string , sess : SessionData , cb = noop ) {
133
+ async touch ( sid : string , sess : SessionData , cb ?: Callback ) {
128
134
let key = this . prefix + sid
129
- if ( this . disableTouch || this . disableTTL ) return cb ( )
135
+ if ( this . disableTouch || this . disableTTL ) return optionalCb ( null , null , cb )
130
136
try {
131
137
await this . client . expire ( key , this . _getTTL ( sess ) )
132
- return cb ( )
138
+ return optionalCb ( null , null , cb )
133
139
} catch ( err ) {
134
- return cb ( err )
140
+ return optionalCb ( err , null , cb )
135
141
}
136
142
}
137
143
138
- async destroy ( sid : string , cb = noop ) {
144
+ async destroy ( sid : string , cb ?: Callback ) {
139
145
let key = this . prefix + sid
140
146
try {
141
147
await this . client . del ( [ key ] )
142
- return cb ( )
148
+ return optionalCb ( null , null , cb )
143
149
} catch ( err ) {
144
- return cb ( err )
150
+ return optionalCb ( err , null , cb )
145
151
}
146
152
}
147
153
148
- async clear ( cb = noop ) {
154
+ async clear ( cb ?: Callback ) {
149
155
try {
150
156
let keys = await this . _getAllKeys ( )
151
- if ( ! keys . length ) return cb ( )
157
+ if ( ! keys . length ) return optionalCb ( null , null , cb )
152
158
await this . client . del ( keys )
153
- return cb ( )
159
+ return optionalCb ( null , null , cb )
154
160
} catch ( err ) {
155
- return cb ( err )
161
+ return optionalCb ( err , null , cb )
156
162
}
157
163
}
158
164
159
- async length ( cb = noop ) {
165
+ async length ( cb ?: Callback ) {
160
166
try {
161
167
let keys = await this . _getAllKeys ( )
162
- return cb ( null , keys . length )
168
+ return optionalCb ( null , keys . length , cb )
163
169
} catch ( err ) {
164
- return cb ( err )
170
+ return optionalCb ( err , null , cb )
165
171
}
166
172
}
167
173
168
- async ids ( cb = noop ) {
174
+ async ids ( cb ?: Callback ) {
169
175
let len = this . prefix . length
170
176
try {
171
177
let keys = await this . _getAllKeys ( )
172
- return cb (
178
+ return optionalCb (
173
179
null ,
174
180
keys . map ( ( k ) => k . substring ( len ) ) ,
181
+ cb ,
175
182
)
176
183
} catch ( err ) {
177
- return cb ( err )
184
+ return optionalCb ( err , null , cb )
178
185
}
179
186
}
180
187
181
- async all ( cb = noop ) {
188
+ async all ( cb ?: Callback ) {
182
189
let len = this . prefix . length
183
190
try {
184
191
let keys = await this . _getAllKeys ( )
185
- if ( keys . length === 0 ) return cb ( null , [ ] )
192
+ if ( keys . length === 0 ) return optionalCb ( null , [ ] , cb )
186
193
187
194
let data = await this . client . mget ( keys )
188
195
let results = data . reduce ( ( acc , raw , idx ) => {
@@ -192,9 +199,9 @@ export class RedisStore extends Store {
192
199
acc . push ( sess )
193
200
return acc
194
201
} , [ ] as SessionData [ ] )
195
- return cb ( null , results )
202
+ return optionalCb ( null , results , cb )
196
203
} catch ( err ) {
197
- return cb ( err )
204
+ return optionalCb ( err , null , cb )
198
205
}
199
206
}
200
207
0 commit comments