UNPKG

life

Version:

Life.js is the first fullstack framework to build agentic web applications. It is minimal, extensible, and typesafe. Well, everything you love.

1 lines 8.54 kB
{"version":3,"sources":["../telemetry/clients/browser.ts","../telemetry/helpers/log-level-priority.ts"],"sourcesContent":["import { UAParser } from \"ua-parser-js\";\nimport { isAIBot, isBot } from \"ua-parser-js/helpers\";\n\nimport z from \"zod\";\nimport { agentClientConfig } from \"@/agent/client/config\";\nimport packageJson from \"../../package.json\" with { type: \"json\" };\nimport type { TelemetryResource, TelemetryScopeAttributes, TelemetrySpan } from \"../types\";\nimport { defineScopes, TelemetryClient } from \"./base\";\n\nconst baseAgentClientAttributesSchema = z.object({\n agentName: z.string(),\n agentId: z.string(),\n agentConfig: agentClientConfig.schema.transform((c) => agentClientConfig.toTelemetry(c)),\n transportProviderName: z.string(),\n});\n\n/**\n * The list of valid telemetry scopes in the browser part of the Life.js codebase.\n * Ensure consistency and typesafety.\n */\nexport const telemetryBrowserScopesDefinition = defineScopes({\n client: {\n requiredAttributesSchema: z.object(),\n displayName: \"Client\",\n },\n \"agent.client\": {\n requiredAttributesSchema: baseAgentClientAttributesSchema,\n displayName: (attributes) =>\n `Agent (${attributes?.agentName} - ${attributes?.agentId.replace(\"agent_\", \"\").slice(0, 6)})`,\n },\n \"plugin.client\": {\n requiredAttributesSchema: baseAgentClientAttributesSchema.extend({\n pluginName: z.string(),\n pluginClientConfig: z.any(),\n }),\n displayName: (attributes) => `Plugin (${attributes?.pluginName})`,\n },\n react: {\n requiredAttributesSchema: z.object(),\n displayName: \"React\",\n },\n});\n\nexport class TelemetryBrowserClient extends TelemetryClient {\n constructor(scope: string) {\n super(telemetryBrowserScopesDefinition, scope);\n this.#attachFlushEventListeners();\n }\n\n /**\n * Attaches event listeners for best-effort flushing of telemetry data\n * before the page unloads, loses visibility, or gets hibernated.\n */\n #attachFlushEventListeners(): void {\n const flush = () => this.flushConsumers().catch(() => ({}));\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === \"hidden\") flush();\n });\n window.addEventListener(\"pagehide\", flush);\n window.addEventListener(\"beforeunload\", flush);\n }\n\n protected getResource(): TelemetryResource {\n const results = new UAParser().getResult();\n\n // Identify environment\n const parseEnvironment = (_value?: string) => {\n if (!_value) return null;\n const value = _value.trim().toLowerCase();\n\n // Check known environments\n if ([\"development\", \"production\", \"staging\", \"test\"].includes(value))\n return value as TelemetryResource[\"environment\"];\n\n // Support common aliases\n const alias = {\n dev: \"development\",\n prod: \"production\",\n stage: \"staging\",\n test: \"test\",\n }[value];\n if (alias) return alias as TelemetryResource[\"environment\"];\n\n // Else return null\n return null;\n };\n const environment: TelemetryResource[\"environment\"] =\n parseEnvironment(import.meta.env?.MODE) ??\n parseEnvironment(globalThis.process?.env?.NODE_ENV) ??\n parseEnvironment(globalThis.process?.env?.NEXT_PUBLIC_ENV) ??\n (typeof window !== \"undefined\" &&\n // biome-ignore lint/performance/useTopLevelRegex: unecessary\n /^(localhost|127(?:\\.\\d{1,3}){3}|\\[?::1\\]?)$/.test(globalThis.location?.hostname ?? \"\")\n ? \"development\"\n : \"production\");\n\n const userAgent = navigator.userAgent.toLowerCase();\n return {\n platform: \"browser\" as const,\n environment,\n lifeVersion: packageJson.version,\n deviceType: results?.device?.type ?? \"unknown\",\n deviceBrand: results?.device?.vendor || \"unknown\",\n deviceModel: results?.device?.model || \"unknown\",\n osName: results?.os?.name || \"unknown\",\n osVersion: results?.os?.version || \"unknown\",\n cpuArchitecture: results?.cpu?.architecture ?? \"unknown\",\n browserUserAgent: navigator.userAgent,\n browserName: results?.browser?.name || \"unknown\",\n browserVersion: results?.browser?.version || \"unknown\",\n browserEngine: results?.engine?.name || \"unknown\",\n isBot: isBot(userAgent),\n isAiBot: isAIBot(userAgent),\n schemaVersion: \"1\",\n };\n }\n\n protected getCurrentSpanData(): TelemetrySpan | undefined {\n // In the browser, there is no AsyncLocalStorage and no truly reliable alternative either\n // so as many Telemetry providers like Sentry did, the browser client will have a flat span\n // hierarchy, i.e., when you create a span, its parent is always the root span.\n // Considering that the Life.js codebase depth is mainly on the server, and that client-side\n // concerns are properly separated (plugins, agents, client, react), scope and proper naming\n // of spans should be enough to make the collected data easy to understand.\n return;\n }\n\n protected runWithSpanData(_spanData: TelemetrySpan | undefined, fn: () => unknown): unknown {\n return fn();\n }\n}\n\nexport function createTelemetryClient<Scope extends keyof typeof telemetryBrowserScopesDefinition>(\n scope: Scope,\n requiredAttributes: TelemetryScopeAttributes<\n (typeof telemetryBrowserScopesDefinition)[Scope][\"requiredAttributesSchema\"]\n >,\n) {\n const client = new TelemetryBrowserClient(scope);\n for (const [key, value] of Object.entries(requiredAttributes)) client.setAttribute(key, value);\n return client;\n}\n","import type { TelemetryLogLevel } from \"../types\";\n\nexport function logLevelPriority(level: TelemetryLogLevel) {\n if (level === \"fatal\") return 4;\n if (level === \"error\") return 3;\n if (level === \"warn\") return 2;\n if (level === \"info\") return 1;\n else return 0;\n}\n"],"mappings":"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","names":[]}