manu-sapiens commited on
Commit
c1dc99b
·
1 Parent(s): ee7ff2d

simplified proxy

Browse files
Files changed (4) hide show
  1. mini.js +128 -0
  2. myNodeServer.js +256 -213
  3. package.json +3 -0
  4. yarn.lock +384 -25
mini.js ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const express = require('express');
2
+ const http = require('http');
3
+ const session = require('express-session');
4
+ const axios = require('axios');
5
+
6
+ const app = express();
7
+ const CHECK_OMNI_INTERVAL = 60000; // 1 minute
8
+
9
+ // Global variable
10
+ global.OMNITOOL_RUNNING = false;
11
+
12
+ // Function to check the status of the external service
13
+ async function checkExternalService()
14
+ {
15
+ console.log("Checking external service");
16
+ try
17
+ {
18
+ const response = await axios.get('http://127.0.0.1:1688/api/v1/mercenaries/ping');
19
+ if (response.data && response.data.ping === 'pong' && Object.keys(response.data.payload).length === 0)
20
+ {
21
+ global.OMNITOOL_RUNNING = true;
22
+ }
23
+ } catch (error)
24
+ {
25
+ console.error('Cannot access OMNITOOL. It is probably not running...', error.message);
26
+ // Set to false but do not prevent server from starting
27
+ global.OMNITOOL_RUNNING = false;
28
+ }
29
+ }
30
+
31
+
32
+ async function setup()
33
+ {
34
+ // Call the function when the server starts
35
+ checkExternalService();
36
+
37
+
38
+ // Other server code...
39
+ }
40
+
41
+ async function main(app)
42
+ {
43
+ // Configure session middleware
44
+ app.use(session({
45
+ secret: 'your-secret-key',
46
+ resave: false,
47
+ saveUninitialized: true
48
+ }));
49
+ await startServer();
50
+
51
+ // Route to serve the webpage
52
+ app.get('/', handleRoutes);
53
+
54
+ app.get("status", (req, res) =>
55
+ {
56
+ res.send(global.OMNITOOL_RUNNING ? 'OMNITOOL IS RUNNING' : 'OMNITOOL IS NOT RUNNING');
57
+ }
58
+ );
59
+
60
+ // Call the function when the server starts
61
+ await setup();
62
+ }
63
+
64
+ function replyOmnitoolIsRunning()
65
+ {
66
+ return '<p>OMNITOOL IS RUNNING </p>';
67
+ }
68
+
69
+ async function handleRoutes(req, res)
70
+ {
71
+
72
+ if (req.session.isVisited)
73
+ {
74
+ if (global.OMNITOOL_RUNNING)
75
+ {
76
+ const reply = replyOmnitoolIsRunning();
77
+ res.send(reply);
78
+ }
79
+ else
80
+ {
81
+ const status = global.OMNITOOL_RUNNING ? 'External service is running' : 'External service is not running';
82
+ const message = `<p>WELCOME BACK</p><p>${status}</p>`;
83
+ res.send(message);
84
+ }
85
+ } else
86
+ {
87
+ await checkExternalService();
88
+ if (global.OMNITOOL_RUNNING)
89
+ {
90
+ const reply = replyOmnitoolIsRunning();
91
+ res.send(reply);
92
+ }
93
+ else
94
+ {
95
+ // Serve the webpage with a button for first-time visitors
96
+ req.session.isVisited = true;
97
+ res.send(`
98
+ <html>
99
+ <body>
100
+ <h1>Welcome!</h1>
101
+ <button onclick="window.open(window.location.href, '_blank')">CLICK ME</button>
102
+ </body>
103
+ </html>
104
+ `);
105
+ }
106
+ }
107
+
108
+
109
+ }
110
+
111
+
112
+ async function startServer()
113
+ {
114
+ // Start server
115
+ const PORT = 3000;
116
+ http.createServer(app).listen(PORT, () =>
117
+ {
118
+ console.log(`Server running on port ${PORT}`);
119
+ });
120
+
121
+
122
+ setInterval(async () =>
123
+ {
124
+ await checkExternalService();
125
+ }, CHECK_OMNI_INTERVAL);
126
+
127
+ }
128
+ main(app);
myNodeServer.js CHANGED
@@ -1,23 +1,39 @@
 
 
 
 
 
 
 
1
  const http = require('http');
 
 
2
  const { spawn } = require('child_process');
 
 
 
3
 
4
- const PROXY_PORT_OMNITOOL = 4444;
5
  const CONTAINER_HOST = '127.0.0.1';
 
 
6
  const CONTAINER_PORT_OMNITOOL = 1688;
7
- const PROTOCOL = 'https';
8
- let OMNITOOL_READY = false;
9
- let OMNITOOL_PRE_READY = false;
10
- let ALREADY_STARTING = false;
11
- let IFRAME = false;
12
- const OMNITOOL_STATUS_CHECK_INTERVAL = 2000; // 2 seconds
13
-
14
- const VERSION = '0.0.7b';
 
 
 
 
 
15
  console.log(`************ Omnitool Proxy Server v${VERSION} ************`);
16
  let omnitoolLogs = [];
17
 
18
  // HTML templates and constants
19
- const START_SERVER_BUTTON_HTML = `<button id="startServerButton" onclick="startServer()">Start Omnitool Server</button>`;
20
- const GOTO_OMNITOOL_BUTTON_HTML = `<button id="exitIframeButton" onclick="exitIframe()">GOTO OMNITOOL</button>`;
21
  const LOG_CONTAINER_HTML = `<div id="logContainer"></div>`;
22
  const COMMON_STYLES = `
23
  <style>
@@ -44,19 +60,149 @@ const COMMON_STYLES = `
44
  }
45
  </style>`;
46
 
47
- // Function to generate HTML content based on server status
48
- function generateHTMLContent(newUrl) {
49
- let startButtonDisabled = OMNITOOL_PRE_READY || OMNITOOL_READY || ALREADY_STARTING ? 'disabled' : '';
50
- let startButtonClass = !startButtonDisabled ? 'highlight-button' : '';
51
- let gotoButtonClass = IFRAME ? 'highlight-button' : '';
 
 
 
 
52
 
53
- // set the startButton to disabled if OMNITOOL_PRE_READY or OMNITOOL_READY or ALREADY_STARTING are true
54
- let buttonsHTML = `<button id="startServerButton" class="${startButtonClass}" onclick="startServer()" ${startButtonDisabled}>Start Omnitool Server</button>`;
 
 
 
55
 
56
- if (IFRAME)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  {
58
- buttonsHTML += `<button id="exitIframeButton" class="${gotoButtonClass}" onclick="exitIframe()">GOTO OMNITOOL</button>`;
 
 
 
 
 
 
 
 
 
 
59
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
 
61
  return `
62
  <html>
@@ -82,7 +228,9 @@ function generateHTMLContent(newUrl) {
82
  }
83
 
84
  function exitIframe() {
85
- window.open('${newUrl}', '_blank');
 
 
86
  }
87
 
