diff --git a/src/OpenFeature.Contrib.Providers.Flagd/FlagdConfig.cs b/src/OpenFeature.Contrib.Providers.Flagd/FlagdConfig.cs
index 42da879f7..22f005aae 100644
--- a/src/OpenFeature.Contrib.Providers.Flagd/FlagdConfig.cs
+++ b/src/OpenFeature.Contrib.Providers.Flagd/FlagdConfig.cs
@@ -18,7 +18,13 @@ public enum ResolverType
/// locally for in-process evaluation.
/// Evaluations are preformed in-process.
///
- IN_PROCESS
+ IN_PROCESS,
+ ///
+ /// This is the in-process offline mode resolving type, where flags are fetched from a file and stored
+ /// locally for in-process evaluation.
+ /// Evaluations are preformed in-process.
+ ///
+ FILE,
}
///
@@ -147,6 +153,16 @@ public string SourceSelector
set => _sourceSelector = value;
}
+ ///
+ /// File source of flags to be used by offline mode.
+ /// Provide full path including directory and file name.
+ ///
+ public string OfflineFlagSourceFullPath
+ {
+ get => this._offlineFlagSourceFullPath;
+ set => this._offlineFlagSourceFullPath = value;
+ }
+
internal bool UseCertificate => _cert.Length > 0;
private string _host;
@@ -158,6 +174,7 @@ public string SourceSelector
private int _maxCacheSize;
private int _maxEventStreamRetries;
private string _sourceSelector;
+ private string _offlineFlagSourceFullPath;
private ResolverType _resolverType;
internal FlagdConfig()
@@ -327,6 +344,16 @@ public FlagdConfigBuilder WithSourceSelector(string sourceSelector)
return this;
}
+ ///
+ /// File source of flags to be used by offline mode.
+ /// Provide full path including directory and file name.
+ ///
+ public FlagdConfigBuilder OfflineFlagSourceFullPath(string path)
+ {
+ _config.OfflineFlagSourceFullPath = path;
+ return this;
+ }
+
///
/// Builds the FlagdConfig object.
///
diff --git a/src/OpenFeature.Contrib.Providers.Flagd/FlagdProvider.cs b/src/OpenFeature.Contrib.Providers.Flagd/FlagdProvider.cs
index 840f4df4d..da018979d 100644
--- a/src/OpenFeature.Contrib.Providers.Flagd/FlagdProvider.cs
+++ b/src/OpenFeature.Contrib.Providers.Flagd/FlagdProvider.cs
@@ -65,14 +65,11 @@ public FlagdProvider(FlagdConfig config)
_config = config;
- if (_config.ResolverType == ResolverType.IN_PROCESS)
+ _resolver = _config.ResolverType switch
{
- _resolver = new InProcessResolver(_config, EventChannel, _providerMetadata);
- }
- else
- {
- _resolver = new RpcResolver(config, EventChannel, _providerMetadata);
- }
+ ResolverType.RPC => new RpcResolver(config, EventChannel, _providerMetadata),
+ _ => new InProcessResolver(_config, EventChannel, _providerMetadata)
+ };
}
// just for testing, internal but visible in tests
diff --git a/src/OpenFeature.Contrib.Providers.Flagd/Resolver/InProcess/InProcessResolver.cs b/src/OpenFeature.Contrib.Providers.Flagd/Resolver/InProcess/InProcessResolver.cs
index 57c829797..9a9ff711c 100644
--- a/src/OpenFeature.Contrib.Providers.Flagd/Resolver/InProcess/InProcessResolver.cs
+++ b/src/OpenFeature.Contrib.Providers.Flagd/Resolver/InProcess/InProcessResolver.cs
@@ -1,82 +1,70 @@
-using System.Net.Http;
using System.Threading.Tasks;
using OpenFeature.Model;
using OpenFeature.Flagd.Grpc.Sync;
using System;
-using System.IO;
-#if NET462_OR_GREATER
-using System.Linq;
-using System.Net.Security;
-#endif
-using System.Security.Cryptography.X509Certificates;
-using Grpc.Net.Client;
-#if NET8_0_OR_GREATER
-using System.Net.Sockets; // needed for unix sockets
-#endif
using System.Threading;
-using Grpc.Core;
using Value = OpenFeature.Model.Value;
using System.Threading.Channels;
using OpenFeature.Constant;
+using OpenFeature.Contrib.Providers.Flagd.Resolver.InProcess.Storage;
namespace OpenFeature.Contrib.Providers.Flagd.Resolver.InProcess;
internal class InProcessResolver : Resolver
{
- static readonly int InitialEventStreamRetryBaseBackoff = 1;
- static readonly int MaxEventStreamRetryBackoff = 60;
readonly CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource();
- private readonly FlagSyncService.FlagSyncServiceClient _client;
+ private readonly Storage.Storage _storage;
private readonly JsonEvaluator _evaluator;
- private readonly Mutex _mtx;
- private int _eventStreamRetryBackoff = InitialEventStreamRetryBaseBackoff;
- private readonly FlagdConfig _config;
private Thread _handleEventsThread;
- private GrpcChannel _channel;
private Channel