unleash-server
Version:
Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.
87 lines • 3.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.OnboardingService = void 0;
const metric_events_1 = require("../../metric-events");
const date_fns_1 = require("date-fns");
const START_ONBOARDING_TRACKING_DATE = new Date(2024, 8, 3);
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(metric_events_1.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(metric_events_1.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 &&
(0, date_fns_1.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 = (0, date_fns_1.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 = (0, date_fns_1.millisecondsToSeconds)(Date.now() - startDate.getTime());
await this.onboardingStore.insertProjectEvent({
type: event.type,
timeToEvent,
project: project.project,
});
}
}
exports.OnboardingService = OnboardingService;
//# sourceMappingURL=onboarding-service.js.map