Files
stats/packages/sdks/express/index.ts
2025-11-17 16:01:13 +01:00

50 lines
1.3 KiB
TypeScript

import { getClientIpFromHeaders } from '@openpanel/common/server/get-client-ip';
import type { NextFunction, Request, Response } from 'express';
import type { OpenPanelOptions } from '@openpanel/sdk';
import { OpenPanel } from '@openpanel/sdk';
export * from '@openpanel/sdk';
declare global {
namespace Express {
export interface Request {
op: OpenPanel;
}
}
}
export type OpenpanelOptions = OpenPanelOptions & {
trackRequest?: (url: string) => boolean;
getProfileId?: (req: Request) => string;
};
export default function createMiddleware(options: OpenpanelOptions) {
return function middleware(req: Request, res: Response, next: NextFunction) {
const sdk = new OpenPanel(options);
const { ip } = getClientIpFromHeaders(req.headers);
if (ip) {
sdk.api.addHeader('openpanel-client-ip', ip);
}
if (req.headers['user-agent']) {
sdk.api.addHeader('user-agent', req.headers['user-agent'] as string);
}
if (options.trackRequest?.(req.url)) {
const profileId = options.getProfileId
? options.getProfileId(req)
: undefined;
sdk.track('request', {
url: req.url,
method: req.method,
query: req.query,
profileId,
});
}
req.op = sdk;
return next();
};
}