Skip to content

Commit 95b4211

Browse files
committed
feat: Use SyncContext from GrpcFetch instead of Metadata Request
Signed-off-by: marcozabel <[email protected]>
1 parent 3b052ea commit 95b4211

File tree

4 files changed

+46
-7
lines changed

4 files changed

+46
-7
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import {Hook} from "@openfeature/web-sdk";
2+
3+
export class SyncMetadataHook implements Hook<any> {
4+
contextSupplier: () => { [key: string]: any } | null;
5+
6+
constructor(getContext: () => { [key: string]: any } | null) {
7+
this.contextSupplier = getContext;
8+
}
9+
10+
public before(): any {
11+
return this.contextSupplier();
12+
}
13+
}

libs/providers/flagd/src/lib/flagd-provider.ts

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,18 @@ import { getConfig } from './configuration';
55
import { GRPCService } from './service/grpc/grpc-service';
66
import type { Service } from './service/service';
77
import { InProcessService } from './service/in-process/in-process-service';
8+
import { Hook } from "@openfeature/web-sdk";
9+
import { SyncMetadataHook } from "./SyncMetadataHook";
810

911
export class FlagdProvider implements Provider {
1012
metadata = {
1113
name: 'flagd',
1214
};
1315

16+
readonly hooks: Hook[] = [];
1417
readonly runsOn = 'server';
1518
readonly events = new OpenFeatureEventEmitter();
19+
private syncContext: { [key: string]: any } | null = null;
1620

1721
private readonly _service: Service;
1822

@@ -30,11 +34,27 @@ export class FlagdProvider implements Provider {
3034
) {
3135
const config = getConfig(options);
3236

33-
this._service = service
34-
? service
35-
: config.resolverType === 'in-process'
36-
? new InProcessService(config, undefined, logger)
37-
: new GRPCService(config, undefined, logger);
37+
if (service === undefined) {
38+
if (config.resolverType === "in-process") {
39+
this._service = new InProcessService(config, this.setSyncContext, undefined, logger);
40+
41+
if (config?.offlineFlagSourcePath === undefined) {
42+
this.hooks.push(new SyncMetadataHook(this.getSyncContext));
43+
}
44+
} else {
45+
this._service = new GRPCService(config, undefined, logger);
46+
}
47+
} else {
48+
this._service = service;
49+
}
50+
}
51+
52+
setSyncContext(context: {[key: string]: any}) {
53+
this.syncContext = context;
54+
}
55+
56+
getSyncContext(): {[key: string]: any} | null {
57+
return this.syncContext;
3858
}
3959

4060
async initialize(): Promise<void> {

libs/providers/flagd/src/lib/service/in-process/grpc/grpc-fetch.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export class GrpcFetch implements DataFetch {
1515
private readonly _syncClient: FlagSyncServiceClient;
1616
private readonly _request: SyncFlagsRequest;
1717
private _syncStream: ClientReadableStream<SyncFlagsResponse> | undefined;
18+
private readonly _setSyncContext: (syncContext: { [key: string]: any }) => void;
1819
private _logger: Logger | undefined;
1920
/**
2021
* Initialized will be set to true once the initial connection is successful
@@ -29,7 +30,7 @@ export class GrpcFetch implements DataFetch {
2930
*/
3031
private _isConnected = false;
3132

32-
constructor(config: Config, syncServiceClient?: FlagSyncServiceClient, logger?: Logger) {
33+
constructor(config: Config, setSyncContext: (syncContext: {[key: string]: any }) => void, syncServiceClient?: FlagSyncServiceClient, logger?: Logger) {
3334
const { host, port, tls, socketPath, selector, defaultAuthority } = config;
3435
let clientOptions: ClientOptions | undefined;
3536
if (defaultAuthority) {
@@ -46,6 +47,7 @@ export class GrpcFetch implements DataFetch {
4647
clientOptions,
4748
);
4849

50+
this._setSyncContext = setSyncContext;
4951
this._logger = logger;
5052
this._request = { providerId: '', selector: selector ? selector : '' };
5153
}
@@ -84,6 +86,9 @@ export class GrpcFetch implements DataFetch {
8486
this._logger?.debug(`Received sync payload`);
8587

8688
try {
89+
if (data.syncContext) {
90+
this._setSyncContext(data.syncContext);
91+
}
8792
const changes = dataCallback(data.flagConfiguration);
8893
if (this._initialized && changes.length > 0) {
8994
changedCallback(changes);

libs/providers/flagd/src/lib/service/in-process/in-process-service.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export class InProcessService implements Service {
1919

2020
constructor(
2121
private readonly config: Config,
22+
setSyncContext: (syncContext: { [key: string]: any }) => void,
2223
dataFetcher?: DataFetch,
2324
logger?: Logger,
2425
) {
@@ -27,7 +28,7 @@ export class InProcessService implements Service {
2728
? dataFetcher
2829
: config.offlineFlagSourcePath
2930
? new FileFetch(config.offlineFlagSourcePath, logger)
30-
: new GrpcFetch(config, undefined, logger);
31+
: new GrpcFetch(config, setSyncContext, undefined, logger);
3132
}
3233

3334
connect(

0 commit comments

Comments
 (0)