| import "dotenv/config"; |
| import { isHfStorageEnabled, getDatasetId, flushAll } from "./hf-storage.js"; |
| import { isOAuthEnabled } from "./auth.js"; |
| import { createApp } from "./create-app.js"; |
|
|
| const PORT = parseInt(process.env.PORT || "8080", 10); |
|
|
| if (isHfStorageEnabled()) { |
| console.log("[server] HF Dataset persistence enabled"); |
| } else if (getDatasetId()) { |
| console.log("[server] HF Dataset ID ready, waiting for first user login to activate persistence"); |
| } else { |
| console.log("[server] HF Dataset persistence disabled (no SPACE_ID or HF_DATASET_ID)"); |
| console.log("[server] falling back to local file persistence"); |
| } |
|
|
| const oauthEnabled = isOAuthEnabled(); |
| if (oauthEnabled) { |
| console.log("[server] HF OAuth enabled (SPACE_ID set)"); |
| } else { |
| console.log("[server] HF OAuth disabled (no SPACE_ID), all users can edit"); |
| } |
|
|
| const { httpServer } = createApp(); |
|
|
| const server = httpServer.listen(PORT, async () => { |
| console.log(`[server] running on http://localhost:${PORT}`); |
| console.log(`[server] collab websocket at ws://localhost:${PORT}/collab`); |
| console.log(`[server] SPACE_ID=${process.env.SPACE_ID || "(not set)"} HF_DATASET_ID=${getDatasetId() || "(empty)"} HF_TOKEN=${process.env.HF_TOKEN ? "set" : "not set"}`); |
| }); |
|
|
| async function gracefulShutdown(signal: string) { |
| console.log(`[server] ${signal} received, flushing to HF...`); |
| await flushAll(); |
| await new Promise<void>((resolve) => { |
| server.close(() => resolve()); |
| setTimeout(() => { |
| console.warn("[server] force-closing after timeout"); |
| resolve(); |
| }, 5000); |
| }); |
| process.exit(0); |
| } |
|
|
| process.on("SIGTERM", () => gracefulShutdown("SIGTERM")); |
| process.on("SIGINT", () => gracefulShutdown("SIGINT")); |
|
|