@applitools/ec-client 1.7.12 → 1.7.14
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/CHANGELOG.md +81 -0
- package/dist/client.js +1 -1
- package/dist/commands/end-session.js +1 -1
- package/dist/commands/execute-script.js +2 -2
- package/dist/commands/find-element.js +3 -2
- package/dist/commands/start-session.js +8 -7
- package/dist/req-proxy.js +2 -1
- package/dist/server.js +2 -2
- package/dist/tunnels/manager-client.js +9 -2
- package/dist/tunnels/manager-server.js +71 -57
- package/package.json +9 -9
- package/types/tunnels/manager-client.d.ts +3 -1
- package/types/types.d.ts +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,86 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.7.14](https://github.com/applitools/eyes.sdk.javascript1/compare/js/ec-client@1.7.13...js/ec-client@1.7.14) (2023-10-25)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Dependencies
|
|
7
|
+
|
|
8
|
+
* @applitools/tunnel-client bumped to 1.3.0
|
|
9
|
+
#### Features
|
|
10
|
+
|
|
11
|
+
* add more logs for tunnel worker ([60cf839](https://github.com/applitools/eyes.sdk.javascript1/commit/60cf839f23b214dff89ff4a9c59f231c96160daf))
|
|
12
|
+
|
|
13
|
+
## [1.7.13](https://github.com/applitools/eyes.sdk.javascript1/compare/js/ec-client@1.7.12...js/ec-client@1.7.13) (2023-10-17)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Code Refactoring
|
|
17
|
+
|
|
18
|
+
* disallow usage of global Buffer ([#1957](https://github.com/applitools/eyes.sdk.javascript1/issues/1957)) ([adcc082](https://github.com/applitools/eyes.sdk.javascript1/commit/adcc082f20f6b92e819b96424e995d9a69d99758))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### Dependencies
|
|
22
|
+
|
|
23
|
+
* @applitools/utils bumped to 1.6.2
|
|
24
|
+
#### Code Refactoring
|
|
25
|
+
|
|
26
|
+
* disallow usage of global Buffer ([#1957](https://github.com/applitools/eyes.sdk.javascript1/issues/1957)) ([adcc082](https://github.com/applitools/eyes.sdk.javascript1/commit/adcc082f20f6b92e819b96424e995d9a69d99758))
|
|
27
|
+
* @applitools/logger bumped to 2.0.12
|
|
28
|
+
#### Code Refactoring
|
|
29
|
+
|
|
30
|
+
* disallow usage of global Buffer ([#1957](https://github.com/applitools/eyes.sdk.javascript1/issues/1957)) ([adcc082](https://github.com/applitools/eyes.sdk.javascript1/commit/adcc082f20f6b92e819b96424e995d9a69d99758))
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
* @applitools/socket bumped to 1.1.12
|
|
35
|
+
#### Code Refactoring
|
|
36
|
+
|
|
37
|
+
* disallow usage of global Buffer ([#1957](https://github.com/applitools/eyes.sdk.javascript1/issues/1957)) ([adcc082](https://github.com/applitools/eyes.sdk.javascript1/commit/adcc082f20f6b92e819b96424e995d9a69d99758))
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
* @applitools/req bumped to 1.6.2
|
|
42
|
+
#### Code Refactoring
|
|
43
|
+
|
|
44
|
+
* disallow usage of global Buffer ([#1957](https://github.com/applitools/eyes.sdk.javascript1/issues/1957)) ([adcc082](https://github.com/applitools/eyes.sdk.javascript1/commit/adcc082f20f6b92e819b96424e995d9a69d99758))
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
* @applitools/image bumped to 1.1.7
|
|
49
|
+
#### Bug Fixes
|
|
50
|
+
|
|
51
|
+
* avoid using ascii text decoder ([1b68d39](https://github.com/applitools/eyes.sdk.javascript1/commit/1b68d3945d96b17b9ab1f1a87d352206fd0c81d6))
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
#### Code Refactoring
|
|
55
|
+
|
|
56
|
+
* disallow usage of global Buffer ([#1957](https://github.com/applitools/eyes.sdk.javascript1/issues/1957)) ([adcc082](https://github.com/applitools/eyes.sdk.javascript1/commit/adcc082f20f6b92e819b96424e995d9a69d99758))
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
* @applitools/spec-driver-webdriver bumped to 1.0.48
|
|
61
|
+
|
|
62
|
+
* @applitools/driver bumped to 1.14.4
|
|
63
|
+
#### Code Refactoring
|
|
64
|
+
|
|
65
|
+
* disallow usage of global Buffer ([#1957](https://github.com/applitools/eyes.sdk.javascript1/issues/1957)) ([adcc082](https://github.com/applitools/eyes.sdk.javascript1/commit/adcc082f20f6b92e819b96424e995d9a69d99758))
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
* @applitools/tunnel-client bumped to 1.2.4
|
|
70
|
+
#### Code Refactoring
|
|
71
|
+
|
|
72
|
+
* disallow usage of global Buffer ([#1957](https://github.com/applitools/eyes.sdk.javascript1/issues/1957)) ([adcc082](https://github.com/applitools/eyes.sdk.javascript1/commit/adcc082f20f6b92e819b96424e995d9a69d99758))
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
* @applitools/core-base bumped to 1.7.2
|
|
77
|
+
#### Code Refactoring
|
|
78
|
+
|
|
79
|
+
* disallow usage of global Buffer ([#1957](https://github.com/applitools/eyes.sdk.javascript1/issues/1957)) ([adcc082](https://github.com/applitools/eyes.sdk.javascript1/commit/adcc082f20f6b92e819b96424e995d9a69d99758))
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
|
|
3
84
|
## [1.7.12](https://github.com/applitools/eyes.sdk.javascript1/compare/js/ec-client-v1.7.11...js/ec-client@1.7.12) (2023-09-29)
|
|
4
85
|
|
|
5
86
|
|
package/dist/client.js
CHANGED
|
@@ -32,7 +32,7 @@ async function makeECClient({ settings, logger: defaultLogger, } = {}) {
|
|
|
32
32
|
var _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29;
|
|
33
33
|
const logger = (0, logger_1.makeLogger)({ logger: defaultLogger, format: { label: 'ec-client' } });
|
|
34
34
|
settings !== null && settings !== void 0 ? settings : (settings = {});
|
|
35
|
-
(_a = settings.
|
|
35
|
+
(_a = settings.ecServerUrl) !== null && _a !== void 0 ? _a : (settings.ecServerUrl = (_c = (_b = utils.general.getEnvValue('EXECUTION_CLOUD_URL')) !== null && _b !== void 0 ? _b : utils.general.getEnvValue('EG_SERVER_URL')) !== null && _c !== void 0 ? _c : 'https://exec-wus.applitools.com');
|
|
36
36
|
(_d = settings.proxy) !== null && _d !== void 0 ? _d : (settings.proxy = utils.general.getEnvValue('PROXY_URL') ? { url: utils.general.getEnvValue('PROXY_URL') } : undefined);
|
|
37
37
|
(_e = settings.useDnsCache) !== null && _e !== void 0 ? _e : (settings.useDnsCache = utils.general.getEnvValue('USE_DNS_CACHE', 'boolean'));
|
|
38
38
|
(_f = settings.tunnel) !== null && _f !== void 0 ? _f : (settings.tunnel = {});
|
|
@@ -6,7 +6,7 @@ function makeEndSession({ req, tunnels }) {
|
|
|
6
6
|
var _a, _b;
|
|
7
7
|
var _c;
|
|
8
8
|
logger.log(`Request was intercepted with sessionId:`, session.sessionId);
|
|
9
|
-
await req(request.url, { baseUrl: session.
|
|
9
|
+
await req(request.url, { baseUrl: session.ecServerUrl, io: { request, response }, logger });
|
|
10
10
|
if ((_a = session.tests) === null || _a === void 0 ? void 0 : _a.current) {
|
|
11
11
|
await session.tests.current.abort({ settings: { testMetadata: session.metadata }, logger });
|
|
12
12
|
(_b = (_c = session.tests).ended) !== null && _b !== void 0 ? _b : (_c.ended = []);
|
|
@@ -45,7 +45,7 @@ function makeExecuteScript({ req, core }) {
|
|
|
45
45
|
const driver = await (0, driver_1.makeDriver)({
|
|
46
46
|
driver: {
|
|
47
47
|
sessionId: session.sessionId,
|
|
48
|
-
serverUrl: session.
|
|
48
|
+
serverUrl: session.ecServerUrl,
|
|
49
49
|
capabilities: session.capabilities,
|
|
50
50
|
proxy: session.proxy,
|
|
51
51
|
},
|
|
@@ -107,7 +107,7 @@ function makeExecuteScript({ req, core }) {
|
|
|
107
107
|
return;
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
|
-
await req(request.url, { baseUrl: session.
|
|
110
|
+
await req(request.url, { baseUrl: session.ecServerUrl, body: requestBody, io: { request, response }, logger });
|
|
111
111
|
};
|
|
112
112
|
}
|
|
113
113
|
exports.makeExecuteScript = makeExecuteScript;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.makeFindElement = void 0;
|
|
4
|
+
const buffer_1 = require("buffer");
|
|
4
5
|
function makeFindElement({ req }) {
|
|
5
6
|
return async function findElement({ session, request, response, logger, }) {
|
|
6
7
|
var _a, _b, _c;
|
|
7
8
|
logger.log('Inspecting element lookup request to collect self-healing metadata');
|
|
8
9
|
const proxyResponse = await req(request.url, {
|
|
9
|
-
baseUrl: session.
|
|
10
|
+
baseUrl: session.ecServerUrl,
|
|
10
11
|
io: { request, response, handle: false },
|
|
11
12
|
logger,
|
|
12
13
|
});
|
|
@@ -22,7 +23,7 @@ function makeFindElement({ req }) {
|
|
|
22
23
|
}
|
|
23
24
|
response
|
|
24
25
|
.writeHead(proxyResponse.status, Object.fromEntries(proxyResponse.headers.entries()))
|
|
25
|
-
.end(Buffer.from(responseBody));
|
|
26
|
+
.end(buffer_1.Buffer.from(responseBody));
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
29
|
exports.makeFindElement = makeFindElement;
|
|
@@ -24,8 +24,9 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.makeStartSession = void 0;
|
|
27
|
-
const tunnel_client_1 = require("@applitools/tunnel-client");
|
|
28
27
|
const abort_controller_1 = require("abort-controller");
|
|
28
|
+
const buffer_1 = require("buffer");
|
|
29
|
+
const tunnel_client_1 = require("@applitools/tunnel-client");
|
|
29
30
|
const utils = __importStar(require("@applitools/utils"));
|
|
30
31
|
const SERVER_URLS = {
|
|
31
32
|
'us-west': 'https://exec-wus.applitools.com',
|
|
@@ -59,21 +60,21 @@ function makeStartSession({ settings, req, tunnels }) {
|
|
|
59
60
|
Object.fromEntries(Object.entries(capabilities).map(([key, value]) => [key.replace(/^applitools:/, ''), value]))),
|
|
60
61
|
};
|
|
61
62
|
const session = {
|
|
62
|
-
|
|
63
|
+
ecServerUrl: settings.ecServerUrl,
|
|
63
64
|
proxy: settings.proxy,
|
|
64
65
|
credentials: { eyesServerUrl: options.eyesServerUrl, apiKey: options.apiKey },
|
|
65
66
|
options,
|
|
66
67
|
};
|
|
67
68
|
if (options.region) {
|
|
68
69
|
if (SERVER_URLS[options.region])
|
|
69
|
-
session.
|
|
70
|
+
session.ecServerUrl = SERVER_URLS[options.region];
|
|
70
71
|
else
|
|
71
72
|
throw new Error(`Failed to create session in unknown region ${options.region}`);
|
|
72
73
|
}
|
|
73
74
|
if (options.tunnel && tunnels) {
|
|
74
75
|
// TODO should be removed once tunnel spawning issue is solved
|
|
75
|
-
await (0, tunnel_client_1.prepareTunnelEnvironment)({ settings: { tunnelServerUrl: session.
|
|
76
|
-
session.tunnels = await tunnels.acquire({ ...session.credentials, tunnelServerUrl: session.
|
|
76
|
+
await (0, tunnel_client_1.prepareTunnelEnvironment)({ settings: { tunnelServerUrl: session.ecServerUrl }, logger });
|
|
77
|
+
session.tunnels = await tunnels.acquire({ ...session.credentials, tunnelServerUrl: session.ecServerUrl });
|
|
77
78
|
}
|
|
78
79
|
const applitoolsCapabilities = Object.fromEntries([
|
|
79
80
|
...Object.entries(options).map(([key, value]) => [`applitools:${key}`, value]),
|
|
@@ -109,7 +110,7 @@ function makeStartSession({ settings, req, tunnels }) {
|
|
|
109
110
|
if (signal.aborted)
|
|
110
111
|
return queue.pause;
|
|
111
112
|
const proxyResponse = await req(request.url, {
|
|
112
|
-
baseUrl: session.
|
|
113
|
+
baseUrl: session.ecServerUrl,
|
|
113
114
|
body: requestBody,
|
|
114
115
|
io: { request, response, handle: false },
|
|
115
116
|
// TODO uncomment when we can throw different abort reasons for task cancelation and timeout abortion
|
|
@@ -133,7 +134,7 @@ function makeStartSession({ settings, req, tunnels }) {
|
|
|
133
134
|
(_c = (_d = responseBody.value).capabilities) !== null && _c !== void 0 ? _c : (_d.capabilities = {});
|
|
134
135
|
responseBody.value.capabilities['applitools:isECClient'] = true;
|
|
135
136
|
if (proxyResponse.headers.has('content-length')) {
|
|
136
|
-
proxyResponse.headers.set('content-length', Buffer.byteLength(JSON.stringify(responseBody)).toString());
|
|
137
|
+
proxyResponse.headers.set('content-length', buffer_1.Buffer.byteLength(JSON.stringify(responseBody)).toString());
|
|
137
138
|
}
|
|
138
139
|
session.sessionId = responseBody.value.sessionId;
|
|
139
140
|
session.capabilities = responseBody.value.capabilities;
|
package/dist/req-proxy.js
CHANGED
|
@@ -24,6 +24,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.makeReqProxy = void 0;
|
|
27
|
+
const buffer_1 = require("buffer");
|
|
27
28
|
const req_1 = require("@applitools/req");
|
|
28
29
|
const utils = __importStar(require("@applitools/utils"));
|
|
29
30
|
function makeReqProxy(config) {
|
|
@@ -48,7 +49,7 @@ function makeReqProxy(config) {
|
|
|
48
49
|
delete options.headers['content-type'];
|
|
49
50
|
}
|
|
50
51
|
else if (!utils.types.isFunction(options.body, 'pipe')) {
|
|
51
|
-
options.headers['content-length'] = Buffer.byteLength(utils.types.isArray(options.body) || utils.types.isPlainObject(options.body) || options.body === null
|
|
52
|
+
options.headers['content-length'] = buffer_1.Buffer.byteLength(utils.types.isArray(options.body) || utils.types.isPlainObject(options.body) || options.body === null
|
|
52
53
|
? JSON.stringify(options.body)
|
|
53
54
|
: options.body).toString();
|
|
54
55
|
}
|
package/dist/server.js
CHANGED
|
@@ -56,7 +56,7 @@ async function makeServer({ settings, logger: mainLogger, }) {
|
|
|
56
56
|
const core = (0, core_base_1.makeCore)({ agentId: `js/ec-client/${require('../package.json').version}` });
|
|
57
57
|
const tunnels = ((_a = settings.tunnel) === null || _a === void 0 ? void 0 : _a.serviceUrl)
|
|
58
58
|
? await (0, manager_1.makeTunnelManager)({ settings: settings.tunnel, logger: serverLogger })
|
|
59
|
-
: await (0, manager_client_1.makeTunnelManagerClient)({ settings: settings.tunnel });
|
|
59
|
+
: await (0, manager_client_1.makeTunnelManagerClient)({ settings: settings.tunnel, logger: serverLogger });
|
|
60
60
|
const sessions = new Map();
|
|
61
61
|
const commands = {
|
|
62
62
|
startSession: (0, start_session_1.makeStartSession)({ settings, req, tunnels }),
|
|
@@ -87,7 +87,7 @@ async function makeServer({ settings, logger: mainLogger, }) {
|
|
|
87
87
|
router.any(/^\/session\/(?<sessionId>[^\/]+).*$/, async ({ match }) => {
|
|
88
88
|
requestLogger.log('Passthrough request');
|
|
89
89
|
const session = sessions.get(match.groups.sessionId);
|
|
90
|
-
await req(request.url, { baseUrl: session.
|
|
90
|
+
await req(request.url, { baseUrl: session.ecServerUrl, io: { request, response }, logger: requestLogger });
|
|
91
91
|
});
|
|
92
92
|
router.fallback(async () => {
|
|
93
93
|
throw new Error('Unknown request');
|
|
@@ -5,7 +5,7 @@ const manager_server_1 = require("./manager-server");
|
|
|
5
5
|
const socket_1 = require("@applitools/socket");
|
|
6
6
|
const fs_1 = require("fs");
|
|
7
7
|
const net_1 = require("net");
|
|
8
|
-
async function makeTunnelManagerClient({ settings,
|
|
8
|
+
async function makeTunnelManagerClient({ settings, logger, }) {
|
|
9
9
|
const path = process.env.APPLITOOLS_TUNNEL_MANAGER_SOCK ||
|
|
10
10
|
(process.platform === 'win32' ? '\\\\.\\pipe\\applitools-tunnel-manager' : '/tmp/applitools-tunnel-manager.sock');
|
|
11
11
|
const socket = (0, socket_1.makeSocket)((0, net_1.createConnection)({ path }), { transport: 'ipc' });
|
|
@@ -19,7 +19,14 @@ async function makeTunnelManagerClient({ settings, } = {}) {
|
|
|
19
19
|
}
|
|
20
20
|
catch { }
|
|
21
21
|
}
|
|
22
|
-
|
|
22
|
+
logger.log(`Starting tunnel manager in separate process using path ${path} and settings`, settings);
|
|
23
|
+
try {
|
|
24
|
+
server = await (0, manager_server_1.makeTunnelManagerServerProcess)({ settings, path });
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
if (error.code !== 'EADDRINUSE')
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
23
30
|
}
|
|
24
31
|
}
|
|
25
32
|
finally {
|
|
@@ -35,81 +35,95 @@ const os = __importStar(require("os"));
|
|
|
35
35
|
const LOG_DIRNAME = (_a = process.env.APPLITOOLS_LOG_DIR) !== null && _a !== void 0 ? _a : path.resolve(os.tmpdir(), `applitools-tunnel-logs`);
|
|
36
36
|
async function makeTunnelManagerServer({ settings, path, idleTimeout = 600000, // 10min
|
|
37
37
|
}) {
|
|
38
|
-
var _a;
|
|
39
|
-
|
|
40
|
-
const server = (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const logger = (0, logger_1.makeLogger)({
|
|
45
|
-
handler: { type: 'rolling file', name: 'ec-tunnel-manager', dirname: LOG_DIRNAME },
|
|
46
|
-
level: 'info',
|
|
47
|
-
format: {
|
|
48
|
-
label: 'ec-tunnel-manager',
|
|
49
|
-
colors: false,
|
|
50
|
-
},
|
|
51
|
-
});
|
|
52
|
-
logger.log('Server is started');
|
|
53
|
-
const manager = await (0, manager_1.makeTunnelManager)({ settings, logger });
|
|
54
|
-
(_a = process.send) === null || _a === void 0 ? void 0 : _a.call(process, { name: 'started', payload: { path } }); // NOTE: this is a part of the js specific protocol
|
|
55
|
-
let idle;
|
|
56
|
-
let serverClosed = false;
|
|
57
|
-
if (idleTimeout)
|
|
58
|
-
idle = setTimeout(close, idleTimeout);
|
|
59
|
-
server.on('close', () => {
|
|
60
|
-
if (idle)
|
|
61
|
-
clearTimeout(idle);
|
|
62
|
-
serverClosed = true;
|
|
63
|
-
});
|
|
64
|
-
const sockets = new Set();
|
|
65
|
-
server.on('connection', client => {
|
|
66
|
-
const store = [];
|
|
67
|
-
if (idle)
|
|
68
|
-
idle = clearTimeout(idle);
|
|
69
|
-
const socket = (0, socket_1.makeSocket)(client, { transport: 'ipc', logger });
|
|
70
|
-
sockets.add(socket);
|
|
71
|
-
socket.on('close', async () => {
|
|
72
|
-
logger.log('Connection is closed, remaining tunnels are going to be released', store);
|
|
73
|
-
await Promise.all(store.map(manager.release)).catch(logger.error);
|
|
74
|
-
if (sockets.size === 0 && !serverClosed)
|
|
75
|
-
idle = setTimeout(close, idleTimeout);
|
|
38
|
+
var _a, _b;
|
|
39
|
+
try {
|
|
40
|
+
const server = await new Promise((resolve, reject) => {
|
|
41
|
+
const server = (0, net_1.createServer)().listen({ path });
|
|
42
|
+
server.on('error', error => reject(error));
|
|
43
|
+
server.on('listening', () => resolve(server));
|
|
76
44
|
});
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
45
|
+
const logger = (0, logger_1.makeLogger)({
|
|
46
|
+
handler: { type: 'rolling file', name: 'ec-tunnel-manager', dirname: LOG_DIRNAME },
|
|
47
|
+
level: 'info',
|
|
48
|
+
format: {
|
|
49
|
+
label: 'ec-tunnel-manager',
|
|
50
|
+
colors: false,
|
|
51
|
+
},
|
|
81
52
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
53
|
+
logger.log('Server is started');
|
|
54
|
+
const manager = await (0, manager_1.makeTunnelManager)({ settings, logger });
|
|
55
|
+
(_a = process.send) === null || _a === void 0 ? void 0 : _a.call(process, { name: 'started', payload: { path } });
|
|
56
|
+
let idle;
|
|
57
|
+
let serverClosed = false;
|
|
58
|
+
if (idleTimeout)
|
|
59
|
+
idle = setTimeout(close, idleTimeout);
|
|
60
|
+
server.on('close', () => {
|
|
61
|
+
if (idle)
|
|
62
|
+
clearTimeout(idle);
|
|
63
|
+
serverClosed = true;
|
|
86
64
|
});
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
65
|
+
const sockets = new Set();
|
|
66
|
+
server.on('connection', client => {
|
|
67
|
+
const store = [];
|
|
68
|
+
if (idle)
|
|
69
|
+
idle = clearTimeout(idle);
|
|
70
|
+
const socket = (0, socket_1.makeSocket)(client, { transport: 'ipc', logger });
|
|
71
|
+
sockets.add(socket);
|
|
72
|
+
socket.on('close', async () => {
|
|
73
|
+
logger.log('Connection is closed, remaining tunnels are going to be released', store);
|
|
74
|
+
await Promise.all(store.map(manager.release)).catch(logger.error);
|
|
75
|
+
if (sockets.size === 0 && !serverClosed)
|
|
76
|
+
idle = setTimeout(close, idleTimeout);
|
|
77
|
+
});
|
|
78
|
+
socket.command('Tunnel.acquire', async (credentials) => {
|
|
79
|
+
const tunnels = await manager.acquire(credentials);
|
|
80
|
+
store.push(tunnels);
|
|
81
|
+
return tunnels;
|
|
82
|
+
});
|
|
83
|
+
socket.command('Tunnel.release', async (tunnels) => {
|
|
84
|
+
await manager.release(tunnels);
|
|
85
|
+
const storeIndex = store.findIndex(storedTunnels => tunnels.every((tunnel, index) => tunnel.tunnelId === storedTunnels[index].tunnelId));
|
|
86
|
+
tunnels.splice(storeIndex, 1);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
return { close };
|
|
90
|
+
async function close() {
|
|
91
|
+
logger.log('Server is going to be closed');
|
|
92
|
+
server.close();
|
|
93
|
+
await manager.close();
|
|
94
|
+
process.kill(0);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
(_b = process.send) === null || _b === void 0 ? void 0 : _b.call(process, { name: 'error', payload: { error: { message: error.message, code: error.code, stack: error.stack } } });
|
|
99
|
+
throw error;
|
|
94
100
|
}
|
|
95
101
|
}
|
|
96
102
|
exports.makeTunnelManagerServer = makeTunnelManagerServer;
|
|
97
103
|
async function makeTunnelManagerServerProcess(options) {
|
|
98
104
|
return new Promise((resolve, reject) => {
|
|
99
105
|
const server = (0, child_process_1.fork)(path.resolve(__dirname, '../../dist/cli/cli.js'), [`tunnel-manager`, `--config=${JSON.stringify(options)}`], {
|
|
100
|
-
stdio: ['ignore', 'ignore', '
|
|
106
|
+
stdio: ['ignore', 'ignore', 'inherit', 'ipc'],
|
|
101
107
|
detached: true,
|
|
102
108
|
});
|
|
103
109
|
const timeout = setTimeout(() => {
|
|
104
110
|
reject(new Error(`Server didn't respond for 10s after being started`));
|
|
105
111
|
server.kill();
|
|
106
|
-
},
|
|
112
|
+
}, 10000);
|
|
107
113
|
server.on('error', reject);
|
|
108
|
-
server.once('message', (
|
|
114
|
+
server.once('message', (message) => {
|
|
115
|
+
const { name, payload } = message;
|
|
116
|
+
server.channel.unref();
|
|
109
117
|
if (name === 'started') {
|
|
110
118
|
resolve({ close: async () => void server.kill() });
|
|
111
119
|
clearTimeout(timeout);
|
|
112
|
-
|
|
120
|
+
}
|
|
121
|
+
else if (name === 'error') {
|
|
122
|
+
const error = new Error(payload.error.message);
|
|
123
|
+
error.code = payload.error.code;
|
|
124
|
+
error.stack = payload.error.stack;
|
|
125
|
+
reject(error);
|
|
126
|
+
clearTimeout(timeout);
|
|
113
127
|
}
|
|
114
128
|
});
|
|
115
129
|
server.unref();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applitools/ec-client",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.14",
|
|
4
4
|
"homepage": "https://applitools.com",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/applitools/eyes.sdk.javascript1/issues"
|
|
@@ -52,14 +52,14 @@
|
|
|
52
52
|
"test:it": "MOCHA_GROUP=it run --top-level mocha './test/it/*.spec.ts'"
|
|
53
53
|
},
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"@applitools/core-base": "1.7.
|
|
56
|
-
"@applitools/driver": "1.14.
|
|
57
|
-
"@applitools/logger": "2.0.
|
|
58
|
-
"@applitools/req": "1.6.
|
|
59
|
-
"@applitools/socket": "1.1.
|
|
60
|
-
"@applitools/spec-driver-webdriver": "1.0.
|
|
61
|
-
"@applitools/tunnel-client": "1.
|
|
62
|
-
"@applitools/utils": "1.6.
|
|
55
|
+
"@applitools/core-base": "1.7.2",
|
|
56
|
+
"@applitools/driver": "1.14.4",
|
|
57
|
+
"@applitools/logger": "2.0.12",
|
|
58
|
+
"@applitools/req": "1.6.2",
|
|
59
|
+
"@applitools/socket": "1.1.12",
|
|
60
|
+
"@applitools/spec-driver-webdriver": "1.0.48",
|
|
61
|
+
"@applitools/tunnel-client": "1.3.0",
|
|
62
|
+
"@applitools/utils": "1.6.2",
|
|
63
63
|
"abort-controller": "3.0.0",
|
|
64
64
|
"webdriver": "7.31.1",
|
|
65
65
|
"yargs": "^17.7.2"
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { TunnelManagerSettings } from '../types';
|
|
2
|
+
import { type Logger } from '@applitools/logger';
|
|
2
3
|
import { type TunnelManager } from './manager';
|
|
3
|
-
export declare function makeTunnelManagerClient({ settings, }
|
|
4
|
+
export declare function makeTunnelManagerClient({ settings, logger, }: {
|
|
4
5
|
settings?: TunnelManagerSettings;
|
|
6
|
+
logger: Logger;
|
|
5
7
|
}): Promise<TunnelManager & {
|
|
6
8
|
close(): Promise<void>;
|
|
7
9
|
}>;
|
package/types/types.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export interface ECClient {
|
|
|
8
8
|
close(): void;
|
|
9
9
|
}
|
|
10
10
|
export interface ECClientSettings {
|
|
11
|
-
|
|
11
|
+
ecServerUrl: string;
|
|
12
12
|
proxy?: Proxy;
|
|
13
13
|
useDnsCache?: boolean;
|
|
14
14
|
options?: ECCapabilitiesOptions;
|
|
@@ -32,7 +32,7 @@ export interface ECCapabilitiesOptions {
|
|
|
32
32
|
selfHealingMaxRetryTime?: number;
|
|
33
33
|
}
|
|
34
34
|
export interface ECSession {
|
|
35
|
-
|
|
35
|
+
ecServerUrl: string;
|
|
36
36
|
proxy?: Proxy;
|
|
37
37
|
sessionId: string;
|
|
38
38
|
credentials: {
|