in packages/sdk/src/Confidence.ts [369:437]
static create(options: ConfidenceOptions): Confidence {
const {
clientSecret,
region,
timeout,
environment,
fetchImplementation = defaultFetchImplementation(),
logger = defaultLogger(),
resolveBaseUrl,
disableTelemetry = false,
applyDebounce = 10,
waitUntil,
cache = {},
} = options;
if (environment !== 'client' && environment !== 'backend') {
throw new Error(`Invalid environment: ${environment}. Must be 'client' or 'backend'.`);
}
const sdk = {
id: SdkId.SDK_ID_JS_CONFIDENCE,
version: '0.3.2', // x-release-please-version
} as const;
const telemetry = new Telemetry({
disabled: disableTelemetry,
environment,
});
if (!clientSecret) {
logger.error?.(`Confidence: confidence cannot be instantiated without a client secret`);
}
const cacheProvider = FlagCache.provider(clientSecret, cache);
const flagResolverClient: FlagResolverClient = new FetchingFlagResolverClient({
clientSecret,
fetchImplementation,
sdk,
environment,
resolveTimeout: timeout,
region,
resolveBaseUrl,
telemetry,
logger,
applyDebounce,
waitUntil,
cacheProvider,
});
const estEventSizeKb = 1;
const flushTimeoutMilliseconds = 500;
// default grpc payload limit is 4MB, so we aim for a 1MB batch-size
const maxBatchSize = Math.floor(1024 / estEventSizeKb);
const eventSenderEngine = new EventSenderEngine({
clientSecret,
maxBatchSize,
flushTimeoutMilliseconds,
fetchImplementation,
region,
// we set rate limit to support the flushTimeout
// on backend, the rate limit would be ∞
rateLimitRps: environment === 'client' ? 1000 / flushTimeoutMilliseconds : Number.POSITIVE_INFINITY,
// the request is queued or in flight in memory to be sent.
// max memory consumption is 50MB
maxOpenRequests: (50 * 1024) / (estEventSizeKb * maxBatchSize),
logger,
});
return new Confidence({
...options,
flagResolverClient,
eventSenderEngine,
logger,
cacheProvider,
});
}