UNPKG

@logsnag/next

Version:

LogSnag client for Next applications

1 lines 12.4 kB
{"version":3,"sources":["../../../../utilities/constants/src/endpoints.ts","../../../../utilities/core/src/utils/error.ts","../../../../utilities/core/src/utils/date.ts","../../../../utilities/core/src/client/logsnag.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * LogSnag Base Endpoint\n */\n\nconst LOGSNAG_BASE = 'https://api.logsnag.com';\nconst ENDPOINT_VERSION = '/v1';\n\nexport const ENDPOINTS = {\n /**\n * LogSnag Log Endpoint\n */\n LOG: LOGSNAG_BASE + ENDPOINT_VERSION + '/log',\n\n /**\n * LogSnag Identify Endpoint\n */\n IDENTIFY: LOGSNAG_BASE + ENDPOINT_VERSION + '/identify',\n\n /**\n * LogSnag Insight Endpoint\n */\n INSIGHT: LOGSNAG_BASE + ENDPOINT_VERSION + '/insight',\n\n /**\n * LogSnag Group Endpoint\n */\n GROUP: LOGSNAG_BASE + '/v1/group',\n\n /**\n * LogSnag Page Endpoint\n */\n PAGE: LOGSNAG_BASE + ENDPOINT_VERSION + '/page'\n};\n","/**\n * Fetch HTTP Response Error\n */\nexport class HTTPResponseError extends Error {\n public readonly message: string;\n\n constructor(status: number, statusText: string, body: any | undefined) {\n super(`HTTP Error Response: ${status} ${statusText}`);\n this.message = this.createReadableString(body);\n }\n\n /**\n * Create a readable string from the response body\n * @param body\n */\n createReadableString(body: any) {\n let error = '[LogSnag] Failed to publish: ';\n if (body && body.validation && Array.isArray(body.validation.body)) {\n error += body.validation.body\n .map((item: { message: string }) => item.message)\n .join(', ');\n } else {\n error += `: Please check our docs at https://docs.logsnag.com`;\n }\n return error;\n }\n\n toString() {\n return this.message;\n }\n\n /**\n * Get Error Info as JSON\n */\n toJSON() {\n return {\n message: this.message\n };\n }\n}\n","/**\n * Check if timestamp is in milliseconds\n * @param timestamp\n */\nfunction isTimestampInMilliseconds(timestamp: number): boolean {\n return (\n Math.abs(Date.now() - timestamp) < Math.abs(Date.now() - timestamp * 1000)\n );\n}\n\n/**\n * Convert optional timestamp to unix timestamp\n * @param timestamp\n */\nexport function toUnixTimestamp(timestamp?: number | Date): number | undefined {\n if (!timestamp) return undefined;\n\n if (timestamp instanceof Date) {\n timestamp = timestamp.getTime();\n }\n\n if (isTimestampInMilliseconds(timestamp)) {\n timestamp = Math.floor(timestamp / 1000);\n }\n\n return timestamp;\n}\n","import { ENDPOINTS } from '@logsnag/constants/endpoints';\nimport { HTTPResponseError } from '../utils/error';\nimport { TrackOptions } from '../types';\nimport { InsightIncrementOptions, InsightTrackOptions } from '../types';\nimport { toUnixTimestamp } from '../utils/date';\nimport { IdentifyOptions } from '../types';\nimport { GroupOptions } from '../types';\n\n/**\n * LogSnag Client\n */\nexport default class LogSnag {\n private readonly token: string;\n private readonly project: string;\n private disabled = false;\n\n /**\n * Construct a new LogSnag instance\n * @param token LogSnag API token\n * @param project LogSnag project name\n * @param disableTracking Disable tracking\n * for more information, see: docs.logsnag.com\n */\n constructor({\n token,\n project,\n disableTracking = false\n }: {\n token: string;\n project: string;\n disableTracking?: boolean;\n }) {\n this.token = token;\n this.project = project;\n this.disabled = disableTracking || false;\n }\n\n /**\n * Disable tracking for this instance\n * (this is useful for development)\n */\n disableTracking() {\n this.disabled = true;\n }\n\n /**\n * Enable tracking for this instance\n * (this is useful for development)\n */\n enableTracking() {\n this.disabled = false;\n }\n\n /**\n * Check if tracking is disabled\n */\n isTrackingDisabled() {\n return this.disabled;\n }\n\n /**\n * Get project name\n * @returns project name\n */\n getProject(): string {\n return this.project;\n }\n\n /**\n * Creates authorization header\n * @returns Authorization header value\n */\n protected createAuthorizationHeader(): string {\n return `Bearer ${this.token}`;\n }\n\n /**\n * Creates headers for requests\n * @private\n */\n private createHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Authorization: this.createAuthorizationHeader()\n };\n }\n\n /**\n * Get insight methods\n */\n get insight() {\n return {\n track: this.insightTrack.bind(this),\n increment: this.insightIncrement.bind(this)\n };\n }\n\n /**\n * Publish a new event to LogSnag\n * @param options\n * @returns true when successfully published\n */\n public async track(options: TrackOptions): Promise<boolean> {\n if (this.isTrackingDisabled()) return true;\n const headers = this.createHeaders();\n const method = 'POST';\n\n // Convert timestamp to unix timestamp if needed\n options.timestamp = toUnixTimestamp(options.timestamp);\n\n const body = JSON.stringify({\n ...options,\n project: this.getProject()\n });\n\n const response = await fetch(ENDPOINTS.LOG, { method, body, headers });\n if (!response.ok) {\n throw new HTTPResponseError(\n response.status,\n response.statusText,\n await response.json()\n );\n }\n\n return true;\n }\n\n /**\n * Identify a user\n * @param options\n * @returns true when successfully published\n */\n public async identify(options: IdentifyOptions): Promise<boolean> {\n if (this.isTrackingDisabled()) return true;\n const headers = this.createHeaders();\n const method = 'POST';\n\n const body = JSON.stringify({\n ...options,\n project: this.getProject()\n });\n\n const response = await fetch(ENDPOINTS.IDENTIFY, { method, body, headers });\n if (!response.ok) {\n throw new HTTPResponseError(\n response.status,\n response.statusText,\n await response.json()\n );\n }\n\n return true;\n }\n\n /**\n * Group a user or update group properties\n * @param options\n * @returns true when successfully published\n */\n public async group(options: GroupOptions): Promise<boolean> {\n if (this.isTrackingDisabled()) return true;\n const headers = this.createHeaders();\n const method = 'POST';\n\n const body = JSON.stringify({\n ...options,\n project: this.getProject()\n });\n\n const response = await fetch(ENDPOINTS.GROUP, { method, body, headers });\n if (!response.ok) {\n throw new HTTPResponseError(\n response.status,\n response.statusText,\n await response.json()\n );\n }\n\n return true;\n }\n\n /**\n * Publish a new insight to LogSnag\n * @param options\n * @returns true when successfully published\n */\n protected async insightTrack(options: InsightTrackOptions): Promise<boolean> {\n if (this.isTrackingDisabled()) return true;\n const headers = this.createHeaders();\n const method = 'POST';\n const body = JSON.stringify({\n ...options,\n project: this.getProject()\n });\n\n const response = await fetch(ENDPOINTS.INSIGHT, { method, body, headers });\n if (!response.ok) {\n throw new HTTPResponseError(\n response.status,\n response.statusText,\n await response.json()\n );\n }\n\n return true;\n }\n\n /**\n * Increment an insight value\n * @param options\n * @returns true when successfully published\n */\n protected async insightIncrement(\n options: InsightIncrementOptions\n ): Promise<boolean> {\n if (this.isTrackingDisabled()) return true;\n const headers = this.createHeaders();\n const method = 'PATCH';\n const body = JSON.stringify({\n project: this.getProject(),\n icon: options.icon,\n title: options.title,\n value: {\n $inc: options.value\n }\n });\n\n const response = await fetch(ENDPOINTS.INSIGHT, { method, body, headers });\n if (!response.ok) {\n throw new HTTPResponseError(\n response.status,\n response.statusText,\n await response.json()\n );\n }\n\n return true;\n }\n}\n"]}