Skip to content

Commit

Permalink
add named export for Edge
Browse files Browse the repository at this point in the history
  • Loading branch information
Kikobeats committed May 24, 2023
1 parent 8901ec1 commit a5de738
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 18 deletions.
34 changes: 25 additions & 9 deletions packages/node/src/edge-functions/edge-handler-template.js
Expand Up @@ -10,14 +10,14 @@ function getUrl(url, headers) {
return urlObj.toString();
}

async function respond(userEdgeHandler, event, options, dependencies) {
async function respond(handler, event, options, dependencies) {
const { Request, Response } = dependencies;
const { isMiddleware } = options;
event.request.headers.set(
'host',
event.request.headers.get('x-forwarded-host')
);
let response = await userEdgeHandler(
let response = await handler(
new Request(
getUrl(event.request.url, event.request.headers),
event.request
Expand Down Expand Up @@ -62,15 +62,31 @@ async function parseRequestEvent(event) {

// This will be invoked by logic using this template
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function registerFetchListener(userEdgeHandler, options, dependencies) {
function registerFetchListener(module, options, dependencies) {
addEventListener('fetch', async event => {
let handler;
if (typeof module.default === 'function') {
handler = module.default;
} else {
if (
['GET', 'HEAD', 'OPTIONS', 'POST', 'PUT', 'DELETE', 'PATCH'].some(
method => typeof module[method] === 'function'
)
) {
const method = event.request.method ?? 'GET';
handler =
typeof module[method] === 'function'
? module[method]
: () => new dependencies.Response(null, { status: 405 });
} else {
throw new Error(
'No default export was found. Add a default export to handle requests. Learn more: https://vercel.link/creating-edge-middleware'
);
}
}

try {
const response = await respond(
userEdgeHandler,
event,
options,
dependencies
);
const response = await respond(handler, event, options, dependencies);
return event.respondWith(response);
} catch (error) {
event.respondWith(toResponseError(error, dependencies.Response));
Expand Down
9 changes: 2 additions & 7 deletions packages/node/src/edge-functions/edge-handler.mts
Expand Up @@ -89,12 +89,7 @@ async function compileUserCode(
// user code
${compiledFile.text};
const userEdgeHandler = module.exports.default;
if (!userEdgeHandler) {
throw new Error(
'No default export was found. Add a default export to handle requests. Learn more: https://vercel.link/creating-edge-middleware'
);
}
const handler = module.exports;
// request metadata
const isMiddleware = ${isMiddleware};
Expand All @@ -104,7 +99,7 @@ async function compileUserCode(
${edgeHandlerTemplate};
const dependencies = { Request, Response };
const options = { isMiddleware, entrypointLabel };
registerFetchListener(userEdgeHandler, options, dependencies);
registerFetchListener(handler, options, dependencies);
`;

return {
Expand Down
4 changes: 2 additions & 2 deletions packages/node/src/serverless-functions/serverless-handler.mts
Expand Up @@ -21,7 +21,7 @@ type ServerlessFunctionSignature = (
res: ServerResponse | VercelResponse
) => void;

const [nodeMajor] = process.versions.node.split('.').map(v => Number(v));
const [NODE_MAJOR] = process.versions.node.split('.').map(v => Number(v));

/* https://nextjs.org/docs/app/building-your-application/routing/router-handlers#supported-http-methods */
const HTTP_METHODS = [
Expand Down Expand Up @@ -57,7 +57,7 @@ async function compileUserCode(
}

if (HTTP_METHODS.some(method => typeof listener[method] === 'function')) {
if (nodeMajor < 18) throw new Error('Node.js v18 or above is needed')
if (NODE_MAJOR < 18) throw new Error('Node.js v18 or above is needed');
const { getWebExportsHandler } = await import('./helpers-web.js');
return getWebExportsHandler(listener, HTTP_METHODS);
}
Expand Down

0 comments on commit a5de738

Please sign in to comment.