@blitzbrowser/blitzbrowser 1.0.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/.eslintrc.js +25 -0
- package/.prettierrc +4 -0
- package/Dockerfile +26 -0
- package/LICENSE +201 -0
- package/README.md +1 -0
- package/dist/app.module.d.ts +2 -0
- package/dist/app.module.js +51 -0
- package/dist/app.module.js.map +1 -0
- package/dist/components/browser-instance.component.d.ts +53 -0
- package/dist/components/browser-instance.component.js +373 -0
- package/dist/components/browser-instance.component.js.map +1 -0
- package/dist/components/browser-instance.process.d.ts +1 -0
- package/dist/components/browser-instance.process.js +174 -0
- package/dist/components/browser-instance.process.js.map +1 -0
- package/dist/controllers/cdp.controller.d.ts +17 -0
- package/dist/controllers/cdp.controller.js +122 -0
- package/dist/controllers/cdp.controller.js.map +1 -0
- package/dist/controllers/pool-status.controller.d.ts +10 -0
- package/dist/controllers/pool-status.controller.js +38 -0
- package/dist/controllers/pool-status.controller.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +10 -0
- package/dist/main.js.map +1 -0
- package/dist/services/browser-pool.service.d.ts +36 -0
- package/dist/services/browser-pool.service.js +128 -0
- package/dist/services/browser-pool.service.js.map +1 -0
- package/dist/services/timezone.service.d.ts +6 -0
- package/dist/services/timezone.service.js +64 -0
- package/dist/services/timezone.service.js.map +1 -0
- package/dist/services/user-data.service.d.ts +15 -0
- package/dist/services/user-data.service.js +107 -0
- package/dist/services/user-data.service.js.map +1 -0
- package/dist/transforms/limit-stream.d.ts +7 -0
- package/dist/transforms/limit-stream.js +22 -0
- package/dist/transforms/limit-stream.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/docker-compose.yml +23 -0
- package/nest-cli.json +8 -0
- package/package.json +68 -0
- package/src/app.module.ts +39 -0
- package/src/components/browser-instance.component.ts +534 -0
- package/src/components/browser-instance.process.ts +193 -0
- package/src/controllers/cdp.controller.ts +122 -0
- package/src/controllers/pool-status.controller.ts +18 -0
- package/src/main.ts +9 -0
- package/src/services/browser-pool.service.ts +139 -0
- package/src/services/timezone.service.ts +42 -0
- package/src/services/user-data.service.ts +111 -0
- package/src/transforms/limit-stream.ts +30 -0
- package/tsconfig.build.json +4 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _PortPool_next_port_to_claim, _PortPool_available_ports, _BrowserInstance_instances, _a, _BrowserInstance_CDP_PORT_POOL, _BrowserInstance_logger, _BrowserInstance_browser_pool_service, _BrowserInstance_browser_instance_process, _BrowserInstance_proxy_server, _BrowserInstance_cdp_websocket, _BrowserInstance_connected_at, _BrowserInstance_preparation_tasks_started_at, _BrowserInstance_browser_process_launching_at, _BrowserInstance_browser_process_launched_at, _BrowserInstance_browser_process_cdp_connected_at, _BrowserInstance_browser_process_cdp_terminated_at, _BrowserInstance_completion_tasks_started_at, _BrowserInstance_cdp_close_event_at, _BrowserInstance_user_data_folder, _BrowserInstance_connection_options, _BrowserInstance_tunnel, _BrowserInstance_event_channel, _BrowserInstance_cdp_channel, _BrowserInstance_timezone, _BrowserInstance_cdp_port, _BrowserInstance_startPreparationTasks, _BrowserInstance_downloadUserData, _BrowserInstance_proxy_connections, _BrowserInstance_startProxyServer, _BrowserInstance_updateTimezone, _BrowserInstance_uploadUserData, _BrowserInstance_launchProcess, _BrowserInstance_sendBrowserInstanceStatus, _BrowserInstance_isBrowserProcessAlive;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.BrowserInstance = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const child_process_1 = require("child_process");
|
|
18
|
+
const ProxyChain = require("proxy-chain");
|
|
19
|
+
const EventEmitter = require("events");
|
|
20
|
+
const ws_1 = require("ws");
|
|
21
|
+
const user_data_service_1 = require("../services/user-data.service");
|
|
22
|
+
const fsPromise = require("fs/promises");
|
|
23
|
+
const timezone_service_1 = require("../services/timezone.service");
|
|
24
|
+
const browser_pool_service_1 = require("../services/browser-pool.service");
|
|
25
|
+
class PortPool {
|
|
26
|
+
constructor(starting_port) {
|
|
27
|
+
_PortPool_next_port_to_claim.set(this, 13000);
|
|
28
|
+
_PortPool_available_ports.set(this, []);
|
|
29
|
+
__classPrivateFieldSet(this, _PortPool_next_port_to_claim, starting_port, "f");
|
|
30
|
+
}
|
|
31
|
+
getAvailablePort() {
|
|
32
|
+
var _b, _c;
|
|
33
|
+
if (__classPrivateFieldGet(this, _PortPool_available_ports, "f").length === 0) {
|
|
34
|
+
return __classPrivateFieldSet(this, _PortPool_next_port_to_claim, (_c = __classPrivateFieldGet(this, _PortPool_next_port_to_claim, "f"), _b = _c++, _c), "f"), _b;
|
|
35
|
+
}
|
|
36
|
+
return __classPrivateFieldGet(this, _PortPool_available_ports, "f").shift();
|
|
37
|
+
}
|
|
38
|
+
releasePort(port) {
|
|
39
|
+
if (typeof port !== 'number') {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
__classPrivateFieldGet(this, _PortPool_available_ports, "f").push(port);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
_PortPool_next_port_to_claim = new WeakMap(), _PortPool_available_ports = new WeakMap();
|
|
46
|
+
class BrowserInstance extends EventEmitter {
|
|
47
|
+
constructor(id, module_ref) {
|
|
48
|
+
super();
|
|
49
|
+
_BrowserInstance_instances.add(this);
|
|
50
|
+
this.id = id;
|
|
51
|
+
this.module_ref = module_ref;
|
|
52
|
+
_BrowserInstance_logger.set(this, void 0);
|
|
53
|
+
_BrowserInstance_browser_pool_service.set(this, void 0);
|
|
54
|
+
_BrowserInstance_browser_instance_process.set(this, void 0);
|
|
55
|
+
_BrowserInstance_proxy_server.set(this, void 0);
|
|
56
|
+
_BrowserInstance_cdp_websocket.set(this, void 0);
|
|
57
|
+
_BrowserInstance_connected_at.set(this, void 0);
|
|
58
|
+
_BrowserInstance_preparation_tasks_started_at.set(this, void 0);
|
|
59
|
+
_BrowserInstance_browser_process_launching_at.set(this, void 0);
|
|
60
|
+
_BrowserInstance_browser_process_launched_at.set(this, void 0);
|
|
61
|
+
_BrowserInstance_browser_process_cdp_connected_at.set(this, void 0);
|
|
62
|
+
_BrowserInstance_browser_process_cdp_terminated_at.set(this, void 0);
|
|
63
|
+
_BrowserInstance_completion_tasks_started_at.set(this, void 0);
|
|
64
|
+
_BrowserInstance_cdp_close_event_at.set(this, void 0);
|
|
65
|
+
_BrowserInstance_user_data_folder.set(this, void 0);
|
|
66
|
+
_BrowserInstance_connection_options.set(this, void 0);
|
|
67
|
+
_BrowserInstance_tunnel.set(this, void 0);
|
|
68
|
+
_BrowserInstance_event_channel.set(this, void 0);
|
|
69
|
+
_BrowserInstance_cdp_channel.set(this, void 0);
|
|
70
|
+
_BrowserInstance_timezone.set(this, void 0);
|
|
71
|
+
_BrowserInstance_cdp_port.set(this, void 0);
|
|
72
|
+
_BrowserInstance_proxy_connections.set(this, {});
|
|
73
|
+
__classPrivateFieldSet(this, _BrowserInstance_browser_pool_service, this.module_ref.get(browser_pool_service_1.BrowserPoolService), "f");
|
|
74
|
+
__classPrivateFieldSet(this, _BrowserInstance_logger, new common_1.Logger(`${_a.name}|${id}`), "f");
|
|
75
|
+
__classPrivateFieldSet(this, _BrowserInstance_user_data_folder, `/home/pptruser/user-data/${id}`, "f");
|
|
76
|
+
}
|
|
77
|
+
get in_use() {
|
|
78
|
+
return typeof __classPrivateFieldGet(this, _BrowserInstance_connected_at, "f") === 'string';
|
|
79
|
+
}
|
|
80
|
+
get cdp_terminated() {
|
|
81
|
+
return typeof __classPrivateFieldGet(this, _BrowserInstance_browser_process_cdp_terminated_at, "f") === 'string';
|
|
82
|
+
}
|
|
83
|
+
connectTunnel(tunnel) {
|
|
84
|
+
if (this.in_use) {
|
|
85
|
+
throw new Error(`Browser instance ${this.id} is already in use.`);
|
|
86
|
+
}
|
|
87
|
+
__classPrivateFieldSet(this, _BrowserInstance_connected_at, new Date().toISOString(), "f");
|
|
88
|
+
__classPrivateFieldSet(this, _BrowserInstance_tunnel, tunnel, "f");
|
|
89
|
+
__classPrivateFieldGet(this, _BrowserInstance_tunnel, "f").on('closed', () => {
|
|
90
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Tunnel closed');
|
|
91
|
+
this.close();
|
|
92
|
+
});
|
|
93
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Connecting tunnel.');
|
|
94
|
+
__classPrivateFieldSet(this, _BrowserInstance_event_channel, __classPrivateFieldGet(this, _BrowserInstance_tunnel, "f").createChannel(_a.EVENT_CHANNEL_ID, async (data) => {
|
|
95
|
+
const event = JSON.parse(data.toString('utf8'));
|
|
96
|
+
switch (event.type) {
|
|
97
|
+
case 'CONNECTION_OPTIONS':
|
|
98
|
+
__classPrivateFieldSet(this, _BrowserInstance_connection_options, event.options, "f");
|
|
99
|
+
__classPrivateFieldGet(this, _BrowserInstance_instances, "m", _BrowserInstance_startPreparationTasks).call(this);
|
|
100
|
+
break;
|
|
101
|
+
case 'CDP_CLOSE':
|
|
102
|
+
__classPrivateFieldSet(this, _BrowserInstance_cdp_close_event_at, new Date().toISOString(), "f");
|
|
103
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Received CDP Close event');
|
|
104
|
+
this.close();
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}), "f");
|
|
108
|
+
__classPrivateFieldGet(this, _BrowserInstance_instances, "m", _BrowserInstance_sendBrowserInstanceStatus).call(this);
|
|
109
|
+
this.once('cdp_terminated', () => {
|
|
110
|
+
__classPrivateFieldGet(this, _BrowserInstance_instances, "m", _BrowserInstance_sendBrowserInstanceStatus).call(this);
|
|
111
|
+
__classPrivateFieldGet(this, _BrowserInstance_event_channel, "f").send(JSON.stringify({ type: 'CDP_TERMINATED', status: this.status }));
|
|
112
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('CDP terminated, will now close.');
|
|
113
|
+
this.close();
|
|
114
|
+
});
|
|
115
|
+
this.once('terminated', () => {
|
|
116
|
+
__classPrivateFieldGet(_a, _a, "f", _BrowserInstance_CDP_PORT_POOL).releasePort(__classPrivateFieldGet(this, _BrowserInstance_cdp_port, "f"));
|
|
117
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Released CDP port');
|
|
118
|
+
__classPrivateFieldGet(this, _BrowserInstance_instances, "m", _BrowserInstance_sendBrowserInstanceStatus).call(this);
|
|
119
|
+
__classPrivateFieldGet(this, _BrowserInstance_tunnel, "f").close();
|
|
120
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Closed tunnel.');
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
async close() {
|
|
124
|
+
if (typeof __classPrivateFieldGet(this, _BrowserInstance_completion_tasks_started_at, "f") === 'string') {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
__classPrivateFieldSet(this, _BrowserInstance_completion_tasks_started_at, new Date().toISOString(), "f");
|
|
128
|
+
__classPrivateFieldGet(this, _BrowserInstance_instances, "m", _BrowserInstance_sendBrowserInstanceStatus).call(this);
|
|
129
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Starting completion tasks.');
|
|
130
|
+
if (__classPrivateFieldGet(this, _BrowserInstance_instances, "m", _BrowserInstance_isBrowserProcessAlive).call(this)) {
|
|
131
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Killing process');
|
|
132
|
+
try {
|
|
133
|
+
await new Promise((res) => {
|
|
134
|
+
__classPrivateFieldGet(this, _BrowserInstance_browser_instance_process, "f").once('exit', () => {
|
|
135
|
+
res(undefined);
|
|
136
|
+
});
|
|
137
|
+
__classPrivateFieldGet(this, _BrowserInstance_browser_instance_process, "f").kill();
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch (e) {
|
|
141
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").error('Error while killing process', e?.stack);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Process already killed.');
|
|
146
|
+
}
|
|
147
|
+
if (__classPrivateFieldGet(this, _BrowserInstance_cdp_websocket, "f")) {
|
|
148
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Closing cdp websocket.');
|
|
149
|
+
__classPrivateFieldGet(this, _BrowserInstance_cdp_websocket, "f").close();
|
|
150
|
+
}
|
|
151
|
+
if (__classPrivateFieldGet(this, _BrowserInstance_proxy_server, "f")) {
|
|
152
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Closing proxy server.');
|
|
153
|
+
try {
|
|
154
|
+
await __classPrivateFieldGet(this, _BrowserInstance_proxy_server, "f").close(true);
|
|
155
|
+
}
|
|
156
|
+
catch (e) {
|
|
157
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").error('Error while closing proxy server', e?.stack);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
await __classPrivateFieldGet(this, _BrowserInstance_instances, "m", _BrowserInstance_uploadUserData).call(this);
|
|
162
|
+
}
|
|
163
|
+
catch (e) {
|
|
164
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").error('Error while uploading user data', e?.stack || e);
|
|
165
|
+
}
|
|
166
|
+
try {
|
|
167
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Deleting user data.');
|
|
168
|
+
await fsPromise.rm(__classPrivateFieldGet(this, _BrowserInstance_user_data_folder, "f"), { recursive: true, force: true, maxRetries: 3, retryDelay: 250 });
|
|
169
|
+
}
|
|
170
|
+
catch (e) {
|
|
171
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").error('Error while deleting user data', e?.stack || e);
|
|
172
|
+
}
|
|
173
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Completion tasks terminated.');
|
|
174
|
+
this.emit('terminated');
|
|
175
|
+
}
|
|
176
|
+
get status() {
|
|
177
|
+
return {
|
|
178
|
+
browser_pool: __classPrivateFieldGet(this, _BrowserInstance_browser_pool_service, "f").status,
|
|
179
|
+
connected_at: __classPrivateFieldGet(this, _BrowserInstance_connected_at, "f"),
|
|
180
|
+
preparation_tasks_started_at: __classPrivateFieldGet(this, _BrowserInstance_preparation_tasks_started_at, "f"),
|
|
181
|
+
browser_process_launching_at: __classPrivateFieldGet(this, _BrowserInstance_browser_process_launching_at, "f"),
|
|
182
|
+
browser_process_launched_at: __classPrivateFieldGet(this, _BrowserInstance_browser_process_launched_at, "f"),
|
|
183
|
+
browser_process_cdp_connected_at: __classPrivateFieldGet(this, _BrowserInstance_browser_process_cdp_connected_at, "f"),
|
|
184
|
+
browser_process_cdp_terminated_at: __classPrivateFieldGet(this, _BrowserInstance_browser_process_cdp_terminated_at, "f"),
|
|
185
|
+
completion_tasks_started_at: __classPrivateFieldGet(this, _BrowserInstance_completion_tasks_started_at, "f"),
|
|
186
|
+
cdp_close_event_at: __classPrivateFieldGet(this, _BrowserInstance_cdp_close_event_at, "f"),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.BrowserInstance = BrowserInstance;
|
|
191
|
+
_a = BrowserInstance, _BrowserInstance_logger = new WeakMap(), _BrowserInstance_browser_pool_service = new WeakMap(), _BrowserInstance_browser_instance_process = new WeakMap(), _BrowserInstance_proxy_server = new WeakMap(), _BrowserInstance_cdp_websocket = new WeakMap(), _BrowserInstance_connected_at = new WeakMap(), _BrowserInstance_preparation_tasks_started_at = new WeakMap(), _BrowserInstance_browser_process_launching_at = new WeakMap(), _BrowserInstance_browser_process_launched_at = new WeakMap(), _BrowserInstance_browser_process_cdp_connected_at = new WeakMap(), _BrowserInstance_browser_process_cdp_terminated_at = new WeakMap(), _BrowserInstance_completion_tasks_started_at = new WeakMap(), _BrowserInstance_cdp_close_event_at = new WeakMap(), _BrowserInstance_user_data_folder = new WeakMap(), _BrowserInstance_connection_options = new WeakMap(), _BrowserInstance_tunnel = new WeakMap(), _BrowserInstance_event_channel = new WeakMap(), _BrowserInstance_cdp_channel = new WeakMap(), _BrowserInstance_timezone = new WeakMap(), _BrowserInstance_cdp_port = new WeakMap(), _BrowserInstance_proxy_connections = new WeakMap(), _BrowserInstance_instances = new WeakSet(), _BrowserInstance_startPreparationTasks = async function _BrowserInstance_startPreparationTasks() {
|
|
192
|
+
try {
|
|
193
|
+
__classPrivateFieldSet(this, _BrowserInstance_preparation_tasks_started_at, new Date().toISOString(), "f");
|
|
194
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Starting preparation tasks');
|
|
195
|
+
await fsPromise.mkdir(__classPrivateFieldGet(this, _BrowserInstance_user_data_folder, "f"), { recursive: true });
|
|
196
|
+
__classPrivateFieldSet(this, _BrowserInstance_cdp_port, __classPrivateFieldGet(_a, _a, "f", _BrowserInstance_CDP_PORT_POOL).getAvailablePort(), "f");
|
|
197
|
+
await Promise.all([
|
|
198
|
+
__classPrivateFieldGet(this, _BrowserInstance_instances, "m", _BrowserInstance_startProxyServer).call(this),
|
|
199
|
+
__classPrivateFieldGet(this, _BrowserInstance_instances, "m", _BrowserInstance_updateTimezone).call(this),
|
|
200
|
+
(async () => {
|
|
201
|
+
if (__classPrivateFieldGet(this, _BrowserInstance_connection_options, "f")?.user_data_id) {
|
|
202
|
+
await __classPrivateFieldGet(this, _BrowserInstance_instances, "m", _BrowserInstance_downloadUserData).call(this);
|
|
203
|
+
}
|
|
204
|
+
})()
|
|
205
|
+
]);
|
|
206
|
+
await __classPrivateFieldGet(this, _BrowserInstance_instances, "m", _BrowserInstance_launchProcess).call(this);
|
|
207
|
+
__classPrivateFieldGet(this, _BrowserInstance_instances, "m", _BrowserInstance_sendBrowserInstanceStatus).call(this);
|
|
208
|
+
}
|
|
209
|
+
catch (e) {
|
|
210
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").error('Error while doing preparation tasks', e?.stack || e);
|
|
211
|
+
this.close();
|
|
212
|
+
}
|
|
213
|
+
}, _BrowserInstance_downloadUserData = async function _BrowserInstance_downloadUserData() {
|
|
214
|
+
if (!__classPrivateFieldGet(this, _BrowserInstance_connection_options, "f").user_data_id) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
await this.module_ref.get(user_data_service_1.UserDataService).downloadUserData(__classPrivateFieldGet(this, _BrowserInstance_connection_options, "f").user_data_id, __classPrivateFieldGet(this, _BrowserInstance_user_data_folder, "f"));
|
|
218
|
+
}, _BrowserInstance_startProxyServer = async function _BrowserInstance_startProxyServer() {
|
|
219
|
+
if (__classPrivateFieldGet(this, _BrowserInstance_proxy_server, "f")) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
return new Promise((res, rej) => {
|
|
223
|
+
__classPrivateFieldSet(this, _BrowserInstance_proxy_server, new ProxyChain.Server({
|
|
224
|
+
port: 0,
|
|
225
|
+
host: '127.0.0.1',
|
|
226
|
+
verbose: false,
|
|
227
|
+
prepareRequestFunction: async ({ request, connectionId }) => {
|
|
228
|
+
__classPrivateFieldGet(this, _BrowserInstance_proxy_connections, "f")[connectionId] = { url: request.url };
|
|
229
|
+
if (!this.in_use || !__classPrivateFieldGet(this, _BrowserInstance_connection_options, "f")?.proxy_url) {
|
|
230
|
+
return {};
|
|
231
|
+
}
|
|
232
|
+
return {
|
|
233
|
+
upstreamProxyUrl: __classPrivateFieldGet(this, _BrowserInstance_connection_options, "f").proxy_url
|
|
234
|
+
};
|
|
235
|
+
},
|
|
236
|
+
}), "f");
|
|
237
|
+
__classPrivateFieldGet(this, _BrowserInstance_proxy_server, "f").listen((err) => {
|
|
238
|
+
if (err) {
|
|
239
|
+
rej(err);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
__classPrivateFieldGet(this, _BrowserInstance_proxy_server, "f").on('connectionClosed', ({ connectionId, stats }) => {
|
|
243
|
+
if (__classPrivateFieldGet(this, _BrowserInstance_event_channel, "f")) {
|
|
244
|
+
const proxy_connection = __classPrivateFieldGet(this, _BrowserInstance_proxy_connections, "f")[connectionId];
|
|
245
|
+
if (proxy_connection) {
|
|
246
|
+
__classPrivateFieldGet(this, _BrowserInstance_event_channel, "f").send(JSON.stringify({
|
|
247
|
+
type: 'BROWSER_INSTANCE_REQUEST',
|
|
248
|
+
url: proxy_connection.url,
|
|
249
|
+
bytes_downloaded: stats.trgRxBytes,
|
|
250
|
+
bytes_uploaded: stats.trgTxBytes,
|
|
251
|
+
created_at: new Date().toISOString()
|
|
252
|
+
}));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
delete __classPrivateFieldGet(this, _BrowserInstance_proxy_connections, "f")[connectionId];
|
|
256
|
+
});
|
|
257
|
+
res(undefined);
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
}, _BrowserInstance_updateTimezone = async function _BrowserInstance_updateTimezone() {
|
|
261
|
+
if (__classPrivateFieldGet(this, _BrowserInstance_connection_options, "f")?.timezone) {
|
|
262
|
+
__classPrivateFieldSet(this, _BrowserInstance_timezone, __classPrivateFieldGet(this, _BrowserInstance_connection_options, "f").timezone, "f");
|
|
263
|
+
}
|
|
264
|
+
else if (__classPrivateFieldGet(this, _BrowserInstance_connection_options, "f")?.proxy_url) {
|
|
265
|
+
__classPrivateFieldSet(this, _BrowserInstance_timezone, await this.module_ref.get(timezone_service_1.TimezoneService).getProxyTimezone(__classPrivateFieldGet(this, _BrowserInstance_connection_options, "f").proxy_url), "f");
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
__classPrivateFieldSet(this, _BrowserInstance_timezone, await this.module_ref.get(timezone_service_1.TimezoneService).getDefaultTimezone(), "f");
|
|
269
|
+
}
|
|
270
|
+
}, _BrowserInstance_uploadUserData = async function _BrowserInstance_uploadUserData() {
|
|
271
|
+
if (!__classPrivateFieldGet(this, _BrowserInstance_connection_options, "f")?.user_data_id || __classPrivateFieldGet(this, _BrowserInstance_connection_options, "f")?.user_data_read_only === true) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Uploading user data.');
|
|
275
|
+
await this.module_ref.get(user_data_service_1.UserDataService).uploadUserData(__classPrivateFieldGet(this, _BrowserInstance_connection_options, "f").user_data_id, __classPrivateFieldGet(this, _BrowserInstance_user_data_folder, "f"));
|
|
276
|
+
}, _BrowserInstance_launchProcess = async function _BrowserInstance_launchProcess() {
|
|
277
|
+
__classPrivateFieldSet(this, _BrowserInstance_browser_process_launching_at, new Date().toISOString(), "f");
|
|
278
|
+
__classPrivateFieldSet(this, _BrowserInstance_browser_instance_process, (0, child_process_1.spawn)(`tini`, ['-s', `--`, `node`, `./dist/components/browser-instance.process.js`], {
|
|
279
|
+
stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
|
|
280
|
+
env: {
|
|
281
|
+
...process.env,
|
|
282
|
+
CDP_PORT: `${__classPrivateFieldGet(this, _BrowserInstance_cdp_port, "f")}`,
|
|
283
|
+
PROXY_SERVER_PORT: `${__classPrivateFieldGet(this, _BrowserInstance_proxy_server, "f").port}`,
|
|
284
|
+
USER_DATA_FOLDER: __classPrivateFieldGet(this, _BrowserInstance_user_data_folder, "f"),
|
|
285
|
+
TZ: __classPrivateFieldGet(this, _BrowserInstance_timezone, "f")
|
|
286
|
+
}
|
|
287
|
+
}), "f");
|
|
288
|
+
__classPrivateFieldGet(this, _BrowserInstance_browser_instance_process, "f").stdout.on('data', (data) => {
|
|
289
|
+
data.toString().split('\n').map(s => s.trim()).filter(s => s !== '').forEach(log => {
|
|
290
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log(`stdout: ${log}`);
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
__classPrivateFieldGet(this, _BrowserInstance_browser_instance_process, "f").stderr.on('data', (data) => {
|
|
294
|
+
data.toString().split('\n').map(s => s.trim()).filter(s => s !== '').forEach(log => {
|
|
295
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").error(`stderr: ${log}`);
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
await new Promise((res, rej) => {
|
|
299
|
+
__classPrivateFieldGet(this, _BrowserInstance_browser_instance_process, "f").on('spawn', () => {
|
|
300
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Process spawned');
|
|
301
|
+
res(undefined);
|
|
302
|
+
});
|
|
303
|
+
__classPrivateFieldGet(this, _BrowserInstance_browser_instance_process, "f").on('error', err => {
|
|
304
|
+
rej(err);
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
__classPrivateFieldSet(this, _BrowserInstance_browser_process_launched_at, new Date().toISOString(), "f");
|
|
308
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('Process launched');
|
|
309
|
+
__classPrivateFieldGet(this, _BrowserInstance_browser_instance_process, "f").once('exit', (e, i) => {
|
|
310
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log(`Process exited ${e} ${i}`);
|
|
311
|
+
this.close();
|
|
312
|
+
});
|
|
313
|
+
const start = Date.now();
|
|
314
|
+
do {
|
|
315
|
+
try {
|
|
316
|
+
const response = await fetch(`http://127.0.0.1:${__classPrivateFieldGet(this, _BrowserInstance_cdp_port, "f")}/json/version`, { signal: AbortSignal.timeout(350) });
|
|
317
|
+
if (response.status !== 200) {
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
const data = await response.json();
|
|
321
|
+
if (!data.webSocketDebuggerUrl) {
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
__classPrivateFieldSet(this, _BrowserInstance_cdp_websocket, new ws_1.WebSocket(data.webSocketDebuggerUrl), "f");
|
|
325
|
+
await new Promise((res, rej) => {
|
|
326
|
+
__classPrivateFieldGet(this, _BrowserInstance_cdp_websocket, "f").on('error', err => {
|
|
327
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").error('Error with CDP websocket', err?.stack || err);
|
|
328
|
+
rej(err);
|
|
329
|
+
});
|
|
330
|
+
__classPrivateFieldGet(this, _BrowserInstance_cdp_websocket, "f").on('open', () => {
|
|
331
|
+
__classPrivateFieldSet(this, _BrowserInstance_browser_process_cdp_connected_at, new Date().toISOString(), "f");
|
|
332
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log('CDP websocket connected');
|
|
333
|
+
__classPrivateFieldGet(this, _BrowserInstance_cdp_websocket, "f").on('close', (code, reason) => {
|
|
334
|
+
__classPrivateFieldSet(this, _BrowserInstance_browser_process_cdp_terminated_at, new Date().toISOString(), "f");
|
|
335
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").log(`CDP Terminated ${code} ${reason.toString()}`);
|
|
336
|
+
this.emit('cdp_terminated');
|
|
337
|
+
});
|
|
338
|
+
__classPrivateFieldSet(this, _BrowserInstance_cdp_channel, __classPrivateFieldGet(this, _BrowserInstance_tunnel, "f").createChannel(_a.CDP_CHANNEL_ID, data => {
|
|
339
|
+
__classPrivateFieldGet(this, _BrowserInstance_cdp_websocket, "f").send(data.toString('utf8'), { binary: false });
|
|
340
|
+
}), "f");
|
|
341
|
+
__classPrivateFieldGet(this, _BrowserInstance_cdp_websocket, "f").on('message', (data) => {
|
|
342
|
+
__classPrivateFieldGet(this, _BrowserInstance_cdp_channel, "f").send(data.toString('utf8'));
|
|
343
|
+
});
|
|
344
|
+
res(undefined);
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
catch (e) {
|
|
350
|
+
await new Promise(r => setTimeout(r, 20));
|
|
351
|
+
}
|
|
352
|
+
} while (Date.now() - start < 8000);
|
|
353
|
+
__classPrivateFieldGet(this, _BrowserInstance_logger, "f").error('CDP websocket failed to connect. Closing.');
|
|
354
|
+
}, _BrowserInstance_sendBrowserInstanceStatus = function _BrowserInstance_sendBrowserInstanceStatus() {
|
|
355
|
+
if (__classPrivateFieldGet(this, _BrowserInstance_event_channel, "f")) {
|
|
356
|
+
__classPrivateFieldGet(this, _BrowserInstance_event_channel, "f").send(JSON.stringify({ type: 'BROWSER_INSTANCE_STATUS', status: this.status }));
|
|
357
|
+
}
|
|
358
|
+
}, _BrowserInstance_isBrowserProcessAlive = function _BrowserInstance_isBrowserProcessAlive() {
|
|
359
|
+
if (!__classPrivateFieldGet(this, _BrowserInstance_browser_instance_process, "f")) {
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
try {
|
|
363
|
+
process.kill(__classPrivateFieldGet(this, _BrowserInstance_browser_instance_process, "f").pid, 0);
|
|
364
|
+
return true;
|
|
365
|
+
}
|
|
366
|
+
catch (e) {
|
|
367
|
+
return false;
|
|
368
|
+
}
|
|
369
|
+
};
|
|
370
|
+
BrowserInstance.CDP_CHANNEL_ID = 2;
|
|
371
|
+
BrowserInstance.EVENT_CHANNEL_ID = 3;
|
|
372
|
+
_BrowserInstance_CDP_PORT_POOL = { value: new PortPool(13000) };
|
|
373
|
+
//# sourceMappingURL=browser-instance.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-instance.component.js","sourceRoot":"","sources":["../../src/components/browser-instance.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
5
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
8
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
11
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
|
+
};
|
|
13
|
+
var _BrowserInstanceProcess_instances, _BrowserInstanceProcess_cdp_port, _BrowserInstanceProcess_proxy_server_port, _BrowserInstanceProcess_timezone, _BrowserInstanceProcess_user_data_folder, _BrowserInstanceProcess_xvfb_process, _BrowserInstanceProcess_puppeteer_process, _BrowserInstanceProcess_is_closing, _BrowserInstanceProcess_client_disconnected, _BrowserInstanceProcess_waitGoogleChromeKilled;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const child_process_1 = require("child_process");
|
|
16
|
+
const fsPromise = require("fs/promises");
|
|
17
|
+
const process_1 = require("process");
|
|
18
|
+
const puppeteer_1 = require("puppeteer");
|
|
19
|
+
let SIGTERM_RECEIVED = false;
|
|
20
|
+
class BrowserInstanceProcess {
|
|
21
|
+
constructor() {
|
|
22
|
+
_BrowserInstanceProcess_instances.add(this);
|
|
23
|
+
_BrowserInstanceProcess_cdp_port.set(this, parseInt(process.env.CDP_PORT));
|
|
24
|
+
_BrowserInstanceProcess_proxy_server_port.set(this, parseInt(process.env.PROXY_SERVER_PORT));
|
|
25
|
+
_BrowserInstanceProcess_timezone.set(this, process.env.TZ);
|
|
26
|
+
_BrowserInstanceProcess_user_data_folder.set(this, process.env.USER_DATA_FOLDER);
|
|
27
|
+
_BrowserInstanceProcess_xvfb_process.set(this, void 0);
|
|
28
|
+
_BrowserInstanceProcess_puppeteer_process.set(this, void 0);
|
|
29
|
+
_BrowserInstanceProcess_is_closing.set(this, false);
|
|
30
|
+
_BrowserInstanceProcess_client_disconnected.set(this, false);
|
|
31
|
+
}
|
|
32
|
+
get launched() {
|
|
33
|
+
return __classPrivateFieldGet(this, _BrowserInstanceProcess_xvfb_process, "f") !== undefined && __classPrivateFieldGet(this, _BrowserInstanceProcess_puppeteer_process, "f") !== undefined;
|
|
34
|
+
}
|
|
35
|
+
async launch() {
|
|
36
|
+
if (SIGTERM_RECEIVED) {
|
|
37
|
+
console.log(`Can't launch, received sigterm before launching.`);
|
|
38
|
+
await this.close();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
console.log('Launching');
|
|
42
|
+
try {
|
|
43
|
+
const display_id = __classPrivateFieldGet(this, _BrowserInstanceProcess_cdp_port, "f");
|
|
44
|
+
const display = `:${display_id}`;
|
|
45
|
+
const display_lock_file = `/tmp/.X${display_id}-lock`;
|
|
46
|
+
await fsPromise.rm(display_lock_file, { force: true });
|
|
47
|
+
console.log('Creating xvfb process');
|
|
48
|
+
__classPrivateFieldSet(this, _BrowserInstanceProcess_xvfb_process, (0, child_process_1.spawn)('Xvfb', [display, '-screen', '0', '1920x1080x24'], { stdio: 'inherit' }), "f");
|
|
49
|
+
console.log('Creating puppeteer process');
|
|
50
|
+
__classPrivateFieldSet(this, _BrowserInstanceProcess_puppeteer_process, await puppeteer_1.default.launch({
|
|
51
|
+
headless: false,
|
|
52
|
+
executablePath: puppeteer_1.default.executablePath(),
|
|
53
|
+
userDataDir: __classPrivateFieldGet(this, _BrowserInstanceProcess_user_data_folder, "f"),
|
|
54
|
+
dumpio: true,
|
|
55
|
+
handleSIGTERM: false,
|
|
56
|
+
args: [
|
|
57
|
+
`--remote-debugging-port=${__classPrivateFieldGet(this, _BrowserInstanceProcess_cdp_port, "f")}`,
|
|
58
|
+
'--remote-debugging-address=0.0.0.0',
|
|
59
|
+
'--no-first-run',
|
|
60
|
+
'--no-default-browser-check',
|
|
61
|
+
`--display=${display}`,
|
|
62
|
+
'--disable-breakpad',
|
|
63
|
+
'--disable-component-update',
|
|
64
|
+
'--disable-print-preview',
|
|
65
|
+
'--disable-domain-reliability',
|
|
66
|
+
'--disk-cache-dir=/dev/null',
|
|
67
|
+
'--no-pings',
|
|
68
|
+
'--disable-notifications',
|
|
69
|
+
'--disable-features=TranslateUI',
|
|
70
|
+
'--disable-background-networking',
|
|
71
|
+
'--disable-sync',
|
|
72
|
+
'--disable-extensions',
|
|
73
|
+
'--disable-signin-promo',
|
|
74
|
+
'--disable-gpu',
|
|
75
|
+
'--metrics-recording-only',
|
|
76
|
+
'--disable-features=PersistentHistograms',
|
|
77
|
+
`--start-maximized`,
|
|
78
|
+
`--proxy-server=http://127.0.0.1:${__classPrivateFieldGet(this, _BrowserInstanceProcess_proxy_server_port, "f")}`,
|
|
79
|
+
process.env.DISABLE_SHM === 'true' ? '--disable-dev-shm-usage' : undefined
|
|
80
|
+
].filter(s => typeof s === 'string'),
|
|
81
|
+
env: {
|
|
82
|
+
TZ: __classPrivateFieldGet(this, _BrowserInstanceProcess_timezone, "f")
|
|
83
|
+
},
|
|
84
|
+
}), "f");
|
|
85
|
+
console.log('Created puppeteer process.');
|
|
86
|
+
__classPrivateFieldGet(this, _BrowserInstanceProcess_puppeteer_process, "f").on('disconnected', () => {
|
|
87
|
+
__classPrivateFieldSet(this, _BrowserInstanceProcess_client_disconnected, true, "f");
|
|
88
|
+
console.log('Client disconnected');
|
|
89
|
+
});
|
|
90
|
+
const interval_id = setInterval(() => {
|
|
91
|
+
if (__classPrivateFieldGet(this, _BrowserInstanceProcess_puppeteer_process, "f").connected) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
clearInterval(interval_id);
|
|
95
|
+
if (__classPrivateFieldGet(this, _BrowserInstanceProcess_is_closing, "f")) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
console.log(`Puppeteer not connected.`);
|
|
99
|
+
this.close();
|
|
100
|
+
}, 200);
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
console.log('Error while launching processes', e);
|
|
104
|
+
this.close();
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
if (SIGTERM_RECEIVED) {
|
|
108
|
+
this.close();
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async close() {
|
|
114
|
+
if (__classPrivateFieldGet(this, _BrowserInstanceProcess_is_closing, "f")) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
__classPrivateFieldSet(this, _BrowserInstanceProcess_is_closing, true, "f");
|
|
118
|
+
console.log('Closing.');
|
|
119
|
+
if (__classPrivateFieldGet(this, _BrowserInstanceProcess_puppeteer_process, "f")) {
|
|
120
|
+
try {
|
|
121
|
+
if (!__classPrivateFieldGet(this, _BrowserInstanceProcess_client_disconnected, "f") && __classPrivateFieldGet(this, _BrowserInstanceProcess_puppeteer_process, "f").connected) {
|
|
122
|
+
await __classPrivateFieldGet(this, _BrowserInstanceProcess_puppeteer_process, "f").close();
|
|
123
|
+
}
|
|
124
|
+
await __classPrivateFieldGet(this, _BrowserInstanceProcess_instances, "m", _BrowserInstanceProcess_waitGoogleChromeKilled).call(this);
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
console.error('Error while killing puppeteer', e?.stack);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (__classPrivateFieldGet(this, _BrowserInstanceProcess_xvfb_process, "f")) {
|
|
131
|
+
try {
|
|
132
|
+
__classPrivateFieldGet(this, _BrowserInstanceProcess_xvfb_process, "f").kill();
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
console.error('Error while killing xvfb process', e?.stack);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
(0, process_1.exit)(0);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
_BrowserInstanceProcess_cdp_port = new WeakMap(), _BrowserInstanceProcess_proxy_server_port = new WeakMap(), _BrowserInstanceProcess_timezone = new WeakMap(), _BrowserInstanceProcess_user_data_folder = new WeakMap(), _BrowserInstanceProcess_xvfb_process = new WeakMap(), _BrowserInstanceProcess_puppeteer_process = new WeakMap(), _BrowserInstanceProcess_is_closing = new WeakMap(), _BrowserInstanceProcess_client_disconnected = new WeakMap(), _BrowserInstanceProcess_instances = new WeakSet(), _BrowserInstanceProcess_waitGoogleChromeKilled = async function _BrowserInstanceProcess_waitGoogleChromeKilled() {
|
|
142
|
+
let count = 0;
|
|
143
|
+
await new Promise((res) => {
|
|
144
|
+
const interval_id = setInterval(() => {
|
|
145
|
+
if (count === 60) {
|
|
146
|
+
clearInterval(interval_id);
|
|
147
|
+
res(undefined);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const ps = (0, child_process_1.spawn)('ps', ['ax']);
|
|
151
|
+
ps.on('exit', () => {
|
|
152
|
+
count++;
|
|
153
|
+
});
|
|
154
|
+
ps.stdout.on('data', (data) => {
|
|
155
|
+
const message = data.toString();
|
|
156
|
+
if (!message.includes(__classPrivateFieldGet(this, _BrowserInstanceProcess_user_data_folder, "f"))) {
|
|
157
|
+
clearInterval(interval_id);
|
|
158
|
+
res(undefined);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}, 50);
|
|
162
|
+
});
|
|
163
|
+
};
|
|
164
|
+
let browser_instance_process;
|
|
165
|
+
process.on('SIGTERM', () => {
|
|
166
|
+
SIGTERM_RECEIVED = true;
|
|
167
|
+
console.log('Received SIGTERM');
|
|
168
|
+
if (browser_instance_process && browser_instance_process.launched) {
|
|
169
|
+
browser_instance_process.close();
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
browser_instance_process = new BrowserInstanceProcess();
|
|
173
|
+
browser_instance_process.launch();
|
|
174
|
+
//# sourceMappingURL=browser-instance.process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-instance.process.js","sourceRoot":"","sources":["../../src/components/browser-instance.process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import { HttpAdapterHost } from '@nestjs/core';
|
|
3
|
+
import { BrowserPoolService } from 'src/services/browser-pool.service';
|
|
4
|
+
export declare const PROXY_URL_QUERY_PARAM = "proxyUrl";
|
|
5
|
+
export declare const TIMEZONE_QUERY_PARAM = "timezone";
|
|
6
|
+
export declare const USER_DATA_ID_QUERY_PARAM = "userDataId";
|
|
7
|
+
export declare const USER_DATA_READ_ONLY_QUERY_PARAM = "userDataReadOnly";
|
|
8
|
+
export declare class CDPController implements OnModuleInit {
|
|
9
|
+
#private;
|
|
10
|
+
private readonly browser_pool_service;
|
|
11
|
+
private readonly http_adapter_host;
|
|
12
|
+
static readonly INTERNAL_SERVER_ERROR_CODE = 4000;
|
|
13
|
+
static readonly BAD_REQUEST_CODE = 4002;
|
|
14
|
+
constructor(browser_pool_service: BrowserPoolService, http_adapter_host: HttpAdapterHost);
|
|
15
|
+
onModuleInit(): Promise<void>;
|
|
16
|
+
private getQueryParamValue;
|
|
17
|
+
}
|