Collector server for heat-tracker sessions and events
npm install @m-software-engineering/heat-collectorCollector server for heat-tracker sessions and events. Exposes ingest and query APIs and stores data in your database.
``bash`
npm install @m-software-engineering/heat-collectoror
pnpm add @m-software-engineering/heat-collectoror
yarn add @m-software-engineering/heat-collector
Database drivers are peer dependencies:
- Postgres: pgmysql2
- MySQL: better-sqlite3
- SQLite:
`ts
import express from "express";
import { createCollector } from "@m-software-engineering/heat-collector";
const collector = await createCollector({
db: { dialect: "sqlite", file: "./heat-tracker.db" },
auth: { mode: "projectKey" },
autoMigrate: true
});
const app = express();
app.use(collector.router);
app.listen(3000, () => {
console.log("Collector listening on http://localhost:3000");
});
`
`ts
import express from "express";
import { createCollector } from "@m-software-engineering/heat-collector";
const app = express();
const collector = await createCollector({
db: { dialect: "sqlite", file: "./heat-tracker.db" },
auth: { mode: "projectKey" }
});
app.use(collector.router);
app.listen(3000);
`
`ts
// app.module.ts
import { Module, MiddlewareConsumer, NestModule } from "@nestjs/common";
import { createCollector } from "@m-software-engineering/heat-collector";
import express from "express";
@Module({})
export class AppModule implements NestModule {
async configure(consumer: MiddlewareConsumer) {
const collector = await createCollector({
db: { dialect: "sqlite", file: "./heat-tracker.db" },
auth: { mode: "projectKey" }
});
const router = express.Router();
router.use(collector.router);
consumer.apply(router).forRoutes("*");
}
}
`
POST /ingest
Headers:
- x-project-key: your project keyauthorization
- : Bearer (optional if using JWT auth)
- GET /api/projects/:projectId/heatmapGET /api/projects/:projectId/sessions
- GET /api/sessions/:sessionId
-
- projectKey: ingest requires x-project-keyjwt
- : ingest requires a valid JWTboth
- : accepts both project key and JWT
`ts``
type CollectorConfig = {
db: { dialect: "pg" | "mysql" | "sqlite"; connectionString?: string; file?: string };
auth:
| { mode: "projectKey" }
| { mode: "jwt"; jwksUrl: string; issuer: string; audience: string }
| { mode: "both"; jwksUrl: string; issuer: string; audience: string };
autoMigrate?: boolean;
ingestion?: { maxBodyBytes?: number; rateLimit?: { windowMs: number; max: number } };
hooks?: { onBeforeInsert?: (payload: any) => any | Promise
logging?: { level: "debug" | "info" | "warn" | "error" };
};