1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const log_1 = require("../common/log");
|
4 | const log = log_1.create('echo');
|
5 | const ilp_packet_1 = require("ilp-packet");
|
6 | const oer_utils_1 = require("oer-utils");
|
7 | const config_1 = require("../services/config");
|
8 | const route_builder_1 = require("../services/route-builder");
|
9 | const { InvalidPacketError } = ilp_packet_1.Errors;
|
10 | const MINIMUM_ECHO_PACKET_DATA_LENGTH = 16 + 1;
|
11 | const ECHO_DATA_PREFIX = Buffer.from('ECHOECHOECHOECHO', 'ascii');
|
12 | class EchoController {
|
13 | constructor(deps) {
|
14 | this.config = deps(config_1.default);
|
15 | this.routeBuilder = deps(route_builder_1.default);
|
16 | }
|
17 | async handle(data, sourceAccount, { parsedPacket, outbound }) {
|
18 | if (parsedPacket.data.length < MINIMUM_ECHO_PACKET_DATA_LENGTH) {
|
19 | throw new InvalidPacketError('packet data too short for echo request. length=' + parsedPacket.data.length);
|
20 | }
|
21 | if (!parsedPacket.data.slice(0, 16).equals(ECHO_DATA_PREFIX)) {
|
22 | throw new InvalidPacketError('packet data does not start with ECHO prefix.');
|
23 | }
|
24 | const reader = new oer_utils_1.Reader(parsedPacket.data);
|
25 | reader.skip(ECHO_DATA_PREFIX.length);
|
26 | const type = reader.readUInt8Number();
|
27 | if (type === 0) {
|
28 | const sourceAddress = reader.readVarOctetString().toString('ascii');
|
29 | log.trace('responding to ping. sourceAccount=%s sourceAddress=%s cond=%s', sourceAccount, sourceAddress, parsedPacket.executionCondition.slice(0, 9).toString('base64'));
|
30 | const nextHop = this.routeBuilder.getNextHop(sourceAccount, sourceAddress);
|
31 | const writer = new oer_utils_1.Writer();
|
32 | writer.write(ECHO_DATA_PREFIX);
|
33 | writer.writeUInt8(0x01);
|
34 | return outbound(ilp_packet_1.serializeIlpPrepare({
|
35 | amount: parsedPacket.amount,
|
36 | destination: sourceAddress,
|
37 | executionCondition: parsedPacket.executionCondition,
|
38 | expiresAt: new Date(Number(parsedPacket.expiresAt) - this.config.minMessageWindow),
|
39 | data: writer.getBuffer()
|
40 | }), nextHop);
|
41 | }
|
42 | else {
|
43 | log.error('received unexpected ping response. sourceAccount=%s', sourceAccount);
|
44 | throw new InvalidPacketError('unexpected ping response.');
|
45 | }
|
46 | }
|
47 | }
|
48 | exports.default = EchoController;
|
49 |
|
\ | No newline at end of file |