From db6359273f4825d8df4d03fac22386442562e3e6 Mon Sep 17 00:00:00 2001 From: frafiuddin Date: Fri, 4 Oct 2024 13:38:07 +0200 Subject: [PATCH 1/3] add support for service authority --- libs/providers/flagd/README.md | 1 + libs/providers/flagd/src/lib/configuration.spec.ts | 4 ++++ libs/providers/flagd/src/lib/configuration.ts | 11 +++++++++++ 3 files changed, 16 insertions(+) diff --git a/libs/providers/flagd/README.md b/libs/providers/flagd/README.md index 1506cf229..b1a3b405e 100644 --- a/libs/providers/flagd/README.md +++ b/libs/providers/flagd/README.md @@ -38,6 +38,7 @@ Options can be defined in the constructor or as environment variables. Construct | selector | FLAGD_SOURCE_SELECTOR | string | - | | | cache | FLAGD_CACHE | string | lru | lru, disabled | | maxCacheSize | FLAGD_MAX_CACHE_SIZE | int | 1000 | | +| serviceAuthority | FLAGD_SERVICE_AUTHORITY | string | - | rpc, in-process | #### Resolver type-specific Defaults diff --git a/libs/providers/flagd/src/lib/configuration.spec.ts b/libs/providers/flagd/src/lib/configuration.spec.ts index cd766356f..4516bff6b 100644 --- a/libs/providers/flagd/src/lib/configuration.spec.ts +++ b/libs/providers/flagd/src/lib/configuration.spec.ts @@ -31,6 +31,7 @@ describe('Configuration', () => { const resolverType = 'in-process'; const selector = 'app=weather'; const offlineFlagSourcePath = '/tmp/flags.json'; + const servAuthority = 'test-service'; process.env['FLAGD_HOST'] = host; process.env['FLAGD_PORT'] = `${port}`; @@ -41,6 +42,7 @@ describe('Configuration', () => { process.env['FLAGD_SOURCE_SELECTOR'] = `${selector}`; process.env['FLAGD_RESOLVER'] = `${resolverType}`; process.env['FLAGD_OFFLINE_FLAG_SOURCE_PATH'] = offlineFlagSourcePath; + process.env['FLAGD_SERVICE_AUTHORITY'] = servAuthority; expect(getConfig()).toStrictEqual({ host, @@ -52,6 +54,7 @@ describe('Configuration', () => { resolverType, selector, offlineFlagSourcePath, + servAuthority, }); }); @@ -64,6 +67,7 @@ describe('Configuration', () => { cache: 'lru', resolverType: 'rpc', selector: '', + serviceAuthority: '', }; process.env['FLAGD_HOST'] = 'override'; diff --git a/libs/providers/flagd/src/lib/configuration.ts b/libs/providers/flagd/src/lib/configuration.ts index cab759e40..43f5e7e16 100644 --- a/libs/providers/flagd/src/lib/configuration.ts +++ b/libs/providers/flagd/src/lib/configuration.ts @@ -68,6 +68,13 @@ export interface Config { * @default 1000 */ maxCacheSize?: number; + + /** + * The target host (authority) when routing requests through a proxy (e.g. Envoy) + * + * @default '' + */ + serviceAuthority: string; } export type FlagdProviderOptions = Partial; @@ -94,6 +101,7 @@ enum ENV_VAR { FLAGD_SOURCE_SELECTOR = 'FLAGD_SOURCE_SELECTOR', FLAGD_RESOLVER = 'FLAGD_RESOLVER', FLAGD_OFFLINE_FLAG_SOURCE_PATH = 'FLAGD_OFFLINE_FLAG_SOURCE_PATH', + FLAGD_SERVICE_AUTHORITY = 'FLAGD_SERVICE_AUTHORITY', } const getEnvVarConfig = (): Partial => ({ @@ -124,6 +132,9 @@ const getEnvVarConfig = (): Partial => ({ ...(process.env[ENV_VAR.FLAGD_OFFLINE_FLAG_SOURCE_PATH] && { offlineFlagSourcePath: process.env[ENV_VAR.FLAGD_OFFLINE_FLAG_SOURCE_PATH], }), + ...(process.env[ENV_VAR.FLAGD_SERVICE_AUTHORITY] && { + serviceAuthority: process.env[ENV_VAR.FLAGD_SERVICE_AUTHORITY], + }), }); export function getConfig(options: FlagdProviderOptions = {}) { From bbb32b299f4f8e8bd794aabd98e3f01f3165ca90 Mon Sep 17 00:00:00 2001 From: frafiuddin Date: Fri, 4 Oct 2024 14:04:54 +0200 Subject: [PATCH 2/3] adding support for service authority --- libs/providers/flagd/src/lib/configuration.spec.ts | 6 +++--- libs/providers/flagd/src/lib/configuration.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/providers/flagd/src/lib/configuration.spec.ts b/libs/providers/flagd/src/lib/configuration.spec.ts index 4516bff6b..dac19c503 100644 --- a/libs/providers/flagd/src/lib/configuration.spec.ts +++ b/libs/providers/flagd/src/lib/configuration.spec.ts @@ -31,7 +31,7 @@ describe('Configuration', () => { const resolverType = 'in-process'; const selector = 'app=weather'; const offlineFlagSourcePath = '/tmp/flags.json'; - const servAuthority = 'test-service'; + const serviceAuthority = 'test-service2'; process.env['FLAGD_HOST'] = host; process.env['FLAGD_PORT'] = `${port}`; @@ -42,7 +42,7 @@ describe('Configuration', () => { process.env['FLAGD_SOURCE_SELECTOR'] = `${selector}`; process.env['FLAGD_RESOLVER'] = `${resolverType}`; process.env['FLAGD_OFFLINE_FLAG_SOURCE_PATH'] = offlineFlagSourcePath; - process.env['FLAGD_SERVICE_AUTHORITY'] = servAuthority; + process.env['FLAGD_SERVICE_AUTHORITY'] = serviceAuthority; expect(getConfig()).toStrictEqual({ host, @@ -54,7 +54,7 @@ describe('Configuration', () => { resolverType, selector, offlineFlagSourcePath, - servAuthority, + serviceAuthority, }); }); diff --git a/libs/providers/flagd/src/lib/configuration.ts b/libs/providers/flagd/src/lib/configuration.ts index 43f5e7e16..b91bf8eb3 100644 --- a/libs/providers/flagd/src/lib/configuration.ts +++ b/libs/providers/flagd/src/lib/configuration.ts @@ -74,7 +74,7 @@ export interface Config { * * @default '' */ - serviceAuthority: string; + serviceAuthority?: string; } export type FlagdProviderOptions = Partial; From eddebef43d0923d1c4ac31c31f6b31e2b0ec0bf0 Mon Sep 17 00:00:00 2001 From: frafiuddin Date: Fri, 4 Oct 2024 16:58:13 +0200 Subject: [PATCH 3/3] send authority as option for grpc request --- .../src/lib/service/in-process/grpc/grpc-fetch.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libs/providers/flagd/src/lib/service/in-process/grpc/grpc-fetch.ts b/libs/providers/flagd/src/lib/service/in-process/grpc/grpc-fetch.ts index fd791f72c..6b12dbfef 100644 --- a/libs/providers/flagd/src/lib/service/in-process/grpc/grpc-fetch.ts +++ b/libs/providers/flagd/src/lib/service/in-process/grpc/grpc-fetch.ts @@ -1,4 +1,4 @@ -import { ClientReadableStream, ServiceError, credentials } from '@grpc/grpc-js'; +import { ClientReadableStream, ServiceError, credentials, ClientOptions } from '@grpc/grpc-js'; import { Logger } from '@openfeature/core'; import { GeneralError } from '@openfeature/server-sdk'; import { FlagSyncServiceClient, SyncFlagsRequest, SyncFlagsResponse } from '../../../../proto/ts/flagd/sync/v1/sync'; @@ -28,13 +28,21 @@ export class GrpcFetch implements DataFetch { private _isConnected = false; constructor(config: Config, syncServiceClient?: FlagSyncServiceClient, logger?: Logger) { - const { host, port, tls, socketPath, selector } = config; + const { host, port, tls, socketPath, selector, serviceAuthority } = config; + + let clientOptions: ClientOptions | undefined; + if (serviceAuthority) { + clientOptions = { + 'grpc.default_authority': serviceAuthority, + }; + } this._syncClient = syncServiceClient ? syncServiceClient : new FlagSyncServiceClient( socketPath ? `unix://${socketPath}` : `${host}:${port}`, tls ? credentials.createSsl() : credentials.createInsecure(), + clientOptions, ); this._logger = logger;