summaryrefslogtreecommitdiff
path: root/packages/frontend/src/analytics.ts
blob: e07a4e9258f226064d1eb0ad584e01019b14f7c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
 * 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<AnalyticsInstance['identify']>) {
		return this.analytics?.identify(...args) ?? Promise.resolve();
	}

	public track(...args: Parameters<AnalyticsInstance['track']>) {
		return this.analytics?.track(...args) ?? Promise.resolve();
	}

	public page(...args: Parameters<AnalyticsInstance['page']>) {
		return this.analytics?.page(...args) ?? Promise.resolve();
	}

	public user(...args: Parameters<AnalyticsInstance['user']>) {
		return this.analytics?.user(...args) ?? Promise.resolve();
	}

	public reset(...args: Parameters<AnalyticsInstance['reset']>) {
		return this.analytics?.reset(...args) ?? Promise.resolve();
	}

	public ready(...args: Parameters<AnalyticsInstance['ready']>) {
		return this.analytics?.ready(...args) ?? function () { void 0; };
	}

	public on(...args: Parameters<AnalyticsInstance['on']>) {
		return this.analytics?.on(...args) ?? function () { void 0; };
	}

	public once(...args: Parameters<AnalyticsInstance['once']>) {
		return this.analytics?.once(...args) ?? function () { void 0; };
	}

	public getState(...args: Parameters<AnalyticsInstance['getState']>) {
		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,
	}));
}