1
1
'use strict'
2
2
3
- const {
4
- ClientClosedError,
5
- InvalidArgumentError,
6
- ClientDestroyedError
7
- } = require ( './core/errors' )
8
- const { kClients, kRunning } = require ( './core/symbols' )
9
- const Dispatcher = require ( './dispatcher' )
3
+ const { InvalidArgumentError } = require ( './core/errors' )
4
+ const { kClients, kRunning, kClose, kDestroy, kDispatch } = require ( './core/symbols' )
5
+ const DispatcherBase = require ( './dispatcher-base' )
10
6
const Pool = require ( './pool' )
11
7
const Client = require ( './client' )
12
8
const util = require ( './core/util' )
13
9
const RedirectHandler = require ( './handler/redirect' )
14
10
const { WeakRef, FinalizationRegistry } = require ( './compat/dispatcher-weakref' ) ( )
15
11
16
- const kDestroyed = Symbol ( 'destroyed' )
17
- const kClosed = Symbol ( 'closed' )
18
12
const kOnConnect = Symbol ( 'onConnect' )
19
13
const kOnDisconnect = Symbol ( 'onDisconnect' )
20
14
const kOnConnectionError = Symbol ( 'onConnectionError' )
@@ -30,7 +24,7 @@ function defaultFactory (origin, opts) {
30
24
: new Pool ( origin , opts )
31
25
}
32
26
33
- class Agent extends Dispatcher {
27
+ class Agent extends DispatcherBase {
34
28
constructor ( { factory = defaultFactory , maxRedirections = 0 , connect, ...options } = { } ) {
35
29
super ( )
36
30
@@ -60,8 +54,6 @@ class Agent extends Dispatcher {
60
54
this [ kClients ] . delete ( key )
61
55
}
62
56
} )
63
- this [ kClosed ] = false
64
- this [ kDestroyed ] = false
65
57
66
58
const agent = this
67
59
@@ -94,76 +86,38 @@ class Agent extends Dispatcher {
94
86
return ret
95
87
}
96
88
97
- dispatch ( opts , handler ) {
98
- if ( ! handler || typeof handler !== 'object' ) {
99
- throw new InvalidArgumentError ( 'handler must be an object.' )
89
+ [ kDispatch ] ( opts , handler ) {
90
+ let key
91
+ if ( opts . origin && ( typeof opts . origin === 'string' || opts . origin instanceof URL ) ) {
92
+ key = String ( opts . origin )
93
+ } else {
94
+ throw new InvalidArgumentError ( 'opts.origin must be a non-empty string or URL.' )
100
95
}
101
96
102
- try {
103
- if ( ! opts || typeof opts !== 'object' ) {
104
- throw new InvalidArgumentError ( 'opts must be an object.' )
105
- }
106
-
107
- let key
108
- if ( opts . origin && ( typeof opts . origin === 'string' || opts . origin instanceof URL ) ) {
109
- key = String ( opts . origin )
110
- } else {
111
- throw new InvalidArgumentError ( 'opts.origin must be a non-empty string or URL.' )
112
- }
113
-
114
- if ( this [ kDestroyed ] ) {
115
- throw new ClientDestroyedError ( )
116
- }
117
-
118
- if ( this [ kClosed ] ) {
119
- throw new ClientClosedError ( )
120
- }
97
+ const ref = this [ kClients ] . get ( key )
121
98
122
- const ref = this [ kClients ] . get ( key )
123
-
124
- let dispatcher = ref ? ref . deref ( ) : null
125
- if ( ! dispatcher ) {
126
- dispatcher = this [ kFactory ] ( opts . origin , this [ kOptions ] )
127
- . on ( 'drain' , this [ kOnDrain ] )
128
- . on ( 'connect' , this [ kOnConnect ] )
129
- . on ( 'disconnect' , this [ kOnDisconnect ] )
130
- . on ( 'connectionError' , this [ kOnConnectionError ] )
131
-
132
- this [ kClients ] . set ( key , new WeakRef ( dispatcher ) )
133
- this [ kFinalizer ] . register ( dispatcher , key )
134
- }
135
-
136
- const { maxRedirections = this [ kMaxRedirections ] } = opts
137
- if ( maxRedirections != null && maxRedirections !== 0 ) {
138
- opts = { ...opts , maxRedirections : 0 } // Stop sub dispatcher from also redirecting.
139
- handler = new RedirectHandler ( this , maxRedirections , opts , handler )
140
- }
141
-
142
- return dispatcher . dispatch ( opts , handler )
143
- } catch ( err ) {
144
- if ( typeof handler . onError !== 'function' ) {
145
- throw new InvalidArgumentError ( 'invalid onError method' )
146
- }
99
+ let dispatcher = ref ? ref . deref ( ) : null
100
+ if ( ! dispatcher ) {
101
+ dispatcher = this [ kFactory ] ( opts . origin , this [ kOptions ] )
102
+ . on ( 'drain' , this [ kOnDrain ] )
103
+ . on ( 'connect' , this [ kOnConnect ] )
104
+ . on ( 'disconnect' , this [ kOnDisconnect ] )
105
+ . on ( 'connectionError' , this [ kOnConnectionError ] )
147
106
148
- handler . onError ( err )
107
+ this [ kClients ] . set ( key , new WeakRef ( dispatcher ) )
108
+ this [ kFinalizer ] . register ( dispatcher , key )
149
109
}
150
- }
151
-
152
- get closed ( ) {
153
- return this [ kClosed ]
154
- }
155
-
156
- get destroyed ( ) {
157
- return this [ kDestroyed ]
158
- }
159
110
160
- close ( callback ) {
161
- if ( callback != null && typeof callback !== 'function' ) {
162
- throw new InvalidArgumentError ( 'callback must be a function' )
111
+ const { maxRedirections = this [ kMaxRedirections ] } = opts
112
+ if ( maxRedirections != null && maxRedirections !== 0 ) {
113
+ opts = { ...opts , maxRedirections : 0 } // Stop sub dispatcher from also redirecting.
114
+ handler = new RedirectHandler ( this , maxRedirections , opts , handler )
163
115
}
164
116
165
- this [ kClosed ] = true
117
+ return dispatcher . dispatch ( opts , handler )
118
+ }
166
119
120
+ async [ kClose ] ( ) {
167
121
const closePromises = [ ]
168
122
for ( const ref of this [ kClients ] . values ( ) ) {
169
123
const client = ref . deref ( )
@@ -173,27 +127,10 @@ class Agent extends Dispatcher {
173
127
}
174
128
}
175
129
176
- if ( ! callback ) {
177
- return Promise . all ( closePromises )
178
- }
179
-
180
- // Should never error.
181
- Promise . all ( closePromises ) . then ( ( ) => process . nextTick ( callback ) )
130
+ await Promise . all ( closePromises )
182
131
}
183
132
184
- destroy ( err , callback ) {
185
- if ( typeof err === 'function' ) {
186
- callback = err
187
- err = null
188
- }
189
-
190
- if ( callback != null && typeof callback !== 'function' ) {
191
- throw new InvalidArgumentError ( 'callback must be a function' )
192
- }
193
-
194
- this [ kClosed ] = true
195
- this [ kDestroyed ] = true
196
-
133
+ async [ kDestroy ] ( err ) {
197
134
const destroyPromises = [ ]
198
135
for ( const ref of this [ kClients ] . values ( ) ) {
199
136
const client = ref . deref ( )
@@ -203,12 +140,7 @@ class Agent extends Dispatcher {
203
140
}
204
141
}
205
142
206
- if ( ! callback ) {
207
- return Promise . all ( destroyPromises )
208
- }
209
-
210
- // Should never error.
211
- Promise . all ( destroyPromises ) . then ( ( ) => process . nextTick ( callback ) )
143
+ await Promise . all ( destroyPromises )
212
144
}
213
145
}
214
146
0 commit comments