@@ -155,10 +155,7 @@ export class JsonRpcEngine extends SafeEventEmitter {
155155
156156 if ( Array . isArray ( req ) ) {
157157 if ( cb ) {
158- this . _handleBatch ( req )
159- . then ( ( res ) => cb ( null , res as JsonRpcResponse < unknown > [ ] ) )
160- . catch ( ( err ) => cb ( err ) ) ; // fatal error
161- return undefined ;
158+ return this . _handleBatch ( req , cb ) ;
162159 }
163160 return this . _handleBatch ( req ) ;
164161 }
@@ -176,44 +173,73 @@ export class JsonRpcEngine extends SafeEventEmitter {
176173 * @returns This engine as a middleware function.
177174 */
178175 asMiddleware ( ) : JsonRpcMiddleware < unknown , unknown > {
179- return ( req , res , next , end ) => {
180- JsonRpcEngine . _runAllMiddleware ( req , res , this . _middleware )
181- . then (
182- async ( [ middlewareError , isComplete , returnHandlers ] ) => {
183- if ( isComplete ) {
184- await JsonRpcEngine . _runReturnHandlers ( returnHandlers ) ;
185- return end ( middlewareError as JsonRpcEngineCallbackError ) ;
186- }
176+ return async ( req , res , next , end ) => {
177+ try {
178+ const [
179+ middlewareError ,
180+ isComplete ,
181+ returnHandlers ,
182+ ] = await JsonRpcEngine . _runAllMiddleware ( req , res , this . _middleware ) ;
183+
184+ if ( isComplete ) {
185+ await JsonRpcEngine . _runReturnHandlers ( returnHandlers ) ;
186+ return end ( middlewareError as JsonRpcEngineCallbackError ) ;
187+ }
187188
188- return next ( async ( handlerCallback ) => {
189- try {
190- await JsonRpcEngine . _runReturnHandlers ( returnHandlers ) ;
191- } catch ( error ) {
192- return handlerCallback ( error ) ;
193- }
194- return handlerCallback ( ) ;
195- } ) ;
196- } ,
197- )
198- . catch ( ( error ) => {
199- end ( error ) ;
189+ return next ( async ( handlerCallback ) => {
190+ try {
191+ await JsonRpcEngine . _runReturnHandlers ( returnHandlers ) ;
192+ } catch ( error ) {
193+ return handlerCallback ( error ) ;
194+ }
195+ return handlerCallback ( ) ;
200196 } ) ;
197+ } catch ( error ) {
198+ return end ( error ) ;
199+ }
201200 } ;
202201 }
203202
204203 /**
205204 * Like _handle, but for batch requests.
206205 */
206+ private _handleBatch (
207+ reqs : JsonRpcRequest < unknown > [ ] ,
208+ ) : Promise < JsonRpcResponse < unknown > [ ] > ;
209+
210+ /**
211+ * Like _handle, but for batch requests.
212+ */
213+ private _handleBatch (
214+ reqs : JsonRpcRequest < unknown > [ ] ,
215+ cb : ( error : unknown , responses ?: JsonRpcResponse < unknown > [ ] ) => void ,
216+ ) : Promise < void > ;
217+
207218 private async _handleBatch (
208219 reqs : JsonRpcRequest < unknown > [ ] ,
209- ) : Promise < JsonRpcResponse < unknown > [ ] > {
220+ cb ?: ( error : unknown , responses ?: JsonRpcResponse < unknown > [ ] ) => void ,
221+ ) : Promise < JsonRpcResponse < unknown > [ ] | void > {
210222 // The order here is important
211- // 3. Return batch response, or reject on some kind of fatal error
212- return await Promise . all (
213- // 2. Wait for all requests to finish
214- // 1. Begin executing each request in the order received
215- reqs . map ( this . _promiseHandle . bind ( this ) ) ,
216- ) ;
223+ try {
224+ // 2. Wait for all requests to finish, or throw on some kind of fatal
225+ // error
226+ const responses = await Promise . all (
227+ // 1. Begin executing each request in the order received
228+ reqs . map ( this . _promiseHandle . bind ( this ) ) ,
229+ ) ;
230+
231+ // 3. Return batch response
232+ if ( cb ) {
233+ return cb ( null , responses ) ;
234+ }
235+ return responses ;
236+ } catch ( error ) {
237+ if ( cb ) {
238+ return cb ( error ) ;
239+ }
240+
241+ throw error ;
242+ }
217243 }
218244
219245 /**
@@ -330,11 +356,13 @@ export class JsonRpcEngine extends SafeEventEmitter {
330356 req : JsonRpcRequest < unknown > ,
331357 res : InternalJsonRpcResponse ,
332358 middlewareStack : JsonRpcMiddleware < unknown , unknown > [ ] ,
333- ) : Promise < [
359+ ) : Promise <
360+ [
334361 unknown , // error
335362 boolean , // isComplete
336363 JsonRpcEngineReturnHandler [ ] ,
337- ] > {
364+ ]
365+ > {
338366 const returnHandlers : JsonRpcEngineReturnHandler [ ] = [ ] ;
339367 let error = null ;
340368 let isComplete = false ;
@@ -384,12 +412,16 @@ export class JsonRpcEngine extends SafeEventEmitter {
384412 } else {
385413 if ( returnHandler ) {
386414 if ( typeof returnHandler !== 'function' ) {
387- end ( new EthereumRpcError (
388- errorCodes . rpc . internal ,
389- `JsonRpcEngine: "next" return handlers must be functions. ` +
390- `Received "${ typeof returnHandler } " for request:\n${ jsonify ( req ) } ` ,
391- { request : req } ,
392- ) ) ;
415+ end (
416+ new EthereumRpcError (
417+ errorCodes . rpc . internal ,
418+ `JsonRpcEngine: "next" return handlers must be functions. ` +
419+ `Received "${ typeof returnHandler } " for request:\n${ jsonify (
420+ req ,
421+ ) } `,
422+ { request : req } ,
423+ ) ,
424+ ) ;
393425 }
394426 returnHandlers . push ( returnHandler ) ;
395427 }
@@ -433,7 +465,9 @@ export class JsonRpcEngine extends SafeEventEmitter {
433465 if ( ! ( 'result' in res ) && ! ( 'error' in res ) ) {
434466 throw new EthereumRpcError (
435467 errorCodes . rpc . internal ,
436- `JsonRpcEngine: Response has no error or result for request:\n${ jsonify ( req ) } ` ,
468+ `JsonRpcEngine: Response has no error or result for request:\n${ jsonify (
469+ req ,
470+ ) } `,
437471 { request : req } ,
438472 ) ;
439473 }
0 commit comments