bdy 1.8.3-dev → 1.8.4-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/distTs/bin/cli.js +5 -0
  2. package/distTs/src/agent/linux.js +119 -0
  3. package/distTs/src/agent/manager.js +395 -0
  4. package/distTs/src/agent/osx.js +139 -0
  5. package/distTs/src/agent/socket/tunnel.js +212 -0
  6. package/distTs/src/agent/socket.js +220 -0
  7. package/distTs/src/agent/system.js +177 -0
  8. package/distTs/src/agent/wait.js +23 -0
  9. package/distTs/src/agent/windows.js +159 -0
  10. package/distTs/src/agent.js +237 -0
  11. package/distTs/src/api/agent.js +84 -0
  12. package/distTs/src/api/buddy.js +117 -0
  13. package/distTs/src/api/socket.js +133 -0
  14. package/distTs/src/cfg.js +238 -0
  15. package/distTs/src/command/agent/install.js +106 -0
  16. package/distTs/src/command/agent/restart.js +27 -0
  17. package/distTs/src/command/agent/run.js +19 -0
  18. package/distTs/src/command/agent/start.js +28 -0
  19. package/distTs/src/command/agent/status.js +35 -0
  20. package/distTs/src/command/agent/stop.js +28 -0
  21. package/distTs/src/command/agent/tunnel/http.js +44 -0
  22. package/distTs/src/command/agent/tunnel/list.js +27 -0
  23. package/distTs/src/command/agent/tunnel/remove.js +28 -0
  24. package/distTs/src/command/agent/tunnel/start.js +34 -0
  25. package/distTs/src/command/agent/tunnel/status.js +31 -0
  26. package/distTs/src/command/agent/tunnel/tcp.js +43 -0
  27. package/distTs/src/command/agent/tunnel/tls.js +43 -0
  28. package/distTs/src/command/agent/tunnel.js +23 -0
  29. package/distTs/src/command/agent/uninstall.js +38 -0
  30. package/distTs/src/command/agent/update.js +38 -0
  31. package/distTs/src/command/agent/version.js +21 -0
  32. package/distTs/src/command/agent.js +29 -0
  33. package/distTs/src/command/config/add/http.js +25 -0
  34. package/distTs/src/command/config/add/tcp.js +25 -0
  35. package/distTs/src/command/config/add/tls.js +25 -0
  36. package/distTs/src/command/config/add.js +15 -0
  37. package/distTs/src/command/config/get/region.js +15 -0
  38. package/distTs/src/command/config/get/timeout.js +15 -0
  39. package/distTs/src/command/config/get/token.js +15 -0
  40. package/distTs/src/command/config/get/tunnel.js +19 -0
  41. package/distTs/src/command/config/get/tunnels.js +15 -0
  42. package/distTs/src/command/config/get/whitelist.js +15 -0
  43. package/distTs/src/command/config/get.js +21 -0
  44. package/distTs/src/command/config/remove/tunnel.js +19 -0
  45. package/distTs/src/command/config/remove.js +11 -0
  46. package/distTs/src/command/config/set/region.js +17 -0
  47. package/distTs/src/command/config/set/timeout.js +17 -0
  48. package/distTs/src/command/config/set/token.js +16 -0
  49. package/distTs/src/command/config/set/whitelist.js +17 -0
  50. package/distTs/src/command/config/set.js +17 -0
  51. package/distTs/src/command/config.js +17 -0
  52. package/distTs/src/command/http.js +30 -0
  53. package/distTs/src/command/pre.js +49 -0
  54. package/distTs/src/command/start.js +28 -0
  55. package/distTs/src/command/tcp.js +30 -0
  56. package/distTs/src/command/tls.js +30 -0
  57. package/distTs/src/command/version.js +13 -0
  58. package/distTs/src/command/vt/close.js +28 -0
  59. package/distTs/src/command/vt/exec.js +79 -0
  60. package/distTs/src/command/vt/storybook.js +90 -0
  61. package/distTs/src/command/vt.js +15 -0
  62. package/distTs/src/format.js +172 -0
  63. package/distTs/src/index.js +40 -0
  64. package/distTs/src/input.js +286 -0
  65. package/distTs/src/logger.js +93 -0
  66. package/distTs/src/output/interactive/tunnel.js +860 -0
  67. package/distTs/src/output/noninteractive/agent/tunnels.js +43 -0
  68. package/distTs/src/output/noninteractive/config/tunnel.js +67 -0
  69. package/distTs/src/output/noninteractive/config/tunnels.js +18 -0
  70. package/distTs/src/output/noninteractive/tunnel.js +59 -0
  71. package/distTs/src/output.js +138 -0
  72. package/distTs/src/server/cert.js +52 -0
  73. package/distTs/src/server/http1.js +74 -0
  74. package/distTs/src/server/http2.js +74 -0
  75. package/distTs/src/server/sftp.js +487 -0
  76. package/distTs/src/server/ssh.js +112 -0
  77. package/distTs/src/server/tls.js +41 -0
  78. package/distTs/src/ssh/client.js +191 -0
  79. package/distTs/src/texts.js +345 -0
  80. package/distTs/src/tunnel/agent.js +100 -0
  81. package/distTs/src/tunnel/compression.js +41 -0
  82. package/distTs/src/tunnel/dns.js +54 -0
  83. package/distTs/src/tunnel/html.js +30 -0
  84. package/distTs/src/tunnel/http/log.js +196 -0
  85. package/distTs/src/tunnel/http/serve.js +132 -0
  86. package/distTs/src/tunnel/http/stream.js +45 -0
  87. package/distTs/src/tunnel/http.js +405 -0
  88. package/distTs/src/tunnel/identification.js +96 -0
  89. package/distTs/src/tunnel/latency.js +71 -0
  90. package/distTs/src/tunnel/tcp.js +92 -0
  91. package/distTs/src/tunnel.js +647 -0
  92. package/distTs/src/types/ciInfo.js +10 -0
  93. package/distTs/src/types/options.js +2 -0
  94. package/distTs/src/types/plugin.js +2 -0
  95. package/distTs/src/types/queue.js +2 -0
  96. package/distTs/src/types/requests.js +2 -0
  97. package/distTs/src/types/resources.js +2 -0
  98. package/distTs/src/types/snapshots.js +2 -0
  99. package/distTs/src/types/storybook.js +2 -0
  100. package/distTs/src/utils.js +437 -0
  101. package/distTs/src/visualTest/browser.js +32 -0
  102. package/distTs/src/visualTest/ci.js +206 -0
  103. package/distTs/src/visualTest/context.js +44 -0
  104. package/distTs/src/visualTest/exec.js +51 -0
  105. package/distTs/src/visualTest/queue.js +43 -0
  106. package/distTs/src/visualTest/requests.js +197 -0
  107. package/distTs/src/visualTest/resources.js +195 -0
  108. package/distTs/src/visualTest/server.js +33 -0
  109. package/distTs/src/visualTest/snapshots.js +109 -0
  110. package/distTs/src/visualTest/utils/parseDom.js +238 -0
  111. package/distTs/src/visualTest/validation.js +18 -0
  112. package/package.json +1 -1
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_js_1 = require("../../../utils.js");
7
+ const texts_js_1 = require("../../../texts.js");
8
+ const format_1 = __importDefault(require("../../../format"));
9
+ class OutputNoninteractiveAgentTunnels {
10
+ constructor(terminal, tunnels) {
11
+ this.terminal = terminal;
12
+ this.tunnels = tunnels;
13
+ }
14
+ start(output) {
15
+ if (!this.tunnels.length) {
16
+ output.exitNormal(texts_js_1.NO_TUNNELS_STARTED);
17
+ }
18
+ else {
19
+ const tunnels = [
20
+ ['Id', 'Type', 'Target / Latency', 'Entry / Latency', 'Status'],
21
+ ];
22
+ this.tunnels.forEach((tunnel) => {
23
+ let target;
24
+ let status;
25
+ if (tunnel.serve)
26
+ target = format_1.default.serve(tunnel.serve) + ' / 0ms';
27
+ else
28
+ target =
29
+ format_1.default.target(tunnel.type, tunnel.target) +
30
+ ` / ${format_1.default.latency(tunnel.targetLatency)}`;
31
+ const entry = format_1.default.entry(tunnel) + ` / ${format_1.default.latency(tunnel.regionLatency)}`;
32
+ if (tunnel.status === utils_js_1.TUNNEL_OPEN)
33
+ status = 'Open';
34
+ else
35
+ status = 'Closed';
36
+ tunnels.push([tunnel.id, tunnel.type, target, entry, status]);
37
+ });
38
+ output.table(tunnels);
39
+ output.exitNormal();
40
+ }
41
+ }
42
+ }
43
+ exports.default = OutputNoninteractiveAgentTunnels;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_js_1 = require("../../../utils.js");
7
+ const format_1 = __importDefault(require("../../../format"));
8
+ class OutputNoninteractiveConfigTunnel {
9
+ constructor(terminal, tunnel) {
10
+ this.terminal = terminal;
11
+ this.tunnel = tunnel;
12
+ }
13
+ start(output) {
14
+ const data = [
15
+ ['Name', this.tunnel.name],
16
+ ['Type', format_1.default.type(this.tunnel.type)],
17
+ ];
18
+ if (this.tunnel.type === utils_js_1.TUNNEL_HTTP && this.tunnel.serve) {
19
+ data.push(['Serve', format_1.default.serve(this.tunnel.serve)]);
20
+ }
21
+ else {
22
+ data.push([
23
+ 'Target',
24
+ format_1.default.target(this.tunnel.type, this.tunnel.target),
25
+ ]);
26
+ }
27
+ data.push(['Region', format_1.default.tunnelRegion(this.tunnel.region)]);
28
+ data.push(['Timeout', format_1.default.tunnelTimeout(this.tunnel.timeout)]);
29
+ data.push(['Whitelist', format_1.default.tunnelWhitelist(this.tunnel.whitelist)]);
30
+ data.push(['Domain', format_1.default.tunnelDomain(this.tunnel.domain)]);
31
+ data.push(['Subdomain', format_1.default.tunnelDomain(this.tunnel.subdomain)]);
32
+ if (this.tunnel.type === utils_js_1.TUNNEL_HTTP) {
33
+ data.push(['Host Header', format_1.default.hostHeader(this.tunnel.host)]);
34
+ data.push([
35
+ 'Basic Auth',
36
+ format_1.default.basicAuth(this.tunnel.login, this.tunnel.password),
37
+ ]);
38
+ data.push([
39
+ 'User Agents',
40
+ format_1.default.tunnelUserAgent(this.tunnel.useragents),
41
+ ]);
42
+ data.push(['Request Headers', format_1.default.tunnelHeaders(this.tunnel.headers)]);
43
+ data.push([
44
+ 'Response Headers',
45
+ format_1.default.tunnelHeaders(this.tunnel.responseHeaders),
46
+ ]);
47
+ data.push([
48
+ 'Circuit Breaker',
49
+ format_1.default.tunnelCircuitBreaker(this.tunnel.circuitBreaker),
50
+ ]);
51
+ data.push(['Log Requests', format_1.default.yesNo(this.tunnel.log)]);
52
+ data.push(['TLS Auth', format_1.default.yesNo(!!this.tunnel.ca)]);
53
+ data.push(['TLS Verify', format_1.default.yesNo(this.tunnel.verify)]);
54
+ data.push(['Force HTTP/2', format_1.default.yesNo(this.tunnel.http2)]);
55
+ data.push(['Compression', format_1.default.yesNo(this.tunnel.compression)]);
56
+ }
57
+ else if (this.tunnel.type === utils_js_1.TUNNEL_TLS) {
58
+ data.push(['Terminate TLS At', this.tunnel.terminate]);
59
+ data.push(['TLS Key', format_1.default.yesNo(!!this.tunnel.key)]);
60
+ data.push(['TLS Cert', format_1.default.yesNo(!!this.tunnel.cert)]);
61
+ data.push(['TLS Auth', format_1.default.yesNo(!!this.tunnel.ca)]);
62
+ }
63
+ output.table(data);
64
+ output.exitNormal();
65
+ }
66
+ }
67
+ exports.default = OutputNoninteractiveConfigTunnel;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class OutputNoninteractiveConfigTunnels {
4
+ constructor(terminal, tunnels) {
5
+ this.terminal = terminal;
6
+ this.tunnels = tunnels;
7
+ }
8
+ start(output) {
9
+ const data = [['Name', 'Type', 'Target']];
10
+ Object.keys(this.tunnels).forEach((name) => {
11
+ const t = this.tunnels[name];
12
+ data.push([name, t.type, String(t.target)]);
13
+ });
14
+ output.table(data);
15
+ output.exitNormal();
16
+ }
17
+ }
18
+ exports.default = OutputNoninteractiveConfigTunnels;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const utils_1 = require("../../utils");
7
+ const format_1 = __importDefault(require("../../format"));
8
+ class OutputNoninteractiveTunnel {
9
+ constructor(terminal, tunnel) {
10
+ this.tunnel = tunnel;
11
+ this.terminal = terminal;
12
+ }
13
+ status(t, status) {
14
+ this.terminal(`${format_1.default.date()}: Tunnel ${t.type} to ${t.serve || t.target} ${status}\n`);
15
+ }
16
+ onOpen(t) {
17
+ this.status(t, `open. Entry: ${format_1.default.entry(t)}`);
18
+ }
19
+ onClosed(t) {
20
+ this.status(t, 'closed');
21
+ }
22
+ onTcpOpen(t) {
23
+ this.status(t, 'has incoming tcp connection');
24
+ }
25
+ onTcpClosed(t) {
26
+ this.status(t, 'closed tcp connection');
27
+ }
28
+ onTlsOpen(t) {
29
+ this.status(t, 'has incoming tls connection');
30
+ }
31
+ onTlsClosed(t) {
32
+ this.status(t, 'closed tls connection');
33
+ }
34
+ onHttpIdentified(t, type) {
35
+ this.status(t, `identified as ${type}`);
36
+ }
37
+ onHttpRequest(t, logRequest) {
38
+ this.status(t, `Request ${logRequest.method} ${logRequest.url}`);
39
+ }
40
+ onHttpResponse(t, logRequest) {
41
+ this.status(t, `Response ${logRequest.method} ${logRequest.url} ${logRequest.status} in ${logRequest.time}ms`);
42
+ }
43
+ onStopped() {
44
+ process.exit();
45
+ }
46
+ start() {
47
+ this.tunnel.on(utils_1.TUNNEL_EVENT_OPEN, (t) => this.onOpen(t));
48
+ this.tunnel.on(utils_1.TUNNEL_EVENT_CLOSED, (t) => this.onClosed(t));
49
+ this.tunnel.on(utils_1.TUNNEL_EVENT_TCP_OPEN, (t) => this.onTcpOpen(t));
50
+ this.tunnel.on(utils_1.TUNNEL_EVENT_TCP_CLOSED, (t) => this.onTcpClosed(t));
51
+ this.tunnel.on(utils_1.TUNNEL_EVENT_TLS_OPEN, (t) => this.onTlsOpen(t));
52
+ this.tunnel.on(utils_1.TUNNEL_EVENT_TLS_CLOSED, (t) => this.onTlsClosed(t));
53
+ this.tunnel.on(utils_1.TUNNEL_EVENT_HTTP_IDENTIFIED, (t, type) => this.onHttpIdentified(t, type));
54
+ this.tunnel.on(utils_1.TUNNEL_EVENT_HTTP_REQUEST, (t, logRequest) => this.onHttpRequest(t, logRequest));
55
+ this.tunnel.on(utils_1.TUNNEL_EVENT_HTTP_RESPONSE, (t, logRequest) => this.onHttpResponse(t, logRequest));
56
+ this.tunnel.on(utils_1.TUNNEL_EVENT_STOPPED, (t) => this.onStopped(t));
57
+ }
58
+ }
59
+ exports.default = OutputNoninteractiveTunnel;
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ // @ts-ignore
7
+ const termkit_no_lazy_require_1 = __importDefault(require("terminal-kit/lib/termkit-no-lazy-require"));
8
+ const tunnel_js_1 = __importDefault(require("./output/interactive/tunnel.js"));
9
+ const tunnel_js_2 = __importDefault(require("./output/noninteractive/tunnel.js"));
10
+ const tunnel_js_3 = __importDefault(require("./output/noninteractive/config/tunnel.js"));
11
+ const tunnels_js_1 = __importDefault(require("./output/noninteractive/config/tunnels.js"));
12
+ const texts_js_1 = require("./texts.js");
13
+ const tunnels_js_2 = __importDefault(require("./output/noninteractive/agent/tunnels.js"));
14
+ const context_1 = require("./visualTest/context");
15
+ const terminal = termkit_no_lazy_require_1.default.terminal;
16
+ class Output {
17
+ static s;
18
+ static exitSuccess(msg) {
19
+ this.killSpinner();
20
+ terminal.green(`${msg}\n`);
21
+ process.exit(0);
22
+ }
23
+ static exitNormal(msg) {
24
+ this.killSpinner();
25
+ if (msg)
26
+ terminal(`${msg}\n`);
27
+ process.exit(0);
28
+ }
29
+ static newline() {
30
+ terminal('\n');
31
+ }
32
+ static normal(txt) {
33
+ terminal(`${txt}\n`);
34
+ }
35
+ static warning(txt) {
36
+ terminal.yellow(`${txt}\n`);
37
+ }
38
+ static error(txt) {
39
+ terminal.red(`${txt}\n`);
40
+ }
41
+ static async debug(text, action) {
42
+ if (context_1.debug) {
43
+ const t1 = performance.now();
44
+ const result = await action;
45
+ const t2 = performance.now();
46
+ this.normal(`${text} time: ${t2 - t1}`);
47
+ return result;
48
+ }
49
+ else {
50
+ return action;
51
+ }
52
+ }
53
+ static killSpinner() {
54
+ if (this.s) {
55
+ this.s.destroy();
56
+ this.s = null;
57
+ terminal.eraseLine();
58
+ terminal.left();
59
+ }
60
+ }
61
+ static async spinner(txt) {
62
+ if (!this.s && terminal.isTTY) {
63
+ this.s = await terminal.spinner();
64
+ if (txt)
65
+ terminal(` ${txt}`);
66
+ }
67
+ }
68
+ static agentTunnels(tunnels) {
69
+ const on = new tunnels_js_2.default(terminal, tunnels);
70
+ on.start(this);
71
+ }
72
+ static tunnelInteractive(tunnel) {
73
+ this.killSpinner();
74
+ const oi = new tunnel_js_1.default(terminal, tunnel);
75
+ oi.start();
76
+ }
77
+ static tunnelNonInteractive(tunnel) {
78
+ this.killSpinner();
79
+ const on = new tunnel_js_2.default(terminal, tunnel);
80
+ on.start();
81
+ }
82
+ static newCliVersion(version) {
83
+ terminal.gray((0, texts_js_1.TXT_NEW_CLI_VERSION)(version));
84
+ }
85
+ static newCliDockerVersion(version) {
86
+ terminal.gray((0, texts_js_1.TXT_NEW_CLI_DOCKER_VERSION)(version));
87
+ }
88
+ static newAgentVersion() {
89
+ terminal.gray(texts_js_1.TXT_NEW_AGENT_VERSION);
90
+ }
91
+ static tunnel(tunnel) {
92
+ if (terminal.isTTY)
93
+ this.tunnelInteractive(tunnel);
94
+ else
95
+ this.tunnelNonInteractive(tunnel);
96
+ }
97
+ static table(data) {
98
+ // apply padding
99
+ for (let i = 0; i < data.length; i += 1) {
100
+ for (let j = 0; j < data[i].length; j += 1) {
101
+ const s = data[i][j].split('\n');
102
+ const tmp = [];
103
+ for (let k = 0; k < s.length; k += 1) {
104
+ tmp.push(` ${s[k]} `);
105
+ }
106
+ data[i][j] = tmp.join('\n');
107
+ }
108
+ }
109
+ terminal.table(data, {
110
+ fit: false,
111
+ });
112
+ }
113
+ static configTunnels(tunnels) {
114
+ const on = new tunnels_js_1.default(terminal, tunnels);
115
+ on.start(this);
116
+ }
117
+ static configTunnel(tunnel) {
118
+ const on = new tunnel_js_3.default(terminal, tunnel);
119
+ on.start(this);
120
+ }
121
+ static exitError(err) {
122
+ this.killSpinner();
123
+ terminal.fullscreen(false);
124
+ terminal.hideCursor(false);
125
+ terminal.grabInput(false);
126
+ let msg;
127
+ if (err instanceof Error) {
128
+ msg = err.message;
129
+ if (process.env.DEBUG === '1')
130
+ msg += `\n${err.stack}`;
131
+ }
132
+ else
133
+ msg = err;
134
+ terminal.red.error(`${msg}\n`);
135
+ process.exit(1);
136
+ }
137
+ }
138
+ exports.default = Output;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_forge_1 = __importDefault(require("node-forge"));
7
+ const toPositiveHex = (hexString) => {
8
+ let hexAsInt = parseInt(hexString[0], 16);
9
+ if (hexAsInt < 8) {
10
+ return hexString;
11
+ }
12
+ hexAsInt -= 8;
13
+ return hexAsInt.toString() + hexString.substring(1);
14
+ };
15
+ class ServerCert {
16
+ constructor() {
17
+ const keyPair = node_forge_1.default.pki.rsa.generateKeyPair(2048);
18
+ const cert = node_forge_1.default.pki.createCertificate();
19
+ cert.serialNumber = toPositiveHex(node_forge_1.default.util.bytesToHex(node_forge_1.default.random.getBytesSync(9)));
20
+ cert.validity.notBefore = new Date();
21
+ const notAfter = new Date();
22
+ notAfter.setTime(notAfter.getTime() + 622080000000);
23
+ cert.validity.notAfter = notAfter;
24
+ const attrs = [
25
+ {
26
+ name: 'commonName',
27
+ value: 'buddy.tunnel',
28
+ },
29
+ ];
30
+ cert.setSubject(attrs);
31
+ cert.setIssuer(attrs);
32
+ cert.publicKey = keyPair.publicKey;
33
+ cert.setExtensions([
34
+ {
35
+ name: 'basicConstraints',
36
+ cA: true,
37
+ },
38
+ {
39
+ name: 'keyUsage',
40
+ keyCertSign: true,
41
+ digitalSignature: true,
42
+ nonRepudiation: true,
43
+ keyEncipherment: true,
44
+ dataEncipherment: true,
45
+ },
46
+ ]);
47
+ cert.sign(keyPair.privateKey, node_forge_1.default.md.sha256.create());
48
+ this.key = node_forge_1.default.pki.privateKeyToPem(keyPair.privateKey);
49
+ this.cert = node_forge_1.default.pki.certificateToPem(cert);
50
+ }
51
+ }
52
+ exports.default = ServerCert;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const events_1 = __importDefault(require("events"));
7
+ const logger_js_1 = __importDefault(require("../logger.js"));
8
+ const uuid_1 = require("uuid");
9
+ const http_1 = __importDefault(require("http"));
10
+ const texts_js_1 = require("../texts.js");
11
+ const utils_1 = require("../utils");
12
+ class ServerHttp1 extends events_1.default {
13
+ constructor(host) {
14
+ super();
15
+ this.server = http_1.default.createServer((req, res) => this.processRequest(req, res, host));
16
+ this.server.on('connection', (socket) => {
17
+ socket.id = (0, uuid_1.v4)();
18
+ this.emit(utils_1.HTTP1_SOCKET_OPEN, socket);
19
+ socket.once('close', () => {
20
+ this.emit(utils_1.HTTP1_SOCKET_CLOSED, socket);
21
+ });
22
+ });
23
+ this.server.listen();
24
+ }
25
+ stop() {
26
+ this.server.close();
27
+ this.server.removeAllListeners();
28
+ this.server = null;
29
+ }
30
+ handleSshTunnel(stream, info, ip) {
31
+ logger_js_1.default.debug((0, texts_js_1.LOG_HTTP1_CONNECTION)(ip));
32
+ stream.remoteAddress = ip;
33
+ this.server.emit('connection', stream);
34
+ }
35
+ retryRequest(logRequest) {
36
+ const address = this.server.address();
37
+ if (!address || !address.port)
38
+ return;
39
+ let req = http_1.default.request({
40
+ host: 'localhost',
41
+ port: address.port,
42
+ method: logRequest.method,
43
+ setHost: false,
44
+ path: logRequest.url,
45
+ headers: logRequest.headers,
46
+ });
47
+ if (logRequest.requestBody.data.length > 0)
48
+ req.write(logRequest.requestBody.data);
49
+ req.on('response', (res) => {
50
+ res.resume();
51
+ });
52
+ req.on('close', () => {
53
+ req.removeAllListeners();
54
+ req = null;
55
+ });
56
+ req.end();
57
+ }
58
+ checkHostHeader(req, res, host) {
59
+ if (req.headers.host === host)
60
+ return true;
61
+ else {
62
+ res.statusCode = 421;
63
+ res.end('Misdirected Request');
64
+ return false;
65
+ }
66
+ }
67
+ async processRequest(req, res, host) {
68
+ if (!this.checkHostHeader(req, res, host))
69
+ return;
70
+ logger_js_1.default.debug((0, texts_js_1.LOG_HTTP1_REQUEST)(req.method, req.url));
71
+ this.emit(utils_1.HTTP1_REQUEST, req, res);
72
+ }
73
+ }
74
+ exports.default = ServerHttp1;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const events_1 = __importDefault(require("events"));
7
+ const http2_1 = __importDefault(require("http2"));
8
+ const logger_js_1 = __importDefault(require("../logger.js"));
9
+ const uuid_1 = require("uuid");
10
+ const texts_js_1 = require("../texts.js");
11
+ const utils_1 = require("../utils");
12
+ class ServerHttp2 extends events_1.default {
13
+ constructor(host) {
14
+ super();
15
+ this.server = http2_1.default.createServer((req, res) => this.processRequest(req, res, host));
16
+ this.server.on('session', (session) => {
17
+ session.id = (0, uuid_1.v4)();
18
+ this.emit(utils_1.HTTP2_SESSION_OPEN, session);
19
+ session.once('close', () => {
20
+ this.emit(utils_1.HTTP2_SESSION_CLOSED, session);
21
+ });
22
+ });
23
+ this.server.listen();
24
+ }
25
+ stop() {
26
+ this.server.close();
27
+ this.server.removeAllListeners();
28
+ this.server = null;
29
+ }
30
+ handleSshTunnel(stream, info, ip) {
31
+ logger_js_1.default.debug((0, texts_js_1.LOG_HTTP2_CONNECTION)(ip));
32
+ stream.remoteAddress = ip;
33
+ this.server.emit('connection', stream);
34
+ }
35
+ retryRequest(logRequest) {
36
+ const address = this.server.address();
37
+ if (!address || !address.port)
38
+ return;
39
+ let client = http2_1.default.connect(`http://localhost:${address.port}`);
40
+ let req = client.request(logRequest.headers);
41
+ if (logRequest.requestBody.data.length > 0)
42
+ req.write(logRequest.requestBody.data);
43
+ req.on('response', () => {
44
+ req.resume();
45
+ });
46
+ req.on('error', (err) => {
47
+ logger_js_1.default.debug(texts_js_1.LOG_ERROR);
48
+ logger_js_1.default.debug(err);
49
+ });
50
+ req.on('close', () => {
51
+ req.removeAllListeners();
52
+ client.close();
53
+ req = null;
54
+ client = null;
55
+ });
56
+ req.end();
57
+ }
58
+ checkHostHeader(req, res, host) {
59
+ if (req.headers[':authority'] === host)
60
+ return true;
61
+ else {
62
+ res.statusCode = 421;
63
+ res.end('Misdirected Request');
64
+ return false;
65
+ }
66
+ }
67
+ async processRequest(req, res, host) {
68
+ if (!this.checkHostHeader(req, res, host))
69
+ return;
70
+ logger_js_1.default.debug((0, texts_js_1.LOG_HTTP2_REQUEST)(req.method, req.url));
71
+ this.emit(utils_1.HTTP2_REQUEST, req, res);
72
+ }
73
+ }
74
+ exports.default = ServerHttp2;