88
  function startLogPolling() {
@@ -113,223 +261,118 @@ function generateHTMLContent(newUrl) {
113
  </html>`;
114
  }
115
 
116
-
117
- async function startOmnitoolServer()
118
  {
119
- if (ALREADY_STARTING) return;
120
- ALREADY_STARTING = true;
 
121
 
122
- console.log('Starting Omnitool Server...');
123
- return new Promise((resolve, reject) =>
124
  {
125
- const omnitoolStartProcess = spawn('./omnitool_start.sh');
 
126
 
127
- omnitoolStartProcess.stdout.on('data', (data) =>
128
- {
129
- omnitoolLogs.push(data.toString());
130
- console.log(`omnitool stdout: ${data}`);
131
- });
 
 
132
 
133
- omnitoolStartProcess.stderr.on('data', (data) =>
134
- {
135
- console.error(`omnitool stderr: ${data}`);
136
- omnitoolLogs.push(data.toString());
137
- });
138
 
139
- omnitoolStartProcess.on('close', (code) =>
140
- {
141
- const message = `Omnitool server process exited with code: ${code}`;
142
- console.log(message);
143
- omnitoolLogs.push(message);
144
 
145
- ALREADY_STARTING = false;
146
- if (code === 0)
147
- {
148
- resolve();
149
- } else
150
- {
151
- reject(`Omnitool server did not start properly.`);
152
- }
153
- });
154
- });
155
- }
156
 
157
- function setOmnitoolReady()
158
- {
159
- if (OMNITOOL_PRE_READY === false)
160
- {
161
- OMNITOOL_PRE_READY = true;
162
- console.log('Omnitool server is (PRE) ready! ');
163
- setTimeout(() =>
164
- {
165
- console.log('Omnitool server is (NOW) ready! ');
166
- OMNITOOL_READY = true;
167
- }, 2000); // Delay by 2 second
168
  }
169
- }
170
 
171
- async function periodicCheckOmnitoolStatus() {
172
- console.log("Starting async operation...");
173
- try
174
- {
175
- await checkOmnitoolStatus();
176
- }
177
- catch (error)
178
- {
179
- console.log(`Omnitool not ready: ${error} (IFRAME = ${IFRAME}`);
180
- OMNITOOL_READY = false;
181
- OMNITOOL_PRE_READY = false;
182
- }
183
- // Schedule the next execution
184
- setTimeout(periodicCheckOmnitoolStatus, OMNITOOL_STATUS_CHECK_INTERVAL);
185
  }
 
 
 
 
 
186
 
 
 
 
 
 
 
187
 
188
- async function checkOmnitoolStatus()
189
  {
190
-
191
- return new Promise((resolve, reject) =>
 
192
  {
193
- const options = {
194
- hostname: CONTAINER_HOST,
195
- port: CONTAINER_PORT_OMNITOOL,
196
- path: '/',
197
- method: 'GET'
198
- };
199
-
200
- const req = http.request(options, (res) =>
201
- {
202
- if (res.statusCode === 200)
203
- {
204
- IFRAME = false;
205
- setOmnitoolReady();
206
- }
207
- else
208
- {
209
- OMNITOOL_READY = false;
210
- OMNITOOL_PRE_READY = false;
211
- }
212
- resolve();
213
- });
214
-
215
- req.on('error', (error) =>
216
- {
217
- if (error.code === 'ECONNREFUSED')
218
- {
219
- IFRAME = true;
220
- }
221
- });
222
-
223
- req.end();
224
  });
225
-
226
-
227
  }
228
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
229
 
230
 
231
- async function startRequestForwardingServer(proxy_port)
232
  {
233
- const server = http.createServer(async (req, res) =>
234
- {
235
-
236
- const localUrl = req.headers['host'];
237
- const hostname = localUrl.split(':')[0];
238
- const newUrl = `${PROTOCOL}://${hostname}:${PROXY_PORT_OMNITOOL}`;
239
-
240
- if (!OMNITOOL_READY || IFRAME)
241
- {
242
- // Handle GET requests here
243
- if (req.method === 'GET')
244
- {
245
- switch (req.url)
246
- {
247
- case '/start-omnitool-server':
248
- {
249
-
250
- console.log(`Omnitool Server:ALREADY_STARTING = ${ALREADY_STARTING}`);
251
- if (ALREADY_STARTING)
252
- {
253
- res.writeHead(200, { 'Content-Type': 'text/html' });
254
- res.end("Omnitool server already starting");
255
- return;
256
- }
257
- try
258
- {
259
- await startOmnitoolServer();
260
- res.writeHead(200, { 'Content-Type': 'text/html' });
261
- res.end("Omnitool server started successfully");
262
- }
263
- catch (error)
264
- {
265
- console.error(error);
266
- ALREADY_STARTING = false;
267
- res.writeHead(500, { 'Content-Type': 'text/html' });
268
- res.end(`Error starting Omnitool server: ${error}`);
269
- }
270
-
271
- return;
272
- }
273
-
274
- case '/omnitool-logs':
275
- {
276
- res.writeHead(200, { 'Content-Type': 'application/json' });
277
- const reply = { logs: omnitoolLogs, ready: OMNITOOL_PRE_READY };
278
- res.end(JSON.stringify(reply));
279
- return;
280
- }
281
-
282
- case '/':
283
- {
284
- res.writeHead(200, { 'Content-Type': 'text/html' });
285
- res.end(generateHTMLContent(newUrl));
286
- return;
287
- }
288
-
289
- default:
290
- res.writeHead(404, { 'Content-Type': 'text/html' });
291
- res.end(`<html><body><h1>404 Not Found</h1><p>The requested URL ${req.url} was not found on this server.</p></body></html>`);
292
- return;
293
- }
294
- }
295
- else
296
- {
297
- // Handle non-GET requests here
298
- res.writeHead(405, { 'Content-Type': 'text/html' });
299
- res.end(`<html><body><h1>405 Method Not Allowed</h1><p>The request method ${req.method} is not allowed for the URL ${req.url}.</p></body></html>`);
300
- }
301
- }
302
- else
303
- {
304
- // Proxy logic...
305
- const options = { hostname: CONTAINER_HOST, port: CONTAINER_PORT_OMNITOOL, path: req.url, method: req.method, headers: req.headers };
306
- const proxy = http.request(options, (proxyRes) =>
307
- {
308
- res.writeHead(proxyRes.statusCode, proxyRes.headers);
309
- proxyRes.pipe(res, { end: true });
310
- });
311
- req.pipe(proxy, { end: true });
312
- }
313
- });
314
 
315
- server.listen(proxy_port, '0.0.0.0');
316
- console.log(`Request forwarding server listening on port ${proxy_port}`);
317
- }
 
 
318
 
319
- async function startManagementServer()
320
- {
321
- try
322
  {
323
- await startRequestForwardingServer(PROXY_PORT_OMNITOOL);
 
 
324
 
325
- // Set the interval in milliseconds (e.g., 2000 milliseconds = 2 seconds)
 
326
 
327
- // Use setInterval to schedule the function
328
- setInterval(checkOmnitoolStatus, OMNITOOL_STATUS_CHECK_INTERVAL);
329
- } catch (error)
330
- {
331
- console.error('Failed to start servers:', error);
332
- }
333
  }
334
 
335
- startManagementServer();
 
 
 
1
+ /**
2
+ * Copyright (c) 2023 MERCENARIES.AI PTE. LTD.
3
+ * All rights reserved.
4
+ */
5
+ //@ts-check
6
+
7
+ const express = require('express');
8
  const http = require('http');
9
+ const session = require('express-session');
10
+ const axios = require('axios');
11
  const { spawn } = require('child_process');
12
+ const { createProxyMiddleware } = require('http-proxy-middleware');
13
+
14
+ const app = express();
15
 
 
16
  const CONTAINER_HOST = '127.0.0.1';
17
+
18
+ const PROXY_PORT_OMNITOOL = 4444;
19
  const CONTAINER_PORT_OMNITOOL = 1688;
20
+
21
+ const DELAY_OMNITOOL_SET_TO_RUNNING = 2000; // 2 seconds
22
+ const CHECK_OMNI_INTERVAL = 60000; // 1 minute
23
+
24
+ // Global variable
25
+ global.OMNITOOL_RUNNING = false;
26
+ global.OMNITOOL_READY = false;
27
+ global.ALREADY_STARTING = false;
28
+ global.LOCAL_URL = "";
29
+ global.PING_URL = "";
30
+ global.PROTOCOL = "";
31
+
32
+ const VERSION = '0.0.8a';
33
  console.log(`************ Omnitool Proxy Server v${VERSION} ************`);
34
  let omnitoolLogs = [];
35
 
36
  // HTML templates and constants
 
 
37
  const LOG_CONTAINER_HTML = `<div id="logContainer"></div>`;
38
  const COMMON_STYLES = `
39
  <style>
 
60
  }
61
  </style>`;
62
 
