unleash-server
Version:
Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.
81 lines • 3.05 kB
JavaScript
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, }, { eventBus }) {
this.onboardingStore = onboardingStore;
this.projectReadModel = projectReadModel;
this.userStore = userStore;
this.eventBus = eventBus;
}
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(Date.now() - 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