@datadog/datadog-ci-plugin-synthetics 5.12.0 → 5.13.0
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.
- package/dist/bundle.d.ts +2392 -0
- package/dist/bundle.js +144530 -0
- package/dist/bundle.js.LEGAL.txt +2412 -0
- package/dist/bundle.js.map +1 -0
- package/dist/commands/deploy-tests.js +2 -125
- package/dist/commands/import-tests.js +2 -118
- package/dist/commands/run-tests.js +2 -319
- package/dist/commands/upload-application.js +2 -138
- package/package.json +19 -19
- package/dist/api.d.ts +0 -52
- package/dist/api.js +0 -333
- package/dist/api.js.map +0 -1
- package/dist/batch.d.ts +0 -9
- package/dist/batch.js +0 -325
- package/dist/batch.js.map +0 -1
- package/dist/build-and-test.d.ts +0 -25
- package/dist/build-and-test.js +0 -196
- package/dist/build-and-test.js.map +0 -1
- package/dist/commands/deploy-tests.d.ts +0 -19
- package/dist/commands/deploy-tests.js.map +0 -1
- package/dist/commands/import-tests.d.ts +0 -19
- package/dist/commands/import-tests.js.map +0 -1
- package/dist/commands/run-tests.d.ts +0 -19
- package/dist/commands/run-tests.js.map +0 -1
- package/dist/commands/upload-application.d.ts +0 -18
- package/dist/commands/upload-application.js.map +0 -1
- package/dist/deploy-tests-lib.d.ts +0 -2
- package/dist/deploy-tests-lib.js +0 -96
- package/dist/deploy-tests-lib.js.map +0 -1
- package/dist/errors.d.ts +0 -19
- package/dist/errors.js +0 -31
- package/dist/errors.js.map +0 -1
- package/dist/import-tests-lib.d.ts +0 -2
- package/dist/import-tests-lib.js +0 -71
- package/dist/import-tests-lib.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.js +0 -46
- package/dist/index.js.map +0 -1
- package/dist/interfaces.d.ts +0 -759
- package/dist/interfaces.js +0 -27
- package/dist/interfaces.js.map +0 -1
- package/dist/local-test-definition.d.ts +0 -2
- package/dist/local-test-definition.js +0 -16
- package/dist/local-test-definition.js.map +0 -1
- package/dist/mobile.d.ts +0 -28
- package/dist/mobile.js +0 -275
- package/dist/mobile.js.map +0 -1
- package/dist/multilocator.d.ts +0 -2
- package/dist/multilocator.js +0 -88
- package/dist/multilocator.js.map +0 -1
- package/dist/reporters/constants.d.ts +0 -6
- package/dist/reporters/constants.js +0 -14
- package/dist/reporters/constants.js.map +0 -1
- package/dist/reporters/default.d.ts +0 -33
- package/dist/reporters/default.js +0 -461
- package/dist/reporters/default.js.map +0 -1
- package/dist/reporters/junit.d.ts +0 -100
- package/dist/reporters/junit.js +0 -425
- package/dist/reporters/junit.js.map +0 -1
- package/dist/reporters/mobile/app-upload.d.ts +0 -14
- package/dist/reporters/mobile/app-upload.js +0 -54
- package/dist/reporters/mobile/app-upload.js.map +0 -1
- package/dist/run-tests-lib.d.ts +0 -28
- package/dist/run-tests-lib.js +0 -281
- package/dist/run-tests-lib.js.map +0 -1
- package/dist/test.d.ts +0 -29
- package/dist/test.js +0 -200
- package/dist/test.js.map +0 -1
- package/dist/tunnel/crypto.d.ts +0 -6
- package/dist/tunnel/crypto.js +0 -48
- package/dist/tunnel/crypto.js.map +0 -1
- package/dist/tunnel/index.d.ts +0 -1
- package/dist/tunnel/index.js +0 -6
- package/dist/tunnel/index.js.map +0 -1
- package/dist/tunnel/tunnel.d.ts +0 -49
- package/dist/tunnel/tunnel.js +0 -329
- package/dist/tunnel/tunnel.js.map +0 -1
- package/dist/tunnel/websocket.d.ts +0 -39
- package/dist/tunnel/websocket.js +0 -154
- package/dist/tunnel/websocket.js.map +0 -1
- package/dist/utils/internal.d.ts +0 -58
- package/dist/utils/internal.js +0 -317
- package/dist/utils/internal.js.map +0 -1
- package/dist/utils/public.d.ts +0 -81
- package/dist/utils/public.js +0 -524
- package/dist/utils/public.js.map +0 -1
package/dist/tunnel/tunnel.d.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import type { ProxyAgent } from 'proxy-agent';
|
|
2
|
-
export interface TunnelInfo {
|
|
3
|
-
host: string;
|
|
4
|
-
id: string;
|
|
5
|
-
privateKey: string;
|
|
6
|
-
}
|
|
7
|
-
export interface TunnelReporter {
|
|
8
|
-
error(message: string): void;
|
|
9
|
-
log(message: string): void;
|
|
10
|
-
warn(message: string): void;
|
|
11
|
-
}
|
|
12
|
-
export declare class Tunnel {
|
|
13
|
-
private url;
|
|
14
|
-
private testIDs;
|
|
15
|
-
private reporter?;
|
|
16
|
-
private FORWARDING_TIMEOUT;
|
|
17
|
-
private sshConfig;
|
|
18
|
-
private privateKey;
|
|
19
|
-
private publicKey;
|
|
20
|
-
/** Used to catch SIGINT only once. */
|
|
21
|
-
private started;
|
|
22
|
-
/** Used to log "Successfully connected" only once. */
|
|
23
|
-
private connected;
|
|
24
|
-
private ws;
|
|
25
|
-
private multiplexer?;
|
|
26
|
-
private forwardedSockets;
|
|
27
|
-
constructor(url: string, testIDs: string[], proxyAgent?: ProxyAgent, reporter?: TunnelReporter | undefined);
|
|
28
|
-
/**
|
|
29
|
-
* keepAlive will return a promise that tracks the state of the tunnel (and reject in case of error)
|
|
30
|
-
*/
|
|
31
|
-
keepAlive(): Promise<void>;
|
|
32
|
-
/**
|
|
33
|
-
* start the tunnel:
|
|
34
|
-
* - get the pre-signed URL to connect to the tunnel service
|
|
35
|
-
* - Set up SSH
|
|
36
|
-
* - establish a WebSocket connection to the tunnel service
|
|
37
|
-
*/
|
|
38
|
-
start(): Promise<TunnelInfo>;
|
|
39
|
-
/**
|
|
40
|
-
* stop the tunnel
|
|
41
|
-
*/
|
|
42
|
-
stop(): Promise<void>;
|
|
43
|
-
private authenticateSSHConnection;
|
|
44
|
-
private forwardProxiedPacketsFromSSH;
|
|
45
|
-
private forwardWebSocketToSSH;
|
|
46
|
-
private getConnectionInfo;
|
|
47
|
-
private processSSHStream;
|
|
48
|
-
private handleSIGINT;
|
|
49
|
-
}
|
package/dist/tunnel/tunnel.js
DELETED
|
@@ -1,329 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.Tunnel = void 0;
|
|
13
|
-
const crypto_1 = require("crypto");
|
|
14
|
-
const net_1 = require("net");
|
|
15
|
-
const stream_1 = require("stream");
|
|
16
|
-
const ssh2_1 = require("ssh2");
|
|
17
|
-
const yamux_js_1 = require("yamux-js");
|
|
18
|
-
const crypto_2 = require("./crypto");
|
|
19
|
-
const websocket_1 = require("./websocket");
|
|
20
|
-
/**
|
|
21
|
-
* Use `DEBUG=synthetics:tunnel` to enable debug logs.
|
|
22
|
-
*/
|
|
23
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-var-requires, @typescript-eslint/no-unsafe-call
|
|
24
|
-
const debug = require('debug')('synthetics:tunnel');
|
|
25
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-var-requires -- SW-1310
|
|
26
|
-
const SSH_CONSTANTS = require('ssh2/lib/protocol/constants');
|
|
27
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-var-requires -- SW-1310
|
|
28
|
-
const { KexInit } = require('ssh2/lib/protocol/kex');
|
|
29
|
-
class Tunnel {
|
|
30
|
-
constructor(url, testIDs, proxyAgent, reporter) {
|
|
31
|
-
this.url = url;
|
|
32
|
-
this.testIDs = testIDs;
|
|
33
|
-
this.reporter = reporter;
|
|
34
|
-
this.FORWARDING_TIMEOUT = 40000;
|
|
35
|
-
/** Used to catch SIGINT only once. */
|
|
36
|
-
this.started = false;
|
|
37
|
-
/** Used to log "Successfully connected" only once. */
|
|
38
|
-
this.connected = false;
|
|
39
|
-
this.forwardedSockets = new Set();
|
|
40
|
-
this.handleSIGINT = () => {
|
|
41
|
-
var _a;
|
|
42
|
-
if (this.started) {
|
|
43
|
-
// The tunnel is connected, so we stop it gracefully – all tests will be aborted.
|
|
44
|
-
(_a = this.reporter) === null || _a === void 0 ? void 0 : _a.log('Closing tunnel and waiting for results... (press Ctrl+C again to force quit)');
|
|
45
|
-
void this.stop();
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
// The tunnel was already closed and we received a second Ctrl+C.
|
|
49
|
-
// Removing the listener automatically stops the process.
|
|
50
|
-
process.removeListener('SIGINT', this.handleSIGINT);
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
// Setup SSH
|
|
54
|
-
const { privateKey: hostPrivateKey } = (0, crypto_2.generateOpenSSHKeys)();
|
|
55
|
-
const parsedHostPrivateKey = (0, crypto_2.parseSSHKey)(hostPrivateKey);
|
|
56
|
-
const { publicKey, privateKey } = (0, crypto_2.generateOpenSSHKeys)();
|
|
57
|
-
this.publicKey = (0, crypto_2.parseSSHKey)(publicKey);
|
|
58
|
-
this.privateKey = privateKey;
|
|
59
|
-
this.sshConfig = {
|
|
60
|
-
algorithms: {
|
|
61
|
-
serverHostKey: [parsedHostPrivateKey.type],
|
|
62
|
-
},
|
|
63
|
-
// Greatly increase highWaterMark (32kb -> 255kb) to avoid hanging with large requests
|
|
64
|
-
highWaterMark: 255 * 1024,
|
|
65
|
-
hostKeys: [hostPrivateKey],
|
|
66
|
-
};
|
|
67
|
-
this.ws = new websocket_1.WebSocket(this.url, proxyAgent);
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* keepAlive will return a promise that tracks the state of the tunnel (and reject in case of error)
|
|
71
|
-
*/
|
|
72
|
-
keepAlive() {
|
|
73
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
74
|
-
if (!this.ws) {
|
|
75
|
-
throw new Error('No WebSocket connection');
|
|
76
|
-
}
|
|
77
|
-
return this.ws.keepAlive();
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* start the tunnel:
|
|
82
|
-
* - get the pre-signed URL to connect to the tunnel service
|
|
83
|
-
* - Set up SSH
|
|
84
|
-
* - establish a WebSocket connection to the tunnel service
|
|
85
|
-
*/
|
|
86
|
-
start() {
|
|
87
|
-
var _a, _b, _c;
|
|
88
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
89
|
-
this.started = true;
|
|
90
|
-
process.addListener('SIGINT', this.handleSIGINT);
|
|
91
|
-
(_a = this.reporter) === null || _a === void 0 ? void 0 : _a.log(`Opening tunnel for ${this.testIDs.length} tests…`);
|
|
92
|
-
(_b = this.reporter) === null || _b === void 0 ? void 0 : _b.log('Generating encryption key, setting up SSH and opening WebSocket connection…');
|
|
93
|
-
try {
|
|
94
|
-
// Establish a WebSocket connection to the tunnel service
|
|
95
|
-
yield this.ws.connect();
|
|
96
|
-
// @todo: in case of reconnect, add tunnel ID to WebSocket URL to re-use the same tunnel (in the tunnel service)
|
|
97
|
-
const connectionInfo = yield this.forwardWebSocketToSSH();
|
|
98
|
-
return connectionInfo;
|
|
99
|
-
}
|
|
100
|
-
catch (err) {
|
|
101
|
-
(_c = this.reporter) === null || _c === void 0 ? void 0 : _c.error('Tunnel setup failed, cleaning up and exiting…');
|
|
102
|
-
yield this.stop(); // Clean up
|
|
103
|
-
throw err;
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* stop the tunnel
|
|
109
|
-
*/
|
|
110
|
-
stop() {
|
|
111
|
-
var _a;
|
|
112
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
113
|
-
this.connected = false;
|
|
114
|
-
this.forwardedSockets.forEach((socket) => {
|
|
115
|
-
if (!!socket) {
|
|
116
|
-
socket.destroy();
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
yield this.ws.close();
|
|
120
|
-
if (this.started) {
|
|
121
|
-
(_a = this.reporter) === null || _a === void 0 ? void 0 : _a.log('Tunnel closed.');
|
|
122
|
-
this.started = false;
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
// Authenticate SSH with key authentication - username should be the test ID
|
|
127
|
-
authenticateSSHConnection(ctx) {
|
|
128
|
-
var _a;
|
|
129
|
-
const allowedUsers = this.testIDs.map((testId) => Buffer.from(testId));
|
|
130
|
-
// Ensure username is allowed
|
|
131
|
-
const user = Buffer.from(ctx.username);
|
|
132
|
-
if (!allowedUsers.some((allowedUser) => user.length === allowedUser.length && (0, crypto_1.timingSafeEqual)(user, allowedUser))) {
|
|
133
|
-
return ctx.reject();
|
|
134
|
-
}
|
|
135
|
-
// Only allow key authentication
|
|
136
|
-
if (ctx.method !== 'publickey') {
|
|
137
|
-
return ctx.reject();
|
|
138
|
-
}
|
|
139
|
-
const allowedPubSSHKey = Buffer.from(this.publicKey.getPublicSSH());
|
|
140
|
-
if (ctx.key.algo !== this.publicKey.type ||
|
|
141
|
-
ctx.key.data.length !== allowedPubSSHKey.length ||
|
|
142
|
-
!(0, crypto_1.timingSafeEqual)(ctx.key.data, allowedPubSSHKey) ||
|
|
143
|
-
(ctx.signature && ctx.blob && !this.publicKey.verify(ctx.blob, ctx.signature))) {
|
|
144
|
-
// Invalid key authentication
|
|
145
|
-
return ctx.reject();
|
|
146
|
-
}
|
|
147
|
-
// A connection without a signature is only to check for public key validity
|
|
148
|
-
if (!ctx.signature) {
|
|
149
|
-
return ctx.accept();
|
|
150
|
-
}
|
|
151
|
-
// Username is allowed and key authentication was successful
|
|
152
|
-
if (!this.connected) {
|
|
153
|
-
// Limit to one log per tunnel
|
|
154
|
-
this.connected = true;
|
|
155
|
-
(_a = this.reporter) === null || _a === void 0 ? void 0 : _a.log('Successfully connected');
|
|
156
|
-
}
|
|
157
|
-
ctx.accept();
|
|
158
|
-
}
|
|
159
|
-
forwardProxiedPacketsFromSSH(client) {
|
|
160
|
-
client
|
|
161
|
-
.on('session', (accept) => {
|
|
162
|
-
accept().on('close', () => {
|
|
163
|
-
client.end();
|
|
164
|
-
});
|
|
165
|
-
})
|
|
166
|
-
.on('tcpip', (accept, reject, { destIP, destPort }) => {
|
|
167
|
-
// Forward packets
|
|
168
|
-
// See https://github.com/mscdex/ssh2/issues/479#issuecomment-250416559
|
|
169
|
-
let src;
|
|
170
|
-
const dest = new net_1.Socket();
|
|
171
|
-
dest.setTimeout(this.FORWARDING_TIMEOUT);
|
|
172
|
-
this.forwardedSockets.add(dest);
|
|
173
|
-
dest.on('timeout', () => {
|
|
174
|
-
debug(`Connection timeout (${destIP})`);
|
|
175
|
-
if (src) {
|
|
176
|
-
src.destroy();
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
reject();
|
|
180
|
-
}
|
|
181
|
-
this.forwardedSockets.delete(dest);
|
|
182
|
-
dest.end();
|
|
183
|
-
dest.destroy();
|
|
184
|
-
});
|
|
185
|
-
dest.on('connect', () => {
|
|
186
|
-
src = accept();
|
|
187
|
-
if (!src) {
|
|
188
|
-
return dest.end();
|
|
189
|
-
}
|
|
190
|
-
(0, stream_1.pipeline)([dest, src], () => this.forwardedSockets.delete(dest));
|
|
191
|
-
(0, stream_1.pipeline)([src, dest], () => this.forwardedSockets.delete(dest));
|
|
192
|
-
src.on('close', () => {
|
|
193
|
-
dest.end();
|
|
194
|
-
dest.destroy();
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
dest.on('error', (error) => {
|
|
198
|
-
var _a, _b;
|
|
199
|
-
if (src) {
|
|
200
|
-
if (error.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
|
|
201
|
-
debug(`Error on opened connection (${destIP}): ${error.code}`);
|
|
202
|
-
}
|
|
203
|
-
src.close();
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
if ('code' in error && error.code === 'ENOTFOUND') {
|
|
207
|
-
(_a = this.reporter) === null || _a === void 0 ? void 0 : _a.warn(`Unable to resolve host (${destIP})`);
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
(_b = this.reporter) === null || _b === void 0 ? void 0 : _b.warn(`Connection error (${destIP}): ${error.code}`);
|
|
211
|
-
}
|
|
212
|
-
reject();
|
|
213
|
-
this.forwardedSockets.delete(dest);
|
|
214
|
-
dest.end();
|
|
215
|
-
dest.destroy();
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
dest.on('close', () => {
|
|
219
|
-
if (src) {
|
|
220
|
-
src.close();
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
reject();
|
|
224
|
-
}
|
|
225
|
-
this.forwardedSockets.delete(dest);
|
|
226
|
-
});
|
|
227
|
-
dest.connect(destPort, destIP);
|
|
228
|
-
})
|
|
229
|
-
.on('request', (accept, reject, name, info) => {
|
|
230
|
-
if (accept) {
|
|
231
|
-
accept();
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
forwardWebSocketToSSH() {
|
|
236
|
-
var _a;
|
|
237
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
238
|
-
const connectionInfo = yield this.getConnectionInfo();
|
|
239
|
-
(_a = this.reporter) === null || _a === void 0 ? void 0 : _a.log(`Websocket connection to tunnel ${connectionInfo.id} opened, proxy is ready!`);
|
|
240
|
-
// Stop any existing multiplexing
|
|
241
|
-
if (this.multiplexer) {
|
|
242
|
-
this.multiplexer.close();
|
|
243
|
-
}
|
|
244
|
-
// Set up multiplexing
|
|
245
|
-
const multiplexerConfig = {
|
|
246
|
-
// Increase maximum backlog size to more easily handle
|
|
247
|
-
// running multiple large browser tests in parallel.
|
|
248
|
-
acceptBacklog: 2048,
|
|
249
|
-
enableKeepAlive: false,
|
|
250
|
-
};
|
|
251
|
-
this.multiplexer = new yamux_js_1.Server((stream) => {
|
|
252
|
-
stream.on('error', (error) => {
|
|
253
|
-
debug(`Error in multiplexing: ${error}`);
|
|
254
|
-
});
|
|
255
|
-
void this.processSSHStream(stream);
|
|
256
|
-
}, multiplexerConfig);
|
|
257
|
-
// Pipe WebSocket to multiplexing
|
|
258
|
-
const duplex = this.ws.duplex();
|
|
259
|
-
this.multiplexer.on('error', (error) => {
|
|
260
|
-
debug(`Multiplexer error: ${error.message}`);
|
|
261
|
-
});
|
|
262
|
-
duplex.on('error', (error) => {
|
|
263
|
-
debug(`Websocket error: ${error.message}`);
|
|
264
|
-
});
|
|
265
|
-
(0, stream_1.pipeline)(duplex, this.multiplexer, (err) => {
|
|
266
|
-
if (err) {
|
|
267
|
-
debug(`Error on duplex connection close: ${err}`);
|
|
268
|
-
}
|
|
269
|
-
});
|
|
270
|
-
(0, stream_1.pipeline)(this.multiplexer, duplex, (err) => {
|
|
271
|
-
if (err) {
|
|
272
|
-
debug(`Error on Multiplexer connection close: ${err}`);
|
|
273
|
-
}
|
|
274
|
-
});
|
|
275
|
-
return connectionInfo;
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
getConnectionInfo() {
|
|
279
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
280
|
-
const rawConnectionInfo = yield this.ws.waitForFirstMessage();
|
|
281
|
-
try {
|
|
282
|
-
const connectionInfo = Object.assign({ privateKey: this.privateKey }, JSON.parse(rawConnectionInfo.toString()));
|
|
283
|
-
return connectionInfo;
|
|
284
|
-
}
|
|
285
|
-
catch (_a) {
|
|
286
|
-
throw new Error(`Unexpected response from tunnel service: ${rawConnectionInfo.toString()}\n`);
|
|
287
|
-
}
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
processSSHStream(stream) {
|
|
291
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
292
|
-
// Process SSH stream - see https://github.com/mscdex/ssh2/blob/v0.8.x/lib/server.js#L24
|
|
293
|
-
const serverConfig = Object.assign(Object.assign({}, this.sshConfig), { keepaliveInterval: 0 });
|
|
294
|
-
ssh2_1.Server.KEEPALIVE_CLIENT_INTERVAL = 0;
|
|
295
|
-
const server = new ssh2_1.Server(serverConfig, () => {
|
|
296
|
-
// 'connection' event listener is required otherwise connection wont proceed.
|
|
297
|
-
});
|
|
298
|
-
const { ident } = this.sshConfig;
|
|
299
|
-
const hostKeys = { 'ecdsa-sha2-nistp256': (0, crypto_2.parseSSHKey)(this.sshConfig.hostKeys[0]) };
|
|
300
|
-
const encryptionConfig = {
|
|
301
|
-
cipher: SSH_CONSTANTS.DEFAULT_CIPHER,
|
|
302
|
-
compress: SSH_CONSTANTS.DEFAULT_COMPRESSION,
|
|
303
|
-
lang: [],
|
|
304
|
-
mac: SSH_CONSTANTS.DEFAULT_MAC,
|
|
305
|
-
};
|
|
306
|
-
const algorithms = {
|
|
307
|
-
cs: encryptionConfig,
|
|
308
|
-
kex: SSH_CONSTANTS.DEFAULT_KEX,
|
|
309
|
-
sc: encryptionConfig,
|
|
310
|
-
serverHostKey: ['ecdsa-sha2-nistp256'],
|
|
311
|
-
};
|
|
312
|
-
const offer = new KexInit(algorithms);
|
|
313
|
-
const clientConfig = Object.assign(Object.assign({}, this.sshConfig), { keepaliveInterval: 0 });
|
|
314
|
-
// SW-1310: Typing does not include IncomingClient
|
|
315
|
-
const client = new ssh2_1.Server.IncomingClient(stream, hostKeys, ident, offer, undefined, server, clientConfig);
|
|
316
|
-
client
|
|
317
|
-
.on('authentication', (ctx) => this.authenticateSSHConnection(ctx))
|
|
318
|
-
.on('ready', () => this.forwardProxiedPacketsFromSSH(client))
|
|
319
|
-
.on('close', () => {
|
|
320
|
-
server.close();
|
|
321
|
-
})
|
|
322
|
-
.on('error', (err) => {
|
|
323
|
-
debug(`SSH error in proxy: ${err.message}`);
|
|
324
|
-
});
|
|
325
|
-
});
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
exports.Tunnel = Tunnel;
|
|
329
|
-
//# sourceMappingURL=tunnel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/tunnel/tunnel.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
/// <reference types="node" />
|
|
3
|
-
import { EventEmitter } from 'events';
|
|
4
|
-
import type { ProxyAgent } from 'proxy-agent';
|
|
5
|
-
import { default as WebSocketModule } from 'ws';
|
|
6
|
-
export declare class WebSocket extends EventEmitter {
|
|
7
|
-
private url;
|
|
8
|
-
private proxyAgent;
|
|
9
|
-
private firstMessage?;
|
|
10
|
-
private keepAliveWebsocket?;
|
|
11
|
-
private websocket?;
|
|
12
|
-
constructor(url: string, proxyAgent: ProxyAgent | undefined);
|
|
13
|
-
/**
|
|
14
|
-
* close will terminate the WebSocket connection
|
|
15
|
-
*/
|
|
16
|
-
close(gracefullyClose?: boolean): Promise<void>;
|
|
17
|
-
/**
|
|
18
|
-
* connect will start a WebSocket connection
|
|
19
|
-
*/
|
|
20
|
-
connect(): Promise<void>;
|
|
21
|
-
/**
|
|
22
|
-
* duplex will create a duplex stream for the WS connection
|
|
23
|
-
*/
|
|
24
|
-
duplex(): import("stream").Duplex;
|
|
25
|
-
/**
|
|
26
|
-
* keepAlive will return a promise to keep track of the tunnel connection
|
|
27
|
-
*/
|
|
28
|
-
keepAlive(): Promise<void>;
|
|
29
|
-
/**
|
|
30
|
-
* on allows to listen for WebSocket messages
|
|
31
|
-
*/
|
|
32
|
-
on(event: 'message', listener: (data: WebSocketModule.Data) => void): this;
|
|
33
|
-
/**
|
|
34
|
-
* once allows to listen for a WebSocket message
|
|
35
|
-
*/
|
|
36
|
-
once(event: 'message', listener: (data: WebSocketModule.Data) => void): this;
|
|
37
|
-
waitForFirstMessage(): Promise<WebSocketModule.Data>;
|
|
38
|
-
private establishWebsocketConnection;
|
|
39
|
-
}
|
package/dist/tunnel/websocket.js
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
-
exports.WebSocket = void 0;
|
|
36
|
-
const events_1 = require("events");
|
|
37
|
-
const ws_1 = __importStar(require("ws"));
|
|
38
|
-
class WebSocket extends events_1.EventEmitter {
|
|
39
|
-
constructor(url, proxyAgent) {
|
|
40
|
-
super();
|
|
41
|
-
this.url = url;
|
|
42
|
-
this.proxyAgent = proxyAgent;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* close will terminate the WebSocket connection
|
|
46
|
-
*/
|
|
47
|
-
close(gracefullyClose = true) {
|
|
48
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
49
|
-
if (this.websocket) {
|
|
50
|
-
this.websocket.removeAllListeners();
|
|
51
|
-
if (this.websocket.readyState === ws_1.default.OPEN) {
|
|
52
|
-
if (gracefullyClose) {
|
|
53
|
-
// Gracefully close the tunnel
|
|
54
|
-
this.websocket.close();
|
|
55
|
-
yield (0, events_1.once)(this.websocket, 'close');
|
|
56
|
-
}
|
|
57
|
-
// Clean up the underlying socket
|
|
58
|
-
this.websocket.terminate();
|
|
59
|
-
}
|
|
60
|
-
this.websocket = undefined;
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* connect will start a WebSocket connection
|
|
66
|
-
*/
|
|
67
|
-
connect() {
|
|
68
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
-
// Open the connection or throw
|
|
70
|
-
yield new Promise((resolve, reject) => this.establishWebsocketConnection(resolve, reject));
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* duplex will create a duplex stream for the WS connection
|
|
75
|
-
*/
|
|
76
|
-
duplex() {
|
|
77
|
-
if (!this.websocket) {
|
|
78
|
-
throw new Error('You must start the WebSocket connection before calling duplex');
|
|
79
|
-
}
|
|
80
|
-
return (0, ws_1.createWebSocketStream)(this.websocket, {
|
|
81
|
-
// Increase websocket buffer sizes from 16kb to 64kb.
|
|
82
|
-
readableHighWaterMark: 64 * 1024,
|
|
83
|
-
writableHighWaterMark: 64 * 1024,
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* keepAlive will return a promise to keep track of the tunnel connection
|
|
88
|
-
*/
|
|
89
|
-
keepAlive() {
|
|
90
|
-
if (!this.keepAliveWebsocket) {
|
|
91
|
-
// Use an artificial promise to keep track of the connection state and reconnect if necessary
|
|
92
|
-
this.keepAliveWebsocket = new Promise((resolve, reject) => this.establishWebsocketConnection(resolve, reject));
|
|
93
|
-
}
|
|
94
|
-
return this.keepAliveWebsocket;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* on allows to listen for WebSocket messages
|
|
98
|
-
*/
|
|
99
|
-
on(event, listener) {
|
|
100
|
-
if (!this.websocket) {
|
|
101
|
-
throw new Error('You must start the WebSocket connection before listening to messages');
|
|
102
|
-
}
|
|
103
|
-
this.websocket.on(event, listener);
|
|
104
|
-
return this;
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* once allows to listen for a WebSocket message
|
|
108
|
-
*/
|
|
109
|
-
once(event, listener) {
|
|
110
|
-
if (!this.websocket) {
|
|
111
|
-
throw new Error('You must start the WebSocket connection before listening to messages');
|
|
112
|
-
}
|
|
113
|
-
this.websocket.once(event, listener);
|
|
114
|
-
return this;
|
|
115
|
-
}
|
|
116
|
-
waitForFirstMessage() {
|
|
117
|
-
if (!this.firstMessage) {
|
|
118
|
-
throw new Error('Websocket connection was not established before reading first message');
|
|
119
|
-
}
|
|
120
|
-
return this.firstMessage;
|
|
121
|
-
}
|
|
122
|
-
establishWebsocketConnection(resolve, reject) {
|
|
123
|
-
if (!this.websocket) {
|
|
124
|
-
const options = {
|
|
125
|
-
agent: this.proxyAgent,
|
|
126
|
-
};
|
|
127
|
-
this.websocket = new ws_1.default(this.url, options);
|
|
128
|
-
}
|
|
129
|
-
this.firstMessage = new Promise((firstMessageResolve, firstMessageReject) => {
|
|
130
|
-
if (!this.websocket) {
|
|
131
|
-
firstMessageReject(Error('Unable to start websocket connection'));
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
this.websocket.once('message', firstMessageResolve);
|
|
135
|
-
}
|
|
136
|
-
});
|
|
137
|
-
this.websocket.on('unexpected-response', (req, res) => {
|
|
138
|
-
let body = '';
|
|
139
|
-
res.on('readable', () => {
|
|
140
|
-
body += res.read();
|
|
141
|
-
});
|
|
142
|
-
res.on('end', () => {
|
|
143
|
-
reject(Error(`Got unexpected response in WebSocket connection (code: ${res.statusCode}): ${body}`));
|
|
144
|
-
});
|
|
145
|
-
req.end();
|
|
146
|
-
res.destroy();
|
|
147
|
-
});
|
|
148
|
-
this.websocket.on('open', () => {
|
|
149
|
-
resolve();
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
exports.WebSocket = WebSocket;
|
|
154
|
-
//# sourceMappingURL=websocket.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/tunnel/websocket.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/internal.d.ts
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import type { BaseResult, BasicAuthCredentials, BrowserServerResult, CookiesObject, DatadogCIConfig, LocalTriggerConfig, MobileTestWithOverride, Result, ResultInBatch, ResultInBatchSkippedBySelectiveRerun, RetryConfig, ServerConfigOverride, ServerResult, Test, TestMissing, TestPayload, TestSkipped, TestWithOverride, TriggerConfig, UserConfigOverride, LocalTestPayload } from '../interfaces';
|
|
2
|
-
import { ExecutionRule } from '../interfaces';
|
|
3
|
-
export type RecursivePartial<T> = {
|
|
4
|
-
[P in keyof T]?: RecursivePartial<T[P]>;
|
|
5
|
-
};
|
|
6
|
-
export declare const getDefaultConfig: () => DatadogCIConfig;
|
|
7
|
-
export declare const wait: (duration: number) => Promise<unknown>;
|
|
8
|
-
export declare const getOverriddenExecutionRule: (test?: Test, testOverrides?: UserConfigOverride) => ExecutionRule | undefined;
|
|
9
|
-
export declare const hasResultPassed: (result: ResultInBatch, isUnhealthy: boolean, hasTimedOut: boolean, options: {
|
|
10
|
-
failOnCriticalErrors?: boolean;
|
|
11
|
-
failOnTimeout?: boolean;
|
|
12
|
-
}) => boolean;
|
|
13
|
-
/**
|
|
14
|
-
* Whether the result is of type {@link BaseResult}, i.e. it wasn't skipped.
|
|
15
|
-
*/
|
|
16
|
-
export declare const isBaseResult: (result: Result) => result is BaseResult;
|
|
17
|
-
/**
|
|
18
|
-
* Whether the result has a defined {@link BaseResult.result} property.
|
|
19
|
-
*
|
|
20
|
-
* This property would be undefined if the server result isn't available when polling for it,
|
|
21
|
-
* which is a known latency issue. We call such result an incomplete result.
|
|
22
|
-
*/
|
|
23
|
-
export declare const hasDefinedResult: (result: Result) => result is BaseResult & {
|
|
24
|
-
result: ServerResult;
|
|
25
|
-
};
|
|
26
|
-
/**
|
|
27
|
-
* When the test is configured to be retried and the first attempt fails, `retries` is set to `0`
|
|
28
|
-
* and the result is kept `in_progress` until the final result is received.
|
|
29
|
-
*/
|
|
30
|
-
export declare const isNonFinalResult: (result: ResultInBatch) => result is import("../interfaces").BaseResultInBatch & {
|
|
31
|
-
retries: number;
|
|
32
|
-
status: 'in_progress';
|
|
33
|
-
};
|
|
34
|
-
export declare const isTimedOutRetry: (retries: number | null, maxRetries: number | null, timedOut: boolean | null) => boolean;
|
|
35
|
-
export declare const isLocalTriggerConfig: (triggerConfig?: TriggerConfig) => triggerConfig is LocalTriggerConfig;
|
|
36
|
-
export declare const isLocalTestPayload: (testPayload: TestPayload) => testPayload is LocalTestPayload;
|
|
37
|
-
export declare const isBrowserServerResult: (serverResult: ServerResult) => serverResult is BrowserServerResult;
|
|
38
|
-
export declare const getTriggerConfigPublicId: (triggerConfig: TriggerConfig) => string | undefined;
|
|
39
|
-
export declare const LOCAL_TEST_DEFINITION_PUBLIC_ID_PLACEHOLDER = "local";
|
|
40
|
-
export declare const getPublicIdOrPlaceholder: (test: Test | TestPayload | {
|
|
41
|
-
public_id?: string;
|
|
42
|
-
}) => string;
|
|
43
|
-
export declare const isResultInBatchSkippedBySelectiveRerun: (result: ResultInBatch) => result is ResultInBatchSkippedBySelectiveRerun;
|
|
44
|
-
export declare const isMobileTestWithOverride: (item: TestMissing | TestSkipped | TestWithOverride) => item is MobileTestWithOverride;
|
|
45
|
-
export declare const getResultIdOrLinkedResultId: (result: ResultInBatch) => string;
|
|
46
|
-
export declare const toExecutionRule: (env: string | undefined) => ExecutionRule | undefined;
|
|
47
|
-
type AccumulatorBaseConfigOverride = Omit<UserConfigOverride, 'retry' | 'basicAuth' | 'cookies' | 'setCookies' | 'mobileApplicationVersion' | 'mobileApplicationVersionFilePath'> & {
|
|
48
|
-
retry?: Partial<RetryConfig>;
|
|
49
|
-
basicAuth?: Partial<BasicAuthCredentials>;
|
|
50
|
-
cookies?: Partial<CookiesObject>;
|
|
51
|
-
setCookies?: Partial<CookiesObject>;
|
|
52
|
-
};
|
|
53
|
-
type TestOverrideValueType = boolean | number | string | string[] | ExecutionRule;
|
|
54
|
-
type ValidTestOverrideValueTypeName = 'boolean' | 'number' | 'string' | 'string[]' | 'ExecutionRule';
|
|
55
|
-
export declare const parseOverrideValue: (value: string, type: ValidTestOverrideValueTypeName) => TestOverrideValueType;
|
|
56
|
-
export declare const validateAndParseOverrides: (overrides: string[] | undefined) => AccumulatorBaseConfigOverride;
|
|
57
|
-
export declare const getBasePayload: (test: Test, testOverrides?: UserConfigOverride) => ServerConfigOverride;
|
|
58
|
-
export {};
|