fix: remove entry-server handler copy in adapters

master
Katja Lutz 1 year ago
commit 75c92c079c

@ -0,0 +1,5 @@
# start-node
Adapter for Solid apps that builds a Node server.
This is very experimental; the adapter API isn't at all fleshed out, and things will definitely change.

@ -0,0 +1,27 @@
import { dirname, join } from "path";
import { createServer } from "solid-start-node/server.js";
import "solid-start/node/globals.js";
import { fileURLToPath } from "url";
import manifest from "../../dist/public/route-manifest.json";
import handler from "./entry-server.js";
const { PORT = 3000 } = process.env;
const __dirname = dirname(fileURLToPath(import.meta.url));
const paths = {
assets: join(__dirname, "/public")
};
const server = createServer({
paths,
handler,
env: { manifest },
});
server.listen(PORT, err => {
if (err) {
console.log("error", err);
} else {
console.log(`Listening on port ${PORT}`);
}
});

@ -0,0 +1,59 @@
import common from "@rollup/plugin-commonjs";
import json from "@rollup/plugin-json";
import nodeResolve from "@rollup/plugin-node-resolve";
import { readFileSync, writeFileSync } from "fs";
import { dirname, join } from "path";
import { rollup } from "rollup";
import { fileURLToPath, pathToFileURL } from "url";
export default function () {
return {
name: "node",
start(config, { port }) {
process.env.PORT = port;
import(pathToFileURL(join(config.root, "dist", "server.js")).toString());
return `http://localhost:${process.env.PORT}`;
},
async build(config, builder) {
const ssrExternal = config?.ssr?.external || [];
const __dirname = dirname(fileURLToPath(import.meta.url));
if (!config.solidOptions.ssr) {
await builder.spaClient(join(config.root, "dist", "public"));
await builder.server(join(config.root, ".solid", "server"));
} else if (config.solidOptions.islands) {
await builder.islandsClient(join(config.root, "dist", "public"));
await builder.server(join(config.root, ".solid", "server"));
} else {
await builder.client(join(config.root, "dist", "public"));
await builder.server(join(config.root, ".solid", "server"));
}
let text = readFileSync(join(__dirname, "entry.js")).toString();
writeFileSync(join(config.root, ".solid", "server", "server.js"), text);
builder.debug(`bundling server with rollup`);
const bundle = await rollup({
input: join(config.root, ".solid", "server", "server.js"),
plugins: [
json(),
nodeResolve({
preferBuiltins: true,
exportConditions: ["node", "solid"]
}),
common({ strictRequires: true, ...config.build.commonjsOptions })
],
external: ["undici", "stream/web", ...ssrExternal]
});
// or write the bundle to disk
await bundle.write({ format: "esm", dir: join(config.root, "dist") });
// closes the bundle
await bundle.close();
builder.debug(`bundling server done`);
}
};
}

@ -0,0 +1,29 @@
{
"name": "solid-start-node",
"version": "0.2.22",
"main": "./index.js",
"type": "module",
"solid": {
"type": "adapter"
},
"dependencies": {
"@rollup/plugin-commonjs": "^24.0.0",
"@rollup/plugin-json": "^6.0.0",
"@rollup/plugin-node-resolve": "^13.3.0",
"compression": "^1.7.4",
"polka": "1.0.0-next.22",
"rollup": "^3.10.0",
"sirv": "^2.0.2",
"terser": "^5.16.1"
},
"devDependencies": {
"solid-start": "workspace:*",
"undici": "^5.15.1",
"vite": "^3.2.5"
},
"peerDependencies": {
"solid-start": "*",
"undici": "^5.8.0",
"vite": "*"
}
}

@ -0,0 +1,62 @@
import compression from "compression";
import fs from "fs";
import { readFile } from "fs/promises";
import { join } from "path";
import polka from "polka";
import sirv from "sirv";
import { createRequest, handleNodeResponse } from "solid-start/node/fetch.js";
global.onunhandledrejection = (err, promise) => {
console.error(err);
console.error(promise);
};
export function createServer({ handler, paths, env }) {
const comp = compression({
threshold: 0,
filter: req => {
return !req.headers["accept"]?.startsWith("text/event-stream");
}
});
const assets_handler = fs.existsSync(paths.assets)
? sirv(paths.assets, {
setHeaders: (res, pathname) => {
const isAsset = pathname.startsWith("/assets/");
if (isAsset) {
res.setHeader("cache-control", "public, immutable, max-age=31536000");
}
}
})
: (_req, _res, next) => next();
const render = async (req, res) => {
try {
env.getStaticHTML = async assetPath => {
let text = await readFile(join(paths.assets, assetPath + ".html"), "utf8");
return new Response(text, {
headers: {
"content-type": "text/html"
}
});
};
const webRes = await handler({
request: createRequest(req),
clientAddress: req.socket.remoteAddress,
locals: {},
env
});
handleNodeResponse(webRes, res);
} catch (err) {
console.error(err);
res.statusCode = 500;
res.statusMessage = "Internal Server Error";
res.end();
}
};
const server = polka().use("/", comp, assets_handler).use(comp, render);
return server;
}
Loading…
Cancel
Save