@push.rocks/smartproxy 3.1.0 → 3.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/assets/certs/cert.pem +19 -0
  2. package/assets/certs/key.pem +28 -0
  3. package/dist_ts/00_commitinfo_data.js +1 -1
  4. package/dist_ts/smartproxy.classes.networkproxy.d.ts +4 -5
  5. package/dist_ts/smartproxy.classes.networkproxy.js +172 -232
  6. package/dist_ts/smartproxy.classes.router.d.ts +0 -1
  7. package/dist_ts/smartproxy.classes.router.js +11 -2
  8. package/dist_ts/smartproxy.classes.sslredirect.d.ts +0 -1
  9. package/dist_ts/smartproxy.helpers.certificates.d.ts +5 -0
  10. package/dist_ts/smartproxy.helpers.certificates.js +23 -0
  11. package/dist_ts/smartproxy.portproxy.d.ts +0 -1
  12. package/package.json +18 -14
  13. package/readme.md +3 -1
  14. package/ts/00_commitinfo_data.ts +1 -1
  15. package/ts/smartproxy.classes.networkproxy.ts +202 -259
  16. package/ts/smartproxy.classes.router.ts +10 -1
  17. package/ts/smartproxy.helpers.certificates.ts +30 -0
  18. package/dist/index.d.ts +0 -1
  19. package/dist/index.js +0 -7
  20. package/dist/smartproxy.classes.proxyworker.d.ts +0 -23
  21. package/dist/smartproxy.classes.proxyworker.js +0 -262
  22. package/dist/smartproxy.classes.router.d.ts +0 -16
  23. package/dist/smartproxy.classes.router.js +0 -41
  24. package/dist/smartproxy.classes.smartproxy.d.ts +0 -17
  25. package/dist/smartproxy.classes.smartproxy.js +0 -43
  26. package/dist/smartproxy.plugins.d.ts +0 -17
  27. package/dist/smartproxy.plugins.js +0 -43
  28. package/dist/smartproxy.portproxy.d.ts +0 -6
  29. package/dist/smartproxy.portproxy.js +0 -38
  30. package/dist_ts/smartproxy.classes.proxyworker.d.ts +0 -33
  31. package/dist_ts/smartproxy.classes.proxyworker.js +0 -303
  32. package/dist_ts/smartproxy.classes.smartproxy.d.ts +0 -20
  33. package/dist_ts/smartproxy.classes.smartproxy.js +0 -38
