Compare commits

...

34 Commits

Author SHA1 Message Date
1c47eafe5f 3.0.17 2022-07-30 17:32:59 +02:00
69e3a71354 fix(core): update 2022-07-30 17:32:58 +02:00
21e92bf0c1 3.0.16 2022-07-30 17:26:36 +02:00
d732e6e7aa fix(core): update 2022-07-30 17:26:35 +02:00
5fdfcdb407 3.0.15 2022-07-30 13:30:25 +02:00
49e2e90bda fix(core): update 2022-07-30 13:30:25 +02:00
b8e53e7b42 3.0.14 2022-07-30 08:20:21 +02:00
1136841b3d fix(core): update 2022-07-30 08:20:20 +02:00
42cbc51d22 3.0.13 2022-07-30 02:07:32 +02:00
2d16403ad1 fix(core): update 2022-07-30 02:07:31 +02:00
afe847499a 3.0.12 2022-07-30 01:57:42 +02:00
f980bb70b4 fix(core): update 2022-07-30 01:57:42 +02:00
f192a8f041 3.0.11 2022-07-29 16:12:18 +02:00
64bf3aef6d fix(core): update 2022-07-29 16:12:18 +02:00
a5e3cbd05b 3.0.10 2022-07-29 15:26:03 +02:00
2f0fad999a fix(core): update 2022-07-29 15:26:02 +02:00
5e6477720d 3.0.9 2022-07-29 15:22:32 +02:00
bad8bf0688 fix(core): update 2022-07-29 15:22:31 +02:00
4f1db106fb 3.0.8 2022-07-29 04:25:01 +02:00
d47829a8b2 fix(core): update 2022-07-29 04:25:01 +02:00
ca55d06244 3.0.7 2022-07-29 03:39:05 +02:00
7284924b26 fix(core): update 2022-07-29 03:39:05 +02:00
10857aa12b 3.0.6 2022-07-29 02:30:15 +02:00
c968c7f844 fix(core): update 2022-07-29 02:30:15 +02:00
b07015f6c4 3.0.5 2022-07-29 01:52:34 +02:00
ca4ddade17 fix(core): update 2022-07-29 01:52:34 +02:00
17eaea4124 3.0.4 2022-07-29 01:37:47 +02:00
d3d8f6ff57 fix(core): update 2022-07-29 01:37:47 +02:00
906661c7f4 3.0.3 2022-07-29 01:31:52 +02:00
ea46caebb7 fix(core): update 2022-07-29 01:31:52 +02:00
973e896fbf 3.0.2 2022-07-29 01:26:52 +02:00
4605035b01 fix(core): update 2022-07-29 01:26:51 +02:00
1e4e2c4ab6 3.0.1 2022-07-29 01:23:18 +02:00
30896b045f fix(core): update 2022-07-29 01:23:17 +02:00
12 changed files with 664 additions and 132 deletions

View File

@ -12,20 +12,12 @@ stages:
- release - release
- metadata - metadata
before_script:
- npm install -g @shipzone/npmci
# ==================== # ====================
# security stage # security stage
# ==================== # ====================
mirror:
stage: security
script:
- npmci git mirror
only:
- tags
tags:
- lossless
- docker
- notpriv
auditProductionDependencies: auditProductionDependencies:
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
stage: security stage: security
@ -36,6 +28,7 @@ auditProductionDependencies:
- npmci command npm audit --audit-level=high --only=prod --production - npmci command npm audit --audit-level=high --only=prod --production
tags: tags:
- docker - docker
allow_failure: true
auditDevDependencies: auditDevDependencies:
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
@ -96,10 +89,9 @@ codequality:
only: only:
- tags - tags
script: script:
- npmci command npm install -g tslint typescript - npmci command npm install -g typescript
- npmci npm prepare - npmci npm prepare
- npmci npm install - npmci npm install
- npmci command "tslint -c tslint.json ./ts/**/*.ts"
tags: tags:
- lossless - lossless
- docker - docker
@ -119,11 +111,10 @@ trigger:
pages: pages:
stage: metadata stage: metadata
script: script:
- npmci node install lts - npmci node install stable
- npmci command npm install -g @gitzone/tsdoc
- npmci npm prepare - npmci npm prepare
- npmci npm install - npmci npm install
- npmci command tsdoc - npmci command npm run buildDocs
tags: tags:
- lossless - lossless
- docker - docker

24
.vscode/launch.json vendored
View File

