diff options
-rw-r--r-- | lib/server/hono/index.ts | 1 | ||||
-rw-r--r-- | lib/server/hono/proxy.ts | 71 | ||||
-rw-r--r-- | lib/server/index.ts | 1 | ||||
-rw-r--r-- | package-lock.json | 18 | ||||
-rw-r--r-- | package.json | 3 |
5 files changed, 91 insertions, 3 deletions
diff --git a/lib/server/hono/index.ts b/lib/server/hono/index.ts new file mode 100644 index 0000000..9bcd868 --- /dev/null +++ b/lib/server/hono/index.ts @@ -0,0 +1 @@ +export * from './proxy'; diff --git a/lib/server/hono/proxy.ts b/lib/server/hono/proxy.ts new file mode 100644 index 0000000..f729819 --- /dev/null +++ b/lib/server/hono/proxy.ts @@ -0,0 +1,71 @@ +import { + BaseRequest, + Either, + IEither, + LogMetricTraceable, + Metric, + PenguenoRequest, + Server, + Signals, + TraceUtil, +} from '@emprespresso/pengueno'; + +import { serve, ServerType } from '@hono/node-server'; +import { Hono } from 'hono'; + +const AppLifetimeMetric = Metric.fromName('HonoAppLifetime').asResult(); +const AppRequestMetric = Metric.fromName('HonoAppRequest'); + +export class HonoProxy { + private readonly app = LogMetricTraceable.of(new Hono()) + .flatMap(TraceUtil.withTrace(`AppId = ${crypto.randomUUID()}`)) + .flatMap(TraceUtil.withMetricTrace(AppLifetimeMetric)); + + constructor(private readonly server: Server) {} + + public async serve(port: number, hostname: string): Promise<IEither<Error, void>> { + return this.app + .map((tApp) => + Either.fromFailable<Error, ServerType>(() => { + const app = tApp.get(); + app.all('*', async (c) => + tApp + .flatMap(TraceUtil.withMetricTrace(AppRequestMetric)) + .move(<BaseRequest>c.req) + .flatMap((tRequest) => PenguenoRequest.from(tRequest)) + .map((req) => this.server.serve(req)) + .map( + TraceUtil.promiseify((tResponse) => { + tResponse.trace.trace(AppRequestMetric.count.withValue(1.0)); + return new Response(tResponse.get().body(), tResponse.get()); + }), + ) + .get(), + ); + return serve({ + fetch: (_r) => app.fetch(_r), + port, + hostname, + }); + }), + ) + .peek(TraceUtil.traceResultingEither()) + .peek((tServe) => + tServe + .get() + .mapRight(() => + tServe.trace.trace( + `haii im still listening at http://${hostname}:${port} ~uwu dont think i forgot`, + ), + ), + ) + .map((tEitherServer) => + tEitherServer + .get() + .mapRight((server) => tEitherServer.move(server)) + .flatMapAsync((tServer) => Signals.awaitClose(tServer)), + ) + .peek(TraceUtil.promiseify(TraceUtil.traceResultingEither(AppLifetimeMetric))) + .get(); + } +} diff --git a/lib/server/index.ts b/lib/server/index.ts index a080745..594bef2 100644 --- a/lib/server/index.ts +++ b/lib/server/index.ts @@ -6,6 +6,7 @@ export * from './response/index'; export * from './request/index'; export * from './activity/index'; export * from './filter/index'; +export * from './hono/index'; import { PenguenoRequest, PenguenoResponse } from '@emprespresso/pengueno'; export interface Server { diff --git a/package-lock.json b/package-lock.json index 95fc6b7..eab2572 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,15 @@ { "name": "@emprespresso/pengueno", - "version": "0.0.7", + "version": "0.0.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@emprespresso/pengueno", - "version": "0.0.7", + "version": "0.0.8", "license": "MIT", "devDependencies": { + "@hono/node-server": "^1.18.2", "@types/jest": "^30.0.0", "@types/module-alias": "^2.0.4", "@types/node": "^24.0.0", @@ -780,6 +781,19 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@hono/node-server": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.18.2.tgz", + "integrity": "sha512-icgNvC0vRYivzyuSSaUv9ttcwtN8fDyd1k3AOIBDJgYd84tXRZSS6na8X54CY/oYoFTNhEmZraW/Rb9XYwX4KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", diff --git a/package.json b/package.json index 455c6d1..a77b9ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@emprespresso/pengueno", - "version": "0.0.8", + "version": "0.0.9", "description": "emprespresso pengueno utils", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -21,6 +21,7 @@ "format:check": "prettier --check ." }, "devDependencies": { + "@hono/node-server": "^1.18.2", "@types/jest": "^30.0.0", "@types/module-alias": "^2.0.4", "@types/node": "^24.0.0", |