summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElizabeth Hunt <me@liz.coffee>2025-08-17 10:54:13 -0700
committerElizabeth Hunt <me@liz.coffee>2025-08-17 10:54:34 -0700
commit3d61a9b0c29deb576ecd5d0e8de7b4426d5ab41c (patch)
tree152b668cf128803fb7636874ecec109fa86034d5
parent4d469ea6d4cbab34dbb772bcfe3dc53bb67fb224 (diff)
downloadpengueno-3d61a9b0c29deb576ecd5d0e8de7b4426d5ab41c.tar.gz
pengueno-3d61a9b0c29deb576ecd5d0e8de7b4426d5ab41c.zip
Add common hono proxy and bump minor minor version.
-rw-r--r--lib/server/hono/index.ts1
-rw-r--r--lib/server/hono/proxy.ts71
-rw-r--r--lib/server/index.ts1
-rw-r--r--package-lock.json18
-rw-r--r--package.json3
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",