@ -2,28 +2,10 @@
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{ {
"name": "current file", "command": "npm test",
"type": "node", "name": "Run npm test",
"request": "launch", "request": "launch",
"args": [ "type": "node-terminal"
"${relativeFile}"
],
"runtimeArgs": ["-r", "@gitzone/tsrun"],
"cwd": "${workspaceRoot}",
"protocol": "inspector",
"internalConsoleOptions": "openOnSessionStart"
},
{
"name": "test.ts",
"type": "node",
"request": "launch",
"args": [
"test/test.ts"
],
"runtimeArgs": ["-r", "@gitzone/tsrun"],
"cwd": "${workspaceRoot}",
"protocol": "inspector",
"internalConsoleOptions": "openOnSessionStart"
} }
] ]
} }

View File

@ -5,7 +5,7 @@
"githost": "gitlab.com", "githost": "gitlab.com",
"gitscope": "pushrocks", "gitscope": "pushrocks",
"gitrepo": "smartproxy", "gitrepo": "smartproxy",
"shortDescription": "a proxy for handling high workloads of proxying", "description": "a proxy for handling high workloads of proxying",
"npmPackagename": "@pushrocks/smartproxy", "npmPackagename": "@pushrocks/smartproxy",
"license": "MIT", "license": "MIT",
"projectDomain": "push.rocks" "projectDomain": "push.rocks"

597
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "@pushrocks/smartproxy", "name": "@pushrocks/smartproxy",
"version": "3.0.0", "version": "3.0.17",
"private": false, "private": false,
"description": "a proxy for handling high workloads of proxying", "description": "a proxy for handling high workloads of proxying",
"main": "dist_ts/index.js", "main": "dist_ts/index.js",
@ -11,7 +11,8 @@
"scripts": { "scripts": {
"test": "(tstest test/)", "test": "(tstest test/)",
"build": "(tsbuild --web --allowimplicitany)", "build": "(tsbuild --web --allowimplicitany)",
"format": "(gitzone format)" "format": "(gitzone format)",
"buildDocs": "tsdoc"
}, },
"devDependencies": { "devDependencies": {
"@gitzone/tsbuild": "^2.1.63", "@gitzone/tsbuild": "^2.1.63",
@ -21,9 +22,9 @@
}, },
"dependencies": { "dependencies": {
"@pushrocks/lik": "^6.0.0", "@pushrocks/lik": "^6.0.0",
"@pushrocks/smartnetwork": "^3.0.0", "@pushrocks/smartdelay": "^2.0.13",
"@pushrocks/smartpromise": "^3.1.7", "@pushrocks/smartpromise": "^3.1.7",
"@pushrocks/smartrequest": "^1.1.56", "@pushrocks/smartrequest": "^2.0.5",
"@pushrocks/smartstring": "^4.0.2", "@pushrocks/smartstring": "^4.0.2",
"@tsclass/tsclass": "^4.0.17", "@tsclass/tsclass": "^4.0.17",
"@types/ws": "^8.5.3", "@types/ws": "^8.5.3",

View File

@ -5,7 +5,7 @@ let testProxy: smartproxy.NetworkProxy;
tap.test('first test', async () => { tap.test('first test', async () => {
testProxy = new smartproxy.NetworkProxy({ testProxy = new smartproxy.NetworkProxy({
port: 3001 port: 3001,
}); });
expect(testProxy).toBeInstanceOf(smartproxy.NetworkProxy); expect(testProxy).toBeInstanceOf(smartproxy.NetworkProxy);
}); });

View File

@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@pushrocks/smartproxy', name: '@pushrocks/smartproxy',
version: '3.0.0', version: '3.0.17',
description: 'a proxy for handling high workloads of proxying' description: 'a proxy for handling high workloads of proxying'
} }

View File

@ -1,2 +1,3 @@
export * from './smartproxy.classes.networkproxy.js' export * from './smartproxy.classes.networkproxy.js';
export * from './smartproxy.portproxy.js'; export * from './smartproxy.portproxy.js';
export * from './smartproxy.classes.sslredirect.js'

View File

