@applitools/ec-client 1.2.15 → 1.2.16

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.
@@ -121,6 +121,7 @@ async function makeServer({ settings, logger }) {
121
121
  resolve({
122
122
  url: `http://localhost:${address.port}`,
123
123
  port: address.port,
124
+ unref: () => server.unref(),
124
125
  close: () => server.close(),
125
126
  });
126
127
  });
@@ -3,23 +3,38 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeTunnelManagerClient = void 0;
4
4
  const manager_server_1 = require("./manager-server");
5
5
  const socket_1 = require("@applitools/socket");
6
+ const fs_1 = require("fs");
6
7
  const net_1 = require("net");
7
8
  async function makeTunnelManagerClient({ settings, } = {}) {
8
9
  const path = process.env.APPLITOOLS_TUNNEL_MANAGER_SOCK ||
9
10
  (process.platform === 'win32' ? '\\\\.\\pipe\\applitools-tunnel-manager' : '/tmp/applitools-tunnel-manager.sock');
10
11
  const socket = (0, socket_1.makeSocket)((0, net_1.createConnection)({ path }), { transport: 'ipc' });
12
+ let server;
11
13
  socket.once('error', async (error) => {
12
- if (['ECONNREFUSED', 'ENOENT'].includes(error.code)) {
13
- await (0, manager_server_1.makeTunnelManagerServerProcess)({ settings, path, unlink: error.code === 'ECONNREFUSED' });
14
+ try {
15
+ if (['ECONNREFUSED', 'ENOENT'].includes(error.code)) {
16
+ if (error.code === 'ECONNREFUSED') {
17
+ try {
18
+ await fs_1.promises.unlink(path);
19
+ }
20
+ catch { }
21
+ }
22
+ server = await (0, manager_server_1.makeTunnelManagerServerProcess)({ settings, path });
23
+ }
24
+ }
25
+ finally {
14
26
  socket.use((0, net_1.createConnection)({ path }));
15
27
  }
16
28
  });
17
29
  socket.once('ready', () => socket.target.unref());
18
30
  return {
19
- create: (options) => socket.request('Tunnel.create', options),
31
+ create: (options) => {
32
+ return socket.request('Tunnel.create', options);
33
+ },
20
34
  destroy: (options) => socket.request('Tunnel.destroy', options),
21
35
  acquire: (options) => socket.request('Tunnel.acquire', options),
22
36
  release: (options) => socket.request('Tunnel.release', options),
37
+ close: () => server === null || server === void 0 ? void 0 : server.close(),
23
38
  };
24
39
  }
25
40
  exports.makeTunnelManagerClient = makeTunnelManagerClient;
@@ -30,15 +30,12 @@ const logger_1 = require("@applitools/logger");
30
30
  const socket_1 = require("@applitools/socket");
31
31
  const manager_1 = require("./manager");
32
32
  const child_process_1 = require("child_process");
33
- const fs_1 = require("fs");
34
33
  const path = __importStar(require("path"));
35
34
  const os = __importStar(require("os"));
36
35
  const LOG_DIRNAME = (_a = process.env.APPLITOOLS_LOG_DIR) !== null && _a !== void 0 ? _a : path.resolve(os.tmpdir(), `applitools-tunnel-logs`);
37
- async function makeTunnelManagerServer({ settings, path, unlink, idleTimeout = 600000, // 10min
36
+ async function makeTunnelManagerServer({ settings, path, idleTimeout = 600000, // 10min
38
37
  }) {
39
38
  var _a;
40
- if (unlink)
41
- await fs_1.promises.unlink(path);
42
39
  const server = await new Promise((resolve, reject) => {
43
40
  const server = (0, net_1.createServer)().listen({ path });
44
41
  server.on('error', error => reject(error));
@@ -56,7 +53,7 @@ async function makeTunnelManagerServer({ settings, path, unlink, idleTimeout = 6
56
53
  let idle;
57
54
  let serverClosed = false;
58
55
  if (idleTimeout)
59
- idle = setTimeout(() => server.close(), idleTimeout);
56
+ idle = setTimeout(close, idleTimeout);
60
57
  server.on('close', () => {
61
58
  if (idle)
62
59
  clearTimeout(idle);
@@ -64,24 +61,29 @@ async function makeTunnelManagerServer({ settings, path, unlink, idleTimeout = 6
64
61
  });
65
62
  const sockets = new Set();
66
63
  server.on('connection', client => {
67
- const socket = (0, socket_1.makeSocket)(client, { transport: 'ipc', logger });
68
- sockets.add(socket);
69
- socket.on('close', () => sockets.delete(socket));
70
64
  if (idle) {
71
65
  clearTimeout(idle);
72
66
  idle = null;
73
- socket.on('close', () => {
74
- sockets.delete(socket);
75
- if (sockets.size > 0 || serverClosed)
76
- return;
77
- idle = setTimeout(() => server.close(), idleTimeout);
78
- });
79
67
  }
68
+ const socket = (0, socket_1.makeSocket)(client, { transport: 'ipc', logger });
69
+ sockets.add(socket);
70
+ socket.on('close', () => {
71
+ sockets.delete(socket);
72
+ if (sockets.size > 0 || serverClosed)
73
+ return;
74
+ idle = setTimeout(close, idleTimeout);
75
+ });
80
76
  socket.command('Tunnel.create', manager.create);
81
77
  socket.command('Tunnel.destroy', manager.destroy);
82
78
  socket.command('Tunnel.acquire', manager.acquire);
83
79
  socket.command('Tunnel.release', manager.release);
84
80
  });
81
+ return { close };
82
+ async function close() {
83
+ server.close();
84
+ manager.close();
85
+ process.kill(0);
86
+ }
85
87
  }
86
88
  exports.makeTunnelManagerServer = makeTunnelManagerServer;
87
89
  async function makeTunnelManagerServerProcess(options) {
@@ -97,7 +99,7 @@ async function makeTunnelManagerServerProcess(options) {
97
99
  server.on('error', reject);
98
100
  server.once('message', ({ name }) => {
99
101
  if (name === 'started') {
100
- resolve({ cleanup: () => server.kill() });
102
+ resolve({ close: async () => void server.kill() });
101
103
  clearTimeout(timeout);
102
104
  server.channel.unref();
103
105
  }
@@ -52,7 +52,7 @@ async function makeTunnelManager({ settings, logger, }) {
52
52
  },
53
53
  });
54
54
  const pools = new Map();
55
- return { create, destroy, acquire, release, cleanup };
55
+ return { create, destroy, acquire, release, close };
56
56
  async function acquire(credentials) {
57
57
  const key = JSON.stringify(credentials);
58
58
  let pool = pools.get(key);
@@ -118,7 +118,7 @@ async function makeTunnelManager({ settings, logger, }) {
118
118
  server = { port, close: cleanupFunction };
119
119
  return `http://localhost:${port}`;
120
120
  }
121
- async function cleanup() {
121
+ async function close() {
122
122
  await (server === null || server === void 0 ? void 0 : server.close());
123
123
  }
124
124
  }
@@ -154,7 +154,7 @@ function makePool(options) {
154
154
  item.timers.expiration = setTimeout(() => destroy(resource), options.timeout.expiration);
155
155
  item.expireAt = Date.now() + options.timeout.expiration;
156
156
  }
157
- pool.set(resource, item);
157
+ pool.set(JSON.stringify(resource), item);
158
158
  }
159
159
  async function get() {
160
160
  var _a;
@@ -167,7 +167,7 @@ function makePool(options) {
167
167
  }
168
168
  async function use(resource) {
169
169
  var _a, _b;
170
- const item = pool.get(resource);
170
+ const item = pool.get(JSON.stringify(resource));
171
171
  if (!item)
172
172
  return false;
173
173
  if ((_a = item.timers) === null || _a === void 0 ? void 0 : _a.idle)
@@ -177,7 +177,7 @@ function makePool(options) {
177
177
  }
178
178
  async function release(resource) {
179
179
  var _a, _b;
180
- const item = pool.get(resource);
180
+ const item = pool.get(JSON.stringify(resource));
181
181
  if (!item)
182
182
  return false;
183
183
  item.inuse -= 1;
@@ -196,7 +196,7 @@ function makePool(options) {
196
196
  }
197
197
  async function destroy(resource) {
198
198
  var _a, _b, _c, _d;
199
- const item = pool.get(resource);
199
+ const item = pool.get(JSON.stringify(resource));
200
200
  if (!item)
201
201
  return false;
202
202
  item.destroyed = true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applitools/ec-client",
3
- "version": "1.2.15",
3
+ "version": "1.2.16",
4
4
  "homepage": "https://applitools.com",
5
5
  "bugs": {
6
6
  "url": "https://github.com/applitools/eyes.sdk.javascript1/issues"
@@ -60,20 +60,20 @@
60
60
  "deps": "bongo deps",
61
61
  "preversion": "bongo preversion",
62
62
  "version": "bongo version",
63
- "postversion": "bongo postversion --skip-release-notification"
63
+ "postversion": "bongo postversion"
64
64
  },
65
65
  "dependencies": {
66
- "@applitools/execution-grid-tunnel": "1.0.19",
67
- "@applitools/logger": "1.1.47",
68
- "@applitools/req": "1.1.31",
69
- "@applitools/socket": "1.0.9",
70
- "@applitools/utils": "1.3.31",
66
+ "@applitools/execution-grid-tunnel": "1.0.20",
67
+ "@applitools/logger": "1.1.48",
68
+ "@applitools/req": "1.1.32",
69
+ "@applitools/socket": "1.0.10",
70
+ "@applitools/utils": "1.3.32",
71
71
  "abort-controller": "3.0.0",
72
72
  "yargs": "17.6.2"
73
73
  },
74
74
  "devDependencies": {
75
- "@applitools/bongo": "^2.2.5",
76
- "@applitools/test-server": "^1.1.27",
75
+ "@applitools/bongo": "^3.0.1",
76
+ "@applitools/test-server": "^1.1.28",
77
77
  "@types/node": "^12.20.55",
78
78
  "@types/node-fetch": "^2.6.1",
79
79
  "@types/selenium-webdriver": "^4.0.19",
@@ -1,4 +1,6 @@
1
1
  import { type TunnelManager, type TunnelManagerSettings } from './manager';
2
2
  export declare function makeTunnelManagerClient({ settings, }?: {
3
3
  settings?: TunnelManagerSettings;
4
- }): Promise<TunnelManager>;
4
+ }): Promise<TunnelManager & {
5
+ close(): Promise<void>;
6
+ }>;
@@ -1,9 +1,12 @@
1
1
  import { type TunnelManagerSettings } from './manager';
2
+ export type TunnelManagerServer = {
3
+ close(): Promise<void>;
4
+ };
2
5
  export type TunnelManagerServerOptions = {
3
6
  settings?: TunnelManagerSettings;
4
7
  idleTimeout?: number;
5
8
  path: string;
6
9
  unlink?: boolean;
7
10
  };
8
- export declare function makeTunnelManagerServer({ settings, path, unlink, idleTimeout, }: TunnelManagerServerOptions): Promise<void>;
9
- export declare function makeTunnelManagerServerProcess(options: TunnelManagerServerOptions): Promise<unknown>;
11
+ export declare function makeTunnelManagerServer({ settings, path, idleTimeout, }: TunnelManagerServerOptions): Promise<TunnelManagerServer>;
12
+ export declare function makeTunnelManagerServerProcess(options: TunnelManagerServerOptions): Promise<TunnelManagerServer>;
@@ -28,5 +28,5 @@ export declare function makeTunnelManager({ settings, logger, }: {
28
28
  settings?: TunnelManagerSettings;
29
29
  logger: Logger;
30
30
  }): Promise<TunnelManager & {
31
- cleanup(): Promise<void>;
31
+ close(): Promise<void>;
32
32
  }>;
package/types/types.d.ts CHANGED
@@ -2,6 +2,7 @@ import { type Proxy } from '@applitools/req';
2
2
  export interface ECClient {
3
3
  readonly url: string;
4
4
  readonly port: number;
5
+ unref(): void;
5
6
  close(): void;
6
7
  }
7
8
  export interface ECClientSettings {