UNPKG

@factor/plugin-server-analytics

Version:
75 lines (63 loc) 2.03 kB
import { addFilter, log } from "@factor/api" import ua from "universal-analytics" import { setting } from "@factor/api/settings" import { EndpointRunningParams } from "@factor/endpoint/server" import { MiddlewarePathConfig } from "@factor/server/types" import { Request, Response } from "express" export const setup = (): void => { const trackingId = setting("serverAnalytics.trackingId") /** * If no setting, then just abort with a warning */ if (!trackingId) { log.warn("Server analytics account ID is not set (serverAnalytics.trackingId)") return } /** * Add an event for standard endpoint requests */ if (setting("serverAnalytics.trackEndpointHits")) { addFilter({ key: "serverAnalytics", hook: "endpoint-arguments", callback: (_arguments: EndpointRunningParams): EndpointRunningParams => { const { id, bearer, data } = _arguments const uid = bearer?._id || "anon" const visitor = ua(trackingId, { uid }) const { method } = data visitor.event(`endpointRequest`, id, method).send() return _arguments }, }) } /** * Add a method to create an event by sending a get/post request to: * @param url: /__track_event__ * @param query.event - event name * @param query.action - event action * @param query.label - event label */ addFilter({ key: "serverAnalytics", hook: "middleware", callback: (_: MiddlewarePathConfig[]): MiddlewarePathConfig[] => { _.push({ path: "/__track_event__", middleware: [ (request: Request, response: Response): void => { const { query, body } = request const { event = "ping", action = "No Action", label = "No Label" } = { ...body, ...query, } const visitor = ua(trackingId) visitor.event(event, action, label).send() response.send("sent").end() }, ], }) return _ }, }) } setup()