@@ -2,6 +2,7 @@ import { EventEmitter } from 'node:events'
2
2
import type { InterfaceAbi } from 'ethers'
3
3
import { Interface , WebSocketProvider , ethers } from 'ethers'
4
4
import type { ErrorEvent , WebSocket } from 'ws'
5
+ import { debug } from '../debug'
5
6
import { ContractManager } from './contract'
6
7
7
8
export interface RekuProviderManagerOptions {
@@ -127,6 +128,7 @@ export class RekuProviderManager {
127
128
}
128
129
129
130
reconnect ( ) {
131
+ debug ( 'reconnect provider running...' )
130
132
// destroy heartbeat
131
133
this . _clearHeartbeat ( )
132
134
this . _heartbeatTimer = undefined
@@ -142,11 +144,13 @@ export class RekuProviderManager {
142
144
const socket = this . _provider . websocket as WebSocket
143
145
socket . removeAllListeners ( )
144
146
socket . onerror = null
147
+ debug ( 'remove all listeners of websocket provider' )
145
148
}
146
149
this . _provider ?. destroy ( )
147
150
this . _provider = undefined
148
151
149
152
setTimeout ( ( ) => {
153
+ debug ( 'reconnect provider start' )
150
154
// reconnect provider
151
155
this . connect ( )
152
156
// reset contracts
@@ -164,15 +168,19 @@ export class RekuProviderManager {
164
168
this . _contracts = contracts
165
169
// resend heartbeat
166
170
this . _sendHeartbeat ( )
171
+ debug ( 'reconnect provider end' )
167
172
} , 100 )
168
173
}
169
174
170
175
private _sendHeartbeat ( ) {
171
176
if ( this . _options ?. disabledHeartbeat )
172
177
return
178
+ debug ( 'start heartbeat' )
173
179
this . _heartbeatTimer = setInterval ( ( ) => {
174
180
this . _provider ?. send ( 'net_version' , [ ] )
175
- . then ( )
181
+ . then ( ( res ) => {
182
+ debug ( 'heartbeat response: %s' , res )
183
+ } )
176
184
. catch ( ( err ) => {
177
185
this . reconnect ( )
178
186
this . _event ?. emit ( 'error' , err )
@@ -181,30 +189,36 @@ export class RekuProviderManager {
181
189
}
182
190
183
191
private _clearHeartbeat ( ) {
184
- if ( this . _heartbeatTimer )
192
+ if ( this . _heartbeatTimer ) {
193
+ debug ( 'clear heartbeat' )
185
194
clearInterval ( this . _heartbeatTimer )
195
+ }
186
196
}
187
197
188
198
private _handleError ( ) {
189
199
this . _provider ?. on ( 'error' , ( ) => {
200
+ debug ( 'provider error event emitted' )
190
201
this . reconnect ( )
191
202
this . _event ?. emit ( 'error' , new Error ( 'provider error' ) )
192
203
} )
193
204
194
205
if ( this . _provider instanceof ethers . WebSocketProvider ) {
195
206
const websocket = this . _provider . websocket as WebSocket
196
207
websocket . onerror = ( event : ErrorEvent ) => {
208
+ debug ( 'websocket error event emitted' )
197
209
this . reconnect ( )
198
210
this . _event ?. emit ( 'error' , new Error ( 'websocket error' ) , event )
199
211
}
200
212
websocket . on ?.( 'close' , ( code : number , reason : string ) => {
213
+ debug ( 'websocket close event emitted' )
201
214
this . reconnect ( )
202
215
this . _event ?. emit ( 'close' , code , reason )
203
216
} )
204
217
}
205
218
}
206
219
207
220
destroy ( ) {
221
+ debug ( 'destroy provider running...' )
208
222
this . _clearHeartbeat ( )
209
223
this . _provider ?. removeAllListeners ( )
210
224
this . _provider ?. destroy ( )
@@ -215,5 +229,6 @@ export class RekuProviderManager {
215
229
this . _contracts . clear ( )
216
230
this . _event ?. removeAllListeners ( )
217
231
this . _event = undefined
232
+ debug ( 'destroy provider end' )
218
233
}
219
234
}
0 commit comments