/* * SPDX-FileCopyrightText: syuilo and misskey-project * SPDX-License-Identifier: AGPL-3.0-only */ import * as Misskey from 'misskey-js'; import type { AnalyticsInstance, AnalyticsPlugin } from 'analytics'; /** * analytics moduleを読み込まなくても動作するようにするためのラッパー */ class AnalyticsProxy implements AnalyticsInstance { private analytics?: AnalyticsInstance; constructor(analytics?: AnalyticsInstance) { if (analytics) { this.analytics = analytics; } } public setAnalytics(analytics: AnalyticsInstance) { if (this.analytics) { throw new Error('Analytics instance already exists.'); } this.analytics = analytics; } public identify(...args: Parameters) { return this.analytics?.identify(...args) ?? Promise.resolve(); } public track(...args: Parameters) { return this.analytics?.track(...args) ?? Promise.resolve(); } public page(...args: Parameters) { return this.analytics?.page(...args) ?? Promise.resolve(); } public user(...args: Parameters) { return this.analytics?.user(...args) ?? Promise.resolve(); } public reset(...args: Parameters) { return this.analytics?.reset(...args) ?? Promise.resolve(); } public ready(...args: Parameters) { return this.analytics?.ready(...args) ?? function () { void 0; }; } public on(...args: Parameters) { return this.analytics?.on(...args) ?? function () { void 0; }; } public once(...args: Parameters) { return this.analytics?.once(...args) ?? function () { void 0; }; } public getState(...args: Parameters) { return this.analytics?.getState(...args) ?? Promise.resolve(); } public get storage() { return this.analytics?.storage ?? { getItem: () => null, setItem: () => void 0, removeItem: () => void 0, }; } public get plugins() { return this.analytics?.plugins ?? { enable: (p, c) => Promise.resolve(c ? c() : void 0), disable: (p, c) => Promise.resolve(c ? c() : void 0), }; } } export const analytics = new AnalyticsProxy(); export async function initAnalytics(instance: Misskey.entities.MetaDetailed) { // アナリティクスプロバイダに関する設定がひとつもない場合は、アナリティクスモジュールを読み込まない if (!instance.googleAnalyticsMeasurementId) { return; } const { default: Analytics } = await import('analytics'); const plugins: AnalyticsPlugin[] = []; // Google Analytics if (instance.googleAnalyticsMeasurementId) { const { default: googleAnalytics } = await import('@analytics/google-analytics'); plugins.push(googleAnalytics({ measurementIds: [instance.googleAnalyticsMeasurementId], debug: _DEV_, })); } analytics.setAnalytics(Analytics({ app: 'misskey', version: _VERSION_, debug: _DEV_, plugins, })); }