miniflare
Version:
Fun, full-featured, fully-local simulator for Cloudflare Workers
76 lines (73 loc) • 2.88 kB
JavaScript
// src/workers/browser-rendering/binding.worker.ts
import assert from "node:assert";
import { DurableObject } from "cloudflare:workers";
// src/workers/core/constants.ts
var CoreBindings = {
SERVICE_LOOPBACK: "MINIFLARE_LOOPBACK",
SERVICE_USER_ROUTE_PREFIX: "MINIFLARE_USER_ROUTE_",
SERVICE_USER_FALLBACK: "MINIFLARE_USER_FALLBACK",
TEXT_CUSTOM_SERVICE: "MINIFLARE_CUSTOM_SERVICE",
IMAGES_SERVICE: "MINIFLARE_IMAGES_SERVICE",
TEXT_UPSTREAM_URL: "MINIFLARE_UPSTREAM_URL",
JSON_CF_BLOB: "CF_BLOB",
JSON_ROUTES: "MINIFLARE_ROUTES",
JSON_LOG_LEVEL: "MINIFLARE_LOG_LEVEL",
DATA_LIVE_RELOAD_SCRIPT: "MINIFLARE_LIVE_RELOAD_SCRIPT",
DURABLE_OBJECT_NAMESPACE_PROXY: "MINIFLARE_PROXY",
DATA_PROXY_SECRET: "MINIFLARE_PROXY_SECRET",
DATA_PROXY_SHARED_SECRET: "MINIFLARE_PROXY_SHARED_SECRET",
TRIGGER_HANDLERS: "TRIGGER_HANDLERS",
LOG_REQUESTS: "LOG_REQUESTS"
};
// src/workers/browser-rendering/binding.worker.ts
var BrowserSession = class extends DurableObject {
endpoint;
async fetch(_request) {
let webSocketPair = new WebSocketPair(), [client, server] = Object.values(webSocketPair);
server.accept(), assert(this.endpoint !== void 0);
let response = await fetch(this.endpoint, {
headers: {
Upgrade: "websocket"
}
});
assert(response.webSocket !== null);
let ws = response.webSocket;
return ws.accept(), ws.addEventListener("message", (m) => {
let string = new TextEncoder().encode(m.data), data = new Uint8Array(string.length + 4);
new DataView(data.buffer).setUint32(0, string.length, !0), data.set(string, 4), server.send(data);
}), server.addEventListener("message", (m) => {
m.data !== "ping" && ws.send(new TextDecoder().decode(m.data.slice(4)));
}), new Response(null, {
status: 101,
webSocket: client
});
}
async setEndpoint(endpoint) {
this.endpoint = endpoint.replace("ws://", "http://");
}
}, binding_worker_default = {
async fetch(request, env) {
let url = new URL(request.url);
switch (url.pathname) {
case "/v1/acquire": {
let wsEndpoint = await (await env[CoreBindings.SERVICE_LOOPBACK].fetch(
"http://example.com/browser/launch"
)).text(), sessionId = crypto.randomUUID(), id = env.BrowserSession.idFromName(sessionId);
return await env.BrowserSession.get(id).setEndpoint(wsEndpoint), Response.json({ sessionId });
}
case "/v1/connectDevtools": {
let sessionId = url.searchParams.get("browser_session");
assert(sessionId !== null);
let id = env.BrowserSession.idFromName(sessionId);
return env.BrowserSession.get(id).fetch(request);
}
default:
return new Response("Not implemented", { status: 405 });
}
}
};
export {
BrowserSession,
binding_worker_default as default
};
//# sourceMappingURL=binding.worker.js.map