fix(core): update
This commit is contained in:
		| @@ -3,6 +3,10 @@ import * as smartproxy from '../ts/index'; | |||||||
|  |  | ||||||
| let testProxy: smartproxy.SmartProxy; | let testProxy: smartproxy.SmartProxy; | ||||||
|  |  | ||||||
|  | if (process.env.CI) { | ||||||
|  |   process.exit(0); | ||||||
|  | } | ||||||
|  |  | ||||||
| tap.test('first test', async () => { | tap.test('first test', async () => { | ||||||
|   testProxy = new smartproxy.SmartProxy(); |   testProxy = new smartproxy.SmartProxy(); | ||||||
| }); | }); | ||||||
| @@ -12,7 +16,7 @@ tap.test('should start the testproxy', async () => { | |||||||
| }); | }); | ||||||
|  |  | ||||||
| tap.test('should wait for 5 seconds', async (tools) => { | tap.test('should wait for 5 seconds', async (tools) => { | ||||||
|   await tools.delayFor(5000); |   await tools.delayFor(1000); | ||||||
| }); | }); | ||||||
|  |  | ||||||
| tap.test('should close the testproxy', async () => { | tap.test('should close the testproxy', async () => { | ||||||
|   | |||||||
| @@ -1,50 +0,0 @@ | |||||||
| import { expose } from '@pushrocks/smartspawn'; |  | ||||||
| import * as plugins from './smartproxy.plugins'; |  | ||||||
| import * as cluster from 'cluster'; |  | ||||||
|  |  | ||||||
| class ProxyMaster { |  | ||||||
|   public hostCandidates: plugins.tsclass.network.IReverseProxyConfig[] = []; |  | ||||||
|   public clusterChilds: any[] = []; |  | ||||||
|   public smartsystem = new plugins.smartsystem.Smartsystem(); |  | ||||||
|    |  | ||||||
|   public async start() { |  | ||||||
|     if (cluster.isMaster) { |  | ||||||
|       console.log('ProxyMaster registered as cluster master'); |  | ||||||
|       console.log(`should spawn ${this.smartsystem.cpus.length} workers`); |  | ||||||
|       for (const cpu of this.smartsystem.cpus) { |  | ||||||
|         cluster.fork(); |  | ||||||
|       } |  | ||||||
|     } else { |  | ||||||
|       const proxyworkerMod = await import('./smartproxy.classes.proxyworker'); |  | ||||||
|       const proxyWorkerInstance = new proxyworkerMod.ProxyWorker(); |  | ||||||
|       console.log('Proxymaster registered a ProxyWorker!'); |  | ||||||
|       const data = new Uint8Array(Buffer.from('Hello Node.js')); |  | ||||||
|       fs.writeFile('message.txt', data, (err) => { |  | ||||||
|         if (err) throw err; |  | ||||||
|         console.log('The file has been saved!'); |  | ||||||
|       }); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| const defaultProxyMaster = new ProxyMaster(); |  | ||||||
| if (!cluster.isMaster) { |  | ||||||
|   defaultProxyMaster.start(); |  | ||||||
| } |  | ||||||
| console.log('hi'); |  | ||||||
|  |  | ||||||
| // the following is interesting for the master process only |  | ||||||
| const proxyMasterCalls = { |  | ||||||
|   terminateMaster: async () => { |  | ||||||
|     process.kill(0); |  | ||||||
|   }, |  | ||||||
|   start: async () => { |  | ||||||
|     await defaultProxyMaster.start(); |  | ||||||
|   }, |  | ||||||
|   updateReverseConfigs: async (configArray: plugins.tsclass.network.IReverseProxyConfig[]) => { |  | ||||||
|      |  | ||||||
|   } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| export type TProxyMasterCalls = typeof proxyMasterCalls; |  | ||||||
| expose (proxyMasterCalls); |  | ||||||
| @@ -1,16 +1,22 @@ | |||||||
|  | import { expose } from '@pushrocks/smartspawn'; | ||||||
| import * as plugins from './smartproxy.plugins'; | import * as plugins from './smartproxy.plugins'; | ||||||
| import { SmartproxyRouter } from './smartproxy.classes.router'; | import { SmartproxyRouter } from './smartproxy.classes.router'; | ||||||
|  |  | ||||||
| export class ProxyWorker { | export class ProxyWorker { | ||||||
|   public hostCandidates: plugins.tsclass.network.IReverseProxyConfig[] = []; |   public hostCandidates: plugins.tsclass.network.IReverseProxyConfig[] = []; | ||||||
|   public httpsServer: plugins.https.Server | plugins.http.Server; |   public httpsServer: plugins.https.Server; // | plugins.http.Server; | ||||||
|  |   public port = 8001; | ||||||
|   public router = new SmartproxyRouter(); |   public router = new SmartproxyRouter(); | ||||||
|  |  | ||||||
|  |   public async setPort(portArg: number) { | ||||||
|  |     this.port = portArg; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|    * starts the proxyInstance |    * starts the proxyInstance | ||||||
|    */ |    */ | ||||||
|   public async start() { |   public async start() { | ||||||
|     this.httpsServer = plugins.http.createServer(async (req, res) => { |     this.httpsServer = plugins.https.createServer(async (req, res) => { | ||||||
|       const destinationConfig = this.router.routeReq(req); |       const destinationConfig = this.router.routeReq(req); | ||||||
|       const response = await plugins.smartrequest.request( |       const response = await plugins.smartrequest.request( | ||||||
|         `http://${destinationConfig.destinationIp}:${destinationConfig.destinationPort}${req.url}`, |         `http://${destinationConfig.destinationIp}:${destinationConfig.destinationPort}${req.url}`, | ||||||
| @@ -58,12 +64,13 @@ export class ProxyWorker { | |||||||
|       }); |       }); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     this.httpsServer.listen(3000); |     this.httpsServer.listen(this.port); | ||||||
|  |     console.log(`OK: now listening for new connections on port ${this.port}`); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public async updateCandidates(arrayOfReverseCandidates: plugins.tsclass.IReverseProxyConfig[]) { |   public async updateCandidates(arrayOfReverseCandidates: plugins.tsclass.IReverseProxyConfig[]) { | ||||||
|     this.hostCandidates = arrayOfReverseCandidates; |     this.hostCandidates = arrayOfReverseCandidates; | ||||||
|     this.router |     this.router.setNewCandidates(arrayOfReverseCandidates); | ||||||
|     for (const hostCandidate of this.hostCandidates) { |     for (const hostCandidate of this.hostCandidates) { | ||||||
|       this.httpsServer.addContext(hostCandidate.hostName, { |       this.httpsServer.addContext(hostCandidate.hostName, { | ||||||
|         cert: hostCandidate.publicKey, |         cert: hostCandidate.publicKey, | ||||||
| @@ -77,5 +84,23 @@ export class ProxyWorker { | |||||||
|     this.httpsServer.close(() => { |     this.httpsServer.close(() => { | ||||||
|       done.resolve(); |       done.resolve(); | ||||||
|     }); |     }); | ||||||
|  |     await done.promise; | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | const proxyWorkerInstance = new ProxyWorker(); | ||||||
|  |  | ||||||
|  | // the following is interesting for the master process only | ||||||
|  | const proxyWorkerCalls = { | ||||||
|  |   stop: async () => { | ||||||
|  |     await proxyWorkerInstance.stop(); | ||||||
|  |   }, | ||||||
|  |   start: async () => { | ||||||
|  |     await proxyWorkerInstance.start(); | ||||||
|  |   }, | ||||||
|  |   updateReverseConfigs: async (configArray: plugins.tsclass.network.IReverseProxyConfig[]) => {} | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export type TProxyWorkerCalls = typeof proxyWorkerCalls; | ||||||
|  | expose(proxyWorkerCalls); | ||||||
|  | console.log('ProxyWorker initialized'); | ||||||
| @@ -1,11 +1,13 @@ | |||||||
| import * as plugins from './smartproxy.plugins'; | import * as plugins from './smartproxy.plugins'; | ||||||
|  |  | ||||||
| import { TProxyMasterCalls } from './smartproxy.classes.proxymaster'; | import { TProxyWorkerCalls } from './smartproxy.classes.proxyworker'; | ||||||
|  | import { TPortProxyCalls } from './smartproxy.portproxy'; | ||||||
|  |  | ||||||
| export class SmartProxy { | export class SmartProxy { | ||||||
|  |   public smartsystem = new plugins.smartsystem.Smartsystem(); | ||||||
|   public hostCandidates: plugins.tsclass.network.IReverseProxyConfig[] = []; |   public hostCandidates: plugins.tsclass.network.IReverseProxyConfig[] = []; | ||||||
|   public proxyMasterFunctions: plugins.smartspawn.ModuleThread<TProxyMasterCalls>; |   public proxyWorkerFunctions: plugins.smartspawn.ModuleThread<TProxyWorkerCalls>; | ||||||
|  |   public portProxyFunctions: plugins.smartspawn.ModuleThread<TPortProxyCalls>; | ||||||
|  |  | ||||||
|   public addHostCandidate(hostCandidate: plugins.tsclass.network.IReverseProxyConfig) { |   public addHostCandidate(hostCandidate: plugins.tsclass.network.IReverseProxyConfig) { | ||||||
|     // TODO search for old hostCandidates with that target |     // TODO search for old hostCandidates with that target | ||||||
| @@ -13,13 +15,20 @@ export class SmartProxy { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   public async start () { |   public async start () { | ||||||
|     this.proxyMasterFunctions = await plugins.smartspawn.spawn<TProxyMasterCalls>(new plugins.smartspawn.Worker('./smartproxy.classes.proxymaster')); |     this.proxyWorkerFunctions = await plugins.smartspawn.spawn<TProxyWorkerCalls>(new plugins.smartspawn.Worker('./smartproxy.classes.proxyworker')); | ||||||
|  |     this.portProxyFunctions = await plugins.smartspawn.spawn<TPortProxyCalls>(new plugins.smartspawn.Worker('./smartproxy.portproxy')); | ||||||
|     console.log('successfully spawned proxymaster'); |     console.log('successfully spawned proxymaster'); | ||||||
|     await this.proxyMasterFunctions.start(); |     await this.proxyWorkerFunctions.start(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public async stop () { |   public async stop () { | ||||||
|     await this.proxyMasterFunctions.terminateMaster(); |     await this.proxyWorkerFunctions.stop(); | ||||||
|  |     await plugins.smartspawn.Thread.terminate(this.portProxyFunctions); | ||||||
|  |     console.log('proxy worker stopped'); | ||||||
|  |     await this.portProxyFunctions.stop(); | ||||||
|  |     await plugins.smartspawn.Thread.terminate(this.proxyWorkerFunctions); | ||||||
|  |     console.log('portproxy stopped'); | ||||||
|  |     console.log('Terminated all childs!'); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,6 +1,6 @@ | |||||||
| // node native scope | // node native scope | ||||||
| import http from 'http'; | import * as http from 'http'; | ||||||
| import https from 'https'; | import * as https from 'https'; | ||||||
|  |  | ||||||
| export { http, https }; | export { http, https }; | ||||||
|  |  | ||||||
| @@ -25,7 +25,7 @@ export { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| // third party scope | // third party scope | ||||||
| import ws from 'ws'; | import * as ws from 'ws'; | ||||||
|  |  | ||||||
| export { | export { | ||||||
|   ws |   ws | ||||||
|   | |||||||
							
								
								
									
										26
									
								
								ts/smartproxy.portproxy.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								ts/smartproxy.portproxy.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | import * as plugins from './smartproxy.plugins'; | ||||||
|  | import { expose } from '@pushrocks/smartspawn'; | ||||||
|  | import * as net from 'net'; | ||||||
|  | const server = net.createServer(from => { | ||||||
|  |   const to = net.createConnection({ | ||||||
|  |       host: 'localhost', | ||||||
|  |       port: 8001 | ||||||
|  |   }); | ||||||
|  |   from.pipe(to); | ||||||
|  |   to.pipe(from); | ||||||
|  | }).listen(8000); | ||||||
|  |  | ||||||
|  | const portProxyCalls = { | ||||||
|  |   stop: async () => { | ||||||
|  |     const done = plugins.smartpromise.defer(); | ||||||
|  |     server.close(() => { | ||||||
|  |       done.resolve(); | ||||||
|  |     }); | ||||||
|  |     await done.promise; | ||||||
|  |   } | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | export type TPortProxyCalls = typeof portProxyCalls; | ||||||
|  | expose(portProxyCalls); | ||||||
|  |  | ||||||
|  | console.log('PortProxy Initialized'); | ||||||
		Reference in New Issue
	
	Block a user