From 4de85eb365eeea6a8f38835cbdf7df5c4b387dfe Mon Sep 17 00:00:00 2001 From: Matti Nannt Date: Mon, 21 Aug 2023 11:30:00 +0200 Subject: [PATCH] Add jsVersion & sessionCreated event to Telemetry (#720) --- apps/web/app/api/v1/js/sync/route.ts | 13 +++++++++++++ packages/js/src/lib/sync.ts | 2 ++ packages/js/tsconfig.json | 1 + packages/types/v1/js.ts | 1 + 4 files changed, 17 insertions(+) diff --git a/apps/web/app/api/v1/js/sync/route.ts b/apps/web/app/api/v1/js/sync/route.ts index 11010f3ce1..c5321611dc 100644 --- a/apps/web/app/api/v1/js/sync/route.ts +++ b/apps/web/app/api/v1/js/sync/route.ts @@ -6,11 +6,16 @@ import { getEnvironment } from "@formbricks/lib/services/environment"; import { createPerson, getPerson } from "@formbricks/lib/services/person"; import { getProductByEnvironmentId } from "@formbricks/lib/services/product"; import { createSession, extendSession, getSession } from "@formbricks/lib/services/session"; +import { captureTelemetry } from "@formbricks/lib/telemetry"; import { TJsState, ZJsSyncInput } from "@formbricks/types/v1/js"; import { TPerson } from "@formbricks/types/v1/people"; import { TSession } from "@formbricks/types/v1/sessions"; import { NextResponse } from "next/server"; +const captureNewSessionTelemetry = async (jsVersion?: string): Promise => { + await captureTelemetry("session created", { jsVersion: jsVersion ?? "unknown" }); +}; + export async function OPTIONS(): Promise { return responses.successResponse({}, true); } @@ -53,6 +58,8 @@ export async function POST(req: Request): Promise { getProductByEnvironmentId(environmentId), ]); + captureNewSessionTelemetry(inputValidation.data.jsVersion); + // return state const state: TJsState = { person, @@ -79,6 +86,9 @@ export async function POST(req: Request): Promise { getActionClasses(environmentId), getProductByEnvironmentId(environmentId), ]); + + captureNewSessionTelemetry(inputValidation.data.jsVersion); + // return state const state: TJsState = { person, @@ -87,6 +97,7 @@ export async function POST(req: Request): Promise { noCodeActionClasses: noCodeActionClasses.filter((actionClass) => actionClass.type === "noCode"), product, }; + return responses.successResponse({ ...state }, true); } // person & session exists @@ -104,6 +115,7 @@ export async function POST(req: Request): Promise { } // create a new session session = await createSession(person.id); + captureNewSessionTelemetry(inputValidation.data.jsVersion); } else { // session exists // check if person exists (should always exist, but just in case) @@ -117,6 +129,7 @@ export async function POST(req: Request): Promise { if (session.expiresAt < new Date()) { // create a new session session = await createSession(person.id); + captureNewSessionTelemetry(inputValidation.data.jsVersion); } else { // extend session session = await extendSession(sessionId); diff --git a/packages/js/src/lib/sync.ts b/packages/js/src/lib/sync.ts index 0b755b0336..85d4310e05 100644 --- a/packages/js/src/lib/sync.ts +++ b/packages/js/src/lib/sync.ts @@ -3,6 +3,7 @@ import { trackAction } from "./actions"; import { Config } from "./config"; import { NetworkError, Result, err, ok } from "./errors"; import { Logger } from "./logger"; +import packageJson from "../../package.json"; const config = Config.getInstance(); const logger = Logger.getInstance(); @@ -19,6 +20,7 @@ const syncWithBackend = async (): Promise> => { environmentId: config.get().environmentId, personId: config.get().state?.person.id, sessionId: config.get().state?.session.id, + jsVersion: packageJson.version, }), }); if (!response.ok) { diff --git a/packages/js/tsconfig.json b/packages/js/tsconfig.json index 2b12fcf17e..b3ecc47557 100644 --- a/packages/js/tsconfig.json +++ b/packages/js/tsconfig.json @@ -34,6 +34,7 @@ /* Module Resolution Options */ "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, + "resolveJsonModule": true /* Allow importing .json files */, // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ diff --git a/packages/types/v1/js.ts b/packages/types/v1/js.ts index 6cccd482a3..0ff29d3fd2 100644 --- a/packages/types/v1/js.ts +++ b/packages/types/v1/js.ts @@ -19,6 +19,7 @@ export const ZJsSyncInput = z.object({ environmentId: z.string().cuid2(), personId: z.string().cuid2().optional(), sessionId: z.string().cuid2().optional(), + jsVersion: z.string().optional(), }); export type TJsSyncInput = z.infer;