UNPKG

flagsmith-nodejs

Version:

Flagsmith lets you manage features flags and remote config across web, mobile and server side applications. Deliver true Continuous Integration. Get builds out faster. Control who has access to new features.

109 lines (108 loc) 3.28 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getUserAgent = exports.Deferred = exports.retryFetch = exports.delay = exports.generateIdentitiesData = exports.isTraitConfig = void 0; const FLAGSMITH_USER_AGENT = 'flagsmith-nodejs-sdk'; const FLAGSMITH_UNKNOWN_VERSION = 'unknown'; function isTraitConfig(traitValue) { return !!traitValue && typeof traitValue == 'object' && traitValue.value !== undefined; } exports.isTraitConfig = isTraitConfig; function generateIdentitiesData(identifier, traits, transient) { const traitsGenerated = Object.entries(traits).map(([key, value]) => { if (isTraitConfig(value)) { return { trait_key: key, trait_value: value?.value, transient: value?.transient }; } else { return { trait_key: key, trait_value: value }; } }); if (transient) { return { identifier: identifier, traits: traitsGenerated, transient: true }; } return { identifier: identifier, traits: traitsGenerated }; } exports.generateIdentitiesData = generateIdentitiesData; const delay = (ms) => new Promise(resolve => setTimeout(() => resolve(undefined), ms)); exports.delay = delay; const retryFetch = (url, // built-in RequestInit type doesn't have dispatcher/agent fetchOptions, retries = 3, timeoutMs = 10, // set an overall timeout for this function retryDelayMs = 1000, customFetch) => { const retryWrapper = async (n) => { try { return await customFetch(url, { ...fetchOptions, signal: AbortSignal.timeout(timeoutMs) }); } catch (e) { if (n > 0) { await (0, exports.delay)(retryDelayMs); return await retryWrapper(n - 1); } else { throw e; } } }; return retryWrapper(retries); }; exports.retryFetch = retryFetch; /** * A deferred promise can be resolved or rejected outside its creation scope. * * @template T The type of the value that the deferred promise will resolve to. * * @example * const deferred = new Deferred<string>() * * // Pass the promise somewhere * performAsyncOperation(deferred.promise) * * // Resolve it when ready from anywhere * deferred.resolve("Operation completed") * deferred.failed("Error") */ class Deferred { promise; resolvePromise; rejectPromise; constructor(initial) { this.promise = new Promise((resolve, reject) => { this.resolvePromise = resolve; this.rejectPromise = reject; }); } resolve(value) { this.resolvePromise(value); } reject(reason) { this.rejectPromise(reason); } } exports.Deferred = Deferred; function getUserAgent() { try { const packageJson = require('../package.json'); const version = packageJson?.version; return version ? `${FLAGSMITH_USER_AGENT}/${version}` : FLAGSMITH_UNKNOWN_VERSION; } catch { return FLAGSMITH_UNKNOWN_VERSION; } } exports.getUserAgent = getUserAgent;