UNPKG

@ministryofjustice/hmpps-digital-prison-reporting-frontend

Version:

The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.

92 lines (88 loc) 3.16 kB
'use strict'; var index = require('../../node_modules/@flipt-io/flipt-client-js/dist/node/index.js'); var Sentry = require('@sentry/node'); var featureFlagsHelper = require('../utils/featureFlagsHelper.js'); class FeatureFlagService { clientConfig; clientPromise; constructor(config = {}) { const { token, url } = config && config; if (!token || !url) { return; } const updateInterval = (typeof config.updateInterval === 'number' && config.updateInterval) || 120; this.clientConfig = { url, namespace: featureFlagsHelper.FEATURE_FLAG_NAMESPACE, authentication: { clientToken: token, }, updateInterval, }; } async getClient() { if (!this.clientConfig) { return undefined; } if (!this.clientPromise) { this.clientPromise = index.FliptClient.init(this.clientConfig).catch(error => { this.clientPromise = undefined; throw error; }); } return this.clientPromise; } async refresh() { const client = await this.getClient(); await client?.refresh(); } async evaluateBooleanFlag(flagKey, subject) { const evaluation = await this.evaluateBooleanFlags([flagKey], subject); return evaluation[flagKey]; } async evaluateBooleanFlags(flagKeys, subject) { const results = Object.fromEntries(flagKeys.map(flagKey => [flagKey, featureFlagsHelper.getFeatureFlagFallbackState(flagKey)])); if (flagKeys.length === 0) { return results; } const client = await this.getClient().catch(error => { Sentry.captureException(error); return undefined; }); if (!client) { return results; } const requests = flagKeys.map(flagKey => ({ flagKey, entityId: subject.entityId, context: subject.context, })); try { const batchResponse = client.evaluateBatch(requests); batchResponse.responses .filter(response => response.type === 'BOOLEAN_EVALUATION_RESPONSE_TYPE') .forEach(response => { const flagKey = response.booleanEvaluationResponse?.flagKey; const enabled = response.booleanEvaluationResponse?.enabled; if (flagKey && enabled !== undefined && flagKey in results) { results[flagKey] = enabled; } }); } catch (error) { Sentry.captureException(error); return results; } return results; } } const resolveFlag = (app, flagName) => { return app.locals['featureFlags']?.flags?.[flagName]; }; const isBooleanFlagEnabledOrMissing = (flagName, app) => { const flag = resolveFlag(app, flagName); return flag !== false; }; exports.FeatureFlagService = FeatureFlagService; exports.isBooleanFlagEnabledOrMissing = isBooleanFlagEnabledOrMissing; //# sourceMappingURL=featureFlagService.js.map