@edgeone/astro
Version:
Astro adapter for EdgeOne Pages
75 lines (67 loc) • 2.08 kB
JavaScript
/**
* Server entry file generation utilities
*/
import { writeFileSync } from 'node:fs';
import { join } from 'node:path';
import { DEFAULT_PORT } from './constants.js';
/**
* Create server entry file index.mjs
*/
export function createServerEntryFile(serverDir, serverEntryFile, port = DEFAULT_PORT) {
const indexContent = generateServerEntryContent(serverEntryFile, port);
writeFileSync(join(serverDir, 'handler.js'), indexContent);
}
/**
* Generate server entry file content
*/
function generateServerEntryContent(serverEntryFile, port) {
return `
async function readRequestBody(req) {
return new Promise((resolve, reject) => {
const chunks = [];
req.on('data', (chunk) => {
chunks.push(chunk);
});
req.on('end', () => {
try {
const bodyBuffer = Buffer.concat(chunks);
resolve(bodyBuffer.length ? bodyBuffer : undefined);
} catch (err) {
reject(err);
}
});
req.on('error', reject);
});
}
const handlerPromise = import('./${serverEntryFile}');
async function astroHandler (req, res) {
try {
const host = req.headers.host || 'localhost';
const proto = req.headers['x-forwarded-proto'] || 'https';
const url = new URL(req.url, proto + '://' + host);
const { default: handler } = await handlerPromise;
let bodyBuffer;
if (req.method !== 'GET' && req.method !== 'HEAD') {
bodyBuffer = await readRequestBody(req);
}
const headers = new Headers(req.headers);
const requestInit = {
method: req.method,
headers,
body: bodyBuffer,
};
const request = new Request(url.toString(), requestInit);
const response = await handler(request);
// await handleResponse(res, response);
return response;
} catch (error) {
console.error('SSR Error:', error);
res.statusCode = 500;
res.setHeader('Content-Type', 'text/html; charset=utf-8');
res.end('<html><body><h1>Error</h1><p>' + error.message + '</p></body></html>');
}
}
export default astroHandler;
`;
}
//# sourceMappingURL=server-entry.js.map