1 | import { create as createLogger } from '../common/log'
|
2 | import { Middleware, MiddlewareCallback, MiddlewareServices, Pipelines } from '../types/middleware'
|
3 | import * as IlpPacket from 'ilp-packet'
|
4 |
|
5 | export 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 |
|
17 |
|
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 | }
|