1
- import type { PrivateSessionId , Session } from "socket.io-adapter" ;
2
- import { decode , encode } from "@msgpack/msgpack" ;
3
1
import {
4
- ClusterAdapter ,
5
- ClusterAdapterOptions ,
6
- ClusterMessage ,
7
- MessageType ,
8
- } from "./cluster-adapter" ;
2
+ ClusterAdapterWithHeartbeat ,
3
+ type ClusterMessage ,
4
+ type PrivateSessionId ,
5
+ type Session ,
6
+ type ServerId ,
7
+ type ClusterResponse ,
8
+ } from "socket.io-adapter" ;
9
+ import { decode , encode } from "@msgpack/msgpack" ;
9
10
import debugModule from "debug" ;
10
11
import { hasBinary , XADD , XREAD } from "./util" ;
11
12
12
13
const debug = debugModule ( "socket.io-redis-streams-adapter" ) ;
13
14
14
15
const RESTORE_SESSION_MAX_XRANGE_CALLS = 100 ;
15
16
16
- export interface RedisStreamsAdapterOptions extends ClusterAdapterOptions {
17
+ // TODO ClusterAdapterOptions should be exported by the socket.io-adapter package
18
+ interface ClusterAdapterOptions {
19
+ /**
20
+ * The number of ms between two heartbeats.
21
+ * @default 5_000
22
+ */
23
+ heartbeatInterval ?: number ;
24
+ /**
25
+ * The number of ms without heartbeat before we consider a node down.
26
+ * @default 10_000
27
+ */
28
+ heartbeatTimeout ?: number ;
29
+ }
30
+
31
+ export interface RedisStreamsAdapterOptions {
17
32
/**
18
33
* The name of the Redis stream.
19
34
*/
@@ -45,7 +60,7 @@ interface RawClusterMessage {
45
60
*/
46
61
export function createAdapter (
47
62
redisClient : any ,
48
- opts ?: RedisStreamsAdapterOptions
63
+ opts ?: RedisStreamsAdapterOptions & ClusterAdapterOptions
49
64
) {
50
65
const namespaceToAdapters = new Map < string , RedisStreamsAdapter > ( ) ;
51
66
const options = Object . assign (
@@ -122,16 +137,20 @@ export function createAdapter(
122
137
} ;
123
138
}
124
139
125
- class RedisStreamsAdapter extends ClusterAdapter {
140
+ class RedisStreamsAdapter extends ClusterAdapterWithHeartbeat {
126
141
readonly #redisClient: any ;
127
142
readonly #opts: Required < RedisStreamsAdapterOptions > ;
128
143
129
- constructor ( nsp , redisClient , opts : Required < RedisStreamsAdapterOptions > ) {
144
+ constructor (
145
+ nsp ,
146
+ redisClient ,
147
+ opts : Required < RedisStreamsAdapterOptions > & ClusterAdapterOptions
148
+ ) {
130
149
super ( nsp , opts ) ;
131
150
this . #redisClient = redisClient ;
132
151
this . #opts = opts ;
133
152
134
- this . initHeartbeat ( ) ;
153
+ this . init ( ) ;
135
154
}
136
155
137
156
override doPublish ( message : ClusterMessage ) {
@@ -145,25 +164,38 @@ class RedisStreamsAdapter extends ClusterAdapter {
145
164
) ;
146
165
}
147
166
167
+ protected doPublishResponse (
168
+ requesterUid : ServerId ,
169
+ response : ClusterResponse
170
+ ) : Promise < void > {
171
+ // @ts -ignore
172
+ return this . doPublish ( response ) ;
173
+ }
174
+
148
175
static encode ( message : ClusterMessage ) : RawClusterMessage {
149
176
const rawMessage : RawClusterMessage = {
150
177
uid : message . uid ,
151
178
nsp : message . nsp ,
152
179
type : message . type . toString ( ) ,
153
180
} ;
154
181
182
+ // @ts -ignore
155
183
if ( message . data ) {
184
+ // TODO MessageType should be exported by the socket.io-adapter package
156
185
const mayContainBinary = [
157
- MessageType . BROADCAST ,
158
- MessageType . BROADCAST_ACK ,
159
- MessageType . FETCH_SOCKETS_RESPONSE ,
160
- MessageType . SERVER_SIDE_EMIT ,
161
- MessageType . SERVER_SIDE_EMIT_RESPONSE ,
186
+ 3 , // MessageType.BROADCAST,
187
+ 8 , // MessageType.FETCH_SOCKETS_RESPONSE ,
188
+ 9 , // MessageType.SERVER_SIDE_EMIT ,
189
+ 10 , // MessageType.SERVER_SIDE_EMIT_RESPONSE ,
190
+ 12 , // MessageType.BROADCAST_ACK ,
162
191
] . includes ( message . type ) ;
163
192
193
+ // @ts -ignore
164
194
if ( mayContainBinary && hasBinary ( message . data ) ) {
195
+ // @ts -ignore
165
196
rawMessage . data = Buffer . from ( encode ( message . data ) ) . toString ( "base64" ) ;
166
197
} else {
198
+ // @ts -ignore
167
199
rawMessage . data = JSON . stringify ( message . data ) ;
168
200
}
169
201
}
@@ -191,8 +223,10 @@ class RedisStreamsAdapter extends ClusterAdapter {
191
223
192
224
if ( rawMessage . data ) {
193
225
if ( rawMessage . data . startsWith ( "{" ) ) {
226
+ // @ts -ignore
194
227
message . data = JSON . parse ( rawMessage . data ) ;
195
228
} else {
229
+ // @ts -ignore
196
230
message . data = decode ( Buffer . from ( rawMessage . data , "base64" ) ) as Record <
197
231
string ,
198
232
unknown
@@ -261,6 +295,7 @@ class RedisStreamsAdapter extends ClusterAdapter {
261
295
if ( entry . message . nsp === this . nsp . name && entry . message . type === "3" ) {
262
296
const message = RedisStreamsAdapter . decode ( entry . message ) ;
263
297
298
+ // @ts -ignore
264
299
if ( shouldIncludePacket ( session . rooms , message . data . opts ) ) {
265
300
// @ts -ignore
266
301
session . missedPackets . push ( message . data . packet . data ) ;
0 commit comments