From 57ffb26e75e5ed5192a62ddc3f3d3e257685fbe6 Mon Sep 17 00:00:00 2001 From: Grigory Date: Mon, 3 Jun 2024 00:08:07 +0500 Subject: [PATCH] feat: add `bun` web framework adapter (#583) Co-authored-by: winstxnhdw Co-authored-by: KnorpelSenf --- src/convenience/frameworks.ts | 24 ++++++++++++++++++++++++ test/convenience/webhook.test.ts | 18 ++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/convenience/frameworks.ts b/src/convenience/frameworks.ts index 3ecd48e1..e8633da9 100644 --- a/src/convenience/frameworks.ts +++ b/src/convenience/frameworks.ts @@ -95,6 +95,11 @@ export type AzureAdapter = (request: { }; }) => ReqResHandler; +export type BunAdapter = (request: { + headers: Headers; + json: () => Promise; +}) => ReqResHandler; + export type CloudflareAdapter = (event: { request: Request; respondWith: (response: Promise) => void; @@ -289,6 +294,24 @@ const azure: AzureAdapter = (request, context) => ({ }, }); +/** Bun.serve */ +const bun: BunAdapter = (request) => { + let resolveResponse: (response: Response) => void; + return { + update: request.json(), + header: request.headers.get(SECRET_HEADER) || undefined, + end: () => { + resolveResponse(ok()); + }, + respond: (json) => { + resolveResponse(okJson(json)); + }, + unauthorized: () => { + resolveResponse(unauthorized()); + }, + }; +}; + /** Native CloudFlare workers (service worker) */ const cloudflare: CloudflareAdapter = (event) => { let resolveResponse: (response: Response) => void; @@ -521,6 +544,7 @@ export const adapters = { "aws-lambda": awsLambda, "aws-lambda-async": awsLambdaAsync, azure, + bun, cloudflare, "cloudflare-mod": cloudflareModule, express, diff --git a/test/convenience/webhook.test.ts b/test/convenience/webhook.test.ts index cfb3b475..2517c3e1 100644 --- a/test/convenience/webhook.test.ts +++ b/test/convenience/webhook.test.ts @@ -1,5 +1,3 @@ -/// - import type { Hono } from "https://deno.land/x/hono/mod.ts"; import type { APIGatewayProxyEventV2, @@ -28,6 +26,22 @@ describe("webhook", () => { )); }); + it("Bun.serve should be compatible with grammY adapter", () => { + type BunServe = ( + options: { + fetch: (request: Request) => Response | Promise; + }, + ) => object; + + const handler = webhookCallback(bot, "bun"); + const serve = (() => {}) as unknown as BunServe; + serve({ + fetch: (request) => { + return handler(request); + }, + }); + }); + it("Cloudflare Workers should be compatible with grammY adapter", async () => { const req = { json: () => ({}),