@ -6,7 +6,6 @@ export interface INetworkProxyOptions {
} }
export class NetworkProxy { export class NetworkProxy {
// INSTANCE // INSTANCE
public options: INetworkProxyOptions; public options: INetworkProxyOptions;
public proxyConfigs: plugins.tsclass.network.IReverseProxyConfig[] = []; public proxyConfigs: plugins.tsclass.network.IReverseProxyConfig[] = [];
@ -118,10 +117,10 @@ JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g=
`, `,
}, },
async (req, res) => { async (req, res) => {
console.log('got request'); /**
const destinationConfig = this.router.routeReq(req); * endRequest function
* can be used to prematurely end a request
// endRequest function */
const endRequest = ( const endRequest = (
statusArg: number = 404, statusArg: number = 404,
messageArg: string = 'This route is not available on this server.', messageArg: string = 'This route is not available on this server.',
@ -131,6 +130,15 @@ JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g=
res.end(messageArg); res.end(messageArg);
}; };
console.log(`got request: ${req.headers.host}${plugins.url.parse(req.url).path}`);
const destinationConfig = this.router.routeReq(req);
if (!destinationConfig) {
console.log(`${req.headers.host} can't be routed properly. Terminating request.`);
endRequest();
return;
}
// authentication // authentication
if (destinationConfig.authentication) { if (destinationConfig.authentication) {
const authInfo = destinationConfig.authentication; const authInfo = destinationConfig.authentication;
@ -201,6 +209,15 @@ JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g=
response.on('end', () => { response.on('end', () => {
res.end(); res.end();
}); });
response.on('error', () => {
res.end();
});
response.on('close', () => {
res.end();
});
response.on('timeout', () => {
res.end();
});
} }
); );
@ -248,14 +265,30 @@ JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g=
this.httpsServer.headersTimeout = 65000; this.httpsServer.headersTimeout = 65000;
this.httpsServer.on('connection', (connection: plugins.net.Socket) => { this.httpsServer.on('connection', (connection: plugins.net.Socket) => {
connection.setTimeout(120000); connection.setTimeout(10000);
let destroyed = false;
this.socketMap.add(connection); this.socketMap.add(connection);
console.log(`added connection. now ${this.socketMap.getArray().length} sockets connected.`);
const destroyConnection = () => {
if (!destroyed) {
destroyed = true;
connection.destroy();
console.log(`socket successfully destroyed.`);
plugins.smartdelay.delayFor(1000).then(() => {
connection.removeAllListeners();
});
}
}
const cleanupConnection = () => { const cleanupConnection = () => {
if (this.socketMap.checkForObject(connection)) { if (this.socketMap.checkForObject(connection)) {
this.socketMap.remove(connection); this.socketMap.remove(connection);
connection.end(); plugins.smartdelay.delayFor(200).then(() => {
connection.removeAllListeners(); destroyConnection();
connection.destroy(); });
console.log(`removed connection. ${this.socketMap.getArray().length} sockets remaining.`);
connection.end(() => {
destroyConnection();
});
} }
}; };
connection.on('close', () => { connection.on('close', () => {
@ -273,10 +306,13 @@ JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g=
}); });
this.httpsServer.listen(this.options.port); this.httpsServer.listen(this.options.port);
console.log(`ProxyWorker -> OK: now listening for new connections on port ${this.options.port}`); console.log(
`ProxyWorker -> OK: now listening for new connections on port ${this.options.port}`
);
} }
public async updateProxyConfigs(proxyConfigsArg: plugins.tsclass.network.IReverseProxyConfig[]) { public async updateProxyConfigs(proxyConfigsArg: plugins.tsclass.network.IReverseProxyConfig[]) {
console.log(`got new proxy configs`);
this.proxyConfigs = proxyConfigsArg; this.proxyConfigs = proxyConfigsArg;
this.router.setNewProxyConfigs(proxyConfigsArg); this.router.setNewProxyConfigs(proxyConfigsArg);
for (const hostCandidate of this.proxyConfigs) { for (const hostCandidate of this.proxyConfigs) {
@ -303,8 +339,12 @@ JNj2Dr5H0XoLFFnvuvzcRbhlJ9J67JzR+7g=
}); });
this.httpsServer; this.httpsServer;
} }
/* this.httpsServer.close(); }
this.httpsServer.listen(this.port); */
public async addDefaultHeaders(headersArg: { [key: string]: string }) {
for (const headerKey of Object.keys(headersArg)) {
this.defaultHeaders[headerKey] = headersArg[headerKey];
}
} }
public async stop() { public async stop() {

View File

@ -0,0 +1,32 @@
import * as plugins from './smartproxy.plugins.js';
export class SslRedirect {
httpServer: plugins.http.Server;
port: number;
constructor(portArg: number) {
this.port = portArg;
}
public async start() {
this.httpServer = plugins.http.createServer((request, response) => {
const requestUrl = new URL(request.url, `http://${request.headers.host}`);
const completeUrlWithoutProtocol = `${requestUrl.host}${requestUrl.pathname}${requestUrl.search}`;
const redirectUrl = `https://${completeUrlWithoutProtocol}`;
console.log(`Got http request for http://${completeUrlWithoutProtocol}`);
console.log(`Redirecting to ${redirectUrl}`);
response.writeHead(302, {
Location: redirectUrl,
});
response.end();
});
this.httpServer.listen(this.port);
}
public async stop() {
const done = plugins.smartpromise.defer();
this.httpServer.close(() => {
done.resolve();
});
await done.promise;
}
}

View File

@ -13,11 +13,12 @@ export { tsclass };
// pushrocks scope // pushrocks scope
import * as lik from '@pushrocks/lik'; import * as lik from '@pushrocks/lik';
import * as smartdelay from '@pushrocks/smartdelay';
import * as smartpromise from '@pushrocks/smartpromise'; import * as smartpromise from '@pushrocks/smartpromise';
import * as smartrequest from '@pushrocks/smartrequest'; import * as smartrequest from '@pushrocks/smartrequest';
import * as smartstring from '@pushrocks/smartstring'; import * as smartstring from '@pushrocks/smartstring';
export { lik, smartrequest, smartpromise, smartstring }; export { lik, smartdelay, smartrequest, smartpromise, smartstring };
// third party scope // third party scope
import * as ws from 'ws'; import * as ws from 'ws';

View File

@ -1,30 +1,17 @@
import * as plugins from './smartproxy.plugins.js'; import * as plugins from './smartproxy.plugins.js';
import * as net from 'net'; import * as net from 'net';
let netServer: plugins.net.Server;
let httpServer: plugins.http.Server;
export class PortProxy { export class PortProxy {
netServer: plugins.net.Server;
fromPort: number; fromPort: number;
toPort: number; toPort: number;
constructor(fromPortArg: number, toPortArg: number) { constructor(fromPortArg: number, toPortArg: number) {
this.fromPort = fromPortArg; this.fromPort = fromPortArg;
this.toPort = toPortArg this.toPort = toPortArg;
} }
public async start () { public async start() {
httpServer = plugins.http.createServer((request, response) => {
const requestUrl = new URL(request.url, `http://${request.headers.host}`);
const completeUrlWithoutProtocol = `${requestUrl.host}${requestUrl.pathname}${requestUrl.search}`;
const redirectUrl = `https://${completeUrlWithoutProtocol}`;
console.log(`Got http request for http://${completeUrlWithoutProtocol}`);
console.log(`Redirecting to ${redirectUrl}`);
response.writeHead(302, {
Location: redirectUrl,
});
response.end();
});
httpServer.listen(this.fromPort);
const cleanUpSockets = (from: plugins.net.Socket, to: plugins.net.Socket) => { const cleanUpSockets = (from: plugins.net.Socket, to: plugins.net.Socket) => {
from.end(); from.end();
to.end(); to.end();
@ -34,8 +21,8 @@ export class PortProxy {
to.unpipe(); to.unpipe();
from.destroy(); from.destroy();
to.destroy(); to.destroy();
} };
netServer = net this.netServer = net
.createServer((from) => { .createServer((from) => {
const to = net.createConnection({ const to = net.createConnection({
host: 'localhost', host: 'localhost',
@ -64,10 +51,10 @@ export class PortProxy {
}); });
from.on('end', () => { from.on('end', () => {
cleanUpSockets(from, to); cleanUpSockets(from, to);
}) });
to.on('end', () => { to.on('end', () => {
cleanUpSockets(from, to); cleanUpSockets(from, to);
}) });
}) })
.listen(this.fromPort); .listen(this.fromPort);
console.log(`PortProxy -> OK: Now listening on port ${this.fromPort}`); console.log(`PortProxy -> OK: Now listening on port ${this.fromPort}`);
@ -75,11 +62,9 @@ export class PortProxy {
public async stop() { public async stop() {
const done = plugins.smartpromise.defer(); const done = plugins.smartpromise.defer();
httpServer.close(() => { this.netServer.close(() => {
netServer.close(() => { done.resolve();
done.resolve();
});
}); });
await done.promise; await done.promise;
} }
}; }