@@ -1,303 +0,0 @@
1
- import { expose } from '@pushrocks/smartspawn';
2
- import * as plugins from './smartproxy.plugins.js';
3
- import { SmartproxyRouter } from './smartproxy.classes.router.js';
4
- export class ProxyWorker {
5
- constructor() {
6
- this.proxyConfigs = [];
7
- this.port = 8001;
8
- this.router = new SmartproxyRouter();
9
- this.socketMap = new plugins.lik.ObjectMap();
10
- this.defaultHeaders = {};
11
- this.alreadyAddedReverseConfigs = {};
12
- }
13
- /**
14
- * starts the proxyInstance
15
- */
16
- async start() {
17
- this.httpsServer = plugins.https.createServer(
18
- // ================
19
- // Spotted this keypair in the code?
20
- // Don't get exited:
21
- // It is an invalid default keypair.
22
- // For proper requests custom domain level keypairs are used that are provided in the reverse config
23
- // ================
24
- {
25
- key: `-----BEGIN PRIVATE KEY-----
26
- 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
- 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
- kQlHug1Cx+LFssvz+hLlB5cqJQZfRKx92DhbROygtxG9r7UBmx/fwx+JQ+HOHX9R
29
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- USiacC1E5RBZgjSg86xYgNjU4E6EFfZLWf3/T2I6KM1s6NmdUppgOX9CoHj7grwr
40
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- RVdJFihSSZbqdrOAblVdl+WkjhALWNRMoRCCRniNubbgxgKfQ0scKUeubYxScBVk
55
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
75
- 2TkK01XDDJURK5Lhuvc7WrK2rSJ/fK+0GA==
76
- -----END PRIVATE KEY-----
77
- `,
78
- cert: `-----BEGIN CERTIFICATE-----
79
- MIIEljCCAn4CCQDY+ZbC9FASVjANBgkqhkiG9w0BAQsFADANMQswCQYDVQQGEwJE
80
- RTAeFw0xOTA5MjAxNjAxNDRaFw0yMDA5MTkxNjAxNDRaMA0xCzAJBgNVBAYTAkRF
81
- MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4thf9JEK/epoXt8hFr8t
82
- pkRzmaEkgbSKoOga3uGXDLvdNf3BzSIxZ8pzRhZfUnutcmW1thdz3wre/pEJR7oN
83
- QsfixbLL8/oS5QeXKiUGX0Ssfdg4W0TsoLcRva+1AZsf38MfiUPhzh1/UW/rMywW
84
- asazQwRZdkkXb4nKJ2IFZx22qnAD4/5Sug+sfeKoFBF/rzI2yK7rognt7kW2LHv6
85
- rswHnZ1Z2P/gbhlZ/EhG9hFVRZwRLDscWKcuWcxkePDt2J1pDNqD6SYa6ZjGC3AE
86
- TJw5iEA1bLQ9YvjDNpVYcf6ZvcSilIFjSQu5cs9sUbHGeKTrS5HzfeJXh1PfJyL8
87
- X0Hu7UBSjfSudso3baE9FGiBFBW2cnXZKDZGtV8eq/qxPetOOgS09pVbNP6508WV
88
- BR+rz98/VDZLZqcbZ2UpOuz4+kAKmbYE9GplxKQZZO7wWEox7Mid/uUdcqEo4QKn
89
- no6ujOuzQzn5a2oOS0k5Hk3uHapNJWlW9YI3LHtfADpYH+6cOR+/c3JWBzQJ6AD7
90
- muvNzA9mWXeHqLxMMP4pkmb7otzZYrEkodUqJgAQxcYhGh6XsCPfJ/D9RN734OJc
91
- gleVXFI8Kz455HxCW19XNfz16k7T6kqhZ/6SOBbkxEuqg7oEthAP109ZZzgx4oDo
92
- hQsw24TjLkI4SPIc7nr60UUCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAu0+zrg0C
93
- mlSv4Yi24OwB7TBvx+WHesl1IilCUdTiiUMo3NumvsU9Dr3Jkd0jGqYI0eyH4gIt
94
- KrhAveXfEw7tAOEHiYicmAdIFtyzh++ZWb8mgbBeqij1MP/76Jv+cc0lUqpfRo/A
95
- qytAsPAILuyL1o1jh28JHcq+v+WYn/FEhjUlH6emhGKGlsAjhUPjzK8MEshNolhj
96
- t2UXw9WB5B2xWvrqlNMy0F3NAZBkZ/+k21HZo6FmVi+q6OEGcOo7wJt6wrH/lko9
97
- LxX96GC1JoN1Pfr2FoTKy1WHzrSfyGmDIUCrbaYQ58UuMOR+5eIPPdkf/030u5eX
98
- xXhF2fBujD57E2zQGh/l2MrOjamcSo0+wYhOqlX3WNdaKNAzPqloBnF6w7eqLYde
99
- h9He39ySmxjENwv3miOjEP1sBeMBSRfL/ckEonfK5uJgYA5nVMQ3ojUeDMZzLfFE
100
- Ue2WHt+uPyYk7mMZfOrK2uHzI2/Coqj7lbfRodFwj+fCArYBck2NZannDPKA6X8V
101
- TzJTbTCteOUUJTrcfZ0gGhGkF4nYLmX5OI+TPqrDJf0fZ+mzAEHzDDVXcBYpYRDr
102
- r8d9QwrK+WaqVi2ofbMfMByVF72jgeJNa4nxwT9bVbu/Q1T2Lt+YPb4pQ7yCoUgS
103
- JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g=
104
- -----END CERTIFICATE-----
105
- `,
106
- }, async (req, res) => {
107
- console.log('got request');
108
- const destinationConfig = this.router.routeReq(req);
109
- // endRequest function
110
- const endRequest = (statusArg = 404, messageArg = 'This route is not available on this server.', headers = {}) => {
111
- res.writeHead(statusArg, messageArg);
112
- res.end(messageArg);
113
- };
114
- // authentication
115
- if (destinationConfig.authentication) {
116
- const authInfo = destinationConfig.authentication;
117
- switch (authInfo.type) {
118
- case 'Basic':
119
- const authHeader = req.headers.authorization;
120
- if (authHeader) {
121
- if (!authHeader.includes('Basic ')) {
122
- return endRequest(401, 'Authentication required', {
123
- 'WWW-Authenticate': 'Basic realm="Access to the staging site", charset="UTF-8"',
124
- });
125
- }
126
- const authStringBase64 = req.headers.authorization.replace('Basic ', '');
127
- const authString = plugins.smartstring.base64.decode(authStringBase64);
128
- const userPassArray = authString.split(':');
129
- const user = userPassArray[0];
130
- const pass = userPassArray[1];
131
- if (user === authInfo.user && pass === authInfo.pass) {
132
- console.log('request successfully authenticated');
133
- }
134
- else {
135
- return endRequest(403, 'Forbidden: Wrong credentials');
136
- }
137
- }
138
- break;
139
- default:
140
- return endRequest(403, 'Forbidden: unsupported authentication method configured. Please report to the admin.');
141
- }
142
- }
143
- let destinationUrl;
144
- if (destinationConfig) {
145
- destinationUrl = `http://${destinationConfig.destinationIp}:${destinationConfig.destinationPort}${req.url}`;
146
- }
147
- else {
148
- return endRequest();
149
- }
150
- console.log(destinationUrl);
151
- const response = await plugins.smartrequest.request(destinationUrl, {
152
- method: req.method,
153
- headers: req.headers,
154
- keepAlive: true,
155
- }, true, // lets make this streaming
156
- (request) => {
157
- req.on('data', (data) => {
158
- request.write(data);
159
- });
160
- req.on('end', (data) => {
161
- request.end();
162
- });
163
- });
164
- res.statusCode = response.statusCode;
165
- console.log(response.statusCode);
166
- for (const defaultHeader of Object.keys(this.defaultHeaders)) {
167
- res.setHeader(defaultHeader, this.defaultHeaders[defaultHeader]);
168
- }
169
- for (const header of Object.keys(response.headers)) {
170
- res.setHeader(header, response.headers[header]);
171
- }
172
- response.on('data', (data) => {
173
- res.write(data);
174
- });
175
- response.on('end', () => {
176
- res.end();
177
- });
178
- });
179
- // Enable websockets
180
- const wss = new plugins.ws.WebSocketServer({ server: this.httpsServer });
181
- wss.on('connection', (ws) => {
182
- console.log('got connection for wsc');
183
- const wscConnected = plugins.smartpromise.defer();
184
- const wsc = new plugins.wsDefault(this.router.routeWs(ws), {
185
- headers: {
186
- Host: ws.url,
187
- },
188
- });
189
- wsc.on('open', () => {
190
- wscConnected.resolve();
191
- });
192
- ws.on('message', async (message) => {
193
- await wscConnected.promise;
194
- wsc.emit('message', message);
195
- });
196
- wsc.on('message', (message) => {
197
- ws.emit('message', message);
198
- });
199
- // handle closing
200
- const cleanUp = () => {
201
- ws.removeAllListeners();
202
- ws.close();
203
- ws.terminate();
204
- wsc.removeAllListeners();
205
- wsc.close();
206
- wsc.terminate();
207
- };
208
- ws.on('close', (message) => {
209
- cleanUp();
210
- });
211
- wsc.on('close', (message) => {
212
- cleanUp();
213
- });
214
- });
215
- this.httpsServer.keepAliveTimeout = 61000;
216
- this.httpsServer.headersTimeout = 65000;
217
- this.httpsServer.on('connection', (connection) => {
218
- connection.setTimeout(120000);
219
- this.socketMap.add(connection);
220
- const cleanupConnection = () => {
221
- if (this.socketMap.checkForObject(connection)) {
222
- this.socketMap.remove(connection);
223
- connection.end();
224
- connection.removeAllListeners();
225
- connection.destroy();
226
- }
227
- };
228
- connection.on('close', () => {
229
- cleanupConnection();
230
- });
231
- connection.on('error', () => {
232
- cleanupConnection();
233
- });
234
- connection.on('end', () => {
235
- cleanupConnection();
236
- });
237
- connection.on('timeout', () => {
238
- cleanupConnection();
239
- });
240
- });
241
- this.httpsServer.listen(this.port);
242
- console.log(`ProxyWorker -> OK: now listening for new connections on port ${this.port}`);
243
- }
244
- async updateProxyConfigs(proxyConfigsArg) {
245
- this.proxyConfigs = proxyConfigsArg;
246
- this.router.setNewProxyConfigs(proxyConfigsArg);
247
- for (const hostCandidate of this.proxyConfigs) {
248
- // console.log(hostCandidate);
249
- const existingHostNameConfig = this.alreadyAddedReverseConfigs[hostCandidate.hostName];
250
- if (!existingHostNameConfig) {
251
- this.alreadyAddedReverseConfigs[hostCandidate.hostName] = hostCandidate;
252
- }
253
- else {
254
- if (existingHostNameConfig.publicKey === hostCandidate.publicKey &&
255
- existingHostNameConfig.privateKey === hostCandidate.privateKey) {
256
- continue;
257
- }
258
- else {
259
- this.alreadyAddedReverseConfigs[hostCandidate.hostName] = hostCandidate;
260
- }
261
- }
262
- this.httpsServer.addContext(hostCandidate.hostName, {
263
- cert: hostCandidate.publicKey,
264
- key: hostCandidate.privateKey,
265
- });
266
- this.httpsServer;
267
- }
268
- /* this.httpsServer.close();
269
- this.httpsServer.listen(this.port); */
270
- }
271
- async stop() {
272
- const done = plugins.smartpromise.defer();
273
- this.httpsServer.close(() => {
274
- done.resolve();
275
- });
276
- await this.socketMap.forEach(async (socket) => {
277
- socket.destroy();
278
- });
279
- await done.promise;
280
- }
281
- }
282
- const proxyWorkerInstance = new ProxyWorker();
283
- // the following is interesting for the master process only
284
- const proxyWorkerCalls = {
285
- stop: async () => {
286
- await proxyWorkerInstance.stop();
287
- },
288
- start: async () => {
289
- await proxyWorkerInstance.start();
290
- },
291
- updateReverseConfigs: async (configArray) => {
292
- await proxyWorkerInstance.updateProxyConfigs(configArray);
293
- },
294
- addDefaultHeaders: async (headersArg) => {
295
- proxyWorkerInstance.defaultHeaders = {
296
- ...proxyWorkerInstance.defaultHeaders,
297
- ...headersArg,
298
- };
299
- },
300
- };
301
- expose(proxyWorkerCalls);
302
- console.log('ProxyWorker initialized');
303
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRwcm94eS5jbGFzc2VzLnByb3h5d29ya2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvc21hcnRwcm94eS5jbGFzc2VzLnByb3h5d29ya2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEtBQUssT0FBTyxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWxFLE1BQU0sT0FBTyxXQUFXO0lBQXhCO1FBQ1MsaUJBQVksR0FBa0QsRUFBRSxDQUFDO1FBRWpFLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDWixXQUFNLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2hDLGNBQVMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFzQixDQUFDO1FBQzVELG1CQUFjLEdBQThCLEVBQUUsQ0FBQztRQUUvQywrQkFBMEIsR0FFN0IsRUFBRSxDQUFDO0lBd1NULENBQUM7SUF0U0M7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWTtRQUMzQyxtQkFBbUI7UUFDbkIsb0NBQW9DO1FBQ3BDLG9CQUFvQjtRQUNwQixvQ0FBb0M7UUFDcEMsb0dBQW9HO1FBQ3BHLG1CQUFtQjtRQUNuQjtZQUNFLEdBQUcsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQW9EUjtZQUNHLElBQUksRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBMkJUO1NBQ0UsRUFDRCxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDM0IsTUFBTSxp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
@@ -1,20 +0,0 @@
1
- import * as plugins from './smartproxy.plugins.js';
2
- import { TProxyWorkerCalls } from './smartproxy.classes.proxyworker.js';
3
- import { TPortProxyCalls } from './smartproxy.portproxy.js';
4
- export interface ISmartProxyOptions {
5
- port?: number;
6
- }
7
- export declare class SmartProxy {
8
- smartsystem: plugins.smartsystem.Smartsystem;
9
- reverseConfigs: plugins.tsclass.network.IReverseProxyConfig[];
10
- proxyWorkerFunctions: plugins.smartspawn.ModuleThread<TProxyWorkerCalls>;
11
- portProxyFunctions: plugins.smartspawn.ModuleThread<TPortProxyCalls>;
12
- options: ISmartProxyOptions;
13
- constructor(optionsArg?: ISmartProxyOptions);
14
- updateReverseConfigs(reverseConfigsArg: plugins.tsclass.network.IReverseProxyConfig[]): Promise<void>;
15
- start(): Promise<void>;
16
- updateDefaultHeaders(defaultHeadersArg: {
17
- [key: string]: string;
18
- }): Promise<void>;
19
- stop(): Promise<void>;
20
- }
@@ -1,38 +0,0 @@
1
- import * as plugins from './smartproxy.plugins.js';
2
- import './smartproxy.classes.proxyworker.js';
3
- import './smartproxy.portproxy.js';
4
- export class SmartProxy {
5
- constructor(optionsArg = {}) {
6
- this.smartsystem = new plugins.smartsystem.Smartsystem();
7
- this.reverseConfigs = [];
8
- this.options = optionsArg;
9
- }
10
- async updateReverseConfigs(reverseConfigsArg) {
11
- // TODO search for old hostCandidates with that target
12
- this.reverseConfigs = reverseConfigsArg;
13
- if (this.proxyWorkerFunctions) {
14
- await this.proxyWorkerFunctions.updateReverseConfigs(this.reverseConfigs);
15
- }
16
- }
17
- async start() {
18
- this.proxyWorkerFunctions = await plugins.smartspawn.spawn(new plugins.smartspawn.Worker('./smartproxy.classes.proxyworker'));
19
- this.proxyWorkerFunctions.updateReverseConfigs(this.reverseConfigs);
20
- this.portProxyFunctions = await plugins.smartspawn.spawn(new plugins.smartspawn.Worker('./smartproxy.portproxy'));
21
- await this.portProxyFunctions.start(this.options.port);
22
- await this.proxyWorkerFunctions.start();
23
- console.log('successfully spawned portproxy and proxyworkers!');
24
- }
25
- async updateDefaultHeaders(defaultHeadersArg) {
26
- await this.proxyWorkerFunctions.addDefaultHeaders(defaultHeadersArg);
27
- }
28
- async stop() {
29
- await this.proxyWorkerFunctions.stop();
30
- await plugins.smartspawn.Thread.terminate(this.proxyWorkerFunctions);
31
- console.log('proxy worker stopped');
32
- await this.portProxyFunctions.stop();
33
- await plugins.smartspawn.Thread.terminate(this.portProxyFunctions);
34
- console.log('portproxy stopped');
35
- console.log('Terminated all childs!');
36
- }
37
- }
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRwcm94eS5jbGFzc2VzLnNtYXJ0cHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHByb3h5LmNsYXNzZXMuc21hcnRwcm94eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHlCQUF5QixDQUFDO0FBRW5ELE9BQWtDLHFDQUFxQyxDQUFDO0FBQ3hFLE9BQWdDLDJCQUEyQixDQUFDO0FBTTVELE1BQU0sT0FBTyxVQUFVO0lBUXJCLFlBQVksYUFBaUMsRUFBRTtRQVB4QyxnQkFBVyxHQUFHLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwRCxtQkFBYyxHQUFrRCxFQUFFLENBQUM7UUFPeEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUM7SUFDNUIsQ0FBQztJQUVNLEtBQUssQ0FBQyxvQkFBb0IsQ0FDL0IsaUJBQWdFO1FBRWhFLHNEQUFzRDtRQUN0RCxJQUFJLENBQUMsY0FBYyxHQUFHLGlCQUFpQixDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzdCLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUMzRTtJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FDeEQsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUNsRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVwRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FDdEQsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUN4RCxDQUFDO1FBRUYsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkQsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTSxLQUFLLENBQUMsb0JBQW9CLENBQUMsaUJBQTBDO1FBQzFFLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkMsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDckUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNGIn0=