feature-flag-core
Version:
🏁 Turn features on and off like a pro – no magic spells required.🎩✨
91 lines (74 loc) • 2.46 kB
text/typescript
import express from "express";
import cors from "cors";
import { readFlags, setFlag, removeFlag, getFlag } from "../core/index.js";
const app = express();
const DEFAULT_PORT = 3231;
// Simple argument parser for --port flag
const args = process.argv.slice(2); // skip first two args (node executable and script path)
let PORT = DEFAULT_PORT;
process.env.PORT = DEFAULT_PORT.toString();
const portArgIndex = args.indexOf("--port");
if (portArgIndex !== -1 && args[portArgIndex + 1]) {
const portFromArgs = Number(args[portArgIndex + 1]);
if (!isNaN(portFromArgs) && portFromArgs > 0 && portFromArgs < 65536) {
PORT = portFromArgs;
process.env.PORT = portFromArgs.toString();
} else {
console.warn(`Invalid port number provided: ${args[portArgIndex + 1]}. Falling back to default port ${DEFAULT_PORT}`);
}
}
// const PORT = 3231;
app.use(cors());
app.use(express.json());
app.use((req, res, next) => {
res.cookie('featureFlagPort', PORT.toString(), {
maxAge: 365 * 24 * 60 * 60 * 1000, // 1 year
httpOnly: true, // Secure the cookie to prevent JS access
// sameSite: 'Strict', // Secure cookie handling
});
next();
});
// GET all feature flags
app.get("/flags", async (req, res) => {
try {
const flags = await readFlags();
res.json(flags);
} catch (error) {
console.log('the flags error is', error);
res.status(500).json({ error: "Failed to read flags" });
}
});
// POST to add/update a flag
app.post("/flags", async (req: any, res: any) => {
const { key, value } = req.body;
if (typeof key !== "string" || typeof value !== "boolean") {
return res.status(400).json({ error: "Invalid input" });
}
try {
await setFlag(key, value);
res.json({ message: "Flag updated" });
} catch (error) {
res.status(500).json({ error: "Failed to update flag" });
}
});
// DELETE a flag
app.delete("/flags/:key", async (req, res) => {
const key = req.params.key;
try {
await removeFlag(key);
res.json({ message: "Flag removed" });
} catch (error) {
res.status(500).json({ error: "Failed to remove flag" });
}
});
app.get("/flags/:key", async (req: any, res: any) => {
const value = await getFlag(req.params.key);
if (value === undefined) {
return res.status(404).json({ error: "Flag not found" });
}
res.json({ value });
});
app.listen(PORT, () => {
console.log(`Feature Flag API running on http://localhost:${PORT}`);
});