From 72255f461ffb7360952b1566ac4467ce69b59013 Mon Sep 17 00:00:00 2001 From: tunnm Date: Sat, 6 Apr 2024 17:50:43 +0700 Subject: [PATCH] Fix functions compatible with AbstractHttpAdapter --- adapters/hyper-express-adapter.ts | 44 ++++++++++++++----- ...est-hyper-express-application.interface.ts | 3 ++ package.json | 2 +- sample/nest-sample-1/package.json | 2 +- sample/nest-sample-2/package.json | 2 +- 5 files changed, 40 insertions(+), 13 deletions(-) diff --git a/adapters/hyper-express-adapter.ts b/adapters/hyper-express-adapter.ts index 72a41e1..6882ede 100644 --- a/adapters/hyper-express-adapter.ts +++ b/adapters/hyper-express-adapter.ts @@ -31,8 +31,7 @@ import * as bodyparser from 'body-parser'; import cors from 'cors'; import { Server, ServerConstructorOptions, Request, Response } from 'hyper-express'; import LiveDirectory from 'live-directory'; -// import { Duplex, pipeline } from 'stream'; -import { pipeline } from 'stream'; +import { Duplex, pipeline } from 'stream'; import { NestHyperExpressBodyParserOptions } from '../interfaces/nest-hyper-express-body-parser-options.interface'; import { NestHyperExpressBodyParserType } from '../interfaces/nest-hyper-express-body-parser.interface'; import { ServeStaticOptions } from '../interfaces/serve-static-options.interface'; @@ -57,14 +56,22 @@ export class HyperExpressAdapter extends AbstractHttpAdapter< > { private readonly routerMethodFactory = new RouterMethodFactory(); private readonly logger = new Logger(HyperExpressAdapter.name); - // private readonly openConnections = new Set(); + private readonly openConnections = new Set(); constructor(private opts?: ServerConstructorOptions) { - super(); + super(new Server()) if (opts) { this.opts = opts; + this.httpServer = this.instance = new Server(this.opts); } - this.httpServer = this.instance = new Server(this.opts); + } + + port: number; + once() {} + removeListener() { } + + address() { + return `0.0.0.0:${this.port}`; } public reply(response: any, body: any, statusCode?: number) { @@ -170,12 +177,17 @@ export class HyperExpressAdapter extends AbstractHttpAdapter< fn && fn(port); }); } + // public listen(port: any, ...args: any[]): any { + // return this.httpServer.listen(Number(port), ...args); + // } public close() { - if (!this.httpServer) { + this.closeOpenConnections(); + + if (!this.instance) { return undefined; } - this.closeOpenConnections(); + return new Promise(resolve => this.instance.close(resolve)); } public set(...args: any[]) { @@ -239,8 +251,8 @@ export class HyperExpressAdapter extends AbstractHttpAdapter< this.opts.cert_file_name = options.httpsOptions.cert; this.opts.passphrase = options.httpsOptions.passphrase; } - if (this.opts && options?.forceCloseConnections) { - this.opts.auto_close = options.forceCloseConnections; + if (options?.forceCloseConnections) { + this.trackOpenConnections(); } this.httpServer = new Server(this.opts); } @@ -428,8 +440,20 @@ export class HyperExpressAdapter extends AbstractHttpAdapter< } } + private trackOpenConnections() { + // this.httpServer.on('connection', (socket: Duplex) => { + // this.openConnections.add(socket); + + // socket.on('close', () => this.openConnections.delete(socket)); + // }); + } + private closeOpenConnections() { - return new Promise(resolve => this.httpServer.close(resolve)); + for (const socket of this.openConnections) { + socket.destroy(); + this.openConnections.delete(socket); + } + return Promise.resolve(this.instance.close()); } private isMiddlewareApplied(name: string): boolean { diff --git a/interfaces/nest-hyper-express-application.interface.ts b/interfaces/nest-hyper-express-application.interface.ts index 80b514c..f39df83 100644 --- a/interfaces/nest-hyper-express-application.interface.ts +++ b/interfaces/nest-hyper-express-application.interface.ts @@ -1,4 +1,6 @@ import { INestApplication, HttpServer } from '@nestjs/common'; +// import type { Server as CoreHttpServer } from 'http'; +// import type { Server as CoreHttpsServer } from 'https'; import type { Request, Response, Server } from 'hyper-express/types/index'; import { NestHyperExpressBodyParserOptions } from './nest-hyper-express-body-parser-options.interface'; import { NestHyperExpressBodyParserType } from './nest-hyper-express-body-parser.interface'; @@ -12,6 +14,7 @@ import { ServeStaticOptions } from './serve-static-options.interface'; * @publicApi */ export interface NestHyperExpressApplication< + // TServer extends CoreHttpServer | CoreHttpsServer = CoreHttpServer, TServer extends Server = Server, > extends INestApplication { /** diff --git a/package.json b/package.json index 7de7d7e..258fc2f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@nnmt/platform-hyper-express", - "version": "0.3.3", + "version": "0.3.4", "description": "Hyper-express Adapter for NestJS (@nnmt/platform-hyper-express)", "author": "Nguyen Nhat Minh Tu", "license": "MIT", diff --git a/sample/nest-sample-1/package.json b/sample/nest-sample-1/package.json index 1cfc037..a19c1b1 100644 --- a/sample/nest-sample-1/package.json +++ b/sample/nest-sample-1/package.json @@ -23,7 +23,7 @@ "@nestjs/common": "^10.0.0", "@nestjs/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", - "@nnmt/platform-hyper-express": "^0.3.3", + "@nnmt/platform-hyper-express": "^0.3.4", "reflect-metadata": "^0.2.0", "rxjs": "^7.8.1" }, diff --git a/sample/nest-sample-2/package.json b/sample/nest-sample-2/package.json index 1cfc037..a19c1b1 100644 --- a/sample/nest-sample-2/package.json +++ b/sample/nest-sample-2/package.json @@ -23,7 +23,7 @@ "@nestjs/common": "^10.0.0", "@nestjs/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", - "@nnmt/platform-hyper-express": "^0.3.3", + "@nnmt/platform-hyper-express": "^0.3.4", "reflect-metadata": "^0.2.0", "rxjs": "^7.8.1" },