diff options
author | 2022-06-12 21:40:45 -0700 | |
---|---|---|
committer | 2022-06-12 21:40:45 -0700 | |
commit | dbde52504d50b8d5bb3e071ce4b5a959c28eb760 (patch) | |
tree | 63c6e2f917873019b17524b4944f8dd8ce8e425f /examples | |
parent | 6d88a3d9c002b9113b27a09ceb7cd771b9e24d02 (diff) | |
download | bun-dbde52504d50b8d5bb3e071ce4b5a959c28eb760.tar.gz bun-dbde52504d50b8d5bb3e071ce4b5a959c28eb760.tar.zst bun-dbde52504d50b8d5bb3e071ce4b5a959c28eb760.zip |
ArrayBufferSink works and it's good.
Diffstat (limited to 'examples')
-rw-r--r-- | examples/lambda.ts | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/examples/lambda.ts b/examples/lambda.ts new file mode 100644 index 000000000..ab2d5bb2b --- /dev/null +++ b/examples/lambda.ts @@ -0,0 +1,214 @@ +const { AWS_LAMBDA_RUNTIME_API, LAMBDA_TASK_ROOT, _HANDLER } = process.env; + +if (!AWS_LAMBDA_RUNTIME_API || AWS_LAMBDA_RUNTIME_API === "") { + throw new Error("AWS_LAMBDA_RUNTIME_API is not set"); +} + +const nextURL = `http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next`; +const sourceDir = LAMBDA_TASK_ROOT; +if (!sourceDir) { + throw new Error("handler is not set"); +} + +// don't care if this fails +if (process.cwd() !== sourceDir) { + try { + process.chdir(sourceDir); + } catch (e) {} +} + +var handlerDot = _HANDLER.lastIndexOf("."); +var sourcefile = handlerDot > 0 ? _HANDLER.substring(0, handlerDot) : _HANDLER; +if (sourcefile.length === 0) { + throw new Error("handler is not set"); +} +if (!sourcefile.startsWith("/")) { + sourcefile = `./${sourcefile}`; +} +function noop() {} +const method = (handlerDot > 0 ? _HANDLER.substring(handlerDot) : "") || "GET"; + +if (typeof process.env.VERBOSE !== "undefined") { + console.time(`Loaded ${sourcefile}`); +} +var Handler; + +try { + Handler = await import(sourcefile); +} catch (e) { + console.error("Error loading sourcefile:", e); + try { + await fetch( + new URL(`http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/init/error`) + .href, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + errorMessage: e.message, + errorType: e.name, + stackTrace: e?.stack?.split("\n") ?? [], + }), + } + ); + } catch (e2) { + console.error("Error sending error to runtime:", e2); + } + process.exit(1); +} + +if (typeof process.env.VERBOSE !== "undefined") { + console.timeEnd(`Loaded ${sourcefile}`); +} + +const handlerFunction = Handler.default?.fetch; +if (typeof handlerFunction !== "function") { + const e = new Error(`${sourcefile} must export default a function called fetch + +Here is an example: + +export default { + fetch(req) { + return new Response("Hello World"); + } +} +`); + + console.error(e); + + try { + await fetch( + new URL(`http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/init/error`) + .href, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + errorMessage: e.message, + errorType: e.name, + stackTrace: e?.stack?.split("\n") ?? [], + }), + } + ); + } catch (e2) { + console.error("Error sending error to runtime:", e2); + } + + process.exit(1); +} + +var baseURLString = AWS_LAMBDA_RUNTIME_API; +if ("baseURI" in Handler.default) { + baseURLString = Handler.default.baseURI?.toString(); +} + +var baseURL; +try { + baseURL = new URL(baseURLString); +} catch (e) { + console.error("Error parsing baseURI:", e); + try { + await fetch( + new URL(`http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/init/error`) + .href, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + errorMessage: e.message, + errorType: e.name, + stackTrace: e?.stack?.split("\n") || [], + }), + } + ); + } catch (e2) { + console.error("Error sending error to runtime:", e2); + } + + process.exit(1); +} + +async function runHandler(response: Response) { + const traceID = response.headers.get("Lambda-Runtime-Trace-Id"); + const requestID = response.headers.get("Lambda-Runtime-Aws-Request-Id"); + var request = new Request(baseURL.href, { + method, + headers: response.headers, + body: + parseInt(response.headers.get("Content-Length") || "0", 10) > 0 + ? await response.blob() + : undefined, + }); + // we are done with the Response object here + // allow it to be GC'd + response = undefined; + + var result: Response; + try { + if (typeof process.env.VERBOSE !== "undefined") { + console.time(`[${traceID}] Run ${request.url}`); + } + result = handlerFunction(request, {}); + if (result && result.then) { + await result; + } + } catch (e1) { + if (typeof process.env.VERBOSE !== "undefined") { + console.error(`[${traceID}] Error running handler:`, e1); + } + fetch( + `http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/${requestID}/error`, + { + method: "POST", + + body: JSON.stringify({ + errorMessage: e1.message, + errorType: e1.name, + stackTrace: e1?.stack?.split("\n") ?? [], + }), + } + ).finally(noop); + return; + } finally { + if (typeof process.env.VERBOSE !== "undefined") { + console.timeEnd(`[${traceID}] Run ${request.url}`); + } + } + + if (!result || !("headers" in result)) { + await fetch( + `http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/${requestID}/error`, + { + method: "POST", + body: JSON.stringify({ + errorMessage: "Expected Response object", + errorType: "ExpectedResponseObject", + stackTrace: [], + }), + } + ); + return; + } + + await fetch( + `http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/${requestID}/response`, + { + method: "POST", + headers: result.headers, + body: await result.blob(), + } + ); + result = undefined; +} + +while (true) { + fetch(nextURL).then(runHandler, console.error); +} + +export {}; |