@depot/connectrpc-workers
Version:
Connect RPC adapter for Cloudflare Workers
61 lines (60 loc) • 2.13 kB
JavaScript
// src/index.ts
import { createConnectRouter } from "@connectrpc/connect";
import { uResponseNotFound } from "@connectrpc/connect/protocol";
function connectWorkersAdapter(options) {
const router = createConnectRouter(options);
options.routes(router);
const paths = /* @__PURE__ */ new Map();
const prefix = options.requestPathPrefix ?? "";
for (const handler2 of router.handlers) {
paths.set(prefix + handler2.requestPath, handler2);
}
const notFoundResponse = universalResponseToResponse(uResponseNotFound);
const handler = async (request, env, context) => {
const handler2 = paths.get(new URL(request.url).pathname);
if (!handler2) return options.fallback ? options.fallback(request, env, context) : notFoundResponse;
const contextValues = options.contextValues?.(request, env, context);
const universalRequest = requestToUniversalRequest(request, contextValues);
const universalResponse = await handler2(universalRequest);
return universalResponseToResponse(universalResponse);
};
return handler;
}
function requestToUniversalRequest(request, contextValues) {
const httpVersion = request.cf?.httpProtocol === "HTTP/2" ? "2.0" : "1.1";
return {
httpVersion,
url: request.url,
method: request.method,
header: request.headers,
body: request.body,
signal: request.signal,
contextValues
};
}
function universalResponseToResponse(universalResponse) {
if (universalResponse.trailer) {
console.warn("Trailers are not supported in the Workers environment, and will be ignored by the Response");
}
return new Response(universalResponse.body ? asyncIterableToReadableStream(universalResponse.body) : null, {
status: universalResponse.status,
headers: universalResponse.header
});
}
function asyncIterableToReadableStream(iterable) {
return new ReadableStream({
async start(controller) {
try {
for await (const chunk of iterable) {
controller.enqueue(chunk);
}
controller.close();
} catch (err) {
controller.error(err);
}
}
});
}
export {
connectWorkersAdapter
};