63
+ async function startOmnitoolServer()
64
+ {
65
+ if (global.ALREADY_STARTING) return;
66
+ global.ALREADY_STARTING = true;
67
+
68
+ console.log('Starting Omnitool Server...');
69
+ return new Promise((resolve, reject) =>
70
+ {
71
+ const omnitoolStartProcess = spawn('./omnitool_start.sh');
72
 
73
+ omnitoolStartProcess.stdout.on('data', (data) =>
74
+ {
75
+ omnitoolLogs.push(data.toString());
76
+ console.log(`omnitool stdout: ${data}`);
77
+ });
78
 
79
+ omnitoolStartProcess.stderr.on('data', (data) =>
80
+ {
81
+ console.error(`omnitool stderr: ${data}`);
82
+ omnitoolLogs.push(data.toString());
83
+ });
84
+
85
+ omnitoolStartProcess.on('close', (code) =>
86
+ {
87
+ const message = `Omnitool server process exited with code: ${code}`;
88
+ console.log(message);
89
+ omnitoolLogs.push(message);
90
+
91
+ global.ALREADY_STARTING = false;
92
+ if (code === 0)
93
+ {
94
+ //@ts-ignore
95
+ resolve();
96
+ } else
97
+ {
98
+ reject(`Omnitool server did not start properly.`);
99
+ }
100
+ });
101
+ });
102
+ }
103
+
104
+ function setOmnitoolRunning(set_running)
105
+ {
106
+ if (set_running === true)
107
  {
108
+ if (global.OMNITOOL_READY === false)
109
+ {
110
+ global.OMNITOOL_READY = true;
111
+ console.log('Omnitool server is READY! ');
112
+ setTimeout(() =>
113
+ {
114
+ console.log('Omnitool server is RUNNING! ');
115
+ global.OMNITOOL_RUNNING = true;
116
+ }, DELAY_OMNITOOL_SET_TO_RUNNING); // Delay by 2 second
117
+ }
118
+
119
  }
120
+ else
121
+ {
122
+ global.OMNITOOL_READY = false;
123
+ global.OMNITOOL_RUNNING = false;
124
+ }
125
+ }
126
+
127
+ // Function to check the status of the external service
128
+ async function checkOmnitoolStatus()
129
+ {
130
+ console.log("Checking external service");
131
+ try
132
+ {
133
+ //@ts-ignore
134
+ const response = await axios.get('http://127.0.0.1:1688/api/v1/mercenaries/ping');
135
+ if (response.data && response.data.ping === 'pong' && Object.keys(response.data.payload).length === 0)
136
+ {
137
+ setOmnitoolRunning(true);
138
+ }
139
+ else
140
+ {
141
+ setOmnitoolRunning(false);
142
+ }
143
+ } catch (error)
144
+ {
145
+ console.error('Cannot access OMNITOOL. It is probably not running...', error.message);
146
+ setOmnitoolRunning(false);
147
+ }
148
+ }
149
+
150
+ async function handleGetStartOmnitoolServer(req, res)
151
+ {
152
+ console.log(`Omnitool Server:ALREADY_STARTING = ${global.ALREADY_STARTING}`);
153
+ if (global.ALREADY_STARTING)
154
+ {
155
+ res.writeHead(200, { 'Content-Type': 'text/html' });
156
+ res.end("Omnitool server already starting");
157
+ return;
158
+ }
159
+ try
160
+ {
161
+ await startOmnitoolServer();
162
+ res.writeHead(200, { 'Content-Type': 'text/html' });
163
+ res.end("Omnitool server started successfully");
164
+ }
165
+ catch (error)
166
+ {
167
+ console.error(error);
168
+ global.ALREADY_STARTING = false;
169
+ res.writeHead(500, { 'Content-Type': 'text/html' });
170
+ res.end(`Error starting Omnitool server: ${error}`);
171
+ }
172
+ }
173
+
174
+ async function handleGetOmnitoolLogs(req, res)
175
+ {
176
+ res.writeHead(200, { 'Content-Type': 'application/json' });
177
+ const reply = { logs: omnitoolLogs, ready:global.OMNITOOL_READY };
178
+ res.end(JSON.stringify(reply));
179
+ return;
180
+ }
181
+ async function handleGetBurstIframe(req, res)
182
+ {
183
+ res.writeHead(200, { 'Content-Type': 'application/json' });
184
+ req.session.isVisited = true;
185
+
186
+ const reply = { burst_iframe: true };
187
+ res.end(JSON.stringify(reply));
188
+ return;
189
+ }
190
+
191
+ async function proxyRequest(req, res)
192
+ {
193
+ // Proxy logic...
194
+ const options = { hostname: CONTAINER_HOST, port: CONTAINER_PORT_OMNITOOL, path: req.url, method: req.method, headers: req.headers, };
195
+ const proxy = http.request(options, (proxyRes) =>
196
+ {
197
+ res.writeHead(proxyRes.statusCode, proxyRes.headers);
198
+ proxyRes.pipe(res, { end: true });
199
+ });
200
+ req.pipe(proxy, { end: true });
201
+ return;
202
+ }
203
+
204
+ function getButtonsString(buttonsHTML, gotoUrl)
205
+ {
206
 
207
  return `
208
  <html>
 
228
  }
229
 
230
  function exitIframe() {
231
+ fetch('/burst-iframe')
232
+ .then(response => response.json())
233
+ .then(data => window.open('/', '_blank'));
234
  }
235
 
236
  function startLogPolling() {
 
261
  </html>`;
262
  }
263
 
264
+ async function handleGetRoot(req, res)
 
265
  {
266
+ if (global.LOCAL_URL === "") setGlobals(req);
267
+ console.log(`req.session.isVisited = ${req.session.isVisited}`);
268
+ console.log(`global.OMNITOOL_RUNNING = ${global.OMNITOOL_RUNNING}`);
269
 
270
+ if (!req.session.isVisited)
 
271
  {
272
+ await checkOmnitoolStatus();
273
+ }
274
 
275
+ if (!global.OMNITOOL_RUNNING)
276
+ {
277
+ let startButtonClass = 'highlight-button';
278
+ let buttonsHTML = `<button id="startServerButton" class="${startButtonClass}" onclick="startServer()">Start Omnitool Server</button>`;
279
+ const html = getButtonsString(buttonsHTML, global.LOCAL_URL);
280
+ res.writeHead(200, { 'Content-Type': 'text/html' });
281
+ res.end(html);
282
 
283
+ return;
284
+ }
 
 
 
285
 
286
+ if (!req.session.isVisited)
287
+ {
288
+ console.log(`-----> global.LOCAL_URL = ${global.LOCAL_URL}`);
 
 
289
 
290
+ const gotoButtonClass = 'highlight-button';
291
+ const buttonsHTML = `<button id="exitIframeButton" class="${gotoButtonClass}" onclick="exitIframe()">GOTO OMNITOOL</button>`;
292
+ const html = getButtonsString(buttonsHTML, global.LOCAL_URL);
293
+ res.writeHead(200, { 'Content-Type': 'text/html' });
294
+ res.end(html);
 
 
 
 
 
 
295
 
296
+ return;
 
 
 
 
 
 
 
 
 
 
297
  }
 
298
 
299
+ proxyRequest(req, res);
 
 
 
 
 
 
 
 
 
 
 
 
 
300
  }
301
+ function setGlobals(req)
302
+ {
303
+
304
+ global.LOCAL_URL = req.headers['host'];
305
+ if (req.protocol === "https") global.PROTOCOL = 'https'; else global.PROTOCOL = 'http';
306
 
307
+ if (!global.LOCAL_URL) throw new Error('No host header found in request' + JSON.stringify(req.headers, null, 2));
308
+
309
+ const hostname = global.LOCAL_URL.split(':')[0];
310
+ const newUrl = `${global.PROTOCOL}://${hostname}`;//:${PROXY_PORT_OMNITOOL}`;
311
+ global.PING_URL = `${newUrl}/api/v1/mercenaries/ping`;
312
+ }
313
 
314
+ async function startServer()
315
  {
316
+ // Start server
317
+ const PORT = 4444;
318
+ http.createServer(app).listen(PORT, () =>
319
  {
320
+ console.log(`Server running on port ${PORT}`);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
321
  });
322
+
 
323
  }
324
 
325
+ const OMNI_URL = 'http://127.0.0.1:1688'; // URL of the OMNITOOL service
326
+
327
+ function omnitoolProxyMiddleware(req, res, next) {
328
+ if (global.OMNITOOL_RUNNING && req.session.isVisited) {
329
+ // Proxy all requests to OMNITOOL when conditions are met
330
+ return createProxyMiddleware({
331
+ target: OMNI_URL,
332
+ changeOrigin: true,
333
+ ws: true // if you need WebSocket support
334
+ })(req, res, next);
335
+ } else {
336
+ // Continue with normal processing for other cases
337
+ next();
338
+ }
339
+ }
340
 
341
 
342
+ async function main(app)
343
  {
344
+
345
+
346
+ checkOmnitoolStatus();
347
+
348
+ // Configure session middleware
349
+ app.use(session({
350
+ secret: 'your-secret-key',
351
+ resave: false,
352
+ saveUninitialized: true
353
+ }));
354
+ await startServer();
355
+
356
+ app.use(omnitoolProxyMiddleware);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
357
 
358
+ app.get('/favicon.ico', (req, res) => res.status(204));
359
+ app.get('/start-omnitool-server', (req, res) => handleGetStartOmnitoolServer(req, res));
360
+ app.get('/omnitool-logs', (req, res) => handleGetOmnitoolLogs(req, res));
361
+ app.get('/burst-iframe', (req, res) => handleGetBurstIframe(req, res));
362
+ app.get('/', (req, res) => handleGetRoot(req, res));
363
 
364
+ setInterval(async () =>
 
 
365
  {
366
+ await checkOmnitoolStatus();
367
+ }, CHECK_OMNI_INTERVAL);
368
+
369
 
370
+ //const server = http.createServer(async (req, res) => handleRoutes(req, res, app));
371
+ //server.listen(PROXY_PORT_OMNITOOL, '0.0.0.0');
372
 
373
+ console.log(`Server running on port ${PROXY_PORT_OMNITOOL}`);
 
 
 
 
 
374
  }
375
 
