Skip to content
This repository was archived by the owner on Nov 9, 2023. It is now read-only.

Commit ebf0c55

Browse files
authored
Use async/await and try/catch in place of Promise methods (#74)
* Remove use of .then/.catch in asMiddleware * Use async/await in _handleBatch * Use async/await in createAsyncMiddleware
1 parent 0e1006a commit ebf0c55

File tree

2 files changed

+98
-61
lines changed

2 files changed

+98
-61
lines changed

src/JsonRpcEngine.ts

Lines changed: 74 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/createAsyncMiddleware.ts

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ export type AsyncJsonrpcMiddleware<T, U> = (
1212
next: AsyncJsonRpcEngineNextCallback
1313
) => Promise<void>;
1414

15+
type ReturnHandlerCallback = (error: null | Error) => void;
16+
1517
/**
1618
* JsonRpcEngine only accepts callback-based middleware directly.
1719
* createAsyncMiddleware exists to enable consumers to pass in async middleware
@@ -32,7 +34,7 @@ export type AsyncJsonrpcMiddleware<T, U> = (
3234
export function createAsyncMiddleware<T, U>(
3335
asyncMiddleware: AsyncJsonrpcMiddleware<T, U>,
3436
): JsonRpcMiddleware<T, U> {
35-
return (req, res, next, end) => {
37+
return async (req, res, next, end) => {
3638
// nextPromise is the key to the implementation
3739
// it is resolved by the return handler passed to the
3840
// "next" function
@@ -41,8 +43,8 @@ export function createAsyncMiddleware<T, U>(
4143
resolveNextPromise = resolve;
4244
});
4345

44-
let returnHandlerCallback: (error: null | Error) => void;
45-
let nextWasCalled: boolean;
46+
let returnHandlerCallback: unknown = null;
47+
let nextWasCalled = false;
4648

4749
// This will be called by the consumer's async middleware.
4850
const asyncNext = async () => {
@@ -51,28 +53,29 @@ export function createAsyncMiddleware<T, U>(
5153
// We pass a return handler to next(). When it is called by the engine,
5254
// the consumer's async middleware will resume executing.
5355
// eslint-disable-next-line node/callback-return
54-
next((callback) => {
55-
returnHandlerCallback = callback;
56+
next((runReturnHandlersCallback) => {
57+
// This callback comes from JsonRpcEngine._runReturnHandlers
58+
returnHandlerCallback = runReturnHandlersCallback;
5659
resolveNextPromise();
5760
});
5861
await nextPromise;
5962
};
6063

61-
asyncMiddleware(req, res, asyncNext)
62-
.then(async () => {
63-
if (nextWasCalled) {
64-
await nextPromise; // we must wait until the return handler is called
65-
returnHandlerCallback(null);
66-
} else {
67-
end(null);
68-
}
69-
})
70-
.catch((error) => {
71-
if (returnHandlerCallback) {
72-
returnHandlerCallback(error);
73-
} else {
74-
end(error);
75-
}
76-
});
64+
try {
65+
await asyncMiddleware(req, res, asyncNext);
66+
67+
if (nextWasCalled) {
68+
await nextPromise; // we must wait until the return handler is called
69+
(returnHandlerCallback as ReturnHandlerCallback)(null);
70+
} else {
71+
end(null);
72+
}
73+
} catch (error) {
74+
if (returnHandlerCallback) {
75+
(returnHandlerCallback as ReturnHandlerCallback)(error);
76+
} else {
77+
end(error);
78+
}
79+
}
7780
};
7881
}

0 commit comments

Comments
 (0)