85 lines
2.2 KiB
JavaScript
85 lines
2.2 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Tiny PostHog capture mock.
|
|
*
|
|
* Usage:
|
|
* node evals/drivers/posthog-capture-mock.mjs --port 19877
|
|
* LANDING_POSTHOG_HOST=http://127.0.0.1:19877 pnpm --dir ee/apps/landing dev
|
|
*/
|
|
|
|
import { createServer } from "node:http";
|
|
|
|
const DEFAULT_PORT = 19877;
|
|
const events = [];
|
|
|
|
function selectedPort() {
|
|
const index = process.argv.indexOf("--port");
|
|
const value = index === -1 ? process.env.POSTHOG_MOCK_PORT : process.argv[index + 1];
|
|
return Number(value ?? DEFAULT_PORT);
|
|
}
|
|
|
|
function sendJson(response, statusCode, body) {
|
|
response.writeHead(statusCode, {
|
|
"access-control-allow-origin": "*",
|
|
"access-control-allow-methods": "GET,POST,DELETE,OPTIONS",
|
|
"access-control-allow-headers": "content-type",
|
|
"content-type": "application/json; charset=utf-8"
|
|
});
|
|
response.end(JSON.stringify(body));
|
|
}
|
|
|
|
function readJson(request, response) {
|
|
let body = "";
|
|
request.setEncoding("utf8");
|
|
request.on("data", (chunk) => {
|
|
body += chunk;
|
|
if (body.length > 1_000_000) request.destroy();
|
|
});
|
|
request.on("end", () => {
|
|
try {
|
|
events.push(body ? JSON.parse(body) : {});
|
|
sendJson(response, 200, { status: 1 });
|
|
} catch {
|
|
sendJson(response, 400, { status: 0, error: "invalid_json" });
|
|
}
|
|
});
|
|
}
|
|
|
|
const server = createServer((request, response) => {
|
|
const url = new URL(request.url ?? "/", `http://${request.headers.host ?? "127.0.0.1"}`);
|
|
const method = request.method ?? "GET";
|
|
|
|
if (method === "OPTIONS") {
|
|
sendJson(response, 204, {});
|
|
return;
|
|
}
|
|
|
|
if (url.pathname === "/i/v0/e/" && method === "POST") {
|
|
readJson(request, response);
|
|
return;
|
|
}
|
|
|
|
if (url.pathname === "/events" && method === "GET") {
|
|
sendJson(response, 200, events);
|
|
return;
|
|
}
|
|
|
|
if (url.pathname === "/events" && method === "DELETE") {
|
|
events.length = 0;
|
|
sendJson(response, 200, { status: 1 });
|
|
return;
|
|
}
|
|
|
|
sendJson(response, 404, { status: 0, error: "not_found" });
|
|
});
|
|
|
|
const port = selectedPort();
|
|
|
|
if (!Number.isInteger(port) || port <= 0) {
|
|
throw new Error(`Invalid port: ${port}`);
|
|
}
|
|
|
|
server.listen(port, "127.0.0.1", () => {
|
|
console.log(`PostHog capture mock listening at http://127.0.0.1:${port}`);
|
|
});
|