UNPKG

1.97 kBPlain TextView Raw
1import { create as createLogger } from '../common/log'
2import { Middleware, MiddlewareCallback, MiddlewareServices, Pipelines } from '../types/middleware'
3import * as IlpPacket from 'ilp-packet'
4
5export default class ErrorHandlerMiddleware implements Middleware {
6 private getOwnAddress: () => string
7
8 constructor (opts: {}, api: MiddlewareServices) {
9 this.getOwnAddress = api.getOwnAddress
10 }
11
12 async applyToPipelines (pipelines: Pipelines, accountId: string) {
13 const log = createLogger(`error-handler-middleware[${accountId}]`)
14
15 /**
16 * Important middleware. It ensures any errors thrown through the middleware pipe is converted to correct ILP
17 * reject that is sent back to sender.
18 */
19 pipelines.incomingData.insertLast({
20 name: 'errorHandler',
21 method: async (data: Buffer, next: MiddlewareCallback<Buffer, Buffer>) => {
22 try {
23 const response = await next(data)
24
25 if (!Buffer.isBuffer(response)) {
26 throw new Error('handler did not return a value.')
27 }
28
29 return response
30 } catch (e) {
31 let err = e
32 if (!err || typeof err !== 'object') {
33 err = new Error('Non-object thrown: ' + e)
34 }
35
36 log.debug('error in data handler, creating rejection. ilpErrorCode=%s error=%s', err.ilpErrorCode, err.stack ? err.stack : err)
37
38 return IlpPacket.errorToReject(this.getOwnAddress(), err)
39 }
40 }
41 })
42
43 pipelines.incomingMoney.insertLast({
44 name: 'errorHandler',
45 method: async (amount: string, next: MiddlewareCallback<string, void>) => {
46 try {
47 return await next(amount)
48 } catch (e) {
49 let err = e
50 if (!err || typeof err !== 'object') {
51 err = new Error('non-object thrown. value=' + e)
52 }
53
54 log.debug('error in money handler. error=%s', err.stack ? err.stack : err)
55
56 throw err
57 }
58 }
59 })
60 }
61}