-
Notifications
You must be signed in to change notification settings - Fork 21
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Start using Node Proxy Server for the backend.
* Working locally. * Remove reliance on secrets on client. * Ask for latest in Breadboard. * Update package-lock.json. * Introduce more events to Runner. * Update to the latest Breadboard. * Update deps.
- Loading branch information
Showing
12 changed files
with
6,333 additions
and
4,296 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
/** | ||
* @license | ||
* Copyright 2024 Google LLC | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
import { | ||
AnyProxyRequestMessage, | ||
HTTPServerTransport, | ||
ProxyServer, | ||
ProxyServerConfig, | ||
ServerResponse, | ||
hasOrigin, | ||
} from "@google-labs/breadboard/remote"; | ||
import type { VercelRequest, VercelResponse } from "@vercel/node"; | ||
|
||
import Core from "@google-labs/core-kit"; | ||
import { asRuntimeKit } from "@google-labs/breadboard"; | ||
import { IncomingMessage } from "http"; | ||
|
||
const config: ProxyServerConfig = { | ||
kits: [asRuntimeKit(Core)], | ||
proxy: [ | ||
"fetch", | ||
{ | ||
node: "secrets", | ||
tunnel: { | ||
GEMINI_KEY: { | ||
to: "fetch", | ||
when: { | ||
url: hasOrigin("https://generativelanguage.googleapis.com"), | ||
}, | ||
}, | ||
SCRAPING_BEE_KEY: { | ||
to: "fetch", | ||
when: { | ||
url: hasOrigin("https://app.scrapingbee.com/"), | ||
}, | ||
}, | ||
}, | ||
}, | ||
], | ||
}; | ||
|
||
class ResponseAdapter implements ServerResponse { | ||
#response: VercelResponse; | ||
|
||
constructor(response: VercelResponse) { | ||
this.#response = response; | ||
} | ||
|
||
header(field: string, value: string): unknown { | ||
this.#response.setHeader(field, value); | ||
return this; | ||
} | ||
|
||
write(chunk: unknown): boolean { | ||
return this.#response.write(chunk); | ||
} | ||
|
||
end(): unknown { | ||
this.#response.end(); | ||
return this; | ||
} | ||
} | ||
|
||
const extractRequestBody = async (request: IncomingMessage) => { | ||
return new Promise<AnyProxyRequestMessage>((resolve, reject) => { | ||
let body = ""; | ||
request.on("data", (chunk) => { | ||
body += chunk.toString(); | ||
}); | ||
request.on("end", () => { | ||
resolve(JSON.parse(body) as AnyProxyRequestMessage); | ||
}); | ||
request.on("error", reject); | ||
}); | ||
}; | ||
|
||
export default async function handler( | ||
request: VercelRequest, | ||
response: VercelResponse | ||
) { | ||
if (request.method === "GET") { | ||
response.setHeader("Content-Type", "text/html"); | ||
response.write("<H1>USE POST</H1>"); | ||
response.end(); | ||
return; | ||
} | ||
const body = await extractRequestBody(request); | ||
const server = new ProxyServer( | ||
new HTTPServerTransport({ body }, new ResponseAdapter(response)) | ||
); | ||
try { | ||
await server.serve(config); | ||
} catch (e) { | ||
response.statusCode = 500; | ||
response.setHeader("Content-Type", "text/html"); | ||
response.write(`<H1>Server Error: ${(e as Error).message}</H1>`); | ||
response.end(); | ||
} | ||
return; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.