tanzanite / src /index.js
MyOnee
/usr/local/rvm/gems/ruby-3.4.7/bin:/usr/local/rvm/gems/ruby-3.4.7@global/bin:/usr/local/rvm/rubies/ruby-3.4.7/bin:/home/codespace/.vscode-remote/data/User/globalStorage/github.copilot-chat/debugCommand:/home/codespace/.vscode-remote/data/User/globalStorage/github.copilot-chat/copilotCli:/vscode/bin/linux-x64/7e7950df89d055b5a378379db9ee14290772148a/bin/remote-cli:/home/codespace/.local/bin:/home/codespace/.dotnet:/home/codespace/nvm/current/bin:/home/codespace/.php/current/bin:/home/codespace/.python/current/bin:/home/codespace/java/current/bin:/home/codespace/.ruby/current/bin:/home/codespace/.local/bin:/usr/local/python/current/bin:/usr/local/py-utils/bin:/usr/local/jupyter:/usr/local/oryx:/usr/local/go/bin:/go/bin:/usr/local/sdkman/bin:/usr/local/sdkman/candidates/java/current/bin:/usr/local/sdkman/candidates/gradle/current/bin:/usr/local/sdkman/candidates/maven/current/bin:/usr/local/sdkman/candidates/ant/current/bin:/usr/local/rvm/gems/default/bin:/usr/local/rvm/gems/default@global/bin:/usr/local/rvm/rubies/default/bin:/usr/local/share/rbenv/bin:/usr/local/php/current/bin:/opt/conda/bin:/usr/local/nvs:/usr/local/share/nvm/versions/node/v24.14.0/bin:/usr/local/hugo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/share/dotnet:/home/codespace/.dotnet/tools:/usr/local/rvm/bin
d1ca8c8
Raw
History Blame Contribute Delete
2.59 kB
import express from "express";
import multer from "multer";
import dotenv from "dotenv";
dotenv.config();
const app = express();
const upload = multer({
storage: multer.memoryStorage(),
limits: {
fileSize: 100 * 1024 * 1024,
},
});
const PORT = process.env.PORT || 4001 || 4002;
const HF_TOKEN = process.env.HF_TOKEN;
const DEFAULT_DATASET_REPO = process.env.HUGGINGFACE_DATASET_REPO;
app.use((req, res, next) => {
res.setHeader("Access-Control-Allow-Origin", process.env.CORS_ORIGIN || "*");
res.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS");
res.setHeader("Access-Control-Allow-Headers", "Content-Type,Authorization");
if (req.method === "OPTIONS") {
return res.sendStatus(200);
}
next();
});
if (!HF_TOKEN) {
console.error("Missing HF_TOKEN in environment. Set it in .env or process env.");
process.exit(1);
}
app.post("/upload", upload.single("file"), async (req, res) => {
try {
if (!req.file) {
return res.status(400).json({ error: "File is required (field name: file)." });
}
const datasetRepo = req.body.dataset || DEFAULT_DATASET_REPO;
if (!datasetRepo) {
return res.status(400).json({ error: "Dataset repository is required in request body or HUGGINGFACE_DATASET_REPO .env." });
}
const targetPath = req.body.path || req.file.originalname;
const url = `https://huggingface.co/api/datasets/${encodeURIComponent(datasetRepo)}/files/${encodeURIComponent(targetPath)}`;
const response = await fetch(url, {
method: "PUT",
headers: {
Authorization: `Bearer ${HF_TOKEN}`,
"Content-Type": req.file.mimetype || "application/octet-stream"
},
body: req.file.buffer
});
const result = await response.json();
if (!response.ok) {
return res.status(response.status).json({ error: result, url });
}
return res.status(200).json({ success: true, datasetRepo, path: targetPath, result });
} catch (error) {
console.error("Upload error:", error);
return res.status(500).json({ error: "Failed to upload file to Hugging Face dataset.", details: error.message });
}
});
app.use((error, req, res, next) => {
if (error instanceof multer.MulterError && error.code === "LIMIT_FILE_SIZE") {
return res.status(413).json({ error: "Ukuran file melebihi batas 100 MB." });
}
next(error);
});
app.get("/", (req, res) => {
res.json({ message: "Hugging Face dataset upload API is running.", uploadEndpoint: "/upload" });
});
app.listen(PORT, () => {
console.log(`Server listening on http://localhost:${PORT}`);
});