113 lines
2.7 KiB
JavaScript
113 lines
2.7 KiB
JavaScript
import "#nitro-internal-pollyfills";
|
|
import { useNitroApp } from "nitropack/runtime";
|
|
import { requestHasBody, runCronTasks } from "nitropack/runtime/internal";
|
|
export function createHandler(hooks) {
|
|
const nitroApp = useNitroApp();
|
|
return {
|
|
async fetch(request, env, context) {
|
|
const ctxExt = {};
|
|
const url = new URL(request.url);
|
|
if (hooks.fetch) {
|
|
const res = await hooks.fetch(request, env, context, url, ctxExt);
|
|
if (res) {
|
|
return res;
|
|
}
|
|
}
|
|
return fetchHandler(request, env, context, url, nitroApp, ctxExt);
|
|
},
|
|
scheduled(controller, env, context) {
|
|
globalThis.__env__ = env;
|
|
context.waitUntil(
|
|
nitroApp.hooks.callHook("cloudflare:scheduled", {
|
|
controller,
|
|
env,
|
|
context
|
|
})
|
|
);
|
|
if (import.meta._tasks) {
|
|
context.waitUntil(
|
|
runCronTasks(controller.cron, {
|
|
context: {
|
|
cloudflare: {
|
|
env,
|
|
context
|
|
}
|
|
},
|
|
payload: {}
|
|
})
|
|
);
|
|
}
|
|
},
|
|
email(message, env, context) {
|
|
globalThis.__env__ = env;
|
|
context.waitUntil(
|
|
nitroApp.hooks.callHook("cloudflare:email", {
|
|
message,
|
|
event: message,
|
|
// backward compat
|
|
env,
|
|
context
|
|
})
|
|
);
|
|
},
|
|
queue(batch, env, context) {
|
|
globalThis.__env__ = env;
|
|
context.waitUntil(
|
|
nitroApp.hooks.callHook("cloudflare:queue", {
|
|
batch,
|
|
event: batch,
|
|
env,
|
|
context
|
|
})
|
|
);
|
|
},
|
|
tail(traces, env, context) {
|
|
globalThis.__env__ = env;
|
|
context.waitUntil(
|
|
nitroApp.hooks.callHook("cloudflare:tail", {
|
|
traces,
|
|
env,
|
|
context
|
|
})
|
|
);
|
|
},
|
|
trace(traces, env, context) {
|
|
globalThis.__env__ = env;
|
|
context.waitUntil(
|
|
nitroApp.hooks.callHook("cloudflare:trace", {
|
|
traces,
|
|
env,
|
|
context
|
|
})
|
|
);
|
|
}
|
|
};
|
|
}
|
|
export async function fetchHandler(request, env, context, url = new URL(request.url), nitroApp = useNitroApp(), ctxExt) {
|
|
let body;
|
|
if (requestHasBody(request)) {
|
|
body = Buffer.from(await request.arrayBuffer());
|
|
}
|
|
globalThis.__env__ = env;
|
|
return nitroApp.localFetch(url.pathname + url.search, {
|
|
context: {
|
|
waitUntil: (promise) => context.waitUntil(promise),
|
|
_platform: {
|
|
cf: request.cf,
|
|
cloudflare: {
|
|
request,
|
|
env,
|
|
context,
|
|
url,
|
|
...ctxExt
|
|
}
|
|
}
|
|
},
|
|
host: url.hostname,
|
|
protocol: url.protocol,
|
|
method: request.method,
|
|
headers: request.headers,
|
|
body
|
|
});
|
|
}
|