UNPKG

unleash-server

Version:

Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.

83 lines 3.19 kB
import { STAGE_ENTERED, USER_LOGIN } from '../../metric-events.js'; import { isBefore, millisecondsToSeconds } from 'date-fns'; const START_ONBOARDING_TRACKING_DATE = new Date(2024, 8, 3); export class OnboardingService { constructor({ onboardingStore, projectReadModel, userStore, }, { flagResolver, eventBus, getLogger, }) { this.onboardingStore = onboardingStore; this.projectReadModel = projectReadModel; this.userStore = userStore; this.flagResolver = flagResolver; this.eventBus = eventBus; this.logger = getLogger('onboarding/onboarding-service.ts'); } listen() { this.eventBus.on(USER_LOGIN, async (event) => { if (event.loginOrder === 0) { await this.insert({ type: 'first-user-login' }); } if (event.loginOrder === 1) { await this.insert({ type: 'second-user-login', }); } }); this.eventBus.on(STAGE_ENTERED, async (stage) => { if (stage.stage === 'initial') { await this.insert({ type: 'flag-created', flag: stage.feature, }); } else if (stage.stage === 'pre-live') { await this.insert({ type: 'pre-live', flag: stage.feature, }); } else if (stage.stage === 'live') { await this.insert({ type: 'live', flag: stage.feature, }); } }); } async insert(event) { const firstInstanceUserDate = await this.userStore.getFirstUserDate(); // the time we introduced onboarding tracking if (firstInstanceUserDate && isBefore(firstInstanceUserDate, START_ONBOARDING_TRACKING_DATE)) return; await this.insertInstanceEvent(event, firstInstanceUserDate); if ('flag' in event) { await this.insertProjectEvent(event, firstInstanceUserDate); } this.eventBus.emit('onboarding-event'); } async insertInstanceEvent(event, firstInstanceUserDate) { if (!firstInstanceUserDate) return; const timeToEvent = millisecondsToSeconds(new Date().getTime() - firstInstanceUserDate.getTime()); await this.onboardingStore.insertInstanceEvent({ type: event.type, timeToEvent, }); } async insertProjectEvent(event, firstInstanceUserDate) { const project = await this.projectReadModel.getFeatureProject(event.flag); if (!project) return; const startDate = project.project === 'default' ? firstInstanceUserDate : project.createdAt || null; if (!startDate) return; const timeToEvent = millisecondsToSeconds(Date.now() - startDate.getTime()); await this.onboardingStore.insertProjectEvent({ type: event.type, timeToEvent, project: project.project, }); } } //# sourceMappingURL=onboarding-service.js.map