376
+ main(app);
377
+
378
+
package.json CHANGED
@@ -55,8 +55,11 @@
55
  "adm-zip": "^0.5.10",
56
  "compare-versions": "^6.1.0",
57
  "cross-env": "^7.0.3",
 
 
58
  "fs-extra": "^11.1.1",
59
  "http-proxy-middleware": "^2.0.6",
 
60
  "node-fetch": "^3.3.2"
61
  },
62
  "devDependencies": {
 
55
  "adm-zip": "^0.5.10",
56
  "compare-versions": "^6.1.0",
57
  "cross-env": "^7.0.3",
58
+ "express": "^4.18.2",
59
+ "express-session": "^1.17.3",
60
  "fs-extra": "^11.1.1",
61
  "http-proxy-middleware": "^2.0.6",
62
+ "http-proxy-middleware\n": "^2.0.6",
63
  "node-fetch": "^3.3.2"
64
  },
65
  "devDependencies": {
yarn.lock CHANGED
@@ -3655,6 +3655,16 @@ __metadata:
3655
  languageName: node
3656
  linkType: hard
3657
 
 
 
 
 
 
 
 
 
 
 
3658
  "acorn-jsx@npm:^5.0.0, acorn-jsx@npm:^5.3.2":
3659
  version: 5.3.2
3660
  resolution: "acorn-jsx@npm:5.3.2"
@@ -3951,6 +3961,13 @@ __metadata:
3951
  languageName: node
3952
  linkType: hard
3953
 
 
 
 
 
 
 
 
3954
  "array-includes@npm:^3.1.7":
3955
  version: 3.1.7
3956
  resolution: "array-includes@npm:3.1.7"
@@ -4303,6 +4320,26 @@ __metadata:
4303
  languageName: node
4304
  linkType: hard
4305
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4306
  "boolbase@npm:^1.0.0":
4307
  version: 1.0.0
4308
  resolution: "boolbase@npm:1.0.0"
@@ -4420,6 +4457,13 @@ __metadata:
4420
  languageName: node
4421
  linkType: hard
4422
 
 
 
 
 
 
 
 
4423
  "cacache@npm:^17.0.0":
4424
  version: 17.1.4
4425
  resolution: "cacache@npm:17.1.4"
@@ -4862,7 +4906,7 @@ __metadata:
4862
  languageName: node
4863
  linkType: hard
4864
 
4865
- "content-disposition@npm:^0.5.3":
4866
  version: 0.5.4
4867
  resolution: "content-disposition@npm:0.5.4"
4868
  dependencies:
@@ -4871,6 +4915,13 @@ __metadata:
4871
  languageName: node
4872
  linkType: hard
4873
 
 
 
 
 
 
 
 
4874
  "convert-source-map@npm:^1.7.0":
4875
  version: 1.9.0
4876
  resolution: "convert-source-map@npm:1.9.0"
@@ -4885,7 +4936,21 @@ __metadata:
4885
  languageName: node
4886
  linkType: hard
4887
 
4888
- "cookie@npm:^0.5.0, cookie@npm:~0.5.0":
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4889
  version: 0.5.0
4890
  resolution: "cookie@npm:0.5.0"
4891
  checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180
@@ -5402,6 +5467,15 @@ __metadata:
5402
  languageName: node
5403
  linkType: hard
5404
 
 
 
 
 
 
 
 
 
 
5405
  "debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4":
5406
  version: 4.3.4
5407
  resolution: "debug@npm:4.3.4"
@@ -5414,15 +5488,6 @@ __metadata:
5414
  languageName: node
5415
  linkType: hard
5416
 
5417
- "debug@npm:^2.2.0":
5418
- version: 2.6.9
5419
- resolution: "debug@npm:2.6.9"
5420
- dependencies:
5421
- ms: 2.0.0
5422
- checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6
5423
- languageName: node
5424
- linkType: hard
5425
-
5426
  "debug@npm:^3.1.0, debug@npm:^3.2.7":
5427
  version: 3.2.7
5428
  resolution: "debug@npm:3.2.7"
@@ -5550,13 +5615,20 @@ __metadata:
5550
  languageName: node
5551
  linkType: hard
5552
 
5553
- "depd@npm:2.0.0":
5554
  version: 2.0.0
5555
  resolution: "depd@npm:2.0.0"
5556
  checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a
5557
  languageName: node
5558
  linkType: hard
5559
 
 
 
 
 
 
 
 
5560
  "detect-content-type@npm:^1.2.0":
5561
  version: 1.2.0
5562
  resolution: "detect-content-type@npm:1.2.0"
@@ -5704,6 +5776,13 @@ __metadata:
5704
  languageName: node
5705
  linkType: hard
5706
 
 
 
 
 
 
 
 
5707
  "ejs@npm:^3.1.9":
5708
  version: 3.1.9
5709
  resolution: "ejs@npm:3.1.9"
@@ -5743,6 +5822,13 @@ __metadata:
5743
  languageName: node
5744
  linkType: hard
5745
 
 
 
 
 
 
 
 
5746
  "encoding@npm:^0.1.13":
5747
  version: 0.1.13
5748
  resolution: "encoding@npm:0.1.13"
@@ -6748,6 +6834,13 @@ __metadata:
6748
  languageName: node
6749
  linkType: hard
6750
 
 
 
 
 
 
 
 
6751
  "event-emitter@npm:~0.3.4":
6752
  version: 0.3.5
6753
  resolution: "event-emitter@npm:0.3.5"
@@ -6849,6 +6942,61 @@ __metadata:
6849
  languageName: node
6850
  linkType: hard
6851
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6852
  "ext@npm:^1.1.2":
6853
  version: 1.7.0
6854
  resolution: "ext@npm:1.7.0"
@@ -7164,6 +7312,21 @@ __metadata:
7164
  languageName: node
7165
  linkType: hard
7166
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7167
  "find-cache-dir@npm:^2.0.0":
7168
  version: 2.1.0
7169
  resolution: "find-cache-dir@npm:2.1.0"
@@ -7325,6 +7488,13 @@ __metadata:
7325
  languageName: node
7326
  linkType: hard
7327
 
 
 
 
 
 
 
 
7328
  "fs-constants@npm:^1.0.0":
7329
  version: 1.0.0
7330
  resolution: "fs-constants@npm:1.0.0"
@@ -7870,6 +8040,24 @@ __metadata:
7870
  languageName: node
7871
  linkType: hard
7872
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7873
  "http-proxy-middleware@npm:^2.0.6":
7874
  version: 2.0.6
7875
  resolution: "http-proxy-middleware@npm:2.0.6"
@@ -7943,6 +8131,15 @@ __metadata:
7943
  languageName: node
7944
  linkType: hard
7945
 
 
 
 
 
 
 
 
 
 
7946
  "iconv-lite@npm:0.6, iconv-lite@npm:^0.6.2":
7947
  version: 0.6.3
7948
  resolution: "iconv-lite@npm:0.6.3"
@@ -7952,15 +8149,6 @@ __metadata:
7952
  languageName: node
7953
  linkType: hard
7954
 
7955
- "iconv-lite@npm:^0.4.17":
7956
- version: 0.4.24
7957
- resolution: "iconv-lite@npm:0.4.24"
7958
- dependencies:
7959
- safer-buffer: ">= 2.1.2 < 3"
7960
- checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6
7961
- languageName: node
7962
- linkType: hard
7963
-
7964
  "ieee754@npm:^1.1.13, ieee754@npm:^1.2.1":
7965
  version: 1.2.1
7966
  resolution: "ieee754@npm:1.2.1"
@@ -9172,6 +9360,13 @@ __metadata:
9172
  languageName: node
9173
  linkType: hard
9174
 
 
 
 
 
 
 
 
9175
  "mem@npm:^4.0.0":
9176
  version: 4.3.0
9177
  resolution: "mem@npm:4.3.0"
@@ -9198,6 +9393,13 @@ __metadata:
9198
  languageName: node
9199
  linkType: hard
9200
 
 
 
 
 
 
 
 
9201
  "merge-stream@npm:^2.0.0":
9202
  version: 2.0.0
9203
  resolution: "merge-stream@npm:2.0.0"
@@ -9212,6 +9414,13 @@ __metadata:
9212
  languageName: node
9213
  linkType: hard
9214
 
 
 
 
 
 
 
 
9215
  "micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5":
9216
  version: 4.0.5
9217
  resolution: "micromatch@npm:4.0.5"
@@ -9229,7 +9438,7 @@ __metadata:
9229
  languageName: node
9230
  linkType: hard
9231
 
9232
- "mime-types@npm:^2.0.1, mime-types@npm:^2.1.12, mime-types@npm:^2.1.35, mime-types@npm:~2.1.19":
9233
  version: 2.1.35
9234
  resolution: "mime-types@npm:2.1.35"
9235
  dependencies:
@@ -9238,6 +9447,15 @@ __metadata:
9238
  languageName: node
9239
  linkType: hard
9240
 
 
 
 
 
 
 
 
 
 
9241
  "mime@npm:^3.0.0":
9242
  version: 3.0.0
9243
  resolution: "mime@npm:3.0.0"
@@ -9498,7 +9716,7 @@ __metadata:
9498
  languageName: node
9499
  linkType: hard
9500
 
9501
- "ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3":
9502
  version: 2.1.3
9503
  resolution: "ms@npm:2.1.3"
9504
  checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d
@@ -9628,7 +9846,7 @@ __metadata:
9628
  languageName: node
9629
  linkType: hard
9630
 
9631
- "negotiator@npm:^0.6.3":
9632
  version: 0.6.3
9633
  resolution: "negotiator@npm:0.6.3"
9634
  checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9
@@ -10216,8 +10434,11 @@ __metadata:
10216
  eslint: ^8.53.0
10217
  eslint-config-prettier: ^9.0.0
10218
  eslint-plugin-prettier: ^5.0.1
 
 
10219
  fs-extra: ^11.1.1
10220
  http-proxy-middleware: ^2.0.6
 
10221
  node-fetch: ^3.3.2
10222
  prettier: ^3.0.3
10223
  dependenciesMeta:
@@ -10233,6 +10454,22 @@ __metadata:
10233
  languageName: node
10234
  linkType: hard
10235
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10236
  "once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0":
10237
  version: 1.4.0
10238
  resolution: "once@npm:1.4.0"
@@ -10481,6 +10718,13 @@ __metadata:
10481
  languageName: node
10482
  linkType: hard
10483
 
 
 
 
 
 
 
 
10484
  "path-exists@npm:^3.0.0":
10485
  version: 3.0.0
10486
  resolution: "path-exists@npm:3.0.0"
@@ -10547,6 +10791,13 @@ __metadata:
10547
  languageName: node
10548
  linkType: hard
10549
 
 
 
 
 
 
 
 
10550
  "path-type@npm:^4.0.0":
10551
  version: 4.0.0
10552
  resolution: "path-type@npm:4.0.0"
@@ -10872,7 +11123,7 @@ __metadata:
10872
  languageName: node
10873
  linkType: hard
10874
 
10875
- "proxy-addr@npm:^2.0.7":
10876
  version: 2.0.7
10877
  resolution: "proxy-addr@npm:2.0.7"
10878
  dependencies:
@@ -10920,6 +11171,15 @@ __metadata:
10920
  languageName: node
10921
  linkType: hard
10922
 
 
 
 
 
 
 
 
 
 
10923
  "qs@npm:^6.10.2, qs@npm:^6.11.0":
10924
  version: 6.11.2
10925
  resolution: "qs@npm:6.11.2"
@@ -10989,6 +11249,13 @@ __metadata:
10989
  languageName: node
10990
  linkType: hard
10991
 
 
 
 
 
 
 
 
10992
  "randombytes@npm:^2.1.0":
10993
  version: 2.1.0
10994
  resolution: "randombytes@npm:2.1.0"
@@ -10998,6 +11265,25 @@ __metadata:
10998
  languageName: node
10999
  linkType: hard
11000
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11001
  "rc@npm:^1.2.7":
11002
  version: 1.2.8
11003
  resolution: "rc@npm:1.2.8"
@@ -11661,6 +11947,27 @@ __metadata:
11661
  languageName: node
11662
  linkType: hard
11663
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11664
  "serialize-javascript@npm:^6.0.1":
11665
  version: 6.0.1
11666
  resolution: "serialize-javascript@npm:6.0.1"
@@ -11670,6 +11977,18 @@ __metadata:
11670
  languageName: node
11671
  linkType: hard
11672
 
 
 
 
 
 
 
 
 
 
 
 
 
11673
  "set-blocking@npm:^2.0.0":
11674
  version: 2.0.0
11675
  resolution: "set-blocking@npm:2.0.0"
@@ -12772,6 +13091,16 @@ __metadata:
12772
  languageName: node
12773
  linkType: hard
12774
 
 
 
 
 
 
 
 
 
 
 
12775
  "type@npm:^1.0.1":
12776
  version: 1.2.0
12777
  resolution: "type@npm:1.2.0"
@@ -12871,6 +13200,15 @@ __metadata:
12871
  languageName: node
12872
  linkType: hard
12873
 
 
 
 
 
 
 
 
 
 
12874
  "unbox-primitive@npm:^1.0.2":
12875
  version: 1.0.2
12876
  resolution: "unbox-primitive@npm:1.0.2"
@@ -12969,6 +13307,13 @@ __metadata:
12969
  languageName: node
12970
  linkType: hard
12971
 
 
 
 
 
 
 
 
12972
  "unplugin-preprocessor-directives@npm:^0.0.8":
12973
  version: 0.0.8
12974
  resolution: "unplugin-preprocessor-directives@npm:0.0.8"
@@ -13066,6 +13411,13 @@ __metadata:
13066
  languageName: node
13067
  linkType: hard
13068
 
 
 
 
 
 
 
 
13069
  "uuid@npm:^3.3.2":
13070
  version: 3.4.0
13071
  resolution: "uuid@npm:3.4.0"
@@ -13091,6 +13443,13 @@ __metadata:
13091
  languageName: node
13092
  linkType: hard
13093
 
 
 
 
 
 
 
 
13094
  "verror@npm:1.10.0":
13095
  version: 1.10.0
13096
  resolution: "verror@npm:1.10.0"
 
3655
  languageName: node
3656
  linkType: hard
3657
 
3658
+ "accepts@npm:~1.3.8":
3659
+ version: 1.3.8
3660
+ resolution: "accepts@npm:1.3.8"
3661
+ dependencies:
3662
+ mime-types: ~2.1.34
3663
+ negotiator: 0.6.3
3664
+ checksum: 50c43d32e7b50285ebe84b613ee4a3aa426715a7d131b65b786e2ead0fd76b6b60091b9916d3478a75f11f162628a2139991b6c03ab3f1d9ab7c86075dc8eab4
3665
+ languageName: node
3666
+ linkType: hard
3667
+
3668
  "acorn-jsx@npm:^5.0.0, acorn-jsx@npm:^5.3.2":
3669
  version: 5.3.2
3670
  resolution: "acorn-jsx@npm:5.3.2"
 
3961
  languageName: node
3962
  linkType: hard
3963
 
3964
+ "array-flatten@npm:1.1.1":
3965
+ version: 1.1.1
3966
+ resolution: "array-flatten@npm:1.1.1"
3967
+ checksum: a9925bf3512d9dce202112965de90c222cd59a4fbfce68a0951d25d965cf44642931f40aac72309c41f12df19afa010ecadceb07cfff9ccc1621e99d89ab5f3b
3968
+ languageName: node
3969
+ linkType: hard
3970
+
3971
  "array-includes@npm:^3.1.7":
3972
  version: 3.1.7
3973
  resolution: "array-includes@npm:3.1.7"
 
4320
  languageName: node
4321
  linkType: hard
4322
 
4323
+ "body-parser@npm:1.20.1":
4324
+ version: 1.20.1
4325
+ resolution: "body-parser@npm:1.20.1"
4326
+ dependencies:
4327
+ bytes: 3.1.2
4328
+ content-type: ~1.0.4
4329
+ debug: 2.6.9
4330
+ depd: 2.0.0
4331
+ destroy: 1.2.0
4332
+ http-errors: 2.0.0
4333
+ iconv-lite: 0.4.24
4334
+ on-finished: 2.4.1
4335
+ qs: 6.11.0
4336
+ raw-body: 2.5.1
4337
+ type-is: ~1.6.18
4338
+ unpipe: 1.0.0
4339
+ checksum: f1050dbac3bede6a78f0b87947a8d548ce43f91ccc718a50dd774f3c81f2d8b04693e52acf62659fad23101827dd318da1fb1363444ff9a8482b886a3e4a5266
4340
+ languageName: node
4341
+ linkType: hard
4342
+
4343
  "boolbase@npm:^1.0.0":
4344
  version: 1.0.0
4345
  resolution: "boolbase@npm:1.0.0"
 
4457
  languageName: node
4458
  linkType: hard
4459
 
4460
+ "bytes@npm:3.1.2":
4461
+ version: 3.1.2
4462
+ resolution: "bytes@npm:3.1.2"
4463
+ checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e
4464
+ languageName: node
4465
+ linkType: hard
4466
+
4467
  "cacache@npm:^17.0.0":
4468
  version: 17.1.4
4469
  resolution: "cacache@npm:17.1.4"
 
4906
  languageName: node
4907
  linkType: hard
4908
 
4909
+ "content-disposition@npm:0.5.4, content-disposition@npm:^0.5.3":
4910
  version: 0.5.4
4911
  resolution: "content-disposition@npm:0.5.4"
4912
  dependencies:
 
4915
  languageName: node
4916
  linkType: hard
4917
 
4918
+ "content-type@npm:~1.0.4":
4919
+ version: 1.0.5
4920
+ resolution: "content-type@npm:1.0.5"
4921
+ checksum: 566271e0a251642254cde0f845f9dd4f9856e52d988f4eb0d0dcffbb7a1f8ec98de7a5215fc628f3bce30fe2fb6fd2bc064b562d721658c59b544e2d34ea2766
4922
+ languageName: node
4923
+ linkType: hard
4924
+
4925
  "convert-source-map@npm:^1.7.0":
4926
  version: 1.9.0
4927
  resolution: "convert-source-map@npm:1.9.0"
 
4936
  languageName: node
4937
  linkType: hard
4938
 
4939
+ "cookie-signature@npm:1.0.6":
4940
+ version: 1.0.6
4941
+ resolution: "cookie-signature@npm:1.0.6"
4942
+ checksum: f4e1b0a98a27a0e6e66fd7ea4e4e9d8e038f624058371bf4499cfcd8f3980be9a121486995202ba3fca74fbed93a407d6d54d43a43f96fd28d0bd7a06761591a
4943
+ languageName: node
4944
+ linkType: hard
4945
+
4946
+ "cookie@npm:0.4.2":
4947
+ version: 0.4.2
4948
+ resolution: "cookie@npm:0.4.2"
4949
+ checksum: a00833c998bedf8e787b4c342defe5fa419abd96b32f4464f718b91022586b8f1bafbddd499288e75c037642493c83083da426c6a9080d309e3bd90fd11baa9b
4950
+ languageName: node
4951
+ linkType: hard
4952
+
4953
+ "cookie@npm:0.5.0, cookie@npm:^0.5.0, cookie@npm:~0.5.0":
4954
  version: 0.5.0
4955
  resolution: "cookie@npm:0.5.0"
4956
  checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180
 
5467
  languageName: node
5468
  linkType: hard
5469
 
5470
+ "debug@npm:2.6.9, debug@npm:^2.2.0":
5471
+ version: 2.6.9
5472
+ resolution: "debug@npm:2.6.9"
5473
+ dependencies:
5474
+ ms: 2.0.0
5475
+ checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6
5476
+ languageName: node
5477
+ linkType: hard
5478
+
5479
  "debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4":
5480
  version: 4.3.4
5481
  resolution: "debug@npm:4.3.4"
 
5488
  languageName: node
5489
  linkType: hard
5490
 
 
 
 
 
 
 
 
 
 
5491
  "debug@npm:^3.1.0, debug@npm:^3.2.7":
5492
  version: 3.2.7
5493
  resolution: "debug@npm:3.2.7"
 
5615
  languageName: node
5616
  linkType: hard
5617
 
5618
+ "depd@npm:2.0.0, depd@npm:~2.0.0":
5619
  version: 2.0.0
5620
  resolution: "depd@npm:2.0.0"
5621
  checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a
5622
  languageName: node
5623
  linkType: hard
5624
 
5625
+ "destroy@npm:1.2.0":
5626
+ version: 1.2.0
5627
+ resolution: "destroy@npm:1.2.0"
5628
+ checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38
5629
+ languageName: node
5630
+ linkType: hard
5631
+
5632
  "detect-content-type@npm:^1.2.0":
5633
  version: 1.2.0
5634
  resolution: "detect-content-type@npm:1.2.0"
 
5776
  languageName: node
5777
  linkType: hard
5778
 
5779
+ "ee-first@npm:1.1.1":
5780
+ version: 1.1.1
5781
+ resolution: "ee-first@npm:1.1.1"
5782
+ checksum: 1b4cac778d64ce3b582a7e26b218afe07e207a0f9bfe13cc7395a6d307849cfe361e65033c3251e00c27dd060cab43014c2d6b2647676135e18b77d2d05b3f4f
5783
+ languageName: node
5784
+ linkType: hard
5785
+
5786
  "ejs@npm:^3.1.9":
5787
  version: 3.1.9
5788
  resolution: "ejs@npm:3.1.9"
 
5822
  languageName: node
5823
  linkType: hard
5824
 
5825
+ "encodeurl@npm:~1.0.2":
5826
+ version: 1.0.2
5827
+ resolution: "encodeurl@npm:1.0.2"
5828
+ checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c
5829
+ languageName: node
5830
+ linkType: hard
5831
+
5832
  "encoding@npm:^0.1.13":
5833
  version: 0.1.13
5834
  resolution: "encoding@npm:0.1.13"
 
6834
  languageName: node
6835
  linkType: hard
6836
 
6837
+ "etag@npm:~1.8.1":
6838
+ version: 1.8.1
6839
+ resolution: "etag@npm:1.8.1"
6840
+ checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff
6841
+ languageName: node
6842
+ linkType: hard
6843
+
6844
  "event-emitter@npm:~0.3.4":
6845
  version: 0.3.5
6846
  resolution: "event-emitter@npm:0.3.5"
 
6942
  languageName: node
6943
  linkType: hard
6944
 
6945
+ "express-session@npm:^1.17.3":
6946
+ version: 1.17.3
6947
+ resolution: "express-session@npm:1.17.3"
6948
+ dependencies:
6949
+ cookie: 0.4.2
6950
+ cookie-signature: 1.0.6
6951
+ debug: 2.6.9
6952
+ depd: ~2.0.0
6953
+ on-headers: ~1.0.2
6954
+ parseurl: ~1.3.3
6955
+ safe-buffer: 5.2.1
6956
+ uid-safe: ~2.1.5
6957
+ checksum: 1021a793433cbc6a1b32c803fcb2daa1e03a8f50dd907e8745ae57994370315a5cfde5b6ef7b062d9a9a0754ff268844bda211c08240b3a0e01014dcf1073ec5
6958
+ languageName: node
6959
+ linkType: hard
6960
+
6961
+ "express@npm:^4.18.2":
6962
+ version: 4.18.2
6963
+ resolution: "express@npm:4.18.2"
6964
+ dependencies:
6965
+ accepts: ~1.3.8
6966
+ array-flatten: 1.1.1
6967
+ body-parser: 1.20.1
6968
+ content-disposition: 0.5.4
6969
+ content-type: ~1.0.4
6970
+ cookie: 0.5.0
6971
+ cookie-signature: 1.0.6
6972
+ debug: 2.6.9
6973
+ depd: 2.0.0
6974
+ encodeurl: ~1.0.2
6975
+ escape-html: ~1.0.3
6976
+ etag: ~1.8.1
6977
+ finalhandler: 1.2.0
6978
+ fresh: 0.5.2
6979
+ http-errors: 2.0.0
6980
+ merge-descriptors: 1.0.1
6981
+ methods: ~1.1.2
6982
+ on-finished: 2.4.1
6983
+ parseurl: ~1.3.3
6984
+ path-to-regexp: 0.1.7
6985
+ proxy-addr: ~2.0.7
6986
+ qs: 6.11.0
6987
+ range-parser: ~1.2.1
6988
+ safe-buffer: 5.2.1
6989
+ send: 0.18.0
6990
+ serve-static: 1.15.0
6991
+ setprototypeof: 1.2.0
6992
+ statuses: 2.0.1
6993
+ type-is: ~1.6.18
6994
+ utils-merge: 1.0.1
6995
+ vary: ~1.1.2
6996
+ checksum: 3c4b9b076879442f6b968fe53d85d9f1eeacbb4f4c41e5f16cc36d77ce39a2b0d81b3f250514982110d815b2f7173f5561367f9110fcc541f9371948e8c8b037
6997
+ languageName: node
6998
+ linkType: hard
6999
+
7000
  "ext@npm:^1.1.2":
7001
  version: 1.7.0
7002
  resolution: "ext@npm:1.7.0"
 
7312
  languageName: node
7313
  linkType: hard
7314
 
7315
+ "finalhandler@npm:1.2.0":
7316
+ version: 1.2.0
7317
+ resolution: "finalhandler@npm:1.2.0"
7318
+ dependencies:
7319
+ debug: 2.6.9
7320
+ encodeurl: ~1.0.2
7321
+ escape-html: ~1.0.3
7322
+ on-finished: 2.4.1
7323
+ parseurl: ~1.3.3
7324
+ statuses: 2.0.1
7325
+ unpipe: ~1.0.0
7326
+ checksum: 92effbfd32e22a7dff2994acedbd9bcc3aa646a3e919ea6a53238090e87097f8ef07cced90aa2cc421abdf993aefbdd5b00104d55c7c5479a8d00ed105b45716
7327
+ languageName: node
7328
+ linkType: hard
7329
+
7330
  "find-cache-dir@npm:^2.0.0":
7331
  version: 2.1.0
7332
  resolution: "find-cache-dir@npm:2.1.0"
 
7488
  languageName: node
7489
  linkType: hard
7490
 
7491
+ "fresh@npm:0.5.2":
7492
+ version: 0.5.2
7493
+ resolution: "fresh@npm:0.5.2"
7494
+ checksum: 13ea8b08f91e669a64e3ba3a20eb79d7ca5379a81f1ff7f4310d54e2320645503cc0c78daedc93dfb6191287295f6479544a649c64d8e41a1c0fb0c221552346
7495
+ languageName: node
7496
+ linkType: hard
7497
+
7498
  "fs-constants@npm:^1.0.0":
7499
  version: 1.0.0
7500
  resolution: "fs-constants@npm:1.0.0"
 
8040
  languageName: node
8041
  linkType: hard
8042
 
8043
+ "http-proxy-middleware\n@npm:^2.0.6":
8044
+ version: 2.0.6
8045
+ resolution: "http-proxy-middleware\n@npm:2.0.6::__archiveUrl=https%3A%2F%2Fregistry.npmjs.org%2Fhttp-proxy-middleware%2F-%2Fhttp-proxy-middleware-2.0.6.tgz"
8046
+ dependencies:
8047
+ "@types/http-proxy": ^1.17.8
8048
+ http-proxy: ^1.18.1
8049
+ is-glob: ^4.0.1
8050
+ is-plain-obj: ^3.0.0
8051
+ micromatch: ^4.0.2
8052
+ peerDependencies:
8053
+ "@types/express": ^4.17.13
8054
+ peerDependenciesMeta:
8055
+ "@types/express":
8056
+ optional: true
8057
+ checksum: 5113c1b1b8a859551c8ca2f1e1bada9d1d1c18e20dc48875d7b6d3516a5e4b431c446d30d3f5a8734e2b4bf723ba6e87f3fa30a95ee87c6e9ec57699dbd68c17
8058
+ languageName: node
8059
+ linkType: hard
8060
+
8061
  "http-proxy-middleware@npm:^2.0.6":
8062
  version: 2.0.6
8063
  resolution: "http-proxy-middleware@npm:2.0.6"
 
8131
  languageName: node
8132
  linkType: hard
8133
 
8134
+ "iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.17":
8135
+ version: 0.4.24
8136
+ resolution: "iconv-lite@npm:0.4.24"
8137
+ dependencies:
8138
+ safer-buffer: ">= 2.1.2 < 3"
8139
+ checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6
8140
+ languageName: node
8141
+ linkType: hard
8142
+
8143
  "iconv-lite@npm:0.6, iconv-lite@npm:^0.6.2":
8144
  version: 0.6.3
8145
  resolution: "iconv-lite@npm:0.6.3"
 
8149
  languageName: node
8150
  linkType: hard
8151
 
 
 
 
 
 
 
 
 
 
8152
  "ieee754@npm:^1.1.13, ieee754@npm:^1.2.1":
8153
  version: 1.2.1
8154
  resolution: "ieee754@npm:1.2.1"
 
9360
  languageName: node
9361
  linkType: hard
9362
 
9363
+ "media-typer@npm:0.3.0":
9364
+ version: 0.3.0
9365
+ resolution: "media-typer@npm:0.3.0"
9366
+ checksum: af1b38516c28ec95d6b0826f6c8f276c58aec391f76be42aa07646b4e39d317723e869700933ca6995b056db4b09a78c92d5440dc23657e6764be5d28874bba1
9367
+ languageName: node
9368
+ linkType: hard
9369
+
9370
  "mem@npm:^4.0.0":
9371
  version: 4.3.0
9372
  resolution: "mem@npm:4.3.0"
 
9393
  languageName: node
9394
  linkType: hard
9395
 
9396
+ "merge-descriptors@npm:1.0.1":
9397
+ version: 1.0.1
9398
+ resolution: "merge-descriptors@npm:1.0.1"
9399
+ checksum: 5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26
9400
+ languageName: node
9401
+ linkType: hard
9402
+
9403
  "merge-stream@npm:^2.0.0":
9404
  version: 2.0.0
9405
  resolution: "merge-stream@npm:2.0.0"
 
9414
  languageName: node
9415
  linkType: hard
9416
 
9417
+ "methods@npm:~1.1.2":
9418
+ version: 1.1.2
9419
+ resolution: "methods@npm:1.1.2"
9420
+ checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a
9421
+ languageName: node
9422
+ linkType: hard
9423
+
9424
  "micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5":
9425
  version: 4.0.5
9426
  resolution: "micromatch@npm:4.0.5"
 
9438
  languageName: node
9439
  linkType: hard
9440
 
9441
+ "mime-types@npm:^2.0.1, mime-types@npm:^2.1.12, mime-types@npm:^2.1.35, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34":
9442
  version: 2.1.35
9443
  resolution: "mime-types@npm:2.1.35"
9444
  dependencies:
 
9447
  languageName: node
9448
  linkType: hard
9449
 
9450
+ "mime@npm:1.6.0":
9451
+ version: 1.6.0
9452
+ resolution: "mime@npm:1.6.0"
9453
+ bin:
9454
+ mime: cli.js
9455
+ checksum: fef25e39263e6d207580bdc629f8872a3f9772c923c7f8c7e793175cee22777bbe8bba95e5d509a40aaa292d8974514ce634ae35769faa45f22d17edda5e8557
9456
+ languageName: node
9457
+ linkType: hard
9458
+
9459
  "mime@npm:^3.0.0":
9460
  version: 3.0.0
9461
  resolution: "mime@npm:3.0.0"
 
9716
  languageName: node
9717
  linkType: hard
9718
 
9719
+ "ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3":
9720
  version: 2.1.3
9721
  resolution: "ms@npm:2.1.3"
9722
  checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d
 
9846
  languageName: node
9847
  linkType: hard
9848
 
9849
+ "negotiator@npm:0.6.3, negotiator@npm:^0.6.3":
9850
  version: 0.6.3
9851
  resolution: "negotiator@npm:0.6.3"
9852
  checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9
 
10434
  eslint: ^8.53.0
10435
  eslint-config-prettier: ^9.0.0
10436
  eslint-plugin-prettier: ^5.0.1
10437
+ express: ^4.18.2
10438
+ express-session: ^1.17.3
10439
  fs-extra: ^11.1.1
10440
  http-proxy-middleware: ^2.0.6
10441
+ "http-proxy-middleware\n": ^2.0.6
10442
  node-fetch: ^3.3.2
10443
  prettier: ^3.0.3
10444
  dependenciesMeta:
 
10454
  languageName: node
10455
  linkType: hard
10456
 
10457
+ "on-finished@npm:2.4.1":
10458
+ version: 2.4.1
10459
+ resolution: "on-finished@npm:2.4.1"
10460
+ dependencies:
10461
+ ee-first: 1.1.1
10462
+ checksum: d20929a25e7f0bb62f937a425b5edeb4e4cde0540d77ba146ec9357f00b0d497cdb3b9b05b9c8e46222407d1548d08166bff69cc56dfa55ba0e4469228920ff0
10463
+ languageName: node
10464
+ linkType: hard
10465
+
10466
+ "on-headers@npm:~1.0.2":
10467
+ version: 1.0.2
10468
+ resolution: "on-headers@npm:1.0.2"
10469
+ checksum: 2bf13467215d1e540a62a75021e8b318a6cfc5d4fc53af8e8f84ad98dbcea02d506c6d24180cd62e1d769c44721ba542f3154effc1f7579a8288c9f7873ed8e5
10470
+ languageName: node
10471
+ linkType: hard
10472
+
10473
  "once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0":
10474
  version: 1.4.0
10475
  resolution: "once@npm:1.4.0"
 
10718
  languageName: node
10719
  linkType: hard
10720
 
10721
+ "parseurl@npm:~1.3.3":
10722
+ version: 1.3.3
10723
+ resolution: "parseurl@npm:1.3.3"
10724
+ checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2
10725
+ languageName: node
10726
+ linkType: hard
10727
+
10728
  "path-exists@npm:^3.0.0":
10729
  version: 3.0.0
10730
  resolution: "path-exists@npm:3.0.0"
 
10791
  languageName: node
10792
  linkType: hard
10793
 
10794
+ "path-to-regexp@npm:0.1.7":
10795
+ version: 0.1.7
10796
+ resolution: "path-to-regexp@npm:0.1.7"
10797
+ checksum: 69a14ea24db543e8b0f4353305c5eac6907917031340e5a8b37df688e52accd09e3cebfe1660b70d76b6bd89152f52183f28c74813dbf454ba1a01c82a38abce
10798
+ languageName: node
10799
+ linkType: hard
10800
+
10801
  "path-type@npm:^4.0.0":
10802
  version: 4.0.0
10803
  resolution: "path-type@npm:4.0.0"
 
11123
  languageName: node
11124
  linkType: hard
11125
 
11126
+ "proxy-addr@npm:^2.0.7, proxy-addr@npm:~2.0.7":
11127
  version: 2.0.7
11128
  resolution: "proxy-addr@npm:2.0.7"
11129
  dependencies:
 
11171
  languageName: node
11172
  linkType: hard
11173
 
11174
+ "qs@npm:6.11.0":
11175
+ version: 6.11.0
11176
+ resolution: "qs@npm:6.11.0"
11177
+ dependencies:
11178
+ side-channel: ^1.0.4
11179
+ checksum: 6e1f29dd5385f7488ec74ac7b6c92f4d09a90408882d0c208414a34dd33badc1a621019d4c799a3df15ab9b1d0292f97c1dd71dc7c045e69f81a8064e5af7297
11180
+ languageName: node
11181
+ linkType: hard
11182
+
11183
  "qs@npm:^6.10.2, qs@npm:^6.11.0":
11184
  version: 6.11.2
11185
  resolution: "qs@npm:6.11.2"
 
11249
  languageName: node
11250
  linkType: hard
11251
 
11252
+ "random-bytes@npm:~1.0.0":
11253
+ version: 1.0.0
11254
+ resolution: "random-bytes@npm:1.0.0"
11255
+ checksum: 09faa256394aa2ca9754aa57e92a27c452c3e97ffb266e98bebb517332e9df7168fea393159f88d884febce949ba8bec8ddb02f03342da6c6023ecc7b155e0ae
11256
+ languageName: node
11257
+ linkType: hard
11258
+
11259
  "randombytes@npm:^2.1.0":
11260
  version: 2.1.0
11261
  resolution: "randombytes@npm:2.1.0"
 
11265
  languageName: node
11266
  linkType: hard
11267
 
11268
+ "range-parser@npm:~1.2.1":
11269
+ version: 1.2.1
11270
+ resolution: "range-parser@npm:1.2.1"
11271
+ checksum: 0a268d4fea508661cf5743dfe3d5f47ce214fd6b7dec1de0da4d669dd4ef3d2144468ebe4179049eff253d9d27e719c88dae55be64f954e80135a0cada804ec9
11272
+ languageName: node
11273
+ linkType: hard
11274
+
11275
+ "raw-body@npm:2.5.1":
11276
+ version: 2.5.1
11277
+ resolution: "raw-body@npm:2.5.1"
11278
+ dependencies:
11279
+ bytes: 3.1.2
11280
+ http-errors: 2.0.0
11281
+ iconv-lite: 0.4.24
11282
+ unpipe: 1.0.0
11283
+ checksum: 5362adff1575d691bb3f75998803a0ffed8c64eabeaa06e54b4ada25a0cd1b2ae7f4f5ec46565d1bec337e08b5ac90c76eaa0758de6f72a633f025d754dec29e
11284
+ languageName: node
11285
+ linkType: hard
11286
+
11287
  "rc@npm:^1.2.7":
11288
  version: 1.2.8
11289
  resolution: "rc@npm:1.2.8"
 
11947
  languageName: node
11948
  linkType: hard
11949
 
11950
+ "send@npm:0.18.0":
11951
+ version: 0.18.0
11952
+ resolution: "send@npm:0.18.0"
11953
+ dependencies:
11954
+ debug: 2.6.9
11955
+ depd: 2.0.0
11956
+ destroy: 1.2.0
11957
+ encodeurl: ~1.0.2
11958
+ escape-html: ~1.0.3
11959
+ etag: ~1.8.1
11960
+ fresh: 0.5.2
11961
+ http-errors: 2.0.0
11962
+ mime: 1.6.0
11963
+ ms: 2.1.3
11964
+ on-finished: 2.4.1
11965
+ range-parser: ~1.2.1
11966
+ statuses: 2.0.1
11967
+ checksum: 74fc07ebb58566b87b078ec63e5a3e41ecd987e4272ba67b7467e86c6ad51bc6b0b0154133b6d8b08a2ddda360464f71382f7ef864700f34844a76c8027817a8
11968
+ languageName: node
11969
+ linkType: hard
11970
+
11971
  "serialize-javascript@npm:^6.0.1":
11972
  version: 6.0.1
11973
  resolution: "serialize-javascript@npm:6.0.1"
 
11977
  languageName: node
11978
  linkType: hard
11979
 
11980
+ "serve-static@npm:1.15.0":
11981
+ version: 1.15.0
11982
+ resolution: "serve-static@npm:1.15.0"
11983
+ dependencies:
11984
+ encodeurl: ~1.0.2
11985
+ escape-html: ~1.0.3
11986
+ parseurl: ~1.3.3
11987
+ send: 0.18.0
11988
+ checksum: af57fc13be40d90a12562e98c0b7855cf6e8bd4c107fe9a45c212bf023058d54a1871b1c89511c3958f70626fff47faeb795f5d83f8cf88514dbaeb2b724464d
11989
+ languageName: node
11990
+ linkType: hard
11991
+
11992
  "set-blocking@npm:^2.0.0":
11993
  version: 2.0.0
11994
  resolution: "set-blocking@npm:2.0.0"
 
13091
  languageName: node
13092
  linkType: hard
13093
 
13094
+ "type-is@npm:~1.6.18":
13095
+ version: 1.6.18
13096
+ resolution: "type-is@npm:1.6.18"
13097
+ dependencies:
13098
+ media-typer: 0.3.0
13099
+ mime-types: ~2.1.24
13100
+ checksum: 2c8e47675d55f8b4e404bcf529abdf5036c537a04c2b20177bcf78c9e3c1da69da3942b1346e6edb09e823228c0ee656ef0e033765ec39a70d496ef601a0c657
13101
+ languageName: node
13102
+ linkType: hard
13103
+
13104
  "type@npm:^1.0.1":
13105
  version: 1.2.0
13106
  resolution: "type@npm:1.2.0"
 
13200
  languageName: node
13201
  linkType: hard
13202
 
13203
+ "uid-safe@npm:~2.1.5":
13204
+ version: 2.1.5
13205
+ resolution: "uid-safe@npm:2.1.5"
13206
+ dependencies:
13207
+ random-bytes: ~1.0.0
13208
+ checksum: 07536043da9a026f4a2bc397543d0ace7587449afa1d9d2c4fd3ce76af8a5263a678788bcc429dff499ef29d45843cd5ee9d05434450fcfc19cc661229f703d1
13209
+ languageName: node
13210
+ linkType: hard
13211
+
13212
  "unbox-primitive@npm:^1.0.2":
13213
  version: 1.0.2
13214
  resolution: "unbox-primitive@npm:1.0.2"
 
13307
  languageName: node
13308
  linkType: hard
13309
 
13310
+ "unpipe@npm:1.0.0, unpipe@npm:~1.0.0":
13311
+ version: 1.0.0
13312
+ resolution: "unpipe@npm:1.0.0"
13313
+ checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2
13314
+ languageName: node
13315
+ linkType: hard
13316
+
13317
  "unplugin-preprocessor-directives@npm:^0.0.8":
13318
  version: 0.0.8
13319
  resolution: "unplugin-preprocessor-directives@npm:0.0.8"
 
13411
  languageName: node
13412
  linkType: hard
13413
 
13414
+ "utils-merge@npm:1.0.1":
13415
+ version: 1.0.1
13416
+ resolution: "utils-merge@npm:1.0.1"
13417
+ checksum: c81095493225ecfc28add49c106ca4f09cdf56bc66731aa8dabc2edbbccb1e1bfe2de6a115e5c6a380d3ea166d1636410b62ef216bb07b3feb1cfde1d95d5080
13418
+ languageName: node
13419
+ linkType: hard
13420
+
13421
  "uuid@npm:^3.3.2":
13422
  version: 3.4.0
13423
  resolution: "uuid@npm:3.4.0"
 
13443
  languageName: node
13444
  linkType: hard
13445
 
13446
+ "vary@npm:~1.1.2":
13447
+ version: 1.1.2
13448
+ resolution: "vary@npm:1.1.2"
13449
+ checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b
13450
+ languageName: node
13451
+ linkType: hard
13452
+
13453
  "verror@npm:1.10.0":
13454
  version: 1.10.0
13455
  resolution: "verror@npm:1.10.0"