From 31b9a72ef234215fb8e5d16a13d3546144d20b1b Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Mon, 28 Jul 2025 23:00:03 +0200 Subject: [PATCH 01/29] feat(go-feature-flag)!: Introduce in-process evaluation + tracking Signed-off-by: Thomas Poignant --- .gitmodules | 3 + libs/providers/go-feature-flag/.eslintrc.json | 2 +- libs/providers/go-feature-flag/README.md | 335 +++- libs/providers/go-feature-flag/jest.config.ts | 12 +- .../go-feature-flag/package-lock.json | 1430 +++++++++++++++++ libs/providers/go-feature-flag/package.json | 14 +- .../src/lib/context-transfomer.spec.ts | 68 - .../src/lib/context-transformer.ts | 17 - .../src/lib/controller/cache.ts | 60 - .../src/lib/controller/goff-api.ts | 229 --- .../src/lib/data-collector-hook.ts | 100 -- .../src/lib/errors/collector-error.ts | 10 - ...configuration-change-endpoint-not-found.ts | 7 - ...nfiguration-change-endpoint-unknown-err.ts | 7 - .../src/lib/errors/goff-error.ts | 1 - .../src/lib/errors/proxyNotReady.ts | 13 - .../src/lib/errors/proxyTimeout.ts | 13 - .../src/lib/errors/unauthorized.ts | 12 - .../src/lib/errors/unknownError.ts | 12 - .../src/lib/evaluator/evaluator.ts | 72 + .../lib/evaluator/inprocess-evaluator.test.ts | 114 ++ .../src/lib/evaluator/inprocess-evaluator.ts | 326 ++++ .../src/lib/evaluator/remote-evaluator.ts | 118 ++ .../evaluator-not-found-exception.ts | 7 + .../event-publisher-not-found-exception.ts | 7 + ...figuration-endpoint-not-found-exception.ts | 7 + .../exception/go-feature-flag-exception.ts | 6 + ...ble-to-retrieve-configuration-exception.ts | 7 + ...to-send-data-to-the-collector-exception.ts | 7 + .../src/lib/exception/index.ts | 11 + .../exception/invalid-options-exception.ts | 7 + .../lib/exception/unauthorized-exception.ts | 7 + .../wasm-function-not-found-exception.ts | 11 + .../wasm-invalid-result-exception.ts | 11 + .../exception/wasm-not-loaded-exception.ts | 11 + .../lib/go-feature-flag-provider-options.ts | 61 + .../src/lib/go-feature-flag-provider.spec.ts | 1111 ------------- .../src/lib/go-feature-flag-provider.test.ts | 1412 ++++++++++++++++ .../src/lib/go-feature-flag-provider.ts | 300 ++-- .../src/lib/helper/constants.ts | 25 + .../src/lib/helper/event-util.ts | 10 + .../src/lib/helper/fetch-api.ts | 17 + .../src/lib/hook/data-collector-hook.test.ts | 195 +++ .../src/lib/hook/data-collector-hook.ts | 96 ++ .../enrich-evaluation-context-hook.test.ts | 122 ++ .../hook/enrich-evaluation-context-hook.ts | 44 + .../go-feature-flag/src/lib/hook/index.ts | 2 + .../go-feature-flag/src/lib/model.ts | 145 -- .../src/lib/model/evaluation-response.ts | 41 + .../src/lib/model/evaluation-type.ts | 14 + .../go-feature-flag/src/lib/model/event.ts | 4 + .../src/lib/model/experimentation-rollout.ts | 14 + .../src/lib/model/exporter-metadata.test.ts | 212 +++ .../src/lib/model/exporter-metadata.ts | 24 + .../src/lib/model/exporter-request.ts | 16 + .../src/lib/model/feature-event.ts | 52 + .../src/lib/model/flag-base.ts | 53 + .../src/lib/model/flag-config-request.ts | 9 + .../src/lib/model/flag-config-response.ts | 27 + .../src/lib/model/flag-context.ts | 17 + .../go-feature-flag/src/lib/model/flag.ts | 12 + .../go-feature-flag/src/lib/model/index.ts | 33 + .../src/lib/model/progressive-rollout-step.ts | 19 + .../src/lib/model/progressive-rollout.ts | 16 + .../go-feature-flag/src/lib/model/rule.ts | 36 + .../src/lib/model/scheduled-step.ts | 11 + .../src/lib/model/tracking-event.ts | 42 + .../src/lib/model/wasm-input.ts | 28 + .../src/lib/service/api.test.ts | 559 +++++++ .../go-feature-flag/src/lib/service/api.ts | 223 +++ .../src/lib/service/event-publisher.test.ts | 303 ++++ .../src/lib/service/event-publisher.ts | 116 ++ .../go-feature-flag/src/lib/test-logger.ts | 33 - .../change-config-after.json | 17 + .../change-config-before.json | 17 + .../testdata/flag-configuration/default.json | 288 ++++ .../flag-configuration/scheduled-rollout.json | 58 + .../src/lib/testdata/ofrep-response/README.md | 35 + .../ofrep-response/api_key_missing.json | 3 + .../ofrep-response/bool_targeting_match.json | 6 + .../lib/testdata/ofrep-response/disabled.json | 6 + .../ofrep-response/disabled_double.json | 6 + .../ofrep-response/disabled_integer.json | 6 + .../ofrep-response/disabled_object.json | 6 + .../ofrep-response/disabled_string.json | 6 + .../ofrep-response/does_not_exists.json | 7 + .../testdata/ofrep-response/double_key.json | 6 + .../lib/testdata/ofrep-response/fail_500.json | 3 + .../ofrep-response/flag_not_found.json | 3 + .../testdata/ofrep-response/integer_key.json | 6 + .../ofrep-response/integer_with_metadata.json | 12 + .../ofrep-response/invalid_api_key.json | 3 + .../lib/testdata/ofrep-response/list_key.json | 6 + .../testdata/ofrep-response/object_key.json | 12 + .../testdata/ofrep-response/string_key.json | 6 + .../ofrep-response/unknown_reason.json | 6 + .../src/lib/testutil/mock-logger.ts | 10 + .../src/lib/testutil/ofrep-provider-mock.ts | 81 + .../src/lib/wasm/evaluate-wasm.ts | 280 ++++ .../wasm-module/gofeatureflag-evaluation.wasm | Bin 0 -> 878235 bytes .../src/lib/wasm/wasm_exec.d.ts | 9 + .../go-feature-flag/src/lib/wasm/wasm_exec.js | 619 +++++++ libs/providers/go-feature-flag/tsconfig.json | 3 +- package-lock.json | 7 + package.json | 1 + release-please-config.json | 3 +- 106 files changed, 8037 insertions(+), 2028 deletions(-) create mode 100644 libs/providers/go-feature-flag/package-lock.json delete mode 100644 libs/providers/go-feature-flag/src/lib/context-transfomer.spec.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/context-transformer.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/controller/cache.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/controller/goff-api.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/data-collector-hook.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/errors/collector-error.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/errors/configuration-change-endpoint-not-found.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/errors/configuration-change-endpoint-unknown-err.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/errors/goff-error.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/errors/proxyNotReady.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/errors/proxyTimeout.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/errors/unauthorized.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/errors/unknownError.ts create mode 100644 libs/providers/go-feature-flag/src/lib/evaluator/evaluator.ts create mode 100644 libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.test.ts create mode 100644 libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts create mode 100644 libs/providers/go-feature-flag/src/lib/evaluator/remote-evaluator.ts create mode 100644 libs/providers/go-feature-flag/src/lib/exception/evaluator-not-found-exception.ts create mode 100644 libs/providers/go-feature-flag/src/lib/exception/event-publisher-not-found-exception.ts create mode 100644 libs/providers/go-feature-flag/src/lib/exception/flag-configuration-endpoint-not-found-exception.ts create mode 100644 libs/providers/go-feature-flag/src/lib/exception/go-feature-flag-exception.ts create mode 100644 libs/providers/go-feature-flag/src/lib/exception/impossible-to-retrieve-configuration-exception.ts create mode 100644 libs/providers/go-feature-flag/src/lib/exception/impossible-to-send-data-to-the-collector-exception.ts create mode 100644 libs/providers/go-feature-flag/src/lib/exception/index.ts create mode 100644 libs/providers/go-feature-flag/src/lib/exception/invalid-options-exception.ts create mode 100644 libs/providers/go-feature-flag/src/lib/exception/unauthorized-exception.ts create mode 100644 libs/providers/go-feature-flag/src/lib/exception/wasm-function-not-found-exception.ts create mode 100644 libs/providers/go-feature-flag/src/lib/exception/wasm-invalid-result-exception.ts create mode 100644 libs/providers/go-feature-flag/src/lib/exception/wasm-not-loaded-exception.ts create mode 100644 libs/providers/go-feature-flag/src/lib/go-feature-flag-provider-options.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.spec.ts create mode 100644 libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts create mode 100644 libs/providers/go-feature-flag/src/lib/helper/constants.ts create mode 100644 libs/providers/go-feature-flag/src/lib/helper/event-util.ts create mode 100644 libs/providers/go-feature-flag/src/lib/helper/fetch-api.ts create mode 100644 libs/providers/go-feature-flag/src/lib/hook/data-collector-hook.test.ts create mode 100644 libs/providers/go-feature-flag/src/lib/hook/data-collector-hook.ts create mode 100644 libs/providers/go-feature-flag/src/lib/hook/enrich-evaluation-context-hook.test.ts create mode 100644 libs/providers/go-feature-flag/src/lib/hook/enrich-evaluation-context-hook.ts create mode 100644 libs/providers/go-feature-flag/src/lib/hook/index.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/model.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/evaluation-response.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/evaluation-type.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/event.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/experimentation-rollout.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/exporter-metadata.test.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/exporter-metadata.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/exporter-request.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/feature-event.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/flag-base.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/flag-config-request.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/flag-config-response.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/flag-context.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/flag.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/index.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/progressive-rollout-step.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/progressive-rollout.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/rule.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/scheduled-step.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/tracking-event.ts create mode 100644 libs/providers/go-feature-flag/src/lib/model/wasm-input.ts create mode 100644 libs/providers/go-feature-flag/src/lib/service/api.test.ts create mode 100644 libs/providers/go-feature-flag/src/lib/service/api.ts create mode 100644 libs/providers/go-feature-flag/src/lib/service/event-publisher.test.ts create mode 100644 libs/providers/go-feature-flag/src/lib/service/event-publisher.ts delete mode 100644 libs/providers/go-feature-flag/src/lib/test-logger.ts create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/change-config-after.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/change-config-before.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/default.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/scheduled-rollout.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/README.md create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/api_key_missing.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/bool_targeting_match.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_double.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_integer.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_object.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_string.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/does_not_exists.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/double_key.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/fail_500.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/flag_not_found.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/integer_key.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/integer_with_metadata.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/invalid_api_key.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/list_key.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/object_key.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/string_key.json create mode 100644 libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/unknown_reason.json create mode 100644 libs/providers/go-feature-flag/src/lib/testutil/mock-logger.ts create mode 100644 libs/providers/go-feature-flag/src/lib/testutil/ofrep-provider-mock.ts create mode 100644 libs/providers/go-feature-flag/src/lib/wasm/evaluate-wasm.ts create mode 100644 libs/providers/go-feature-flag/src/lib/wasm/wasm-module/gofeatureflag-evaluation.wasm create mode 100644 libs/providers/go-feature-flag/src/lib/wasm/wasm_exec.d.ts create mode 100644 libs/providers/go-feature-flag/src/lib/wasm/wasm_exec.js diff --git a/.gitmodules b/.gitmodules index 43e091d9f..7e171746a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -17,3 +17,6 @@ [submodule "libs/shared/flagd-core/spec"] path = libs/shared/flagd-core/spec url = https://github.com/open-feature/spec +[submodule "libs/providers/go-feature-flag-server/wasm-releases"] + path = libs/providers/go-feature-flag-server/wasm-releases + url = https://github.com/go-feature-flag/wasm-releases.git diff --git a/libs/providers/go-feature-flag/.eslintrc.json b/libs/providers/go-feature-flag/.eslintrc.json index 1cb92f884..74ed2c520 100644 --- a/libs/providers/go-feature-flag/.eslintrc.json +++ b/libs/providers/go-feature-flag/.eslintrc.json @@ -1,6 +1,6 @@ { "extends": ["../../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], + "ignorePatterns": ["!**/*", "src/lib/wasm/wasm_exec.js"], "rules": { "@typescript-eslint/no-explicit-any": "off", "quotes": ["error", "single"] diff --git a/libs/providers/go-feature-flag/README.md b/libs/providers/go-feature-flag/README.md index fa7f528ed..42e651cd0 100644 --- a/libs/providers/go-feature-flag/README.md +++ b/libs/providers/go-feature-flag/README.md @@ -1,18 +1,337 @@ -# Server-side Go Feature Flag Provider +# Server-side GO Feature Flag Provider -This provider is an implementation for [`go-feature-flag`](https://github.com/thomaspoignant/go-feature-flag) a simple and complete -feature flag solution, without any complex backend system to install, all you need is a file as your backend. +A feature flag provider for [OpenFeature](https://openfeature.dev/) that integrates with [go-feature-flag](https://github.com/thomaspoignant/go-feature-flag), a simple and complete feature flag solution. -It uses [`go-feature-flag-relay-proxy`](https://github.com/thomaspoignant/go-feature-flag-relay-proxy) which expose the capabilities of the SDK through an API layer. +This provider supports both **in-process** and **remote** evaluation modes, offering flexibility for different deployment scenarios. -## Installation +## Features 🚀 +- **Dual Evaluation Modes**: In-process evaluation for performance and remote evaluation for centralized control +- **Real-time Configuration Updates**: Automatic polling for flag configuration changes +- **Comprehensive Data Collection**: Built-in event tracking and analytics +- **Flexible Context Support**: Rich evaluation context with targeting rules +- **Caching**: Intelligent caching with automatic cache invalidation +- **Error Handling**: Robust error handling with fallback mechanisms +- **TypeScript Support**: Full TypeScript support with type safety +- **OpenFeature Compliance**: Full compliance with OpenFeature specification + +## Installation 📦 + +```bash +npm install @openfeature/go-feature-flag-provider ``` -$ npm install @openfeature/go-feature-flag-provider + +### Peer Dependencies + +```bash +npm install @openfeature/server-sdk ``` -Required peer dependencies +## Quick Start 🏃‍♂️ + +### Basic Setup + +```typescript +import { OpenFeature } from '@openfeature/server-sdk'; +import { GoFeatureFlagProvider, EvaluationType } from '@openfeature/go-feature-flag-provider'; + +// Initialize the provider +const provider = new GoFeatureFlagProvider({ + endpoint: 'https://your-relay-proxy.com', + evaluationType: EvaluationType.Remote, +}); + +// Register the provider +OpenFeature.setProvider(provider); + +// Get a client +const client = OpenFeature.getClient(); + +// Evaluate a flag +const flagValue = await client.getBooleanValue('my-feature-flag', false, { + targetingKey: 'user-123', + email: 'user@example.com', +}); +``` + +### In-Process Evaluation + +For high-performance scenarios where you want to evaluate flags locally: +```typescript +import { GoFeatureFlagProvider, EvaluationType } from '@openfeature/go-feature-flag-provider'; + +const provider = new GoFeatureFlagProvider({ + endpoint: 'https://your-relay-proxy.com', + evaluationType: EvaluationType.InProcess, + flagChangePollingIntervalMs: 30000, // Poll every 30 seconds +}); ``` -$ npm install @openfeature/server-sdk + +## Configuration Options ⚙️ + +### Provider Options + +| Option | Type | Default | Description | +| ----------------------------- | ------------------ | ------------ | ----------------------------------------------- | +| `endpoint` | `string` | **Required** | The endpoint of the GO Feature Flag relay-proxy | +| `evaluationType` | `EvaluationType` | `InProcess` | Evaluation mode: `InProcess` or `Remote` | +| `timeout` | `number` | `10000` | HTTP request timeout in milliseconds | +| `flagChangePollingIntervalMs` | `number` | `120000` | Polling interval for configuration changes | +| `dataFlushInterval` | `number` | `1000` | Data collection flush interval | +| `maxPendingEvents` | `number` | `10000` | Maximum pending events before flushing | +| `disableDataCollection` | `boolean` | `false` | Disable data collection entirely | +| `apiKey` | `string` | `undefined` | API key for authentication | +| `exporterMetadata` | `ExporterMetadata` | `undefined` | Custom metadata for events | +| `fetchImplementation` | `FetchAPI` | `undefined` | Custom fetch implementation | + +### Evaluation Types + +#### InProcess Evaluation + +- **Performance**: Fastest evaluation with local caching +- **Network**: Minimal network calls, only for configuration updates +- **Use Case**: High-performance applications, real-time evaluation + +#### Remote Evaluation + +- **Performance**: Network-dependent evaluation +- **Network**: Each evaluation requires a network call +- **Use Case**: Centralized control, complex targeting rules + +## Advanced Usage 🔧 + +### Custom Context and Targeting + +```typescript +const context = { + targetingKey: 'user-123', + email: 'john.doe@example.com', + firstname: 'John', + lastname: 'Doe', + anonymous: false, + professional: true, + rate: 3.14, + age: 30, + company_info: { + name: 'my_company', + size: 120, + }, + labels: ['pro', 'beta'], +}; + +const flagValue = await client.getBooleanValue('my-feature-flag', false, context); ``` + +### Data Collection and Analytics + +The provider automatically collects evaluation data. You can customize this behavior: + +```typescript +const provider = new GoFeatureFlagProvider({ + endpoint: 'https://your-relay-proxy.com', + evaluationType: EvaluationType.Remote, + disableDataCollection: false, // Enable data collection + dataFlushInterval: 2000, // Flush every 2 seconds + maxPendingEvents: 5000, // Max 5000 pending events +}); +``` + +### Custom Exporter Metadata + +Add custom metadata to your evaluation events: + +```typescript +import { ExporterMetadata } from '@openfeature/go-feature-flag-provider'; + +const metadata = new ExporterMetadata() + .add('environment', 'production') + .add('version', '1.0.0') + .add('region', 'us-east-1'); + +const provider = new GoFeatureFlagProvider({ + endpoint: 'https://your-relay-proxy.com', + evaluationType: EvaluationType.Remote, + exporterMetadata: metadata, +}); +``` + +### Custom Fetch Implementation + +For environments with specific HTTP requirements: + +```typescript +const provider = new GoFeatureFlagProvider({ + endpoint: 'https://your-relay-proxy.com', + evaluationType: EvaluationType.Remote, + fetchImplementation: customFetch, // Your custom fetch implementation +}); +``` + +### Error Handling + +The provider includes comprehensive error handling: + +```typescript +try { + const flagValue = await client.getBooleanValue('my-feature-flag', false, context); +} catch (error) { + if (error.code === 'FLAG_NOT_FOUND') { + // Handle flag not found + } else if (error.code === 'UNAUTHORIZED') { + // Handle authentication error + } else { + // Handle other errors + } +} +``` + +## Flag Types Supported 🎯 + +The provider supports all OpenFeature flag types: + +### Boolean Flags + +```typescript +const isEnabled = await client.getBooleanValue('feature-flag', false, context); +const details = await client.getBooleanDetails('feature-flag', false, context); +``` + +### String Flags + +```typescript +const message = await client.getStringValue('welcome-message', 'Hello!', context); +const details = await client.getStringDetails('welcome-message', 'Hello!', context); +``` + +### Number Flags + +```typescript +const percentage = await client.getNumberValue('discount-percentage', 0, context); +const details = await client.getNumberDetails('discount-percentage', 0, context); +``` + +### Object Flags + +```typescript +const config = await client.getObjectValue('user-config', {}, context); +const details = await client.getObjectDetails('user-config', {}, context); +``` + +## Tracking Events 📊 + +The provider supports custom event tracking: + +```typescript +// Track a custom event +client.track('user_action', context, { + action: 'button_click', + page: 'homepage', + timestamp: Date.now(), +}); +``` + +## Performance Considerations ⚡ + +### Caching Strategy + +- **InProcess**: Local caching with automatic invalidation on configuration changes +- **Remote**: HTTP caching headers respected +- **Configuration**: Automatic polling with configurable intervals + +### Best Practices + +1. **Use InProcess for high-frequency evaluations** +2. **Configure appropriate polling intervals** +3. **Monitor data collection volume** +4. **Set reasonable timeouts for your network** + +## Troubleshooting 🔧 + +### Common Issues + +**Configuration not updating** + +- Check `flagChangePollingIntervalMs` setting +- Verify relay-proxy endpoint is accessible + +**High latency** + +- Consider switching to `InProcess` evaluation +- Check network connectivity to relay-proxy + +**Data collection issues** + +- Verify `disableDataCollection` is not set to `true` +- Check `maxPendingEvents` and `dataFlushInterval` settings + +### Debug Mode + +Enable debug logging: + +```typescript +import { Logger } from '@openfeature/server-sdk'; + +const logger = { + debug: (message: string) => console.log(`[DEBUG] ${message}`), + info: (message: string) => console.log(`[INFO] ${message}`), + warn: (message: string) => console.log(`[WARN] ${message}`), + error: (message: string) => console.log(`[ERROR] ${message}`), +}; + +const provider = new GoFeatureFlagProvider( + { + endpoint: 'https://your-relay-proxy.com', + evaluationType: EvaluationType.Remote, + }, + logger, +); +``` + +## API Reference 📚 + +### GoFeatureFlagProvider + +The main provider class that implements the OpenFeature Provider interface. + +#### Constructor + +```typescript +constructor(options: GoFeatureFlagProviderOptions, logger?: Logger) +``` + +#### Methods + +- `resolveBooleanEvaluation(flagKey: string, defaultValue: boolean, context: EvaluationContext): Promise>` +- `resolveStringEvaluation(flagKey: string, defaultValue: string, context: EvaluationContext): Promise>` +- `resolveNumberEvaluation(flagKey: string, defaultValue: number, context: EvaluationContext): Promise>` +- `resolveObjectEvaluation(flagKey: string, defaultValue: T, context: EvaluationContext): Promise>` +- `track(trackingEventName: string, context?: EvaluationContext, trackingEventDetails?: TrackingEventDetails): void` + +### EvaluationType + +Enum defining evaluation modes: + +- `EvaluationType.InProcess`: Local evaluation +- `EvaluationType.Remote`: Remote evaluation + +### ExporterMetadata + +Class for adding custom metadata to evaluation events: + +- `add(key: string, value: string | boolean | number): ExporterMetadata` +- `asObject(): Record` + +## Contributing 🤝 + +We welcome contributions! Please see our [contributing guidelines](CONTRIBUTING.md) for details. + +## License 📄 + +This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details. + +## Support 💬 + +- **Documentation**: [OpenFeature Documentation](https://openfeature.dev/) +- **Issues**: [GitHub Issues](https://github.com/open-feature/js-sdk-contrib/issues) +- **Discussions**: [GitHub Discussions](https://github.com/open-feature/js-sdk-contrib/discussions) diff --git a/libs/providers/go-feature-flag/jest.config.ts b/libs/providers/go-feature-flag/jest.config.ts index c70991442..0f8f725d2 100644 --- a/libs/providers/go-feature-flag/jest.config.ts +++ b/libs/providers/go-feature-flag/jest.config.ts @@ -2,13 +2,13 @@ export default { displayName: 'provider-go-feature-flag', preset: '../../../jest.preset.js', - globals: { - 'ts-jest': { - tsconfig: '/tsconfig.spec.json', - }, - }, transform: { - '^.+\\.[tj]s$': 'ts-jest', + '^.+\\.ts$': [ + 'ts-jest', + { + tsconfig: '/tsconfig.spec.json', + }, + ], }, moduleFileExtensions: ['ts', 'js', 'html'], coverageDirectory: '../../../coverage/libs/providers/go-feature-flag', diff --git a/libs/providers/go-feature-flag/package-lock.json b/libs/providers/go-feature-flag/package-lock.json new file mode 100644 index 000000000..bc5d1d82e --- /dev/null +++ b/libs/providers/go-feature-flag/package-lock.json @@ -0,0 +1,1430 @@ +{ + "name": "@openfeature/go-feature-flag-provider", + "version": "0.7.8", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@openfeature/go-feature-flag-provider", + "version": "0.7.8", + "license": "Apache-2.0", + "dependencies": { + "axios": "1.10.0", + "copy-anything": "^3.0.5", + "lru-cache": "^11.0.0", + "object-hash": "^3.0.0" + }, + "devDependencies": { + "@ljharb/eslint-config": "^21.2.0", + "eslint-plugin-tree-shaking": "^1.12.2" + }, + "peerDependencies": { + "@openfeature/server-sdk": "^1.18.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", + "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@ljharb/eslint-config": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/@ljharb/eslint-config/-/eslint-config-21.2.0.tgz", + "integrity": "sha512-rQEEKJAsqHZrzi/NsnnJu77oKJn7prFxifc42Dtsx/5nQT894bRZsXsJOFIDB1tjIOXIoXexYwuwZ8v4ezohOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-scope": "=7.1.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + }, + "peerDependencies": { + "eslint": "=8.8.0" + } + }, + "node_modules/@openfeature/core": { + "version": "1.8.1", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/@openfeature/server-sdk": { + "version": "1.18.0", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@openfeature/core": "^1.7.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0", + "peer": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.10.0", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", + "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.0", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.6.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-tree-shaking": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-tree-shaking/-/eslint-plugin-tree-shaking-1.12.2.tgz", + "integrity": "sha512-D3MBKjH9EaGZg1gxqezGmjCeWzHs/O0jRFajpuXLYKeOCh3ycgoXeZ1ceKaD2QnK+v18ly+XjNDUCgss4vKbWg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lru-cache": { + "version": "11.1.0", + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/object-hash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC", + "peer": true + } + } +} diff --git a/libs/providers/go-feature-flag/package.json b/libs/providers/go-feature-flag/package.json index 9cb0cd099..c1707edc5 100644 --- a/libs/providers/go-feature-flag/package.json +++ b/libs/providers/go-feature-flag/package.json @@ -7,12 +7,14 @@ "current-version": "echo $npm_package_version" }, "peerDependencies": { - "@openfeature/server-sdk": "^1.15.0" + "@openfeature/server-sdk": "^1.17.1", + "@openfeature/core": "^1.6.0", + "@openfeature/ofrep-provider": "0.2.1", + "@jest/globals": "29.7.0" }, - "dependencies": { - "object-hash": "^3.0.0", - "lru-cache": "^11.0.0", - "axios": "1.10.0", - "copy-anything": "^3.0.5" + "dependencies": {}, + "devDependencies": { + "@ljharb/eslint-config": "^21.2.0", + "eslint-plugin-tree-shaking": "^1.12.2" } } diff --git a/libs/providers/go-feature-flag/src/lib/context-transfomer.spec.ts b/libs/providers/go-feature-flag/src/lib/context-transfomer.spec.ts deleted file mode 100644 index 54cb16123..000000000 --- a/libs/providers/go-feature-flag/src/lib/context-transfomer.spec.ts +++ /dev/null @@ -1,68 +0,0 @@ -import type { EvaluationContext } from '@openfeature/server-sdk'; -import type { GOFFEvaluationContext } from './model'; -import { transformContext } from './context-transformer'; - -describe('contextTransformer', () => { - it('should use the targetingKey as user key', () => { - const got = transformContext({ - targetingKey: 'user-key', - } as EvaluationContext); - const want: GOFFEvaluationContext = { - key: 'user-key', - custom: {}, - }; - expect(got).toEqual(want); - }); - - it('should specify the anonymous field base on attributes', () => { - const got = transformContext({ - targetingKey: 'user-key', - anonymous: true, - } as EvaluationContext); - const want: GOFFEvaluationContext = { - key: 'user-key', - custom: { anonymous: true }, - }; - expect(got).toEqual(want); - }); - - it('should hash the context as key if no targetingKey provided', () => { - const got = transformContext({ - anonymous: true, - firstname: 'John', - lastname: 'Doe', - email: 'john.doe@gofeatureflag.org', - } as EvaluationContext); - - const want: GOFFEvaluationContext = { - key: 'dd3027562879ff6857cc6b8b88ced570546d7c0c', - custom: { - anonymous: true, - firstname: 'John', - lastname: 'Doe', - email: 'john.doe@gofeatureflag.org', - }, - }; - expect(got).toEqual(want); - }); - it('should fill custom fields if extra field are present', () => { - const got = transformContext({ - targetingKey: 'user-key', - anonymous: true, - firstname: 'John', - lastname: 'Doe', - email: 'john.doe@gofeatureflag.org', - } as EvaluationContext); - - const want: GOFFEvaluationContext = { - key: 'user-key', - custom: { - firstname: 'John', - lastname: 'Doe', - email: 'john.doe@gofeatureflag.org', - anonymous: true, - }, - }; - expect(got).toEqual(want); - }); -}); diff --git a/libs/providers/go-feature-flag/src/lib/context-transformer.ts b/libs/providers/go-feature-flag/src/lib/context-transformer.ts deleted file mode 100644 index dcb9a1f99..000000000 --- a/libs/providers/go-feature-flag/src/lib/context-transformer.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { EvaluationContext } from '@openfeature/server-sdk'; -import { sha1 } from 'object-hash'; -import type { GOFFEvaluationContext } from './model'; - -/** - * transformContext takes the raw OpenFeature context returns a GoFeatureFlagUser. - * @param context - the context used for flag evaluation. - * @returns {GOFFEvaluationContext} the evaluation context against which we will evaluate the flag. - */ -export function transformContext(context: EvaluationContext): GOFFEvaluationContext { - const { targetingKey, ...attributes } = context; - const key = targetingKey || sha1(context) || 'anonymous'; - return { - key: key, - custom: attributes, - }; -} diff --git a/libs/providers/go-feature-flag/src/lib/controller/cache.ts b/libs/providers/go-feature-flag/src/lib/controller/cache.ts deleted file mode 100644 index bcef37f4f..000000000 --- a/libs/providers/go-feature-flag/src/lib/controller/cache.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type { GoFeatureFlagProviderOptions, Cache } from '../model'; -import type { EvaluationContext, Logger, ResolutionDetails } from '@openfeature/server-sdk'; -import { LRUCache } from 'lru-cache'; -import hash from 'object-hash'; - -export class CacheController { - // cacheTTL is the time we keep the evaluation in the cache before we consider it as obsolete. - // If you want to keep the value forever, you can set the FlagCacheTTL field to -1 - private readonly cacheTTL?: number; - // logger is the Open Feature logger to use - private logger?: Logger; - // cache contains the local cache used in the provider to avoid calling the relay-proxy for every evaluation - private readonly cache?: Cache; - // options for this provider - private readonly options: GoFeatureFlagProviderOptions; - - constructor(options: GoFeatureFlagProviderOptions, logger?: Logger) { - this.options = options; - this.cacheTTL = options.flagCacheTTL !== undefined && options.flagCacheTTL !== 0 ? options.flagCacheTTL : 1000 * 60; - this.logger = logger; - const cacheSize = - options.flagCacheSize !== undefined && options.flagCacheSize !== 0 ? options.flagCacheSize : 10000; - this.cache = options.cache || new LRUCache({ maxSize: cacheSize, sizeCalculation: () => 1 }); - } - - get(flagKey: string, evaluationContext: EvaluationContext): ResolutionDetails | undefined { - if (this.options.disableCache) { - return undefined; - } - const cacheKey = this.buildCacheKey(flagKey, evaluationContext); - return this.cache?.get(cacheKey); - } - - set( - flagKey: string, - evaluationContext: EvaluationContext, - evaluationResponse: { resolutionDetails: ResolutionDetails; isCacheable: boolean }, - ) { - if (this.options.disableCache) { - return; - } - - const cacheKey = this.buildCacheKey(flagKey, evaluationContext); - if (this.cache !== undefined && evaluationResponse.isCacheable) { - if (this.cacheTTL === -1) { - this.cache.set(cacheKey, evaluationResponse.resolutionDetails); - } else { - this.cache.set(cacheKey, evaluationResponse.resolutionDetails, { ttl: this.cacheTTL }); - } - } - } - - clear(): void { - return this.cache?.clear(); - } - - private buildCacheKey(flagKey: string, evaluationContext: EvaluationContext): string { - return `${flagKey}-${hash(evaluationContext)}`; - } -} diff --git a/libs/providers/go-feature-flag/src/lib/controller/goff-api.ts b/libs/providers/go-feature-flag/src/lib/controller/goff-api.ts deleted file mode 100644 index 1272a8d85..000000000 --- a/libs/providers/go-feature-flag/src/lib/controller/goff-api.ts +++ /dev/null @@ -1,229 +0,0 @@ -import type { - DataCollectorRequest, - DataCollectorResponse, - ExporterMetadataValue, - FeatureEvent, - GoFeatureFlagProviderOptions, - GoFeatureFlagProxyRequest, - GoFeatureFlagProxyResponse, -} from '../model'; -import { ConfigurationChange } from '../model'; -import type { EvaluationContext, Logger, ResolutionDetails } from '@openfeature/server-sdk'; -import { ErrorCode, FlagNotFoundError, StandardResolutionReasons, TypeMismatchError } from '@openfeature/server-sdk'; -import { transformContext } from '../context-transformer'; -import axios, { isAxiosError } from 'axios'; -import { Unauthorized } from '../errors/unauthorized'; -import { ProxyNotReady } from '../errors/proxyNotReady'; -import { ProxyTimeout } from '../errors/proxyTimeout'; -import { UnknownError } from '../errors/unknownError'; -import { CollectorError } from '../errors/collector-error'; -import { ConfigurationChangeEndpointNotFound } from '../errors/configuration-change-endpoint-not-found'; -import { ConfigurationChangeEndpointUnknownErr } from '../errors/configuration-change-endpoint-unknown-err'; -import { GoFeatureFlagError } from '../errors/goff-error'; - -export class GoffApiController { - // endpoint of your go-feature-flag relay proxy instance - private readonly endpoint: string; - - // timeout in millisecond before we consider the request as a failure - private readonly timeout: number; - // logger is the Open Feature logger to use - private logger?: Logger; - - // etag is the etag of the last configuration change - private etag: string | null = null; - - constructor(options: GoFeatureFlagProviderOptions, logger?: Logger) { - this.endpoint = options.endpoint; - this.timeout = options.timeout ?? 0; - this.logger = logger; - // Add API key to the headers - if (options.apiKey) { - axios.defaults.headers.common['Authorization'] = `Bearer ${options.apiKey}`; - } - } - - /** - * Call the GO Feature Flag API to evaluate a flag - * @param flagKey - * @param defaultValue - * @param evaluationContext - * @param expectedType - * @param exporterMetadata - */ - async evaluate( - flagKey: string, - defaultValue: T, - evaluationContext: EvaluationContext, - expectedType: string, - exporterMetadata: Record = {}, - ): Promise<{ resolutionDetails: ResolutionDetails; isCacheable: boolean }> { - const goffEvaluationContext = transformContext(evaluationContext); - - // build URL to access to the endpoint - const endpointURL = new URL(this.endpoint); - endpointURL.pathname = `v1/feature/${flagKey}/eval`; - - if (goffEvaluationContext.custom === undefined) { - goffEvaluationContext.custom = {}; - } - goffEvaluationContext.custom['gofeatureflag'] = { - exporterMetadata: { - openfeature: true, - provider: 'js', - ...exporterMetadata, - }, - }; - - const request: GoFeatureFlagProxyRequest = { - evaluationContext: goffEvaluationContext, - defaultValue, - }; - let apiResponseData: GoFeatureFlagProxyResponse; - - try { - const response = await axios.post>(endpointURL.toString(), request, { - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - }, - timeout: this.timeout, - }); - apiResponseData = response.data; - } catch (error) { - if (axios.isAxiosError(error) && error.response?.status == 401) { - throw new Unauthorized('invalid token used to contact GO Feature Flag relay proxy instance'); - } - // Impossible to contact the relay-proxy - if (axios.isAxiosError(error) && (error.code === 'ECONNREFUSED' || error.response?.status === 404)) { - throw new ProxyNotReady(`impossible to call go-feature-flag relay proxy on ${endpointURL}`, error); - } - - // Timeout when calling the API - if (axios.isAxiosError(error) && error.code === 'ECONNABORTED') { - throw new ProxyTimeout(`impossible to retrieve the ${flagKey} on time`, error); - } - - throw new UnknownError( - `unknown error while retrieving flag ${flagKey} for evaluation context ${evaluationContext.targetingKey}`, - error, - ); - } - // Check that we received the expectedType - if (typeof apiResponseData.value !== expectedType) { - throw new TypeMismatchError( - `Flag value ${flagKey} had unexpected type ${typeof apiResponseData.value}, expected ${expectedType}.`, - ); - } - // Case of the flag is not found - if (apiResponseData.errorCode === ErrorCode.FLAG_NOT_FOUND) { - throw new FlagNotFoundError(`Flag ${flagKey} was not found in your configuration`); - } - - // Case of the flag is disabled - if (apiResponseData.reason === StandardResolutionReasons.DISABLED) { - // we don't set a variant since we are using the default value, and we are not able to know - // which variant it is. - return { - resolutionDetails: { value: defaultValue, reason: apiResponseData.reason }, - isCacheable: true, - }; - } - - if (apiResponseData.reason === StandardResolutionReasons.ERROR) { - return { - resolutionDetails: { - value: defaultValue, - reason: apiResponseData.reason, - errorCode: this.convertErrorCode(apiResponseData.errorCode), - }, - isCacheable: true, - }; - } - - return { - resolutionDetails: { - value: apiResponseData.value, - variant: apiResponseData.variationType, - reason: apiResponseData.reason?.toString() || 'UNKNOWN', - flagMetadata: apiResponseData.metadata || undefined, - errorCode: this.convertErrorCode(apiResponseData.errorCode), - }, - isCacheable: apiResponseData.cacheable, - }; - } - - async collectData(events: FeatureEvent[], dataCollectorMetadata: Record) { - if (events?.length === 0) { - return; - } - - const request: DataCollectorRequest = { events: events, meta: dataCollectorMetadata }; - const endpointURL = new URL(this.endpoint); - endpointURL.pathname = 'v1/data/collector'; - - try { - await axios.post(endpointURL.toString(), request, { - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json', - }, - timeout: this.timeout, - }); - } catch (e) { - throw new CollectorError(`impossible to send the data to the collector: ${e}`); - } - } - - public async configurationHasChanged(): Promise { - const endpointURL = new URL(this.endpoint); - endpointURL.pathname = 'v1/flag/change'; - - const headers: any = { - 'Content-Type': 'application/json', - }; - - if (this.etag) { - headers['If-None-Match'] = this.etag; - } - try { - const response = await axios.get(endpointURL.toString(), { headers }); - if (response.status === 304) { - return ConfigurationChange.FLAG_CONFIGURATION_NOT_CHANGED; - } - - const isInitialConfiguration = this.etag === null; - this.etag = response.headers['etag']; - return isInitialConfiguration - ? ConfigurationChange.FLAG_CONFIGURATION_INITIALIZED - : ConfigurationChange.FLAG_CONFIGURATION_UPDATED; - } catch (e) { - if (isAxiosError(e) && e.response?.status === 304) { - return ConfigurationChange.FLAG_CONFIGURATION_NOT_CHANGED; - } - if (isAxiosError(e) && e.response?.status === 404) { - throw new ConfigurationChangeEndpointNotFound('impossible to find the configuration change endpoint'); - } - if (e instanceof GoFeatureFlagError) { - throw e; - } - throw new ConfigurationChangeEndpointUnknownErr( - 'unknown error while retrieving the configuration change endpoint', - e as Error, - ); - } - } - - private convertErrorCode(errorCode: ErrorCode | undefined): ErrorCode | undefined { - if ((errorCode as string) === '') { - return undefined; - } - if (errorCode === undefined) { - return undefined; - } - if (Object.values(ErrorCode).includes(errorCode as ErrorCode)) { - return ErrorCode[errorCode as ErrorCode]; - } - return ErrorCode.GENERAL; - } -} diff --git a/libs/providers/go-feature-flag/src/lib/data-collector-hook.ts b/libs/providers/go-feature-flag/src/lib/data-collector-hook.ts deleted file mode 100644 index f7c48e4e1..000000000 --- a/libs/providers/go-feature-flag/src/lib/data-collector-hook.ts +++ /dev/null @@ -1,100 +0,0 @@ -import type { EvaluationDetails, FlagValue, Hook, HookContext, Logger } from '@openfeature/server-sdk'; -import { StandardResolutionReasons } from '@openfeature/server-sdk'; -import type { DataCollectorHookOptions, ExporterMetadataValue, FeatureEvent } from './model'; -import { copy } from 'copy-anything'; -import { CollectorError } from './errors/collector-error'; -import type { GoffApiController } from './controller/goff-api'; - -const defaultTargetingKey = 'undefined-targetingKey'; -type Timer = ReturnType; - -export class GoFeatureFlagDataCollectorHook implements Hook { - // collectUnCachedEvent (optional) set to true if you want to send all events not only the cached evaluations. - collectUnCachedEvaluation?: boolean; - // bgSchedulerId contains the id of the setInterval that is running. - private bgScheduler?: Timer; - // dataCollectorBuffer contains all the FeatureEvents that we need to send to the relay-proxy for data collection. - private dataCollectorBuffer?: FeatureEvent[]; - // dataFlushInterval interval time (in millisecond) we use to call the relay proxy to collect data. - private readonly dataFlushInterval: number; - // dataCollectorMetadata are the metadata used when calling the data collector endpoint - private readonly dataCollectorMetadata: Record; - private readonly goffApiController: GoffApiController; - // logger is the Open Feature logger to use - private logger?: Logger; - - constructor(options: DataCollectorHookOptions, goffApiController: GoffApiController, logger?: Logger) { - this.dataFlushInterval = options.dataFlushInterval || 1000 * 60; - this.logger = logger; - this.goffApiController = goffApiController; - this.collectUnCachedEvaluation = options.collectUnCachedEvaluation; - this.dataCollectorMetadata = { - provider: 'js', - openfeature: true, - ...options.exporterMetadata, - }; - } - - init() { - this.bgScheduler = setInterval(async () => await this.callGoffDataCollection(), this.dataFlushInterval); - this.dataCollectorBuffer = []; - } - - async close() { - clearInterval(this.bgScheduler); - // We call the data collector with what is still in the buffer. - await this.callGoffDataCollection(); - } - - /** - * callGoffDataCollection is a function called periodically to send the usage of the flag to the - * central service in charge of collecting the data. - */ - async callGoffDataCollection() { - const dataToSend = copy(this.dataCollectorBuffer) || []; - this.dataCollectorBuffer = []; - try { - await this.goffApiController.collectData(dataToSend, this.dataCollectorMetadata); - } catch (e) { - if (!(e instanceof CollectorError)) { - throw e; - } - this.logger?.error(e); - // if we have an issue calling the collector, we put the data back in the buffer - this.dataCollectorBuffer = [...this.dataCollectorBuffer, ...dataToSend]; - return; - } - } - - after(hookContext: HookContext, evaluationDetails: EvaluationDetails) { - if (!this.collectUnCachedEvaluation && evaluationDetails.reason !== StandardResolutionReasons.CACHED) { - return; - } - - const event = { - contextKind: hookContext.context['anonymous'] ? 'anonymousUser' : 'user', - kind: 'feature', - creationDate: Math.round(Date.now() / 1000), - default: false, - key: hookContext.flagKey, - value: evaluationDetails.value, - variation: evaluationDetails.variant || 'SdkDefault', - userKey: hookContext.context.targetingKey || defaultTargetingKey, - }; - this.dataCollectorBuffer?.push(event); - } - - error(hookContext: HookContext) { - const event = { - contextKind: hookContext.context['anonymous'] ? 'anonymousUser' : 'user', - kind: 'feature', - creationDate: Math.round(Date.now() / 1000), - default: true, - key: hookContext.flagKey, - value: hookContext.defaultValue, - variation: 'SdkDefault', - userKey: hookContext.context.targetingKey || defaultTargetingKey, - }; - this.dataCollectorBuffer?.push(event); - } -} diff --git a/libs/providers/go-feature-flag/src/lib/errors/collector-error.ts b/libs/providers/go-feature-flag/src/lib/errors/collector-error.ts deleted file mode 100644 index d0ac36929..000000000 --- a/libs/providers/go-feature-flag/src/lib/errors/collector-error.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { GoFeatureFlagError } from './goff-error'; - -/** - * An error occurred while calling the GOFF event collector. - */ -export class CollectorError extends GoFeatureFlagError { - constructor(message?: string, originalError?: Error) { - super(message, originalError); - } -} diff --git a/libs/providers/go-feature-flag/src/lib/errors/configuration-change-endpoint-not-found.ts b/libs/providers/go-feature-flag/src/lib/errors/configuration-change-endpoint-not-found.ts deleted file mode 100644 index 83e5f6ccb..000000000 --- a/libs/providers/go-feature-flag/src/lib/errors/configuration-change-endpoint-not-found.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { GoFeatureFlagError } from './goff-error'; - -export class ConfigurationChangeEndpointNotFound extends GoFeatureFlagError { - constructor(message?: string, originalError?: Error) { - super(message, originalError); - } -} diff --git a/libs/providers/go-feature-flag/src/lib/errors/configuration-change-endpoint-unknown-err.ts b/libs/providers/go-feature-flag/src/lib/errors/configuration-change-endpoint-unknown-err.ts deleted file mode 100644 index eff74cd00..000000000 --- a/libs/providers/go-feature-flag/src/lib/errors/configuration-change-endpoint-unknown-err.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { GoFeatureFlagError } from './goff-error'; - -export class ConfigurationChangeEndpointUnknownErr extends GoFeatureFlagError { - constructor(message?: string, originalError?: Error) { - super(message, originalError); - } -} diff --git a/libs/providers/go-feature-flag/src/lib/errors/goff-error.ts b/libs/providers/go-feature-flag/src/lib/errors/goff-error.ts deleted file mode 100644 index 31ef02f23..000000000 --- a/libs/providers/go-feature-flag/src/lib/errors/goff-error.ts +++ /dev/null @@ -1 +0,0 @@ -export class GoFeatureFlagError extends Error {} diff --git a/libs/providers/go-feature-flag/src/lib/errors/proxyNotReady.ts b/libs/providers/go-feature-flag/src/lib/errors/proxyNotReady.ts deleted file mode 100644 index ef8146975..000000000 --- a/libs/providers/go-feature-flag/src/lib/errors/proxyNotReady.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ErrorCode, OpenFeatureError } from '@openfeature/server-sdk'; - -// ProxyNotReady is an error send when we try to call the relay proxy and he is not ready -// to return a valid response. -export class ProxyNotReady extends OpenFeatureError { - code: ErrorCode; - - constructor(message: string, originalError: Error) { - super(`${message}: ${originalError}`); - Object.setPrototypeOf(this, ProxyNotReady.prototype); - this.code = ErrorCode.PROVIDER_NOT_READY; - } -} diff --git a/libs/providers/go-feature-flag/src/lib/errors/proxyTimeout.ts b/libs/providers/go-feature-flag/src/lib/errors/proxyTimeout.ts deleted file mode 100644 index cebf1f276..000000000 --- a/libs/providers/go-feature-flag/src/lib/errors/proxyTimeout.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ErrorCode, OpenFeatureError } from '@openfeature/server-sdk'; - -// ProxyTimeout is an error send when we try to call the relay proxy and he his not responding -// in the appropriate time. -export class ProxyTimeout extends OpenFeatureError { - code: ErrorCode; - - constructor(message: string, originalError: Error) { - super(`${message}: ${originalError}`); - Object.setPrototypeOf(this, ProxyTimeout.prototype); - this.code = ErrorCode.GENERAL; - } -} diff --git a/libs/providers/go-feature-flag/src/lib/errors/unauthorized.ts b/libs/providers/go-feature-flag/src/lib/errors/unauthorized.ts deleted file mode 100644 index 41af5d18f..000000000 --- a/libs/providers/go-feature-flag/src/lib/errors/unauthorized.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ErrorCode, OpenFeatureError } from '@openfeature/server-sdk'; - -// Unauthorized is an error sent when the provider makes an unauthorized call to the relay proxy. -export class Unauthorized extends OpenFeatureError { - code: ErrorCode; - - constructor(message: string) { - super(message); - Object.setPrototypeOf(this, Unauthorized.prototype); - this.code = ErrorCode.GENERAL; - } -} diff --git a/libs/providers/go-feature-flag/src/lib/errors/unknownError.ts b/libs/providers/go-feature-flag/src/lib/errors/unknownError.ts deleted file mode 100644 index 1fcb5c293..000000000 --- a/libs/providers/go-feature-flag/src/lib/errors/unknownError.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { ErrorCode, OpenFeatureError } from '@openfeature/server-sdk'; - -// UnknownError is an error send when something unexpected happened. -export class UnknownError extends OpenFeatureError { - code: ErrorCode; - - constructor(message: string, originalError: Error | unknown) { - super(`${message}: ${originalError}`); - Object.setPrototypeOf(this, UnknownError.prototype); - this.code = ErrorCode.GENERAL; - } -} diff --git a/libs/providers/go-feature-flag/src/lib/evaluator/evaluator.ts b/libs/providers/go-feature-flag/src/lib/evaluator/evaluator.ts new file mode 100644 index 000000000..e211343d8 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/evaluator/evaluator.ts @@ -0,0 +1,72 @@ +import type { EvaluationContext, JsonValue, ResolutionDetails } from '@openfeature/server-sdk'; + +/** + * IEvaluator is an interface that represents the evaluation of a feature flag. + * It can have multiple implementations: Remote or InProcess. + */ +export interface IEvaluator { + /** + * Initialize the evaluator. + */ + initialize(): Promise; + + /** + * Evaluates a boolean flag. + * @param flagKey - The key of the flag to evaluate. + * @param defaultValue - The default value to return if the flag is not found. + * @param evaluationContext - The context in which to evaluate the flag. + * @returns The resolution details of the flag evaluation. + */ + evaluateBoolean( + flagKey: string, + defaultValue: boolean, + evaluationContext?: EvaluationContext, + ): Promise>; + /** + * Evaluates a string flag. + * @param flagKey - The key of the flag to evaluate. + * @param defaultValue - The default value to return if the flag is not found. + * @param evaluationContext - The context in which to evaluate the flag. + * @returns The resolution details of the flag evaluation. + */ + evaluateString( + flagKey: string, + defaultValue: string, + evaluationContext?: EvaluationContext, + ): Promise>; + /** + * Evaluates a number flag. + * @param flagKey - The key of the flag to evaluate. + * @param defaultValue - The default value to return if the flag is not found. + * @param evaluationContext - The context in which to evaluate the flag. + * @returns The resolution details of the flag evaluation. + */ + evaluateNumber( + flagKey: string, + defaultValue: number, + evaluationContext?: EvaluationContext, + ): Promise>; + + /** + * Evaluates an object flag. + * @param flagKey - The key of the flag to evaluate. + * @param defaultValue - The default value to return if the flag is not found. + * @param evaluationContext - The context in which to evaluate the flag. + * @returns The resolution details of the flag evaluation. + */ + evaluateObject( + flagKey: string, + defaultValue: T, + evaluationContext?: EvaluationContext, + ): Promise>; + + /** + * Check if the flag is trackable. + */ + isFlagTrackable(flagKey: string): boolean; + + /** + * Dispose the evaluator. + */ + dispose(): Promise; +} diff --git a/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.test.ts b/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.test.ts new file mode 100644 index 000000000..289d3e8d8 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.test.ts @@ -0,0 +1,114 @@ +import { InProcessEvaluator } from './inprocess-evaluator'; +import type { GoFeatureFlagApi } from '../service/api'; +import type { GoFeatureFlagProviderOptions } from '../go-feature-flag-provider-options'; +import { FlagNotFoundError, type Logger, OpenFeatureEventEmitter } from '@openfeature/server-sdk'; +import { EvaluationType } from '../model'; + +// Mock the EvaluateWasm class +jest.mock('../wasm/evaluate-wasm', () => ({ + EvaluateWasm: jest.fn().mockImplementation(() => ({ + evaluate: jest.fn().mockResolvedValue({ + value: true, + reason: 'TARGETING_MATCH', + trackEvents: true, + }), + dispose: jest.fn().mockResolvedValue(undefined), + })), +})); + +describe('InProcessEvaluator', () => { + let evaluator: InProcessEvaluator; + let mockApi: jest.Mocked; + let mockOptions: GoFeatureFlagProviderOptions; + let mockLogger: jest.Mocked; + + beforeEach(() => { + mockApi = { + retrieveFlagConfiguration: jest.fn().mockResolvedValue({ + flags: { + 'test-flag': { + key: 'test-flag', + trackEvents: true, + variations: {}, + rules: [], + defaultSdkValue: true, + }, + }, + evaluationContextEnrichment: {}, + etag: 'test-etag', + lastUpdated: new Date(), + }), + } as any; + + mockOptions = { + endpoint: 'http://localhost:1031', + evaluationType: EvaluationType.InProcess, + timeout: 10000, + flagChangePollingIntervalMs: 120000, + }; + + mockLogger = { + debug: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + } as any; + + evaluator = new InProcessEvaluator(mockOptions, mockApi, new OpenFeatureEventEmitter(), mockLogger); + }); + + describe('initialize', () => { + it('should initialize successfully', async () => { + await expect(evaluator.initialize()).resolves.not.toThrow(); + expect(mockApi.retrieveFlagConfiguration).toHaveBeenCalledWith(undefined, undefined); + }); + }); + + describe('evaluateBoolean', () => { + it('should evaluate boolean flag successfully', async () => { + await evaluator.initialize(); + + const result = await evaluator.evaluateBoolean('test-flag', false, { user: 'test' }); + + const want = { + value: true, + reason: 'TARGETING_MATCH', + }; + expect(result).toEqual(want); + }); + + it('should throw error when flag not found', async () => { + await evaluator.initialize(); + + await expect(evaluator.evaluateBoolean('non-existent-flag', false, { user: 'test' })).rejects.toThrow( + FlagNotFoundError, + ); + }); + }); + + describe('isFlagTrackable', () => { + it('should return true for existing flag', async () => { + await evaluator.initialize(); + + const result = evaluator.isFlagTrackable('test-flag'); + + expect(result).toBe(true); + }); + + it('should return true for non-existent flag', async () => { + await evaluator.initialize(); + + const result = evaluator.isFlagTrackable('non-existent-flag'); + + expect(result).toBe(true); + }); + }); + + describe('dispose', () => { + it('should dispose successfully', async () => { + await evaluator.initialize(); + + await expect(evaluator.dispose()).resolves.not.toThrow(); + }); + }); +}); diff --git a/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts b/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts new file mode 100644 index 000000000..a8b3a1173 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts @@ -0,0 +1,326 @@ +import type { Logger } from '@openfeature/server-sdk'; +import { + ErrorCode, + type EvaluationContext, + FlagNotFoundError, + GeneralError, + InvalidContextError, + type JsonValue, + type OpenFeatureEventEmitter, + ParseError, + ProviderFatalError, + ProviderNotReadyError, + type ResolutionDetails, + ServerProviderEvents, + TargetingKeyMissingError, + TypeMismatchError, +} from '@openfeature/server-sdk'; +import type { IEvaluator } from './evaluator'; +import type { GoFeatureFlagApi } from '../service/api'; +import type { GoFeatureFlagProviderOptions } from '../go-feature-flag-provider-options'; +import type { EvaluationResponse, Flag, WasmInput } from '../model'; +import { EvaluateWasm } from '../wasm/evaluate-wasm'; +import { ImpossibleToRetrieveConfigurationException } from '../exception'; + +/** + * InProcessEvaluator is an implementation of the IEvaluator interface that evaluates feature flags in-process. + * It uses the WASM evaluation engine to perform flag evaluations locally. + */ +export class InProcessEvaluator implements IEvaluator { + private readonly api: GoFeatureFlagApi; + private readonly options: GoFeatureFlagProviderOptions; + private readonly evaluationEngine: EvaluateWasm; + private readonly logger?: Logger; + private readonly eventChannel?: OpenFeatureEventEmitter; // Event channel for notifications + + // Configuration state + private etag?: string; + private lastUpdate: Date = new Date(0); + private flags: Record = {}; + private evaluationContextEnrichment: Record = {}; + private periodicRunner?: NodeJS.Timeout; + + /** + * Constructor of the InProcessEvaluator. + * @param api - API to contact GO Feature Flag + * @param options - Options to configure the provider + * @param eventChannel - Event channel to send events to the event bus or event handler + * @param logger - Logger instance + */ + constructor( + options: GoFeatureFlagProviderOptions, + api: GoFeatureFlagApi, + eventChannel: OpenFeatureEventEmitter, + logger?: Logger, + ) { + this.api = api; + this.options = options; + this.eventChannel = eventChannel; + this.logger = logger; + this.evaluationEngine = new EvaluateWasm(logger); + } + + /** + * Initialize the evaluator. + */ + async initialize(): Promise { + await this.loadConfiguration(true); + + // Start periodic configuration polling + if (this.options.flagChangePollingIntervalMs && this.options.flagChangePollingIntervalMs > 0) { + this.periodicRunner = setInterval( + () => + this.loadConfiguration(false).catch((error) => this.logger?.error('Failed to load configuration:', error)), + this.options.flagChangePollingIntervalMs, + ); + } + } + + /** + * Evaluates a boolean flag. + * @param flagKey - The key of the flag to evaluate. + * @param defaultValue - The default value to return if the flag is not found. + * @param evaluationContext - The context in which to evaluate the flag. + * @returns The resolution details of the flag evaluation. + */ + async evaluateBoolean( + flagKey: string, + defaultValue: boolean, + evaluationContext?: EvaluationContext, + ): Promise> { + const response = await this.genericEvaluate(flagKey, defaultValue, evaluationContext); + this.handleError(response, flagKey); + + if (typeof response.value === 'boolean') { + return this.prepareResponse(response, flagKey, response.value); + } + + throw new TypeMismatchError(`Flag ${flagKey} had unexpected type, expected boolean.`); + } + + /** + * Evaluates a string flag. + * @param flagKey - The key of the flag to evaluate. + * @param defaultValue - The default value to return if the flag is not found. + * @param evaluationContext - The context in which to evaluate the flag. + * @returns The resolution details of the flag evaluation. + */ + async evaluateString( + flagKey: string, + defaultValue: string, + evaluationContext?: EvaluationContext, + ): Promise> { + const response = await this.genericEvaluate(flagKey, defaultValue, evaluationContext); + this.handleError(response, flagKey); + + if (typeof response.value === 'string') { + return this.prepareResponse(response, flagKey, response.value); + } + + throw new TypeMismatchError(`Flag ${flagKey} had unexpected type, expected string.`); + } + + /** + * Evaluates a number flag. + * @param flagKey - The key of the flag to evaluate. + * @param defaultValue - The default value to return if the flag is not found. + * @param evaluationContext - The context in which to evaluate the flag. + * @returns The resolution details of the flag evaluation. + */ + async evaluateNumber( + flagKey: string, + defaultValue: number, + evaluationContext?: EvaluationContext, + ): Promise> { + const response = await this.genericEvaluate(flagKey, defaultValue, evaluationContext); + this.handleError(response, flagKey); + + if (typeof response.value === 'number') { + return this.prepareResponse(response, flagKey, response.value); + } + + throw new TypeMismatchError(`Flag ${flagKey} had unexpected type, expected number.`); + } + + /** + * Evaluates an object flag. + * @param flagKey - The key of the flag to evaluate. + * @param defaultValue - The default value to return if the flag is not found. + * @param evaluationContext - The context in which to evaluate the flag. + * @returns The resolution details of the flag evaluation. + */ + async evaluateObject( + flagKey: string, + defaultValue: T, + evaluationContext?: EvaluationContext, + ): Promise> { + const response = await this.genericEvaluate(flagKey, defaultValue, evaluationContext); + this.handleError(response, flagKey); + + if (response.value !== null && response.value !== undefined) { + return this.prepareResponse(response, flagKey, response.value as T); + } + + throw new TypeMismatchError(`Flag ${flagKey} had unexpected type, expected object.`); + } + + /** + * Check if the flag is trackable. + * @param flagKey - The key of the flag to check. + * @returns True if the flag is trackable. + */ + isFlagTrackable(flagKey: string): boolean { + const flag = this.flags[flagKey]; + if (!flag) { + this.logger?.warn(`Flag with key ${flagKey} not found`); + // If the flag is not found, this is most likely a configuration change, so we track it by default. + return true; + } + + return flag.trackEvents ?? true; + } + + /** + * Dispose the evaluator. + */ + async dispose(): Promise { + if (this.periodicRunner) { + clearInterval(this.periodicRunner); + this.periodicRunner = undefined; + } + return this.evaluationEngine.dispose(); + } + + /** + * Evaluates a flag with the given key and default value in the context of the provided evaluation context. + * @param flagKey - Name of the feature flag + * @param defaultValue - Default value in case of error + * @param evaluationContext - Context of the evaluation + * @returns An EvaluationResponse containing the output of the evaluation. + */ + private async genericEvaluate( + flagKey: string, + defaultValue: unknown, + evaluationContext?: EvaluationContext, + ): Promise { + const flag = this.flags[flagKey]; + if (!flag) { + return { + value: defaultValue as JsonValue, + errorCode: 'FLAG_NOT_FOUND', + errorDetails: `Flag with key '${flagKey}' not found`, + reason: 'ERROR', + trackEvents: true, + }; + } + + const input: WasmInput = { + flagKey, + evalContext: evaluationContext ? (evaluationContext as Record) : {}, + flagContext: { + defaultSdkValue: defaultValue, + evaluationContextEnrichment: this.evaluationContextEnrichment, + }, + flag, + }; + + return await this.evaluationEngine.evaluate(input); + } + + /** + * LoadConfiguration is responsible for loading the configuration of the flags from the API. + * @throws ImpossibleToRetrieveConfigurationException - In case we are not able to call the relay proxy and to get the flag values. + */ + private async loadConfiguration(firstLoad = false): Promise { + try { + // Call the API to retrieve the flags' configuration and store it in the local copy + const flagConfigResponse = await this.api.retrieveFlagConfiguration(this.etag, undefined); + + if (!flagConfigResponse) { + throw new ImpossibleToRetrieveConfigurationException('Flag configuration response is null'); + } + + if (this.etag && this.etag === flagConfigResponse.etag) { + this.logger?.debug('Flag configuration has not changed'); + return; + } + + const respLastUpdated = flagConfigResponse.lastUpdated || new Date(0); + if ( + this.lastUpdate.getTime() !== new Date(0).getTime() && + respLastUpdated.getTime() !== new Date(0).getTime() && + respLastUpdated < this.lastUpdate + ) { + this.logger?.warn('Configuration received is older than the current one'); + return; + } + + this.logger?.debug('Flag configuration has changed'); + this.etag = flagConfigResponse.etag; + this.lastUpdate = flagConfigResponse.lastUpdated || new Date(0); + this.flags = flagConfigResponse.flags || {}; + this.evaluationContextEnrichment = flagConfigResponse.evaluationContextEnrichment || {}; + + // Send an event to the event channel to notify about the configuration change + if (this.eventChannel && !firstLoad) { + this.logger?.debug('Emitting configuration changed event'); + this.eventChannel.emit(ServerProviderEvents.ConfigurationChanged, {}); + } + } catch (error) { + this.logger?.error('Failed to load configuration:', error); + throw error; + } + } + + /** + * HandleError is handling the error response from the evaluation API. + * @param response - Response of the evaluation. + * @param flagKey - Name of the feature flag. + * @throws Error - When the evaluation is on error. + */ + private handleError(response: EvaluationResponse, flagKey: string): void { + switch (response.errorCode) { + case '': + case null: + case undefined: + // if we no error code it means that the evaluation is successful + return; + case ErrorCode.FLAG_NOT_FOUND: + throw new FlagNotFoundError(response.errorDetails || `Flag ${flagKey} was not found in your configuration`); + case ErrorCode.PARSE_ERROR: + throw new ParseError(response.errorDetails || `Parse error for flag ${flagKey}`); + case ErrorCode.TYPE_MISMATCH: + throw new TypeMismatchError(response.errorDetails || `Type mismatch for flag ${flagKey}`); + case ErrorCode.TARGETING_KEY_MISSING: + throw new TargetingKeyMissingError(response.errorDetails || `Targeting key missing for flag ${flagKey}`); + case ErrorCode.INVALID_CONTEXT: + throw new InvalidContextError(response.errorDetails || `Invalid context for flag ${flagKey}`); + case ErrorCode.PROVIDER_NOT_READY: + throw new ProviderNotReadyError(response.errorDetails || `Provider not ready for flag ${flagKey}`); + case ErrorCode.PROVIDER_FATAL: + throw new ProviderFatalError(response.errorDetails || `Provider fatal error for flag ${flagKey}`); + default: + throw new GeneralError(response.errorDetails || `Evaluation error: ${response.errorCode}`); + } + } + + /** + * PrepareResponse is preparing the response to be returned to the caller. + * @param response - Response of the evaluation. + * @param flagKey - Name of the feature flag. + * @param value - Value of the feature flag. + * @returns ResolutionDetails with the flag value and metadata. + */ + private prepareResponse(response: EvaluationResponse, flagKey: string, value: T): ResolutionDetails { + try { + return { + value, + reason: response.reason, + flagMetadata: response.metadata as Record, + variant: response.variationType, + }; + } catch (error) { + throw new TypeMismatchError(`Flag value ${flagKey} had unexpected type ${typeof response.value}.`); + } + } +} diff --git a/libs/providers/go-feature-flag/src/lib/evaluator/remote-evaluator.ts b/libs/providers/go-feature-flag/src/lib/evaluator/remote-evaluator.ts new file mode 100644 index 000000000..974c903be --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/evaluator/remote-evaluator.ts @@ -0,0 +1,118 @@ +import type { EvaluationContext, JsonValue, Logger, ResolutionDetails } from '@openfeature/core'; +import type { IEvaluator } from './evaluator'; +import { OFREPProvider, type OFREPProviderOptions } from '@openfeature/ofrep-provider'; +import type { GoFeatureFlagProviderOptions } from '../go-feature-flag-provider-options'; +import { isomorphicFetch } from '../helper/fetch-api'; + +export class RemoteEvaluator implements IEvaluator { + /** + * The OFREP provider + */ + private readonly ofrepProvider: OFREPProvider; + /** + * The logger to use. + */ + private readonly logger?: Logger; + + constructor(options: GoFeatureFlagProviderOptions, logger?: Logger) { + this.logger = logger; + const ofrepOptions: OFREPProviderOptions = { + baseUrl: options.endpoint, + timeoutMs: options.timeout, + fetchImplementation: options.fetchImplementation ?? isomorphicFetch(), + }; + ofrepOptions.headers = [['Content-Type', 'application/json']]; + if (options.apiKey) { + ofrepOptions.headers.push(['Authorization', `Bearer ${options.apiKey}`]); + } + this.ofrepProvider = new OFREPProvider(ofrepOptions); + } + + /** + * Evaluates a boolean flag. + * @param flagKey - The key of the flag to evaluate. + * @param defaultValue - The default value to return if the flag is not found. + * @param evaluationContext - The context in which to evaluate the flag. + * @returns The resolution details of the flag evaluation. + */ + async evaluateBoolean( + flagKey: string, + defaultValue: boolean, + evaluationContext?: EvaluationContext, + ): Promise> { + return this.ofrepProvider.resolveBooleanEvaluation(flagKey, defaultValue, evaluationContext ?? {}); + } + + /** + * Evaluates a string flag. + * @param flagKey - The key of the flag to evaluate. + * @param defaultValue - The default value to return if the flag is not found. + * @param evaluationContext - The context in which to evaluate the flag. + * @returns The resolution details of the flag evaluation. + */ + async evaluateString( + flagKey: string, + defaultValue: string, + evaluationContext?: EvaluationContext, + ): Promise> { + return this.ofrepProvider.resolveStringEvaluation(flagKey, defaultValue, evaluationContext ?? {}); + } + + /** + * Evaluates a number flag. + * @param flagKey - The key of the flag to evaluate. + * @param defaultValue - The default value to return if the flag is not found. + * @param evaluationContext - The context in which to evaluate the flag. + * @returns The resolution details of the flag evaluation. + */ + async evaluateNumber( + flagKey: string, + defaultValue: number, + evaluationContext?: EvaluationContext, + ): Promise> { + return this.ofrepProvider.resolveNumberEvaluation(flagKey, defaultValue, evaluationContext ?? {}); + } + + /** + * Evaluates an object flag. + * @param flagKey - The key of the flag to evaluate. + * @param defaultValue - The default value to return if the flag is not found. + * @param evaluationContext - The context in which to evaluate the flag. + * @returns The resolution details of the flag evaluation. + */ + evaluateObject( + flagKey: string, + defaultValue: T, + evaluationContext?: EvaluationContext, + ): Promise> { + return this.ofrepProvider.resolveObjectEvaluation(flagKey, defaultValue, evaluationContext ?? {}); + } + + /** + * Checks if the flag is trackable. + * @param _flagKey - The key of the flag to check. + * @returns True if the flag is trackable, false otherwise. + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + isFlagTrackable(_flagKey: string): boolean { + return false; + } + + /** + * Disposes the evaluator. + * @returns A promise that resolves when the evaluator is disposed. + */ + dispose(): Promise { + this.logger?.info('Disposing Remote evaluator'); + return Promise.resolve(); + } + + /** + * Initializes the evaluator. + * @returns A promise that resolves when the evaluator is initialized. + */ + async initialize(): Promise { + this.logger?.info('Initializing Remote evaluator'); + return Promise.resolve(); + } +} diff --git a/libs/providers/go-feature-flag/src/lib/exception/evaluator-not-found-exception.ts b/libs/providers/go-feature-flag/src/lib/exception/evaluator-not-found-exception.ts new file mode 100644 index 000000000..cbaf95baa --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/exception/evaluator-not-found-exception.ts @@ -0,0 +1,7 @@ +import { GoFeatureFlagException } from './go-feature-flag-exception'; + +export class EvaluatorNotFoundException extends GoFeatureFlagException { + constructor(message: string) { + super(message); + } +} diff --git a/libs/providers/go-feature-flag/src/lib/exception/event-publisher-not-found-exception.ts b/libs/providers/go-feature-flag/src/lib/exception/event-publisher-not-found-exception.ts new file mode 100644 index 000000000..d2d03093f --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/exception/event-publisher-not-found-exception.ts @@ -0,0 +1,7 @@ +import { GoFeatureFlagException } from './go-feature-flag-exception'; + +export class EventPublisherNotFoundException extends GoFeatureFlagException { + constructor(message: string) { + super(message); + } +} diff --git a/libs/providers/go-feature-flag/src/lib/exception/flag-configuration-endpoint-not-found-exception.ts b/libs/providers/go-feature-flag/src/lib/exception/flag-configuration-endpoint-not-found-exception.ts new file mode 100644 index 000000000..3fb3132ab --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/exception/flag-configuration-endpoint-not-found-exception.ts @@ -0,0 +1,7 @@ +import { GoFeatureFlagException } from './go-feature-flag-exception'; + +export class FlagConfigurationEndpointNotFoundException extends GoFeatureFlagException { + constructor() { + super('Flag configuration endpoint not found'); + } +} diff --git a/libs/providers/go-feature-flag/src/lib/exception/go-feature-flag-exception.ts b/libs/providers/go-feature-flag/src/lib/exception/go-feature-flag-exception.ts new file mode 100644 index 000000000..379a6f7a5 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/exception/go-feature-flag-exception.ts @@ -0,0 +1,6 @@ +export abstract class GoFeatureFlagException extends Error { + constructor(message: string) { + super(message); + this.name = this.constructor.name; + } +} diff --git a/libs/providers/go-feature-flag/src/lib/exception/impossible-to-retrieve-configuration-exception.ts b/libs/providers/go-feature-flag/src/lib/exception/impossible-to-retrieve-configuration-exception.ts new file mode 100644 index 000000000..56ad2cc8a --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/exception/impossible-to-retrieve-configuration-exception.ts @@ -0,0 +1,7 @@ +import { GoFeatureFlagException } from './go-feature-flag-exception'; + +export class ImpossibleToRetrieveConfigurationException extends GoFeatureFlagException { + constructor(message: string) { + super(message); + } +} diff --git a/libs/providers/go-feature-flag/src/lib/exception/impossible-to-send-data-to-the-collector-exception.ts b/libs/providers/go-feature-flag/src/lib/exception/impossible-to-send-data-to-the-collector-exception.ts new file mode 100644 index 000000000..f74e6add3 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/exception/impossible-to-send-data-to-the-collector-exception.ts @@ -0,0 +1,7 @@ +import { GoFeatureFlagException } from './go-feature-flag-exception'; + +export class ImpossibleToSendDataToTheCollectorException extends GoFeatureFlagException { + constructor(message: string) { + super(message); + } +} diff --git a/libs/providers/go-feature-flag/src/lib/exception/index.ts b/libs/providers/go-feature-flag/src/lib/exception/index.ts new file mode 100644 index 000000000..314454e3a --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/exception/index.ts @@ -0,0 +1,11 @@ +export * from './go-feature-flag-exception'; +export * from './evaluator-not-found-exception'; +export * from './event-publisher-not-found-exception'; +export * from './flag-configuration-endpoint-not-found-exception'; +export * from './impossible-to-retrieve-configuration-exception'; +export * from './impossible-to-send-data-to-the-collector-exception'; +export * from './invalid-options-exception'; +export * from './unauthorized-exception'; +export * from './wasm-function-not-found-exception'; +export * from './wasm-invalid-result-exception'; +export * from './wasm-not-loaded-exception'; diff --git a/libs/providers/go-feature-flag/src/lib/exception/invalid-options-exception.ts b/libs/providers/go-feature-flag/src/lib/exception/invalid-options-exception.ts new file mode 100644 index 000000000..d13180d65 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/exception/invalid-options-exception.ts @@ -0,0 +1,7 @@ +import { GoFeatureFlagException } from './go-feature-flag-exception'; + +export class InvalidOptionsException extends GoFeatureFlagException { + constructor(message: string) { + super(message); + } +} diff --git a/libs/providers/go-feature-flag/src/lib/exception/unauthorized-exception.ts b/libs/providers/go-feature-flag/src/lib/exception/unauthorized-exception.ts new file mode 100644 index 000000000..ee7f7ce8c --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/exception/unauthorized-exception.ts @@ -0,0 +1,7 @@ +import { GoFeatureFlagException } from './go-feature-flag-exception'; + +export class UnauthorizedException extends GoFeatureFlagException { + constructor(message: string) { + super(message); + } +} diff --git a/libs/providers/go-feature-flag/src/lib/exception/wasm-function-not-found-exception.ts b/libs/providers/go-feature-flag/src/lib/exception/wasm-function-not-found-exception.ts new file mode 100644 index 000000000..5184629e5 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/exception/wasm-function-not-found-exception.ts @@ -0,0 +1,11 @@ +import { GoFeatureFlagException } from './go-feature-flag-exception'; + +/** + * Exception thrown when a required WASM function is not found. + */ +export class WasmFunctionNotFoundException extends GoFeatureFlagException { + constructor(functionName: string) { + super(`WASM function '${functionName}' not found`); + this.name = 'WasmFunctionNotFoundException'; + } +} diff --git a/libs/providers/go-feature-flag/src/lib/exception/wasm-invalid-result-exception.ts b/libs/providers/go-feature-flag/src/lib/exception/wasm-invalid-result-exception.ts new file mode 100644 index 000000000..24abae115 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/exception/wasm-invalid-result-exception.ts @@ -0,0 +1,11 @@ +import { GoFeatureFlagException } from './go-feature-flag-exception'; + +/** + * Exception thrown when the WASM module returns an invalid result. + */ +export class WasmInvalidResultException extends GoFeatureFlagException { + constructor(message: string) { + super(message); + this.name = 'WasmInvalidResultException'; + } +} diff --git a/libs/providers/go-feature-flag/src/lib/exception/wasm-not-loaded-exception.ts b/libs/providers/go-feature-flag/src/lib/exception/wasm-not-loaded-exception.ts new file mode 100644 index 000000000..f26ba0066 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/exception/wasm-not-loaded-exception.ts @@ -0,0 +1,11 @@ +import { GoFeatureFlagException } from './go-feature-flag-exception'; + +/** + * Exception thrown when the WASM module cannot be loaded. + */ +export class WasmNotLoadedException extends GoFeatureFlagException { + constructor(message: string) { + super(message); + this.name = 'WasmNotLoadedException'; + } +} diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider-options.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider-options.ts new file mode 100644 index 000000000..385f626ea --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider-options.ts @@ -0,0 +1,61 @@ +import type { EvaluationType, ExporterMetadata } from './model'; +import type { FetchAPI } from './helper/fetch-api'; + +export interface GoFeatureFlagProviderOptions { + /** + * The endpoint of the GO Feature Flag relay-proxy. + */ + endpoint: string; + + /** + * The type of evaluation to use. + * @default EvaluationType.InProcess + */ + evaluationType?: EvaluationType; + + /** + * The timeout for HTTP requests in milliseconds. + * @default 10000 + */ + timeout?: number; + + /** + * The interval for polling flag configuration changes in milliseconds. + * @default 120000 + */ + flagChangePollingIntervalMs?: number; + + /** + * The interval for flushing data collection events in milliseconds. + * @default 1000 + */ + dataFlushInterval?: number; + + /** + * The maximum number of pending events before flushing. + * @default 10000 + */ + maxPendingEvents?: number; + + /** + * Whether to disable data collection. + * @default false + */ + disableDataCollection?: boolean; + + /** + * ‼️Important: If you are using a GO Feature Flag relay proxy before version v1.41.0, the information + * of this field will not be added to your feature events. + */ + exporterMetadata?: ExporterMetadata; + + /** + * API key for authentication with the relay-proxy. + */ + apiKey?: string; + + /** + * Fetch implementation for HTTP requests. + */ + fetchImplementation?: FetchAPI; +} diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.spec.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.spec.ts deleted file mode 100644 index 68022fe92..000000000 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.spec.ts +++ /dev/null @@ -1,1111 +0,0 @@ -/** - * @jest-environment node - */ -import type { Client } from '@openfeature/server-sdk'; -import { ErrorCode, OpenFeature, ServerProviderStatus, StandardResolutionReasons } from '@openfeature/server-sdk'; -import axios from 'axios'; -import MockAdapter from 'axios-mock-adapter'; -import { GoFeatureFlagProvider } from './go-feature-flag-provider'; -import type { GoFeatureFlagProxyResponse } from './model'; -import TestLogger from './test-logger'; - -describe('GoFeatureFlagProvider', () => { - const endpoint = 'http://go-feature-flag-relay-proxy.local:1031/'; - const dataCollectorEndpoint = `${endpoint}v1/data/collector`; - const axiosMock = new MockAdapter(axios); - const validBoolResponse: GoFeatureFlagProxyResponse = { - value: true, - variationType: 'trueVariation', - reason: StandardResolutionReasons.TARGETING_MATCH, - failed: false, - trackEvents: true, - version: '1.0.0', - metadata: { - description: 'a description of the flag', - issue_number: 1, - }, - cacheable: true, - }; - - let goff: GoFeatureFlagProvider; - let cli: Client; - const testLogger = new TestLogger(); - - afterEach(async () => { - await OpenFeature.close(); - axiosMock.reset(); - axiosMock.resetHistory(); - testLogger.reset(); - await OpenFeature.close(); - }); - - beforeEach(async () => { - await OpenFeature.close(); - axiosMock.reset(); - axiosMock.resetHistory(); - goff = new GoFeatureFlagProvider({ endpoint }); - await OpenFeature.setProviderAndWait('test-provider', goff); - cli = OpenFeature.getClient('test-provider'); - }); - - describe('common usecases and errors', () => { - it('should be an instance of GoFeatureFlagProvider', () => { - const goff = new GoFeatureFlagProvider({ endpoint }); - expect(goff).toBeInstanceOf(GoFeatureFlagProvider); - }); - it('should throw an error if proxy not ready', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - axiosMock.onPost(dns).reply(404); - const res = await cli.getBooleanDetails(flagName, false, { targetingKey }); - const want = { - errorCode: ErrorCode.PROVIDER_NOT_READY, - errorMessage: - 'impossible to call go-feature-flag relay proxy on http://go-feature-flag-relay-proxy.local:1031/v1/feature/random-flag/eval: Error: Request failed with status code 404', - flagKey: flagName, - reason: StandardResolutionReasons.ERROR, - value: false, - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - it('should throw an error if the call timeout', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - axiosMock.onPost(dns).timeout(); - const res = await cli.getBooleanDetails(flagName, false, { targetingKey }); - const want = { - errorCode: ErrorCode.GENERAL, - errorMessage: 'impossible to retrieve the random-flag on time: Error: timeout of 0ms exceeded', - flagKey: flagName, - reason: StandardResolutionReasons.ERROR, - value: false, - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - describe('error codes in HTTP response', () => { - it('SDK error codes should return correct code', async () => { - const flagName = 'random-other-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - axiosMock.onPost(dns).reply(200, { - value: true, - variationType: 'trueVariation', - errorCode: ErrorCode.PROVIDER_NOT_READY, - reason: StandardResolutionReasons.ERROR, - } as GoFeatureFlagProxyResponse); - const res = await cli.getBooleanDetails(flagName, false, { targetingKey }); - const want = { - errorCode: ErrorCode.PROVIDER_NOT_READY, - flagKey: flagName, - reason: StandardResolutionReasons.ERROR, - value: false, - flagMetadata: {}, - }; - expect(res).toEqual(expect.objectContaining(want)); - }); - it('unknown error codes should return GENERAL code', async () => { - const flagName = 'random-other-other-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - axiosMock.onPost(dns).reply(200, { - value: true, - variationType: 'trueVariation', - errorCode: 'NOT-AN-SDK-ERROR', - reason: StandardResolutionReasons.ERROR, - } as unknown as GoFeatureFlagProxyResponse); - const res = await cli.getBooleanDetails(flagName, false, { targetingKey }); - const want = { - errorCode: ErrorCode.GENERAL, - flagKey: flagName, - reason: StandardResolutionReasons.ERROR, - value: false, - flagMetadata: {}, - }; - expect(res).toEqual(expect.objectContaining(want)); - }); - }); - it('should throw an error if we fail in other network errors case', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - axiosMock.onPost(dns).networkError(); - const res = await cli.getBooleanDetails(flagName, false, { targetingKey }); - const want = { - errorCode: ErrorCode.GENERAL, - errorMessage: `unknown error while retrieving flag ${flagName} for evaluation context ${targetingKey}: Error: Network Error`, - flagKey: flagName, - reason: StandardResolutionReasons.ERROR, - value: false, - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - it('should throw an error if the flag does not exists', async () => { - const flagName = 'unknown-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: 'sdk-default', - variationType: 'trueVariation', - errorCode: ErrorCode.FLAG_NOT_FOUND, - } as GoFeatureFlagProxyResponse); - const res = await cli.getStringDetails(flagName, 'sdk-default', { targetingKey }); - const want = { - errorCode: ErrorCode.FLAG_NOT_FOUND, - errorMessage: `Flag ${flagName} was not found in your configuration`, - flagKey: flagName, - reason: StandardResolutionReasons.ERROR, - value: 'sdk-default', - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - it('should throw an error if invalid api key is provided', async () => { - const flagName = 'unauthorized'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - axiosMock.onPost(dns).reply(401, {} as GoFeatureFlagProxyResponse); - const res = await cli.getStringDetails(flagName, 'sdk-default', { targetingKey }); - const want = { - errorCode: ErrorCode.GENERAL, - errorMessage: 'invalid token used to contact GO Feature Flag relay proxy instance', - flagKey: flagName, - reason: StandardResolutionReasons.ERROR, - value: 'sdk-default', - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - it('should be valid with an API key provided', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: true, - variationType: 'trueVariation', - reason: StandardResolutionReasons.TARGETING_MATCH, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - const res = await cli.getBooleanDetails(flagName, false, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.TARGETING_MATCH, - value: true, - variant: 'trueVariation', - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - it('provider should be ready after after setting the provider to Open Feature', async () => { - expect(cli.providerStatus).toEqual(ServerProviderStatus.READY); - }); - - it('should send exporter metadata to the evaluation API', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - axiosMock.onPost(dns).reply(200, { - value: true, - variationType: 'trueVariation', - reason: StandardResolutionReasons.TARGETING_MATCH, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const provider = new GoFeatureFlagProvider({ - endpoint, - exporterMetadata: { key1: 'value', key2: 123, key3: 123.45 }, - }); - await OpenFeature.setProviderAndWait('test-exporter-metadata', provider); - const cli = OpenFeature.getClient('test-exporter-metadata'); - - await cli.getBooleanDetails(flagName, false, { targetingKey }); - const request = axiosMock.history.post[0]; - const want = { - openfeature: true, - provider: 'js', - key1: 'value', - key2: 123, - key3: 123.45, - }; - const got = JSON.parse(request.data).evaluationContext.custom.gofeatureflag.exporterMetadata; - expect(got).toEqual(want); - }); - }); - describe('resolveBooleanEvaluation', () => { - it('should throw an error if we expect a boolean and got another type', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: 'true', - variationType: 'trueVariation', - } as GoFeatureFlagProxyResponse); - const res = await cli.getBooleanDetails(flagName, false, { targetingKey }); - const want = { - errorCode: ErrorCode.TYPE_MISMATCH, - errorMessage: 'Flag value random-flag had unexpected type string, expected boolean.', - flagKey: flagName, - reason: StandardResolutionReasons.ERROR, - value: false, - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - - it('should resolve a valid boolean flag with TARGETING_MATCH reason', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: true, - variationType: 'trueVariation', - reason: StandardResolutionReasons.TARGETING_MATCH, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getBooleanDetails(flagName, false, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.TARGETING_MATCH, - value: true, - flagMetadata: {}, - variant: 'trueVariation', - }; - expect(res).toEqual(want); - }); - - it('fix version 0.7.2', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - trackEvents: true, - variationType: 'True', - failed: false, - version: '', - reason: 'TARGETING_MATCH', - errorCode: '', - value: true, - cacheable: true, - metadata: { - description: 'this is a test', - pr_link: 'https://github.com/thomaspoignant/go-feature-flag/pull/916', - }, - }); - - const res = await cli.getBooleanDetails(flagName, false, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.TARGETING_MATCH, - value: true, - flagMetadata: { - description: 'this is a test', - pr_link: 'https://github.com/thomaspoignant/go-feature-flag/pull/916', - }, - variant: 'True', - }; - expect(res).toEqual(want); - }); - - it('should resolve a valid boolean flag with SPLIT reason', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: true, - variationType: 'trueVariation', - reason: StandardResolutionReasons.SPLIT, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getBooleanDetails(flagName, false, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.SPLIT, - value: true, - flagMetadata: {}, - variant: 'trueVariation', - }; - expect(res).toEqual(want); - }); - it('should use boolean default value if the flag is disabled', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: true, - variationType: 'defaultSdk', - reason: StandardResolutionReasons.DISABLED, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - const res = await cli.getBooleanDetails(flagName, false, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.DISABLED, - value: false, - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - }); - describe('resolveStringEvaluation', () => { - it('should throw an error if we expect a string and got another type', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: true, - variationType: 'trueVariation', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getStringDetails(flagName, 'false', { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.ERROR, - errorMessage: `Flag value ${flagName} had unexpected type boolean, expected string.`, - errorCode: ErrorCode.TYPE_MISMATCH, - value: 'false', - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - it('should resolve a valid string flag with TARGETING_MATCH reason', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: 'true value', - variationType: 'trueVariation', - reason: StandardResolutionReasons.TARGETING_MATCH, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getStringDetails(flagName, 'default', { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.TARGETING_MATCH, - value: 'true value', - variant: 'trueVariation', - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - it('should resolve a valid string flag with SPLIT reason', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: 'true value', - variationType: 'trueVariation', - reason: StandardResolutionReasons.SPLIT, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getStringDetails(flagName, 'default', { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.SPLIT, - value: 'true value', - variant: 'trueVariation', - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - it('should use string default value if the flag is disabled', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: 'defaultSdk', - variationType: 'defaultSdk', - reason: StandardResolutionReasons.DISABLED, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getStringDetails(flagName, 'randomDefaultValue', { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.DISABLED, - value: 'randomDefaultValue', - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - }); - describe('resolveNumberEvaluation', () => { - it('should throw an error if we expect a number and got another type', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: true, - variationType: 'trueVariation', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getNumberDetails(flagName, 14, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.ERROR, - errorCode: ErrorCode.TYPE_MISMATCH, - errorMessage: `Flag value ${flagName} had unexpected type boolean, expected number.`, - value: 14, - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - it('should resolve a valid number flag with TARGETING_MATCH reason', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: 14, - variationType: 'trueVariation', - reason: StandardResolutionReasons.TARGETING_MATCH, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getNumberDetails(flagName, 14, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.TARGETING_MATCH, - value: 14, - variant: 'trueVariation', - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - it('should resolve a valid number flag with SPLIT reason', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: 14, - variationType: 'trueVariation', - reason: StandardResolutionReasons.SPLIT, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getNumberDetails(flagName, 14, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.SPLIT, - value: 14, - variant: 'trueVariation', - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - it('should use number default value if the flag is disabled', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: 123, - variationType: 'defaultSdk', - reason: StandardResolutionReasons.DISABLED, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getNumberDetails(flagName, 14, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.DISABLED, - value: 14, - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - }); - describe('resolveObjectEvaluation', () => { - it('should throw an error if we expect a json array and got another type', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: true, - variationType: 'trueVariation', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getObjectDetails(flagName, {}, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.ERROR, - errorCode: ErrorCode.TYPE_MISMATCH, - errorMessage: `Flag value ${flagName} had unexpected type boolean, expected object.`, - value: {}, - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - it('should resolve a valid object flag with TARGETING_MATCH reason', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: { key: true }, - variationType: 'trueVariation', - reason: StandardResolutionReasons.TARGETING_MATCH, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getObjectDetails(flagName, { key: 'default' }, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.TARGETING_MATCH, - value: { key: true }, - flagMetadata: {}, - variant: 'trueVariation', - }; - expect(res).toEqual(want); - }); - it('should resolve a valid object flag with SPLIT reason', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: { key: true }, - variationType: 'trueVariation', - reason: StandardResolutionReasons.SPLIT, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getObjectDetails(flagName, { key: 'default' }, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.SPLIT, - value: { key: true }, - flagMetadata: {}, - variant: 'trueVariation', - }; - expect(res).toEqual(want); - }); - it('should use object default value if the flag is disabled', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: { key: 123 }, - variationType: 'defaultSdk', - reason: StandardResolutionReasons.DISABLED, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getObjectDetails(flagName, { key: 'default' }, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.DISABLED, - value: { key: 'default' }, - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - it('should resolve a valid json array flag with TARGETING_MATCH reason', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: ['1', '2'], - variationType: 'trueVariation', - reason: StandardResolutionReasons.TARGETING_MATCH, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getObjectDetails(flagName, { key: 'default' }, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.TARGETING_MATCH, - value: ['1', '2'], - flagMetadata: {}, - variant: 'trueVariation', - }; - expect(res).toEqual(want); - }); - it('should resolve a valid json array flag with SPLIT reason', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: ['1', '2'], - variationType: 'trueVariation', - reason: StandardResolutionReasons.SPLIT, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getObjectDetails(flagName, { key: 'default' }, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.SPLIT, - value: ['1', '2'], - flagMetadata: {}, - variant: 'trueVariation', - }; - expect(res).toEqual(want); - }); - it('should use json array default value if the flag is disabled', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: ['key', '123'], - variationType: 'defaultSdk', - reason: StandardResolutionReasons.DISABLED, - failed: false, - trackEvents: true, - version: '1.0.0', - } as GoFeatureFlagProxyResponse); - - const res = await cli.getObjectDetails(flagName, ['key', '124'], { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.DISABLED, - value: ['key', '124'], - flagMetadata: {}, - }; - expect(res).toEqual(want); - }); - it('should return metadata associated to the flag', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, { - value: true, - variationType: 'trueVariation', - reason: StandardResolutionReasons.TARGETING_MATCH, - failed: false, - trackEvents: true, - version: '1.0.0', - metadata: { - description: 'a description of the flag', - issue_number: 1, - }, - cacheable: true, - } as GoFeatureFlagProxyResponse); - - const res = await cli.getBooleanDetails(flagName, false, { targetingKey }); - const want = { - flagKey: flagName, - reason: StandardResolutionReasons.TARGETING_MATCH, - value: true, - variant: 'trueVariation', - flagMetadata: { - description: 'a description of the flag', - issue_number: 1, - }, - }; - expect(res).toEqual(want); - }); - }); - describe('cache testing', () => { - it('should use the cache if we evaluate 2 times the same flag', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, validBoolResponse); - const goff = new GoFeatureFlagProvider({ - endpoint, - flagCacheTTL: 3000, - flagCacheSize: 1, - disableDataCollection: true, - }); - await OpenFeature.setProviderAndWait('test-provider-cache', goff); - const cli = OpenFeature.getClient('test-provider-cache'); - const got1 = await cli.getBooleanDetails(flagName, false, { targetingKey }); - const got2 = await cli.getBooleanDetails(flagName, false, { targetingKey }); - expect(got1.reason).toEqual(StandardResolutionReasons.TARGETING_MATCH); - expect(got2.reason).toEqual(StandardResolutionReasons.CACHED); - expect(axiosMock.history['post'].length).toBe(1); - }); - - it('should use not use the cache if we evaluate 2 times the same flag if cache is disabled', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, validBoolResponse); - const goff = new GoFeatureFlagProvider({ - endpoint, - disableCache: true, - disableDataCollection: true, - }); - await OpenFeature.setProviderAndWait('test-provider-cache', goff); - const cli = OpenFeature.getClient('test-provider-cache'); - const got1 = await cli.getBooleanDetails(flagName, false, { targetingKey }); - const got2 = await cli.getBooleanDetails(flagName, false, { targetingKey }); - expect(got1).toEqual(got2); - expect(axiosMock.history['post'].length).toBe(2); - }); - - it('should not retrieve from the cache if max size cache is reached', async () => { - const flagName1 = 'random-flag'; - const flagName2 = 'random-flag-1'; - const targetingKey = 'user-key'; - const dns1 = `${endpoint}v1/feature/${flagName1}/eval`; - const dns2 = `${endpoint}v1/feature/${flagName2}/eval`; - axiosMock.onPost(dns1).reply(200, validBoolResponse); - axiosMock.onPost(dns2).reply(200, validBoolResponse); - const goff = new GoFeatureFlagProvider({ - endpoint, - flagCacheSize: 1, - disableDataCollection: true, - }); - await OpenFeature.setProviderAndWait('test-provider-cache', goff); - const cli = OpenFeature.getClient('test-provider-cache'); - await cli.getBooleanDetails(flagName1, false, { targetingKey }); - await cli.getBooleanDetails(flagName2, false, { targetingKey }); - await cli.getBooleanDetails(flagName1, false, { targetingKey }); - expect(axiosMock.history['post'].length).toBe(3); - }); - - it('should not store in the cache if cacheable is false', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns1 = `${endpoint}v1/feature/${flagName}/eval`; - axiosMock.onPost(dns1).reply(200, { ...validBoolResponse, cacheable: false }); - const goff = new GoFeatureFlagProvider({ - endpoint, - flagCacheSize: 1, - disableDataCollection: true, - }); - await OpenFeature.setProviderAndWait('test-provider-cache', goff); - const cli = OpenFeature.getClient('test-provider-cache'); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - expect(axiosMock.history['post'].length).toBe(2); - }); - - it('should not retrieve from the cache it the TTL is reached', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns1 = `${endpoint}v1/feature/${flagName}/eval`; - axiosMock.onPost(dns1).reply(200, { ...validBoolResponse }); - const goff = new GoFeatureFlagProvider({ - endpoint, - flagCacheSize: 1, - disableDataCollection: true, - flagCacheTTL: 200, - }); - await OpenFeature.setProviderAndWait('test-provider-cache', goff); - const cli = OpenFeature.getClient('test-provider-cache'); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - await new Promise((r) => setTimeout(r, 300)); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - expect(axiosMock.history['post'].length).toBe(2); - }); - - it('should not retrieve from the cache if we have 2 different flag', async () => { - const flagName1 = 'random-flag'; - const flagName2 = 'random-flag-1'; - const targetingKey = 'user-key'; - const dns1 = `${endpoint}v1/feature/${flagName1}/eval`; - const dns2 = `${endpoint}v1/feature/${flagName2}/eval`; - axiosMock.onPost(dns1).reply(200, validBoolResponse); - axiosMock.onPost(dns2).reply(200, validBoolResponse); - const goff = new GoFeatureFlagProvider({ - endpoint, - flagCacheSize: 1, - disableDataCollection: true, - }); - await OpenFeature.setProviderAndWait('test-provider-cache', goff); - const cli = OpenFeature.getClient('test-provider-cache'); - await cli.getBooleanDetails(flagName1, false, { targetingKey }); - await cli.getBooleanDetails(flagName2, false, { targetingKey }); - expect(axiosMock.history['post'].length).toBe(2); - }); - it('should not retrieve from the cache if context properties are different but same targeting key', async () => { - const flagName1 = 'random-flag'; - const targetingKey = 'user-key'; - const dns1 = `${endpoint}v1/feature/${flagName1}/eval`; - axiosMock.onPost(dns1).reply(200, validBoolResponse); - const goff = new GoFeatureFlagProvider({ - endpoint, - flagCacheSize: 1, - disableDataCollection: true, - }); - await OpenFeature.setProviderAndWait('test-provider-cache', goff); - const cli = OpenFeature.getClient('test-provider-cache'); - await cli.getBooleanDetails(flagName1, false, { targetingKey, email: 'foo.bar@gofeatureflag.org' }); - await cli.getBooleanDetails(flagName1, false, { targetingKey, email: 'bar.foo@gofeatureflag.org' }); - expect(axiosMock.history['post'].length).toBe(2); - }); - }); - describe('data collector testing', () => { - it('should call the data collector when closing Open Feature', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, validBoolResponse); - const goff = new GoFeatureFlagProvider({ - endpoint, - flagCacheTTL: 3000, - flagCacheSize: 100, - dataFlushInterval: 1000, // in milliseconds - exporterMetadata: { - nodeJSVersion: '14.17.0', - appVersion: '1.0.0', - identifier: 123, - }, - }); - const providerName = expect.getState().currentTestName || 'test'; - await OpenFeature.setProviderAndWait(providerName, goff); - const cli = OpenFeature.getClient(providerName); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - await OpenFeature.close(); - const collectorCalls = axiosMock.history['post'].filter((i) => i.url === dataCollectorEndpoint); - expect(collectorCalls.length).toBe(1); - const got = JSON.parse(collectorCalls[0].data); - expect(isNaN(got.events[0].creationDate)).toBe(false); - const want = { - events: [ - { - contextKind: 'user', - kind: 'feature', - creationDate: got.events[0].creationDate, - default: false, - key: 'random-flag', - value: true, - variation: 'trueVariation', - userKey: 'user-key', - }, - ], - meta: { provider: 'js', openfeature: true, nodeJSVersion: '14.17.0', appVersion: '1.0.0', identifier: 123 }, - }; - expect(got).toEqual(want); - }); - - it('should call the data collector when waiting more than the dataFlushInterval', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, validBoolResponse); - const goff = new GoFeatureFlagProvider({ - endpoint, - flagCacheTTL: 3000, - flagCacheSize: 100, - dataFlushInterval: 100, // in milliseconds - exporterMetadata: { - nodeJSVersion: '14.17.0', - appVersion: '1.0.0', - identifier: 123, - }, - }); - const providerName = expect.getState().currentTestName || 'test'; - await OpenFeature.setProviderAndWait(providerName, goff); - const cli = OpenFeature.getClient(providerName); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - await new Promise((r) => setTimeout(r, 130)); - const collectorCalls = axiosMock.history['post'].filter((i) => i.url === dataCollectorEndpoint); - expect(collectorCalls.length).toBe(1); - }); - - it('should call the data collector multiple time while waiting dataFlushInterval time', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, validBoolResponse); - const goff = new GoFeatureFlagProvider({ - endpoint, - flagCacheTTL: 3000, - flagCacheSize: 100, - dataFlushInterval: 100, // in milliseconds - exporterMetadata: { - nodeJSVersion: '14.17.0', - appVersion: '1.0.0', - identifier: 123, - }, - }); - const providerName = expect.getState().currentTestName || 'test'; - await OpenFeature.setProviderAndWait(providerName, goff); - const cli = OpenFeature.getClient(providerName); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - await new Promise((r) => setTimeout(r, 130)); - const collectorCalls = axiosMock.history['post'].filter((i) => i.url === dataCollectorEndpoint); - expect(collectorCalls.length).toBe(1); - axiosMock.resetHistory(); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - await new Promise((r) => setTimeout(r, 130)); - const collectorCalls2 = axiosMock.history['post'].filter((i) => i.url === dataCollectorEndpoint); - expect(collectorCalls2.length).toBe(1); - }); - - it('should not call the data collector before the dataFlushInterval', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, validBoolResponse); - const goff = new GoFeatureFlagProvider({ - endpoint, - flagCacheTTL: 3000, - flagCacheSize: 100, - dataFlushInterval: 200, // in milliseconds - exporterMetadata: { - nodeJSVersion: '14.17.0', - appVersion: '1.0.0', - identifier: 123, - }, - }); - const providerName = expect.getState().currentTestName || 'test'; - await OpenFeature.setProviderAndWait(providerName, goff); - const cli = OpenFeature.getClient(providerName); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - await new Promise((r) => setTimeout(r, 130)); - const collectorCalls = axiosMock.history['post'].filter((i) => i.url === dataCollectorEndpoint); - - expect(collectorCalls.length).toBe(0); - }); - - it('should have a log when data collector is not available', async () => { - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, validBoolResponse); - axiosMock.onPost(dataCollectorEndpoint).reply(500, {}); - - const goff = new GoFeatureFlagProvider( - { - endpoint, - flagCacheTTL: 3000, - flagCacheSize: 100, - dataFlushInterval: 2000, // in milliseconds - exporterMetadata: { - nodeJSVersion: '14.17.0', - appVersion: '1.0.0', - identifier: 123, - }, - }, - testLogger, - ); - const providerName = expect.getState().currentTestName || 'test'; - await OpenFeature.setProviderAndWait(providerName, goff); - const cli = OpenFeature.getClient(providerName); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - await cli.getBooleanDetails(flagName, false, { targetingKey }); - await OpenFeature.close(); - - expect(testLogger.inMemoryLogger['error'].length).toBe(1); - expect(testLogger.inMemoryLogger['error']).toContain( - 'Error: impossible to send the data to the collector: Error: Request failed with status code 500', - ); - }); - }); - describe('polling', () => { - it('should_stop_calling_flag_change_if_receive_404', async () => { - const providerName = expect.getState().currentTestName || 'test'; - const goff = new GoFeatureFlagProvider({ - endpoint, - disableDataCollection: false, - pollInterval: 100, - flagCacheTTL: 3000, - flagCacheSize: 100, - }); - await OpenFeature.setProviderAndWait(providerName, goff); - const flagName = 'random-flag'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, validBoolResponse); - axiosMock.onGet(`${endpoint}v1/flag/change`).reply(404); - await new Promise((r) => setTimeout(r, 1000)); - - const nbCall = axiosMock.history['get'].filter((i) => i.url === `${endpoint}v1/flag/change`).length; - expect(nbCall).toBe(1); - }); - it('should not get cached value if flag configuration changed', async () => { - const providerName = expect.getState().currentTestName || 'test'; - const goff = new GoFeatureFlagProvider({ - endpoint, - disableDataCollection: false, - pollInterval: 100, - flagCacheTTL: 3000, - flagCacheSize: 100, - }); - await OpenFeature.setProviderAndWait(providerName, goff); - const cli = OpenFeature.getClient(providerName); - - const flagName = 'random-flag'; - const targetingKey = 'user-key'; - const dns = `${endpoint}v1/feature/${flagName}/eval`; - - axiosMock.onPost(dns).reply(200, validBoolResponse); - axiosMock.onGet(`${endpoint}v1/flag/change`).replyOnce(200, {}, { etag: '123' }); - axiosMock.onGet(`${endpoint}v1/flag/change`).replyOnce(200, {}, { etag: '456' }); - axiosMock.onGet(`${endpoint}v1/flag/change`).reply(304); - - const res1 = await cli.getBooleanDetails(flagName, false, { targetingKey }); - expect(res1.reason).toEqual(StandardResolutionReasons.TARGETING_MATCH); - const res2 = await cli.getBooleanDetails(flagName, false, { targetingKey }); - expect(res2.reason).toEqual(StandardResolutionReasons.CACHED); - await new Promise((r) => setTimeout(r, 1000)); - const res3 = await cli.getBooleanDetails(flagName, false, { targetingKey }); - expect(res3.reason).toEqual(StandardResolutionReasons.TARGETING_MATCH); - }); - }); -}); diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts new file mode 100644 index 000000000..7133057cb --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts @@ -0,0 +1,1412 @@ +import { ErrorCode, OpenFeature, ServerProviderEvents } from '@openfeature/server-sdk'; +import { GoFeatureFlagProvider } from './go-feature-flag-provider'; +import fetchMock from 'jest-fetch-mock'; +import * as fs from 'fs'; +import * as path from 'path'; +import { HTTP_HEADER_LAST_MODIFIED } from './helper/constants'; +import { EvaluationType } from './model'; +import { + FlagConfigurationEndpointNotFoundException, + InvalidOptionsException, + UnauthorizedException, +} from './exception'; + +const DefaultEvaluationContext = { + targetingKey: 'd45e303a-38c2-11ed-a261-0242ac120002', + email: 'john.doe@gofeatureflag.org', + firstname: 'john', + lastname: 'doe', + anonymous: false, + professional: true, + rate: 3.14, + age: 30, + company_info: { + name: 'my_company', + size: 120, + }, + labels: ['pro', 'beta'], +}; + +describe('GoFeatureFlagProvider', () => { + let testClientName = ''; + beforeEach(async () => { + testClientName = expect.getState().currentTestName ?? 'my-test'; + await OpenFeature.close(); + jest.useFakeTimers(); + fetchMock.enableMocks(); + }); + + afterEach(async () => { + testClientName = ''; + jest.clearAllMocks(); + jest.useRealTimers(); + fetchMock.resetMocks(); + + // Clean up OpenFeature + await OpenFeature.close(); + }); + + describe('Constructor', () => { + it('should validate metadata name', () => { + const provider = new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + evaluationType: EvaluationType.Remote, + }); + expect(provider.metadata.name).toBe('GoFeatureFlagProvider'); + }); + + it('should throw InvalidOptionsException when options is null', () => { + expect(() => new GoFeatureFlagProvider(null as any)).toThrow(InvalidOptionsException); + expect(() => new GoFeatureFlagProvider(null as any)).toThrow('No options provided'); + }); + + it('should throw InvalidOptionsException when options is undefined', () => { + expect(() => new GoFeatureFlagProvider(undefined as any)).toThrow(InvalidOptionsException); + expect(() => new GoFeatureFlagProvider(undefined as any)).toThrow('No options provided'); + }); + + it('should throw InvalidOptionsException when endpoint is null', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: null as any, + }), + ).toThrow(InvalidOptionsException); + expect( + () => + new GoFeatureFlagProvider({ + endpoint: null as any, + }), + ).toThrow('endpoint is a mandatory field when initializing the provider'); + }); + + it('should throw InvalidOptionsException when endpoint is undefined', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: undefined as any, + }), + ).toThrow(InvalidOptionsException); + expect( + () => + new GoFeatureFlagProvider({ + endpoint: undefined as any, + }), + ).toThrow('endpoint is a mandatory field when initializing the provider'); + }); + + it('should throw InvalidOptionsException when endpoint is empty string', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: '', + }), + ).toThrow(InvalidOptionsException); + expect( + () => + new GoFeatureFlagProvider({ + endpoint: '', + }), + ).toThrow('endpoint is a mandatory field when initializing the provider'); + }); + + it('should throw InvalidOptionsException when endpoint is whitespace only', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: ' ', + }), + ).toThrow(InvalidOptionsException); + expect( + () => + new GoFeatureFlagProvider({ + endpoint: ' ', + }), + ).toThrow('endpoint is a mandatory field when initializing the provider'); + }); + + it('should throw InvalidOptionsException when endpoint is not a valid URL', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'not-a-url', + }), + ).toThrow(InvalidOptionsException); + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'not-a-url', + }), + ).toThrow('endpoint must be a valid URL (http or https)'); + }); + + it('should throw InvalidOptionsException when endpoint is missing protocol', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'gofeatureflag.org', + }), + ).toThrow(InvalidOptionsException); + }); + + it('should throw InvalidOptionsException when endpoint has invalid protocol', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'ftp://gofeatureflag.org', + }), + ).toThrow(InvalidOptionsException); + }); + + it('should accept valid HTTP endpoint', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'http://gofeatureflag.org', + }), + ).not.toThrow(); + }); + + it('should accept valid HTTPS endpoint', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + }), + ).not.toThrow(); + }); + + it('should accept valid endpoint with path', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org/api/v1', + }), + ).not.toThrow(); + }); + + it('should accept valid endpoint with port', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org:8080', + }), + ).not.toThrow(); + }); + + it('should throw InvalidOptionsException when flagChangePollingIntervalMs is zero', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + flagChangePollingIntervalMs: 0, + }), + ).toThrow(InvalidOptionsException); + }); + + it('should throw InvalidOptionsException when flagChangePollingIntervalMs is negative', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + flagChangePollingIntervalMs: -1000, + }), + ).toThrow(InvalidOptionsException); + }); + + it('should accept valid flagChangePollingIntervalMs', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + flagChangePollingIntervalMs: 30000, + }), + ).not.toThrow(); + }); + + it('should throw InvalidOptionsException when timeout is zero', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + timeout: 0, + }), + ).toThrow(InvalidOptionsException); + }); + + it('should throw InvalidOptionsException when timeout is negative', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + timeout: -5000, + }), + ).toThrow(InvalidOptionsException); + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + timeout: -5000, + }), + ).toThrow('timeout must be greater than zero'); + }); + + it('should throw InvalidOptionsException when dataFlushInterval is zero', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + dataFlushInterval: 0, + }), + ).toThrow(InvalidOptionsException); + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + dataFlushInterval: 0, + }), + ).toThrow('dataFlushInterval must be greater than zero'); + }); + + it('should throw InvalidOptionsException when dataFlushInterval is negative', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + dataFlushInterval: -1000, + }), + ).toThrow(InvalidOptionsException); + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + dataFlushInterval: -1000, + }), + ).toThrow('dataFlushInterval must be greater than zero'); + }); + + it('should accept valid dataFlushInterval', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + dataFlushInterval: 1000, + }), + ).not.toThrow(); + }); + + it('should throw InvalidOptionsException when maxPendingEvents is zero', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + maxPendingEvents: 0, + }), + ).toThrow(InvalidOptionsException); + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + maxPendingEvents: 0, + }), + ).toThrow('maxPendingEvents must be greater than zero'); + }); + + it('should throw InvalidOptionsException when maxPendingEvents is negative', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + maxPendingEvents: -100, + }), + ).toThrow(InvalidOptionsException); + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + maxPendingEvents: -100, + }), + ).toThrow('maxPendingEvents must be greater than zero'); + }); + + it('should accept valid maxPendingEvents', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + maxPendingEvents: 10000, + }), + ).not.toThrow(); + }); + + it('should accept provider with all optional fields set to valid values', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + evaluationType: EvaluationType.InProcess, + timeout: 15000, + flagChangePollingIntervalMs: 60000, + dataFlushInterval: 2000, + maxPendingEvents: 5000, + disableDataCollection: true, + apiKey: 'test-api-key', + }), + ).not.toThrow(); + }); + + it('should accept provider with minimal required options', () => { + expect( + () => + new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + }), + ).not.toThrow(); + }); + }); + + describe('Basic Provider Functionality', () => { + it('should handle track method calls', () => { + const provider = new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + evaluationType: EvaluationType.Remote, + }); + + expect(() => { + provider.track('test-event', { targetingKey: 'test-user' }); + }).not.toThrow(); + }); + + it('should handle evaluation context with various data types', () => { + const provider = new GoFeatureFlagProvider({ + endpoint: 'https://gofeatureflag.org', + evaluationType: EvaluationType.Remote, + }); + + const complexContext = { + targetingKey: 'user123', + stringValue: 'test', + numberValue: 42, + booleanValue: true, + objectValue: { key: 'value' }, + arrayValue: [1, 2, 3], + }; + + expect(() => { + provider.track('test-event', complexContext); + }).not.toThrow(); + }); + }); + + describe('Remote Evaluation', () => { + it('should evaluate a string flag with remote evaluation', async () => { + fetchMock.mockResponseOnce( + JSON.stringify({ + value: 'CC0000', + key: 'string_key', + reason: 'TARGETING_MATCH', + variant: 'color1', + metadata: { + team: 'ecommerce', + businessPurpose: 'experiment', + }, + }), + { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }, + ); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + evaluationType: EvaluationType.Remote, + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getStringDetails('string_key', 'default', DefaultEvaluationContext); + + const want = { + value: 'CC0000', + reason: 'TARGETING_MATCH', + flagKey: 'string_key', + variant: 'color1', + flagMetadata: { + team: 'ecommerce', + businessPurpose: 'experiment', + }, + }; + expect(result).toEqual(want); + }); + + it('should evaluate a boolean flag with remote evaluation', async () => { + fetchMock.mockResponseOnce( + JSON.stringify({ + value: true, + key: 'bool_key', + reason: 'STATIC', + variant: 'enabled', + metadata: { + team: 'ecommerce', + businessPurpose: 'experiment', + }, + }), + { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }, + ); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + evaluationType: EvaluationType.Remote, + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getBooleanDetails('bool_key', false, DefaultEvaluationContext); + + const want = { + value: true, + reason: 'STATIC', + flagKey: 'bool_key', + variant: 'enabled', + flagMetadata: { + team: 'ecommerce', + businessPurpose: 'experiment', + }, + }; + expect(result).toEqual(want); + }); + + it('should evaluate a double flag with remote evaluation', async () => { + fetchMock.mockResponseOnce( + JSON.stringify({ + value: 1.4, + key: 'double_key', + reason: 'STATIC', + variant: 'value1', + metadata: { + team: 'ecommerce', + businessPurpose: 'experiment', + }, + }), + { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }, + ); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + evaluationType: EvaluationType.Remote, + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getNumberDetails('double_key', 1.11, DefaultEvaluationContext); + + const want = { + value: 1.4, + reason: 'STATIC', + flagKey: 'double_key', + variant: 'value1', + flagMetadata: { + team: 'ecommerce', + businessPurpose: 'experiment', + }, + }; + expect(result).toEqual(want); + }); + + it('should evaluate an int flag with remote evaluation', async () => { + fetchMock.mockResponseOnce( + JSON.stringify({ + value: 1, + key: 'int_key', + reason: 'STATIC', + variant: 'value2', + metadata: { + team: 'ecommerce', + businessPurpose: 'experiment', + }, + }), + { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }, + ); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + evaluationType: EvaluationType.Remote, + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getNumberDetails('int_key', 1, DefaultEvaluationContext); + + const want = { + value: 1, + reason: 'STATIC', + flagKey: 'int_key', + variant: 'value2', + flagMetadata: { + team: 'ecommerce', + businessPurpose: 'experiment', + }, + }; + expect(result).toEqual(want); + }); + + it('should evaluate an object flag with remote evaluation', async () => { + fetchMock.mockResponseOnce( + JSON.stringify({ + value: { + name: 'gofeatureflag', + size: 150, + }, + key: 'object_key', + reason: 'STATIC', + variant: 'value3', + metadata: { + team: 'ecommerce', + businessPurpose: 'experiment', + }, + }), + { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }, + ); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + evaluationType: EvaluationType.Remote, + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getObjectDetails( + 'object_key', + { + name: 'my_company', + size: 120, + }, + DefaultEvaluationContext, + ); + + const want = { + value: { + name: 'gofeatureflag', + size: 150, + }, + reason: 'STATIC', + flagKey: 'object_key', + variant: 'value3', + flagMetadata: { + team: 'ecommerce', + businessPurpose: 'experiment', + }, + }; + expect(result).toEqual(want); + }); + + it('should error if flag is not found', async () => { + fetchMock.mockResponseOnce( + JSON.stringify({ + key: 'not_found_key', + errorCode: ErrorCode.FLAG_NOT_FOUND, + errorMessage: 'flag not found', + flagMetadata: { + team: 'ecommerce', + businessPurpose: 'experiment', + }, + }), + { + status: 404, + headers: { 'Content-Type': 'application/json' }, + }, + ); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + evaluationType: EvaluationType.Remote, + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getNumberDetails('not_found_key', 1, DefaultEvaluationContext); + + const want = { + value: 1, + reason: 'ERROR', + errorCode: ErrorCode.FLAG_NOT_FOUND, + errorMessage: ErrorCode.FLAG_NOT_FOUND, + flagKey: 'not_found_key', + flagMetadata: {}, + }; + expect(result).toEqual(want); + }); + + it('should error if flag type mismatch', async () => { + fetchMock.mockResponseOnce( + JSON.stringify({ + key: 'type_mismatch_key', + errorCode: ErrorCode.TYPE_MISMATCH, + errorMessage: 'type mismatch', + flagMetadata: { + team: 'ecommerce', + businessPurpose: 'experiment', + }, + }), + { + status: 400, + headers: { 'Content-Type': 'application/json' }, + }, + ); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + evaluationType: EvaluationType.Remote, + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getNumberDetails('type_mismatch_key', 1, DefaultEvaluationContext); + + const want = { + value: 1, + reason: 'ERROR', + errorCode: ErrorCode.TYPE_MISMATCH, + errorMessage: ErrorCode.TYPE_MISMATCH, + flagKey: 'type_mismatch_key', + flagMetadata: {}, + }; + expect(result).toEqual(want); + }); + }); + + describe('InProcess Evaluation', () => { + it('should evaluate a string flag with inprocess evaluation', async () => { + fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getStringDetails('string_key', 'default', DefaultEvaluationContext); + const want = { + reason: 'TARGETING_MATCH', + flagKey: 'string_key', + value: 'CC0000', + flagMetadata: { + description: 'this is a test', + pr_link: 'https://github.com/thomaspoignant/go-feature-flag/pull/916', + }, + variant: 'True', + }; + expect(result).toEqual(want); + }); + + it('should evaluate a boolean flag with inprocess evaluation', async () => { + fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getBooleanDetails('bool_targeting_match', false, DefaultEvaluationContext); + const want = { + reason: 'TARGETING_MATCH', + flagKey: 'bool_targeting_match', + value: true, + flagMetadata: { + description: 'this is a test', + pr_link: 'https://github.com/thomaspoignant/go-feature-flag/pull/916', + }, + variant: 'True', + }; + expect(result).toEqual(want); + }); + + it('should evaluate an int flag with inprocess evaluation', async () => { + fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getNumberDetails('integer_key', 1, DefaultEvaluationContext); + const want = { + reason: 'TARGETING_MATCH', + flagKey: 'integer_key', + value: 100, + flagMetadata: { + description: 'this is a test', + pr_link: 'https://github.com/thomaspoignant/go-feature-flag/pull/916', + }, + variant: 'True', + }; + expect(result).toEqual(want); + }); + + it('should evaluate a double flag with inprocess evaluation', async () => { + fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getNumberDetails('double_key', 1, DefaultEvaluationContext); + const want = { + reason: 'TARGETING_MATCH', + flagKey: 'double_key', + value: 100.25, + flagMetadata: { + description: 'this is a test', + pr_link: 'https://github.com/thomaspoignant/go-feature-flag/pull/916', + }, + variant: 'True', + }; + expect(result).toEqual(want); + }); + + it('should evaluate an object flag with inprocess evaluation', async () => { + fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getObjectDetails( + 'object_key', + { + default: true, + }, + DefaultEvaluationContext, + ); + const want = { + reason: 'TARGETING_MATCH', + flagKey: 'object_key', + value: { + test: 'test1', + test2: false, + test3: 123.3, + test4: 1, + }, + flagMetadata: { + description: 'this is a test', + pr_link: 'https://github.com/thomaspoignant/go-feature-flag/pull/916', + }, + variant: 'True', + }; + expect(result).toEqual(want); + }); + + it('should evaluate an array flag with inprocess evaluation', async () => { + fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getObjectDetails('list_key', ['default', 'true'], DefaultEvaluationContext); + const want = { + reason: 'TARGETING_MATCH', + flagKey: 'list_key', + value: ['true'], + flagMetadata: { + description: 'this is a test', + pr_link: 'https://github.com/thomaspoignant/go-feature-flag/pull/916', + }, + variant: 'True', + }; + expect(result).toEqual(want); + }); + + it('should error FLAG_NOT_FOUND when flag is not found', async () => { + fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getObjectDetails('flag_not_found', ['default', 'true'], DefaultEvaluationContext); + const want = { + reason: 'ERROR', + flagKey: 'flag_not_found', + value: ['default', 'true'], + errorCode: ErrorCode.FLAG_NOT_FOUND, + // eslint-disable-next-line quotes + errorMessage: "Flag with key 'flag_not_found' not found", + flagMetadata: {}, + }; + expect(result).toEqual(want); + }); + + it('Should error if we expect a boolean and got another type', async () => { + fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getStringDetails('double_key', 'default', DefaultEvaluationContext); + const want = { + reason: 'ERROR', + flagKey: 'double_key', + value: 'default', + errorCode: ErrorCode.TYPE_MISMATCH, + errorMessage: 'Flag double_key had unexpected type, expected string.', + flagMetadata: {}, + }; + expect(result).toEqual(want); + }); + + it('Should use boolean default value if the flag is disabled', async () => { + fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const result = await client.getBooleanDetails('disabled_bool', false, DefaultEvaluationContext); + const want = { + reason: 'DISABLED', + flagKey: 'disabled_bool', + value: false, + flagMetadata: { + description: 'this is a test', + pr_link: 'https://github.com/thomaspoignant/go-feature-flag/pull/916', + }, + variant: 'SdkDefault', + }; + expect(result).toEqual(want); + }); + + it('Should emit configuration change event, if config has changed', async () => { + jest.useRealTimers(); + fetchMock.mockResponses( + [ + getConfigurationEndpointResult(), + { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }, + ], + [ + getConfigurationEndpointResult('change-config-before'), + { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }, + ], + ); + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + flagChangePollingIntervalMs: 100, + }); + + let configChangedCount = 0; + provider.events.addHandler(ServerProviderEvents.ConfigurationChanged, () => { + configChangedCount++; + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + await new Promise((resolve) => setTimeout(resolve, 180)); + + expect(configChangedCount).toBeGreaterThan(0); + }); + + it('Should change evaluation details if config has changed', async () => { + jest.useRealTimers(); + let callCount = 0; + fetchMock.mockIf(/^http:\/\/localhost:1031/, async () => { + callCount++; + if (callCount <= 1) { + return { + body: getConfigurationEndpointResult('change-config-before'), + status: 200, + headers: { + 'Content-Type': 'application/json', + ETag: '"1234567890"', + [HTTP_HEADER_LAST_MODIFIED]: '2021-01-01T00:00:00Z', + }, + }; + } else { + return { + body: getConfigurationEndpointResult('change-config-after'), + status: 200, + headers: { + 'Content-Type': 'application/json', + ETag: '"2345678910"', + [HTTP_HEADER_LAST_MODIFIED]: '2021-01-02T00:00:00Z', + }, + }; + } + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + flagChangePollingIntervalMs: 200, + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + const res1 = await client.getBooleanDetails('TEST', false, DefaultEvaluationContext); + expect(res1.value).toBe(false); + await new Promise((resolve) => setTimeout(resolve, 250)); + const res2 = await client.getBooleanDetails('TEST', false, DefaultEvaluationContext); + expect(res2.value).toBe(true); + expect(res1).not.toEqual(res2); + }); + + it('Should error if flag configuration endpoint return a 404', async () => { + jest.useRealTimers(); + fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { + status: 404, + headers: { 'Content-Type': 'application/json' }, + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + flagChangePollingIntervalMs: 100, + }); + try { + await OpenFeature.setProviderAndWait(testClientName, provider); + expect(true).toBe(false); // if we reach this line, the test should fail + } catch (error) { + expect(error).toBeInstanceOf(FlagConfigurationEndpointNotFoundException); + } + }); + + it('Should error if flag configuration endpoint return a 403', async () => { + jest.useRealTimers(); + fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { + status: 403, + headers: { 'Content-Type': 'application/json' }, + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + flagChangePollingIntervalMs: 100, + }); + try { + await OpenFeature.setProviderAndWait(testClientName, provider); + expect(true).toBe(false); // if we reach this line, the test should fail + } catch (error) { + expect(error).toBeInstanceOf(UnauthorizedException); + } + }); + + it('Should error if flag configuration endpoint return a 401', async () => { + jest.useRealTimers(); + fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { + status: 401, + headers: { 'Content-Type': 'application/json' }, + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + flagChangePollingIntervalMs: 100, + }); + try { + await OpenFeature.setProviderAndWait(testClientName, provider); + expect(true).toBe(false); // if we reach this line, the test should fail + } catch (error) { + expect(error).toBeInstanceOf(UnauthorizedException); + } + }); + + it('Should apply a scheduled rollout step', async () => { + fetchMock.mockResponseOnce(getConfigurationEndpointResult('scheduled-rollout'), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + flagChangePollingIntervalMs: 100, + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + + const got = await client.getBooleanDetails('my-flag', false, DefaultEvaluationContext); + const want = { + reason: 'TARGETING_MATCH', + flagKey: 'my-flag', + flagMetadata: { + defaultValue: false, + description: 'this is a test flag', + }, + value: true, + variant: 'enabled', + }; + expect(got).toEqual(want); + }); + + it('Should not apply a scheduled rollout in the future', async () => { + fetchMock.mockResponseOnce(getConfigurationEndpointResult('scheduled-rollout'), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + flagChangePollingIntervalMs: 100, + }); + + await OpenFeature.setProviderAndWait(testClientName, provider); + const client = OpenFeature.getClient(testClientName); + + const got = await client.getBooleanDetails('my-flag-scheduled-in-future', false, DefaultEvaluationContext); + const want = { + reason: 'STATIC', + flagKey: 'my-flag-scheduled-in-future', + flagMetadata: { + defaultValue: false, + description: 'this is a test flag', + }, + value: false, + variant: 'disabled', + }; + expect(got).toEqual(want); + }); + }); + + describe('Track method', () => { + it('should track events with context and details', async () => { + jest.setSystemTime(new Date('2021-01-01T00:00:00Z')); + fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/data\/collector/, async () => { + return { + body: JSON.stringify({}), + status: 200, + headers: { + 'Content-Type': 'application/json', + }, + }; + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + evaluationType: EvaluationType.Remote, + dataFlushInterval: 100, + maxPendingEvents: 1, + }); + + await OpenFeature.setProviderAndWait('track-events-with-context-and-details', provider); + await provider.initialize(); + const client = OpenFeature.getClient('track-events-with-context-and-details'); + + client.track( + 'testEvent', + { + targetingKey: 'testTargetingKey', + email: 'test@example.com', + }, + { + test: 'testValue', + metric: 42, + }, + ); + + jest.advanceTimersByTime(100); + + const lastCall = fetchMock.mock.calls[fetchMock.mock.calls.length - 1]; + expect(lastCall).toBeDefined(); + expect(lastCall[0]).toBe('http://localhost:1031/v1/data/collector'); + + const want = { + meta: {}, + events: [ + { + kind: 'tracking', + userKey: 'testTargetingKey', + contextKind: 'user', + key: 'testEvent', + trackingEventDetails: { + test: 'testValue', + metric: 42, + }, + creationDate: 1609459200, + evaluationContext: { + targetingKey: 'testTargetingKey', + email: 'test@example.com', + }, + }, + ], + }; + expect(lastCall[1]?.body).toBeDefined(); + expect(JSON.parse(lastCall[1]?.body as string)).toEqual(want); + }); + + it('should track events without context', async () => { + jest.setSystemTime(new Date('2021-01-01T00:00:00Z')); + fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/data\/collector/, async () => { + return { + body: JSON.stringify({}), + status: 200, + headers: { + 'Content-Type': 'application/json', + }, + }; + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + dataFlushInterval: 100, + maxPendingEvents: 1, + }); + + await OpenFeature.setProviderAndWait('track-events-without-context', provider); + const client = OpenFeature.getClient('track-events-without-context'); + + client.track('testEventWithoutContext'); + + jest.advanceTimersByTime(110); + + const want = { + meta: {}, + events: [ + { + kind: 'tracking', + userKey: 'undefined-targetingKey', + contextKind: 'user', + key: 'testEventWithoutContext', + trackingEventDetails: {}, + creationDate: 1609459200, + evaluationContext: {}, + }, + ], + }; + + const lastCall = fetchMock.mock.calls[fetchMock.mock.calls.length - 1]; + expect(lastCall).toBeDefined(); + expect(lastCall[0]).toBe('http://localhost:1031/v1/data/collector'); + expect(lastCall[1]?.body).toBeDefined(); + expect(JSON.parse(lastCall[1]?.body as string)).toEqual(want); + }); + + it('should track events without tracking details', async () => { + jest.setSystemTime(new Date('2021-01-01T00:00:00Z')); + fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/data\/collector/, async () => { + return { + body: JSON.stringify({}), + status: 200, + headers: { + 'Content-Type': 'application/json', + }, + }; + }); + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + dataFlushInterval: 100, + maxPendingEvents: 1, + }); + + await OpenFeature.setProviderAndWait('track-events-without-tracking-details', provider); + const client = OpenFeature.getClient('track-events-without-tracking-details'); + + client.track('testEventNoDetails', { + targetingKey: 'testTargetingKey', + userId: '123', + }); + + jest.advanceTimersByTime(110); + + const want = { + meta: {}, + events: [ + { + kind: 'tracking', + userKey: 'testTargetingKey', + key: 'testEventNoDetails', + trackingEventDetails: {}, + evaluationContext: { + targetingKey: 'testTargetingKey', + userId: '123', + }, + creationDate: 1609459200, + contextKind: 'user', + }, + ], + }; + + const lastCall = fetchMock.mock.calls[fetchMock.mock.calls.length - 1]; + expect(lastCall).toBeDefined(); + expect(lastCall[0]).toBe('http://localhost:1031/v1/data/collector'); + expect(lastCall[1]?.body).toBeDefined(); + expect(JSON.parse(lastCall[1]?.body as string)).toEqual(want); + }); + + it('should track multiple events', async () => { + jest.setSystemTime(new Date('2021-01-01T00:00:00Z')); + fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/data\/collector/, async () => { + return { + body: JSON.stringify({}), + status: 200, + headers: { + 'Content-Type': 'application/json', + }, + }; + }); + + const provider = new GoFeatureFlagProvider({ + endpoint: 'http://localhost:1031', + evaluationType: EvaluationType.Remote, + dataFlushInterval: 100, + maxPendingEvents: 3, + }); + + await OpenFeature.setProviderAndWait('track-events-with-context-and-details', provider); + await provider.initialize(); + const client = OpenFeature.getClient('track-events-with-context-and-details'); + + client.track( + 'testEvent', + { + targetingKey: 'testTargetingKey', + email: 'test@example.com', + }, + { + test: 'testValue', + metric: 42, + }, + ); + client.track( + 'testEvent', + { + targetingKey: 'testTargetingKey', + email: 'test2@example.com', + }, + { + test: 'testValue', + metric: 43, + }, + ); + client.track( + 'testEvent', + { + targetingKey: 'testTargetingKey3', + email: 'test3@example.com', + }, + { + test: 'testValue', + metric: 44, + }, + ); + + jest.advanceTimersByTime(100); + + const want = { + meta: {}, + events: [ + { + kind: 'tracking', + userKey: 'testTargetingKey', + contextKind: 'user', + key: 'testEvent', + trackingEventDetails: { + test: 'testValue', + metric: 42, + }, + creationDate: 1609459200, + evaluationContext: { + targetingKey: 'testTargetingKey', + email: 'test@example.com', + }, + }, + { + kind: 'tracking', + userKey: 'testTargetingKey', + contextKind: 'user', + key: 'testEvent', + trackingEventDetails: { + test: 'testValue', + metric: 43, + }, + creationDate: 1609459200, + evaluationContext: { + targetingKey: 'testTargetingKey', + email: 'test2@example.com', + }, + }, + { + kind: 'tracking', + userKey: 'testTargetingKey3', + contextKind: 'user', + key: 'testEvent', + trackingEventDetails: { + test: 'testValue', + metric: 44, + }, + creationDate: 1609459200, + evaluationContext: { + targetingKey: 'testTargetingKey3', + email: 'test3@example.com', + }, + }, + ], + }; + + const lastCall = fetchMock.mock.calls[fetchMock.mock.calls.length - 1]; + expect(lastCall).toBeDefined(); + expect(lastCall[0]).toBe('http://localhost:1031/v1/data/collector'); + expect(lastCall[1]?.body).toBeDefined(); + expect(JSON.parse(lastCall[1]?.body as string)).toEqual(want); + }); + }); +}); + +function getConfigurationEndpointResult(mode = 'default') { + const filePath = path.resolve(__dirname, 'testdata', 'flag-configuration', mode + '.json'); + const fileContent = fs.readFileSync(filePath, 'utf-8'); + return JSON.stringify(JSON.parse(fileContent)); +} diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.ts index e423171f6..535763020 100644 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.ts +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.ts @@ -1,217 +1,183 @@ -import type { EvaluationContext, Hook, JsonValue, Logger, Provider, ResolutionDetails } from '@openfeature/server-sdk'; -import { OpenFeatureEventEmitter, ServerProviderEvents, StandardResolutionReasons } from '@openfeature/server-sdk'; -import type { ExporterMetadataValue, GoFeatureFlagProviderOptions } from './model'; -import { ConfigurationChange } from './model'; -import { GoFeatureFlagDataCollectorHook } from './data-collector-hook'; -import { GoffApiController } from './controller/goff-api'; -import { CacheController } from './controller/cache'; -import { ConfigurationChangeEndpointNotFound } from './errors/configuration-change-endpoint-not-found'; - -// GoFeatureFlagProvider is the official Open-feature provider for GO Feature Flag. -export class GoFeatureFlagProvider implements Provider { +import type { + EvaluationContext, + Hook, + JsonValue, + Logger, + Provider, + ResolutionDetails, + Tracking, + TrackingEventDetails, +} from '@openfeature/server-sdk'; +import { OpenFeatureEventEmitter } from '@openfeature/server-sdk'; +import type { GoFeatureFlagProviderOptions } from './go-feature-flag-provider-options'; +import type { IEvaluator } from './evaluator/evaluator'; +import { InProcessEvaluator } from './evaluator/inprocess-evaluator'; +import { GoFeatureFlagApi } from './service/api'; +import { DataCollectorHook, EnrichEvaluationContextHook } from './hook'; +import { EventPublisher } from './service/event-publisher'; +import { getContextKind } from './helper/event-util'; +import { DEFAULT_TARGETING_KEY } from './helper/constants'; +import { EvaluationType, type TrackingEvent } from './model'; +import { InvalidOptionsException } from './exception'; +import { RemoteEvaluator } from './evaluator/remote-evaluator'; + +export class GoFeatureFlagProvider implements Provider, Tracking { metadata = { name: GoFeatureFlagProvider.name, }; + readonly runsOn = 'server'; events = new OpenFeatureEventEmitter(); - hooks?: Hook[]; - private DEFAULT_POLL_INTERVAL = 30000; - // disableDataCollection set to true if you don't want to collect the usage of flags retrieved in the cache. - private readonly _disableDataCollection: boolean; - // dataCollectorHook is the hook used to send the data to the GO Feature Flag data collector API. - private readonly _dataCollectorHook?: GoFeatureFlagDataCollectorHook; - // goffApiController is the controller used to communicate with the GO Feature Flag relay-proxy API. - private readonly _goffApiController: GoffApiController; - // cacheController is the controller used to cache the evaluation of the flags. - private readonly _cacheController?: CacheController; - private _pollingIntervalId?: number; - private _pollingInterval: number; - private _exporterMetadata?: Record; + hooks: Hook[] = []; - constructor(options: GoFeatureFlagProviderOptions, logger?: Logger) { - this._goffApiController = new GoffApiController(options); - this._dataCollectorHook = new GoFeatureFlagDataCollectorHook( - { - dataFlushInterval: options.dataFlushInterval, - collectUnCachedEvaluation: false, - exporterMetadata: options.exporterMetadata, - }, - this._goffApiController, - logger, - ); - this._exporterMetadata = options.exporterMetadata; - this._disableDataCollection = options.disableDataCollection || false; - this._cacheController = new CacheController(options, logger); - this._pollingInterval = options.pollInterval ?? this.DEFAULT_POLL_INTERVAL; - } + /** The options for the provider. */ + private readonly options: GoFeatureFlagProviderOptions; + /** The logger for the provider. */ + private readonly logger?: Logger; + /** The evaluation service for the provider. */ + private readonly evaluator: IEvaluator; + /** The event publisher for the provider. */ + private readonly eventPublisher: EventPublisher; - /** - * initialize is called everytime the provider is instanced inside GO Feature Flag. - * It will start the background process for data collection to be able to run every X ms. - */ - async initialize() { - if (!this._disableDataCollection && this._dataCollectorHook) { - this.hooks = [this._dataCollectorHook]; - this._dataCollectorHook.init(); - } + constructor(options: GoFeatureFlagProviderOptions, logger?: Logger) { + this.validateInputOptions(options); + this.options = options; + this.logger = logger; + const api = new GoFeatureFlagApi(options); + this.evaluator = this.getEvaluator(options, api, logger); + this.eventPublisher = new EventPublisher(api, options, logger); - if (this._pollingInterval > 0) { - this.startPolling(); - } + // Initialize hooks + this.initializeHooks(); } - /** - * onClose is called everytime OpenFeature.Close() function is called. - * It will gracefully terminate the provider and ensure that all the data are sent to the relay-proxy. - */ - async onClose() { - this.stopPolling(); - this._cacheController?.clear(); - await this._dataCollectorHook?.close(); + /** @inheritdoc */ + track(trackingEventName: string, context?: EvaluationContext, trackingEventDetails?: TrackingEventDetails): void { + // Create a tracking event object + const event: TrackingEvent = { + kind: 'tracking', + userKey: context?.targetingKey ?? DEFAULT_TARGETING_KEY, + contextKind: getContextKind(context), + key: trackingEventName, + trackingEventDetails: trackingEventDetails ?? {}, + creationDate: Date.now() / 1000, + evaluationContext: context ?? {}, + }; + this.eventPublisher.addEvent(event); } - /** - * resolveBooleanEvaluation is calling the GO Feature Flag relay-proxy API and return a boolean value. - * @param flagKey - name of your feature flag key. - * @param defaultValue - default value is used if we are not able to evaluate the flag for this user. - * @param context - the context used for flag evaluation. - * @return {Promise>} An object containing the result of the flag evaluation by GO Feature Flag. - * @throws {ProxyNotReady} When we are not able to communicate with the relay-proxy - * @throws {ProxyTimeout} When the HTTP call is timing out - * @throws {UnknownError} When an unknown error occurs - * @throws {TypeMismatchError} When the type of the variation is not the one expected - * @throws {FlagNotFoundError} When the flag does not exist - */ + /** @inheritdoc */ async resolveBooleanEvaluation( flagKey: string, defaultValue: boolean, context: EvaluationContext, ): Promise> { - return this.resolveEvaluationGoFeatureFlagProxy(flagKey, defaultValue, context, 'boolean'); + return this.evaluator.evaluateBoolean(flagKey, defaultValue, context); } - /** - * resolveStringEvaluation is calling the GO Feature Flag relay-proxy API and return a string value. - * @param flagKey - name of your feature flag key. - * @param defaultValue - default value is used if we are not able to evaluate the flag for this user. - * @param context - the context used for flag evaluation. - * @return {Promise>} An object containing the result of the flag evaluation by GO Feature Flag. - * @throws {ProxyNotReady} When we are not able to communicate with the relay-proxy - * @throws {ProxyTimeout} When the HTTP call is timing out - * @throws {UnknownError} When an unknown error occurs - * @throws {TypeMismatchError} When the type of the variation is not the one expected - * @throws {FlagNotFoundError} When the flag does not exist - */ + /** @inheritdoc */ async resolveStringEvaluation( flagKey: string, defaultValue: string, context: EvaluationContext, ): Promise> { - return this.resolveEvaluationGoFeatureFlagProxy(flagKey, defaultValue, context, 'string'); + return this.evaluator.evaluateString(flagKey, defaultValue, context); } - /** - * resolveNumberEvaluation is calling the GO Feature Flag relay-proxy API and return a number value. - * @param flagKey - name of your feature flag key. - * @param defaultValue - default value is used if we are not able to evaluate the flag for this user. - * @param context - the context used for flag evaluation. - * @return {Promise>} An object containing the result of the flag evaluation by GO Feature Flag. - * @throws {ProxyNotReady} When we are not able to communicate with the relay-proxy - * @throws {ProxyTimeout} When the HTTP call is timing out - * @throws {UnknownError} When an unknown error occurs - * @throws {TypeMismatchError} When the type of the variation is not the one expected - * @throws {FlagNotFoundError} When the flag does not exist - */ + /** @inheritdoc */ async resolveNumberEvaluation( flagKey: string, defaultValue: number, context: EvaluationContext, ): Promise> { - return this.resolveEvaluationGoFeatureFlagProxy(flagKey, defaultValue, context, 'number'); + return this.evaluator.evaluateNumber(flagKey, defaultValue, context); } - /** - * resolveObjectEvaluation is calling the GO Feature Flag relay-proxy API and return an object. - * @param flagKey - name of your feature flag key. - * @param defaultValue - default value is used if we are not able to evaluate the flag for this user. - * @param context - the context used for flag evaluation. - * @return {Promise>} An object containing the result of the flag evaluation by GO Feature Flag. - * @throws {ProxyNotReady} When we are not able to communicate with the relay-proxy - * @throws {ProxyTimeout} When the HTTP call is timing out - * @throws {UnknownError} When an unknown error occurs - * @throws {TypeMismatchError} When the type of the variation is not the one expected - * @throws {FlagNotFoundError} When the flag does not exist - */ - async resolveObjectEvaluation( + async resolveObjectEvaluation( flagKey: string, - defaultValue: U, + defaultValue: T, context: EvaluationContext, - ): Promise> { - return this.resolveEvaluationGoFeatureFlagProxy(flagKey, defaultValue, context, 'object'); + ): Promise> { + return this.evaluator.evaluateObject(flagKey, defaultValue, context); } /** - * resolveEvaluationGoFeatureFlagProxy is a generic function the call the GO Feature Flag relay-proxy API - * to evaluate the flag. - * This is the same call for all types of flags so this function also checks if the return call is the one expected. - * @param flagKey - name of your feature flag key. - * @param defaultValue - default value is used if we are not able to evaluate the flag for this user. - * @param evaluationContext - the evaluationContext against who we will evaluate the flag. - * @param expectedType - the type we expect the result to be - * @return {Promise>} An object containing the result of the flag evaluation by GO Feature Flag. - * @throws {ProxyNotReady} When we are not able to communicate with the relay-proxy - * @throws {ProxyTimeout} When the HTTP call is timing out - * @throws {UnknownError} When an unknown error occurs - * @throws {TypeMismatchError} When the type of the variation is not the one expected - * @throws {FlagNotFoundError} When the flag does not exist + * Start the provider and initialize the event publisher. */ - async resolveEvaluationGoFeatureFlagProxy( - flagKey: string, - defaultValue: T, - evaluationContext: EvaluationContext, - expectedType: string, - ): Promise> { - const cacheValue = this._cacheController?.get(flagKey, evaluationContext); - if (cacheValue) { - cacheValue.reason = StandardResolutionReasons.CACHED; - return cacheValue; - } + async initialize(): Promise { + this.evaluator && (await this.evaluator.initialize()); + this.eventPublisher && (await this.eventPublisher.start()); + } - const evaluationResponse = await this._goffApiController.evaluate( - flagKey, - defaultValue, - evaluationContext, - expectedType, - this._exporterMetadata ?? {}, - ); + /** + * Dispose the provider and stop the event publisher. + */ + async dispose(): Promise { + this.evaluator && (await this.evaluator.dispose()); + this.eventPublisher && (await this.eventPublisher.stop()); + } - this._cacheController?.set(flagKey, evaluationContext, evaluationResponse); - return evaluationResponse.resolutionDetails; + /** + * Get the evaluator based on the evaluation type specified in the options. + */ + private getEvaluator(options: GoFeatureFlagProviderOptions, api: GoFeatureFlagApi, logger?: Logger): IEvaluator { + switch (options.evaluationType) { + case EvaluationType.Remote: + return new RemoteEvaluator(options, logger); + default: + return new InProcessEvaluator(options, api, this.events, logger); + } } - private startPolling() { - this._pollingIntervalId = setInterval(async () => { - try { - const res = await this._goffApiController.configurationHasChanged(); - if (res === ConfigurationChange.FLAG_CONFIGURATION_UPDATED) { - this.events?.emit(ServerProviderEvents.ConfigurationChanged, { message: 'Flags updated' }); - this._cacheController?.clear(); - } - } catch (error) { - if (error instanceof ConfigurationChangeEndpointNotFound && this._pollingIntervalId) { - this.stopPolling(); - } - } - }, this._pollingInterval) as unknown as number; + /** + * Initialize the hooks for the provider. + */ + private initializeHooks(): void { + this.hooks.push(new DataCollectorHook(this.evaluator, this.eventPublisher)); + this.logger?.debug('Data collector hook initialized'); + if (this.options.exporterMetadata) { + this.hooks.push(new EnrichEvaluationContextHook(this.options.exporterMetadata)); + this.logger?.debug('Enrich evaluation context hook initialized'); + } } /** - * Stop polling for flag updates - * @private + * Validates the input options provided when creating the provider. + * @param options Options used while creating the provider + * @throws {InvalidOptionsException} if no options are provided, or we have a wrong configuration. */ - private stopPolling() { - if (this._pollingIntervalId) { - clearInterval(this._pollingIntervalId); + private validateInputOptions(options: GoFeatureFlagProviderOptions): void { + if (!options) { + throw new InvalidOptionsException('No options provided'); + } + + if (!options.endpoint || options.endpoint.trim() === '') { + throw new InvalidOptionsException('endpoint is a mandatory field when initializing the provider'); + } + + try { + const url = new URL(options.endpoint); + if (url.protocol !== 'http:' && url.protocol !== 'https:') { + throw new InvalidOptionsException('endpoint must be a valid URL (http or https)'); + } + } catch { + throw new InvalidOptionsException('endpoint must be a valid URL (http or https)'); + } + + if (options.flagChangePollingIntervalMs !== undefined && options.flagChangePollingIntervalMs <= 0) { + throw new InvalidOptionsException('flagChangePollingIntervalMs must be greater than zero'); + } + + if (options.timeout !== undefined && options.timeout <= 0) { + throw new InvalidOptionsException('timeout must be greater than zero'); + } + + if (options.dataFlushInterval !== undefined && options.dataFlushInterval <= 0) { + throw new InvalidOptionsException('dataFlushInterval must be greater than zero'); + } + + if (options.maxPendingEvents !== undefined && options.maxPendingEvents <= 0) { + throw new InvalidOptionsException('maxPendingEvents must be greater than zero'); } } } diff --git a/libs/providers/go-feature-flag/src/lib/helper/constants.ts b/libs/providers/go-feature-flag/src/lib/helper/constants.ts new file mode 100644 index 000000000..51b3df1e0 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/helper/constants.ts @@ -0,0 +1,25 @@ +/** + * Constants used throughout the GO Feature Flag API. + */ +export const HTTP_HEADER_CONTENT_TYPE = 'Content-Type'; +export const HTTP_HEADER_AUTHORIZATION = 'Authorization'; +export const HTTP_HEADER_IF_NONE_MATCH = 'If-None-Match'; +export const HTTP_HEADER_ETAG = 'etag'; +export const HTTP_HEADER_LAST_MODIFIED = 'last-modified'; +export const APPLICATION_JSON = 'application/json'; +export const BEARER_TOKEN = 'Bearer '; + +export const HTTP_STATUS = { + OK: 200, + BAD_REQUEST: 400, + UNAUTHORIZED: 401, + FORBIDDEN: 403, + NOT_FOUND: 404, + UNAVAILABLE: 503, + NOT_MODIFIED: 304, +} as const; + +export const DEFAULT_FLUSH_INTERVAL_MS = 10000; +export const DEFAULT_MAX_PENDING_EVENTS = 10000; + +export const DEFAULT_TARGETING_KEY = 'undefined-targetingKey'; diff --git a/libs/providers/go-feature-flag/src/lib/helper/event-util.ts b/libs/providers/go-feature-flag/src/lib/helper/event-util.ts new file mode 100644 index 000000000..205c8a2b0 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/helper/event-util.ts @@ -0,0 +1,10 @@ +import type { EvaluationContext } from '@openfeature/core'; + +/** + * Get the context kind based on the evaluation context. + * @param context - The evaluation context to check + * @returns 'anonymous' if the context is anonymous, 'user' otherwise + */ +export const getContextKind = (context?: EvaluationContext): string => { + return !context || context['anonymous'] === true ? 'anonymousUser' : 'user'; +}; diff --git a/libs/providers/go-feature-flag/src/lib/helper/fetch-api.ts b/libs/providers/go-feature-flag/src/lib/helper/fetch-api.ts new file mode 100644 index 000000000..3bd8e83e2 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/helper/fetch-api.ts @@ -0,0 +1,17 @@ +/** + * FetchAPI is the type of the fetch function. + */ +export type FetchAPI = WindowOrWorkerGlobalScope['fetch']; + +export const isomorphicFetch = (): FetchAPI => { + // We need to do this, as fetch needs the window as scope in the browser: https://fetch.spec.whatwg.org/#concept-request-window + // Without this any request will fail in the browser https://stackoverflow.com/questions/69876859/why-does-bind-fix-failed-to-execute-fetch-on-window-illegal-invocation-err + if (globalThis) { + return globalThis.fetch.bind(globalThis); + } else if (window) { + return window.fetch.bind(window); + } else if (self) { + return self.fetch.bind(self); + } + return fetch; +}; diff --git a/libs/providers/go-feature-flag/src/lib/hook/data-collector-hook.test.ts b/libs/providers/go-feature-flag/src/lib/hook/data-collector-hook.test.ts new file mode 100644 index 000000000..b777cb544 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/hook/data-collector-hook.test.ts @@ -0,0 +1,195 @@ +import { DataCollectorHook } from './data-collector-hook'; +import type { IEvaluator } from '../evaluator/evaluator'; +import type { EventPublisher } from '../service/event-publisher'; +import type { HookContext, EvaluationDetails } from '@openfeature/server-sdk'; +import { EvaluatorNotFoundException, EventPublisherNotFoundException } from '../exception'; +import { mockLogger } from '../testutil/mock-logger'; + +describe('DataCollectorHook', () => { + let mockEvaluator: jest.Mocked; + let mockEventPublisher: jest.Mocked; + let hook: DataCollectorHook; + + beforeEach(() => { + mockEvaluator = { + isFlagTrackable: jest.fn(), + initialize: jest.fn(), + dispose: jest.fn(), + evaluateBoolean: jest.fn(), + evaluateString: jest.fn(), + evaluateNumber: jest.fn(), + evaluateObject: jest.fn(), + } as jest.Mocked; + + mockEventPublisher = { + addEvent: jest.fn(), + start: jest.fn(), + stop: jest.fn(), + } as unknown as jest.Mocked; + + hook = new DataCollectorHook(mockEvaluator, mockEventPublisher); + }); + + describe('constructor', () => { + it('should throw error if evaluator is null', () => { + expect(() => new DataCollectorHook(null as any, mockEventPublisher)).toThrow(EvaluatorNotFoundException); + }); + + it('should throw error if eventPublisher is null', () => { + expect(() => new DataCollectorHook(mockEvaluator, null as any)).toThrow(EventPublisherNotFoundException); + }); + }); + + describe('after', () => { + it('should not collect data if flag is not trackable', async () => { + mockEvaluator.isFlagTrackable.mockReturnValue(false); + + const context: HookContext = { + flagKey: 'test-flag', + defaultValue: false, + context: { targetingKey: 'user-1' }, + flagValueType: 'boolean', + clientMetadata: { providerMetadata: { name: 'test' } }, + providerMetadata: { name: 'test' }, + logger: mockLogger, + }; + + const details: EvaluationDetails = { + flagKey: 'test-flag', + value: true, + variant: 'on', + reason: 'TARGETING_MATCH', + flagMetadata: {}, + }; + + await hook.after(context, details); + + expect(mockEvaluator.isFlagTrackable).toHaveBeenCalledWith('test-flag'); + expect(mockEventPublisher.addEvent).not.toHaveBeenCalled(); + }); + + it('should collect data if flag is trackable', async () => { + mockEvaluator.isFlagTrackable.mockReturnValue(true); + + const context: HookContext = { + flagKey: 'test-flag', + defaultValue: false, + context: { targetingKey: 'user-1' }, + flagValueType: 'boolean', + clientMetadata: { providerMetadata: { name: 'test' } }, + providerMetadata: { name: 'test' }, + logger: mockLogger, + }; + + const details: EvaluationDetails = { + flagKey: 'test-flag', + value: true, + variant: 'on', + reason: 'TARGETING_MATCH', + flagMetadata: {}, + }; + + await hook.after(context, details); + + expect(mockEvaluator.isFlagTrackable).toHaveBeenCalledWith('test-flag'); + expect(mockEventPublisher.addEvent).toHaveBeenCalledWith({ + kind: 'feature', + key: 'test-flag', + contextKind: 'user', + default: false, + variation: 'on', + value: true, + userKey: 'user-1', + creationDate: expect.any(Number), + }); + }); + + it('should handle anonymous user correctly', async () => { + mockEvaluator.isFlagTrackable.mockReturnValue(true); + + const context: HookContext = { + flagKey: 'test-flag', + defaultValue: false, + context: { targetingKey: '1234', anonymous: true }, + flagValueType: 'boolean', + clientMetadata: { providerMetadata: { name: 'test' } }, + providerMetadata: { name: 'test' }, + logger: mockLogger, + }; + + const details: EvaluationDetails = { + flagKey: 'test-flag', + value: true, + variant: 'on', + reason: 'TARGETING_MATCH', + flagMetadata: {}, + }; + + await hook.after(context, details); + + expect(mockEventPublisher.addEvent).toHaveBeenCalledWith({ + kind: 'feature', + key: 'test-flag', + contextKind: 'anonymousUser', + default: false, + variation: 'on', + value: true, + userKey: '1234', + creationDate: expect.any(Number), + }); + }); + }); + + describe('error', () => { + it('should not collect data if flag is not trackable', async () => { + mockEvaluator.isFlagTrackable.mockReturnValue(false); + + const context: HookContext = { + flagKey: 'test-flag', + defaultValue: false, + context: { targetingKey: 'user-1' }, + flagValueType: 'boolean', + clientMetadata: { providerMetadata: { name: 'test' } }, + providerMetadata: { name: 'test' }, + logger: mockLogger, + }; + + const error = new Error('Test error'); + + await hook.error(context, error); + + expect(mockEvaluator.isFlagTrackable).toHaveBeenCalledWith('test-flag'); + expect(mockEventPublisher.addEvent).not.toHaveBeenCalled(); + }); + + it('should collect error data if flag is trackable', async () => { + mockEvaluator.isFlagTrackable.mockReturnValue(true); + + const context: HookContext = { + flagKey: 'test-flag', + defaultValue: false, + context: { targetingKey: 'user-1' }, + flagValueType: 'boolean', + clientMetadata: { providerMetadata: { name: 'test' } }, + providerMetadata: { name: 'test' }, + logger: mockLogger, + }; + + const error = new Error('Test error'); + + await hook.error(context, error); + + expect(mockEvaluator.isFlagTrackable).toHaveBeenCalledWith('test-flag'); + expect(mockEventPublisher.addEvent).toHaveBeenCalledWith({ + kind: 'feature', + key: 'test-flag', + contextKind: 'user', + default: true, + variation: 'SdkDefault', + value: false, + userKey: 'user-1', + creationDate: expect.any(Number), + }); + }); + }); +}); diff --git a/libs/providers/go-feature-flag/src/lib/hook/data-collector-hook.ts b/libs/providers/go-feature-flag/src/lib/hook/data-collector-hook.ts new file mode 100644 index 000000000..01807126f --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/hook/data-collector-hook.ts @@ -0,0 +1,96 @@ +import type { Hook, HookContext, EvaluationDetails, JsonValue } from '@openfeature/server-sdk'; +import type { IEvaluator } from '../evaluator/evaluator'; +import type { EventPublisher } from '../service/event-publisher'; +import type { FeatureEvent } from '../model'; +import { EvaluatorNotFoundException, EventPublisherNotFoundException } from '../exception'; +import { getContextKind } from '../helper/event-util'; +import { DEFAULT_TARGETING_KEY } from '../helper/constants'; + +/** + * DataCollectorHook is a hook that collects data during the evaluation of feature flags. + */ +export class DataCollectorHook implements Hook { + private readonly evaluator: IEvaluator; + private readonly eventPublisher: EventPublisher; + + /** + * DataCollectorHook is a hook that collects data during the evaluation of feature flags. + * @param evaluator - service to evaluate the flag + * @param eventPublisher - service to publish events + * @throws Error if evaluator or eventPublisher is null + */ + constructor(evaluator: IEvaluator, eventPublisher: EventPublisher) { + if (!evaluator) { + throw new EvaluatorNotFoundException('Evaluator cannot be null'); + } + if (!eventPublisher) { + throw new EventPublisherNotFoundException('EventPublisher cannot be null'); + } + this.evaluator = evaluator; + this.eventPublisher = eventPublisher; + } + + /** + + * Called immediately after successful flag evaluation. + * @param context - Provides context of innovation + * @param details - Flag evaluation information + * @param _hints - Caller provided data + */ + async after( + context: HookContext, + details: EvaluationDetails, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _hints?: Record, + ): Promise { + if (!this.evaluator.isFlagTrackable(context.flagKey)) { + // If the flag is not trackable, we do not need to collect data. + return; + } + + const eventToPublish: FeatureEvent = { + contextKind: getContextKind(context.context), + kind: 'feature', + creationDate: Math.floor(Date.now() / 1000), + default: false, + key: context.flagKey, + value: details.value, + variation: details.variant ?? 'SdkDefault', + userKey: context.context?.targetingKey ?? DEFAULT_TARGETING_KEY, + }; + + this.eventPublisher.addEvent(eventToPublish); + } + + /** + * Called immediately after an unsuccessful flag evaluation. + * @param context - Provides context of innovation + * @param error - Exception representing what went wrong + * @param hints - Caller provided data + */ + async error( + context: HookContext, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _error: Error, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _hints?: Record, + ): Promise { + if (!this.evaluator.isFlagTrackable(context.flagKey)) { + // If the flag is not trackable, we do not need to collect data. + return; + } + + const eventToPublish: FeatureEvent = { + contextKind: getContextKind(context.context), + kind: 'feature', + key: context.flagKey, + default: true, + variation: 'SdkDefault', + value: context.defaultValue, + userKey: context.context?.targetingKey ?? DEFAULT_TARGETING_KEY, + creationDate: Math.floor(Date.now() / 1000), + }; + + this.eventPublisher.addEvent(eventToPublish); + } +} diff --git a/libs/providers/go-feature-flag/src/lib/hook/enrich-evaluation-context-hook.test.ts b/libs/providers/go-feature-flag/src/lib/hook/enrich-evaluation-context-hook.test.ts new file mode 100644 index 000000000..9fc3d77b0 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/hook/enrich-evaluation-context-hook.test.ts @@ -0,0 +1,122 @@ +import { ExporterMetadata } from '../model'; +import { mockLogger } from '../testutil/mock-logger'; +import { EnrichEvaluationContextHook } from './enrich-evaluation-context-hook'; +import type { HookContext, EvaluationContext } from '@openfeature/server-sdk'; + +describe('EnrichEvaluationContextHook', () => { + let hook: EnrichEvaluationContextHook; + + describe('constructor', () => { + it('should handle null metadata', () => { + hook = new EnrichEvaluationContextHook(undefined); + expect(hook).toBeDefined(); + }); + + it('should handle empty metadata', () => { + hook = new EnrichEvaluationContextHook(new ExporterMetadata()); + expect(hook).toBeDefined(); + }); + + it('should handle metadata with values', () => { + const metadata = new ExporterMetadata().add('version', '1.0.0').add('environment', 'test'); + hook = new EnrichEvaluationContextHook(metadata); + expect(hook).toBeDefined(); + }); + }); + + describe('before', () => { + it('should return original context when no metadata is provided', async () => { + hook = new EnrichEvaluationContextHook(undefined); + + const originalContext: EvaluationContext = { user: 'test-user' }; + + const context: HookContext = { + flagKey: 'test-flag', + defaultValue: false, + context: originalContext, + flagValueType: 'boolean', + clientMetadata: { providerMetadata: { name: 'test' } }, + providerMetadata: { name: 'test' }, + logger: mockLogger, + }; + + const result = await hook.before(context); + + expect(result).toEqual(originalContext); + }); + + it('should enrich context with metadata when provided', async () => { + const metadata = new ExporterMetadata().add('version', '1.0.0').add('environment', 'test'); + hook = new EnrichEvaluationContextHook(metadata); + + const originalContext: EvaluationContext = { user: 'test-user' }; + + const context: HookContext = { + flagKey: 'test-flag', + defaultValue: false, + context: originalContext, + flagValueType: 'boolean', + clientMetadata: { providerMetadata: { name: 'test' } }, + providerMetadata: { name: 'test' }, + logger: mockLogger, + }; + + const result = await hook.before(context); + + // Check that the original context is preserved + expect(result['user']).toBe('test-user'); + + // Check that the metadata is added + expect(result['gofeatureflag']).toEqual(metadata.asObject()); + }); + + it('should merge metadata with existing context', async () => { + const metadata = new ExporterMetadata().add('version', '1.0.0').add('environment', 'test'); + hook = new EnrichEvaluationContextHook(metadata); + + const originalContext: EvaluationContext = { + user: 'test-user', + gofeatureflag: { existing: 'value' }, + }; + + const context: HookContext = { + flagKey: 'test-flag', + defaultValue: false, + context: originalContext, + flagValueType: 'boolean', + clientMetadata: { providerMetadata: { name: 'test' } }, + providerMetadata: { name: 'test' }, + logger: mockLogger, + }; + + const result = await hook.before(context); + + // Check that the original context is preserved + expect(result['user']).toBe('test-user'); + + // Check that the metadata is added (should override existing gofeatureflag) + expect(result['gofeatureflag']).toEqual(metadata.asObject()); + }); + + it('should handle empty metadata object', async () => { + hook = new EnrichEvaluationContextHook(new ExporterMetadata()); + + const originalContext: EvaluationContext = { user: 'test-user' }; + + const context: HookContext = { + flagKey: 'test-flag', + defaultValue: false, + context: originalContext, + flagValueType: 'boolean', + clientMetadata: { providerMetadata: { name: 'test' } }, + providerMetadata: { name: 'test' }, + logger: mockLogger, + }; + + const result = await hook.before(context); + + // Should return original context unchanged + expect(result).toEqual(originalContext); + }); + }); +}); diff --git a/libs/providers/go-feature-flag/src/lib/hook/enrich-evaluation-context-hook.ts b/libs/providers/go-feature-flag/src/lib/hook/enrich-evaluation-context-hook.ts new file mode 100644 index 000000000..ce8256afe --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/hook/enrich-evaluation-context-hook.ts @@ -0,0 +1,44 @@ +import type { EvaluationContext, Hook, HookContext, JsonValue } from '@openfeature/server-sdk'; +import { ExporterMetadata } from '../model'; + +/** + * Enrich the evaluation context with additional information + */ +export class EnrichEvaluationContextHook implements Hook { + private readonly metadata: ExporterMetadata; + + /** + * Constructor of the Hook + * @param metadata - metadata to use in order to enrich the evaluation context + */ + constructor(metadata?: ExporterMetadata) { + if (!metadata) { + this.metadata = new ExporterMetadata(); + return; + } + + this.metadata = metadata; + } + + /** + * Enrich the evaluation context with additional information before the evaluation of the flag + * @param context - The hook context + * @param hints - Caller provided data + * @returns The enriched evaluation context + */ + async before( + context: HookContext, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _hints?: Record, + ): Promise { + const enrichedContext = { ...context.context }; + + if (this.metadata) { + const metadataAsObject = this.metadata?.asObject() ?? {}; + if (Object.keys(metadataAsObject).length > 0) { + enrichedContext['gofeatureflag'] = metadataAsObject; + } + } + return enrichedContext; + } +} diff --git a/libs/providers/go-feature-flag/src/lib/hook/index.ts b/libs/providers/go-feature-flag/src/lib/hook/index.ts new file mode 100644 index 000000000..759b85fe3 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/hook/index.ts @@ -0,0 +1,2 @@ +export { DataCollectorHook } from './data-collector-hook'; +export { EnrichEvaluationContextHook } from './enrich-evaluation-context-hook'; diff --git a/libs/providers/go-feature-flag/src/lib/model.ts b/libs/providers/go-feature-flag/src/lib/model.ts deleted file mode 100644 index 314cb7644..000000000 --- a/libs/providers/go-feature-flag/src/lib/model.ts +++ /dev/null @@ -1,145 +0,0 @@ -import type { ErrorCode, EvaluationContextValue, ResolutionDetails } from '@openfeature/server-sdk'; - -export interface GOFFEvaluationContext { - key: string; - custom?: { - [key: string]: EvaluationContextValue; - }; -} - -/** - * GoFeatureFlagProxyRequest is the request format used to call the GO Feature Flag - * API in the relay-proxy. - * The default value is used if something is failing. - */ -export interface GoFeatureFlagProxyRequest { - evaluationContext: GOFFEvaluationContext; - defaultValue: T; -} - -/** - * GoFeatureFlagProxyResponse is the response from the API. - * It contains the information about the flag you are evaluating. - */ -export interface GoFeatureFlagProxyResponse { - failed: boolean; - trackEvents: boolean; - value: T; - variationType: string; - version?: string; - reason: string | GOFeatureFlagResolutionReasons; - metadata: Record; - errorCode?: ErrorCode; - cacheable: boolean; -} - -/** - * Cache is the interface used to implement an alternative cache for the provider. - */ -export interface Cache { - get: (key: string) => ResolutionDetails | undefined; - set: (key: string, value: ResolutionDetails, options?: Record) => void; - clear: () => void; -} - -/** - * GoFeatureFlagProviderOptions is the object containing all the provider options - * when initializing the open-feature provider. - */ -export interface GoFeatureFlagProviderOptions { - endpoint: string; - timeout?: number; // in millisecond - - // apiKey (optional) If the relay proxy is configured to authenticate the requests, you should provide - // an API Key to the provider. Please ask the administrator of the relay proxy to provide an API Key. - // (This feature is available only if you are using GO Feature Flag relay proxy v1.7.0 or above) - // Default: null - apiKey?: string; - - // cache (optional) set an alternative cache library. - cache?: Cache; - - // disableCache (optional) set to true if you would like that every flag evaluation goes to the GO Feature Flag directly. - disableCache?: boolean; - - // flagCacheSize (optional) is the maximum number of flag events we keep in memory to cache your flags. - // default: 10000 - flagCacheSize?: number; - - // flagCacheTTL (optional) is the time we keep the evaluation in the cache before we consider it as obsolete. - // If you want to keep the value forever you can set the FlagCacheTTL field to -1 - // default: 1 minute - flagCacheTTL?: number; - - // dataFlushInterval (optional) interval time (in millisecond) we use to call the relay proxy to collect data. - // The parameter is used only if the cache is enabled, otherwise the collection of the data is done directly - // when calling the evaluation API. - // default: 1 minute - dataFlushInterval?: number; - - // disableDataCollection set to true if you don't want to collect the usage of flags retrieved in the cache. - disableDataCollection?: boolean; - - // pollInterval is the time in milliseconds to wait between we call the endpoint to detect configuration changes API - // If a negative number is provided, the provider will not poll. - // Default: 30000 - pollInterval?: number; // in milliseconds - - // exporterMetadata (optional) exporter metadata is a set of key-value that will be added to the metadata when calling the - // exporter API. All those information will be added to the event produce by the exporter. - // - // ‼️Important: If you are using a GO Feature Flag relay proxy before version v1.41.0, the information - // of this field will not be added to your feature events. - exporterMetadata?: Record; -} - -// ExporterMetadataValue is the type of the value that can be used in the exporterMetadata -export type ExporterMetadataValue = string | number | boolean; - -// GOFeatureFlagResolutionReasons allows to extends resolution reasons -export declare enum GOFeatureFlagResolutionReasons {} - -export interface DataCollectorRequest { - events: FeatureEvent[]; - meta: Record; -} - -export interface FeatureEvent { - contextKind: string; - creationDate: number; - default: boolean; - key: string; - kind: string; - userKey: string; - value: T; - variation: string; - version?: string; -} - -export interface DataCollectorResponse { - ingestedContentCount: number; -} - -export interface DataCollectorHookOptions { - // dataFlushInterval (optional) interval time (in millisecond) we use to call the relay proxy to collect data. - // The parameter is used only if the cache is enabled, otherwise the collection of the data is done directly - // when calling the evaluation API. - // default: 1 minute - dataFlushInterval?: number; - - // collectUnCachedEvent (optional) set to true if you want to send all events not only the cached evaluations. - collectUnCachedEvaluation?: boolean; - - // exporterMetadata (optional) exporter metadata is a set of key-value that will be added to the metadata when calling the - // exporter API. All those information will be added to the event produce by the exporter. - // - // ‼️Important: If you are using a GO Feature Flag relay proxy before version v1.41.0, the information - // of this field will not be added to your feature events. - exporterMetadata?: Record; -} - -export enum ConfigurationChange { - FLAG_CONFIGURATION_INITIALIZED, - FLAG_CONFIGURATION_UPDATED, - FLAG_CONFIGURATION_NOT_CHANGED, -} diff --git a/libs/providers/go-feature-flag/src/lib/model/evaluation-response.ts b/libs/providers/go-feature-flag/src/lib/model/evaluation-response.ts new file mode 100644 index 000000000..01bf5617a --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/evaluation-response.ts @@ -0,0 +1,41 @@ +import type { JsonValue } from '@openfeature/server-sdk'; + +/** + * EvaluationResponse represents the response from the GO Feature Flag evaluation. + */ +export interface EvaluationResponse { + /** + * Variation is the variation of the flag that was returned by the evaluation. + */ + variationType?: string; + + /** + * trackEvents indicates whether events should be tracked for this evaluation. + */ + trackEvents: boolean; + + /** + * reason is the reason for the evaluation result. + */ + reason?: string; + + /** + * errorCode is the error code for the evaluation result, if any. + */ + errorCode?: string; + + /** + * errorDetails provides additional details about the error, if any. + */ + errorDetails?: string; + + /** + * value is the evaluated value of the flag. + */ + value?: JsonValue; + + /** + * metadata is a dictionary containing additional metadata about the evaluation. + */ + metadata?: Record; +} diff --git a/libs/providers/go-feature-flag/src/lib/model/evaluation-type.ts b/libs/providers/go-feature-flag/src/lib/model/evaluation-type.ts new file mode 100644 index 000000000..d5d226108 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/evaluation-type.ts @@ -0,0 +1,14 @@ +/** + * This enum represents the type of evaluation that can be performed. + */ +export enum EvaluationType { + /** + * InProcess: The evaluation is done in the process of the provider. + */ + InProcess = 'InProcess', + + /** + * Remote: The evaluation is done on the edge (e.g., CDN or API). + */ + Remote = 'Remote', +} diff --git a/libs/providers/go-feature-flag/src/lib/model/event.ts b/libs/providers/go-feature-flag/src/lib/model/event.ts new file mode 100644 index 000000000..c2dce1229 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/event.ts @@ -0,0 +1,4 @@ +import type { FeatureEvent } from './feature-event'; +import type { TrackingEvent } from './tracking-event'; + +export type ExportEvent = FeatureEvent | TrackingEvent; diff --git a/libs/providers/go-feature-flag/src/lib/model/experimentation-rollout.ts b/libs/providers/go-feature-flag/src/lib/model/experimentation-rollout.ts new file mode 100644 index 000000000..5c80ad677 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/experimentation-rollout.ts @@ -0,0 +1,14 @@ +/** + * Represents the rollout period of an experimentation. + */ +export interface ExperimentationRollout { + /** + * The start date of the experimentation rollout. + */ + start: Date; + + /** + * The end date of the experimentation rollout. + */ + end: Date; +} diff --git a/libs/providers/go-feature-flag/src/lib/model/exporter-metadata.test.ts b/libs/providers/go-feature-flag/src/lib/model/exporter-metadata.test.ts new file mode 100644 index 000000000..71d0b29ab --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/exporter-metadata.test.ts @@ -0,0 +1,212 @@ +import { ExporterMetadata } from './exporter-metadata'; + +describe('ExporterMetadata', () => { + let exporterMetadata: ExporterMetadata; + + beforeEach(() => { + exporterMetadata = new ExporterMetadata(); + }); + + describe('add method', () => { + it('should add string metadata', () => { + exporterMetadata.add('testKey', 'testValue'); + const result = exporterMetadata.asObject(); + + expect(result).toEqual({ + testKey: 'testValue', + }); + }); + + it('should add boolean metadata', () => { + exporterMetadata.add('enabled', true); + exporterMetadata.add('disabled', false); + const result = exporterMetadata.asObject(); + + expect(result).toEqual({ + enabled: true, + disabled: false, + }); + }); + + it('should add number metadata', () => { + exporterMetadata.add('count', 42); + exporterMetadata.add('version', 1.5); + const result = exporterMetadata.asObject(); + + expect(result).toEqual({ + count: 42, + version: 1.5, + }); + }); + + it('should overwrite existing metadata with the same key', () => { + exporterMetadata.add('key', 'initialValue'); + exporterMetadata.add('key', 'updatedValue'); + const result = exporterMetadata.asObject(); + + expect(result).toEqual({ + key: 'updatedValue', + }); + }); + + it('should handle multiple metadata entries', () => { + exporterMetadata.add('stringKey', 'stringValue'); + exporterMetadata.add('booleanKey', true); + exporterMetadata.add('numberKey', 123); + const result = exporterMetadata.asObject(); + + expect(result).toEqual({ + stringKey: 'stringValue', + booleanKey: true, + numberKey: 123, + }); + }); + + it('should handle empty string values', () => { + exporterMetadata.add('emptyKey', ''); + const result = exporterMetadata.asObject(); + + expect(result).toEqual({ + emptyKey: '', + }); + }); + + it('should handle zero number values', () => { + exporterMetadata.add('zeroKey', 0); + const result = exporterMetadata.asObject(); + + expect(result).toEqual({ + zeroKey: 0, + }); + }); + }); + + describe('asObject method', () => { + it('should return empty object when no metadata is added', () => { + const result = exporterMetadata.asObject(); + + expect(result).toEqual({}); + }); + + it('should return immutable object', () => { + exporterMetadata.add('testKey', 'testValue'); + const result = exporterMetadata.asObject(); + + // Verify the object is frozen (immutable) + expect(Object.isFrozen(result)).toBe(true); + }); + + it('should return a new object instance each time', () => { + exporterMetadata.add('testKey', 'testValue'); + const result1 = exporterMetadata.asObject(); + const result2 = exporterMetadata.asObject(); + + expect(result1).toEqual(result2); + expect(result1).not.toBe(result2); // Different object instances + }); + + it('should not be affected by subsequent add operations', () => { + exporterMetadata.add('initialKey', 'initialValue'); + const result1 = exporterMetadata.asObject(); + + exporterMetadata.add('newKey', 'newValue'); + const result2 = exporterMetadata.asObject(); + + expect(result1).toEqual({ + initialKey: 'initialValue', + }); + expect(result2).toEqual({ + initialKey: 'initialValue', + newKey: 'newValue', + }); + }); + + it('should handle special characters in keys', () => { + exporterMetadata.add('key-with-dashes', 'value1'); + exporterMetadata.add('key_with_underscores', 'value2'); + exporterMetadata.add('keyWithCamelCase', 'value3'); + exporterMetadata.add('key with spaces', 'value4'); + const result = exporterMetadata.asObject(); + + expect(result).toEqual({ + 'key-with-dashes': 'value1', + key_with_underscores: 'value2', + keyWithCamelCase: 'value3', + 'key with spaces': 'value4', + }); + }); + + it('should handle special characters in values', () => { + exporterMetadata.add('key1', 'value with spaces'); + exporterMetadata.add('key2', 'value-with-dashes'); + exporterMetadata.add('key3', 'value_with_underscores'); + exporterMetadata.add('key4', 'valueWithCamelCase'); + const result = exporterMetadata.asObject(); + + expect(result).toEqual({ + key1: 'value with spaces', + key2: 'value-with-dashes', + key3: 'value_with_underscores', + key4: 'valueWithCamelCase', + }); + }); + }); + + describe('integration tests', () => { + it('should maintain state across multiple operations', () => { + // Add initial metadata + exporterMetadata.add('app', 'my-app'); + exporterMetadata.add('version', '1.0.0'); + + let result = exporterMetadata.asObject(); + expect(result).toEqual({ + app: 'my-app', + version: '1.0.0', + }); + + // Add more metadata + exporterMetadata.add('environment', 'production'); + exporterMetadata.add('debug', false); + + result = exporterMetadata.asObject(); + expect(result).toEqual({ + app: 'my-app', + version: '1.0.0', + environment: 'production', + debug: false, + }); + + // Update existing metadata + exporterMetadata.add('version', '2.0.0'); + + result = exporterMetadata.asObject(); + expect(result).toEqual({ + app: 'my-app', + version: '2.0.0', + environment: 'production', + debug: false, + }); + }); + + it('should handle complex metadata scenarios', () => { + // Simulate a real-world scenario + exporterMetadata.add('sdk', 'go-feature-flag-server'); + exporterMetadata.add('sdkVersion', '1.0.0'); + exporterMetadata.add('endpoint', 'http://localhost:1031'); + exporterMetadata.add('timeout', 5000); + exporterMetadata.add('retryEnabled', true); + exporterMetadata.add('maxRetries', 3); + + const result = exporterMetadata.asObject(); + + expect(result).toEqual({ + sdk: 'go-feature-flag-server', + sdkVersion: '1.0.0', + endpoint: 'http://localhost:1031', + timeout: 5000, + retryEnabled: true, + maxRetries: 3, + }); + }); + }); +}); diff --git a/libs/providers/go-feature-flag/src/lib/model/exporter-metadata.ts b/libs/providers/go-feature-flag/src/lib/model/exporter-metadata.ts new file mode 100644 index 000000000..01e0fdc53 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/exporter-metadata.ts @@ -0,0 +1,24 @@ +/** + * This class represents the exporter metadata that will be sent in your evaluation data collector + */ +export class ExporterMetadata { + private metadata: Record = {}; + + /** + * Add a metadata to the exporter + * @param key - the key of the metadata + * @param value - the value of the metadata + */ + add(key: string, value: string | boolean | number): ExporterMetadata { + this.metadata[key] = value; + return this; + } + + /** + * Return the metadata as an immutable object + * @returns the metadata as an immutable object + */ + asObject(): Record { + return Object.freeze({ ...this.metadata }); + } +} diff --git a/libs/providers/go-feature-flag/src/lib/model/exporter-request.ts b/libs/providers/go-feature-flag/src/lib/model/exporter-request.ts new file mode 100644 index 000000000..e54f921c3 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/exporter-request.ts @@ -0,0 +1,16 @@ +import type { ExportEvent } from './event'; + +/** + * ExporterRequest is an interface that represents the request to the GO Feature Flag data collector API. + */ +export interface ExporterRequest { + /** + * metadata is the metadata that will be sent in your evaluation data collector. + */ + meta: Record; + + /** + * events is the list of events that will be sent in your evaluation data collector. + */ + events: ExportEvent[]; +} diff --git a/libs/providers/go-feature-flag/src/lib/model/feature-event.ts b/libs/providers/go-feature-flag/src/lib/model/feature-event.ts new file mode 100644 index 000000000..2262a9816 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/feature-event.ts @@ -0,0 +1,52 @@ +import type { JsonValue } from '@openfeature/server-sdk'; + +/** + * This interface represents a feature event, used to send evaluation events to the GO Feature Flag server. + */ +export interface FeatureEvent { + /** + * Kind is the kind of event. + */ + kind: 'feature'; + + /** + * Creation date of the event in seconds since epoch. + */ + creationDate: number; + + /** + * ContextKind is the kind of context that generated an event. + */ + contextKind: string; + + /** + * Feature flag name or key. + */ + key: string; + + /** + * User key is the unique identifier for the user or context (the targetingKey). + */ + userKey: string; + + /** + * Default is true if the feature is using the default value. + */ + default: boolean; + + /** + * Value of the feature flag evaluation result. + */ + value?: JsonValue; + + /** + * Variation is the variation of the feature flag that was returned by the evaluation. + */ + variation: string; + + /** + * Version is the version of the feature flag that was evaluated. + * If the feature flag is not versioned, this will be null or empty. + */ + version?: string; +} diff --git a/libs/providers/go-feature-flag/src/lib/model/flag-base.ts b/libs/providers/go-feature-flag/src/lib/model/flag-base.ts new file mode 100644 index 000000000..d22445814 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/flag-base.ts @@ -0,0 +1,53 @@ +import type { JsonValue } from '@openfeature/server-sdk'; +import type { ExperimentationRollout } from './experimentation-rollout'; +import type { Rule } from './rule'; + +/** + * Represents the base structure of a feature flag for GO Feature Flag. + */ +export interface FlagBase { + /** + * The variations available for this flag. + */ + variations?: Record; + + /** + * The list of targeting rules for this flag. + */ + targeting?: Rule[]; + + /** + * The key used for bucketing users. + */ + bucketingKey?: string; + + /** + * The default rule to apply if no targeting rule matches. + */ + defaultRule: Rule; + + /** + * The experimentation rollout configuration. + */ + experimentation?: ExperimentationRollout; + + /** + * Indicates if events should be tracked for this flag. + */ + trackEvents?: boolean; + + /** + * Indicates if the flag is disabled. + */ + disable?: boolean; + + /** + * The version of the flag. + */ + version?: string; + + /** + * Additional metadata for the flag. + */ + metadata?: Record; +} diff --git a/libs/providers/go-feature-flag/src/lib/model/flag-config-request.ts b/libs/providers/go-feature-flag/src/lib/model/flag-config-request.ts new file mode 100644 index 000000000..3a8b7973c --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/flag-config-request.ts @@ -0,0 +1,9 @@ +/** + * FlagConfigRequest represents the request payload for flag configuration. + */ +export interface FlagConfigRequest { + /** + * List of flags to retrieve, if not set or empty, we will retrieve all available flags. + */ + flags?: string[]; +} diff --git a/libs/providers/go-feature-flag/src/lib/model/flag-config-response.ts b/libs/providers/go-feature-flag/src/lib/model/flag-config-response.ts new file mode 100644 index 000000000..816c0eac8 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/flag-config-response.ts @@ -0,0 +1,27 @@ +import type { JsonValue } from '@openfeature/server-sdk'; +import type { Flag } from './flag'; + +/** + * FlagConfigResponse is a class that represents the response of the flag configuration. + */ +export interface FlagConfigResponse { + /** + * Flags is a dictionary that contains the flag key and its corresponding Flag object. + */ + flags: Record; + + /** + * EvaluationContextEnrichment is a dictionary that contains additional context for the evaluation of flags. + */ + evaluationContextEnrichment: Record; + + /** + * Etag is a string that represents the entity tag of the flag configuration response. + */ + etag?: string; + + /** + * LastUpdated is a nullable DateTime that represents the last time the flag configuration was updated. + */ + lastUpdated?: Date; +} diff --git a/libs/providers/go-feature-flag/src/lib/model/flag-context.ts b/libs/providers/go-feature-flag/src/lib/model/flag-context.ts new file mode 100644 index 000000000..ade7bc229 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/flag-context.ts @@ -0,0 +1,17 @@ +import type { JsonValue } from '@openfeature/server-sdk'; + +/** + * Represents the context of a flag in the GO Feature Flag system. + * Contains the default SDK value and evaluation context enrichment. + */ +export interface FlagContext { + /** + * The default value to return from the SDK if no rule matches. + */ + defaultSdkValue?: unknown; + + /** + * Additional context values to enrich the evaluation context. + */ + evaluationContextEnrichment: Record; +} diff --git a/libs/providers/go-feature-flag/src/lib/model/flag.ts b/libs/providers/go-feature-flag/src/lib/model/flag.ts new file mode 100644 index 000000000..d1907a7f4 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/flag.ts @@ -0,0 +1,12 @@ +import type { FlagBase } from './flag-base'; +import type { ScheduledStep } from './scheduled-step'; + +/** + * Represents a feature flag for GO Feature Flag. + */ +export interface Flag extends FlagBase { + /** + * The list of scheduled rollout steps for this flag. + */ + scheduledRollout?: ScheduledStep[]; +} diff --git a/libs/providers/go-feature-flag/src/lib/model/index.ts b/libs/providers/go-feature-flag/src/lib/model/index.ts new file mode 100644 index 000000000..d7533bc4e --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/index.ts @@ -0,0 +1,33 @@ +// Export all types and classes from the model directory + +// Event-related exports +export * from './event'; +export * from './feature-event'; +export * from './tracking-event'; + +// Exporter-related exports +export * from './exporter-request'; +export * from './exporter-metadata'; + +// Flag configuration exports +export * from './flag-config-request'; +export * from './flag-config-response'; + +// Flag-related exports +export * from './flag'; +export * from './flag-base'; +export * from './flag-context'; + +// Rule and rollout exports +export * from './rule'; +export * from './progressive-rollout'; +export * from './progressive-rollout-step'; +export * from './experimentation-rollout'; +export * from './scheduled-step'; + +// Evaluation exports +export * from './evaluation-type'; +export * from './evaluation-response'; + +// WASM-related exports +export * from './wasm-input'; diff --git a/libs/providers/go-feature-flag/src/lib/model/progressive-rollout-step.ts b/libs/providers/go-feature-flag/src/lib/model/progressive-rollout-step.ts new file mode 100644 index 000000000..e045dd5f8 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/progressive-rollout-step.ts @@ -0,0 +1,19 @@ +/** + * Represents a step in the progressive rollout of a feature flag. + */ +export interface ProgressiveRolloutStep { + /** + * The variation to be served at this rollout step. + */ + variation?: string; + + /** + * The percentage of users to receive this variation at this step. + */ + percentage?: number; + + /** + * The date when this rollout step becomes active. + */ + date: Date; +} diff --git a/libs/providers/go-feature-flag/src/lib/model/progressive-rollout.ts b/libs/providers/go-feature-flag/src/lib/model/progressive-rollout.ts new file mode 100644 index 000000000..98b840805 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/progressive-rollout.ts @@ -0,0 +1,16 @@ +import type { ProgressiveRolloutStep } from './progressive-rollout-step'; + +/** + * Represents the progressive rollout of a feature flag. + */ +export interface ProgressiveRollout { + /** + * The initial step of the progressive rollout. + */ + initial: ProgressiveRolloutStep; + + /** + * The end step of the progressive rollout. + */ + end: ProgressiveRolloutStep; +} diff --git a/libs/providers/go-feature-flag/src/lib/model/rule.ts b/libs/providers/go-feature-flag/src/lib/model/rule.ts new file mode 100644 index 000000000..88f481730 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/rule.ts @@ -0,0 +1,36 @@ +import type { ProgressiveRollout } from './progressive-rollout'; + +/** + * Represents a rule in the GO Feature Flag system. + */ +export interface Rule { + /** + * The name of the rule. + */ + name?: string; + + /** + * The query associated with the rule. + */ + query?: string; + + /** + * The variation to serve if the rule matches. + */ + variation?: string; + + /** + * The percentage mapping for variations. + */ + percentage?: Record; + + /** + * Indicates if the rule is disabled. + */ + disable?: boolean; + + /** + * The progressive rollout configuration for this rule. + */ + progressiveRollout?: ProgressiveRollout; +} diff --git a/libs/providers/go-feature-flag/src/lib/model/scheduled-step.ts b/libs/providers/go-feature-flag/src/lib/model/scheduled-step.ts new file mode 100644 index 000000000..fbe7b7caf --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/scheduled-step.ts @@ -0,0 +1,11 @@ +import type { FlagBase } from './flag-base'; + +/** + * Represents a scheduled step in the rollout of a feature flag. + */ +export interface ScheduledStep extends FlagBase { + /** + * The date of the scheduled step. + */ + date?: Date; +} diff --git a/libs/providers/go-feature-flag/src/lib/model/tracking-event.ts b/libs/providers/go-feature-flag/src/lib/model/tracking-event.ts new file mode 100644 index 000000000..31cf8edce --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/tracking-event.ts @@ -0,0 +1,42 @@ +import type { EvaluationContext, TrackingEventDetails } from '@openfeature/server-sdk'; + +/** + * TrackingEvent is an interface that represents a tracking event for a feature flag. + * A tracking event is generated when we call the track method on the client. + */ +export interface TrackingEvent { + /** + * Kind is the kind of event. + */ + kind: 'tracking'; + + /** + * Creation date of the event in seconds since epoch. + */ + creationDate: number; + + /** + * ContextKind is the kind of context that generated an event. + */ + contextKind: string; + + /** + * Feature flag name or key. + */ + key: string; + + /** + * User key is the unique identifier for the user or context (the targetingKey). + */ + userKey: string; + + /** + * EvaluationContext contains the evaluation context used for the tracking. + */ + evaluationContext?: EvaluationContext; + + /** + * TrackingDetails contains the details of the tracking event. + */ + trackingEventDetails?: TrackingEventDetails; +} diff --git a/libs/providers/go-feature-flag/src/lib/model/wasm-input.ts b/libs/providers/go-feature-flag/src/lib/model/wasm-input.ts new file mode 100644 index 000000000..2c0dfe218 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/model/wasm-input.ts @@ -0,0 +1,28 @@ +import type { JsonValue } from '@openfeature/server-sdk'; +import type { Flag } from './flag'; +import type { FlagContext } from './flag-context'; + +/** + * Represents the input to the WASM module, containing the flag key, flag, evaluation context, and flag context. + */ +export interface WasmInput { + /** + * Flag key to be evaluated. + */ + flagKey: string; + + /** + * Flag to be evaluated. + */ + flag: Flag; + + /** + * Evaluation context for a flag evaluation. + */ + evalContext: Record; + + /** + * Flag context containing default SDK value and evaluation context enrichment. + */ + flagContext: FlagContext; +} diff --git a/libs/providers/go-feature-flag/src/lib/service/api.test.ts b/libs/providers/go-feature-flag/src/lib/service/api.test.ts new file mode 100644 index 000000000..efc1cc655 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/service/api.test.ts @@ -0,0 +1,559 @@ +import { GoFeatureFlagApi } from './api'; +import type { GoFeatureFlagProviderOptions } from '../go-feature-flag-provider-options'; +import type { FetchAPI } from '../helper/fetch-api'; +import { ExporterMetadata, type FeatureEvent, type TrackingEvent } from '../model'; +import { + FlagConfigurationEndpointNotFoundException, + ImpossibleToRetrieveConfigurationException, + UnauthorizedException, + ImpossibleToSendDataToTheCollectorException, + InvalidOptionsException, +} from '../exception'; + +// Mock Response class +class MockResponse { + public status: number; + public headers: Headers; + public body: string; + public ok: boolean; + + constructor(status: number, body = '', headers: Record = {}) { + this.status = status; + this.body = body; + this.headers = new Headers(headers); + this.ok = status >= 200 && status < 300; + } + + async text(): Promise { + return this.body; + } + + async json(): Promise { + return JSON.parse(this.body); + } +} + +// Mock fetch implementation +class MockFetch { + private responses: Map = new Map(); + private lastRequest?: { + url: string; + options: RequestInit; + }; + + setResponse(url: string, response: MockResponse): void { + this.responses.set(url, response); + } + + setResponseByStatus(status: string, response: MockResponse): void { + this.responses.set(status, response); + } + + getLastRequest() { + return this.lastRequest; + } + + reset(): void { + this.responses.clear(); + this.lastRequest = undefined; + } + + async fetch(url: string, options: RequestInit = {}): Promise { + this.lastRequest = { url, options }; + + // Handle AbortSignal for timeout tests + if (options.signal) { + const signal = options.signal as AbortSignal; + if (signal.aborted) { + throw new Error('Request aborted'); + } + + // For timeout tests, we'll simulate a delay and then check if aborted + if (url.includes('timeout')) { + await new Promise((resolve) => setTimeout(resolve, 100)); + if (signal.aborted) { + throw new Error('Request aborted'); + } + } + } + + // Check if we have a specific response for this URL + if (this.responses.has(url)) { + return this.responses.get(url)! as unknown as Response; + } + + // Check if we have a response by status code + const statusMatch = url.match(/(\d{3})/); + if (statusMatch && this.responses.has(statusMatch[1])) { + return this.responses.get(statusMatch[1])! as unknown as Response; + } + + // Check if we have a response by status code in the responses map + for (const [key, response] of this.responses.entries()) { + if (key.match(/^\d{3}$/) && response.status === parseInt(key)) { + return response as unknown as Response; + } + } + + // Default response + return new MockResponse(200, '{}') as unknown as Response; + } +} + +describe('GoFeatureFlagApi', () => { + let mockFetch: MockFetch; + let fetchImplementation: FetchAPI; + + beforeEach(() => { + mockFetch = new MockFetch(); + fetchImplementation = mockFetch.fetch.bind(mockFetch) as FetchAPI; + + // Mock global fetch for tests that don't provide fetchImplementation + (global as any).fetch = fetchImplementation; + }); + + afterEach(() => { + mockFetch.reset(); + // Clean up global fetch mock + delete (global as any).fetch; + }); + + describe('Constructor', () => { + it('should throw if options are missing', () => { + expect(() => new GoFeatureFlagApi(null as any)).toThrow(InvalidOptionsException); + }); + }); + + describe('RetrieveFlagConfiguration', () => { + const baseOptions: GoFeatureFlagProviderOptions = { + endpoint: 'http://localhost:8080', + fetchImplementation, + }; + + it('should call the configuration endpoint', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponse('http://localhost:8080/v1/flag/configuration', new MockResponse(200, '{}')); + + await api.retrieveFlagConfiguration(); + + const request = mockFetch.getLastRequest(); + expect(request!.url).toBe('http://localhost:8080/v1/flag/configuration'); + expect(request!.options.method).toBe('POST'); + expect(request!.options.body).toBe(JSON.stringify({ flags: [] })); + }); + + it('should include API key in authorization header when provided', async () => { + const options: GoFeatureFlagProviderOptions = { + ...baseOptions, + apiKey: 'my-api-key', + }; + const api = new GoFeatureFlagApi(options); + mockFetch.setResponse('http://localhost:8080/v1/flag/configuration', new MockResponse(200, '{}')); + + await api.retrieveFlagConfiguration(); + + const request = mockFetch.getLastRequest(); + expect(request!.options.headers).toHaveProperty('Authorization', 'Bearer my-api-key'); + }); + + it('should not include authorization header when API key is not provided', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponse('http://localhost:8080/v1/flag/configuration', new MockResponse(200, '{}')); + + await api.retrieveFlagConfiguration(); + + const request = mockFetch.getLastRequest(); + expect(request?.options.headers).not.toHaveProperty('Authorization'); + }); + + it('should include content-type header', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponse('http://localhost:8080/v1/flag/configuration', new MockResponse(200, '{}')); + + await api.retrieveFlagConfiguration(); + + const request = mockFetch.getLastRequest(); + expect(request?.options.headers).toHaveProperty('Content-Type', 'application/json'); + }); + + it('should include If-None-Match header when etag is provided', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponse('http://localhost:8080/v1/flag/configuration', new MockResponse(200, '{}')); + + await api.retrieveFlagConfiguration('12345'); + + const request = mockFetch.getLastRequest(); + expect(request?.options.headers).toHaveProperty('If-None-Match', '12345'); + }); + + it('should include flags in request body when provided', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponse('http://localhost:8080/v1/flag/configuration', new MockResponse(200, '{}')); + + await api.retrieveFlagConfiguration(undefined, ['flag1', 'flag2']); + + const request = mockFetch.getLastRequest(); + expect(request?.options.body).toBe(JSON.stringify({ flags: ['flag1', 'flag2'] })); + }); + + it('should throw UnauthorizedException on 401 response', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponseByStatus('401', new MockResponse(401, 'Unauthorized')); + + await expect(api.retrieveFlagConfiguration()).rejects.toThrow(UnauthorizedException); + }); + + it('should throw UnauthorizedException on 403 response', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponseByStatus('403', new MockResponse(403, 'Forbidden')); + + await expect(api.retrieveFlagConfiguration()).rejects.toThrow(UnauthorizedException); + }); + + it('should throw ImpossibleToRetrieveConfigurationException on 400 response', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponseByStatus('400', new MockResponse(400, 'Bad Request')); + + await expect(api.retrieveFlagConfiguration()).rejects.toThrow(ImpossibleToRetrieveConfigurationException); + }); + + it('should throw ImpossibleToRetrieveConfigurationException on 500 response', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponseByStatus('500', new MockResponse(500, 'Internal Server Error')); + + await expect(api.retrieveFlagConfiguration()).rejects.toThrow(ImpossibleToRetrieveConfigurationException); + }); + + it('should throw FlagConfigurationEndpointNotFoundException on 404 response', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponseByStatus('404', new MockResponse(404, 'Not Found')); + + await expect(api.retrieveFlagConfiguration()).rejects.toThrow(FlagConfigurationEndpointNotFoundException); + }); + + it('should return valid FlagConfigResponse on 200 response', async () => { + const api = new GoFeatureFlagApi(baseOptions); + const responseBody = JSON.stringify({ + flags: { + TEST: { + variations: { + on: true, + off: false, + }, + defaultRule: { variation: 'off' }, + }, + TEST2: { + variations: { + on: true, + off: false, + }, + defaultRule: { variation: 'on' }, + }, + }, + evaluationContextEnrichment: { + env: 'production', + }, + }); + + mockFetch.setResponse( + 'http://localhost:8080/v1/flag/configuration', + new MockResponse(200, responseBody, { + etag: '"123456789"', + 'last-modified': 'Wed, 21 Oct 2015 07:28:00 GMT', + }), + ); + + const result = await api.retrieveFlagConfiguration(); + + expect(result.etag).toBe('"123456789"'); + expect(result.lastUpdated).toEqual(new Date('Wed, 21 Oct 2015 07:28:00 GMT')); + expect(result.flags).toHaveProperty('TEST'); + expect(result.flags).toHaveProperty('TEST2'); + expect(result.evaluationContextEnrichment).toHaveProperty('env', 'production'); + }); + + it('should handle 304 response without flags and context', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponseByStatus( + '304', + new MockResponse(304, '', { + etag: '"123456789"', + 'last-modified': 'Wed, 21 Oct 2015 07:28:00 GMT', + }), + ); + + const result = await api.retrieveFlagConfiguration(); + + expect(result.etag).toBe('"123456789"'); + expect(result.lastUpdated).toEqual(new Date('Wed, 21 Oct 2015 07:28:00 GMT')); + expect(result.flags).toEqual({}); + expect(result.evaluationContextEnrichment).toEqual({}); + }); + + it('should handle invalid last-modified header', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponse( + 'http://localhost:8080/v1/flag/configuration', + new MockResponse(200, '{}', { + etag: '"123456789"', + 'last-modified': 'invalid-date', + }), + ); + + const result = await api.retrieveFlagConfiguration(); + + expect(result.lastUpdated?.getTime()).toBeNaN(); + }); + + it('should handle network errors', async () => { + const mockFetchWithError = async () => { + throw new Error('Network error'); + }; + + const optionsWithErrorFetch: GoFeatureFlagProviderOptions = { + ...baseOptions, + fetchImplementation: mockFetchWithError, + }; + const apiWithError = new GoFeatureFlagApi(optionsWithErrorFetch); + + await expect(apiWithError.retrieveFlagConfiguration()).rejects.toThrow( + ImpossibleToRetrieveConfigurationException, + ); + }); + + it('should handle timeout', async () => { + const mockFetchWithDelay = async (url: string, options: RequestInit = {}) => { + await new Promise((resolve) => setTimeout(resolve, 100)); + if (options.signal && (options.signal as AbortSignal).aborted) { + throw new Error('Request aborted'); + } + return new MockResponse(200, '{}'); + }; + + const optionsWithDelayFetch: GoFeatureFlagProviderOptions = { + ...baseOptions, + fetchImplementation: mockFetchWithDelay as unknown as FetchAPI, + timeout: 1, + }; + const apiWithDelay = new GoFeatureFlagApi(optionsWithDelayFetch); + + await expect(apiWithDelay.retrieveFlagConfiguration()).rejects.toThrow( + ImpossibleToRetrieveConfigurationException, + ); + }); + }); + + describe('SendEventToDataCollector', () => { + const baseOptions: GoFeatureFlagProviderOptions = { + endpoint: 'http://localhost:8080', + fetchImplementation, + }; + + it('should call the data collector endpoint', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponse('http://localhost:8080/v1/data/collector', new MockResponse(200, 'Success')); + + const events: FeatureEvent[] | TrackingEvent[] = []; + const metadata: ExporterMetadata = new ExporterMetadata(); + + await api.sendEventToDataCollector(events, metadata); + + const request = mockFetch.getLastRequest(); + expect(request?.url).toBe('http://localhost:8080/v1/data/collector'); + expect(request?.options.method).toBe('POST'); + }); + + it('should include API key in authorization header when provided', async () => { + const options: GoFeatureFlagProviderOptions = { + ...baseOptions, + apiKey: 'my-api-key', + }; + const api = new GoFeatureFlagApi(options); + mockFetch.setResponse('http://localhost:8080/v1/data/collector', new MockResponse(200, 'Success')); + + const events: FeatureEvent[] | TrackingEvent[] = []; + const metadata: ExporterMetadata = new ExporterMetadata(); + + await api.sendEventToDataCollector(events, metadata); + + const request = mockFetch.getLastRequest(); + expect(request?.options.headers).toHaveProperty('Authorization', 'Bearer my-api-key'); + }); + + it('should not include authorization header when API key is not provided', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponse('http://localhost:8080/v1/data/collector', new MockResponse(200, 'Success')); + + const events: FeatureEvent[] | TrackingEvent[] = []; + const metadata: ExporterMetadata = new ExporterMetadata(); + + await api.sendEventToDataCollector(events, metadata); + + const request = mockFetch.getLastRequest(); + expect(request?.options.headers).not.toHaveProperty('Authorization'); + }); + + it('should include content-type header', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponse('http://localhost:8080/v1/data/collector', new MockResponse(200, 'Success')); + + const events: FeatureEvent[] | TrackingEvent[] = []; + const metadata: ExporterMetadata = new ExporterMetadata(); + + await api.sendEventToDataCollector(events, metadata); + + const request = mockFetch.getLastRequest(); + expect(request?.options.headers).toHaveProperty('Content-Type', 'application/json'); + }); + + it('should include events and metadata in request body', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponse('http://localhost:8080/v1/data/collector', new MockResponse(200, 'Success')); + + const events: FeatureEvent[] | TrackingEvent[] = [ + { + kind: 'feature', + creationDate: 1750406145, + contextKind: 'user', + key: 'TEST', + userKey: '642e135a-1df9-4419-a3d3-3c42e0e67509', + default: false, + value: 'toto', + variation: 'on', + version: '1.0.0', + }, + ]; + + const metadata: ExporterMetadata = new ExporterMetadata().add('env', 'production'); + + await api.sendEventToDataCollector(events, metadata); + + const request = mockFetch.getLastRequest(); + const body = JSON.parse(request?.options.body as string); + expect(body.meta).toEqual({ env: 'production' }); + expect(body.events).toHaveLength(1); + expect(JSON.stringify(body.events)).toBe(JSON.stringify(events)); + }); + + it('should handle tracking events', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponse('http://localhost:8080/v1/data/collector', new MockResponse(200, 'Success')); + + const events: FeatureEvent[] | TrackingEvent[] = [ + { + kind: 'tracking', + creationDate: 1750406145, + contextKind: 'user', + key: 'TEST2', + userKey: '642e135a-1df9-4419-a3d3-3c42e0e67509', + trackingEventDetails: { + action: 'click', + label: 'button1', + value: 1, + }, + }, + ]; + + const metadata: ExporterMetadata = new ExporterMetadata().add('env', 'production'); + + await api.sendEventToDataCollector(events, metadata); + + const request = mockFetch.getLastRequest(); + const body = JSON.parse(request?.options.body as string); + expect(body.events).toHaveLength(1); + expect(body.events[0].kind).toBe('tracking'); + expect(body.events[0].trackingEventDetails).toEqual({ + action: 'click', + label: 'button1', + value: 1, + }); + }); + + it('should throw UnauthorizedException on 401 response', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponseByStatus('401', new MockResponse(401, 'Unauthorized')); + + const events: FeatureEvent[] | TrackingEvent[] = []; + const metadata: ExporterMetadata = new ExporterMetadata(); + + await expect(api.sendEventToDataCollector(events, metadata)).rejects.toThrow(UnauthorizedException); + }); + + it('should throw UnauthorizedException on 403 response', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponseByStatus('403', new MockResponse(403, 'Forbidden')); + + const events: FeatureEvent[] | TrackingEvent[] = []; + const metadata: ExporterMetadata = new ExporterMetadata(); + + await expect(api.sendEventToDataCollector(events, metadata)).rejects.toThrow(UnauthorizedException); + }); + + it('should throw ImpossibleToSendDataToTheCollectorException on 400 response', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponseByStatus('400', new MockResponse(400, 'Bad Request')); + + const events: FeatureEvent[] | TrackingEvent[] = []; + const metadata: ExporterMetadata = new ExporterMetadata(); + + await expect(api.sendEventToDataCollector(events, metadata)).rejects.toThrow( + ImpossibleToSendDataToTheCollectorException, + ); + }); + + it('should throw ImpossibleToSendDataToTheCollectorException on 500 response', async () => { + const api = new GoFeatureFlagApi(baseOptions); + mockFetch.setResponseByStatus('500', new MockResponse(500, 'Internal Server Error')); + + const events: FeatureEvent[] | TrackingEvent[] = []; + const metadata: ExporterMetadata = new ExporterMetadata(); + + await expect(api.sendEventToDataCollector(events, metadata)).rejects.toThrow( + ImpossibleToSendDataToTheCollectorException, + ); + }); + + it('should handle network errors', async () => { + const mockFetchWithError = async () => { + throw new Error('Network error'); + }; + + const optionsWithErrorFetch: GoFeatureFlagProviderOptions = { + ...baseOptions, + fetchImplementation: mockFetchWithError, + }; + const apiWithError = new GoFeatureFlagApi(optionsWithErrorFetch); + + const events: FeatureEvent[] | TrackingEvent[] = []; + const metadata: ExporterMetadata = new ExporterMetadata(); + + await expect(apiWithError.sendEventToDataCollector(events, metadata)).rejects.toThrow( + ImpossibleToSendDataToTheCollectorException, + ); + }); + + it('should handle timeout', async () => { + const mockFetchWithDelay = async (url: string, options: RequestInit = {}) => { + await new Promise((resolve) => setTimeout(resolve, 100)); + if (options.signal && (options.signal as AbortSignal).aborted) { + throw new Error('Request aborted'); + } + return new MockResponse(200, 'Success'); + }; + + const optionsWithDelayFetch: GoFeatureFlagProviderOptions = { + ...baseOptions, + fetchImplementation: mockFetchWithDelay as unknown as FetchAPI, + timeout: 1, + }; + const apiWithDelay = new GoFeatureFlagApi(optionsWithDelayFetch); + + const events: FeatureEvent[] | TrackingEvent[] = []; + const metadata: ExporterMetadata = new ExporterMetadata(); + + await expect(apiWithDelay.sendEventToDataCollector(events, metadata)).rejects.toThrow( + ImpossibleToSendDataToTheCollectorException, + ); + }); + }); +}); diff --git a/libs/providers/go-feature-flag/src/lib/service/api.ts b/libs/providers/go-feature-flag/src/lib/service/api.ts new file mode 100644 index 000000000..889f3f5fa --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/service/api.ts @@ -0,0 +1,223 @@ +import { type FetchAPI, isomorphicFetch } from '../helper/fetch-api'; +import type { GoFeatureFlagProviderOptions } from '../go-feature-flag-provider-options'; +import type { ExporterMetadata, ExporterRequest, ExportEvent, FlagConfigRequest, FlagConfigResponse } from '../model'; +import type { Logger } from '@openfeature/server-sdk'; +import { + APPLICATION_JSON, + BEARER_TOKEN, + HTTP_HEADER_AUTHORIZATION, + HTTP_HEADER_CONTENT_TYPE, + HTTP_HEADER_ETAG, + HTTP_HEADER_IF_NONE_MATCH, + HTTP_HEADER_LAST_MODIFIED, + HTTP_STATUS, +} from '../helper/constants'; +import { + FlagConfigurationEndpointNotFoundException, + GoFeatureFlagException, + ImpossibleToRetrieveConfigurationException, + ImpossibleToSendDataToTheCollectorException, + InvalidOptionsException, + UnauthorizedException, +} from '../exception'; + +/** + * GOFeatureFlagApi is a class that provides methods to interact with the GO Feature Flag API. + */ +export class GoFeatureFlagApi { + private readonly endpoint: string; + private readonly timeout: number; + private readonly apiKey?: string; + private readonly fetchImplementation: FetchAPI; + private readonly logger?: Logger; + + /** + * Constructor for GoFeatureFlagApi. + * @param options Options provided during the initialization of the provider + * @throws Error when options are not provided + */ + constructor(options: GoFeatureFlagProviderOptions, logger?: Logger) { + if (!options) { + throw new InvalidOptionsException('Options cannot be null'); + } + + this.endpoint = options.endpoint; + this.timeout = options.timeout || 10000; + this.apiKey = options.apiKey; + this.fetchImplementation = options.fetchImplementation || isomorphicFetch(); + this.logger = logger; + } + + /** + * RetrieveFlagConfiguration is a method that retrieves the flag configuration from the GO Feature Flag API. + * @param etag If provided, we call the API with "If-None-Match" header. + * @param flags List of flags to retrieve, if not set or empty, we will retrieve all available flags. + * @returns A FlagConfigResponse returning the success data. + * @throws FlagConfigurationEndpointNotFoundException if the endpoint is not reachable. + * @throws ImpossibleToRetrieveConfigurationException if the endpoint is returning an error. + */ + async retrieveFlagConfiguration(etag?: string, flags?: string[]): Promise { + const requestBody: FlagConfigRequest = { flags: flags || [] }; + const requestStr = JSON.stringify(requestBody); + + const headers: Record = { + [HTTP_HEADER_CONTENT_TYPE]: APPLICATION_JSON, + }; + + // Adding the If-None-Match header if etag is provided + if (etag) { + headers[HTTP_HEADER_IF_NONE_MATCH] = etag; + } + + // Add authorization header if API key is provided + if (this.apiKey) { + headers[HTTP_HEADER_AUTHORIZATION] = `${BEARER_TOKEN}${this.apiKey}`; + } + + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), this.timeout); + + try { + const response = await this.fetchImplementation(`${this.endpoint}/v1/flag/configuration`, { + method: 'POST', + headers, + body: requestStr, + signal: controller.signal, + }); + + clearTimeout(timeoutId); + + switch (response.status) { + case HTTP_STATUS.OK: + case HTTP_STATUS.NOT_MODIFIED: { + const body = await response.text(); + return this.handleFlagConfigurationSuccess(response, body); + } + case HTTP_STATUS.NOT_FOUND: + throw new FlagConfigurationEndpointNotFoundException(); + case HTTP_STATUS.UNAUTHORIZED: + case HTTP_STATUS.FORBIDDEN: + throw new UnauthorizedException( + 'Impossible to retrieve flag configuration: authentication/authorization error', + ); + case HTTP_STATUS.BAD_REQUEST: { + const badRequestErrBody = await response.text(); + throw new ImpossibleToRetrieveConfigurationException( + `retrieve flag configuration error: Bad request: ${badRequestErrBody}`, + ); + } + default: { + const defaultErrBody = (await response.text()) || ''; + throw new ImpossibleToRetrieveConfigurationException( + `retrieve flag configuration error: unexpected http code ${response.status}: ${defaultErrBody}`, + ); + } + } + } catch (error) { + clearTimeout(timeoutId); + if (error instanceof GoFeatureFlagException) { + throw error; + } + throw new ImpossibleToRetrieveConfigurationException(`Network error: ${error}`); + } + } + + /** + * Sends a list of events to the GO Feature Flag data collector. + * @param eventsList List of events + * @param exporterMetadata Metadata associated. + * @throws UnauthorizedException when we are not authorized to call the API + * @throws ImpossibleToSendDataToTheCollectorException when an error occurred when calling the API + */ + async sendEventToDataCollector(eventsList: ExportEvent[], exporterMetadata: ExporterMetadata): Promise { + const requestBody: ExporterRequest = { + meta: exporterMetadata?.asObject() ?? {}, + events: eventsList, + }; + + const requestStr = JSON.stringify(requestBody); + + const headers: Record = { + [HTTP_HEADER_CONTENT_TYPE]: APPLICATION_JSON, + }; + + // Add authorization header if API key is provided + if (this.apiKey) { + headers[HTTP_HEADER_AUTHORIZATION] = `${BEARER_TOKEN}${this.apiKey}`; + } + + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), this.timeout); + + try { + const response = await this.fetchImplementation(`${this.endpoint}/v1/data/collector`, { + method: 'POST', + headers, + body: requestStr, + signal: controller.signal, + }); + + clearTimeout(timeoutId); + + switch (response.status) { + case HTTP_STATUS.OK: { + const body = await response.text(); + this.logger?.info(`Published ${eventsList.length} events successfully: ${body}`); + return; + } + case HTTP_STATUS.UNAUTHORIZED: + case HTTP_STATUS.FORBIDDEN: + throw new UnauthorizedException('Impossible to send events: authentication/authorization error'); + case HTTP_STATUS.BAD_REQUEST: { + const badRequestErrBody = await response.text(); + throw new ImpossibleToSendDataToTheCollectorException(`Bad request: ${badRequestErrBody}`); + } + default: { + const defaultErrBody = (await response.text()) || ''; + throw new ImpossibleToSendDataToTheCollectorException( + `send data to the collector error: unexpected http code ${response.status}: ${defaultErrBody}`, + ); + } + } + } catch (error) { + clearTimeout(timeoutId); + if (error instanceof GoFeatureFlagException) { + throw error; + } + throw new ImpossibleToSendDataToTheCollectorException(`Network error: ${error}`); + } + } + + /** + * HandleFlagConfigurationSuccess is handling the success response of the flag configuration request. + * @param response HTTP response. + * @param body String of the body. + * @returns A FlagConfigResponse object. + */ + private handleFlagConfigurationSuccess(response: Response, body: string): FlagConfigResponse { + const etagHeader = response.headers.get(HTTP_HEADER_ETAG) || undefined; + const lastModifiedHeader = response.headers.get(HTTP_HEADER_LAST_MODIFIED); + const lastUpdated = lastModifiedHeader ? new Date(lastModifiedHeader) : new Date(0); + + const result: FlagConfigResponse = { + etag: etagHeader, + lastUpdated, + flags: {}, + evaluationContextEnrichment: {}, + }; + + if (response.status === HTTP_STATUS.NOT_MODIFIED) { + return result; + } + + try { + const goffResp = JSON.parse(body) as FlagConfigResponse; + result.evaluationContextEnrichment = goffResp.evaluationContextEnrichment || {}; + result.flags = goffResp.flags || {}; + } catch (error) { + this.logger?.warn(`Failed to parse flag configuration response: ${error}. Response body: "${body}"`); + // Return the default result with empty flags and enrichment + } + return result; + } +} diff --git a/libs/providers/go-feature-flag/src/lib/service/event-publisher.test.ts b/libs/providers/go-feature-flag/src/lib/service/event-publisher.test.ts new file mode 100644 index 000000000..1c331da2c --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/service/event-publisher.test.ts @@ -0,0 +1,303 @@ +import { EventPublisher } from './event-publisher'; +import type { GoFeatureFlagProviderOptions } from '../go-feature-flag-provider-options'; +import { ExporterMetadata, type FeatureEvent, type TrackingEvent } from '../model'; +import { InvalidOptionsException } from '../exception'; +import { mockLogger } from '../testutil/mock-logger'; + +// Mock the GoFeatureFlagApi +jest.mock('./api'); + +describe('EventPublisher', () => { + let eventPublisher: EventPublisher; + let mockApi: any; + let mockOptions: GoFeatureFlagProviderOptions; + + beforeEach(() => { + mockApi = { + sendEventToDataCollector: jest.fn().mockResolvedValue(undefined), + }; + + mockOptions = { + endpoint: 'http://localhost:1031', + dataFlushInterval: 100, + maxPendingEvents: 5, + exporterMetadata: new ExporterMetadata().add('test', 'metadata'), + }; + + eventPublisher = new EventPublisher(mockApi, mockOptions); + }); + + afterEach(async () => { + if (eventPublisher) { + await eventPublisher.stop(); + } + }); + + describe('constructor', () => { + it('should throw error when api is null', () => { + expect(() => new EventPublisher(null as any, mockOptions)).toThrow(InvalidOptionsException); + }); + + it('should throw error when options is null', () => { + expect(() => new EventPublisher(mockApi, null as any)).toThrow(InvalidOptionsException); + }); + + it('should create instance with valid parameters', () => { + expect(eventPublisher).toBeInstanceOf(EventPublisher); + }); + }); + + describe('start', () => { + it('should start the periodic publisher', async () => { + jest.useFakeTimers(); + + await eventPublisher.start(); + + // Add an event to trigger publishing + const mockEvent: FeatureEvent = { + kind: 'feature', + creationDate: Date.now() / 1000, + contextKind: 'user', + key: 'test-flag', + userKey: 'test-user', + default: false, + variation: 'test-variation', + }; + eventPublisher.addEvent(mockEvent); + + // Fast-forward time to trigger the interval + jest.advanceTimersByTime(150); + + expect(mockApi.sendEventToDataCollector).toHaveBeenCalled(); + + jest.useRealTimers(); + }); + + it('should not start multiple times', async () => { + await eventPublisher.start(); + await eventPublisher.start(); + + // Should only start once + expect(eventPublisher).toBeDefined(); + }); + }); + + describe('stop', () => { + it('should stop the periodic publisher', async () => { + jest.useFakeTimers(); + + await eventPublisher.start(); + await eventPublisher.stop(); + + // Fast-forward time - should not trigger any more calls + jest.advanceTimersByTime(150); + + const callCount = mockApi.sendEventToDataCollector.mock.calls.length; + + // Fast-forward again to ensure no more calls + jest.advanceTimersByTime(150); + + expect(mockApi.sendEventToDataCollector.mock.calls.length).toBe(callCount); + + jest.useRealTimers(); + }); + + it('should publish remaining events when stopping', async () => { + const testPublisher = new EventPublisher(mockApi, mockOptions); + + const mockEvent: FeatureEvent = { + kind: 'feature', + creationDate: Date.now() / 1000, + contextKind: 'user', + key: 'test-flag', + userKey: 'test-user', + default: false, + variation: 'test-variation', + }; + + // Start the publisher first + await testPublisher.start(); + + // Add event and stop + testPublisher.addEvent(mockEvent); + await testPublisher.stop(); + + expect(mockApi.sendEventToDataCollector).toHaveBeenCalledWith([mockEvent], mockOptions.exporterMetadata); + }); + }); + + describe('addEvent', () => { + it('should add event to collection', () => { + const mockEvent: FeatureEvent = { + kind: 'feature', + creationDate: Date.now() / 1000, + contextKind: 'user', + key: 'test-flag', + userKey: 'test-user', + default: false, + variation: 'test-variation', + }; + + eventPublisher.addEvent(mockEvent); + + // We can't directly test the internal state, but we can verify it doesn't throw + expect(() => eventPublisher.addEvent(mockEvent)).not.toThrow(); + }); + + it('should add TrackingEvent to collection', () => { + const mockTrackingEvent: TrackingEvent = { + kind: 'tracking', + creationDate: Date.now() / 1000, + contextKind: 'user', + key: 'test-flag', + userKey: 'test-user', + evaluationContext: { targetingKey: 'test-user' }, + trackingEventDetails: { value: 42, metricName: 'test-metric' }, + }; + + eventPublisher.addEvent(mockTrackingEvent); + + // We can't directly test the internal state, but we can verify it doesn't throw + expect(() => eventPublisher.addEvent(mockTrackingEvent)).not.toThrow(); + }); + + it('should trigger publish when max pending events reached', async () => { + const mockEvent: FeatureEvent = { + kind: 'feature', + creationDate: Date.now() / 1000, + contextKind: 'user', + key: 'test-flag', + userKey: 'test-user', + default: false, + variation: 'test-variation', + }; + + // Add events up to the max pending limit + for (let i = 0; i < 5; i++) { + eventPublisher.addEvent(mockEvent); + } + + // Wait a bit for async operations + await new Promise((resolve) => setTimeout(resolve, 10)); + + expect(mockApi.sendEventToDataCollector).toHaveBeenCalled(); + }); + }); + + describe('publishEvents', () => { + it('should handle API errors gracefully', async () => { + const mockError = new Error('API Error'); + mockApi.sendEventToDataCollector.mockRejectedValueOnce(mockError); + + const mockEvent: FeatureEvent = { + kind: 'feature', + creationDate: Date.now() / 1000, + contextKind: 'user', + key: 'test-flag', + userKey: 'test-user', + default: false, + variation: 'test-variation', + }; + + const publisherWithLogger = new EventPublisher(mockApi, mockOptions, mockLogger); + + // Start the publisher first + await publisherWithLogger.start(); + + // Add event and stop + publisherWithLogger.addEvent(mockEvent); + await publisherWithLogger.stop(); + + expect(mockLogger.error).toHaveBeenCalledWith('An error occurred while publishing events:', mockError); + }); + + it('should not publish when no events are available', async () => { + await eventPublisher.stop(); + + expect(mockApi.sendEventToDataCollector).not.toHaveBeenCalled(); + }); + }); + + describe('default values', () => { + it('should use default flush interval when not provided', async () => { + const optionsWithoutFlushInterval = { + ...mockOptions, + dataFlushInterval: undefined, + }; + + const publisher = new EventPublisher(mockApi, optionsWithoutFlushInterval); + + jest.useFakeTimers(); + await publisher.start(); + + // Add an event to trigger publishing + const mockEvent: FeatureEvent = { + kind: 'feature', + creationDate: Date.now() / 1000, + contextKind: 'user', + key: 'test-flag', + userKey: 'test-user', + default: false, + variation: 'test-variation', + }; + publisher.addEvent(mockEvent); + + // Default should be 10000ms (from constants) + jest.advanceTimersByTime(10100); + + expect(mockApi.sendEventToDataCollector).toHaveBeenCalled(); + + jest.useRealTimers(); + await publisher.stop(); + }); + + it('should use default max pending events when not provided', async () => { + const optionsWithoutMaxPending = { + ...mockOptions, + maxPendingEvents: undefined, + }; + + const publisher = new EventPublisher(mockApi, optionsWithoutMaxPending); + + // Should not throw + expect(publisher).toBeInstanceOf(EventPublisher); + + // Test that default max pending events limit is respected with mixed event types + const mockFeatureEvent: FeatureEvent = { + kind: 'feature', + creationDate: Date.now() / 1000, + contextKind: 'user', + key: 'test-flag', + userKey: 'test-user', + default: false, + variation: 'test-variation', + }; + + const mockTrackingEvent: TrackingEvent = { + kind: 'tracking', + creationDate: Date.now() / 1000, + contextKind: 'user', + key: 'test-flag', + userKey: 'test-user', + evaluationContext: { targetingKey: 'test-user' }, + trackingEventDetails: { metricValue: 42 }, + }; + + // Add mixed events up to the default max pending limit (10000 from constants) + // We'll add 10001 events to trigger the publish + for (let i = 0; i < 10001; i++) { + if (i % 2 === 0) { + publisher.addEvent(mockFeatureEvent); + } else { + publisher.addEvent(mockTrackingEvent); + } + } + + // Wait a bit for async operations + await new Promise((resolve) => setTimeout(resolve, 10)); + + // Should trigger publish when reaching the default limit + expect(mockApi.sendEventToDataCollector).toHaveBeenCalled(); + }); + }); +}); diff --git a/libs/providers/go-feature-flag/src/lib/service/event-publisher.ts b/libs/providers/go-feature-flag/src/lib/service/event-publisher.ts new file mode 100644 index 000000000..9e3f93fb7 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/service/event-publisher.ts @@ -0,0 +1,116 @@ +import type { GoFeatureFlagProviderOptions } from '../go-feature-flag-provider-options'; +import type { GoFeatureFlagApi } from './api'; +import type { Logger } from '@openfeature/server-sdk'; +import { ExporterMetadata, type ExportEvent } from '../model'; +import { InvalidOptionsException } from '../exception'; +import { DEFAULT_FLUSH_INTERVAL_MS, DEFAULT_MAX_PENDING_EVENTS } from '../helper/constants'; + +/** + * EventPublisher is used to collect events and publish them in batch before they are published. + */ +export class EventPublisher { + /** The API used to communicate with the GO Feature Flag relay proxy. */ + private readonly api: GoFeatureFlagApi; + /** The options for the event publisher. */ + private readonly options: GoFeatureFlagProviderOptions; + /** The events to publish. */ + private readonly events: ExportEvent[] = []; + /** The interval ID for the periodic runner. */ + private intervalId?: NodeJS.Timeout; + /** Whether the event publisher is running. */ + private isRunning = false; + /** The logger to use for logging. */ + private readonly logger?: Logger; + + /** + * Initialize the event publisher with a specified publication interval. + * @param {GoFeatureFlagApi} api - The API used to communicate with the GO Feature Flag relay proxy. + * @param {GoFeatureFlagProviderOptions} options - The options to initialise the provider. + * @throws {InvalidOptionsException} If api or options are null. + */ + constructor(api: GoFeatureFlagApi, options: GoFeatureFlagProviderOptions, logger?: Logger) { + if (!api) { + throw new InvalidOptionsException('API cannot be null'); + } + if (!options) { + throw new InvalidOptionsException('Options cannot be null'); + } + this.api = api; + this.options = options; + this.logger = logger; + } + + /** + * Starts the periodic runner that publishes events. + * @returns {Promise} A promise that resolves when the periodic runner has started. + */ + async start(): Promise { + if (this.isRunning) { + return; + } + this.isRunning = true; + const flushInterval = this.options.dataFlushInterval || DEFAULT_FLUSH_INTERVAL_MS; + this.intervalId = setInterval(async () => { + await this.publishEvents(); + }, flushInterval); + } + + /** + * Stops the periodic runner that publishes events and flushes any remaining events. + * @returns {Promise} A promise that resolves when the periodic runner has stopped and all events are published. + */ + async stop(): Promise { + if (!this.isRunning) { + return; + } + this.isRunning = false; + if (this.intervalId) { + clearInterval(this.intervalId); + this.intervalId = undefined; + } + // Publish any remaining events + await this.publishEvents(); + } + + /** + * Add event for aggregation before publishing. If the max pending events is reached, events are published immediately. + * @param {ExportEvent} eventToAdd - The event to add to the collection. + * @returns {void} + */ + addEvent(eventToAdd: ExportEvent): void { + let shouldPublish = false; + // Simple thread-safe check and add + if (this.events.length + 1 >= (this.options.maxPendingEvents || DEFAULT_MAX_PENDING_EVENTS)) { + shouldPublish = true; + } + this.events.push(eventToAdd); + if (shouldPublish) { + // Fire and forget - don't await to avoid blocking + this.publishEvents().catch((error) => { + this.logger?.error('Error publishing events:', error); + }); + } + } + + /** + * @private + * Publishes the collected events to the GO Feature Flag relay proxy. + * @returns {Promise} A promise that resolves when the events have been published. + */ + private async publishEvents(): Promise { + let eventsToPublish: ExportEvent[] = []; + // Simple thread-safe check and clear + if (this.events.length === 0) { + return; + } + eventsToPublish = [...this.events]; + this.events.length = 0; // Clear the array + try { + await this.api.sendEventToDataCollector(eventsToPublish, this.options.exporterMetadata ?? new ExporterMetadata()); + } catch (error) { + this.logger?.error('An error occurred while publishing events:', error); + // Re-add events to the collection on failure + this.events.push(...eventsToPublish); + } + } +} diff --git a/libs/providers/go-feature-flag/src/lib/test-logger.ts b/libs/providers/go-feature-flag/src/lib/test-logger.ts deleted file mode 100644 index 4d578da76..000000000 --- a/libs/providers/go-feature-flag/src/lib/test-logger.ts +++ /dev/null @@ -1,33 +0,0 @@ -export default class TestLogger { - public inMemoryLogger: Record = { - error: [], - warn: [], - info: [], - debug: [], - }; - - error(...args: unknown[]): void { - this.inMemoryLogger['error'].push(args.join(' ')); - } - - warn(...args: unknown[]): void { - this.inMemoryLogger['warn'].push(args.join(' ')); - } - - info(...args: unknown[]): void { - this.inMemoryLogger['info'].push(args.join(' ')); - } - - debug(...args: unknown[]): void { - this.inMemoryLogger['debug'].push(args.join(' ')); - } - - reset() { - this.inMemoryLogger = { - error: [], - warn: [], - info: [], - debug: [], - }; - } -} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/change-config-after.json b/libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/change-config-after.json new file mode 100644 index 000000000..31ab2a970 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/change-config-after.json @@ -0,0 +1,17 @@ +{ + "flags": { + "TEST": { + "variations": { + "disabled": false, + "enabled": true + }, + "defaultRule": { + "variation": "enabled" + }, + "metadata": { + "description": "this is a test", + "pr_link": "https://github.com/thomaspoignant/go-feature-flag/pull/916" + } + } + } +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/change-config-before.json b/libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/change-config-before.json new file mode 100644 index 000000000..afbd35018 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/change-config-before.json @@ -0,0 +1,17 @@ +{ + "flags": { + "TEST": { + "variations": { + "disabled": false, + "enabled": true + }, + "defaultRule": { + "variation": "disabled" + }, + "metadata": { + "description": "this is a test", + "pr_link": "https://github.com/thomaspoignant/go-feature-flag/pull/916" + } + } + } +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/default.json b/libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/default.json new file mode 100644 index 000000000..bc855effc --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/default.json @@ -0,0 +1,288 @@ +{ + "flags": { + "bool_targeting_match": { + "variations": { + "Default": false, + "False": false, + "True": true + }, + "targeting": [ + { + "query": "email eq \"john.doe@gofeatureflag.org\"", + "variation": "True" + } + ], + "defaultRule": { + "percentage": { + "False": 0, + "True": 100 + } + }, + "metadata": { + "description": "this is a test", + "pr_link": "https://github.com/thomaspoignant/go-feature-flag/pull/916" + } + }, + "disabled_bool": { + "variations": { + "Default": false, + "False": false, + "True": true + }, + "defaultRule": { + "percentage": { + "False": 0, + "True": 100 + } + }, + "disable": true, + "metadata": { + "description": "this is a test", + "pr_link": "https://github.com/thomaspoignant/go-feature-flag/pull/916" + } + }, + "disabled_float": { + "variations": { + "Default": 103.25, + "False": 101.25, + "True": 100.25 + }, + "defaultRule": { + "percentage": { + "False": 0, + "True": 100 + } + }, + "disable": true, + "metadata": { + "description": "this is a test", + "pr_link": "https://github.com/thomaspoignant/go-feature-flag/pull/916" + } + }, + "disabled_int": { + "variations": { + "Default": 103, + "False": 101, + "True": 100 + }, + "defaultRule": { + "percentage": { + "False": 0, + "True": 100 + } + }, + "disable": true, + "metadata": { + "description": "this is a test", + "pr_link": "https://github.com/thomaspoignant/go-feature-flag/pull/916" + } + }, + "disabled_interface": { + "variations": { + "Default": { + "test": "default" + }, + "False": { + "test": "false" + }, + "True": { + "test": "test1", + "test2": false, + "test3": 123.3, + "test4": 1 + } + }, + "defaultRule": { + "percentage": { + "False": 0, + "True": 100 + } + }, + "disable": true, + "metadata": { + "description": "this is a test", + "pr_link": "https://github.com/thomaspoignant/go-feature-flag/pull/916" + } + }, + "disabled_string": { + "variations": { + "Default": "CC0002", + "False": "CC0001", + "True": "CC0000" + }, + "defaultRule": { + "percentage": { + "False": 0, + "True": 100 + } + }, + "disable": true, + "metadata": { + "description": "this is a test", + "pr_link": "https://github.com/thomaspoignant/go-feature-flag/pull/916" + } + }, + "double_key": { + "variations": { + "Default": 103.25, + "False": 101.25, + "True": 100.25 + }, + "targeting": [ + { + "query": "email eq \"john.doe@gofeatureflag.org\"", + "variation": "True" + } + ], + "defaultRule": { + "percentage": { + "False": 0, + "True": 100 + } + }, + "metadata": { + "description": "this is a test", + "pr_link": "https://github.com/thomaspoignant/go-feature-flag/pull/916" + } + }, + "integer_key": { + "variations": { + "Default": 103, + "False": 101, + "True": 100 + }, + "targeting": [ + { + "query": "email eq \"john.doe@gofeatureflag.org\"", + "variation": "True" + } + ], + "defaultRule": { + "percentage": { + "False": 0, + "True": 100 + } + }, + "metadata": { + "description": "this is a test", + "pr_link": "https://github.com/thomaspoignant/go-feature-flag/pull/916" + } + }, + "object_key": { + "variations": { + "Default": { + "test": "default" + }, + "False": { + "test": "false" + }, + "True": { + "test": "test1", + "test2": false, + "test3": 123.3, + "test4": 1 + } + }, + "targeting": [ + { + "query": "email eq \"john.doe@gofeatureflag.org\"", + "variation": "True" + } + ], + "defaultRule": { + "percentage": { + "False": 0, + "True": 100 + } + }, + "metadata": { + "description": "this is a test", + "pr_link": "https://github.com/thomaspoignant/go-feature-flag/pull/916" + } + }, + "list_key": { + "variations": { + "Default": ["default"], + "False": ["false"], + "True": ["true"] + }, + "targeting": [ + { + "query": "email eq \"john.doe@gofeatureflag.org\"", + "variation": "True" + } + ], + "defaultRule": { + "percentage": { + "False": 0, + "True": 100 + } + }, + "metadata": { + "description": "this is a test", + "pr_link": "https://github.com/thomaspoignant/go-feature-flag/pull/916" + } + }, + "string_key": { + "variations": { + "Default": "CC0002", + "False": "CC0001", + "True": "CC0000" + }, + "targeting": [ + { + "query": "email eq \"john.doe@gofeatureflag.org\"", + "variation": "True" + } + ], + "defaultRule": { + "percentage": { + "False": 0, + "True": 100 + } + }, + "metadata": { + "description": "this is a test", + "pr_link": "https://github.com/thomaspoignant/go-feature-flag/pull/916" + } + }, + "string_key_with_version": { + "variations": { + "Default": "CC0002", + "False": "CC0001", + "True": "CC0000" + }, + "targeting": [ + { + "query": "email eq \"john.doe@gofeatureflag.org\"", + "variation": "True" + } + ], + "defaultRule": { + "percentage": { + "False": 0, + "True": 100 + } + }, + "metadata": { + "description": "this is a test", + "pr_link": "https://github.com/thomaspoignant/go-feature-flag/pull/916" + } + }, + "flag-use-evaluation-context-enrichment": { + "variations": { + "A": "A", + "B": "B" + }, + "targeting": [ + { + "query": "environment eq \"integration-test\"", + "variation": "A" + } + ], + "defaultRule": { + "variation": "B" + } + } + } +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/scheduled-rollout.json b/libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/scheduled-rollout.json new file mode 100644 index 000000000..d93262364 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/flag-configuration/scheduled-rollout.json @@ -0,0 +1,58 @@ +{ + "flags": { + "my-flag": { + "variations": { + "disabled": false, + "enabled": true + }, + "defaultRule": { + "percentage": { + "enabled": 0, + "disabled": 100 + } + }, + "metadata": { + "description": "this is a test flag", + "defaultValue": false + }, + "scheduledRollout": [ + { + "targeting": [ + { + "query": "targetingKey eq \"d45e303a-38c2-11ed-a261-0242ac120002\"", + "variation": "enabled" + } + ], + "date": "2022-07-31T22:00:00.100Z" + } + ] + }, + "my-flag-scheduled-in-future": { + "variations": { + "disabled": false, + "enabled": true + }, + "defaultRule": { + "percentage": { + "enabled": 0, + "disabled": 100 + } + }, + "metadata": { + "description": "this is a test flag", + "defaultValue": false + }, + "scheduledRollout": [ + { + "targeting": [ + { + "query": "targetingKey eq \"d45e303a-38c2-11ed-a261-0242ac120002\"", + "variation": "enabled" + } + ], + "date": "3022-07-31T22:00:00.100Z" + } + ] + } + } +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/README.md b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/README.md new file mode 100644 index 000000000..142dedc6e --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/README.md @@ -0,0 +1,35 @@ +# OFREP Response Files + +This directory contains JSON response files for OFREP (OpenFeature Remote Evaluation Protocol) flag evaluations. + +## File Structure + +Each file is named after the flag key and contains the expected response for that flag evaluation. + +### Error Responses + +- `fail_500.json` - Internal Server Error (500) +- `api_key_missing.json` - API Key Missing (400) +- `invalid_api_key.json` - Invalid API Key (401) +- `flag_not_found.json` - Flag Not Found (404) + +### Flag Evaluation Responses + +- `bool_targeting_match.json` - Boolean flag with targeting match +- `disabled.json` - Disabled boolean flag +- `disabled_double.json` - Disabled double/float flag +- `disabled_integer.json` - Disabled integer flag +- `disabled_object.json` - Disabled object flag +- `disabled_string.json` - Disabled string flag +- `double_key.json` - Double/float flag with targeting match +- `integer_key.json` - Integer flag with targeting match +- `list_key.json` - List flag with targeting match +- `object_key.json` - Object flag with targeting match +- `string_key.json` - String flag with targeting match +- `unknown_reason.json` - Flag with custom reason +- `does_not_exists.json` - Flag that doesn't exist in configuration +- `integer_with_metadata.json` - Integer flag with metadata + +## Usage + +The mock automatically loads these files when handling OFREP evaluation requests. If a flag key doesn't have a corresponding file, it returns a "Flag not found" error. diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/api_key_missing.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/api_key_missing.json new file mode 100644 index 000000000..86283f8aa --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/api_key_missing.json @@ -0,0 +1,3 @@ +{ + "error": "API Key is missing" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/bool_targeting_match.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/bool_targeting_match.json new file mode 100644 index 000000000..dd436a53b --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/bool_targeting_match.json @@ -0,0 +1,6 @@ +{ + "value": true, + "key": "bool_targeting_match", + "reason": "TARGETING_MATCH", + "variant": "True" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled.json new file mode 100644 index 000000000..e7d8c06e3 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled.json @@ -0,0 +1,6 @@ +{ + "value": false, + "key": "disabled", + "reason": "DISABLED", + "variant": "defaultSdk" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_double.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_double.json new file mode 100644 index 000000000..4607fde1b --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_double.json @@ -0,0 +1,6 @@ +{ + "value": 100.25, + "key": "disabled_double", + "reason": "DISABLED", + "variant": "defaultSdk" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_integer.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_integer.json new file mode 100644 index 000000000..e198fb2c3 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_integer.json @@ -0,0 +1,6 @@ +{ + "value": 100, + "key": "disabled_integer", + "reason": "DISABLED", + "variant": "defaultSdk" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_object.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_object.json new file mode 100644 index 000000000..d7d9737a2 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_object.json @@ -0,0 +1,6 @@ +{ + "value": null, + "key": "disabled_object", + "reason": "DISABLED", + "variant": "defaultSdk" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_string.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_string.json new file mode 100644 index 000000000..0477aff3c --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/disabled_string.json @@ -0,0 +1,6 @@ +{ + "value": "", + "key": "disabled_string", + "reason": "DISABLED", + "variant": "defaultSdk" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/does_not_exists.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/does_not_exists.json new file mode 100644 index 000000000..189996ceb --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/does_not_exists.json @@ -0,0 +1,7 @@ +{ + "value": "", + "key": "does_not_exists", + "errorCode": "FLAG_NOT_FOUND", + "variant": "defaultSdk", + "errorDetails": "flag does_not_exists was not found in your configuration" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/double_key.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/double_key.json new file mode 100644 index 000000000..fe6c90704 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/double_key.json @@ -0,0 +1,6 @@ +{ + "value": 100.25, + "key": "double_key", + "reason": "TARGETING_MATCH", + "variant": "True" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/fail_500.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/fail_500.json new file mode 100644 index 000000000..4d9c2a2e6 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/fail_500.json @@ -0,0 +1,3 @@ +{ + "error": "Internal Server Error" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/flag_not_found.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/flag_not_found.json new file mode 100644 index 000000000..56d87b133 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/flag_not_found.json @@ -0,0 +1,3 @@ +{ + "error": "Flag not found" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/integer_key.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/integer_key.json new file mode 100644 index 000000000..9f79203c4 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/integer_key.json @@ -0,0 +1,6 @@ +{ + "value": 100, + "key": "integer_key", + "reason": "TARGETING_MATCH", + "variant": "True" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/integer_with_metadata.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/integer_with_metadata.json new file mode 100644 index 000000000..d2211ec66 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/integer_with_metadata.json @@ -0,0 +1,12 @@ +{ + "value": 100, + "key": "integer_key", + "reason": "TARGETING_MATCH", + "variant": "True", + "metadata": { + "key1": "key1", + "key2": 1, + "key3": 1.345, + "key4": true + } +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/invalid_api_key.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/invalid_api_key.json new file mode 100644 index 000000000..28ecde0af --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/invalid_api_key.json @@ -0,0 +1,3 @@ +{ + "error": "Invalid API Key" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/list_key.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/list_key.json new file mode 100644 index 000000000..5c8e9e346 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/list_key.json @@ -0,0 +1,6 @@ +{ + "value": ["test", "test1", "test2", "false", "test3"], + "key": "list_key", + "reason": "TARGETING_MATCH", + "variant": "True" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/object_key.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/object_key.json new file mode 100644 index 000000000..b1da6bec2 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/object_key.json @@ -0,0 +1,12 @@ +{ + "value": { + "test": "test1", + "test2": false, + "test3": 123.3, + "test4": 1, + "test5": null + }, + "key": "object_key", + "reason": "TARGETING_MATCH", + "variant": "True" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/string_key.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/string_key.json new file mode 100644 index 000000000..a56910ec2 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/string_key.json @@ -0,0 +1,6 @@ +{ + "value": "CC0000", + "key": "string_key", + "reason": "TARGETING_MATCH", + "variant": "True" +} diff --git a/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/unknown_reason.json b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/unknown_reason.json new file mode 100644 index 000000000..055a30a4e --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testdata/ofrep-response/unknown_reason.json @@ -0,0 +1,6 @@ +{ + "value": "true", + "key": "unknown_reason", + "reason": "CUSTOM_REASON", + "variant": "True" +} diff --git a/libs/providers/go-feature-flag/src/lib/testutil/mock-logger.ts b/libs/providers/go-feature-flag/src/lib/testutil/mock-logger.ts new file mode 100644 index 000000000..7f7ce5484 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testutil/mock-logger.ts @@ -0,0 +1,10 @@ +import { jest } from '@jest/globals'; +import type { Logger } from '@openfeature/server-sdk'; + +// Mock logger to capture error calls +export const mockLogger = { + error: jest.fn(), + warn: jest.fn(), + info: jest.fn(), + debug: jest.fn(), +} as Logger; diff --git a/libs/providers/go-feature-flag/src/lib/testutil/ofrep-provider-mock.ts b/libs/providers/go-feature-flag/src/lib/testutil/ofrep-provider-mock.ts new file mode 100644 index 000000000..5db55c3ce --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testutil/ofrep-provider-mock.ts @@ -0,0 +1,81 @@ +import type { EvaluationContext, ResolutionDetails } from '@openfeature/server-sdk'; +import type { JsonValue } from '@openfeature/server-sdk'; + +export class OfrepProviderMock { + lastEvaluationContext?: EvaluationContext; + + async evaluateString( + flagKey: string, + defaultValue: string, + context: EvaluationContext, + ): Promise> { + this.lastEvaluationContext = context; + return { + value: 'this is a test value', + reason: 'TARGETING_MATCH', + variant: 'enabled', + errorCode: undefined, + errorMessage: undefined, + }; + } + + async evaluateBoolean( + flagKey: string, + defaultValue: boolean, + context: EvaluationContext, + ): Promise> { + this.lastEvaluationContext = context; + return { + value: true, + reason: 'TARGETING_MATCH', + variant: 'enabled', + errorCode: undefined, + errorMessage: undefined, + }; + } + + async evaluateNumber( + flagKey: string, + defaultValue: number, + context: EvaluationContext, + ): Promise> { + this.lastEvaluationContext = context; + return { + value: 12.21, + reason: 'TARGETING_MATCH', + variant: 'enabled', + errorCode: undefined, + errorMessage: undefined, + }; + } + + async evaluateInteger( + flagKey: string, + defaultValue: number, + context: EvaluationContext, + ): Promise> { + this.lastEvaluationContext = context; + return { + value: 12, + reason: 'TARGETING_MATCH', + variant: 'enabled', + errorCode: undefined, + errorMessage: undefined, + }; + } + + async evaluateObject( + flagKey: string, + defaultValue: T, + context: EvaluationContext, + ): Promise> { + this.lastEvaluationContext = context; + return { + value: 'this is a test value' as T, + reason: 'TARGETING_MATCH', + variant: 'enabled', + errorCode: undefined, + errorMessage: undefined, + }; + } +} diff --git a/libs/providers/go-feature-flag/src/lib/wasm/evaluate-wasm.ts b/libs/providers/go-feature-flag/src/lib/wasm/evaluate-wasm.ts new file mode 100644 index 000000000..d3af0ef1f --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/wasm/evaluate-wasm.ts @@ -0,0 +1,280 @@ +import type { EvaluationResponse } from '../model/evaluation-response'; +import type { WasmInput } from '../model/wasm-input'; +import { WasmNotLoadedException, WasmFunctionNotFoundException, WasmInvalidResultException } from '../exception'; +import './wasm_exec.js'; +import type { Logger } from '@openfeature/server-sdk'; +import * as fs from 'fs'; +import * as path from 'path'; + +/** + * EvaluationWasm is a class that represents the evaluation of a feature flag + * it calls an external WASM module to evaluate the feature flag. + */ +export class EvaluateWasm { + private wasmInstance: WebAssembly.Instance | null = null; + private wasmMemory: WebAssembly.Memory | null = null; + private wasmExports: WebAssembly.Exports | null = null; + private go: Go; + private logger?: Logger; + + /** + * Constructor of the EvaluationWasm. It initializes the WASM module and the host functions. + */ + constructor(logger?: Logger) { + this.logger = logger; + this.go = new Go(); + // Initialize WASM asynchronously + this.initializeWasm().catch((error) => { + logger?.error('Failed to initialize WASM:', error); + }); + } + + /** + * Initializes the WASM module. + * In a real implementation, this would load the WASM binary and instantiate it. + */ + private async initializeWasm(): Promise { + try { + // Load the WASM binary + const wasmBuffer = await this.loadWasmBinary(); + + // Instantiate the WebAssembly module + const wasm = await WebAssembly.instantiate(wasmBuffer, this.go.importObject); + + // Run the Go runtime + this.go.run(wasm.instance); + + // Store the instance and exports + this.wasmInstance = wasm.instance; + this.wasmExports = wasm.instance.exports; + + // Get the required exports + this.wasmMemory = this.wasmExports['memory'] as WebAssembly.Memory; + + // Verify required functions exist + if (!this.wasmExports['malloc'] || !this.wasmExports['free'] || !this.wasmExports['evaluate']) { + throw new WasmFunctionNotFoundException('Required WASM functions not found'); + } + } catch (error) { + if (error instanceof WasmNotLoadedException || error instanceof WasmFunctionNotFoundException) { + throw error; + } + throw new WasmNotLoadedException( + `Failed to load WASM module: ${error instanceof Error ? error.message : 'Unknown error'}`, + ); + } + } + + public async dispose(): Promise { + try { + // Clean up WASM memory and resources + if (this.wasmExports && this.wasmExports['free']) { + // If there are any remaining allocated pointers, free them + // This is a safety measure in case some memory wasn't freed during evaluation + this.wasmExports['free'] as (ptr: number) => void; + // Note: We can't track all allocated pointers easily, so this is mainly for cleanup + } + this.wasmMemory = null; + this.wasmExports = null; + this.wasmInstance = null; + if (this.go && typeof this.go.exit === 'function') { + try { + this.go.exit(0); + } catch (error) { + // Ignore errors during Go runtime cleanup + } + } + } catch (error) { + this.logger?.warn('Error during WASM disposal:', error); + } + } + + /** + * Loads the WASM binary file. + * @returns Promise - The WASM binary data + */ + private async loadWasmBinary(): Promise { + try { + // Construct the path to the WASM file relative to the current module + const wasmPath = path.join(__dirname, 'wasm-module', 'gofeatureflag-evaluation.wasm'); + + // Read the file as a buffer and convert to ArrayBuffer + const buffer = fs.readFileSync(wasmPath); + const arrayBuffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength); + return arrayBuffer as ArrayBuffer; + } catch (error) { + throw new WasmNotLoadedException( + `Failed to load WASM binary: ${error instanceof Error ? error.message : 'Unknown error'}`, + ); + } + } + + /** + * Evaluates a feature flag using the WASM module. + * @param wasmInput - The input data for the evaluation + * @returns A Promise - A ResolutionDetails of the feature flag + * @throws WasmInvalidResultException - If for any reasons we have an issue calling the wasm module. + */ + public async evaluate(wasmInput: WasmInput): Promise { + try { + // Ensure WASM is initialized + if (!this.wasmExports || !this.wasmMemory) { + await this.initializeWasm(); + } + + // Serialize the input to JSON + const wasmInputAsStr = JSON.stringify(wasmInput); + + // Copy input to WASM memory + const inputPtr = this.copyToMemory(wasmInputAsStr); + + try { + // Call the WASM evaluate function + const evaluateRes = this.callWasmEvaluate(inputPtr, wasmInputAsStr.length); + + // Read the result from WASM memory + const resAsString = this.readFromMemory(evaluateRes); + + // Deserialize the response + const goffResp = JSON.parse(resAsString) as EvaluationResponse; + + if (!goffResp) { + throw new WasmInvalidResultException('Deserialization of EvaluationResponse failed.'); + } + return goffResp; + } finally { + // Free the allocated memory + if (inputPtr !== 0) { + this.callWasmFree(inputPtr); + } + } + } catch (error) { + // Return error response if WASM evaluation fails + return { + errorCode: 'GENERAL', + reason: 'ERROR', + errorDetails: error instanceof Error ? error.message : 'Unknown error', + } as EvaluationResponse; + } + } + + /** + * Calls the WASM evaluate function. + * @param inputPtr - Pointer to the input string in WASM memory + * @param inputLength - Length of the input string + * @returns The result from the WASM evaluate function + */ + private callWasmEvaluate(inputPtr: number, inputLength: number): bigint { + if (!this.wasmExports) { + throw new WasmFunctionNotFoundException('evaluate'); + } + + const evaluateFunction = this.wasmExports['evaluate'] as (ptr: number, length: number) => bigint; + if (!evaluateFunction) { + throw new WasmFunctionNotFoundException('evaluate'); + } + + const result = evaluateFunction(inputPtr, inputLength); + if (typeof result !== 'bigint') { + throw new WasmInvalidResultException('Evaluate should return a bigint value.'); + } + + return result; + } + + /** + * Calls the WASM free function. + * @param ptr - Pointer to free in WASM memory + */ + private callWasmFree(ptr: number): void { + if (!this.wasmExports) { + throw new WasmFunctionNotFoundException('free'); + } + + const freeFunction = this.wasmExports['free'] as (ptr: number) => void; + if (!freeFunction) { + throw new WasmFunctionNotFoundException('free'); + } + + freeFunction(ptr); + } + + /** + * Copies the input string to the WASM memory and returns the pointer to the memory location. + * @param inputString - string to put in memory + * @returns the address location of this string + * @throws WasmInvalidResultException - If for any reasons we have an issue calling the wasm module. + */ + private copyToMemory(inputString: string): number { + if (!this.wasmExports) { + throw new WasmFunctionNotFoundException('malloc'); + } + + // Allocate memory in the Wasm module for the input string. + const mallocFunction = this.wasmExports['malloc'] as (size: number) => number; + if (!mallocFunction) { + throw new WasmFunctionNotFoundException('malloc'); + } + + const ptr = mallocFunction(inputString.length + 1); + if (typeof ptr !== 'number') { + throw new WasmInvalidResultException('Malloc should return a number value.'); + } + + // Write the string to WASM memory + this.writeStringToMemory(ptr, inputString); + return ptr; + } + + /** + * Writes a string to WASM memory. + * @param ptr - Pointer to write to + * @param str - String to write + */ + private writeStringToMemory(ptr: number, str: string): void { + if (!this.wasmMemory) { + throw new WasmInvalidResultException('WASM memory not available.'); + } + + const buffer = new Uint8Array(this.wasmMemory.buffer); + const encoder = new TextEncoder(); + const bytes = encoder.encode(str); + + for (let i = 0; i < bytes.length; i++) { + buffer[ptr + i] = bytes[i]; + } + buffer[ptr + bytes.length] = 0; // Null terminator + } + + /** + * Reads the output string from the WASM memory based on the result of the evaluation. + * @param evaluateRes - result of the evaluate function + * @returns A string containing the output of the evaluate function + * @throws WasmInvalidResultException - If for any reasons we have an issue calling the wasm module. + */ + private readFromMemory(evaluateRes: bigint): string { + // In the .NET implementation, the result is packed as: + // Higher 32 bits for pointer, lower 32 bits for length + const MASK = BigInt(2 ** 32) - BigInt(1); + const ptr = Number(evaluateRes >> BigInt(32)) & 0xffffffff; // Higher 32 bits for a pointer + const outputStringLength = Number(evaluateRes & MASK); // Lower 32 bits for length + + if (ptr === 0 || outputStringLength === 0) { + throw new WasmInvalidResultException('Output string pointer or length is invalid.'); + } + + if (!this.wasmMemory) { + throw new WasmInvalidResultException('WASM memory not available.'); + } + + const buffer = new Uint8Array(this.wasmMemory.buffer); + const bytes = new Uint8Array(outputStringLength); + + for (let i = 0; i < outputStringLength; i++) { + bytes[i] = buffer[ptr + i]; + } + + const decoder = new TextDecoder(); + return decoder.decode(bytes); + } +} diff --git a/libs/providers/go-feature-flag/src/lib/wasm/wasm-module/gofeatureflag-evaluation.wasm b/libs/providers/go-feature-flag/src/lib/wasm/wasm-module/gofeatureflag-evaluation.wasm new file mode 100644 index 0000000000000000000000000000000000000000..2a492a2ddf02a0920e7aa5c708abb2f5d33f9f8b GIT binary patch literal 878235 zcmcG%3%FfZS?@h>>$3OSmz7(aHi6Ey*ubtNuswt{#va+Tv`wHXROR`;KIiFoXr+a+ z6CjsusT!IM280HjwifG1UM8f<%ZIwRoaW@QV_UQQ|S@F~<`j9IFJ4_WS+c zcg(rg-btbL@gz?&=4Fg`yyLx(cZ@k!^uV?^$59l;C$r-IbjOYz(fvvIFWzAfC~7>{ z!*~ZbnO|GMZQb7Svf&q2EecI|zcM_2W(5tRsDx>qJ?7Xv7Tq6l-z>pI;PKdFbS9kR z$9gZQRNFx#d!-5kWfQJT9H|rov0)WeRioiSwqv{QT2&L>+33Bt;Hvgx`~gN3Z@)j~ z8U1Hvm)vc4Z2XCJ$z|jZfzM?f-0j(LUr%~5)PE1b)e9q}cLw#CO5N!pcXT_Tr}oG3 z)PQRmgm&U;x*{@kC%sohMfJ!ofu3XdhYGjq4UUwz4&05_QtnPZ5!VD!*7{>)0-c9@${Qszj0gCwTFwg{m8c0Kd@=jOQyEH z_>l)T{qRHU9-5AxXRn?!|J6NPAKLuD)`xy@dh46s^2Vrbm2RA0X~SC|crer$vl`d+ z)p*03-txevH~r{CKk(2Sq8qQ>|EnK*TXdbhTHM#rPUc*}!tee>(y z2>wa>&-HKB2jc~CoF&6iI-F+Bq*klN!$~cQYH@8K9|Uf<_z-M~%T7 zYqjY5xbII>*NfVtu^Oer^;Q%O4+Fj)Cus^sNiB|(IIcHZaT3u*y`J)<88xD)F)&c8 zXIv#OXpE+jstu0TXi?`s#93A!X{1pz%SJSUr~!fM(Lf^u-Ivzm zRZ%^Pngdx}Z$^6lvgeFu^}%Gp!e*33JQmFw>9_sU9L(z3U^9vbmk!n#7h_8xbeuNy zXQ(+8C5?glK=mgY(BEd$9~fQ(aec6P!$7nkgE;g%(rSW06s?Y$5yTlx8cCeSaSCPP zCVv*EOPjSg8Hl26AcM`%O`s_ZuQjrC$u0H9;v}v$T3I|&%NSQy{?SzFJ1kr<+})FQBszXxIBkK_VoE~(R+;SAPlOVS2K z91kyuvPKIUB*_iQNR~EQNO+WuL_DOz!i8xTjV!2x5zHH`)5Ju0!P*AY6o=)pB2mu& z@Ic+i8Lt^WlC>#@2`Ya;8y#-L~lmwoXUyXfz*^1$Y2k_Rhw@X@*q9tvCJ9>o-pQV!SW@sbo*` zvG{M2zfJyEaxwY4-lS|1rlK-9jeew^@vo(ir@x;5MtV5?c>0O-lj)K4 zuaZxtpH7daUr3Lqzny+D{hjng`UmM>q+iSq*FRqWME#TXBlSEO^*^qE zx&Ha&d~zT=nEh(@vFz8f1KFYM*R$Wq4ria>`jgpbvd?C}nSCz%)B2y)|FZs-`cN{H z4*q|8U+}H^405#Nc~LPr)s4rZJTBHu-4@-F>T2m!ap03fH%H+%pDGUZ-HuNcM|!tv zGeMhOGuh24*G;Zrgk1~P{!q1@bJuREX&%vophuAabK5R&>6Y7Oc}wFw@|xb9my;U> zhl`nbDqJ0}u4ap&R?os!43M#?b+I15a7Xc2XHg!HC++UyPD2+_cS)zFi;3=a zow_da?)4ppHJ&W)F6|_`$htRl26VBidt;}ii?Qyq&ZsVyc9(ZjT{OGT=?v*&P4~H- zwl2oIH+2SevAmmiGF=RHJDml(xV78u4C`V=_j#R>bTZHKVg4So)D_S?F{`N&jv zWLq)xw(i0_<7wW=>v=72Om!Ppp_VtNx^=72)YGxNwykKsty|0MJkOikipJZzJa6V{ z-sa!XR5!JTL;2uTchDL>KTmm@4_U((gttlF%9DIxs+-t@fqZnT+p_8}%oCpG16F+? zZ%uW_d6k0?ST=;uf&iqcpF5n(?8?0b~dmyUugI-u)5$eU|J94j2%#!hA^Zd zFrJoBY3dE2G62=UZZLm=FnPWKVGIl%5VRW186+U6CV0>X5Os}sL~j6*(tJ37VLonc zlYFdfO`U}~W2SYY*0mfW(Rw&vD7d_#b&@YCAi|EYJ#hg{CQld#bACD zSL0lb=F7Mmjg3-S(EC}%#DKZmO( zR|EMCTxDF<@+Dk}0!Z{k5l=yt)<=ipmh4S?W4DRDX%<6MoxvjO)Qi2J9765x$R=eh zio88gJoQw%r5o{Jj|>3BY^l<1@0j7w@#q%a@3TgoD4k3uWel=Av&pAJ{b|7D z_F&%N!IVUfa$~n%JeA%Bqgr|Wj^VgC_Q|34pa2!>qKG=MQ04Niv!20KS^% z(Z+6+L)5#Lb!*+U$nU1Zq)4~ik*9ZT9fnVNvNDR+Mo^I<^D4%&`uifLEtQfRy;i(7 zqCTQSE##-HmCUV`tc?OlfWO{ZR{pRdkZfSf%xV`)b^|9Es{!XH9%4o=#EH6b);Vq zp!>Dj*t7O6=z?7>y#-lMi(CL=6{tp$tJ_g$PEs^sVm~N6f>ovfNk+NF-y=5CG)C|5 zHF~{I!uyv*(f7iS6e3%D3VR=Kf&c2j8OF$Aw6i)Y^3b_lf!L{6g1K=diQ*JOLZ#*- z;-K)aPu(0tBiS^BJuBMNBH|-kS0{LiVj;p*jL26MBU9sX)S-kADKCZ$R9w`|*(J3S zz)}Hd3P4P&1p+W^0EVZ=BLNsS01L$7WQRHv|57<7aj+Vc!HeS6j_1u$?Uu;;cu6$; zz0t7O8(kZXf(*PAvhAssiGFj-aN^i$Boe~8LvA?64eNm+H-+(1VJw0y62_y3@o2z! z*f3rMc!3(g9ZRJV&Mf$LI4%?bMPo^!F_;I8ScXIb4QeLdh;rl%=6ztWRLR~`*n2S; zanCbnaA_`FtKn!~D>`CxRA8;Hv?7y$yrxDxk`D76pMv80ZLLU6$aR-^ofv%5@LJ+g zR%}!iQ4sX9d_EAKV@OQ@rn+<`@s+`(`K?>JSPXBW$8k}%kUOxtB0&>?dYu$Q;VLd} z2%zOftRmK0wJ_BxhN#@Gnk}xbmR48GOHee(wiHXZcClDVksI7Rp6Wy?#8RwB2P%N9 z0=!g+YACXhGDW`06xpaA47I3fXe(y17@&qd9*(iaP2wQjL3@gj>|@Nd|0gQdx29?Q$cfc~4W);g*8EwmkMbIOUCSWztMq-J~KVo)j`cQP8lhqPF9 z*DymQTw_SQeM>hh{xRM(1zr-}6sa|H_t()~dDe*)nphhRRWV)-g__t()qv! zCdqB-Eh3vyg$Sfroa1qDQSEkD;Z|%8C2qAB;DtpYhSozWi%Um`^p6L~ zcYEq_dw7|L{PTx5O%>TA-2s1d{;0&Xn{?82QbWkob=Z?y@l?D8lNfhu;->!Q*+`N_ zv7tzd8zB)>ruJ6-UtD_UFjp50R;O0H|Fc8bFp14Mf5a3HAt<6wL+{MERIjjL+2n0e zXJjaAQ6oWEpjeSSG6f7S;_0Hksf z+Qm4+*x_5NRqTPh{1c}~jP;B=ANiFco5qF_6T&Gh`CDEy9JQx!v4P@k5mKAvTc;Kyw5}ti5xsht8v2VTU;+WFh&f=QEKl^RW!?IE zhEb<}N{u|d8_xkGrnmUIl9M8;E`for*GqI7h7h@d=im|wPDgpUIDIfa4dBIt`r=} z!msmYR8oOG)zDsPh$lt;5%4xSPsERz9a}p|q0rZw%uMp=c)E_(Gl$dHXdVNP1OVO= z#_}BVa?Szh4se2^2Mj1cbZNjEZ)7U^av^~lim)Y&g^v`Mt_efLwJxp(3YsEI4;{sk zUw+P_7g{>a287E%ny?_a&r?zGp9}(SLJ@Sl zh}+laHN`q;zFZS8r}7N=8ekUaD<57fN&xUmoHZCsO)D5n9R@*_r+u=1vH`1Ni-WHC z0GcHq=5>_!IwB^iIvV$m@~b;i$YUM#(Uu1lKSR%bT$|V9M6XAsno9Dl@g66x?orvH zIXyZG^f(uVN*q989z!f&8R*$R%=O;sWatzL(8MAM0^v{yTNJ$zQYpVe^r9ffEHSPn zQWSGA#LLXu>!?^=kt7jWL9QvQgvBtj*r%>YC_;EpSxtXDq@=!-9DDT2WnINzMO@^0 z_Qr0yaazj1OmW|)yxDFmHr5;|GZCq6>IGVJQC0V#YSD7tw7>O}DGni-)L#^-xjtj+ zO4Qe>rIXY|(o*Jn7#cI(GLtnkQB5uMEa9=p#Z{UHT2}07?!UQLeU!_|qAGu@#0|;&Sa!Vq|{8QHRPZw;xwVDJYXphw7oh*tiEIO&#QY_}!N;OR<;m&wNx z$lcgTSYpilKUTq5Fy$_-Wl6nBct-qCZxwBdS_?~?D0&^DAjWJ`7`LMKja|g5P0)Hn z9<`Tk;)NNpT)Cb|M$TA{0w|M8p`-K5y(24;o@OqymcF?-z>1Su_+tQ(eRAv;C)xOOL&T+yKq zHj9ftHKftEpM!jeLLe=f&=eQZ`PpD#n8F!R7`C$5bEa_LX4q(e2|_ACxL(ttbk3mr zdURgdu*oqfmT)$~B%!(crwz?Btu)y_!mfql&u3A(_FMa=m*UKFrkCUl77H*Qj|{W> zfOc??gNTr^4&XI*|-f@xgDH-Dz(YyU=K~MugfPUjP2zn>x>VP2{1L zCjqG87H3a7+|5B{H8a0 zQOZotDI8fKimm-2Vve_WVyG1tzx08UTF{ZHfvBZG`t~UNdGHR5V={{aNq%UnVzKR^ zuH7g?DC2s_M8S(*_YctHi#pAK&ZU><$ww>HUauv9m7S&``~jia zd)1AJcEj!1QbW-ncKl{Pks%jdPlOq-sJHH7QmWFUsR(EH5Uv z|Los=YWADIH~W3FRVBKXx9#iFlBB{za+Pdl@g#DBD)Yh8GrWK5DHc8W^JvxX+;6|3 z+gMfrC{G?(#yXe)9;f10i-(pm*=#H$lj5nPByW7?!_^2sLU+#CqM<1vejkhe!`*lr z^D+V#QcrKj9S&~VNOO{UadAF+vo2X`ldCKSH_ByFS_sk&uQ1e?(8Focy+qcfzU z&gv&ctuvw`V=0v)W!aP>=`4_H=8d({O%(OD(Q_#V)<(~vAed#fs`wwIWtVZ=S{vO+ zF|;)4&xs2 zsc>W-!?h8YVcMu=UDt#9u%w zV&zL=CXrF(VM(57g#QwAU4x%cLL%}l!wP>15@Pxl zYQ>T}`R~R%w+`17D&qewMgTPch-Z03e!hr^8KalPN$dBLWB|vDJGjJbG*zz!%hxL? zCWwlPTa^^DXc27?iN?+Mro>F*HS=d;w+>|*a`X55b+gMzR{3?*W$AoEbyp{^^PES0@j8gWLUXLqSN+ zoTg!DTBf++@`N2h$<}J++}51ix1{5U5i&AHF+`f50(e>-2T?7y9QYsrFjrc%AEE#+ z&Dm^~A2~MyKsR{R`dTd>l5lHI?^Il@HcGBR#Z#7BtH{Wzzh}r(55OhYk|YV~R(ylR z#>4Cz6T}eur+%QhiW3kn-w1V*dB{5O--G~4Wa%K?IY-nH(Ag(dQ8By5 z-qbQNf0e9hYDOd@j$DyGh_+brj9DdxtX_;zJuRz~ zy<$yVpo)=DM_U4xP{-yx>P>Zu8oB=llR|Zq7zSuU-Lt=Hy~JDRNwlocHTIo}VFu+_+2YoXk-Qb0!8WCGTGa=n% zSq}cfF<2`$Nl7SH<-&@QXcXdC2QOknfVJ8i zO{WO7(3UtOxkD86BymQnv2hwdsCWv3Jk<-s>_K7r6`xJmyy}wAtA0B6dDXvV3UP;- zGYPtxF`Gu1pr_w%8o@9m<8$T@dwu@!t2f09rF_R5VTG~yef;Lm8kE{a;(!cWA~R-F z8Y#rW)yYiF$d(i{wJ8Q}%76~Knbln$qYkEs0V~@i!J7Zdh$XW-Wb$ntAGtypr|^1G zt4#6^xVbDmsT*+;>GKR@hmt_?KxAsfuV+`!_DGT@4>uz_vQc8$D-GYMH@$& z5laXx4P^>M@v}E}nd|P>z({+g?dK`_)223_?!gn#xxCDxbxK&Ukqx!U=;Pwggg#^@ zkRC0_%%F$cwA6zz^-ltXZDm0wHn?ZpRaVB5XaKy`C1 z%I+6dT5{EsvEse|U8y)*m0j)-mpa5m)9nL*(8h((=L)YeP7RdW2MWle0!a>&frpXa zqn?iG@e|Qhap7-Cig|~x^{zHJp!EO}#fWUwcv*Yc5q(sII-%xR?cyJ3F8v1I?d4E5 ztHu+mae=1xZo1h0wJ;V{eONV4Qe!;Xq z9MyY4bWn9Qwdhizeo^gq(XOKNu2{HV((@UE7jWMlSh_QI>}O)oA5a9??Jkh%9YEZE zRU*yP;u6go|=Pj!v?K-?Fg zKVfzEayOow#B&!D2;Qbx%~i9W@BEs&SYaE%x+TkH@?Q<2uAU z*@%NGX?r;9Vyh2uH=Z2Hm^qE2ZlguIshbu%)+-;1SxDZD>(rV(_WZEzM$jC^V~M0V z*pMkJh?wbimTqx;xM8LmtQY|HAj|G5XETgTS8Fm#qgae&s2me2_=Y2)JX!~V=v4|k z0ZP&ft2huM0^B#9?4uJlkG9!ViM(Z9EF6n8h@&P^tRbz#$g2}!8A5wusW?*2FC$vA z0$3m1CX>#9=#1860dqO-4wA7g&R&YOo+51F5-sJ(jMlpKlu*c5<@&zCd z=Gsh~Dw#T1LcXMYvC;TK%wAHQ>mT`2Vo8kvANrmM@JCs@o(o^Z0Q)oa!M0QDgO!K0 z?BiVQWIhwKCu49bAG%f_^6ZIbKvy!TniXfGb^PC5XL+kYF-t*GOB7>ks3^7zf|nG- z-&7RalR3q9Wr1S0-O1>5%6F{<0GHDqVU(XQk)Dxk7-24_B-?F0$p}sy5f+vnkM9J< z569~@H_SH{UyWX~g{!CHS1Ac3B*o#+#MHe+&kp||k?$^LRMwtje++53+qU2@=<{StfC2SSECNcG<->wJD1AAYbgyMk0(@-ZS-}T5|J^w}2lzgK%Tx(? zzp$8|bd*{>kPVeyQ~2f zhd*cvS|n}-G>*%3MRXC|%*A@K9C$pxlE~MNCo}NO;_AU3sYXi9+l9zw-j0h4>IU1T z4dK|t%A{Qi9JwHlVC%24!%la3ye9)Hprq|->|o!B&)BXsp=P~7=KAchbL@=uT**RZ zea?lR&y=$8x0TGvoVu4iANo93XC6>zxcDm@?nsY$eWQHB`qC#NbkjG=Q=zXX)EC}i zWIh9XJzfYs(la|;pcbR7hf&HMi4v#l;o@?6@kD5Kl8J84W^ToeR3tb^c)*mGAcn|c zG-s7o;Q}-(3C1#@HG8mZ*;4JhVo2 zh*Dw8L0f;d9gN7mmaVP35YP}A?o>s}8A|q-^diG5PCITf@h-hT3Sw29cA|=`kH(72 zc2i?KITm-A67lg2v#kanXDm|6gb2@D7N1~JQ?)y6?eyP| zstNtAkn7A?6pu znO{da$%wwh0`zYvPxi?;PBc|7^9BlmSOP7OsA_LRSb7wY*m8Fs9^}elDrsQpUWI;^ z?9F}UlR1bM8%YrKtvTwW8Xl76D02?nt0j}<8`vV{;%V6SuT9#rsS+Pgdg5cIm+WZt z_UjB-YwbA{0MbNLkfDY|ux28DpdEEActgxUZy|G6&+D7W;K*S0ZL~mzL@2$*^RkS zE&m)RTS3^YlprFo6lVYFdlX2=dNzc{Q2QaHBfefh&# z@qDeoJXgx2{HU`3C=-`Ubmc-&-OC*hhSK=2ice0AOy=SmJ}U=c=O-!Ldi_3kiURP z$`(`F2H><9BK3zyFv3|)+h)-oUmGd$X7q`RUwxmZdBw30@=V(#3U^sPxlEmI-^hHs zrj|u&P@`5{udHd!6Z&T@p>G-|y+&i_Y~1JQX3q^XOMx1F?ge}J$vpGl5Swb(k@DYK#9I*zwhpnKCfmekGxz}N z%EXH#E4CEh8Rtip`lKvV?K?tqDpR*>5_dbN5{)21_4 z>txyb-=y%A;BsJY1uP-er3y7|v8V@t_@Bb_>4_pgaLHL-U@@G|S5Q)AcF8cHGuGnOsFJEI~yjiKe2`RG1>s3TsI5 zzmNV&(Bvh9_L-{7ZwAM=P-*3;hS!&VD}PU*8OEmG#3d7-cX`TDj>CD)B^ z?U}Dsz9UaY$~4-kAo2mxOw+rPY7OBT*c*3mJ$pm9mXZo;<>Q?Dj6PLTl1+4Md$ zb9jN`hpf2nPHab3EY&9I($qvOX(RGJcmyKuNK8bUOtkn;L}2|zM0oG}EBP?X0uA}X zLaVTts7On}ijT}%I}zB8wLg&I6qd%FI}5O6y4=#(0&E!?$v(KD(T;6MX{=@l;lcx? zav5MTA2-I4mg_(t`^xTXkU(o%ntru;Oo2&p71RX$cf6n6W?f!gH&4*Z;WaTGk8q3{s%#jsm%LBj{gIG7>EYViGZejW9cvt!tRA6L{IUST>Gr0cPXGqJHZ( z0p1L2RX>ZI@WrKTu_)LrOs#lRGOYL(JApuoxpKT^S-~7*8Jq2ie}gUii(bg=GTok1 z5Fzd3APV~DN)PzLU{37sb3RE5lBCX_j)#l2GA3SLlJ69~tbiKW@T)vfMDKl~(U*fS+a*bF? z(=`nYE}_PROmX|Wwcw#A6ii*fndpVpUg?Grfq^*Ty`CG+j|SrEvu;9@=Yo_PTTmoSFa+uz~k@H$p7I@*y=}-$5g*5G#^sJ^rU=#r9AoSB1 z1A#o+E%*Mu&+z_KzyLD2e*puwWC(+bS|N%RBnx3(-g*ISp|@%&2ubb>ZR+7bhI)hRPkR&_Z^J z{WaZz7;Vgc+Q{>|@}qZ|DO*vNFMxLhly@)?8B208AzWy#;|4`*mbM?B$d`rKKps+) zT|q)o#<-*y$E%=Rg2a6f67`IuHzQ7wR<&%g>JA7Ktz*;w9JK=>MM^>b!<9Wee&T9&UBP&~GU{`oC0go#`_Z=HC zX%kAzTQZ zeVw9aN?gDo-ggpJBVJtmL(dynEVGmIrhKc|vm3!>A@(c?P}IOyijT@}1N zeiivz@BBYNg^C6oM^RIrr4|M@oR&kB)tPV##E*Zm|LK2lI>e9vPC1cAAsPFsXGa6H z4dpEUqBp?_0qmixX>eMyoctSP8FtULN~O9LqbAF8(chJ1pOa6QF#B$^t4U+3?EuK*L;1WAFMYUoIJ<|9_Q#wwLSx-U%IV`w=p!93;e|`;l(ZA z&r|j|`P0?m>1sVCqv20q7M{NB0iFW7u5DGkYOl%bFXF5Y{>#}#Usr%ccmBBf01Fbl zX+OXuOMs|ktK1xT!YVH8Y}taW%jE-APeBbQWIv2K{H9Gd+V>|R&q zjJP=_Zk8zX;hA{Y&F)l0z-Q^hItho>Q>Z!BQOcS^-wmjZLh7&#WGwV}*T=cS*kCcE zQ_UZUFMyV@_j)&LyQ-nn6gpue-C%)ifKt6U$L=bt$=8hE<%4}t{aleeF`E0eM0J^) zmC?f;5k_0etjAu1*LGPa+bQ9p!9883^E1q8uq|2=VxGD(y0`s3-PGiznKSKKr|o=X z{53#R7N~p4tbqkbHnd7;`OYl_^%lmM0zV0@%RS=7@ra$=QUjpulIXI%jo9&dj?a3r zZnqv!ZY=h^H!H>%FL-Vs8Egnos=^*sSR+#K>h|IY^*BG&E3A=)*-HgZrRy*c(KMq= zJnM4{-qA>X@1u&!{fVL_Fd#e1|6T2P)ILU7+M~O6hLv=GvG=pn*3%9M3SG^_qWmm( zE2CYpk)BLfMf%WYTBJV|nrs&756&a~qZR4dP&t?MS7EMktD_D=F zEP_8>9iC!6n$mcG`m*p8>(NB@7|zpM51?LcJ(?!Z*Rme7W*jQ(q1Ki4K;I6?ZeuLO zdMpU5@w$`BBJdI&E$W*EVI9m2$(>d`(dJmTQdbrvm1eQ5Zf&GsghPlWkdyWbiTXib zV5_xPlFkcyq=$Kfwa)a22%0f)ySYjN0OBv{ZPrI8p?gkevw`)hK4FcFf_BRO^bLHUj zuy8qUxNJ6D%59@K&9cFLLZ)=x_X-(2_qC9@ze0v!ux`6Moq!?e*d2?I=FaKb_j{hQ zzV{Gx&_Y{hUFt%M?XsyB576LIg%HFfF(bkUP!kHy#O<|kgK6C3vuxOJ-!0=I;eVxinrJd|q zq!S*hDLi9!gKAb@U(k>T*;Vrd=3!-+WO@piHcbJ6u`;XXd|-nQ-t1mcc{IkDOeW~e z{9L}C_WsVXCLW*o0n3CawWgh#TyHcY*^PGB9DCL?A}>{-lJ(5TE%$JT*>JwC)?MX@ zUv_&G{ye~Alv0#aO^irNkluT(+jj4kqms~3X@4Fg4L9et4SYhUw42)|M5u;(8qt?4 ztFhg$muhA0Q4$H*1DSryO62WZD>VxMUj%%_JV3vLJNC>^0=^d-)X*S<|Df$7mH~l{ z_p7rR*#bnE@W4PTbhSyvE@~-EB2U=Py}<_jS!g?H-on7#isuYZ*WhQvM|?K{R_XVl{75TTw=#t$&f@AnGHv#^)p=9BWiI7@p!A#s9t;$r_xvI@r$2$G z@T1Hs>H1R0Fo^-eom`a-{N%rN;B$sr4e>g&ZWfOs52WXE&cbo-S+5LH2z%%K88gOp zt>FbZ`i1W_ymP;3k=7seM&qk8CQJ62ewm%@crM?tu_cs9CJX-cv9V%e-*mB9aHkR& z)tZGNT)T=NI8O27^1f%r5Aj^wV9|$$9-ix73;KxV<=%My&xxf{Tv41vY4qVTe8}Ljap?(ed{_E9#^6x1&5xQGj$pi{(s6E;EwIh}* zsXlomhdtvf6KOG%R-TPd2p+c&Zn11isbDE~0mC+QXv(tNZg3f|aHnh5lXXf@_nkjr zZEY(^55V4j0Q;DSQqXPE)*q<@>u!13-Gpj9A$a)1s=HMsv~fW@sn>bvZpGZ;<*INhbk`QJ)7IUX zbw?Cn-7PM=TPo(C5j^5Gb%*w{u&VBe&zyyASZK*z;_9m@{;)bc8#>I@;W>d*Kw#w9 zjhesjQQ|ak2Ba`j||Z zO`S{B;Ufrn{It*{TIRdWTvCr`Vh#OCfl&mm*xJUvQ#(s}zuhr?w8V7hd`wMfuc$q< zR7-)QK6k3=e(O;miJAd6}3;R`H>1{2xKp$H`Loe=7iRXHqutPskXM?}NP zuv%rGpk6*z%>F~IxQDhi4; zm_#R9-{*u3!-D?#q`^KKX;#c5jnP@8>Cw5=661r>dA-xQtz7K}zc%5!N3^uhY(;t! z0!W^T{HE70j>wL1W>5+ZSRb)qyH3@I%a1YL%k?YkUi(mhxtXRNMHBC1P*c{&I zCK?SDvs4(-OL5r95!Mbl?&7M(6B2F+?Hs1bs>+@laO1EMe?>>%5Wrkvqs{f|AeY*U z`o>dKK@a6|?5+8@dwFXt? zZcBKVhe1I`gg|C}TqH%F#4i^7;Rup7slRl5;+Ne?`VoT(8^+lZ5woP_zofttbJ*es zW8@it2NDWX*tu$nb`;Wr^sq5o+|#B7iZx!aFGlgY@AgKDAOC!#7~>gRrAVB%|H9{W zppG?k^GLi$(4YszMgpGU82SmwHv;6R1)uh?btMRJc0M zAF!c}yV1rFE7*IiJAx-4Fx#A^wg(vS0GAv`&^O@k;1A|X%-%5IJ(a|q*dK(SkKa0V zIZ;w@?nIYq|DL%5rYaXK(Qh=CJivxYb4Ljzg)IFlV19pnIJlg_>Tlfs0fm>0L{rNR zEMcp}D!6zt2uy&B7Yvia<1g4LSK8=tCAsdCvaje21OnFdX}BU4W3joO`vC&12fZL4 z9VmDdUs;^~Ef!dLLip0HwfFN<9kvDeVZUxF)4WMfIY%e-lIc5YM90tmFtj&Q8|J_T@60^dYj(l=}1v|u5y76rL9 zPE>6m917|Q9IHdt&B{ZeRIp$ws{r7?K^VNc_M|2Rwtr#cQi>Q%Ncm}+B3rHpQn3>% zNoyag)(br$Vf=F}K^Dfc7msy1$w7HQKhD@>6Cu@-9mwMo!q5~xE5S^pA9P_~r3)v2 zDd@s%u%3G=UEs%uR)IScQ*^=hm-VZ{L{NnZzUfw>Y=5=6#c(f}GDDWaQFNuTU) zOk4x^%ayjq7QEM5P4Z?4FCvEW&#z4CtT+L?SRL zp4=OR_wY4Pg@4!h3{Iltw5RWOKdM8LV~r2DGs`^m29IK%VU#i#)guAb!xgF*OH|pe zGC$x-#cU+v+qzcY6kvojqUL=>9b;Jz`L@%2q$+XyU04#)(?TzSXHdHsluni9F)LYf z=>IemD>+h8{#Y2!(P}v7%i$ak!_g|1yHFCw_tD{bGaD!8x=<*5Z?GGr!^8*M>R_W< zipKhq9TBf2Q8JU;0ty#n#cA__5vL0eUP5Yz_B-o{k{XKPe9qL>?outpRdbRdc~UeU5?&DEkN?=0u5 z0|mJ3Nt#=2Sx=0gURVHAX*!7!7qt^X)Q(r8b{0`H!*sHgIX-ze6`HAJ4m*519bd~; z(ea$9txw`Cz*x_aIS~IZO^6nEYaEa2Q#-zB{wx}^n32>9mK~Orq%y+ec6!7v{*a1; z<$I&Gd=SL5sPSIE<`^8QMxdh+VU>{)mNYAkwW#lYpfhI_6`LZ~iW0U7w`8y<+w-yk zun`ed-^RrtZN@~T?b~DnBx=UFdD(#Pz&V_>bM9o|+!Gb&PLvE|Z;j2&dTAH7F%j^j zXt|hHUSbo%rHV;j;-IUvi_h3Zb~oT4Hi5xlqOX0xf!vtUH6^)WP#-k-QlMGXvOfhrn!KNP@D60+&#n{*%-= z|4|(c@sn=77|Fg%vKZ0m=o<6{cFH&({|u^FAaOrdNAVA*F5A z?N>e%$1>Mjo(=e%sqoqN-r(5Jak_=Tnml{9`h2K;uBv_c=R@ras_j|oi=ozqs@C40 z!;WBCi$m}BAPDX3_yn2+aOU2~Ly=U&KEX7ZgcXZYnv@*puDB%lT6D58^3=TJlcB3i zRafWVg{-LY<$!+sm7@EVQ1P-V68gu({;h~Qg`vVHd|F1gB_u|<4h6ce?G9?_2u0rC zR?bZrbnGMtv4z1H%Wbtno2y{F9JkHHaSzoIQvhAxv1oO&%LH_)|A;a(q^af<3Nd7} zbWT~vVrl*0t6<{4nHsZoj7&PeuS*W$deL=FM^Cw!=yH_Hkd6xar;~O#y-r0j3LK8F z0S+G`U|^!def;Dgpo{~~kYxQ!;P{239=M(XF}Q4qD=9pn?KYesZrktlfggwA_2t7Rysc!?_(v@f)A5krrYQ zbQ@-3MkwwztEY2BOL#^7GvOA$6lRCLlnHLpteP{H`E2js76kZuPxNHUU2t3^zx4KM zMKUs1Z{|+2g`DY=G+9mJUlFGLCB^6DkS+gRLHE&Rffc+Kp318$VJ)%M=Wz5j9)wn@ zJxfjXq&$oz$b_e*U1r}M&--fjS(5jw!W@!Wjt15jyFOhjx*&8-`m%$skG|kcJa^>9qtXQJ` zuLH(h9lr98F#2-$-JFkhJw8F(foiJ+$z&eUYlP=e0VBGpE+n~-O;L&@NBNP+elC(g z!$x(+M`cGC*#fYSLD;oE7f@gk$Tm5NuPign*U%}NRb`zKAs~?DU{S;h>1LrX+aO1Vpo`-jDdAkFl035 zhX|@zXm`*G=;u4mWNb=)h0|Arvggc6#QkoJ~&Ho zp`0oU{K%O|-u^(`ej}eknQ+@g)_05Ljn*fU>LXqMc3@%(Y7)Te6O3@BVw?wbHZ~X0 zI)W%%?IR`#2zl!wFCUtSynM*xS z7l@E-n;l!Vm$O5HLcf8lPlo35K!XmQ(ebTZ!;s|^NVO%A0?hUgUZZgzVeGS?z(F90 zgQgeyWTlK|Kb!cGI+)jL&mhN7%=uE@%^N#Ej6Nm5lrJJQ11n~)oHkfIm(WcI!gN`M zBwFNWUio7SxvU8nm@NIq89!@s_cHO6%_;nL($Lf%J0c78IC-%#J@Cd4J?tmW} zciA^|6{UcY-oY0sF2#^Ze*4i#)M3NQ9EpF(#2uj(1g^VK4>is%B)|D zmkLK2P!qOcMAUJ_kp{Xloe>h4Y{z8>^;+KH*Lvo|7r^_^Oz;Qj@-aVdC1ZN_{4{(O6h$^NI?08Nygf!(NIkVzE4xP>w z9?Tm~v4iKq$j^MpNK+YkC%yOQo=86;80%{aM27L2l{1XQMK;%p^&{%yKPAP3ZfG{spPFiKigLE*qE3r)6`RayeKn!YvNA)XCMdiE>d^ z5XvFyb!>s`MsuSmjxyi@ISG>+45ZatK>?<--{xRpT=Bm!nZ%zzY#THvCMsQ#&%9q%ZYZT21Ib2AEt)K~fp5B{66 z(+Usn`2d)P>AA)Nh(ctwakm|6uL zU2KPw4ts~_C=iI;v>A$c0PDznYfhTMg}>*(FV53I3EWVg%-Q+h7k3#ejKR)i=O;3Z z@S3g^JCx^<2TNRGo5iu}+O4yWYn@Ylshaz=6M{P}e-LCoX zH1+*z&tX?TkGI0L7zdlhDzlltQ1c*O>#TUY(*OHBvR05?p|bp1G6`MJe$;bS8eJKo z->0*Llrf@+upkt6*j-j!^xc69Mvz7b)&76Kb`d7zv>cb70IwjRIK0fJ<%zJ*oUtIAl zr~Uk`?fW3$z-^W+C=bvI2E>Egfct%>7-pi%$&c^^hp^v9-yoTvus{thFb_?zU?<@) z@Ynjl@9}}(>jOVfVswsth2v`6eb6i4@0B0+$`|*LRg~{n^293}tERp3X0QBcuo}1v zWSzXRVIE9}IiAXbm{`_)#klqLU_tN;9=KAs3ZwlR>LF4WAnPhd>+{eKg|#&EVj9y1DfFRLPhX?qEccD*Q6 z0ea&uDJw}r^b?R0Sf28&fq}VeS+_Uq6rQ<$F3_S*hNB=n_#HAOzZ_SyPLG|;WPazP zQ}ej}35w~PRibCSaG~+Ir^ zN&z{y3wLfe`0YJmjCpDT478=iAKs`eo_2fLDDS5*YQcqjJzBB{Ojqna{@DdDi@#p;~eLOA@Yv?adwkb%8QO;4w1=;T8A{M+#f1bK%{i>D{ec6a)P3=l=JuM>ok7WRp@_16z7FMcn|Q8=K6SXG>cDEv}}=@tEF0!fH*< zX`yc@H7aw1vc?MQBAuiqv&fFTd$aEAt3VuRVE~Q(WE_Q6=`lh>< z<>{79cxP=PF%u=*#@)jO%qx~Y!hd8@ny*~Of*5OI$t2@I9Jto++_8GtQNU~?li6kj z(-aJMQ(j}ffXwjqO{Zpc(%eQg)E(wm=BK)&jEtqe!Icq2+uCjM>+`k&l;-^I0k=Sz zL8@8C8Onz>&F~?qZCmf5=FS*=48nloBO}35JDgt)p}=zOBHR<_gLYmRzeq65>enFj zw6A0%&c{LVAe4S7Kwkl0dn5=D0;UkmOg=K!M=>^{&Y>K47~cme7|;C<@jeQM!)c-d zk!q{>RqW9zk1$y;nsg{7H4p~`A5bh|S~(j^)_m=ry{{>RCc=utT#SX z7x~3C=$LGBn)D#|H>XEMXaZs&$N(6ccEhSAOP2=0Roa%LGXIj?jpkqWW^-7pWHOg2 z0v`Tro@wECp4_x(gRhwui4mp}VJJ-tcQP&V__7c4O-s^#qw&y`MXqqJ@tWI%N$E2L z&-&5B%ql{-XcM~2KB4=`G#(76QMkDp$4<%i+E)fSh{EG)f20S_vO!iwv9mY|b87D zZ%JF!DJD=TbcP(WrCQ)-AbM!3GbYWEn_$9kKT}XggZlJ`1$SaC=_cCEuNVlJ#HEPs z2o_^um-V-xIz)!1I$;>&b4TOaArM%GmZ#sVe3pgup8V%vkbU!6G3KYO!VGlCNNl+1 zzpE)r<`?^y8f6pNKXk#lh(Vvr#d2+}4cclCi}}t| zWyg#NLzU6&g4L!eu%L>4gl#o3Gkna@)R_l~Ok7g&No%1Z%9syMeCivj3>Z^Qo8Q`$ z0HQ!XTbOD6J!{ME)=5Z_ zs;k6?7A2|!J!P+XtFQmyMRDwNpen3T_%SaySNg-$(318mA}CnJcW{o?EQMhjR)hdx zN9R~J^n+*$BZFm&W!dtiwM{Gc%!v>W1Hd4FgW{k|vW2!$N3(}c902oBd1T-VdKWcS zQM=RTDP*-|5PByl(V5PP_BNr4*BExhG~m)mB({*I>xws$k@HUCfctHHND_uYB2 zvk#A*3Zid|x3_dyG^B@ttq)|qL&1GF^4Umo2h(gva(Q`Cb6c@8(UaHmk_h4UQU=SV zeEZ5rYUA#YYlio28zvsqBP9&{qYDP+vs%Lx zo$~#z6r1FxT@_8isRu%S?l`C1{8A$xmg839)iYd66uQ@oF=T->x-6#g0=jki_GPJC z3Fk}u&l3y~>l-u3wX6aL8FY~iXjW^VQY>Y^0%IKpw?zYmPPoL<_sDZyRAho*UDV4(7?}iEm(3&%ZoxzHwvwaiR@Tf-in-@Jb?*Mv@F#{nvsV^*7l3M7br_$CQPP(@7YnIdAi> zWt@^ZOvlMIX=Hoe=4crq8rjCgS|LN$VACQno$mZ}6`5J@@->`LwGd}Pb6Vtsn&Tq| zgLmsRH%KsOBp4J4px^yG!G@+#*Ph~HiyJMDHSf+3D zGqx1XE-wxK03Yc^e4+=B2(`p|5_gEOeueB|FHlQnvN6*ZATe+b)>bMx(T`bRJo}!@ z`>S*oN%$@(4D_fsw(y$}hfAPVxL_6d$nU`ppQw=oSWwKmrpN7d}I- z!G7E{vV`g2Iv#$L!^4%nxj-^P^@_MS|2P3pG5gt}c6_6Nm>bYiFnBMCivK>#uYk1Q z3YKyEt!(Mv9JRiv35_1`8-~TXqrMF&MFq_PcQG*U9Db!N!E2P1MvC-+70aUjh=ti~ zzIuevvE6t_ri zD|35Wg^<)nTMS`B)PeNWIr-M%T0AP-rzEf2zD!2%iW@!I&?rE{UPM9)aZw;q z;9b1`X@16mOGh2#K}&fD7UghlZ?dTtzcGZ)4={XwJ3VR11R{!tEQpq9ip*ff z51Geo+R#&CEF;G>)Du!23m!M(h!iyeB-P3TrnmMQU~9A;)lVM5RfMW#pw*X@m9ivUbZB_c?^M1-fqPz1%rRJw@7MFaWZh)7$=hw{^T zlV1qo=M`A!U=$jr2~|`I6^!W@Dro*lC$iC${A)p!O01$FRt*;`a$Po12GAW6#k!*| zSp2TE1dGis`4BlAu^h(cNM`Z=&kou8evu<$W<+4U?42>*M2JhMZ5AAF2i;v1O--W$ z+HyqeGLc`hndT#!4}y@HjHIw%h{PaRn!2?SrF(fa3F7OzNjCZNsDp%>3FxG{0RQ&1 zLX%Q(iDpnv`iP3d=wI>M(OWk9`wMz(^n*&W7Evw{h&O7Es-XLI*cadO1r~WqAmG1* zhS4tLd7Ft1brsabA=}lTreJ2Ip)<3VRw%!N2+<2`1?@Ms?qQ+H(jW@yONf?LVQIaB zhy{UV-zM?l5Xnol{;z8RL{o{A0*cB^6Pok^v=oXG)K{TMeir-3o*%~jb022oly)Wl zW|lN}q>o`U^wExII`A)=8Czm@T;WocmsKv*T#!~;#FO4uD5o`vpDRJ(noQMe)TlWd$oOv>s%kH=YBmVM;hj&x!kU$iat(HJdw3iGEc=s~j zKW3gtsU8BnRK%%%+D6WYWN&zGz-)@j<6A)%;67!g$H@c<;~BQR{i7EB!$~M68Zfro z{d!DvTJK3b#)W}EdO%VCDRo*WFVKEy4j{>-u?Swli<^@OGe^vmy{@qc!=jjBaksatPc(v{C5K7lV8*s# z2jQ@la9AaFI^MWNwFx79mJijhs@>SqC0n{g;CO3oMLj7Rnncm=4AS0K1eA(E8iSPN zjZG**h>|#(T~W{CmRV>d{yH0q$Sp^2IzZ|NIlv17TZuVtS4K-T^CxvK?{1{vqkkzO zd1(E(UaXwYVmThf)YdliTAfnlYN%#hqb^Q7b%CW)HS3BgpQ2nSxi-2^@Wc+5?6sqU zx@fMA(neg4j2{rJMm8?=tqWK5l+8dYoF}9$@ zw1}~rBEGIlvk}W)G>b)@lz$0kfW5w?ST#|OZX2BG^50``?`FSJOt_y0&Fr3KQeZiu z6wisyW1to>7b;sPid@1jfo@XhmmqLev8~Cq-a+?~9lS`PGZeQ{>KsIsI{8lJ&QR)z zINhHQ<$+M@tSvp)(N8LM@{>xPIHXd?^{CXTGb(i$i%K0tp;AW_sAMu|B{Nhjbu59N z>zjX-`k-E=zC>54&xBR#D`A!T_*A7nZB(gG3RUW3L6!O(P^G>GRC)egl&yC(MS^pO zI1>R76nb?ql*bSH{mxLH`4zuE5XzH*WG6y-tR!J54~6ncHgyTEHg~Dq8_M0G+!@L% zAMy8xLU|yR`$M@ml)FRuWMIw3P@WIv*-)Mi<*`s63gv-N?hWPcP?oILwld*)B9zBM zc_fsFLb*Sb=h^yY;|t~KP-;t5svh{*0x?hNIX4>;T> zLwPZjXG3{1lqW)YER+XAxj&S9L%BPYJ41Qp{Q-U`FNX41D365lP$&+cVSa`$e(KfcS$J)u1J6MlazlzV~+*k>l-<8Mxeb|i{? zXB*{iTJlh*$?Ozo>WX0I9?j0XQ)LeKR2|nCSqzhy6~S{^1ZjtFp0WHGYZT$@G@JlskVRI>Wq1vysRT@Yjws|XQ$O!;dRE#I!DSn6Mi58 zt5emc|7r=!W;GDUm!ODOh;|4!VkW`LvL!f6IqJk%VWB%R!Qb}Jc*2+Z3g42OQ(II@ zESV1RwY7jjt#X_uN}S{s4DU6<`(1{&9k#2_e#7|XF|3X@)3)Djb#8Y!lVzQ-RoKr2 zj@v(Bl{R>#^<^cw8Uw_(aUkuoN_Lbmziv}jk{_~4`ii!!#8V<{_lH#It2wvv&ZNGp^1z z)I9<{Q=Xj-Se~h{R6J=|o|}i|vm+ZEZr}0j@i`yxIalGMxYqFD5M{K&UCzZ&?Lt*8 zd`&?r+p7JP*`+5#HBP$?imj;Fpj~EkO=R*C2{YH8LCsdn(+Qe;lsK#lnp_(RJ7Q1P-W%c)1eGdxuhWZ?K8tQ8@X7xG1$m?_J zDeyhe;6O2R~v7V6j#E zd3r=Y6o$bGf`K}kirQ!ohhdbSPrWh>^?HqAn9N)?2s5DCObY5l8V~@2C1nwG?_67| zu_5gYUBI5k{~ZYkbB{3JY4u60(@NZ~FE>n8ly%+d*FjGd2=rLSd2rU@@v1{* z39Q5N7`T!G7zbs{V7m(VFy{mEo(x`_dA4afFwYLgFy=9T(iUUF8P7n%Cq*+HE7Sg( zPx?&kVB<65=gBY{&PWUVRIbBDbL!tg0C5jN=#2Kt(jtJwUf(;%Z9XGZPX|;vBrKq+ zbc~_OAz>Jh=P5?w=q_W=nW~nOHCF4~`~f{H0acpv1#_@|M)JwwV201R9zG|sHOyzRkQQH!sLY0z6_Pi zRW;?OtlA7o+%g*9$(KSlJz*Kz9f8tUR*fIbsjBS`)pk|Yl-;swd(yd+*%13(<1>*2 zFE0^6Mfzs7k`aaND4s9kDR{6-iq9~;vbj0xq=4S1y3csByEmY{r$SrFI7541-{|&- zYWu2c%GFu5*}iHALbchdno@aI?O-56?_=>>Wev=?&;5-DPqUj_S*1Y{ZAi}0n6UXY z38&oHxcS(-49o}^SYa$)*#0CzKoJArIa8kr0 zc{&tmb+Dq9(w#=D!$#8G7GN9+)ecwHlnu3NM^;28o{Uqs%3;}OT$ExqN}}GUVNQuRRn6&PROf_myT(au&zq-svFx&c)Mg>YezEY z1P`iSp1|}S3^@st{!rprpxe=kZpt1T-Hr#kY2n=G0kjRCNnh=ROBL&dD3Nk0fTfeN zk1IhEoYqv5Hen-*su4{{l{F#?Mx=e!|0;?&dGr%Zwl~#&i$Wbicq813xrECFW`oh% z2&XjMDh}!>=MHv2u=-;&Jb24BcrDYSIi{3s;TwVk30 zd9+B3c!}7O!f`%5)=r4H{gh*3R%l$w??#as{+*Ia_GY462q~!&VhsvWv z=lIvBi3)6D)QiVX2HreT@kXm8#+y@tH&s&A1NVY`xYapgCFMQDHvwN-3AhoV?E^Qd z!|7n$~=XtB{=ezg4r)yb~Wyz4bw-uHWTS2|rA?{$7RS!p& zEZY&mo#kP97&W+8d-T*~l6yq`q&Q272J{3D#7gGq##m<4L zF3yid`TNzLM-}NGno*&czz^3iPDjmR2tVcm6KJFESXfbd7Z)xPjyJOrs3P3TgJ6bg z+A!UjrpgKu5g~+SZRn{ehKmF-6EW9pU7SU$RbmrQp|o@0oW*jUbk#f>>OCx1vrJA4 zznvI0=t69R%eA!0o?1*rg7GqABU;l}XkMFUPUPa~gbtQal+ByTf_8erg+g6fwFvbW z(g2*R2SBk$55S9wRM{NRLI+N$zFuPXRazjNubzLxtm(5bor%HJTA+r&*f;+N(A@ZRoeHfA=U&AzCl$jM4CZ_qH{c)$n`W22Q2nIGV zG0orgX)82KFm(yGyp)B#JN4~Q^o@PW;ssd{|)@1e*4Cq16}yXx^H zsmF)w(Nt8O-u{hxTXxBra@0~Wc8~E9dMxj3H9xfCM}kFpH>I-~Cw;S(E6PC*38**B zw6!uTxDQUfEn1Y6*b>v71%R;$IVwB8RXg9MzOR@3E~ubWDtZqjY!;?twDDBpKlt~( zo3!1r>*3slbu@r#j|y_@fS|UZC0~NdtzM)#2Lc>BbtBU8XIHd$I;!dNhs3 zk$N;4_~6)BCyNII2}R5|Wm zb{NRBaQL3D!GHN=g6dQaRhpKB&Ci4CVs4a5eZ5rdbK(pcY2k>&;Rn73D4$ADp01%( z%8zl!Ch)c3`$Q`CbX`mtK`!>pM6qX6v1jUHN*HpnGcFdn63?Y#XX;{4xmfwkUo7FM z$}aN9XF(X@D4*6bMJ$(p^xc2 z7P+32nUxyy*~WKAX{mIZ=C$2=WzG5RE*_%^{uI_6b!);+7`(J~kLRGWY~A#|6el+- zG*7Fkw7-{kT<(v{^&*Ofn66aFNedD=!8m{dtEgcR7W}4B^Xmmq_{B5YvN)s7$;*xS zj%*Hpk7vhMWQLYRN@|eQ3)T1=eVbZ82Py4J>>`EW|e$qvg-garsivk()$Z z{!1+5qJuOTV!;jtiv`GCb>}7d4U>+N=M!0-t;y=)ih$0EfDp+G&5C$l`Aymf9W1gl zt5#|*37OLFnV3v@NhH}&`1D{hf|6w8$Y8p5R_i$c@L5*4DGA`;nt-Q*1PI-WY!qH( zA=nq}r1&ss)(3H#@biLz^nw`iPh{m6DU_9ewWR22w{%WLNt%eFPjTwJi~hGIMNhft z3lv??=JbP6pT>al#Vn{lLM7~opvdkf&8JxZ>TqjW`G@i7+HLkX&w>%%I;AeIN@od`$5 zV|B$xT=v~6qkI>;86M5bbH4#LD=X=6rrlQ#Q^sdYPgC{~WodJ|Zu5}qIg;9ZMD-n{ z%%EVKOMUn5y0(KZ`KU@PR4qQ7E%jk7xW!{`@j%9k1|rW5w>Yd@ykDI>ks5qV)#2J$ zY;bP{{XHrtU#<@qFfjL)4^^HT!FIPwoKy)sP66&ND4;$7XoraK3B89425HowB>C z0-IET^~pX*$^~wOSn6}1uG8yJ=r!&|zrKFyU~Uv4JwpLyu7M4Cz8J~XHD1@NhBFip zq|d6RB2F%HZ4>SAJQ<6UE-0iXEzpDUH{We&zAH{Nai6 zkEHU4>+(wTb+IE8#U4$?j?~4J1?*zST= zB=$Xki7R+?pfpRCOLzyChN2%&Ae^W{c%cH}WCG#kJEJNvD`ylC;fyLWdS<#_LXh^H zBQPt^2&Uv&XpQApBE0(SwSQ=li-fn6HQtoZ?V&pb-UiBGLYs?)TUS~u@hWWu^0P}f zNnlaK5F(L4l$PWYG#i6;l<;^nt8l_JxAregMpx~bj+7qL*2^PcekFSzH|~dCbLJ6cfkPteusGN;S?2N z{m)OjXhJ(TRIj6M~)Q;I{t_m?D8Jw8F)nW@>5+ulE11eC)r1?)neS$IelK z7Sm7HgOK)(X8DK5Dl+SzO~sz6i)q;l3C7Ejb?^Q>CNmO4D_~eppOa+N+-9y0Z-Hz!1yOuQN-+8z8 zj)@fovJIGy#~6+7Y?$ouo-7L(|_qk$b84 zDfhBcv$T$gYznLpR}?0A*s_x#BXKT(74BnL4*@HBXG)~vsX={r0`*W0s+K4jXNQF| z4Q2=}ELeIxl|E6I)>KIzVXgHZHDDs{3hrIlRjyR?8yts~MZ zFV}QxNxSbcI-g8co~oefmz)g6?)l-Mh>CgIhja@rmF-sGuBl=4(+ z|MX(}EIKn$YSmfn%R|q!JXx}ZA(W)y)HV5CSz^{GaQ6%K29hg*28-Se+_Ix640OHBNt)0Iy1_&}!}Cb0gp&!9Vw5 zj?!hW@mLak@d!6IFSE}~Z&uVcEDWSW=%-QCCs{_zk;;CZi}K5u?NKVrlj5cN=L#BA5V z`<3Q0_;?ok&R1y?f@?8VrC@4Oyk2c{@x^H9#Sja&lE@^TZsPlCaaZR*@!O1 z4ChP?IB1(R+`q;d){NbPD7ud3C|4yTFsO2+SrgKw=Og{Nk)$vr9=C*$90IB!*@p)bX8W~c12(sa4OVgn z%Td46;Cxv`+&S62KGi&|dLHOE-Yo=%|LEma{y)B~%HR1iL4SF*|Io{l1baR;0S_aDRE;HNnj=A@-@=~qf*~Xh%Yq}* zQ%qm0SNN$+Pk@3ciFH5*=}RSczB5sHEyW=~IXhLjf;Djr0~WF(uQFIo>@aE8+2nA4 zu?}K*I>nHCHnM*Mii1|qu;-Lob0;r4=Oz6Izu(PzqH=i)a>stIa=1gjfKtn#mU!<; zoVhe>nM}bV&iAZe;2357_~Rt;Winmd>gr>adfdNey;VU{AX-EMOnd%ZL~ibuq#&_vQZ zHBm?wU_5{_JHYHg=O-@4rMPv@B%UtjyHy~_Pk0QZtcW&-)kz`DNAW&JLu|(S3dAk9 z#o#^t*e&o#Ubz7|k^ulv5GQ7~)kP?Ge7T_V)V80np4ytq^xCLwXyZ~q)6REH!e05W zKZS!(${>i^qmA>tdFPR=Jp7B(9t5s-kb%I~nC-EMjVYstJN+NN!WGQQ-uSYD-8);} zCRAIG>Vwg8A-*w6zAZ+2P%Pg9Fr0>MTZtnH3J|r^d4sdSQ>jK%IkOYU2XTyH-eAuJ z2yCDO(z)C^GX{Z#vGo9NVYn~Woj%Uuw z?*|D}f|2(pYZT@dD&gkDZ-|ZTEt_V2@EV?{dtxV0qENh0kCl(XZvQ}`ptjK?lOE(7npjAt;h%L?xfB*!SH^ihL0x;Srq z;4~f|ytlW^Wa5!31uMZN`o@`@&}Oe-8^}B%$yCn4!ZZ+^PFg9zqVU4NJJL;k`a?&t zKw(in#Ul4Kv9Hd$x_osKk872VIFdyLVnb6 zOZmf}icD-*X!q$k3ItEH7qyA0vk1p^s_Mm5)eEW$qeBUyuI_qfoGY^F@g)_bs%!1p z6_oPpA_Iv8S28=C5sX?j_83Skh$R^6O<j~-&yoglV6ucoNCi(!!A9N zXVR51TAYHge9nv2@RFIQnbjAEQ!6^cMlRH7H;FfboQB<@w*`LiZJn?TAQMhhc+&xu zrZpH^`BI8O@}os-T=1J}0<$Hk9%yG!9x%qUWiAb*a^KGu%g$?jhxp$q>UB~{EOBrv zcU5@4LnWS63CB^@+MSaS+#V2YPYud)S_(#NLTMfbHxpmP#t>gj?p)Tw!WZA&;;mMZvGHtyE|C1BTdo{z1bx5S-L)vuQ zY)l&-I&q{m#swTn0-2N`e(C>UhC1j=Q;;K9imtXZ?t>55Lpb4F;f=+z?Gi*J%HKPh zrfjbH#lr5lkB3M1gfx;|S+6yZw*Ul}EftN6mntku*WMz$MD{doLp(-w42XTobN4%MiMwm$3JUgFqEK zUXDF9Sk7lv(@z-8gaN5aPJjvr#Ru+%1luzd+Gm2w9Sg6-u3LSP&pp~|Pdl;~X;!wJhw^XuX%$Z9HBRQiY!al~^byDO|3cL>G$P-ExF?$#DbAgR2 zU~L2%^Q&tY^(Wzay#havP=hGRs{r5$1F0#Rc1HvUEXoleq>_KEmLhtr>Kz*{cz{G7 zFk_@lN{e~!i{zg;kA+29k@X@U4E)Jz*#du2=17o!U$3MrYj9rg@ur>zv#81cvKNG) z1Osm#t6`v-6Z*lGlrObTA{e$He;|no92G(Vf?ty)vMK@*6QN-WoTNZ)DexO{O~0>- zgdlJA;M|>ERO5J@a@Oe0Db)+n+X|Ry)C=KYhNk!*`=w4v@J|g)P&`uhv>PS=*D}j7 zwp2X{b86rFl_M_vgI&ih*4Y}^>mQVRmT+T_(=#py&nT-zGtjQNZvIIXmCkQ<-@i2_ zot(D4{sw&N8&JS}&^OPeY7y4{eP{K}9rZULLf?e`s&5eRE_*Ir@2bAp!Oc&Ajv21R zP1|L=N@)8E(;T5(S?{0B;wZM-cZdDGg8GoYwTG$l*i{}TdesA2-i}6E<{$n}+lGn2 zlx_&QF_nu!@@R)AOiSja zs%@30;*>eY<8I9^pXQjvu{Z-sZ7TB9Pqta+`hHD7vg5a_^Y^GGX#Db*n;ZCLQS!@=KdFNxwbOOG+)!REY=8UO*Eg_SRo~vYETo3Tb}4bgzaD4rD6$90 zs7yzkER6Fw>tx>p?46tLzmM%g*a(4hRDSToANsxH=VtBz6tmoxbkBClcFC$>;ZVF@ zI7*u4->NB)vq`*;Y>6q%A%1R&gX(S^pvxFC7`9H^VX$Rp6*id=8!N1g zSj}UN7R(Bl07@wvymGk?SP&Im*vJ+7y&gT&FGz9OS-wU)zYD*XP~KYu#;^U2X}F92 zFmtq=svGx8#KY#%YCNI}(JV{|eskf7LIsQ{E1<|x)#eJ`5!NkwUi&;Y1ci_CQ@EJa z4WtZkPK!Y7rVeKngeekdLf0e?W!k9yU@LE*ue@#CsW=D|3;|c&-Jm;&Ay=#i9Z1jD zQ{oGd$W0ZgMyGOlAJigxZ@p4tz^I`<2h--`sdZ*+eRRo%H9t{I4oSM5Srj zE&VG;jYFq=1(4D(}VceU$e%}MbAHfl(-?tN;ZfZ?h zQ#<(+_bysH-GJv&LE-PK${xDv{K9IsXp;2g*`tQKbBC^4@CWpw{Ca{%z=ow_02z74 zwwVAVY9RpSVlse3e@6IguJJ#J|J6Xzoz%_-=nw=jA~{@L{NT=NKq{t7gewLFW_L$f z6l4~oUPD%hxu~UR)$GE=MMr~L%sec?&F!UJ;yU_F^0=~WDEJ~Ae;p*uj%eqt08Lw; z$K+fM8E8b$eat?+<{Q+nH|^%HT|jT%L&vkDqd5Ck7|I|b^bY+SevV8RleO66x~hxe zzi-hCPhk;1Y*fg&HkhM!V20<3Sk+@TaVm24HKvBU2dOTZ8d}1GUm9QUe@^{e>i4eD zTBuF2GQ8EM)F1k-ZrSE%Yv=Iu)-KSRq-2=6A%<+(NacPH1rgAx6!9dLnil19=s}bs z==Z)TRkr3+L7jpqouwl2@|_=#276VB)luRqRxp`UTw1z4oJVw2*?>dVF!uxMSOue{o=_CaL4TUupz8J7!6>n*1yvfv`+G!1WF=bAzNqZBViJAfSOTb9P|(t z{7Vo!dMCf0p{K>3I!{FUeL*5o66}J8`)aF=>P5)vUskdetmCI8yJZPR>XL@X?nV0T zRe^#d{59H-I~u1yJrz-pbX7fduXw2z6dfF#?&qCFO)IF8Rlgcm2j^3YC8)8h*H;9+ zujn4WE~G0brK#Bcak)1x_rzsaTz16e&bScd)(6DGH8{7#FNM|9*we#Jo=ch+0Bs(o zz4*~nel=Fz81<&*JNO)=-KC4rG`zBGZ(S?;xf{-hGPrxj6{wQMe?H@fLtdC3vum2U z{%iU_B@pzcrUp|3j#AO`XiP9F9lv2_irY563J3OuNJPf)H8cy|Un>rY>fj$6Q%a>~ zDT0R0ayK-t8-8QFyhbIl+Fa6>C%U8xi8?qEAX*DGsEqI=1kKHYh9#r*;etZUm172` z3tC_WsIS$rA!03dlQhJD8v2sFj0?Z)d^KN^x6v4h+p)P`Lysg$!b8->XHi8EWbOO{c z)GP(D>Lx&C-Hkvc6Iq}VlohDHOy>Y9M^&?=e?;7+F@3F&D@U_4{FhaT(8$+OtN_{> zd|(mskXw_Ghe2ckYvrg$GU8W|BO(O3MMf_!7a|!Q-AHCcCXg&O^FkyuZk&W<9K%jU zBNprbOXOBT2p7T_{)GgikSs#bj;mi0Mu9IK27*9ZRPB14QoB%Ny)d8q13#W9^Irr! zBmx;8Y3nPB=8|0{L&w&&34CMhs{RCYRXa_hP)@H5FRA?o+p+=@7G zf;p54Ns6!eTNGC5jrultic~CVtqNz5Um-4nAz5C9*p|VfdCEEpnFzErIlGJplO+@> zx?(cK=*yBB{B?$VF5kqIKu~2^DrJUXAiE^&jhB|m;K<4wc9#qL_l!_c%g%k}rahx3 zA!%7ISlO-em&h0?Ka!2|^7DMDn$D4#!6zp;8!hAaOE1~Hsp}Dea*Emx>WLbw`en(h z_^&p$`NQ;FTx0otN<-+kx8JG6!8_;6Wk&g;ofrh~+o9cLU zy(wlOfeq6ju*N8WWqQ+4#0X6TDR)i7;#_Z?9)le!&qC3i_l7k)c9)w7%$9%qQWGTM z+21;oyP%{SGZQg+iVW<9>?WN%gf@q6Kp7@Cs1*wC1-YQqTX1CMJ-f>tlhrlPudXvu z9VZ-K&_qWg*1?xoF55lsl+*X_p}~dWRzRD%m8UQLTyxv*J%Ys$sBw0Vp-Tcf^&%_p z-(B8w6Q8uU%J{Cjve>qsMccg^9zAQG2ahlUJe-fGWBbbG0nI{do{_#m4h>_W7clQB zGJ(?qoQR_fBn7i1Ha9l6!-=H4hg=a!m>&br zhaJvWYH`S&Hd|_cV@AF9Q5Vgv!6JK{SqKv73nh8foCmaH%%@P)Tru7WDb(~_T!6Oy zl&WslGoa3fKb7H_zyVW5`HFn-ft-Z10MdYF<>iVTa~j)A&E0qcvyl{Hm=7_S`^IEN zyb=EwmABO?5=B~qXxs$male?_Htx_jGUyAQuqPC~U~sS+zA?iQKbv=3%!wAxS41&% zuj8!oU@2Vg(*Z*r*49(BQRZ<>q*d<(PY+mhij*|1gf3taUhz6hMn zM~o+>qv`Vyku+wM* zpq1O4qC*RDVaLiB5EgKGUH;jt-4N&2vwb%>dv^C9V452VhKH zC>m8K)R)1byq@tc9%r5|WE>}l2SVGM)3b~&GedtaliXs&AsHb>_Z)io^v}0Mz(r%r zxTRy?!9&4KE<(upxcq$`<>_n4y5yT@r2;eUrN}VNQV>;yhh?I+RIA% z(5c4FY8IeRMSKy=UF+wXbP6fPfF#)_yjIP)mg@{jx6J=lF*PsN;HT-Lvp0KN`O`&Y z@j?tuzE%1w0mlDZ*IFOdAc)OFT9KkDH3}|_Uij9cD;eZ!w=Ag-ICNeU0J0u~unKjO zwKWe73MobRW~L18bQ*@5?6JqHyQPxyVcImS_^KcyCMVdm6bF%P&Cc$2nGOst|ENa+ zJhVTKd(wp+>1lK#3g9@LEj0P>P@&}$(vx(X>gfHB1|sf&E?W6AAKhoHa_USW6}_PYHZn; zK4vdN)0IX{h&nW4b8}ZD>CDt%&mm5cfjhe~#I`sgq@r;oWU<_+#_Hj**+qOCkky}) zur#U8B+G>{t1&2if)VYrWn=aUnKN~#g-5b+fx>OJrQeDOUV)PbXI%|bt{ey z5v#!S(@HE&jccRw)`-Ug%}7WHE`-Emusvagf2c&%uP}f@0&O9W9v~A?SItB`h5>l6 z+s`ZxS?nbscq-_p7Qb=!D?|A808eV0<2;x|X>JdNe~3RIe$8uIFW-Cc`q* z%KRREU>wv3Og~NBr~wU}T!_eI>o2 z5J?;YFa;kx(IV?lQbq9tAd2A*s?tGd6 zjZZkmT$m8#d@=4Ko`I_?Gf`kl%Z7N`TPcuRuy~?KLMGT}*rokuGf0r@PLO9$Rb*rv zJ5vVH37Ty9a~l95Z)hdoMDD{xOWNd8{?($t6;{;eaCt@$BVL>g*o1GgDXf3@u!7VL z<%PD30V=$x0Qy(6B7|b9YlUd&)bgC}u-r5!6~g_Bv3*?JpF{uTjt z80L-&ZnsfE zV;2Ruzi*VOKQi2kDGVvVWw`xuu9k$&tZF8!rV#8kT*UO7Dap98WI;+yM^3?YT*L;V zGss)9C&a4eJ9~?!sSRJUT<$207wja8O;)k=BanQ4#se0mgbZ+#voFS91DyuiA&VQ?X1$<~n-0emn3`W5j9(AI@vO>=K(5 zgQAk2a6A)4JlUT`lvr!N044bB=f_a=1ZpfKC0N1WWK~O1BYo_=WDwl^X5P$1qo+m< z`?EkNlY@yy#4-xTRJ%DV+eKKxQce@eP>UQPSMy1gktCH8FmCJwL5(dKrj<@m?uVT* z8&U7L4$?A6rT`{{>XPc2YzM@I>P1+(kvwVd*>Futg_yJp*tAEHYxuOm2qWd125u2X zgjY9Nt6w=%*P6R!6~pxDEMC1q6#k)RHX|+M1bs#KVg{{=fVFa6rGYOoDi93;R!*}#cC>8w6u;3Ko=rsDgTg!CNVTF+On>U@uaq;@GT4V z&-1uJiaaw@yCKOBcn!Edq2#p~h{XuQ*F+ubzFO+|jXdjWz`tD3B59wA6s_Vj+4D^r zZ2fik-(eh#oPw2?JQ_-&AhI*`arNb8v7t>4&tN7hM@(wzNHb0B)%YKp%U1GRoL0r5 zBZV%9;vnT~By;m}|65VstUyq&-PuXe%_}V;4@dQ7iUB}rLvJ;Kk6qLdmT8Hj95|P6 z9%p#<$}@*(u;7--ExW`Tu18UN2*anju(;+sK|D}abNS36o9W-1)oCU%b*i)7Wl~8| zqzV`mLanL5OrtvDyxL=+kSfc*N#t3a*7az$(K%gr#~wLwY7 zldOc%DXr=%q2A|dR|&()APV^{j-dq<;FKwwg#ik2#UWLA6dUjhy+)h&2Ej79Zl@sM zu%KwTZWL)+t^&%5#4e~PA8wRosQgJjmXS%3#FAmqC0!B*`CwhtR&cTTOS$!xG>*zI z3IJasj*!O_-adnMjp~cm;dIeDHdsgrzAB=1HOns?UFr+Ks&$_S&N47VqLe}?4J}^0 zRX$I+6z}+IQxut2wKvAS*U)TJ zaYIGq+*PpMLgQz*qR{~y8o%loF=qruIBlB)srI(^i+wbgTygYcUu!o zg4rr!@=|k{#nY+F^?3mm%aS4`)~TXZB5AG%z^}4+(v*XyNj=9}UleGHN-r?pRo7~I##lbQ$C3S`LwVyx^pzz5)s zcH>H7zhXDc4I5bME_+R&!jU_OU$6;sxOMIUl3ungmt409eK`aQq7Op*D{fs|wD+J* z$UUb420u(E40x=4ln1z@*z88R>^jgW)&3*t{%I}!4jv+Yf9O4}a#VOFsTO4Uy_eA6 z#e3E^_{~-2|3m{VP!#^XnPD%ReM9!&c2HF ztdV^pu1$X?yatjwoYzt$eVFC;?4jCm6BXP`(AwljcSdC=9 zPm@(+k-@+i1Zi+`O;Dm}$Yc!-%A(l|w3%Svzo?jmZd55I)`$?XOB55UMm$T>SddD% z$%0v;6rs}(H(EcS1XEh51}H0eo*Clq^~`8O9Dwp~dfD_64^~0AHJA5lKhp~FB12h< zsnt)7s*?xp?FlcGbysVe8SZ8Mqwh@>X!>igrSGjB+{C^BxsXLgx&WMT)~s>X+%n_H z0g*yA&RHO;Z0ihrOJNG=UjCxw)B^G5rZ~0Sgn~A-6wA34w9_IGx6>6642V5ddav0t zMhIy8(=L-HW>Z|Lh9I%J>YNDoL>^bVzLg4FW;fZbY+TlwaAwT}aF{PzVs4D#p8~Ye zERAF1-)4_ri|;5oSVZLhq9uorqcJ^v0PLoXSufOS?%P))ZGQr4oN$X!59~i1t6ng# z;Tca0-Ls*D5mm?cC5K!azm=3z@|N(j;Tp#GO#@RZEGBl6MQYRtvY*G+Goik7td^)!_fBJW)V{RuV30Ao-vG!9%mu2Sx5mnR#Oh zhRw5YZPDL_Nz3Ef55@g`qc$xU*3aj4%5F5N{-}fQQq>Y{c%miKC!2r=b|Rj^4DO78 zFdSg|7-2K%^GNesZZ9W$NiegDSYz5;0}ljSDAP*8$i;-n;KJtysg7_#>1CJ4qD;CG z-DiklvB?coLt{U!zmvDA1xjBQP%xcogJORS0XIez(yrHw<9$KvtsOApepM0y&Y5!m z;C~JwIkdB*()AWo2kAtLy*ZYdN9Z=$ZV&UFJc% z{6u3je_v>9-XkAy`56XP1~OypECIVQpzmU2VsQtqlR6eeXh%uD z^^ShwI#EurN+q$xJ|BuM%vge`2ZelR3cKQ6zqkOO6hG46{ zg-5;4p)8aO46kILS+e0t{9HS{Idb1YX3WLDbdaugAVKZ($yZL1mez;A>K;=q8V1%C zB^#nZDn+h3ex8kb5py7wNJ%1O>44J4mOV4_G^6Oz2cWtiwge^}h)UkeKFb>A7u%Z} zI1}8InNV6rf%=rq?^mXU}C?UF_aIj5uJXjDmzz6P2!4hqaIuKN%svs+Nt^!Wv5L zjL_s{in4WI`F}m-c_}r^T|9KL>R62e8+LUFz8Zf8)p?^8()d)}vfUHac@Tt3jV8J! zh>4E%$}wi)e_}LQpB>%0MJ!w^kYOi=g4Msi;=olb7-8<82lW^Y!)Eyb1_PQ=EK1o; z(SPGJaDYWqVGojqYZoaT_v6#Sz0c8b5IZg&&ibGb zB$S*yHMQfGJr-6x=B0CZL@+GDQuvcShKm+^;lbj>#vxM%+!L{j@c@i9!PZnzNL`RS znwL<4SH%*1)@dTHBYjQJVMD@>Xb3@G^;}Q+9(M#(%8)ZO0HmZCD{C)-NQQs-n~bpb z=v#!Vrm6|3>UuZE=s{CJ74_mOsH+h@9_B@S+8VAB2uJex=n!$y+((kKhiSkhl(Y_iWMvS{a67L)whU(w8Q$0RAyN_BtHDz(h5Hfr&5)imSev0?2}8YWKq+lsyuy(DxXeOp028VYH5|R=j%nGeC85Wo=H`5U{OH% z?9wV@9p^=>JbQ^M&!sBQR#iT?v`UnQOLd%$R4$6kg+vA~R#l!|T4gxKFAC+snxvLe z`Jq(h!8~>R`K49Djo2KC8Hfw=Hv2<^YiH$S?^k+Kv&@+=uY}P+mfrV?gLaStVwRH( z?x-fcxEjo)JPI%rzf*s9luRF2&|31rPpTT;Z;_3DN?*h4_3=-}$G7O^_UhyH`KF*; z?aasv?ab)e+R{1!B~vPS9)r4EIMtlz&#A^69rG<07Ft_1og;X^w;9)MifuUa9G5|60LZ506XgQ4qJwAr&i7Q0 zVm}tGn~A1y(MXx1;+tq_GiK4?^$n}@Py;S+ti<2WB5p>=iiLU=>+CS944Jl)l~&LO zZqbi?7oiVG`LRT2wUnIBS~L~FCNl(;6H>(y1EIhz z;F>0vzmR8QP-1zwmLH*(Cbg8!&E%wy+Baqm{rBSj1WBVohB^UzP}2FQc@x?jV)TaM9LgyFI1af^vPPD_pP;2kMj`ZLlVToHUji=xQ$& z{%cv^!M$uq=K~WKwDuF-e8^rjj*R5A1vN3fMHqkD7+qFgJ{r#TM=K(5qK5kA)tku) z*sysI)RFIzRdep6? zch87MjDB-dMFmmua<#mye2sduto)Q}WDI7tipM@O-2ZEMz<#JBS@D!%s&tKqDaF|N zeG`y&j5@xVAIX+Rn;p%BUmjAxb6pITvv+y1VqeicKKD}g;NH>Ys;*f~?-{`=DBTn< zC4-G*iL#*g_;q$$gydTa3aE$4^O)MbF^g%*&Fs1hvu zo;tgX+PJ%xr~5%$ckN)L&cG|Yu&QV}3pv~{Is#T3of2$|i1wrW&wfnAcjK%rOF3<+46ny1GD zR%>0pUCWtp*X?GScY|C-cWggkJTnWKib^>&8oa8XAE2|f#`wf{`epE$3->+1R-L1q zK2i-11#L7CU<3f<5PB1GfsFW6--o{g^(o>MpW>BrT5_t$$=NN{t_Opt+LWFZjpA|z z>zK45;$cN3DopbL>f&yOJMgIi5xhkQ+H)hH^CJMdE;6&g=82tn7M`xHUhA25OI;nWa?IC2jytEtmaK; z>stA1a#4tRkJuC-ws`=#lp_-l?z%M!I7k|n8?~3yk`9WRB5DDf8@$-c^L^e99yMvW zC@?RxtQ$t$#z;%+Q(NO1ww!_|WW~(AqrL+)V1rA5D{hxA z6*4H0`|)w_;CA!-pl?<5p#B^@fUd(kSdVXx>AV`5HMy2wIx1K&~K zkf~5QIfeOrdHU^Q8M@!e{Ak^a<=FBTA02NTw(LPE-$nL41Ff5x$N7tF08HT(N_0VHUGWh&EuKlVC%Dw&g?3OZ!162 z+xb}0ryF#6?_MEj*#mRmchBwC5~gW4htg)&9<09aQr+CO4;`RJwzY}>_8$NWkIP3! zvr-smLt&gIY&`g#R=v2kXdsvxCHqJo!z4j0IJnU?i&J1G^yWqe?<9I6E`?lpJ%t(U zl*H1!)qwT#O>l7jso|tfSnKMB)}?R52`Fw{Fn_T5QTHE}E@f@JTQhsFiqmWHIcnsM z6%)oZKGa9^>06zbL=|HGM>^P*BEwesqaECgaibjp;gC2_|vy~fSA%`t&3ivBvW+nR<@0C`G-Q%7oGq8GJx#}^S8HWsYN{u*khr-=muexRzG=3lC^rVyl#PC<@962j&F* zO3Wi3PuU42kHO>bx7R^x9oh}s$PRxWI+P&BAWF@K3qMgQb)vGTdT?mmms-&AEH)p@ z*P_7EBDp<~ASl6vHhg2Frz61H)j~>`k6R4*t&@jnS?nEOv$^HAwUIo)b7*lVP*QmS z*ezG8&iu6qs{Y&!ZBlW86kFP?fMhDQH|MK_&V=eUWxXfo~3<(G&{Eh}N{F zknA0^71kWtaEAS%Lf~UBNcuBXMD@)}ql2KiJuz%A7dl5eLWpRb0TC3cNL$`K_CHP8=p8nK*WgpRK+s~=;0oU$j|2<)Yh zvZXzWK{F`^8nbbJ9H|AXL?g*VLFijS$k!HAC&rFF)Fe#)wMaV(n&7fyfdrDunY14jsq{ef+gI z@mNk-!i?PD4Z$AxsSaWT+dqDUtaU`ZO(uB{Rj9(ZT@?`MfRC*2hs%7t#;Y0>bTNZne8-Z2chP5w|k&D>F&eQY& za%Po;2m2Y2KR{9i3Lr}xSbPRYk*9+kJZ1aY>jzu-(N0=QM=V_21W=?MkJR5Tc$WV* zCRmXXkKRe^Q)T}x=;imZJgcv6KyhktKwa{->bgy-QDlu^=xy8?F|wksVFzm=g9M}a zeGR|nEHPG{lVaOfbWf~Mty$R;U4s&T23)x!sOox`@oX+agg|8g1LwIRk%|N)$}Ufk zz&j=&;bYu1s5LwjBLxc*0W@`lKVtDbL7`Hux3Q(3o(}&o?R)ZtoVa}&YETF2z1K+S z3ZOVmX+pbly5B%1oWM4=Q7o|V&VEWJc%Mj^(-aO&0#GRvx5|^!ka4P!Zfo5k{`bf{^$?Wmg$|7tMqhN^8X0I~_Y#FR4f0*nVp#g3#6JZK^R1gFmznM4WtbG-w6@$)tkv z(y(BFEJ6BR-gaYRk}q0 znc(sD@L9urt+~{zS&=75$%2{2t)be}`)l-`SFg_3--*^5IbZoEK_T^MX6^>^C?D%+k&$r>KQ53S!%xC60$0l7QBQ}z2d-Y7uNIE5b{Lxi#aiv4(7{Yv zOT0B2iz6Bfu8-P7Gf)oMvGnM%9#~xRiIN!D2{*leyr=zPC##J2C)4{U97_a`_F7Ujv`&(35g9@%}(x`%?mV5vOtix-mNz3RtPf|Hu=QKwJyVu_-M zftywoDz7OqiX3tgUS8cin0*(t=)G{8&?2CG8Cv|%xc@%9V?m2#>{hh+%22Sp7|@xZOJ^ZLEGhOYgFFV0VY>s`vGclqBAf9zU4$ZK^ev@G1@@cjuu1aj=KaD}kmQ1oGx;(!`E(+nPb|{p zGwIQ@iKZ5vjzM#0();J^)4h-;&!+d!D+AH_wf0AXviOhwqsTI1#~4;k%(f;CPvmDj zmp*=>C#Q!$w76vw>!Vkb!C`hY`OT^H&6B-i@L{TqnqEv#zhq5Ys!c=ehLL6{s94Ne zS{YMP>=8%JK}C}Iu|m6mJnXGcu!r!cDumoB84Gzuy%6&`@mO*%&Tx%H&lhy(OwV(A zM-9*GO0{PhEhvp+jM#LCq|kc9api6>k))=lqbch}qZ7yqBup?9W-Gpb!IW|$m|xRK zIIt%#ZC`#cB-NC1m;YJ4sPrQ1)6)UZ`21sceAh{3u)bKY3G@^?4|tJa^!7{bycdbRT07NShs#nr_FeMYPaHxKTT%2R zs8v-@tGVweKZ?0S`74xv_)%#9`KEl+9PK>7FrwwkxgAHxSWJ(W0W;bqEM#6>GF~l= zm(49a|LzY=@58fs6cfBXQlTkA!_PI|f?eD#Pc>w3sUaCtGjNY7-t9tVzjr)c{wdhm z5Xao8=2UuyTfFWEzKyNksm7)pHw8Mj3f+S@U;LH(e8qGEi?)j>CJE|!f# z$zBGuInm%WXkEnGlsT2aH}Gbc0a0By&Tk;YxV%&sFg6D61kp!ADN8#s6#)0a%V5;C zuI~;7k~Dfo619VysmU(%G1-{A90{gawosbYrGd7_lVeVj+d}5~B}*Sv!eGY+C#f~! zTKi={>#LsU2AYr50MIymW!ZqaauD!P#G+Xu21foaP8QK{Pm6EwRcz>W`7TpyPr@^3X)Ks5hj*XpeAbKjt?qMf00X**ayUS1zP|2XGKQ*M<7q z``8gc)Zd2s+a;$YDg#}M*vqG^)_RsYQbgr3pCZMbUfa>|Ys8qQu$~%9uWyO_&@l%t znXH)i5Q&eZ%b-MpkzlD+7E0S_&Asn`|IAbG<^L<$v>^vU8N9Pk2$)aulGRd;av!_L z<^eLz*eI zLVzrpl57VJhL=n$Sszw$C&=cqBQCe_&gs25srx)q5|AXob|FMOKN5l48at^kpi*N^ zR)35y!4Afk56N)8yPWlKW+fiyUwUu*RSlm@l$9qZ?q_zE{}|r`UtoUTZnUe~GHr3r zqI``if?W^A+Nl`UBW;mAs;U(P7AuG%Nfo4934O@F&4}qUjg*y!7!7EawLJ_18@k0} zfC`NlAE%suWxY~k=DTFB(U@VvV5?bWk)9(QK zMHq<01`K{V+{Zb`ok);jd!@@Ln-Ign$FtvoF@*YZ;m1TiJnUY0&=93g7x)pq4hx0t>GW1Ddw{` zIKoVm$wzNotK$}i6Wc&_rJZ$4pd+cFz=5eRS%%9##5$G7_bar!jMMrwQDgl_yOQPX zc^-2eo_PmQI2z1EjTv+|HSqCWT&Qn{d3va2l&jS;K5fAMfrJIanqeIwO7n4&Y2XuN zp$`jsKwE2oLtjqe@)a<`;}0<}ls$t1dcsMN_M}`pkyfW^mle zMu2!P;D8QvucOrJy*f19HJGRjmZC`ZnBZV7DX)^{d@EVbkZCNuH~z0=u{4GeYB56E zctyJomXZXT$r_4FE=`kKL7l8j1Kx%XEu@EJcMktlJQ(}Cp@~%Qd=MJDJUjw`*Epi1 z#fhWJsBb;BxN1;SuN4cZF%hB&o;%S4rKDM z*s>B(Y;bTUwqfX%XPSb>Oi+F$Z9NFzwpHI(MtJV(3fyU*dqKTo?!ZhlSfPL z552GLZA~!-vAvoWS_3uGKR#Y%+0|EQYi4b+^1;y+sNcM7joI{cme#fwD~s9V2XzMA zXgOR)xieD^kxeN?MwtdBRvkP_dctlZA+xd~d*zS34;T0Q+Qss<J*rQT$d}zi>5`b=KsC&wDAhC=kPT^7aB`u3w3B=6QI0^ zU8(E2Y|QJO){fJ+F(&HEH{~xN=X~>`hVvO$ruA?u8P-fDTThidN67`mzV2B(!>=!S zfJMGRb`ubtb|sX2R*N0DQcF{?0bsy}=Sp*wSNI^NIHXqz)gjnKcVxG)ys$;TXM`_j z?ZqCG#_RbQI7xd`U_h;qz=L@at(;OTv~iL)gn_FsY~ #;rX}=gK3ls82Wh#CW7o4wJaqZccqL;FS>C#KylQ)~YEiR& z5K1KV28NjI%$3TWTeY3pu(B@Id$3qFT1jS{ow}WJ7HhCrMdcg`aqqZ4e|)_1;P{GS zRY6NtN(~u5#TCT04=mO~>QAwf%Ihb^gVd>prADq&1bY>oFCYGajut4wVNjMtfNQn# z^02V~WvK2*^Ws!@tQk~yq`63SU>JgV#Hi-xNZ9=*7%hDj<2dB%M0Xfd6GM2o8AEue zImUp6f&lz_oC!d>agPqoEt( z=U<#J2UAlEYN{W{uSSKBiSXe*$Iyn)r#;rHP@B|OCf)?#FXjRGx!iyw*;fkiWbdCp z52^e_YJ|pQK(BNUBB@f0k)Du8bAIb*-1>!mIh$HPqt=)7<;m2{sf+aG=}YwGnN-`; zUu|Dbr$%T@{ebJKOA*C}tfiN7*oP!XjQ+{y&QMllZ#Pfi@6|u`SuxH+!U~e@%^i`6 z*y3DbScepr6Y2U1+R*{8HrJnMGBNo&SO@ckAyy&{bCm#5w^;f1qx=GZ6A;2m(ohi( z%nD7`mHb|b3#&2wjM9JRve6YXK-y*gWpT1?I?gE4aC0 zKuuRXG+vF$H(FI(QLH|IZ0d@FeZ)^RzN%PVT(Q_3Kz!ui|F65s8nzYEe-r!9>( z%@?bV^6~8O&tPX88e7DIUYlt5t%A^a?yuQ?Yk_Z|<HbTW z*Wz3fRa{A{Q`$Km)7YYDr#9uEih+9XQ(tJzGhD?q+J*;bJ^NaYhstchrM97QFq2&> zTrXr8%Z*~l*Z1-HE0i6~B9TRXWZBwcup9dv>-(*v%SpSwPce(x@~W+EXxZmF5xvpO znNu)|OCc*-h&59@wmw7*K#;EFa@H`?#zrF5|}5PPtrR`ab5P@OLqU zo6;fWB*;fyv`DZpSl2K`c-qd&Fr1ZUY#nfACDdM_up_hYd&aAd&X*Vj+{4=cnyB=$ zy>Jy}T{D5JdGjCNc_6QbV+bjOHz`|8ChHD^4UK6qFyQ3A(JI~z%biNb8Z(Z;xpD4mzA3sk5zAmjOg*3Ah|RcIo1zsWN|cdW;mk( zX)u+Sl^@x^OT>aNKpwy^q<(4l9UtQtoeLJt9R)5AXp^Rm)si&^Y)2oyIW-FK?& z0IPppLyJ(Ph(8^QxbF|93YQg^qa$qwS^v|v-S~W&L*lBJ9gk+f{7rQ;%z{%aewjzs zof3|;K+Y>b8etRx24GhEAOYH?6LUEfMFoJKM*ND-Hv$~Q4OQ{`$M4`yWo_DawC z3+Oz5mF+85?mY^7lv*Is%uHB0H}z(zRt%TXh^^@4kzV=hP52G9b)DIw8PJzXIi18c z+CpD>LsX+!(h-vWWRYszLAw`fXjoExQZ6V(#!;WNB7P*=ck1K?+_1~yGjYRQOZ~cu z3${31OgxW$$~CSuPHk+S6*wm=b&{;e&su9IO3Wwg^LHnen-$cGcGC?QEd7Dn zU$+G|HND$>t-l+`6T6%jQ@eS%th{n(c?Dfq!>!OLKPEzMm6#=e_Pt50CG08HufB~r zhXHRM%}{i;bmi((1mJ3Y$RB?=4I~Up`beo}b;&E>4wU4NOCqs~sU>9#9?=H!WH9Q( zEY^Yw7$VGKRn07l$kPn-w!3zGh3p0~0p{)=zFETzC*5?kn)@r$J?3Sx=0PhPS3Zd3 zhL=3Joh4$$)E#m_LF8c9!o&Hh>^2%`g8J23~O z4OH`>$(~F45)ln~hDcUEp3(2;QSZ`sA~k)Z*s&Wv(bTkkM!cn7^egiY8g$r43Ib-L z|32ZrfJ!_kQKE7}c)tQV;WD&VLdB5w}%gHfATM(s)M4MH_1w37pSwQMM_23=&tM?Lt1 zp1@1bqgT9b45tTeS@|bk>na;4RlY#w_zQ5H_Ltf~d31FlANLEjN-wgq|F5W{Pe@bT zG!s<8S0yI1^3S^X^v^d;4ox&bvL);?O!C92fkTT8#Nu}Rs*ShUro#nAt4(EqrdE@o z$BBcOef@h}%1dh1qY1ymk%>mxd#-NuSZeghVx#KSTgEh^UQxf0!LO*>o1_|^$p+o; zvt57`KMXevj;==05GBa{hl<(af*6x|ajvBp_J=z5?}P2;-00wVcJAU(5pPyg-%wqM7a*?U}swRFdR-aE+?!if5mK4%Nwu`Ol=`=yFrkFW8>g3W1NkW*?8r~KXZ1<=yz5XV-jByx) zjY0Xn|LKE&!A6RbYYV#FT(oyb)J#pm%qZZ!aZz9rWn*$Od zGMz|-r=jk3%BgK|@s8x9yeUMl1}qp*1pvkB{3+e{#(n3=mKeVC;luCy&XnRi5sRDa zATmWqi@hf3G*8DRIdH=Q4B7=WRUt!#`ErO-yr{3`oAit`nIidI0SsK|Ji;kS7g1Wg zvn2gPKzakfSfyl#HOQbV`ol*h2STcCsYyLP#Y2Ys+NuJ|ftIX-LMr6o9Eg3o0!AyG zw5J+8$9U|G!Dy4W$uF)qF;j##v1H8?8btNufm%hDMz*dJjXspIxHXe?htFFMP@Qo) zLb0J+dD)p4|7m*t-mkyiJ4_rO6JpiUxl^C>(m8&-;yzZuu_DcL$4ln4T(4;D+dFsV z!MO!L7M<-Q8|0rJJaBY`U)rVh1rk(EQOyT`x3jBU_O_k0s*Eu@AIl+Nw;DwhA=Zdl zHC}kcy7rTK-d+m(T<;;1C$7k{cLD4I8;+F#A6LuxpsQ-?j9Ug@4_FV_X4#*X8nWPz zUnKZ@yy8FiM1A3`7 zhx_00pl_9gbvDlbQ)qk3HLERTFo+e*_ARX$V- z2eWJe2P?%>7B@&Eij#hbc;F&ZN+KZdR>jRV@Ik z*7C{L=rQ@(d_YDH^ltFd2Td(oSZouli0cTlR8rGkAw>bnrfR`5zzGVF?7pU8?7&v& zfj<%p5#R;i5h0GjAzqA*;&UlrQ}hLXBumSdscP4%j^W_@S`lAUj?BzD-0^d5?MBbu z6r^&*<*vBwh|8T)RRD}66FY^qpS>8-jE)4^UWp=I5h}=kVnh?l>1;C4teDO$YLiSI zSTuYRHcb?G__?f@Au0~{;3CD5%Mg{C?$5|AmuWs|!YzI^B*BnU>*Jes@lBBoK;db& z+S``FsL#OEh<5G`A_5 zn?c99L>+XGR&lE0C50cOj3>CSi;Av|ibyqw)DwpBF9wFA*9>)~oY7yBeAMm67-H3` z91{C8Dt=|HV=*iZNQLp7(6P|C7_!poQiCUYK?CPN(lj(Mt@N8msY-dcWuv@K!AUZa z@c`;!jQ^N2N5Y{#t-uczGUP&JgxY*CxhQ11Jma_A)aI)Qx7soYV!~9#wYWY%l+l67 zP+L_qts^3i!9jfUSSI?SxgI{gNQ+>Su<8|q-Z*oc5gVCSCkw@U#YAY8rqQKo4ez2` zT~MpqluH(X>wld35vf{(7DFIxP20~4e69#wQ(IJYf7EkN0RI}QNkD*>1cbmpsaiu+ zV;JDzWDO@FDY@v8$l`3q@e}e-cspTwfqyt=wBeU_L8GsvAn@<-mTw*c&Bqx%yE{O+ zODlEVl_ynO->Tjyr;TQq8WV#eAN0l0b4OIQ-Nz7wk2j*eB#Tb|B_dwj)uDed(AR%noe3&RbCtc{_DWvc94Tt%EGpA*wnt=>0e6cRG%_WAQ8Vlo5c3CAQP#@i7O1;Fq zwuUj0puv1lvgP3WI>9}(Q!j35ECvFFcX1(E5a!`iQb>f-;R3Ewc%;M*S3eMmpU*m` zE7mtijD-(_N(H^?1{V-Rk9%5F%0*N<$vCQd;o4B>-QxIMcjcRyf(mCLO(ksje~S(U zXS&JMG1rEaXhmcHO1`4*jhbioM-BJt!L=Zn%XKtO1-Dr;d(&zX=I0~(ND~sfDD@FO zpivtvN-lRI=!=@xM<)LK!La9X=fr{rmEFG3lz)MWs=7O25*&sb^kzW!5NnMM4(23!J&?k6EJvytS-C^*Mnln0^ z(~TSi?HZW_8OYKWLJZCpVf7X#aF}i$77LrY6-x+}Q`!*B?Yw@|_%v;ZlIeEce2?a7 zKoo}z(B8EEZn618sd>PFW5~yiAr)uiMH7yBGarNeiR)L^3WIrKG1vHKo2+^@ae2un zLup5@vl%cE?P%#4dq0YtZ z3!^AK(}bHwxg4%R(Gpc!meeb?yO=IF3F#4nYG8-9H9%Di%Ca~lbFX_X>{jE zgN{s9sF$uvF>S*jiwwH+`L!*Z`(_wC(puxtZIeok;jg|_3H;flN{rE(4BJIjy=xVm z>gp7Auw;pcOER@Ds}@}3^8;FIE5oR2G_#5fr=!X6DizkznQe-MIg?c;hnxTsPbj=t z$82Ww!`a{Iij5M4zwFf-pH485>DGpglCY-JlAKz7jmXw4#q_JxR`C;7Ad-y6aJ8_6 zvva3!r>+-By;(pZ@ z;XX(%4pPDsu2HM^8plpZCp!Rt&>XbDc_hRT;1ua!v%d2a2r}krFCvYAgOjB)M|-%rSKS_Ni1qG*cOjRoyU|43AEg9p6Oj2T2iR@Vkqzpm5qV4k?I4e380-} z4{%~YzFZ%`tIVbFN0i&k7DJ5z+ z-e@lEa{68bBX=D+EvM???I8%**)?kry3I?D7m|pl7=cU0ImEay4%oyOy@HNT?ctaw zOkzPIacP;L7yWYiy?e?b@0dR(lVoq(G;XN#(*+YJBtI&Oc$vdLUFobSzJJon*66@d z&8HUgiL)_ON{i58C8w6InpdR5%o`)5;las;lYul*`EgdWc?e#d(TwJjguYIGm}XAT z*wv%)(#b{|??$-}YwA@w0ezoq$Yw9&p>!Nz)oK_Lop+8e(*roZ9CA>ao)$aD+8mW+ z5`MwzwQzt`YRk}ZKhmTdCAm14yY3>u)o$dP_>B#X9{DxS^uC3!`1npPe0K*In!cS2 z4SF9m4JkfVvLeV#DwYku81g}VS8|W=ZwUD8nz%Qx>va!18czv&swVHcxLo&`AshX2 zJ?9wd!AhMH2z}^&l?bj?7zbAm;6xJj^D=cpVd1aS!(|bTBJIaGD5w%t6tn`Q1u?@Od%)5@PSOI98pTz`8hytY z%rkgM*e#lC`0JQzSj7wt!%Q5S#AOsaQ9$9{T|(V-JggP;6@L5=&Sc9(WT&J%iIJD< z)wY&iKx9XpH(oDq(KdylA#f8j1`dFTkBQ$Q>BI*F2gcL|nreyevC80XV;Ttpzf9BoA0g&skE|tkL zB8_if{u7p3&I@Tp|7I!BiXj348I6z-h?5;u8$;%bexC!*RIJBpRay^>ZU1NI_K&DKorX;bQ?-0{QKR_0HPJsSv`~X?(8HDPv zo_2a#?bVb_S|$Oc^CBy`e7Wc!--^0c&ju;N)Fpzo+X9^E-Ez+kNt$MHxoE#B!A%OH zR$tEsZA5;dS4-(Y7_^zuCueaQ?g11;k97lMF;Jc?Zg4# zPm3zBL7w6oPfqJD#T+2!Q$hGt;-imv2lIRuL92S6=Ney~)f4J@u6}YxPcV)dQM&UC zo7Mg(gI&fI_rmb?iTu@B2~TN-hzF1u4_^8F0n%yU>u2f~D^2wU0M@HUmluux1oeL^|9oaVdjQA`x}F zJ!%wq0-${LWemI1Ww3Qdirm1vv@#dsZ9cBpBwq=I&a%#JUz3;)EK83z? zK_A!j&SkgB7GRoHkzv)4QNuLf23B56if~}%wakypip#zW+en-CkzV`H)q6^E`(4X{UR?fNq_L=en)>H! z+isD%d8N9!eD`47iVJ9~&BXpg^Ry{%_LW2FkAM zs`GsJ-uG4YUR6CwC99-T?E9VtDHAJb7=zuhd%A9o^N&{pn&Od6Llyja-x6&>P9pIoYe|3M2j(rU`$XCrZd0) z|D1c@tCE!PAuZ|Nckj99?6c24d+)RNKKq1b+?h~cHR;QGF?_ods@CN+i$j%nYQB?? z#`VujmAQm68K@8?+=~>%8yiCqf$VD#F|xQ^)q4-pP0E+b9;<%}2Jq%q82FX|)MLWH zYZ1angn`S(z~lcA3|yez5(VF~3I%T$3J#b7&ZQ3u1xtvctDxYaAqr$1cBlU#6vszR z8OGzMpP(CoA0N@+!*NL-7r{7@h$NrZFRo9;r_Zs{J`|rFJctLBRE8U;(A9B_uRQ}L6fL}@mbrC7lC;PD7`ZD^5})snIkPv3rDY_P5NIPIxf zy!w2jSkFgPx$*>V&V=F_7TRdPvPK}q0N6z8RB%?Ub3I2VUu}_=Q-^S)fy;2Cb}@0V zA1iPL#|1RQVNrRj^WHQadop`>%1XKj@_>aSjzi(4!Kn>0980b9gC-9UxM->f0jWzN zLT)?xq?Bm~=Agh`bPZNGHB^3BAC7m-3d)2cO{JrI^b~%@Qqo1p32UWUdJ(;d`Yt#mO7AF=Pozf>Sm{jzb`QIm#pU7d)5f}fA;0*hAhunL#h(U}Xfk@RJsQ1&@={Mr&Q2IJN|2Ow8G#5yd?4v^)RvOJ(SiS)CdG<<(YEPR1TA{w>pas6IY3m zDem6q>++=6pjATr)bdV&=uQCri{E9J|8n0|1IVqJD`(eG@1 zE0)sY1F6j23hrbMDdE5pM?SG9GYp#b`bb5oj4lSFTM`zjx-`l8j&{R1{QSD4!?r!< zNSLW&#IXaZxo{j8!JkQiGRC&$LSY^l#0&6Z5& zsh<8}eEVDM#Azi{Q|Z*yIC*^A#UF8$53`XpH#-Oo)=tTtsFJLu6vBipV!Zo0`I%r2 zxHRsb*sKASvPr8+@dXNR)@@qo+^o$sr7y`6)?y9Hee14?DY#pfi7srJhyFhJoAwqc z#8yh`AS+rsCDD7f2cxvQnz{^PM6GxsNEd0WJPT_AkN|@)z~YC~?hX18AlyX?0>d{! z6^2k*ncy=egtZ7EvGeT!Vf$(je&`Aay~6FT`Fles8+U;4{f5xM{2su}24K$lHWXnP z@eO6ghVJzYmpdce3qGmfLi}4MHo27W@IRo>J3Pd0WY(e%hlG8@=)((G(!u}eq}|jw zf}BmEJ|^W`CN@%ED+Vr7In~_bXCavJ+jjbyP+UUy!Fr$stty64%6_-{<8K$rS9a}C zTOTt__pr)X0dn!)w7a?NHW5AUHYHe&KsZeZ2Yo?sA|8$mhb4GNbdETL!)Y3>8dE{& z;Rs5KA4$8jW&Ky8bwh<#x?GF>(squ}uQ9EP(A7yBUO_Yd4WMCKt?c1JL154{i*`+H z7#W7^s$tMMXdCq9JrjCZjf0+zj>C`EyPHC7nmWU=FMh1u-FVd(Khf^aT=m6Iw!3WO z7R~}<)&;;!Z)+>Wd=9|Y39ym2eyZIiv%-)%*Hoqdg3@bOmHz2=cYQeo@PhqFZ`=w3+sI(8;MbqHqRxQRZi$l>IL)qr=`&Y+A8=}auCTHKr&oS| z=8EqFPQ$d1I7J;5P7yg0OyIOv;nc52h<8(WU8G&K!#7V%$yU=YZr&N_S^g3B0R+h?Ta#;Cjvyv{ad^Dq#^2$fEj$II^L0<`+X3#4B*-kj!ww*eT zW(;uC^hr|zi2$FJC?3c7l*;~&A&zJsh4SMCV2NcB1s4x zsAf0)iwBy*y)jAB}q`3NviO)e$H&d2WV4}sQ3qpJ32WW~% zu<%sG2eVApH=eUlDlp&jui=l%2nahi91GD2;SVH=Y!`nU6_!6s?qYq^Ax)qT=!m3; zQTNU0e_YUm=)o9!k7N#S>QD*kN?_D(cp^(ph>}7WmfYduz^``cu`)-Jq8H1AdWxc} zo}z`Sr>wEHM4;cj&Yv|oZV(UUVU|+C%!`@$KKeyIS**NU6g*xTaIri%sU%OZ1W`*0 za)N44bez_w!C=MmT1_-pg$n~FVV|sm70}3Ko*1{$u+Oqq#5#-O`wQTv$1Jw>^8stC zh@+h}`EuITc%2v$_KJA&(0EV66V=0T6=4j=yEgNXFhJ>5}hSj)$&O4y>}H~y8%Ml z&fy}D(o3CFJs2x)+<^-t4(0q}m~bXdA&@~tpD0IirVrqOIGJ#7EO2fGK6)2vWiYeE zTJkV$#RKO+zUpE9QH=HeF50=6MRJuH?SLEt54k{*pfO}i6s_R*<6}Gyirl&pJ{&%| z1+cU&L(pNzVTiO!-O3u3QyU~mV4Bi>Tt6;4`j9uMS_2DDgRHzSlPM$jRVYmjjE_42 z%0`BQPE>5&BDJ0Lmq_H0z*y)AY)AXoQUbNWJk$?!+NEktIp?Amv3T@KD6Xr#RM!KtGWBHx&uSwmZ_EPS*R@UyUp5mee6P2}FUNhq-7K_L3 z(lB6rLW@Whdck8}bJ+Ff;&nw=G~Nt@rbx453|oooe< z0L{CzL_c_fHLe1V4;8!;9M8~Z-X-Ij* z(TQRMC=>?u4;?ruCWjat|N7NxCwi=Qd}X!c#qA^2q8um18j>Z^L^(L!2(N7gFwW8Q z7YXX3V&Xs;7@}21;7th;QMRCNar=~2+;PHoyc;iMukpi);!W|c7w(|F zkYjjVaKvSC(yiBMk7-K2F@7*j`_7; zju6nKdyvoIIQxMOcPwUo$W$r+*)3L_{Zyy--q_YQIkT4(CdgGEapKS1V9l+WVhy>^ z2fbUfdo|wR7$GdZxK$|RWTD2n@j5@A!BgfXu@d(AncBR01i!?{q?N;k(IXyVbXqwg zk57qJQW6|197gsZF;F@bHC7vs>!|lNf!kMWLx-YE7pdB)7=u@tyt$oR2q^9&aLWLu z)_~N>rW-XlArCTz!n_Oq9p>;Q=ATy#r}+;p0dP%5fF4?j7_N zt`EsFZg?+S_Fw#upXXHOHF|abU~LY%-a5Om^ySZ-{8I8n?|pFua3UQ@a#}+|ORnPP z_HK60m*Ru(9VD~(Xx8E#=O*O)T2&yWKv4tEr1$<*F$Q6XcgmBb?|8pP%t2e4!Cs>i zFwpVP@kr9sE~>!ibKLW{W|9GnyqJH61bI_!hHkQ}lxWA{6^Pg;}XRw+@3D5+9#}`eA%F4n=RE>aOy3uYqO)@%$jC22js2i>@ zyS%ed$6cZhf4Skk{RlnRnKJA0__owpo2)*C z2@O@cSajbh_z>an299b(2q+!Uc+r&}&gGq;g|&d*K32YkWvT{jstQL~dg}jqDJyGH z#tA6HW3lNZO%fc8y+s(XP=?;&j3{o7d`6%4+xz2PvEg%HZCojikd0 z3F-97^Fn~rAcCtBochA`?>|twN0*kKJOE(W-G(IuXjU@Hj`Y%n+V_x>1zP76?>v2* z#0?V_Q2DN*{q8kauGYSWnA79h!h3=PmKOX(`_BGgGM#?1DP?sT=Q>-2-~tTE)8Yol z9TfMJgW}5E&;ugtVx(tQa2^=wPMM+FRs**Cj$=&3=Mme*(UaYx)%zZ^e})YVXotS8 zFe}AcJX1M^fvJx!pf}yYIMt1S-``kdC_n%1(+zL=4By|Tg~+jlPkcIMB5{oG;B8O| z_uB>=^YnYTXG*{k6&!p#hz|UbVvgtq8~U3>Ooqm17M!3q{S^>1%8sMYQ4U_lLa0*;dQpwI2}dL+JaM?fQf(N1`4xJ%j$YZ>OG1c-e+gj5Ba3D<4D1EK66l_GXx%5!dBdo?>Kc-ad{=pSl#%KHa ziaAWVM+R8T(4=+$xLHKr+={MvvsQVT1dP_!6pF6jP7}E}-usDk zP(MyqVj~yblKHIvh_b+%Q&l?t&zI0%Ur@Wlq4`%(+_j*Km67I)_X^_|Cjy5kfKjpiTxA`VlkV;=AIwInUE0t(+U;N0}8EB}K)m zyMx+f8>cc6D#X>JnAb=QA~-AA(@AqPRV(Y1TUusNRQoA24>1j_1lVdJJGjNxTDM|( zr)gjB+0w{iS$hknAeKipF#Z;Msga;oA=QC1Skeflu<3CK6<-8Z5=tfTi5~JV_K=Ux z!mPC4qfz!w^v?5h*kH8nQU>g6^-|iJtT+H2QoxDr8Jm&cou_i?!vtytM(1w7WJF^- z9v#X!4q)Yi**yO#5NM;8iZMBn6$?j{6LKERKDZlX_HpPZ**imw%*GIJw46#A{`XP) z4?$5#Z^!3kvdC5OIV(b>=svu*&46<5`=G$9$lZbhkZvra+9_@<93WJ~f6`N)dlCs{ITK|_-e zhl6-Rz}e4zdwOHAUY*d6dlZ6t@fww%l&m<1d8Jmol*xl);MMYtkZXBR$@9wLgjJ74 z3nsn(4G=!sGv=iynHo?Hw_zycE6=~Z_tB*I;eY>c0>qnuI z77+l>Wlp%v0akL5YSoOYS2LmXbBUTFOlzI}fmp3%v|L+k{DIkgt&>WvEAC*J zv2Hes*J&&X-7oIgz1YX$zOMK(Yt|1vfg$Q@ZP3zJfNPUlSgX>=efvPjVyo;pX(1x` zFUiBjAJPTADO&F=-VJyZc+2eGeBE8M^3$ce$*PdAQ}S6A{=HZYg;74_Z{4ti6A5a& z%rvgjSK#=-3yoqRI0*L|%V&1vGb%r!^VhCG4aI+n;(0&}Fp?da(wI;R&GeZ8BlPBp zuJ^8o86N&8ow9p}DwN7JH-*;#dXtbK` zcKgQiPny&es?jJ8wHGHl<0P)`PE6c*^~HkSAMGy6#8{E;n&3#V;w(xK zJ~JCqL>}i8#k^ngcJ?`Bk^xn*8@uI^)*A}l}0AAZ2 zba-@jO1J%$lWRz`s7cZv z1Lc`m$#GYCI{tdbRi1K{3WN7Cx=atwG+9uo5(LX zfan-I7<5bjm3t$1Eu_3MJam4c|i^xtQSW@6F~ms?IDF8b2CR{#m~5z zr{k}u-OQ1ynImeZd(~!+su>NfPgV#M;qXW^%Wmd)toWpx@iFv(_?(;JeEMeS4SCRC zSKJ<(dCws+WS2IK{;(V-n^P!Pu4%US0!dL73tNxL(d! zag9%`&o|Q`LaoV6`>PikOfnxj1tVP_^p0TP4!;OZt9(G~0p$Xq+>rMx1@09D^>S?V z0{17~)Wxj$?~-_f9TV$C`PQRSbf*lizJdk=1xl7wbVuqGb(+)Eqz$1g{%~Y4=Z)9$ zp!;*it4_LC=gwqG=x|EZ2yLPk!`d_a30zNSIv8h^RtXrCB-k}ErOQwtK);?ZhB5^4 zHi|!g!O;Lx6O;{$pm?@p_E~9ZO(~V`%1>SipAgfx>Ju#Us9A2BjcDJn=`WY{z=T&c zO&|+TwxD=iwf#%wcVvaQ%6H!+l}P*xmSZUN{NIJN2xro|r{dkB<=dG~I0x&mY<$sGsw73K~$W#6_wczJjt`V{b^~ z(_owFu$-A%tH5@zGjt+?WkCjPInso(L8thABaI(PbhdJv7N3f!9PL{`<)l;^D%mlZ zl4Z>6W`GqxhWgKZa)ioYLYN!El#shW0S*D8rS|ZXv*8n7Gs>$!fzs-6?BMTm`lSgw zez^b45N<_En*>t2z=}P#0i3aw;*V=#_7f6_(#H^Ky&%BAD5lHZBAXnSF3HKOxiF&s z<(~ z;S*{ynrMVPJyIY(kPeu$cf(yZ86oQ!%hcGzmfU)=%o?NP0D#Ba=Q zpN_vy)x~{|CO|)p8Mlr+C@I=UzH14?p@qB&~d#uA0TmH ztCj*|Iy>596UM;H&0*N8wc`X2`w-}h2Ksme^JN2lEdF}QKtJP@2-=5DuP#Jr&jans zz9{BbGj`Cx1*ItkU;Y5el1R0mDZm3XOQVsoOt|Z6LC(cf4!gM&BFvXv9J^z|HJP&D z)~xS%#m-9ooH#kw-m|(Q@n4FpXnK?(Xk@MNc-|2mbbS?|;4`r_1$p|-!>3_hPxE0= zPrf<79(BjTL!JKhG=-}1vYI4O&IMhOsTU#PxP&#q*NbC}gbBY=S)Mm$U)2{N?m1)j zQv7usqs%MZb4aCHrVLknIKke%2w4XjTR&3z!dX$jHY(6!c zPs{n<0XOph<+-@X ziUGmTT>HStis7;~Z+4X$hp$@mz7&7GV$J&%ezC5JD+bO`oLOb+P)oLhU}<_yt351D zOR542I;blsIG`)&dsXj2-(_?!n;lNG+WLc+(3M$j^h(3RX&V*}@lCPJdd_ACvJQX# zg+?(^mRWY0!!m%3tgx|glJ&M?wBQI8&rnIx|jcavvU@&)HjifK~G5#p5$9* z`$<0Qp5yokQ095u`L5mjy49b zAG%^oN9w@P9cv73%3pugkQ4ioo^L|NP|-vAw8Y&SSy%b__I!&`J~V{p#qlP)hX=p7%DtBP3`B? z-=GbVH^*d&hd>!|Nw$D-RRUbzg^*hZ2yRo(UXr-Uq`C(G`+BCr%tS&JZ7E=i>yZ}~ z35G`kd~->1)NVp`G~O}GpL3)s2I}>B=a#hX*d`X+(HVXR?S{<2WV(s4_p{h3Y^;Jn zF(i1@M0s2}e}G0H!1_u+^9;~6M%b&YmTFx4Do@mdzDZTmD^c+(O=c_z9VVMfYALRkL=G#k= z2W&w}8uEZE;r^%a0Of>SIqx}ye#pXSgu$D#USQyD^KYce>nrx6DeaiM*XK7e!HKz> zGrw`Hhxm*KZA7|BHla+_ir+>OuEl=b>4&^YxQ}W%Qz(RtBWD#dj^J0+4tz!dc5oOW z^~9JQYd^Qbv6jwz2H421{UH3-WW+M=NW}!D!}AaVjkB^rWTN7sGGTy8+WSzN0~^rc zjm9Io$iw=qJ=Hpbiic=_cRxzFkO3`T`xx3k9S-s9xN+hywlUd_*7;OY=C#H5mu{(< zz0^cAqae|EO>|FHViR?Nk>VYPd{Ux^lwTBX%aiGWoG^uCDsH@8das#}Pgw>4&3x6Z z^!mEAcTf(yhonzk@T-x&Tzp(mDQHVOLA2VUpRGkMV+$MZM=6-?Gr+04kY}CWn#h{C z0h9gk=_PXb)|gqf;#Nm|)Cw7e@dGL{sCfC~U2XFq=#QJ9__S^*$?@-)pB>RJA0bbd zLN)@b3u&@y#l>Xr!utqGI_ynxRQS}VSrqpEcSf89WtS4o1)@O+rn*R~5Gun;-~0cl zRj)aTp4dZTJN)Zx(7IF@YdvgC`6;yykswJ%_8X7`#;q-<#gPvqY?M-kYLBj{ z_E;k9osLCMx!R)vi|jh6u=tc)CrOK8A*P4Ukkth&9tv1w;{vnx2m`Yw;PMD?&k-Ni zi@P6QiA`LL*K=IA)|M!BQ}+1RL+E*ZK-XU?5lVoS5K0_CKq&7n#4<0ZBWP^yE1InF z=`!azFvLj!ucVtt@Z0d&P1!@jdLpc6l)Y^f>GP%?9t(g&T!}RNdMJNNMZxD0V%|!W zLk6D-bU+=F`LHg?q4?F0hbf@)Psi_$W)drU=Dc2;K|iJX{z(943k z{Y#&g8p|dseiC-~t+m?izR!F*Wl_7c7XRd}-vpc(R|q)Y$=<8iNCnOxVrcpEcs?Er zUwGkP4N~PC<5=16Q%Y35Sf=2AE&eyyEs>*an3XS4%^KUMA}%<S&>;Q6 zoKQsqWZ!|MVuGU3qa)XrRgN5VM6&s%fj>S^bdq4%X4i%GPRX?Yvv7OVYSA7cyq_XGJjP zD&SwS7bbUtd7&U_e8!}b14-)>ZH6sTCMeq23Qx7t(*?jKokmIeoz-MWOp3_xcSgwY zINypKPk2K!oSK!lY2rS;z4+OWH;S3EXZNebWxsgs|VK$#~h*NBl-M%5)bSRc`~B2aHyDKSu$wx-S`A z*-`ot3vj+G{E=xMCLl39>iLWAIjZ8%N9OpMv^rZMvp7}=N6KQFiO^;`-ID^e-BZFXb>-=>ZHhf|t3y2gN>+@E-EbWXM?yP2_3XSdJ+E_qOwQ;>u19D+1cjhnY7F|Qyt`ll*kAjR#mmd$a*bS8u`7b5Bj zwb4&lf?BES0VpCOuUZk#8rRV7LkWr}16bXl&yrtak@-*Hu8!N`acdEYq@Su!#wPH& z$oi>zWWAUQjD5(#XczXuH%v>@RM>Cm9L0$CU#KVTGOfGt9%5@vz%jNdoezYpbVv1C zYUBsR3NIjMu}F%)NI^^>ClK5)In6~3tMA}jhKVdp>X8q-)prlDI#%SVDJLM|{sFWZ zD!b3g&$R!`k*oJo6~+Y(wAN|@p;6VeXIPV3-ZiY{&Xu*yLo33=NIkWpS=Dog>tQ0P zmfJ#aZVBVG%>%&4VFNLgF@gbzBiqCn`8%C{#pk_%g=x~5K zuBLg&np-O($RqBh)iSB|rrKsY2tQ|bK1CGGyEC>Uusa}q|3Y?PkZP~S(tr$Z9Df5x zNW6FBiSX(R|NhsKcMmdhzdbu>AY7k?d41-0zxZoU>>jXVRGU6(-hd5Q#eqNmT;rX^ zho4}`o3p6?JUXqScfoM7eX|3g=3%msz4u-+QY}2!`EE+xfud3G{Bg?8WHAT*&6CNj z#;yr*0)_peo+lC@2a8YFnjHR89K}=OA8Fhc4*z_=b`h{Zr z9gN2dbX&|F6mW@8qaPg3A9ronPif5-CPy+!K>q!x|_uDg%q<2WUW_$Tdj9Ez>AvhX0?fGE9kvXRt;|7x7Rq+H}Dhq%-+tgB!MBb z(5!iZh6sZ$Rs@+^1LRpq0te%gu0haf@k$MMqZTq!Gl(25l1lUH70bW;L_Y!aS{Yvo zZ9;fVBF35MQLX4^G!_`dkRQmgj%81ST`x8>oKZYi|dN3)IJQfvK(T{Lt2miEgQKvE5= zMPl4bEsn0M4uaqV3}`JvwQxc|=&^CaV*7UzXE7{;Vg(V-^>iNmLojmj4mWno!Iu<= zln@2Y`*T0@Ykzizf8BqnfN4(2&6^)x;FRP23)`Mx?GOQ_N8inRxDzvF;E~C7bgLwC zP8OkXm1KrNxk)CSG=&91w|N#eDT3FIl)kVc4TQw6s3*`-@h6C3y7OO$WZ76DujsNU zR6R@QJ*>1Qt!2h)7K;vtp31aI2rau}f5_pJ1A>>dFNiHU4f*NFrf~N}Q(4?lv#f35 zC@d0YpJGwb%l6`7V#tRZ)CW!G9t;`rrf->mp)iK3QYY#JJ}k}~lgZE}{ettF4~wY6 zkaa%1E?xg*UAv~1Sc=d`UJxKoB!8oL9!Uk^W2BW*eUQLjB9*Lu)pq{Q=yraK8$?w>Lc$u8l3)ZzuirL> zg(lecd=1%_fD(BE>n|h5^F4z3tz!4mVOAY$^p=E4uH$A-pF|JnK+=>m?YwT*C(wc<=6zLTm_8Ar9IIvB& zFhk<5SmWgx>nffh&(}~6Jew)|BZbxbyoAB@h*cMF$ZqMrGR&^Yr)6lqj>=#Wa4t5< z6zSgnREIHYljin)jVGPV_W zR8d|J*{dKBvBK6}{I^C)AHdDD9xO&4Uuvc;S+?2huGXjW>Fw_DK5v7B-=K(Tbm1!9bGOkS)ECOG&qb{Uxwf6{t)*kvf z{>+IKB20cN9c@#=s$^7~OP91=)%~~jksVVVh~`t`<1#LGaL(YL!eqq}Ri$IpO+K!z zlBZRktG{d9lsz(F3(!#mg86a4wxA=4$OY;lluky5i83X`CPXWqc9xBVAFwM(%v3~W zbcz8AC2deu=kO6IKZrvmx)B3Zpf1xH{W9`tyY)1k*{JFm0X9}ti6T4+6r@-8Aepg~ zsw69L`im;j+%kc}zmolmNKsfhIK!63T75w2P(tVoDe;k%{<)8F5)QI3PZ~-c z0YHw&ljJ9qps0c9wnImhIwA|HBeG%Y2=N6>O7`Z1<|D~q<5j%*_%IZ6Fxbpo8F4pj zlemX$7nVH{1_OVu?8h4^C$)|Q5`6HzgKU;rvpL5W$u?Z+Mkp(QmML2VY9<@jR)4{w zo>jEUh&FJr*Zn<@$xLd>I44b`Tj?0g#S$+do46boI-juRtLrJn$h&3f!p}fRvf(~$ z#Q}2zBP89?IIEOd?D1HXqzUKTRoSDVN|X}m-Y+G^_e=6;^Wa!2gZRB%=%6C)y(c2) zHpNU|pvA4Vc|$@Owo$Vmnaf;Xi+2uordr-Oe%;+O83G?ZE(ZG ze9+n6VL=2j$V({ojWp0&DS>p|Y|J4#-9UfPL4qO>G$nMVTJH6)a!E0*wc@2;QZt!n z(#e=%QoZmfv9|bewvdEe;N|Km7%KdN2^WVwokv`#_!hK2#)8{mohFqkK_(016Dv|nKJ-wiT(@e0U_G@&x3kE zh}T*NvSE6*`WD_5m=d;dnPbLAPPz2W!jp)KxmjfW%=`VN^Qh*W zDWdnnpL%_pg8E6?=HLVf6ik9V$QPRZUhW*grL+1RuYf+!=_|6#upkqIzeB&;5`d&Y zP>rl zX^TOiLvnPt3M~~?tJ*3LG!0ql*-fW0g*v2I8MlP6O5n&&03UD$dz+ea5S^ z>P%UJ`c4P`SgSZ4ywk1Xgp5ZTf!t5Cs8eewf=j5|o)pZ=x3}$Ry2Te~pAI%e3Juz0j6EqINIbmG9Qh^gDX2gXY z>~8D12#(ZD;R3-J2I833RW5SW;Jm4X#+<_gfomFiFf_zBqkLWZUmwOr11xf9j(~F5 zpuBo@P*@~|cJSZ3J+y$8pd73~S-KV|`0=0#v|OgJLAg_qjDYZn2m^m!O9tl9-ebb` z<3qt&d}L`$@4rW4eo#6w&O3K>$#6Y{u;h!kJBPl~x_EE`LTOiNF%35>fq+6XJn91? zMlgKAe!!sE|2XKuG^MgK4eHiGg+KQ$9bEO z{8Z(pzoP9tV*Zve&=@2|a#g?P%Grkpd~Z<^+_3p0Y90@Wn%5=(d%oi!OJy^Y*+}chD5FgcwJ#?t;6V(;lsca$grrG!wA zaBpSIN|QfDj7qNz?PN2lgm9t?j$`IpXQMf$5ABE``4-((hzge3r9qn&Jjt>`hGsQP zBfPjTZ})w~mw=Iz*8YxdZ>qgPwb8f_h<2y$3!QTMG-_u_6gs1BNiWz{Z~_dz*^q#^ zYCo%11(uR%rqY1G?cUd5l`;R zvp#g#mmki1DR9~*d?EA=pdQeK0+)r<6`zQz);#(PbRe%`7^#ftpWtN3^Z=v16BC!T zQ69+?QUyD;Po4tyc6FvyfN?Q07W&<<>!t3b0DB#z+<|^wDZuD$R)Bp)wN-+!tLVb? zWmFd)NK2OrtZlNk8S%ZeT{I6ungIzdjJV9Xyrwi%zDM7suQJ2m!ULk2+xtbaQXFei zYI&(=VPbm@XSijz)JC;f@P{J&F4dU6H!M?_0B?2Du&bm*3qTK`g{yQ4P}HSC#$u=7 ze5jn7zKdIDG%FWed0O7x)%o+y$*j}0>!?=7ZLA=t$7@P{v4mB$M)nb<8*%nx35Lx? zpo9?{D=s_T2-xK>dc}=9Cu$HE`D3K|A|yWk+uk52Vi@o)tW{ zxey7a6J=Q}9MqMJbmtp`*CEmPMF?Vpz@0RxdA=~0nQ77>uD1|JW6LC^X7uHS#$c^} zOe>cLq2kKdm+e(Pl(OIb9JaQ0vES#yo|ujL>ZJy2X86|rh1L&03qR6s^Sx|`UR&IG zcYl_=DHHsg4IaVyw0Tv6|Olxq@G<4+LQxW*(h9t{jezBLefu6+mG+Xd=J=GYD zvk_~oI6)PXY|>4^5c$bn(}{*e`4NBnd;=N5H_tV&qA>9(!Mmq96j!ra>q6YQ9n{o) z+Z8+>PQ4u~j#6_fb(l||X<*pndbELAlq)+JpbNgK^9@$=@|z?6hP+agd77QYisr?{ zO-dv6T_3b{{AqqYKV~qk-q6=MEC1NP)E9G7e4s7~Fw7^>Y`4b7J2T~!xRB)?a5s3i%`^(~dTDkJ)Az6a`N1RIFO|gL$@C;EE0smwr7Guu1s0difA+ zgX3+WD~-uymiKx;3!3y6YuGqB$y^ds5thXDC1bN2 zl@FF$78GLzp`RXZXX2bTUv#1=3W7o24}L_O)1=v>kPJ zbwjLE#h4E9$ef|5>}JU}D|$HMg=wXQivw)%h{SqH^P$cac{%KsA7%j0;bHa7^Xd)( z;dF=W#57zE90@->6o<5{nxSEtT6d0_;#k$}R5dS7#L~xOX_nA+Hk#9w$>NJXkmQITQ%es7g;% z_*}{&X~fc(RT`^5W0jR?njngXZn0)1E;qJvIDU5s&hAmm_|7|zl@uc|x6$v)iFY)9 z_jLU3h`#f#-(%Hxq|J)0oQS25$I{1C+MD~IA1Phdy&OxQjHO9!Q4d@1PgkYaS9O!P z!E|>fmL`FNy(|#ONa?cf3$gS|vGjSBwyzjxT?6r>^upx?3ahgbhI+B8G4N8z{8Fs& zVixAk*`G}ao;F> z#IyX;AFYIxUAik)#3TJaa%F8tV{J!bZC_Yb8-5?+JQfuiSt1N?CUH#h|&vUv$Wk^G1bo656vPyn!#wq% zBS~pzG-DXOM?Y{Ct&+$qh0QExl(Hj6W;tve?_@Rx!c+}&PRA8-Sz6YALJkYJ@L1Zfz;0Qk#1D9aUzc9u{fHx#Q0+q zvApLaxc?jDJnv)v8Y}*Wyco1^?0>b9>ll%>e(}`?XK7dl36u>(PzHm*z}c!d3QUDl zcIic=vI%Y#R_!G+Hrb}?>uF)^GX2sLD57=42wE@GB@DTgLdA;8?Q6IO5H+2GXh05V z+g;#FcnrBiY9`H86K6VvgJio>i4i=0Is&?swX0W0Qt+3b7jL9h4|;I%E%WmRC||WT_=H4a6j*z5$^rbQj-{2 ze#uE0h$z@0JeFWXeh|Ly1%g)$9KYJQRXs8+4Yh=gW-D|RStY=?l!L=9nXQ)7q^Y&$ zC2U1?)|wolq;+$hVAU&pVmKJKxmphL*{e$G#f`zTB6kvb)Z_9I4pu8}?EP!`LRhTN z$r5vCxZfgWcs|_EXgPKV)20E(QpS8}v(fvX!%GJ;?&2}qPL7;ngQPl)@ddMsD{ZTy zVE3uZz+!M@kKxen;LkycQ-5u}s1-F{5P%^RQcce4kIQDwB8*hEepb}tOq3f%I0LpA zzSrd!_G%gaTq9=8(0NS7VDMy?j0=NH7+?Yh*~gCE#wIbtR^Ado5sWV0>VGetqpdrI zQO%`bTG#e-*RCe#i*E|}Ee5iuLUWk3!etL%!zdFi*THvEe3S6)&9t`#M~TsdkyIzW z#c|+sAMK{*0{bRI9>ChV>G8w;4pU|CBp1AiqW)maH`1ieax+7Cv>`Gvn2Q^<2N=t& z981LTim`k!jOF{UI+g(Wc2^c4Suu_fxyF%|0eE4k6bmw5j%CB62fdXBI6D?a((r*)(2Z?rOaw}Tk6y?u2Q~>PuJqWe*RO9n`*UN8C~y%|I<&Ed&`Vb zJQBX*b8xmj3XStE17p3>!+O?Kq&W~uIEsO z88yNYgVnbr#vm5SGZHq(vDKI!GCi@GHx#=aTy0clMrRV&X0cbAd@F;64S(=#C$8fU8|gh^dk#E?zeqbsE7s|&VC9KCw; zXUpbarj$xwMD(v{{(RN^*=sldjGAArn#XEYHNPB8B3Ex-))O~-DmH(5b@SLeV(+o7 zT&wqNABB#p=Hn96y+7*aPh7qE!)5c&#O9B!ZvIHs{NZai&n{NRzG}WQa*kkO$zVKR zfnn!+aFdxUM;eG=9E@O86Yud736BgAk%0mjT?byVd==kc1_+6flhWk;Vnelw)q9JtmK=|&%_3Z5IRWKoEi3Jf%z%diPbD9Xf-{=M<&jFUk^lGd zr)vxhUowHss-Ot*C%f=@jgfNB5EqX9t4x-Bzfkv*-r-JS5J+Mo)s74_fdlDwm&#nY z`p~fq;^Vn=PmrSb1}R#hV;*!wF%5UT$?h6pBF56N5qRNhXwf@M)F5LH&+wH@?ia+mSnyPp_z?sYP1 zaL#du+6{`AEeD64=xi*s?;pC~;jvM~w>c~;ow6`keIrA|k{4|QaT5m7DPl0;fT<8& z2Fmf`$RGK;2~kZs*2cW%gImM$2}R+T+W4-Re`)dBN7_5MymYkfHI3u9NRYx$I+w9+ zPrXZvGs6dgRB?NmZ?O&P9l;lRp0uSrON-}p12o&Yf9gYRju!?GvgJ~e%5>YoXPn6L zDIX!;tRm0T?_ccwLfT;)=q4{~gdz1H{nlLNs?e&l4wkKwN3Ry7n)EL!pu$L(YOyNtrk7W1;4Ekq}kRiX6EJPt?#^TWu-|;z>H${{F?sIQxmg zYk#!gb0g$MUYK})-g_UXt+ft@>zeTU*}TPRt5k;53~fIj+cUcupaB4wS>7bnosnk+ zj?Y%%7euWo<4*c6rjpG~=rRxMj`#s(Am@&zi*J)fM}1dE=#;ACYZ&BM4^5`wcT&IL zLR|KePSFaE(WS>aB(i+Wy3kcwpHL+#JC?Gv&Aa=yqsNVFQxGQ|$bQt=ZhFcyY8kY4 z@q|qIOq-^0A@#-B4p@tLW?bnc0WQGd{T&@`7;YQ2BQ(Ce&F zuSCF>2TLZyys<+#aI$sbAT-l*%YY3y*lb9t!~~}uS86l>FlAh=yoH1XXcWL~1v8du z9X_lkR0Wg30|hI`IW}5Rb7e(Frk+7)+I~Po-u~55Ksqa-0^q~>vjTpip*GSGte+6` zK33L7gQ8mfrX~#}R!-Wbe&S>`S@?nbQI$eH?67iqAw71hqWlpEp?B9Xh~%cvnU4^h zkQc!A>>O=e0~|(HjTVY?DhD+*+XT>ZkYcM~zI-HmA=Dr$VPr$!HC0FGLp=izWhroP z43E^SQ7RktOo3(y%+5(+o4D-PX;7Qcu4u6AW%v#hx7jLXrCS`x!ybq_j03_DmS!3t z2pK-Jht#T=Ha%THA|JQ_B*dG%f!7u`2C2AI$=38+ESNDX35jkq9eBa)DQAwx7-FnO zQbViG({7*!bz3!g^eX}z$Haj^T}ndeF3oVvQ;|FheMF))L1L27WYqvjT~{ca`&G6_ zWU=tYiqI#WtH3H)ga8B5P(b!*GX|^kT9PE;(0d~2=^#o&DW$R?rN}c8r4%otghC9( z#0*hF>46j-k3jF2QpuCTqDk?X7ERJNB$uELiQqJps+UrSkL!JwE0Q|ed}-SZw??{N z4r*`F5Z)6au8|8FDd=iJRw4EnDm~zIE^JyzUP~{1z>U^Hw5sPc%rEMfpzb_C=P}n1 z5+9D}MhSKgL{mKygAfR#W!^9gBGB18rtLWIJJEL5comF^8LH5*d>dUTMwfe}at*1cf50oDOgW!Nmm zra=r%`+@-rAl_X|=fx@@?j#Bx&?nCx3aSWBwpaKIbukF4 z2y?V%inamJ|6nmw3!P8&(hZeD*xN$I`m0Gul#*4#yhg-3;W%`doVNUGFZS0LoW;Sv zDaK#a0v7I?B~m5Lr*#YlXj43ol*jZj)-nVO(II8S79OC7jq1A&LgagEm6#)?I-*rd z^9LD#kK)$*<(0akzSoJ*d@Z0N` zeS^(XOMOKx)%9755$0ZXvw8-RucZe|=N5PJ(!2G%$g5sV> zC$MD*Efdr){1^|)QOxLSTc1Xf0YyQe8|V=N96ch)eL@#SWROrRzqQ^!C6{Ir(#5Bu)C_$(Xke9JH@G{aa^}M-*A*l4@<~=H) zwTvj#4hLGmzT>Lsl+cPTjx@9h%B1 zrk;dp6NXt!Kn4uLxn}}&a@rE21QUxe&sJ`CEA-C222D_?jOap#MoD|QAPDBsI6Vx= zls(5M9YV6SY!rxW+M2kYs#41XHmQ!5bQ~t<8hI!Jhxbr;pxXXkpht4%(~;5es3{A= z+PsOxW2qqifmDdln3=*|$7Mj3XfR8quUgjY3)x609A=|gu}n%DHkC*B*M$uK)uIJg zJZsg}irX&d4p|@)(HCpWFvK3Rrgi@j04*Fs7ryS&;RJ}e*3v=mu2?#R52~fZ z_t!Ls)eUJWS*dMX`BQ(TQilGD>@&cW3a7{+ExuRjaLQ{a6?LT^r)5y*$I>cioi~RJ zw{PH34zB7{7m^tjFwbgFW{8#4CJA8+vbBq~_p2#Dqc91m8vj7JRt9KN%7(;cGm!I$ zWHq|97iEj|i<|~nPNDWcmXm>XH&3;dLg|;bj8rq{&!kGLlBV)W`16~Ek-V<091JRu zcDb6Q!DbZOLT zi%S~%=nmDi2LXGg>?c6L+rUM5DoDuvlDMt&u`RW&SR?D0Nw5X{S`wl!*b5uRf@(I4 zUPth5Xn0oQoi5_q2JfrU?b=g@GmMWHBkizCqE$^KW)uEPAsI#h8X+qjXt~l{`D3ac z!6m2@E}0eJeguP0Yazx88lW>!mWf!jgM_a)mzWDcD{Z8zWSB$_iGWT(7mE?m2o2=i zbJ@b@kOGq)*z{i)?K|YQH%zRJdJsH=z`pU2WH_KX&}%jV-TQ@7#)&pm{_a7GW2Utp zWejEEmb{1I)VDKlw7=YoQigGB4W@UOjK|n9P|pV5!Ng_8b{_bm;+y`g^U|5Wl5rZ3mc%|u7w4I$BpjAbsXNkXyb0G54Vre;J zNAhnj*O-09(uwRX`@oY_S05CQYc)a`CXJ*9t;yHSYGYtR z2R_?O5OdrpJhI0#57Qc$K1WuqMWm;E#Hj>Y=b2fo4G0X0lhhKrvcP5Ma{^X1fTi4` zDs8f>{}9q_m*I9QQ@0>>HPZn+>NL=U2>QCCKOTC>-fy}U`;$+A>d*@Ir*cylALV0u z(E^uEsBzo}6)>tgb-EmBe6|8uMl(ixk)moIqe`mblQB4`As!LqikVTqA{_}|C{z>f z4;K6j&nlxA*pKy?h9``&nr9)CChV`xTt=dfu)h!lV&O=qnaK1{Yj9AkkT7@@j*IF^yh0$7c(Yac~IU;v>gVUP(lKy{`aDS9XhIu=@95)U|RK~{eb z1rw`s4w!JRxb~{c!icOj7qoSSZ=PfqiJ= zkg&KB+FS3CH%NS<^{_H_riC{qFw4~?*?*ux=1HO@3S*%qh?KXKPW3n3*HZL zv~@@loL3c(MMngxFXa^_N8;n+;Ax9(20rN7ce1=Ab>U|dIkXiTMWiv`(YW915%YYE#qtI>%8EAM znm#}i$S(2yw0zvXHGMlZ(5 zce3>GQ#5aps`@2f_}P<~kI@ADyaXNYlkjs}#nMt;?@<&eUNG17$#-gO8R%`c?bh@uz(DPx@5)TAn%Hm8 z^q1iiJ^>FTdW*p@jc|wp3pA?BEN+cpINA-d)W zX{X!4)F^4A|5m9^phWR9RAG@c-35B>n}ei}WkDs@Sx8ndi9|-rqeMmy$?{fDZs7^D z;pS4Q3IS9Z^Ii3^UUc^IR5M)apBWIC+IusKhiOB6t698I3prUf-SsF$qXCunA$ck$ z%+!QtOD4lAgQ!^M`NybJ`I#i*XhGE?P?+0QZSwmEaVLDjGPLgDaukTy?gUSCS%+0H#+sUtiLNfFA=HRybge+H-gMB0uIz+j zjmpeNmdZZhjvho2NBi?YqPW=lqGC$HjhLgbH1c9CJo9QsIs*KE{gDp!!tYA(}Jdx-S*U#UNuXj9`r< zW7Gl&#_eUIc%hg{rez{z6^e`78Q_)#3rt-9uvH0u-`{No*RgGx8OO%m6EbpTuy@uv zcnJ7B>-};vpu;=(s`=&^B~w0QLh#fUD&6dyU`3?KI?_#;fD~_VVm{s29=3wPWHcGL z=-*wlOoEbiZQPxAfIutI^8M~vg_dFO6e<`kW5k*o$d71Z#-R|p5rM1Co)UgAhVjn- z6-@>#Ggu7AiBIUhrmQS9On-vsgt{;zGml+J{l`OTr-VU62gkkaV zn{`G5qJM=^$m(@uWLn~uBz8CP7^uy_mJDGFA^u`|Bqu6Pf40%%gekXTX;sRu;`mQ_ zeH86Ezx6|F9%PTWR<5hSt5KQFp5KZ+ruYo`&enS_gregGb{v9Mc!!jS$As6RBx9a_= zrYZ)Edu6~Q!;|!nhxFh+)PhtB8Ta=Gr;2z=5)ySLS{MbZPu@~UX`BV3dlpHs!&KWV z9cLo%x$Au-HCReQ8glcAM-^|7kONv~i*Uh5s+p$wNqeXfzf;?ZjQgyFb?DeQY@=4D zXP1JadME`mr=qcNX>l1sC_j`z0~eHOOCkG{T8KS0;`sel&d11-G_f-9C34$I&C-e1 z$Wy8BsJ}|$&yPO;6gi9_aL<;6MQDG2xI7-lLfw$kouR>y!eK{WC$`sNuUO>YA_iL~ z>Vt$>g-_B8w8l4z6=lWCHF497HNNs@OV^-#vUg;~pYn+DgEC~W0oR6s6^mhD#j_G7 z8l3=k;YsYVp`5Zkz+ySM+pfy_MHt^CqEzY@rY7yEHBrpV*maot=CESX%v^e>nnNEc zw(ZQjk8;v=vJV@W9=bNrAr=4XwQW;vEC#6NwouzG9Rxpqm~YgB5$GA43DgtJW5TXT zhj<5(<+dFHL{u5~`>|e)OsXMmTFgT>M&TNXV|+j!n1F$24ynK;mu({iJ9~0@-Wr)l zsn|ChqcN}LjF#%Oqy|}|D@ATl;H22ZiCHyjISGD5jtoNC=uBu-M?T@FRIVa_Xe)-> zB5hl2Q%C~oum=9y9b^|Bky?h6a5!K#!?RkVFA{WIhS+^ZkjHuE%$UR3=V^i>ByW)> zAwE;7Mag3ClPTdHqGo-mEbqED!-bGHek$@yPGY7N5Yfx<4UqH74Ez|vSVdXXLE*jM zR2$*5#onjjFQFic$#Dw0kAftrAnAP{WN-fsIs~etxS32ok5K|DaEsi684mm$51N#{ zuABtnRn!NgEr`rd!7h+T9o$j7vq+3I@3rb|;`# zR7tvcE2xlO0$l2x8482#dZf*P2?(-ObIgp@IC7HtA`GIuAUUmRCN9aWnNK z$c66{Mj0M)oN!kbqRE^`E@VqYHGW&F$1JHvSGb@Mn4MRu^H*swvZBKVF}qoV!TYq> zQr_voG!N*codXb3TnnTq*{TfM$Ly(LNkMmEL)%bgAXhs^Bnl~vOr8~v-H_6ac5Z(x zvty8H=?JFeZevzq9Z}eQ7Iq>Af1L>!(jekdyAI$Ds*cX&AjyUnZ{n6D-94)T(qcdk zoFZqsYQjJid9lq{wp*69(_NZctUENfG0{sLV5pEV<}58?iLt{{p?Q#av?}z@DKL^D zlchj<4A^1ZtTG0o2PHydbnh`)N~hP*CASs?e@$h2Vj$|Xr@kni z@2|zC`s4IyBJeIL8x%zq0V=KK(9p|X53f|5E*3ZZACv8Rt(GOV8XjZYUYE}X+iOA& zI);P=xQx5ae#U4*Q>gxu@R-L~EYeAeEe)m?zM8z7lUMfNQ3It5U#xw1F3-nQKVg^^ zM3*e|?t=)gQJH*{RL1OlwwT%{1B=Kd;W(F2PqI)yIEa-oXOo5Yec?*%K=zsc%_nR#uvnm0DF0j_~t9%UUis z@~LNSG8$8#n2dY8uFn?tIM$hn81X7NJt0>i&WK+UR^oK7!s64Y?-Ljxa}#n=dnuSr zEx_*-+q5#)&rAzR#=hd+Jt)JpTSx3`M=$TI-E|4d9egtsy^Qz4+al9C5=B6MtBIWksWoqpiMzNT19n%CC$L zGUKa#y4G6t{0;HB$UQU@@K@x7ONAletT5OY-;Tq5;uNEhbkI0R5TJ09BHwugpOUm? z%4ua^`DMgCa0J-}^OcxzQJFV`@$!s~Uz8xSySf##zmq4hvpY(TRC>&V;RoiZoC7#m4#Xd__s?51EIpt0kwmoGf7DO{r zkxVJ5qa)wes&Dh)Y4NxBmEUert#f=ExIH)#A}`4I5u!QXpH$KOHV;7~^LYYp5}2wi z=6HRk`w3%*43~d=#F8Cc!A1)awrD6p6g$N{xa&&oGS&v=wG+FJ)gz zMo-ktGmS97YwKkd6A=PvhA|O{O_HT*B=tX{rBp6`#0dQaWF6%t=_n>EWb?Ea%vXR5 z*~-8uk;&&$Y7mu`yp~-!C^dB{HL~7dTtRrmLexI0y^K7bQy=v$Bj%8q(o93^lC+(F z6)Yy04FZvakV=;<={V?;remEW15*fLnzH6IS#Rr`ZKLyA6Q~!nuu^t zuTmnBX2GO_{I;y{XcE90Rw43tTA)jJpvywqY~LuV#H<2C`G+yCV;P9Si-@miPz0Cl zAneCLsnRl{cjH-PR&j_QXrGkSg+t4+F*T@u!quaSF*Koi9m7E@#0_u~6nYAx2@CA7r^9w0)Ht^KC~EHT+ub>( zG$C>rO6sy{Lt~FS8>;HU9YUCe5uKu4)7*fh{` z6fexol!jt{X{!i!79oYQQif_B^r@C?V6|P3QnhU9aY4dDk*YFm{D^ji%^(KeRC^+< zR=i~)+E1hD7sa8?OtHlO*RpH}GRf=64r=zI3U6_f36h#|H>GaD=R_HV&B?OPJRCEg zFsJ}^qj=%KKj+0)-}j`P&-fL^uu04CFf)QU??k>i^#&Z#A6^Cpgci)#!}16)8P`00 zQ?1_lB1x`fTov;St4@N>6tgBu7DPKb|tiyX%Cjrc2_~`GuIyqVBkBFsaxcdXeMq3sKR z6la3LZfs2mv=FFEW|7eH2o{IdCzLNEG6zTm26aGdz0+Mi9**hOGcIm|{UQ$ACso#KVo4wzQ zMqB@9tF zQy}a8QHrLaMJ2`{eNOAu?5SQ$%s?)rrV9+oT%;(=h9w0=uPH#d0($LFUY|^gXC6g3 z1%>msm?9jL(=5&sEXslG=?a~brQhi=IhzH!aj7bu|NH)BZfPMDmiw6zBAhp!7uP)k zC8z-;*lN*B?oP5pDIf))QS4+vI%oT{PvM~(5iR6`rmJEDp88C7p+UNK#_`xvalX!L zYYY;B*}jPhEu(714f`f%YYB&mrD^6r^+vPRo}BDWOifLWjqB7l@d;)Y1h9c+1L>LT zVj8$wkpF>~k%d{!dS3pIfXdulGkkI@v!bra*Bd_j4v5&#lyN40`Rzr{GbS%-euvMN zRgi~d^K~p9t@I=`ns3N(Z@(eq^k$Vfmnv^>6V|BO$`Ugwks~KV3F%MBNSC-BB!l=l z$qx<;QiJ@wnSx9P{M#_@n>A)a_61Ri1>W%Fpy1#pJ5k-zw5gSAB{ocXuKz)?-j`KB zHZ)@CkQ)I{Z-B^+*b5Pd09PyiRt^Puv}(m4@VpMf$+a;G%W2e`0L!V$Npl4(N-bWB zupunZlhaChgi2seCP56jQOXa1M~3yjRu)UzsVikAn@@Qh7Xd;EhZKAnXO)+b{K$bg zu7%!UQUP(cLmG8tWs2aQ)tz#(qnY*ogBC&H;~3a|g%`R%%Kb&(>(s+rvkURL4!yBQ8qN59?d~xw^t6e;_oWrg31x?S_f9A1juYmcD~DxdLfxjV$g7(0{XVB3Y%tAC@K3^t`eNbX1rALKwVP z66w7DQtB^<&iT5W>C~vOS*>RRevboJ!0)kYSV90<)ybr{DaP4E8l^kWRiB-}t0rRu zQSPF;R-{J~b|5RXmM;ZBab1W+Xck8*T-_3oLP~tT#wpV98h`_sKM0) z0$DTJxks)uB)Y6~frX3*7Lt#LsW^Vcq>SU|6HoZ2qBv;W<9D!xi3#~F9zotjVmg#+ z+MJ0acraCR)YDQr*!U#BK4Ww^?R|$l6msRW#0p{j(k({V`?(5dXDd`+!BTaGK}pWw zBtmd8@S`yKK+Y?$RK_=oRxk^)1FAIn%|wfm;hW1x-fNP-sj%bEEEqF^Sul1hZ?$NQ zGG6Q$0i6oc3wNug!zxO#K4Em~tOo;Bp>xRJUV@<_>>@fj>jC7xq^^mpfXfSzcRp_3 z65x$EWz(;PSKu#_R~QB~DI$@4!){rG{Nwv{>Fe}~qx|U8#n`7y?$gU7eY*S&`t*78 z%%*LnIY&W7o$RDYW=W*kdtYSXOQ~4fav%lbpum+`+<{bTGb?`d$P&CLjPHTD&i1>k;!+2gpUdyYbZ}wBwTXia!M7;BP2ZJ$jgb~ zenxN`-cyh;BUnCQfYTViW_fq!z0&0%$Nj~96?e^rbL<`qb zs)89kuNda1Vk37doic~aajc{d|7$Ai!NE!oTWkI_WMb@DAOVW4w2}?uXx{Lkb}7zRAjE(HFZ5I#x$T;-QQ4SSt*1o+<{Uw_M;rb`YyV|_3xY_GH8C3ksQ^>( zvqLeeL`F&Rz!8r0N{a1AoB`?nBi&8h?KncpBh+z6>`U@rlOx^HbYHp;=#VW*E0tVD zUiMrx-z#esE`ItEH8Prg2xqHI@)5to;2=XhSSdU$?vs0@jVjQI1H6xQO9Rfac59{i z>?08ODP7}=BQ*`$*HpV@(0J+0Rp_JVJbaBZ}n)$6FHNvhM7(tC^o*0ISZo&2t_jRAcR0gTsT zRL-0+t0iJF()k`W1m*`Ra+9fiMN*++I=awiY>H*25iqFBG z&c;W*zn@-Euh70rvtx;md?>QS>Zvd7TeQRT9v;mLFw>baYRKm{^&0n&+l zRE8fCpBi(S3mOxQh(krypg#d+SxK_XtQqiw8n7mZA&?xL4+TrD-^uh3eV7M#UFEr6m_K8#M;aaT=p7%wF(P4(53@D~I_o?7b z@vUYEzW7}rJ&aDpB9`Qw)nLPCT@4&AXA5yhwR^VqC6zF0Xq#_>XyCW&`_yl7>bUm?g--P_4q6qB;D zLX3`R7NK9R^FA1xNP_&r19Gj{pPIq`v>2P^Es+X;_J)`K8G5l6eUsypF`)@hSW7x! z1Ly8cI#3d#cQxs72^H|#t4K#4NXIy&17Co@9O*dEoSJk{^&LqE&GnHEaHk?2_6&e@ zEQoZ-D?mH&3pHk1AZ-TQmo1qXP>D1X_&Li>LJ!ToY{1F-c?V+8l{Ajepqp{=uSl@k1%x6G&hPmcCIRQgG^4aFs*DJfQu!i%TyA? zf=ksDdDEgr8mW7=)kbO%bU>;^Cd?}W1bdxQb7Xs=*j=;>YQ7wBE}2uZHl)CNQ<>UW zZIvJtL|;S$2|`!Xv>r@th(f{AhBczvNCg?lJ+Y^9g0C7o6z~(W2h6CK(ejIfZ`~O& z0SiW`o1~HBnv9xK?Kg^x!7PQa%&HpDg10HdiAW_X`3~_(uCQ!Vy68(;FM3aUsgatI zKB}g0B^(`2^k2>Yv2yUSM>+d&ulcD0I`kMCtLf&;E;SO@>>qwPd8$|2igcU_=fqkDo*$PK%q; zc_p<(3xr2qH4v5HpZOx*75E9s98mn&f0l(b+`u<3ro*o{e84iY98T{c9(DXksRF@b zX=A5#A{`I_xK;9N8FLxrR~8W640L1dzfmdIYz(9W1GRw+rXh`-!qw}9uRKYuY2nO&IDW5b+00AIx z#q_T>I_yZLBoyJ81l#%~Up@%B7dUjOd-==tAZTE;@KM;&NNjIyD`7t&#nrClJ`8@c zaS;jtDcyr3Ll~y^KDhdu*&!1>J<^nFmzr1|1pz~bLlsWom88%}>8^Q6j6_tA%>m>> z>5t*?@`MWB8v-a00dr_vo&0>N+E@MjgW+eUOBew=9+Yx>XFyg&c~KO_4sng*2C zTneevDlEZ^eNae^p^`S4i?s7uX+8@bw$kab^AW7nn3+7(P`?R@My_y_SeeE3C`0W(|8ID-?|#LZe=<)xr)z)LCo4-e6V@PtD(d z;-urwFNQS_i1~?{23G%4{6SLwL;`9>ictYTy13>uRW$tNR@l(WFD8)jDr((k;6O1P zCbJLtLE|eI-JpL~!UsW}jb;_NzB1mGEBg7T8hNU*Yp_{1kU}uB;@7#U54Ku$398)x z8TUi&)-?A*b6kOWEP4lqHpp|}P-gryf2DrP+0{zwv1)Hqd$A+DwRER({r z`Ve)gB{9rrRIjdC4Iku6S|*2luI&NBi~6K-PA_Cr{Iifey;XPf*;8AK?cmHWOMyyv zCROpXrU%Y};`U`Zc8^z|kj4sNH_1mtlCwIw7*}p729Q7r(0OdlQQJ{p*jakbnt>lG zfq*qa!}l8BE47Vjr*=+IO?usMs7}#R-0x>aH32U!Vk{JCd!te1uq5Y9p7q`>cmeQ} zUoA-PpqC*sAIM20S)!>LntZ&RBGHA~r+NdOUlG%lB?9s$QjHcsqscidjC?4y$EIr^ zkmKHW>XHZ!`S8JO$fS~#iBz@}-%-4*$J6x>Y-Iz3=UPa0g4qSSI0bLqv?WwdiefqX zBSFSiG9(sgkAFp*bR^fk3Q#*}=>q{zXgAkKu$g}gYN+R| z_y@E>j4Kkg8x;q}9CTgKDD&zN6~g>9M$Y4;k%$ENECP$)A1)j~X|b<6Cb(aNZ1ZAgqX z)_k_Zk26$-AwY|RimKJZ2defcb~%;!n4tT9Z?C>p?g&TqjVMW-T-qoN+~ODo&&G?z zUm8}*h&<{1kLE3&kQ(UA4)cPXIn(cC1G6ML!kE)y%ypzv@&TJm&WK=}okqyVGhu&~ z%4r4=r28~iudp=fSKEhs)QT_JA(J1-U?Exo2XlzKJ8#F`6CgC=U%m4kU@Oe!|4X`z zLQX3drKmx!ApR5>5p3-$PS(`ze0Op0jl2-b<}}Lz{RNOF+}!hDqDaCfjvOd*t|6};un z&(8xXNiq;9RsdgO2S{KNz`Nc{&@6~c*R-<0!a&*jDpoDS!P+5z50f{_gW zEj(Zt_J+o0EPUmb<%MS(Zy^$|8AQ!~UVQnTpom;X+zhG~w}ZOI$$~-twD`$?ij@FJ%bh*PnXB`nU)n~o>uD;OQ^V%h{;I_RFC9P zo+}>{u>D&(l383Ks)_5i=;oxZn$XBr=eGjLhSU^YH@yt|S#ZYf2X6BJC=LSBMU49Z zV7JehTm*Ti(vd}n6Mbc86AJYjZ1J*m&*-^&9o2~pyAnr2N94V!3bg<4Lhu8C?3%WX zujo8^hT~?PAy%7p&w-7yXn)F4SrYfCD)KKwJhb?i*p}wvt6It^qe|MJf6W(+HS1$wi*Ub!_Of z&5F>MAsJd?pl=J;)~n{)|3Gpa9Kwi(WJQnj1Gov-WH^vBhSK?V#thZ>Ks3EvyN<~_ z!QA*2VZKz)(wBkycd#C$W(cx2vc@5RhS>&A?rf~3Ph^kPb-M4 z;tQHgrfRQ<-7{!VBoR%f`>@7PJlaJuwm*sg{TEUkQ(kNYEZ&~g_fuceN=@DF*hgw(FL^wL= zBRpeOF={ovt@9yc1?Zubf}ONXS@vDEDgqbe(o4*@JIyNemW-S+NHh_t0=r|FUaKiP z)1FqV^8ks=(^k^s;Srze-p5u=;{|X)Ebx0WwA+G2etVTREr_bjWIIn+W!Z>PQ|dk| zjiSKUhPej^RUaFR>XC&t5y>+jN8VC${->(?Yb!$xOhDZzCW~MHeJW#`Wnu98b9d=y zacosqw(nax@qnse50ghADhPLC)mhFDFoKFahx%6b6!g0pSEB=pYg$|=c!Yw!-X?u+ zO5zTu>cBM!-GCoB4-4!ltV}@YtSVr0k%MgY^;xn-l5_RGE2TSnpGqfODY+j7vb5kA zXl?ONe?Jm?Iv{=V)f04n9QYEcGispd>6cgii#H<9jayq#qIv7woZ4VN^?JcVhxdRj2f{Ni)k9n}_xz-Fi9SXu zr8?+X{PW*M8A8*z5=c!$Is@03i@F`=6)!lxnh0-}&%NkApz5{_Lv38UG>Dxe#ZUi1 zqu9V)43zIWxdCd&$oAL+6#x12=%C8y<`vJV4%G)ng2o{L+I)}SlCB@2ieviYba7?U zW*U^R#DHSov|9IACOeRlsGbzV!w6dgl1?ymg*g;2r)Pl19y6NqJj2U*=} z^2f1RB?bO;b%*Obu8#{miRxB#lW>$<9E|GLJSpE&QV?ogcVvL`9w{NBJL6l8`3XehCssdo83UI**>xEBI8kOWv*e;A@4Oyf{kU|0p3yvy8 zsBDK|efUsO`BS7U3R8mO5uqPzFRU5~6-7opR$AAJPtv1~=ZW8x1~H;nLo1UH8^umV zb!TC3mK68sdl;I&_ktZeC^9Bm(7~%4O*Q!2p6r~%qchM3qEI0iv zaIfkc6Z}@}iAjKhFjd~5nI-txSq=Fbl=}g<8qo9yYOZ`$1Ah{^(QC2nX>q^v2_^3~ zjS9Od*=wgp8)=RGKyWaEZB30f!w;#wXaWg)8_U=BUv1mq4> z=XyT@>Ggkf`_5En)kpXCfAkk?s7_z^R(<3pSb}2hNAEExA}XhS^gz;#a+g%{Ov%nm zS}`_ko&Ju@Am&r^-lhGs#mn2TI6ft@UI%RmU!xM zcuerJgD`JH;GfX`@wzQkRwqiQ0I?4#KNO7u$3gp5{Nd8ikFudHHMi1oMpyt2(9Iiosh{U)ncDs5KPgZbO$vCyQHDc z@3W_IIIb&mw&$Ip;ytQ(x7~5&?TzP}Y*_el2bJ}HDnK);5h{}d44gZ$GR5_oH@n7t z+P^;PG&SgewavD5!9YP-r>CR~)06$q+n{T0-KgjgDDT>V1huOt?94t$fe6f&SE8(< zY-GQWF*d~}8=%<2v7vbfiX@;|P7Je>arB9*oK&Gna~GjWA7+z0gEs_HHN6j?|3mJj zq#sjXls=7X@1Q>tMx$LcBSlL8KHg-f3Op&A1cAV@_>m&26a1Iqzjzo+7Z$+3~w;6!_K!E&7bkWM`94I>hFkFbvYMHqFPxj9E~B0 z2#ld9as&c^ogMiI0si5Jph3dVzq$Vryg>YpQ|U?1h!XNU$O%RMSqtR7;X`g$D|dY8E;?NF_*7m#?lCI<%|S zfg(XwZ8@K0`dJKD<(rRK1~(Elpzf*OdMOgt>xX7AYvBf@mjA*NCzt-I4IgBRK7;tdk_IHjg+>{9|BU!!=e-{z;M2)sM*TAIichV zfeRJOAr%tmQ$UJHXce1<8Q2`TP#1fg9SV2n0oZM-m4WIUiRYc}!*^%vvP_eg#dq^Q zZ(4a-l<4xTT<$5SW4Ww@0=T~#%S*9bjO85Vu4J)J1_0M~!Is{o_;i}zgzJ}ePkAwx zXJUD@Z>ehb`UrGGcZmi>G8<2c3^>xw=nx|e1)7wmw1$mh4saj<=0hBaE!qtJPO)eq z(2V^|y^Gb5{4fCPSTn1$Z?0W1i#%)x_P5(cwI`V?!m3PboF2aH<&Q zv;ktpr6|E?fN~P~gk< z1Q|q&YuwUIAFp7hzs5NLk*=zG%B6<%GL7PR{fMT75ktn^joEq+wauB4aCfTSL;Erp z?~bz=PLDvm{;JK-t0I~|OT0i}$Kp)P;V~b%<7x6H0Hkh+EO(nMc`Q!$hY1!y+#a>u zC$-v3O0IoR@N)-jNkr8Z+^KS2Z3c5p6EX<47PHvLP-h~D#LTKRh>~3WXoxgMK|iZn zd6Qq!-)i5k%?rz;-r3AHWOKo>eDb;-_-K(nkBQJSv}B3(Pi*ymXKUwMqrE~Mg|Lz> z70)NNhg*Z_gvKJvl%^%?BkiJ9Q1&(ye5f-S^uFM@Nc(4hg3l8Y+DYCH({0({ zIn%f~o;Q+j=sYG%8_$+9q@hO60$TKb2&hIZfKrhZ+E`^T_zSEH#e$vJ`k=mZBgBU* z!eSu5D<7@=$u!@*02*E#&fm`9N5PeP=O5R$gwC8B(L%T+eRfM*>_*N~zN~eA3CK_r z9((^Ng5px9cdt|(>qB(9emRpnjJB$)x<<=%jU7B)lW$AC>Y5i!L;K*X!};5QyM**N zbZv=`SU&u#3^beRAk!CckeRYqzg%@xJ;2cbgpx*9yay+>Vz2YD;<@o75hb}PL}vZm z7|!o59P_1v736BYj!iuCz_0qt9{B;}Y&L~F(kna$LwPPMD|`N=yM+e(P8xqRMFlmAvx^x^DE{QU-aayecvr@eQuM7Sd-TH4)N_0nX21yaQo8rqtV z<=gTx#O2<$q8VJ5meTGneS9VD@z_Z<#`2vHC3W6?2Tlugg|RF%mV6i7gaRd_?)Vk( zy>Z5r^y6GequD5niAcJBU>~jx~@Cm;B`SItP3)*p&1g^ zTuLEG55TJ!kTbQ&f>zs=ypNT~;*bx3iny(%QEj?19aSV;fpTheRDMF!MtL%puPb;vcKr{bgG;rucwo7lE`7_3a$uh3)zw4 z%9Td(2-jCuL+yg=I34R)a2>O4pvJTyKY7mNdWd?LznkTQ*MBQXPpkH3Z1$E)6JF@) zZG;_pfsh1E(;O2Z2ms|9M>Si#IXx2Iv_EcB#B7FNv|^pkrVVj5F-Uq?V2)KZXl(V$ zf<)B2@GGYrMsdo@Fg~`+1-6hY23G!i{!GB!4rjIjcxSgUn@$X+CD z44e(`MG5y<(a5f}WUr<9dxTq#9{Vbf9pQoC=$g_fw2U>xqAcJ2x z-$oAJ>g&aDEtG^UdQa~*uetx1WB-@j|4USkn-f#y5eQ1d6}!?!2zsv8EDzd&fjSI`F!;Jl! zUIRO>Y03JRC0&uOqxg;AY!v^VMvJA@tM{gByb&u!nq{dp40F zv#Q;cRYfU#?37SA6Kk04LHUnzg9e}OZqFz49mtS4Ywt>S_sED;fp9{7IvzjE)!k#* zX%LIn5@qTFcq;-*8SYsLD12(7j8#W1wIfaDXH6%=8dL2jV^hpJE1a8M$#_?SMiA)x z|7F65<6fPe`e>)7|D0CbdBqbEaVsbL!9d0lgq)}lI;=*{aKi>o@K$RdRH97xXTM%O z7hm0{SI=@I@fIp8MIvH%=cnV#dj;O}L$0MQK;re@*(as<8r&|K*P4Z3iU)kc=AgZ5 za}Y5e8n~doqAz1Xj21)1Lelv{Z2tr}u^9V`nvG8`knR~XglaN_r3Xp-%6|D&}EwK!@w5>&ug)d9}zs4G#uFyBJ5wPVE?S%y&m6v zM(-{M*aH9OdhPtd&Nq20wt64)*MjX0b!MR-wy#ClUIezcVqX>w+na(dRC)!rJl>Hl zd{x-ah*ksJW9)M(*m5A>fMEOBE308UlRx;~C3po=C|WTGDOwHEGbSJ>R51uQX99AZ zJ6Y9Apw8DSsGjocr{e1;{rX9g`UT9Ntr@TdqNDZEm#+ATMqi)%q;=E2UJlo^Qkpdw z)NR3s@~B!rM@N4afrqSuED`je@cbIPZ_4w^!Pd&h&&aZaNmhIvVL;+2G(mDo%Liyu z8zgFa*xbIqp^LGh%ajE%3~L*jjtw3COEq+f^b|pD)e2&l_^0FwjE&|sr$v|O=6ozq zsigO3V>wHPMAX^R?*wx)@3K1diiX5#SW*}OparY<^$z?>@7P=~DUIB1dWSDA42sU> z_lr&UF%Y4nR9aMhJ$B=!N(8S&1pNlbe?b!8W{Ct=jS>@MVw;)uS3ItvA+#@|wx_mD8j6G`Z%b(IQmoc0 z=PSCQ`pYgg!|a}}YIn!hhaq-ewKFup+>v55TcYO#iGU*`!Y88yRn8FS31P2W^`>p5 z&PD6%{4rEQc(sK7?*yz)w#49E>2b(^U!~=UFY-}YX-k#bXRsRPW!R*Kd8x%P>mH^| zkJa(iSM;2^tY=?}H(_|X(Gb-t2b-Au`L$&|fzJ4~YqYP|IzL&H6MO_gdcEaglwc6+ zE5UGbs04$2hUl>)OZ?o`-y~g)wNukxLeM?62mEf`VGKw0p2xtf9E&$0)}9-*J6iaw zhJg|k$wzN8jHdYDaV<@~mUX^O?kurF=KQ3)!^J744=i!lPOD3Rbyi(^6YQCDNN?w( zVV7&HNYC6EB#RYhM37j#k022REJ3mm+dZ$62j}k4{sp&>VDP^M6!SV{%*zs%toe)R ze?uh?uHRu9+|qNy76?qMRm$7dGN21b)f5XA9AfKqifxJaXq9194f2cil(Xn54MJvf zP7f$gyR=;mBE$>Y6N_G;D4&hi26VTD&3f;UUSA45jwE3G67Q9G(ybyGQ(}PQgIIVeF^!Ew=TV91>{8 zu0&(=3}#p8107=pOKgf(8IfMbV0-%^(Vs|+?$)-g?}@w+V@YzA`m`2Wxj|rc#Ek5VGPU-}rm=FA8HA?ImzU$s?q?5Onok8a%)5RR`$0x>NbXVHj0ZnY**}+d*tR|0f|m8O%v#^!@Rg=8Sdeo0nj&C|1a7@SkH9G%V>KMq%xE}A45l!tCd#>~E4VsH}ib86EnAy;)7erJCk zq6v8*jhk3QLMNyVF0M)}sRC!*IRz_9!V;;BL;=O;Zea85;7!JABY(-mWQ6xO%#*MH zY!nt~eb5)A@iMmXvm>>2a*ez}408jj)F`&YDbxq;4QRKfX|G&52)LOK4uR;HD~CY4 zcCts6q*B`zM7d28<>)=VlyW4jYaG_RI|5&sn79{0;Nlu@hmc!}nbFZ_Sx=r)nuxGT zQZ|I4&M(BT*dU?mUW|8akeI^@D7o>hV&gfBm!DToSyz``gIOKkX)alKOaUA_mX~TE zEg|CKE5%ZZKQJV85S8{&ca=gTAHecy=UL%e9I9nt^>4U5#%VN=+);>CuNAJXby+zg ztkk+-Vl@;_~j10Y{xoZz9jN+74KKMs%Z;N za|nPI@#SkQ*2cN6=_$atp1J(x+-I%+`lAbudeV=Yw($!ZDCZdj_}R zIId7@e=Sf++{so@gB%fX2SE7-)HonqfPK39Luw0V;t%20M)YatR#B6OBOJc5T3#6R zA~;nn2@Bn{`U2f1kXzIz0+jVEL|6q(elrT{1Y;I*J&;NZLcyNZf-SA%FH{`MLX%}V z!aKvPQl$MbEy7Mqbr8>4b-{uFZn@U^H7gsgm3?#S0WIy*P*3X}oc~aFR!Y=80?2%P zYq#FQ!PX7wHGyHTTre~agg#Z^=FX<(UCqwhr7#MIRcdu9GCg!NZeeyx_*sbcPgfJx2#gBOB1SdzNHR`A%L+87Dg~MY6GRmG_KJx`mIlMc8b@M7MRK+{c=NN-^Jg?g_69@%#9>vM zH#x09KK|68F~h2Z>pS6R2n#%aEN)O_2Mt|4ML ze#xtt1Beo2b4IT*aPV9>dM+M72R!BF#yWJE4$kn-uym}`uZ#Wdu1063p6?VWOB)i$NgklMEk}u(NAc)D97B@1!b(Q*uQP z7A$srT=-rte@ssOX(`UNITs`)`|wgn-Ik)jK4r%xA8})O?O42V#*G<-70DOG33a-P z#^9pq^dR{-2{rhEIq2xT&xThttM@IS5`c>c3H1%IVZ+h~8=eSw%;*WQqeu_XdxokM zrF2{;BG{>ob1BG}Jz(#cQ6xN$q>{fdgMX5lLHHc7!j^Q9aWuk;^&R7vT92Vma&d@rZ6?hz$e-) z5K^Af>?-*@HR^4Ox-MB3=uuU1Z@3tt!{zb|IWah`G2)O&wger{Rqh5>5^;NgIj|+cH@;L{|7Y#)rsBkpaDJCap6JCBEa+5I zxxPp_!l|WsTgUq&{B3BB^#9S2YP}A*L*8eUSL-PMvAgxAM(=76?$q`_x^QM&{$Zj! zWc6ivDRLljk8Ln0E9SAnwudn?bka`NsCNdTfrDYo!9#*pM+Zie_3PJDL(%LGljOT- zQ*g(|M754k3=K2e!wO#+ra%W!?{3tJY<4-2d40a|sS$DNVf^hH`Nr;0CbAFkHAh5E zDAS7KcU$iR9)oJrw++V0?QbSfCsn4UqvwjA)$59&-NOCDJjZ*4|GldaQSyY*ix*#@ zQAZ{W3F+wxutqhq5jZnCoovdAMP|hRfkfO8C@vPVDgGfpH{J=#vs={lphG{qv|;*! zuZWgPBVT7SgNZkE=@v=QAXn7F{<-`Bsz=u}Tkb=VK81O8m?6BEYN=gavdVj%)U2cQ zcr@>@U|1fF;0DzZe$msbz%W1pmM|b`y zE@+)d!c$2)kwx}MOoKt27DG?uZH`RX!bVhkU#P@%?fu%$l_WIm%KAuX*k^3O?`?yK zOGQJU!F7+N^Fe6nh9h~Sq@k9ayvgFcNpDf~X@dmqynHx(b0E--L&HQ9d8s4QxxB0z^79($D1wtR3x^F z3R;1tiWNXp>CS!uZ&;8KnNo5F?$*>iELI_QdQG)Kua_y+Fa(1Md~Yw^DwcIqPZ|4? zo=OhmXZp;p&y&H1Z@~S;hkvWAZtT;VBl;1kpFuMZNM(#}Yv;#M7RmF~J)Fe!0^VzH zR8C1jkg5WL>cxYSRqMr%epWo+uwY&4RlD%93-43Q4HUB$VqXfWG?8J;+>>uOaxciR z84{1!A@YtS<4gkNekr)5+vfU!gixQ&&MiZ5ur04!F|z*TQ1$iM=v6H!_@`(}+gX%bqia+a7bE!;~cQ}Kzs#lY!cxDiFb97X@LqlQt?Rd&qJ%tq}5CG zrjEcg#Mx|9fjUJXxWsSiTgkB^_EdF}tg_5=2)e@B18-QRBh}1-N!p>XC(&jE1kz^2 zU`*w`!Y+g)YfUNBNR|}zr))M#jcE*H@cW>T>f(FJ=0E_EOxJBPha+p1dk>|KPojXn zFXa!Tu-ME(ch)Pw0{0oOH>&^0;9aZ!Gx=0nE2Z{TTB{o6P0=zoNC=TOHzLuzAJIaB z4SyBW%oMT!NP;uD1vDh!g}gZ8()59J{By;yu=dOCl8t9gf#Bhn}}X^v_Z zbu!ck-XO*%!2uG(sd0oVH=ek`?CFuLufbIbnQE?(PoU7Mx~os!M4lah7Qqc;Ra;c* zQ~_<*xDGonCAC6%+80;Cs^EL=_LTIk+*w`w#%v?Is`O>%aGo=-T5Kg-#sAGL;wIX% zQ(016Y)B(&Qmom-r}#=(l`Z*sE0124Z#M7U#z{tDk>sm z&Nt2xK*StVhbe?OTtL|>W;3`1YYW*7b|hR;n6^JSn~7E)!+xi_<}>L5X5t-g@+_{S z@eVh6d4j~d)0x~Kh~o2ivzhjsoH9KkaM<@9TELLy^ZN;!lGi(&h4N$un-!&?C*6?} zkZ)e*qf|G7a7-afc?oOc+#_gi~@hC1$6nohn zQ0zg*qu7n0LotcqMv=ouD7GQWQH;UiDM&J^LWvtGq`{(4m^DS4Ed#|kQWM1lu~!^| zsPvRTf_STz#5+Q?S~-5w#BH^56kG&zwQ>>~EUUz}b}a&SNH+o|0Km+vR|HeOXj6c! z9STUr7zNdhQ-GtI2oN);psfiC7V0DgJ=jSBzuHZ~bnc;G`R%1(g+5Aw@@yXkY1j5s zj6ae*MIjIAN0I|v;XQtc;x7MiSQt4PR3K7vqHz-%Rr7kolS52dt3Z>?XP()csiY-P zjSvs7>*bVny#aM^-#W!JJT9~20~lc?I$1R*<%`!SYetX(v~nL0B>@Lsqi3r%ISZlq5g#wJH;;H||l zan>BqS8zJxtz3ka{V3!{VOX)939zC;Jn0Q1Jm~{nt6()NSn&NKPSO|dofmd zwN{`vN$BG0DmiIzO_h4h9t{R59`q4+FMe%vf&;!Gk2kz4I8n{X@i-^PsyUg_70%@= zJcgj?5`Q%dIGQu*OL0yvc~0<{ujXXEpgQol=j4SR`|oN-$iyvn$wpn!GN3@k0vBY2addg;fS z7}|gLk0cYf?;hrVP=aiML2NfNXO_-HfCf76u_#qs{R_w((Ew~k#U({=apm{=Co;fT zrFRhU9A>`0KT?{dv?@@WmgQ0cXVuV5ZiJL3Q8n4JVeIFi?J7xP`14ILcXOKB&c5cmbsVq%V_>a*QF;^-=VZ`No3rZPZU1Cf=Au#<|I8 z^@piC1HSAgT|d6@Q@9c6)QLZ@0XGcf6N*WEG+gJ}5HTOpY-qEN9Le=KawHNoN;Ch~ zkT3x#b9OwE13U>TsAoT~baZyQAUZ+|Qhcm#IjveAQ_F`!%N@0RK&@dF)$q6?2Wn^+ z09u76H3ry_ko$!%l?jNC>J&!rc2Hx4#X^u2$b4DI%zC@-g>;Ff1F(_JSU~I@L28~Y z*AUw1Y&|fMp!qNpslN#m5wXu%Qxsm|{cMCpfRSS{@^b0pwLMGS_#w)4oSWu{EB$h$ zpP=h3EldQKx!L6i4VYEI$m)e#>K1^$9ZTW>0L4vM@3c11h;F)L3e03Tel;fhmNb;0 zfCy&70!%w+Vu`DNA4mDBto$uonXOtOD8a1|l;DzJg}zqSuyP_AV&~?XZ#k)iB6w0s zMP%l5T~lcUTINbnzE(~1lCB7_UJ>z@R@gY|kT}gJt1U|DVT|1KNHBQ(mzuM}SBnPm zCoToT>^3^WF7to&pdzfHoa+};hs0(0_hmo9aXE@8mvqHp z3e}E+iea5Gbss~_=<)}7P}*nESYXP?}4$rCC^9iqSf#wLg7ty%(IH)yDdWrAxHUs!j1VLiqd%IXo~3%7l%__h#hWfy?ve9bOE>EiRG_}w329Et3k zP|qmF=i3M#B-Q}Jyk-YCQ`4}Ck3irnVRQ^VGo9+Z7G=MqthV_GrD?x^MqsK3FunBO z3QWWWVhX(jm_o2%38tBR+jl=Es1b>oe{IlFUVNbQr2rkwzCcHsOXx4qDdb3rUaucI z&_Tj=B7PFE!ynYP9zRh&sCs$XICYkDb~N*>4sG0FoqaRE&L{IafD~rwxP~*YHjAU* z-8lh5XFtIo>$pPnzz2~@>kp-+BrlC!tMNHqF_ z`DX&mF)je}G>jn_$Be@1sx=jl<5W`+j4+gb$!7Fx7}{Wd&!_jY1`rOp{KiaT3VVg-I2+-uu4Kxh_Z(pOrI> zs?kVi-QG4tjWw)fMsdidiARUtl1&m`Wrjh#l>2f~?7|-}ip10R3;M;{_61#W(oe-o z7W!GqL|`R3tYq+OkU{QD(}}K(U6@s;KvQBbT@r8EN7M21fhon*sG!!8u%Gg#ziwuN?t=YxX;3t_@NxE7s6jr=gBfVNX zaif~U>*@xtEdxDkCF){!+AH^W_N?BbvqXvk-8F3IBkC)mVC+OW5~{DSFNUr@7kc{P zze-1mB#Y2pP#5SZv1ff91<_Y^^tj%lqo?(qJQey8@_;&eLQnQh_4o5o=;yxB&;5Uu ze$J{^L;sX|KtE5e>L>inzs@%*u(DIrq^)FNRKJ5_%vI{^8zCO}PinzRUHQt6 zNtrLi> ze#P6K?JgT8VmR5xpplX$AZPC;Z&@c+A(g5hlH!^lRx(@%cm%U9P#1iN#=$Oq#7za~ zhEHa}xq%dhHPk3I63q7vcV`&xgka34(Mn&7z76n18CYuUlk}(7`BwEDWs3f=b5G>s zz<_j4o3rTQD1q;gyaD-D8JiPj(et1k&@ERAEd2h6L%MYBM4&)YP7Ez=`Dx9rtlIad zQ$o0@&OcTqn3sGm?QR*m(B|-)8iD?Y9yt9?)g?a05lU`@{)s-w>%z4-(dpiBZU2Kk zTr*Xi11xMFhtkV3TVryG#q6uTZ^WoB7)uC(^r(HR@v1{qYAjG7KDavG?Bj>iZwSX- z&yGe-Dr()W{JjrM9M13S zlG?2M_WW(#2lK7nosf^Myvz~8p(&>n9YE1_nKPB&nK!x{yZ05ZbnoF?H-V)nlW`Ht z5viGMa(ZWe4{v{1%A|W(Q~A!Pqlb^~diUfz-w(FdM;sTovpcDP4BXvR#6XZS{KdH2 zhOU-kvb#gYKIPk;#6ru4Le^Vnn>dVVmb*PzVIcxKo|KersP!G3hq52FB8*feYMmvO zc+p|+AjcpZMU}jdfyM7*naT1UV2Vnp&Z0^%=Yq;1;x<&WjvBeEwitkzH zu+m})LQDa9I_uKexo*_|t{e4#rW1{Dp$Oj&cD^mVf$H9GqRRK1*Z>UJX_WvLgMk5y zNnx9ITd)99z0?uod-6h`%qIoa`}6zr$%9)tn91#2>I~TIVE5~I@0BOI zU$1%7aST`kKo)d8+w$#7$!GkYOO-ox3EQ!7AC)_!y&CVx+J+Fenwc296KzAV(2nGFXYKiaX^c_@s zS@-;oy56%w@))LE1JP;>Zfom+h@@W~Mws`8N@e{fG{X6iAx8pi)+57iNZIespRjK3 ztg59WsJoczc{WIH<#KFYDonMG%H6$MR0(v@<9k#KD)|tbfjr5i&8IWyj0rvr>4u9f zs2No&V?izG^2%VKB(j4h**<1WW*_(>^Nd$yVrC&nemGl^OHFCFdb{t-m9iVNFOyJ} zJSIFNrb8b}CPbNwFKJwPh=@;&C?;S?Rlz{IPl2#K@)DD^?g{>Ropaz6w}z{W(8*?G z>Q{&zY*w8rAGPq-q@sbRM-VwfeZ?c8Yq$a{*~<`XLLKhKU)8Df0K~BtO{ILR#B?^j z_FBOW$I?ym1PV)qunyo`h894+b(l9=o?#9Sd(!sSIyj7f%WDQp*$1^1y1rrqXNK_n z)|UUO;A+@13{FWK2uk|m#1Ax;Jk<5$$cW&v__g)Ym zcX~y#tmAK#5W@tm{a2gQTCZ2R)~jMQFv3`ScCSzIfM5AfF82D5$?Dm?z7?|Qt^UrA z^>rNU8=ZmXU}p#i;z7KDdWD_piF#hQj^n6`UbiD}`X&W;Z3?{UhbZu-AECf&w?)C` za+rdIOZD!(0(-N2FE*+CUXI499DemTk@?Ru(P~<>sx9%_|D6>zGdHf z<>;USRy#ke_N{Npx1JVxLFNSvTmrq;FGf5}Umcm?r+Vvzwe$qQW6Qc%M;Z0(TaO_L zrtz8Nz4o%dE9?gGrq6heH$7R!x+AQGMn3+;2zf&D(MVGIyy<1w>y+N~`hYx+bVifo zRtvo8$J7ko^pIIu&&HW~r1eq8MLY7GCrJ?y;$B1(_I+K5yeaQc*=QH%BL_3`6WD5` z(%cJaPz;+C-_QcUY9(`n!~jeaB--HxfQGoSsk=qWh#~mUIw%ZDv8>XvX$5>QcPRl0(DRepBv(6c{l4dY&?NIQY%#@M( zW~DF-np;aNLEwc!A&7+FB`AJh@DfjuQC0s@d#Oig3D*o)9$;k2czaI7x{s%4vm4i170n$-lrpSmVb*1?r8V z#dkR1P|=+3_!V=EE1aby`*%%~C>o(V+*};ro{3~mOZJk36477ipAj<}vH0#- zK0aAAcS`papM0%RY-3VBofZkPmGtTLnigK8c=hM%=EO^hf-LOW49{eN6th3is5+mb z))1^a4J%2DGw4y{uP{-KQYzQ}UZ}5RPP5cFUtc_{!W4w8x3;ys|%Df&hYU!9*jOr}9N_MPU^ZRmk zmr7A`ISI7!BzsNOeO$D0tM`V;c;qJ$pBS`jg_^t!&79zubq^(M3iJCPN_K`~H>*vW zuVfGR?T3=R+;7KYl*tyD=-4|M`MZ<*oQpFNf$2yapl9eJ$}6~XrA2p$T z%RKw?dn@8!>KIB6CiGch5vs%3ygo*<-kqNwg?H2DA~zj> zBwa&@5nADg)@cJfoFs&ylr!2)3>?ALDzf*Ny40&DAL(r{?^b@1FJJT)=8*&kJ$hCD z=*llLXI}lIU;J1G!Wl!@8w!?aNNz`1V)Shgwl3}$e;zEpP`)lf~9 zrd>Vug$$pA;-CJXbeP#0z;s|byH|QaYzvv9)2W@0=l0i*`G}IKUfw z#Mp6Eh_$is%G!Kd#;j_~V{JS8YU9&fa?paRq{P_4PZM3)3L#_PTknmCw*_U1DzVW3 zqc<#@Wy@P)+fpu6e4B&w(xisWwgd9iEN*;~gNvHQ@gLN|Ma^R7gm2Hj%B}7%>s+H| zNHIcr;f#J~Bg^G!`BF*vd*H8FQK*Fa5Uhracl`BhN%D6v)folq@o=?ELLmT>y<$a3 zUW+c`Y9K_j^Dao&3YQbP#2yx*I^QaGuK9xqEI4p{5G9~dsZbh~f}Bc$Ql%iPQjk_D zz;Es1Nt6{|hV#QNf*A0p+^}c%jqnh=n8`5KFf$g+Zx)r1H%oa+zaR=?vda{;aYauU z_GL<;{#D<4l~vB2z!%JA(>xFsOPx6|R4xD+J+N0KjAazGy`>5T{A zk{@O)-<(ej35E1c zL}$vt$&WH{>QDg+u>Q7X2fQXF9Ry1#(n4KAgmTAOmLR>JBn#euC*zj5P?s2?#8HB* z>$z#M03Ic=fa0M9tq%Z9_J`+Rw2dKWJfd8?LHB%(UPrT@5^Pv!n^OGQN z0!;SCWT+cQUqq3!p+;MEpbK1gCGY9ptKv~2pC~4}J-vcZt)dCtr5J-6QEXE(5$CE= zu?OuAg;Hx!>_bIBv7e0-#Ua)v#bE^NtoQ>E^q~@4f18_!OKinoR5@3LgXBC78%C8# zOqlbHwfF!SSC6V>Pcp3%q2snd1mC=+5<+)VCD?z1QaF1JG*n4^mvj@7fQXRdv=d)0 z>GED*{+=##UtX6JiF@wb`8zwqk_K?*@zWabYSdF<~lOU16$@ z-vCqba}aJSK0nbG4`hZE2sf9Fn~E6+HNW$*m9fSANBqIgo$j!-*o`_dcB1 z`8#I=2>y5R%k|EB5f3yY=OxVq%=My5>`CP0HuCn{ECN~|m0-#n(<;|kEjqn?yJ*1n zgJFZK%5^jyJui(^`s9@EY3!s*PQRKR$lnf%ZY`|bV0tze34il^^Zznc?CSgzD3U(A zp+2d_k#wJ42_oreKGD4|AG59#EIENTJf~bh?6_AyBZx{E_iGu9FyE|{Kx42US+07+ zS~@#*n(})vi%~pE^d4tf>}CZ~>?E3zA1At`Xw_Qlsu=IyucFi4uAT8Fl}yA< zmDGDfCG}ocNxjP|srQ;n>RnPvy;oH#zF8&p&T2a@pRvt=SG?f8kT$MS3$rH}vXNsz z6ELhb7$yM90)ZFcAlL%j4i($F52%>zzC*>H?k*L3F-ubH!|+A1zxyr~hq_;<;&Aut z=>r!wS6@vv^u1*(GLGVhuf|l36{e5{oULoX}+##8SybA5(chh^3MVKdKU)(zMDR z2n2sLVyT2E+*Ao7AWm5vw_Yo6J_QMyIQW7*P(hBNB7Hx2VKfJ}Gi~Af&T#)SZTeoD zpqiJS{&|TT7O{4fC`r7t>`;#Lmr3Y$`Kv{~k-uz2ZFOK@+T~0+XIzoOcsqaJ#^1N| zcO8GBHjbvj0a2Wn=nJ+VG<84=Sk!=JDQe&~zB?@0om#-6241UqSn=b5C@4c1SW160sLV;KzM|ZtRC0b9V?@WH24>-2;-cg%jC4 zs}hNi1KvC-XH>#H=TtIjr&Y3wXH~*wIoHbEmlLf_^iQY+nU8~;5wCHD@S}zJ>IId2 zx~P(>E~=zz&SY~_msNrfS5(rKt19W*l1jRIt?g*Pkb3^!6?7Jj5Q@+`;iYc!v`Vm$ zfLzlgLUi5Rd6l5zS(S8!pn9X&d6jgD0DP8(v35b1Ao!w65dNY{^;RW-xvUb#1cG1D zr6`w59k1|6@>{xO3`;5*!?H^BT0FX@ONMhDHqWG4ov)ldQSVu9BxXjB1W9-Rif~G29H9zAOnIju!-|PCoU(q(bx8GIgov(;n!Ub*|Z>Z8_l%@qN9QZGYwCV!E*o=l@$ZVOgxm;{sJ)}r+qQSB@0?Jsm<1RM^c~kaV370f ze0|gnapIV3JQjbw#c(+Z&2Q+aLC#C_a}S*!7!=wEwxNWG4)>UF11R_y9#{rARvmf- zW$(;UkJ`O%ZwOA__1&`F3r_2-Gis7_#*hxl9!7dTr8lzSroiEbiIS%nsL2_=M$u`V z61wt)?>UCousJ#!r!^;!9QH6xE&eYZ@R7ntFb3g+JLOHK7z++G+vq-blRCpwJansy zyWa(U1NeI;?l@qKsl?VZgDsk55 zFj6nz1(mF;^D5a(b0m^^!&#L;W`;9dF)VLn;4GltupG(!;x%4~xgikKbQr3^yOb*R z>2h^u-9|4Q$8s?h*HS31H@qhRrL1DdD8-X#hYZ8$de-ImEL1CwCuj!L!RzdDFqr5d zI~|6~$`|np>QZ%u6vxbEe^PkqvRd(g7Jzli;Uey(7A6*G*r>5kesw+HE zS0Hk?R$zldf>s3;=}Uvh5vVlPlVLS@e11dt4rEypj6f$sZcHbxWE|0|WC=z^9lOUv zZ3OO<0yT8Aw#_X6Sxw2JD%{8yA;Uvl=ep9%{yoC^vf6 zMW!;E?NnPz;AF$C03QDEGhkdVFe-nZ@($Dm&br~q!UT#q6scb6$4T=DPmum4)!YCj z3Pk{^?7@uQ&r1~SFqk$Q2V*E6xc!L|G$MrdP^}ar_!rBCBgmBGR3T%>)M&G| zapT5xV^$|@5&OW4#ZN6HI9LoQn#MgDbx#U%5hn`K@^2&IH?(DmdeqnBqNU&Xwhs#s zNy&F86o4v$2OR0kPdNIJmWC;Xx(^l8H(q~z@Oh;^6kLYFnLC)%o*Eev!hi(4b1n;S zKrTkbotQhgmMbJ#;!8X{m*GZOxDm zA~A&9N7nS6kPLYshweKcXI56hqu_DunQ~41(5x!s;BTF03vkLWl!}i@^{e&rJ)w3v zCt&1I@dak3!6_>3EYV&`UL!0E!+0=M;JHAM_itowqSAtMxDp|-e?y?rZ=Byn6&3oV zM~1s{hSQ1=jx>UTjOWITC&?30aeTEU0f@Sp zCykp$|C$zUQG{)y;rz9iiqbWQ3*$Vy#G>OCbj3x+Eltf5+^H%)gJxm0#V9t;&*|@Hk0-QD4A^##Dy0Q zlU#T3fRimcl54LLtL5MeVGP^4l1iPhQsFAV-~3v^BCe-DuB2QVG*(3)Got=i@>EjM zvlPf@A1d+Bj`Dz*T&02{iAI09&=1|_?M zAWc+^x?qi`%!qodvj!nEr}S=^6vR+XifNCx3$s$4GX~iTRZa(~IJ?y(Ose>qpZ(YX zb>Ll7dv}cuT|UO%LD1P2t`mva(m*1TVn@s*Z*RY}+v0b%+=f|i!ISgRCx$iBeBg!0M{u<$xMJI^ zPp0^ieRaAoV+W@!C@`2Q##MZi)-#AKYFk;v@!7{aV1x`<-wi5B`VL3hEC~GE5jqHt zo|igIDlnQExvS_DpHG=z90eurv;P+}8Z1zk$Zg>hUox%p4#9>+B)G+vl61%+gSEEq zX}ZxwfK|kUoP0R<0oMqKy!|ZjvoHH{!tO@0LaHyg`_Pw*{e9WQ5Sy6ppO6=^&}fEt zacz*}2HNLhrX}Az8BL~Z&>AY4!4ne5)QjJPn!)*$PV|Mxx%&3!3;DfndHQ)=Nl^=6 z>sVdKWcm{0r>c)wSSBzJK^kBxv$=%ub<~(I_3+4y3=%!73jE*a=)9g0 zCa*cy{;UlP)SP29JAe|ALflO=){(6~MXMQJAl{pDLm&@lMo^sHz` zM`ZvXK(G>lQc8t80AZ`x-4eri#~Y$w8xZHC@USwPJMzbF`fKL=|nk`Bh2_ z^g5EQDX$R)_V~ysSm_utmcxMOUC*vK?WvU^++7awVycC^i*5nM$eT=M*=tEIE7QhD zmk^PdKCTusrZDtp5$8~*ctEpDzAS;a-uWXd!qCgWzM0o|b5!;|Br8)c0ux_giD;LL zcPCIF3z~2m2NO6@+W8m*QyUBJKB^Dj5&Q-YF2_4Ex`Lrn!{|+PmPoNnUv)5R@Q^9c z5xV-Cl!*o<8c_C)oZ*#8aV5E!1k{4~I0bD(ag4jy;qf;{+ERcjh3eYwe^2Z_+aMBpE$`k}i4w^Qc6Z2M==nhlB5bAsi4~kmHWkv7TB<#0ko)i{h%R z+3)it-YzFG3zIipFDLJ)JGpxDP6_>)JZqAH*R1ZD)DtSXKZ*RHmHD`sl76rnm={j- z!X4&pvnHk_fw06_)iEm|50WIY;@Fn!28&OBHG-%VAN48G(L1#_4nIH$5<@^`*y*+< zz^v0r*w6+hswK640o|Y`;fgV(4`OG?LaaHOs|Se9R}eeh`?x*>Kg z-Y>UHh{>0Z7iUVx- zu{?pVJnz@^_J~z@l8m3kS2rVPA36#>Bb1N1m#aU*ug;|5F}(8oza(DyS=?h;m4+J^ z)`H6VI>g@rET#|xTr;th^oE}r$&2e>A{3K#2jd+*QgqOwM<@Dgqk_g|o=m1oqi|Dd zEEj;7fMfuefP_@+Q<4EL^$DpL1s4$I(r^$4Xk49<5H7W>J0#<+Rn}nh#{8~)696&N zE}OhuAMKDB(~Jy#HGRQX0VA#^9xkMbm!wDUE~QKs<;65;b{rSV`&ZQm#F8bIAgg^K z=+iQq%@O2!zOFl`eK89NbwCiun5Z8Wt3BuF+FSab`p>er0OjKy5wz58e+!-whf9ms zRkPonPw6JVlg!e6Bk!fgt`-?$p`g9~2217`;#{Y-?D%-bmENX7HVv`D84_$X?v&{qPQ40ghzFz`!f>!r3!X8eeY zL2aRAyV~lQs;_Ep*_#TRscHP0o3pW+yQ^;Qc-7nz{v_%mkwSn&`4GvGeQ@NS73^A1 z%;H-im`&qM=4@NS>;{>OL`QIv5NToCq>YfQew#ag0z}jxRz9{1XMh6UdjcON8LaUd ztFx|I*8*^ENsPAQE4_A zl~IL~QFdgZXp~S9E|U^*u$0f|`@Q#d_b_a<(k7);g(>>`?tS;2d(QWKf1mI99{LLV z`m=F=<`-a_jXpShet{?>_H1~T_eJ2Xe#feTO?dRdsjJ~KxBaat2_i4Oj>ObE2w>u{ zxMS&ySHsyhjYw!`vfTM<;4FkyJtG;$HqD5Gr|VpJ=mp!t<)%|A9Y4G#{QzIDZ;*RH z6fiN)eesWANPFMl+}G^`^260kY#+_sqK|tr7{Vss7o_OpqcMicm8{&u5J=}lC~EgjAqYPs zz*kRPK)-<%~rYDdIoJ=`-GkN`H6|zCmbu;?4nQFty+F%!tgNdb^nMNe`A~v z|FJp9`I0J1bsCnJRNmxkBBrtlfq51j9-QKgCclCBZQ}xMobh44Y%5{OYwSuM##w1r z2CXNi1a~T)H&gM@FBEqQ4nEB|H1~0U$w-m}Mrj0YzcudM1pP>Y@2FDPrp?h(?G4vI z?F;wcwIh)9`Re=FCI76L+-s%X?Nt;6 zW(zt+n8yimp<71EeXN5uM@L87Nb?bGI0T?xFU;TyB|_-=zwAz2zSB4qF%ka4$Y7xo z_m86@W(^c&QtCYRq!qX zG+&EDhN$%LL5;FR5_cdO19R0ale-603{@IK1X1LG6M%e>MaY2@)KA9zFKfoE+#TLG z_`Te-Esk`FKm2aoqYr*c8OcxIj*SIi zu;{uJB>q6iJD2<=h}MLnz(MX_i*=If7m?xz#v{d#7EUXLn2AXB<9=iZa(xEPA5P4q zA*JCikq6vF0KCpd8${Y>D>6RVZ#VR8F2G>@MVcUxG{NDp<$oe1b@y+yP0K#dMcFR@ zSuDXI-<5>Z>%{+NzKh7pq!~6jgN@noI&(@E1 zaHV%P{DN=HR@rcA@*;ajm8r!rR{VsKCUTSXUfaAS@j^$*Ms^_>Z5cK#c9yI2iW6QP z6iME)T{V)F8QCDTm!1MYv=<4_@lz&&YLOgrUvK2rV`cO+=(UM&??O zk$Q(!6BGRT0=}t9crR7(L=3bGD(LbgxJ(>ilvWtnUH;1N{OhF$;{|h1mVa}u+XWAx zK#F8+axzD3%ESS%L|r8k*?`#o1>E#?!1sLt@ZAcYtKiuRo~huQ6+B(RNKof@uX-Jr zh9^($n54qPMyF!Q2bX6WOB>L2W3^Mq8SKs(S#r)GbvL}8G;SX`??BSwnJp-#xH7Gg zTnddix8spwQp6zR!jLl1V0I8r9`=krh?@|=zKRYDKq{M)%C^nLZb*^|%nh}2|hx8Z?OcJ&T&?o$no+W zQP+a>V!WD&w!-+Dk=eY&wzI`!&QZ2_lo805h%%h*9qn<7fQ*6-_fGTx=>_6!_VVnt z&0fB(qwj5X^a4-XEJehP5$13xb7+kjm>X9!jS^TEG79HNtNyKUe4p&I(gEHe8rsX5LjIib*zQU`>S)u%pLVJX;6;@^?ehKE}&l%v0 z!6Wf2b{6dcpXKk7^`We-o|fHxh}8NJ8^;M9DA`hQ;zWYS5Ek9P9cnW~5WK~2>L%#k ztJ|A6bx{*k#|srlCh7JjUbl&A1z+OzvZ~t)XPn;NB1PzSbm|P(j0LylH-6?fekQ4| zoP08BX2aTiD|H7zKyG7ZP94f5Py~09Jg<@g=l~{}41ng6G#X6j&0cXk(FuqmdB7-| z7Zk(A+g0aGT8c!0_ySIUXZsM&S5F~;q4@4A>WUiY?^fT{IKRNP!(*X~5CsoTMdAn3 z`re4KQts3*r?eiJ331NuQP_(0`nqMtL*tu~o=o6emfXax^E1lA3=Qyd2$Q zE~u}U=-4qAd_e)e_#*XP9|of|ANZOjs08RfjM#+x^;8)WgTVp9ku&5X#`fBx>_y3RR{48pqNYQaaT*Yo^%f06fwY46+Atfo(z(ec>cz&v4;N*HJirV^tZs^+N9KS8R&qjk7YOgPR_otT=&$~bdA#J%Va3QLct_QbE4=XnssUc~ z@C12sSW;*w*F9sQ8@;E>qDI)@7gi5JM7*JH*;->EP9rUsDMG$$M2XYk zW~1F|>I}y0;Q1k&ou7g2h$x|qV*Mg5Ri*dVi^%>XGr_a9)5Rv((fzOdJt3+)8|%2w z>~6gufFD;Rm<2>QmMEb@EKb?wR2{8b>-I#h6dANm2(m3ty8)Xk(e+M7G{(bP>arHe z1C(Tp5mA@lW6Fmfv{Gac7P^t|U=a7>aZ^vplq(v4SKRXB3!_AlcK%%Vf{6&*pdwH@ z_1;!XaM=Ea{&|QuzI#8v(_JUWu92CzPD@ZX4^YU=ZukJ5FwM>9y00nQIHS3HaEKCT z7*;;ju7-7?>ft6b+zG3OM>)49HYEv$uHBhusD&|d57gVZ?`i*fiW7~Y8z=-ujG!{u z7&P^_pdYg5D#{_J@gDN4U3qd&NfR`gDtrMx*XBN5O_HDmDp+m(*d+A)rN$sCD}Rqd zZ^Hgz?+qx4-%{JE{;ia>^S5*a)mJreFOrBE=w6RN;)v#)SEO?cD@-mbXwkm&ipB_& z()dL+zvTbM@J~wzy!Z{w8atG&Z;?seoYlqOb@*j$-9jyZnGdx*RB9y_mQ9P)-ZKpJQKt)Vegt5M1mudg#E*wgx<2 zL2B6zYh zGoh8AuzEmH9!4cMt>#87fb4#p$~01*|F>)b35f$+AR5*r>#(*A%#0N|&o7pmtIjMz-7Hr3$WR0{yBDX}r+(%YFrXrKu9w{x8YARgT5dnyG}T{o9@rQ+*UXL8F`T z-}u4S;|PPc`Qc1eo>)gc#jlmKPaolZ#pu_R?8%5&aDyX2+ZqXv#!rd#_!n!0_u%2-@~?k$6z$72E_ba&h!w0fOU?(tXu$i89VpM# zo9t)c)<*X$beuvf99ex1!8MABR%~>Cw(g9JjeJIo3Zo&w{iH=gyn}|gHE3v(s`NGl zH}_*|8L9I(bdPws&x4EtQ|Dt9lB8D&rTYs|gEJPy{4TiWCp{ub@#uveL`^f>&Ze#C zlkxtPx^Vs8x2NoC1CW~(H8wga zGE|3|&i`$=A_Xo|QGwgh9UM|xl6EoIm^eY&Z6w4yA3OjO81nx6*gx1{kC?GRzG(VI z6UM~*V%ySCE!jYkoU`ae`D~94N%4W1@3Ih#HWJhi!g}Kpegku!l*yuM5 z3Pcx%Br-H6Q@aggUqqotOKpLlEl+6eHv(am$D0W0}-^4eDTEovbzs{D_&4CWY zRhwfPDelJpj-471aw}r#qK%2iyyH1E_eX9>DmQQ~0X9PqmM{KztR%apDj$%n?IBtr z2Uv|ZJsmL+d!Hzh$wc$c>X0F9ifRwo;~|I!N8SukX0Bbn^@nt1g%2nG4s^~BZ3uD1 zk)$=}RAtZ9htenCPeK6vkV>vmOEGl@QNM6gvk;K(Yz$yH6*+WzpoPHedO}SY8O?Bv ziuR2|Y#pmKI<-^o7;1pg;qvSsjzYwNAvqJaU?h_OG*Jf-?Ah=gbP1HpDF3h-hmtW2 z4xurDMOKOJfbp?e{_jB??21+H0p|Vy$!w>Px zp{Ttb3^Y{!Ql*+W#tpmIqT2}L_$_Z}KYOG{Ulmf=rRoL*q(KlWVIm?L6Td_Z!p%b* zFOy~ycEKD2Vgd%6m!qTv_j2=c#OtW)rBZ=9*bv9r$XnAEM1^*!a3}EviuO0A(VQ`P zj8f4A)o8FT@MEwzPcPk5r7hAN?5P6hqFx<)XXE2&_kfm(zt(ECpKtyZ2H{!5xi5}& zusM(rguioN9M*KweXF8-@SgwlKXJl1s=3u<>rR8%Om5@q{&hQruf*oU*i~$?vk@Ys z8iA;1w~C{e>?-Jp9eD!Ix#|85YCiq^XwTxzj;s4Ohcp2X<#Wup54`?IJ`j@@4$ObX z+sw`kFvC}f3%0bC=YMn9)9aFH6EC!-O&sQXi{VRz>y2tSNEW9)DpoL2UbU>a7(y{l zoSjxea<}{0-FZmfuO4rgmvtZFCBE?W7vpf*-)uHVs-5mZBF>#8!pjFFl6<&DBCsO+ z+f!fALvW64i>_`})~;xVFXxkfVnZS=%ixF~EW}oi$eA}lFvLq6BXCq<@-=>WNuVa& z2neg%$Z3`T{#cT^?=w=<)TXi7wHTgwTh#{ToQHCTa2s6sWPB*Up}~38 zx>rNkJ|&zVb;_jfIvFjgJG?SXYPR#XO(9lg=}d5)`W*&8}hdDaG|-y78ay)i(eO|A!1R40@9xXL+YhVzrK1=v>i*o z@p5_k(r;zGRl1G$lB9%CXQYS%6;?L~+a&29{S>3WC7)~?om$DyjXtxnj7*BMo{g%k zCujdz){{+&S=N)&hb-&asLFbxwxX=3kupA8*Aqqo$KAirejVpC{DmPMpt%MoH4P~E zEoCt?OMEjY7Kt|PFGPAuG^1CEbH)beo8nUS-`Vq>;r8wr(xgK&7_AfRkY>J%Lqe0s zphA`mA)xeRw~y-eX0!Q;qpC@%9u>3Xs`_9~t4aATjUea45~(0+3-8tB#4zZ9jN~vT z&J8t(?fHuX;{;EB1u+8QW1TGSaL>`W%h>{4NF&Tkiy2`;tX|@wgO!ONEdEtmiQ=-4 z^I`FbpCOPpEBoYtl=~#KiWpfmCWQNpi%Sru?ZK?Unl)Xdz7K!fuE*y0P1=!TzfKc~ zyyv(gCT4)X(@oywF3;NjoYMW-{9O3nr{oadM=jlowEh`f89H<|8(gD7tSX-y>Hd?d z)6-JcBiT@dcnKt=!sSi-8#7(X%7vhm8XwEgL5+_}!hcp4qle94v6zD}f7)s1tND|62F&?YRT{fg`<#B(x*FI}3EQ z<*E9dDf1;p$zej)WZdZ8;sYB+^Wol?Tgxgn#l*o-J7x20uEGaSMv8+pINbg3nN`0W zDW4C|9Bo@1v~(&<@iyo46m-Cpa@`Bz>DT!Jq~umhkyUi$la#g|`r&72ZhzSjaw!w}b~-yAiVJ62Xvh11?-MqcA2> z4I;vU`iB^{OL@J%e&=NGF|THN*9eN6An~rf7K$WQiK#n!GDjgRGbk3?%3jmgE7XcvX004Z^0qdyq z@F6~t3D2j)d;+D*05H4)V5>0qSNR0$*8t4KItXOl^d;&>SbOnBA?r^s2$zUg3fXjj zR7enYQ^>OEM-8s z7@6bi{r&JG`T0)g86lJQrjS`XEo8pl5Hdfn3z?bMgv`k)Aw>A95Hda~g!WIcT2YKY z#Q2dE?cPnrh)snK%frczxNm;m-vT$8ln5iQp#X^!19hRtWl#e+$Q9h=yZ_?d-QXylM zCa+HlO~RIB!9mcld>jPKXhe`?4!$J%YX)4G*8sOy zZy&S$6>iY{GT=bf+p*%-_;iSSym1M@3l9K(NIo9(wU8%g`=oFivra7pZa1vXakCht zV2Ah|llLiRXO}vFo1B0#JJx^)trbVXH+gZq_$)yZ!gpksY#78M;O?_BCtngB@xh@d z{p48<&1d~I&iA)O`~z`;^4ACsAq=44MT7xhp?94(=X%$BRUixiGYA7f7hwRHL>K_tz5Rj) z><=KZO)w4n17=}=z&z{^H~{+tmSBIta`M(n^41!>Rq1vn=(H+=*?U9CyuB`D##q!3 zS#e4TCBG_!uulr1{S!i1;kXb!c|`~xz1#xfYi6M$e%eTZvDEEc%^(Z_MelPd18?;^ zb$f_ONKTn>yI_@y@;upq{Q;a1D42%*0kg0_U>^1dSUwW41p5P)dp&`*s{w1heS-C# zcxtc>25$rhZ2V zFTX8>ncot^x#xti?pYyBdqxP8zRALm?XCl8RsnQJ_4X0lS47dg0xM<3VLqjFP`C3& z#T+l(rrUX~axo=`g7R}IIq8OS6bYejr!z?LTDQ}s4p+#FHh_*X9U&8}=aou*LfKGn z=U)v0(JDT3q_}#chZ`|*4|{~m2Ac5B-uTcmJ!XO3SnD{92CHGp?}Hb|D_(^E#*2Lt zA`zRW>o?HBNcj`_5q8wC@h&V`9&Ng4Dq9-R^&_n5;;Rq9o)oc)yRc~aUVa1ttS!e~ zSk*9uKZ9M3yZ8~7b$oqDP%X~Exp^Pv^`v_5!oUW%{Rk76ALU0gO7Ty<3mRR<_9F~k zzLXzfYOC;g7o}OU!^e-8Gv6cSiMUYPzs$}9>Fp&U@gwKd{hXvZwldo zk0cxzzXHc|a}AEKWEy_{n~nt1 zJ}rc{-w;B`uM45%*M!jUDIqlbst{^DDTGc>2%*s9LKyTFV!ZdT18AaHz~#NMxPe^S z`Qpmr`rQ_HUF`h6gY?APivyILzqR-r ziS2uf#p32-w&)c%6*z7D8{RVsX}jh;h8BUY<%IG3G;K3W@m_V`YLt|465x``?wkm6 zPrEY=PLJ9Mfr_w79RpZ^h`Fhb;Yu9?P{#n&F#vT8Kpg{6#{kqZ0CfyN9RpCu0Ms!6 zbqqiq15n2RQpfONy^mz0a!KHknyf*Q7lcscyFz59-tNuXXhq@Wrrfx`r4t4Xg5T1ES z2+zDIglAq5!ZQ?337$DBgl9H|@C;Q9f@j#896a*@YtE@|#!}sk6?YAkU8tL}R5xRl z8d5o?;?V>RbrZI#`ZQe0Fj-Z(sg%^gx294Kb%SY|3Y*TTzQdIav$ew&s;CW6-Jmcq z%r?r_YQd_&ngu6rE*?w+vlVfj&llriw~}BX-}Rd>a)I*bQ+lJ(!wRU?$31*Ree|#L{=;0LK>C+^ zaW5CD5O=s~3#mf-pYj4zNF~z$v=>-Hs*(O)FECnEB>kQj*g>k2{ys0TV^k*nz844y z)k%NO3!G9FO8+`95D}`B{=64AFsoxKmHv%f_V0uFoOo;`wz7@tF`X7-2E8G~tEa+X z*fFmOnebCWru9`JLiePQxjG?K$hM2mBU{7j!yu9=?-v~Ett&|ud*35i=zXs@=X#HL zRrJ13Fw^^fLAUo81e3i-1?}Ds3e>-VPKvW>oKvo5wMS)UY&Mx0LsVwQ5S5vsIGGs> zRA#<|?(t#0{})k#_Vo?~necXOG~oekG$F+Jt`IUjFNEaY5n}1EUvE@idrOEcI4493 zoFxowCgWsrFRJ0;;vSU33JT$i#oZ``vRFomTvL1j6>=>~<}MV@eW;!vM6Enp`~{T8 z_d~hgS3H6m`QGAtP${<->&5*jnA?k0l+9m+<5Qu0X$pm+e1mdDEHo=(p;sm0V~J4+ zR*XWbViY1xC!VXeR4OVVJy99=S&h z2*$a!2$nfe1hd>;1e@GZ$R0?G=@2zo04o}}pR%V7Yyt#X1NBe;so_(6QLtC0Xka(o zEto0Fkdh6I0!Ga~JOx>!*rzOQU|GOf4NQ*Z>Zx7D7phNlVy}TE0xvc&PYzf2=f!dZ zYXzheJumKp?8F^p%=Wk-<2Qwn@o6Ds%-*#i)|P7Js}E6Q_fP>Kb*3jjx~^3x)j#V*H|KRMsI?iU|OjG^cvFH7-G{S zt^#MeJcJYqS0N=o2Evx)$4uCg{1^+h+tdJo(eS_uv;(7^K|5@Paod

IV*&G*hm=U!v@13 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�n7~O1MphCc>AU~hN;141EA4&Fm~Xe_w8yLy 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%0DhTQ8dpGbz9d7cx7& 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 z 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Ξ;`GUgGp8WVo+@!XdKzNubi}bU5Xa9%oHz?{@@&MZa}cM`MVvVgarS(P z6VVG0TNfgZU4%G(G2+A}h?AEhPF;pLeL3RH6^OG}N}P;dh1j|paqJqz@oNz$u0x!> z9&zdh#OWImXKq5Ay;9mpBuB0RpGq8y{tU5o5aQU+5yyXlIB_uIL|qNqY-D0L7Y8S;$-wV#MbeMV<#YvpNKed65`~^h*PH^PM?Z6a~k68=@O@+XCSuD zL>xN{ar|t=iE|Jq&qbU%4{`c@#F+~aXD^gE9lZ##bur@DC5YpfB2HX}IC(kZ)D?)+ zS0c__g*bb)#F^+dh^=c8$F4&hzaDYo2E@r55vOiKoW2=x<`%@+TP4m$Z$oU|jyQG) z;`p726L%p_-iygwzR8oz(M?aCVc;Nfz2Vs1P^Vw8yeG+O#K| z-DperIS=|kdwBlP;xes^;98f9~HL04EL`X>AT0dY!s)&Kwi literal 0 HcmV?d00001 diff --git a/libs/providers/go-feature-flag/src/lib/wasm/wasm_exec.d.ts b/libs/providers/go-feature-flag/src/lib/wasm/wasm_exec.d.ts new file mode 100644 index 000000000..482a16647 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/wasm/wasm_exec.d.ts @@ -0,0 +1,9 @@ +declare class Go { + argv: string[]; + env: { [envKey: string]: string }; + exit: (code: number) => void; + importObject: WebAssembly.Imports; + exited: boolean; + mem: DataView; + run(instance: WebAssembly.Instance): Promise; +} diff --git a/libs/providers/go-feature-flag/src/lib/wasm/wasm_exec.js b/libs/providers/go-feature-flag/src/lib/wasm/wasm_exec.js new file mode 100644 index 000000000..5f02cc2e3 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/wasm/wasm_exec.js @@ -0,0 +1,619 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// +// This file has been modified for use by the TinyGo compiler. + +(() => { + // Map multiple JavaScript environments to a single common API, + // preferring web standards over Node.js API. + // + // Environments considered: + // - Browsers + // - Node.js + // - Electron + // - Parcel + + if (typeof global !== 'undefined') { + // global already exists + } else if (typeof window !== 'undefined') { + window.global = window; + } else if (typeof self !== 'undefined') { + self.global = self; + } else { + throw new Error('cannot export Go (neither global, window nor self is defined)'); + } + + if (!global.require && typeof require !== 'undefined') { + global.require = require; + } + + if (!global.fs && global.require) { + global.fs = require('node:fs'); + } + + const enosys = () => { + const err = new Error('not implemented'); + err.code = 'ENOSYS'; + return err; + }; + + if (!global.fs) { + let outputBuf = ''; + global.fs = { + constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unused + writeSync(fd, buf) { + outputBuf += decoder.decode(buf); + const nl = outputBuf.lastIndexOf('\n'); + if (nl != -1) { + console.log(outputBuf.substr(0, nl)); + outputBuf = outputBuf.substr(nl + 1); + } + return buf.length; + }, + write(fd, buf, offset, length, position, callback) { + if (offset !== 0 || length !== buf.length || position !== null) { + callback(enosys()); + return; + } + const n = this.writeSync(fd, buf); + callback(null, n); + }, + chmod(path, mode, callback) { + callback(enosys()); + }, + chown(path, uid, gid, callback) { + callback(enosys()); + }, + close(fd, callback) { + callback(enosys()); + }, + fchmod(fd, mode, callback) { + callback(enosys()); + }, + fchown(fd, uid, gid, callback) { + callback(enosys()); + }, + fstat(fd, callback) { + callback(enosys()); + }, + fsync(fd, callback) { + callback(null); + }, + ftruncate(fd, length, callback) { + callback(enosys()); + }, + lchown(path, uid, gid, callback) { + callback(enosys()); + }, + link(path, link, callback) { + callback(enosys()); + }, + lstat(path, callback) { + callback(enosys()); + }, + mkdir(path, perm, callback) { + callback(enosys()); + }, + open(path, flags, mode, callback) { + callback(enosys()); + }, + read(fd, buffer, offset, length, position, callback) { + callback(enosys()); + }, + readdir(path, callback) { + callback(enosys()); + }, + readlink(path, callback) { + callback(enosys()); + }, + rename(from, to, callback) { + callback(enosys()); + }, + rmdir(path, callback) { + callback(enosys()); + }, + stat(path, callback) { + callback(enosys()); + }, + symlink(path, link, callback) { + callback(enosys()); + }, + truncate(path, length, callback) { + callback(enosys()); + }, + unlink(path, callback) { + callback(enosys()); + }, + utimes(path, atime, mtime, callback) { + callback(enosys()); + }, + }; + } + + if (!global.process) { + global.process = { + getuid() { + return -1; + }, + getgid() { + return -1; + }, + geteuid() { + return -1; + }, + getegid() { + return -1; + }, + getgroups() { + throw enosys(); + }, + pid: -1, + ppid: -1, + umask() { + throw enosys(); + }, + cwd() { + throw enosys(); + }, + chdir() { + throw enosys(); + }, + }; + } + + if (!global.crypto) { + const nodeCrypto = require('node:crypto'); + global.crypto = { + getRandomValues(b) { + nodeCrypto.randomFillSync(b); + }, + }; + } + + if (!global.performance) { + global.performance = { + now() { + const [sec, nsec] = process.hrtime(); + return sec * 1000 + nsec / 1000000; + }, + }; + } + + if (!global.TextEncoder) { + global.TextEncoder = require('node:util').TextEncoder; + } + + if (!global.TextDecoder) { + global.TextDecoder = require('node:util').TextDecoder; + } + + // End of polyfills for common API. + + const encoder = new TextEncoder('utf-8'); + const decoder = new TextDecoder('utf-8'); + let reinterpretBuf = new DataView(new ArrayBuffer(8)); + var logLine = []; + const wasmExit = {}; // thrown to exit via proc_exit (not an error) + + global.Go = class { + constructor() { + this._callbackTimeouts = new Map(); + this._nextCallbackTimeoutID = 1; + + const mem = () => { + // The buffer may change when requesting more memory. + return new DataView(this._inst.exports.memory.buffer); + }; + + const unboxValue = (v_ref) => { + reinterpretBuf.setBigInt64(0, v_ref, true); + const f = reinterpretBuf.getFloat64(0, true); + if (f === 0) { + return undefined; + } + if (!isNaN(f)) { + return f; + } + + const id = v_ref & 0xffffffffn; + return this._values[id]; + }; + + const loadValue = (addr) => { + let v_ref = mem().getBigUint64(addr, true); + return unboxValue(v_ref); + }; + + const boxValue = (v) => { + const nanHead = 0x7ff80000n; + + if (typeof v === 'number') { + if (isNaN(v)) { + return nanHead << 32n; + } + if (v === 0) { + return (nanHead << 32n) | 1n; + } + reinterpretBuf.setFloat64(0, v, true); + return reinterpretBuf.getBigInt64(0, true); + } + + switch (v) { + case undefined: + return 0n; + case null: + return (nanHead << 32n) | 2n; + case true: + return (nanHead << 32n) | 3n; + case false: + return (nanHead << 32n) | 4n; + } + + let id = this._ids.get(v); + if (id === undefined) { + id = this._idPool.pop(); + if (id === undefined) { + id = BigInt(this._values.length); + } + this._values[id] = v; + this._goRefCounts[id] = 0; + this._ids.set(v, id); + } + this._goRefCounts[id]++; + let typeFlag = 1n; + switch (typeof v) { + case 'string': + typeFlag = 2n; + break; + case 'symbol': + typeFlag = 3n; + break; + case 'function': + typeFlag = 4n; + break; + } + return id | ((nanHead | typeFlag) << 32n); + }; + + const storeValue = (addr, v) => { + let v_ref = boxValue(v); + mem().setBigUint64(addr, v_ref, true); + }; + + const loadSlice = (array, len, cap) => { + return new Uint8Array(this._inst.exports.memory.buffer, array, len); + }; + + const loadSliceOfValues = (array, len, cap) => { + const a = new Array(len); + for (let i = 0; i < len; i++) { + a[i] = loadValue(array + i * 8); + } + return a; + }; + + const loadString = (ptr, len) => { + return decoder.decode(new DataView(this._inst.exports.memory.buffer, ptr, len)); + }; + + const timeOrigin = Date.now() - performance.now(); + this.importObject = { + wasi_snapshot_preview1: { + // https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md#fd_write + fd_write: function (fd, iovs_ptr, iovs_len, nwritten_ptr) { + let nwritten = 0; + if (fd == 1) { + for (let iovs_i = 0; iovs_i < iovs_len; iovs_i++) { + let iov_ptr = iovs_ptr + iovs_i * 8; // assuming wasm32 + let ptr = mem().getUint32(iov_ptr + 0, true); + let len = mem().getUint32(iov_ptr + 4, true); + nwritten += len; + for (let i = 0; i < len; i++) { + let c = mem().getUint8(ptr + i); + if (c == 13) { + // CR + // ignore + } else if (c == 10) { + // LF + // write line + let line = decoder.decode(new Uint8Array(logLine)); + logLine = []; + console.log(line); + } else { + logLine.push(c); + } + } + } + } else { + console.error('invalid file descriptor:', fd); + } + mem().setUint32(nwritten_ptr, nwritten, true); + return 0; + }, + fd_close: () => 0, // dummy + fd_fdstat_get: () => 0, // dummy + fd_seek: () => 0, // dummy + proc_exit: (code) => { + this.exited = true; + this.exitCode = code; + this._resolveExitPromise(); + throw wasmExit; + }, + random_get: (bufPtr, bufLen) => { + crypto.getRandomValues(loadSlice(bufPtr, bufLen)); + return 0; + }, + }, + gojs: { + // func ticks() float64 + 'runtime.ticks': () => { + return timeOrigin + performance.now(); + }, + + // func sleepTicks(timeout float64) + 'runtime.sleepTicks': (timeout) => { + // Do not sleep, only reactivate scheduler after the given timeout. + setTimeout(() => { + if (this.exited) return; + try { + this._inst.exports.go_scheduler(); + } catch (e) { + if (e !== wasmExit) throw e; + } + }, timeout); + }, + + // func finalizeRef(v ref) + 'syscall/js.finalizeRef': (v_ref) => { + // Note: TinyGo does not support finalizers so this is only called + // for one specific case, by js.go:jsString. and can/might leak memory. + const id = v_ref & 0xffffffffn; + if (this._goRefCounts?.[id] !== undefined) { + this._goRefCounts[id]--; + if (this._goRefCounts[id] === 0) { + const v = this._values[id]; + this._values[id] = null; + this._ids.delete(v); + this._idPool.push(id); + } + } else { + console.error('syscall/js.finalizeRef: unknown id', id); + } + }, + + // func stringVal(value string) ref + 'syscall/js.stringVal': (value_ptr, value_len) => { + value_ptr >>>= 0; + const s = loadString(value_ptr, value_len); + return boxValue(s); + }, + + // func valueGet(v ref, p string) ref + 'syscall/js.valueGet': (v_ref, p_ptr, p_len) => { + let prop = loadString(p_ptr, p_len); + let v = unboxValue(v_ref); + let result = Reflect.get(v, prop); + return boxValue(result); + }, + + // func valueSet(v ref, p string, x ref) + 'syscall/js.valueSet': (v_ref, p_ptr, p_len, x_ref) => { + const v = unboxValue(v_ref); + const p = loadString(p_ptr, p_len); + const x = unboxValue(x_ref); + Reflect.set(v, p, x); + }, + + // func valueDelete(v ref, p string) + 'syscall/js.valueDelete': (v_ref, p_ptr, p_len) => { + const v = unboxValue(v_ref); + const p = loadString(p_ptr, p_len); + Reflect.deleteProperty(v, p); + }, + + // func valueIndex(v ref, i int) ref + 'syscall/js.valueIndex': (v_ref, i) => { + return boxValue(Reflect.get(unboxValue(v_ref), i)); + }, + + // valueSetIndex(v ref, i int, x ref) + 'syscall/js.valueSetIndex': (v_ref, i, x_ref) => { + Reflect.set(unboxValue(v_ref), i, unboxValue(x_ref)); + }, + + // func valueCall(v ref, m string, args []ref) (ref, bool) + 'syscall/js.valueCall': (ret_addr, v_ref, m_ptr, m_len, args_ptr, args_len, args_cap) => { + const v = unboxValue(v_ref); + const name = loadString(m_ptr, m_len); + const args = loadSliceOfValues(args_ptr, args_len, args_cap); + try { + const m = Reflect.get(v, name); + storeValue(ret_addr, Reflect.apply(m, v, args)); + mem().setUint8(ret_addr + 8, 1); + } catch (err) { + storeValue(ret_addr, err); + mem().setUint8(ret_addr + 8, 0); + } + }, + + // func valueInvoke(v ref, args []ref) (ref, bool) + 'syscall/js.valueInvoke': (ret_addr, v_ref, args_ptr, args_len, args_cap) => { + try { + const v = unboxValue(v_ref); + const args = loadSliceOfValues(args_ptr, args_len, args_cap); + storeValue(ret_addr, Reflect.apply(v, undefined, args)); + mem().setUint8(ret_addr + 8, 1); + } catch (err) { + storeValue(ret_addr, err); + mem().setUint8(ret_addr + 8, 0); + } + }, + + // func valueNew(v ref, args []ref) (ref, bool) + 'syscall/js.valueNew': (ret_addr, v_ref, args_ptr, args_len, args_cap) => { + const v = unboxValue(v_ref); + const args = loadSliceOfValues(args_ptr, args_len, args_cap); + try { + storeValue(ret_addr, Reflect.construct(v, args)); + mem().setUint8(ret_addr + 8, 1); + } catch (err) { + storeValue(ret_addr, err); + mem().setUint8(ret_addr + 8, 0); + } + }, + + // func valueLength(v ref) int + 'syscall/js.valueLength': (v_ref) => { + return unboxValue(v_ref).length; + }, + + // valuePrepareString(v ref) (ref, int) + 'syscall/js.valuePrepareString': (ret_addr, v_ref) => { + const s = String(unboxValue(v_ref)); + const str = encoder.encode(s); + storeValue(ret_addr, str); + mem().setInt32(ret_addr + 8, str.length, true); + }, + + // valueLoadString(v ref, b []byte) + 'syscall/js.valueLoadString': (v_ref, slice_ptr, slice_len, slice_cap) => { + const str = unboxValue(v_ref); + loadSlice(slice_ptr, slice_len, slice_cap).set(str); + }, + + // func valueInstanceOf(v ref, t ref) bool + 'syscall/js.valueInstanceOf': (v_ref, t_ref) => { + return unboxValue(v_ref) instanceof unboxValue(t_ref); + }, + + // func copyBytesToGo(dst []byte, src ref) (int, bool) + 'syscall/js.copyBytesToGo': (ret_addr, dest_addr, dest_len, dest_cap, src_ref) => { + let num_bytes_copied_addr = ret_addr; + let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable + + const dst = loadSlice(dest_addr, dest_len); + const src = unboxValue(src_ref); + if (!(src instanceof Uint8Array || src instanceof Uint8ClampedArray)) { + mem().setUint8(returned_status_addr, 0); // Return "not ok" status + return; + } + const toCopy = src.subarray(0, dst.length); + dst.set(toCopy); + mem().setUint32(num_bytes_copied_addr, toCopy.length, true); + mem().setUint8(returned_status_addr, 1); // Return "ok" status + }, + + // copyBytesToJS(dst ref, src []byte) (int, bool) + // Originally copied from upstream Go project, then modified: + // https://github.com/golang/go/blob/3f995c3f3b43033013013e6c7ccc93a9b1411ca9/misc/wasm/wasm_exec.js#L404-L416 + 'syscall/js.copyBytesToJS': (ret_addr, dst_ref, src_addr, src_len, src_cap) => { + let num_bytes_copied_addr = ret_addr; + let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable + + const dst = unboxValue(dst_ref); + const src = loadSlice(src_addr, src_len); + if (!(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray)) { + mem().setUint8(returned_status_addr, 0); // Return "not ok" status + return; + } + const toCopy = src.subarray(0, dst.length); + dst.set(toCopy); + mem().setUint32(num_bytes_copied_addr, toCopy.length, true); + mem().setUint8(returned_status_addr, 1); // Return "ok" status + }, + }, + }; + + // Go 1.20 uses 'env'. Go 1.21 uses 'gojs'. + // For compatibility, we use both as long as Go 1.20 is supported. + this.importObject.env = this.importObject.gojs; + } + + async run(instance) { + this._inst = instance; + this._values = [ + // JS values that Go currently has references to, indexed by reference id + NaN, + 0, + null, + true, + false, + global, + this, + ]; + this._goRefCounts = []; // number of references that Go has to a JS value, indexed by reference id + this._ids = new Map(); // mapping from JS values to reference ids + this._idPool = []; // unused ids that have been garbage collected + this.exited = false; // whether the Go program has exited + this.exitCode = 0; + + if (this._inst.exports._start) { + let exitPromise = new Promise((resolve, reject) => { + this._resolveExitPromise = resolve; + }); + + // Run program, but catch the wasmExit exception that's thrown + // to return back here. + try { + this._inst.exports._start(); + } catch (e) { + if (e !== wasmExit) throw e; + } + + await exitPromise; + return this.exitCode; + } else { + this._inst.exports._initialize(); + } + } + + _resume() { + if (this.exited) { + throw new Error('Go program has already exited'); + } + try { + this._inst.exports.resume(); + } catch (e) { + if (e !== wasmExit) throw e; + } + if (this.exited) { + this._resolveExitPromise(); + } + } + + _makeFuncWrapper(id) { + const go = this; + return function () { + const event = { id: id, this: this, args: arguments }; + go._pendingEvent = event; + go._resume(); + return event.result; + }; + } + }; + + if ( + global.require && + global.require.main === module && + global.process && + global.process.versions && + !global.process.versions.electron + ) { + if (process.argv.length != 3) { + console.error('usage: go_js_wasm_exec [wasm binary] [arguments]'); + process.exit(1); + } + + const go = new Go(); + WebAssembly.instantiate(fs.readFileSync(process.argv[2]), go.importObject) + .then(async (result) => { + let exitCode = await go.run(result.instance); + process.exit(exitCode); + }) + .catch((err) => { + console.error(err); + process.exit(1); + }); + } +})(); diff --git a/libs/providers/go-feature-flag/tsconfig.json b/libs/providers/go-feature-flag/tsconfig.json index 140e5a783..def479d79 100644 --- a/libs/providers/go-feature-flag/tsconfig.json +++ b/libs/providers/go-feature-flag/tsconfig.json @@ -7,7 +7,8 @@ "noImplicitOverride": true, "noPropertyAccessFromIndexSignature": true, "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + "allowJs": true }, "files": [], "include": [], diff --git a/package-lock.json b/package-lock.json index 870cb4cd2..3072c44c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "@protobuf-ts/grpc-transport": "^2.9.0", "@protobuf-ts/runtime-rpc": "^2.9.0", "@swc/helpers": "0.5.17", + "@wasmer/wasi": "^1.2.0", "ajv": "^8.12.0", "axios": "1.10.0", "configcat-common": "9.4.0", @@ -8488,6 +8489,12 @@ "node": ">=10" } }, + "node_modules/@wasmer/wasi": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@wasmer/wasi/-/wasi-1.2.0.tgz", + "integrity": "sha512-Hxg/By00+nTWbEgj7qIfodCjU/N1k6H1yTLuSyp0x1KV6OK1AVTMGZAMcW/qOajToCkEVxYjw0BCW4mf5iPoyA==", + "license": "MIT" + }, "node_modules/@xhmikosr/archive-type": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@xhmikosr/archive-type/-/archive-type-7.0.0.tgz", diff --git a/package.json b/package.json index da58463e6..8ca0455d0 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@protobuf-ts/grpc-transport": "^2.9.0", "@protobuf-ts/runtime-rpc": "^2.9.0", "@swc/helpers": "0.5.17", + "@wasmer/wasi": "^1.2.0", "ajv": "^8.12.0", "axios": "1.10.0", "configcat-common": "9.4.0", diff --git a/release-please-config.json b/release-please-config.json index b807055d1..7cf1435f3 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -14,7 +14,8 @@ "prerelease": false, "bump-minor-pre-major": true, "bump-patch-for-minor-pre-major": true, - "versioning": "default" + "versioning": "default", + "release-as": "1.0.0" }, "libs/providers/flagd": { "release-type": "node", From 5e76cfd7b2f48953822872b1115330d9a56da882 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 5 Aug 2025 19:31:09 +0200 Subject: [PATCH 02/29] copy wasm file during build Signed-off-by: Thomas Poignant --- .gitmodules | 4 +- libs/providers/go-feature-flag/project.json | 42 +++++++++++++++--- .../src/lib/model/exporter-metadata.test.ts | 4 +- .../src/lib/wasm/wasm-module/.gitignore | 1 + .../src/lib/wasm/wasm-module/.gitkeep | 0 .../wasm-module/gofeatureflag-evaluation.wasm | Bin 878235 -> 0 bytes libs/providers/go-feature-flag/wasm-releases | 1 + 7 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 libs/providers/go-feature-flag/src/lib/wasm/wasm-module/.gitignore create mode 100644 libs/providers/go-feature-flag/src/lib/wasm/wasm-module/.gitkeep delete mode 100644 libs/providers/go-feature-flag/src/lib/wasm/wasm-module/gofeatureflag-evaluation.wasm create mode 160000 libs/providers/go-feature-flag/wasm-releases diff --git a/.gitmodules b/.gitmodules index 7e171746a..120a15eb6 100644 --- a/.gitmodules +++ b/.gitmodules @@ -17,6 +17,6 @@ [submodule "libs/shared/flagd-core/spec"] path = libs/shared/flagd-core/spec url = https://github.com/open-feature/spec -[submodule "libs/providers/go-feature-flag-server/wasm-releases"] - path = libs/providers/go-feature-flag-server/wasm-releases +[submodule "libs/providers/go-feature-flag/wasm-releases"] + path = libs/providers/go-feature-flag/wasm-releases url = https://github.com/go-feature-flag/wasm-releases.git diff --git a/libs/providers/go-feature-flag/project.json b/libs/providers/go-feature-flag/project.json index 4d7597dc0..2cf08b011 100644 --- a/libs/providers/go-feature-flag/project.json +++ b/libs/providers/go-feature-flag/project.json @@ -16,20 +16,47 @@ } ] }, + "copy-wasm": { + "executor": "nx:run-commands", + "options": { + "commands": [ + "git submodule update --init wasm-releases", + "cp wasm-releases/evaluation/gofeatureflag-evaluation_v1.45.6.wasm src/lib/wasm/wasm-module/gofeatureflag-evaluation.wasm" + ], + "cwd": "libs/providers/go-feature-flag", + "parallel": false + } + }, "lint": { "executor": "@nx/eslint:lint", - "outputs": ["{options.outputFile}"] + "outputs": [ + "{options.outputFile}" + ] }, "test": { "executor": "@nx/jest:jest", - "outputs": ["{workspaceRoot}/coverage/libs/providers/go-feature-flag"], + "outputs": [ + "{workspaceRoot}/coverage/libs/providers/go-feature-flag" + ], "options": { "jestConfig": "libs/providers/go-feature-flag/jest.config.ts" - } + }, + "dependsOn": [ + { + "target": "copy-wasm" + } + ] }, "package": { "executor": "@nx/rollup:rollup", - "outputs": ["{options.outputPath}"], + "outputs": [ + "{options.outputPath}" + ], + "dependsOn": [ + { + "target": "copy-wasm" + } + ], "options": { "project": "libs/providers/go-feature-flag/package.json", "outputPath": "dist/libs/providers/go-feature-flag", @@ -39,7 +66,10 @@ "generateExportsField": true, "umdName": "go-feature-flag", "external": "all", - "format": ["cjs", "esm"], + "format": [ + "cjs", + "esm" + ], "assets": [ { "glob": "package.json", @@ -61,4 +91,4 @@ } }, "tags": [] -} +} \ No newline at end of file diff --git a/libs/providers/go-feature-flag/src/lib/model/exporter-metadata.test.ts b/libs/providers/go-feature-flag/src/lib/model/exporter-metadata.test.ts index 71d0b29ab..50e4bc83d 100644 --- a/libs/providers/go-feature-flag/src/lib/model/exporter-metadata.test.ts +++ b/libs/providers/go-feature-flag/src/lib/model/exporter-metadata.test.ts @@ -190,7 +190,7 @@ describe('ExporterMetadata', () => { it('should handle complex metadata scenarios', () => { // Simulate a real-world scenario - exporterMetadata.add('sdk', 'go-feature-flag-server'); + exporterMetadata.add('sdk', 'go-feature-flag'); exporterMetadata.add('sdkVersion', '1.0.0'); exporterMetadata.add('endpoint', 'http://localhost:1031'); exporterMetadata.add('timeout', 5000); @@ -200,7 +200,7 @@ describe('ExporterMetadata', () => { const result = exporterMetadata.asObject(); expect(result).toEqual({ - sdk: 'go-feature-flag-server', + sdk: 'go-feature-flag', sdkVersion: '1.0.0', endpoint: 'http://localhost:1031', timeout: 5000, diff --git a/libs/providers/go-feature-flag/src/lib/wasm/wasm-module/.gitignore b/libs/providers/go-feature-flag/src/lib/wasm/wasm-module/.gitignore new file mode 100644 index 000000000..746cba5df --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/wasm/wasm-module/.gitignore @@ -0,0 +1 @@ +gofeatureflag-evaluation.wasm \ No newline at end of file diff --git a/libs/providers/go-feature-flag/src/lib/wasm/wasm-module/.gitkeep b/libs/providers/go-feature-flag/src/lib/wasm/wasm-module/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/libs/providers/go-feature-flag/src/lib/wasm/wasm-module/gofeatureflag-evaluation.wasm b/libs/providers/go-feature-flag/src/lib/wasm/wasm-module/gofeatureflag-evaluation.wasm deleted file mode 100644 index 2a492a2ddf02a0920e7aa5c708abb2f5d33f9f8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 878235 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

IV*&G*hm=U!v@13 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�n7~O1MphCc>AU~hN;141EA4&Fm~Xe_w8yLy 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%0DhTQ8dpGbz9d7cx7& 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 z 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Ξ;`GUgGp8WVo+@!XdKzNubi}bU5Xa9%oHz?{@@&MZa}cM`MVvVgarS(P z6VVG0TNfgZU4%G(G2+A}h?AEhPF;pLeL3RH6^OG}N}P;dh1j|paqJqz@oNz$u0x!> z9&zdh#OWImXKq5Ay;9mpBuB0RpGq8y{tU5o5aQU+5yyXlIB_uIL|qNqY-D0L7Y8S;$-wV#MbeMV<#YvpNKed65`~^h*PH^PM?Z6a~k68=@O@+XCSuD zL>xN{ar|t=iE|Jq&qbU%4{`c@#F+~aXD^gE9lZ##bur@DC5YpfB2HX}IC(kZ)D?)+ zS0c__g*bb)#F^+dh^=c8$F4&hzaDYo2E@r55vOiKoW2=x<`%@+TP4m$Z$oU|jyQG) z;`p726L%p_-iygwzR8oz(M?aCVc;Nfz2Vs1P^Vw8yeG+O#K| z-DperIS=|kdwBlP;xes^;98f9~HL04EL`X>AT0dY!s)&Kwi diff --git a/libs/providers/go-feature-flag/wasm-releases b/libs/providers/go-feature-flag/wasm-releases new file mode 160000 index 000000000..e2e22c255 --- /dev/null +++ b/libs/providers/go-feature-flag/wasm-releases @@ -0,0 +1 @@ +Subproject commit e2e22c25543ea2a4ee386acb34527d2b1f04aea0 From 0add4ff9161c23a3fcd190a2865e18b005fbcc17 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 5 Aug 2025 19:37:28 +0200 Subject: [PATCH 03/29] add dependency Signed-off-by: Thomas Poignant --- libs/providers/go-feature-flag/package.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libs/providers/go-feature-flag/package.json b/libs/providers/go-feature-flag/package.json index c1707edc5..715a9fd23 100644 --- a/libs/providers/go-feature-flag/package.json +++ b/libs/providers/go-feature-flag/package.json @@ -12,9 +12,11 @@ "@openfeature/ofrep-provider": "0.2.1", "@jest/globals": "29.7.0" }, - "dependencies": {}, + "dependencies": { + "@wasmer/wasi": "^1.2.2" + }, "devDependencies": { "@ljharb/eslint-config": "^21.2.0", "eslint-plugin-tree-shaking": "^1.12.2" } -} +} \ No newline at end of file From 248696db5fd52932bfd33355b23d232215c32ab8 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 5 Aug 2025 19:41:18 +0200 Subject: [PATCH 04/29] Remove unused dependency Signed-off-by: Thomas Poignant --- libs/providers/go-feature-flag/package.json | 4 +--- package.json | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/libs/providers/go-feature-flag/package.json b/libs/providers/go-feature-flag/package.json index 715a9fd23..84caa2c8f 100644 --- a/libs/providers/go-feature-flag/package.json +++ b/libs/providers/go-feature-flag/package.json @@ -12,9 +12,7 @@ "@openfeature/ofrep-provider": "0.2.1", "@jest/globals": "29.7.0" }, - "dependencies": { - "@wasmer/wasi": "^1.2.2" - }, + "dependencies": {}, "devDependencies": { "@ljharb/eslint-config": "^21.2.0", "eslint-plugin-tree-shaking": "^1.12.2" diff --git a/package.json b/package.json index 005571ca8..ec58494e8 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,6 @@ "@protobuf-ts/grpc-transport": "^2.9.0", "@protobuf-ts/runtime-rpc": "^2.9.0", "@swc/helpers": "0.5.17", - "@wasmer/wasi": "^1.2.0", "ajv": "^8.12.0", "axios": "1.11.0", "configcat-common": "9.4.0", From 3cc2b659d9d0ff6d42954a08e44f38abbd37aced Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 5 Aug 2025 19:46:47 +0200 Subject: [PATCH 05/29] fix linter Signed-off-by: Thomas Poignant --- libs/providers/go-feature-flag/package.json | 2 +- libs/providers/go-feature-flag/project.json | 19 +--- .../src/lib/service/api.test.ts | 91 +------------------ .../src/lib/testutil/mock-fetch.ts | 89 ++++++++++++++++++ 4 files changed, 96 insertions(+), 105 deletions(-) create mode 100644 libs/providers/go-feature-flag/src/lib/testutil/mock-fetch.ts diff --git a/libs/providers/go-feature-flag/package.json b/libs/providers/go-feature-flag/package.json index 84caa2c8f..c1707edc5 100644 --- a/libs/providers/go-feature-flag/package.json +++ b/libs/providers/go-feature-flag/package.json @@ -17,4 +17,4 @@ "@ljharb/eslint-config": "^21.2.0", "eslint-plugin-tree-shaking": "^1.12.2" } -} \ No newline at end of file +} diff --git a/libs/providers/go-feature-flag/project.json b/libs/providers/go-feature-flag/project.json index 2cf08b011..d20075afd 100644 --- a/libs/providers/go-feature-flag/project.json +++ b/libs/providers/go-feature-flag/project.json @@ -29,15 +29,11 @@ }, "lint": { "executor": "@nx/eslint:lint", - "outputs": [ - "{options.outputFile}" - ] + "outputs": ["{options.outputFile}"] }, "test": { "executor": "@nx/jest:jest", - "outputs": [ - "{workspaceRoot}/coverage/libs/providers/go-feature-flag" - ], + "outputs": ["{workspaceRoot}/coverage/libs/providers/go-feature-flag"], "options": { "jestConfig": "libs/providers/go-feature-flag/jest.config.ts" }, @@ -49,9 +45,7 @@ }, "package": { "executor": "@nx/rollup:rollup", - "outputs": [ - "{options.outputPath}" - ], + "outputs": ["{options.outputPath}"], "dependsOn": [ { "target": "copy-wasm" @@ -66,10 +60,7 @@ "generateExportsField": true, "umdName": "go-feature-flag", "external": "all", - "format": [ - "cjs", - "esm" - ], + "format": ["cjs", "esm"], "assets": [ { "glob": "package.json", @@ -91,4 +82,4 @@ } }, "tags": [] -} \ No newline at end of file +} diff --git a/libs/providers/go-feature-flag/src/lib/service/api.test.ts b/libs/providers/go-feature-flag/src/lib/service/api.test.ts index efc1cc655..bca71b27c 100644 --- a/libs/providers/go-feature-flag/src/lib/service/api.test.ts +++ b/libs/providers/go-feature-flag/src/lib/service/api.test.ts @@ -9,96 +9,7 @@ import { ImpossibleToSendDataToTheCollectorException, InvalidOptionsException, } from '../exception'; - -// Mock Response class -class MockResponse { - public status: number; - public headers: Headers; - public body: string; - public ok: boolean; - - constructor(status: number, body = '', headers: Record = {}) { - this.status = status; - this.body = body; - this.headers = new Headers(headers); - this.ok = status >= 200 && status < 300; - } - - async text(): Promise { - return this.body; - } - - async json(): Promise { - return JSON.parse(this.body); - } -} - -// Mock fetch implementation -class MockFetch { - private responses: Map = new Map(); - private lastRequest?: { - url: string; - options: RequestInit; - }; - - setResponse(url: string, response: MockResponse): void { - this.responses.set(url, response); - } - - setResponseByStatus(status: string, response: MockResponse): void { - this.responses.set(status, response); - } - - getLastRequest() { - return this.lastRequest; - } - - reset(): void { - this.responses.clear(); - this.lastRequest = undefined; - } - - async fetch(url: string, options: RequestInit = {}): Promise { - this.lastRequest = { url, options }; - - // Handle AbortSignal for timeout tests - if (options.signal) { - const signal = options.signal as AbortSignal; - if (signal.aborted) { - throw new Error('Request aborted'); - } - - // For timeout tests, we'll simulate a delay and then check if aborted - if (url.includes('timeout')) { - await new Promise((resolve) => setTimeout(resolve, 100)); - if (signal.aborted) { - throw new Error('Request aborted'); - } - } - } - - // Check if we have a specific response for this URL - if (this.responses.has(url)) { - return this.responses.get(url)! as unknown as Response; - } - - // Check if we have a response by status code - const statusMatch = url.match(/(\d{3})/); - if (statusMatch && this.responses.has(statusMatch[1])) { - return this.responses.get(statusMatch[1])! as unknown as Response; - } - - // Check if we have a response by status code in the responses map - for (const [key, response] of this.responses.entries()) { - if (key.match(/^\d{3}$/) && response.status === parseInt(key)) { - return response as unknown as Response; - } - } - - // Default response - return new MockResponse(200, '{}') as unknown as Response; - } -} +import { MockFetch, MockResponse } from '../testutil/mock-fetch'; describe('GoFeatureFlagApi', () => { let mockFetch: MockFetch; diff --git a/libs/providers/go-feature-flag/src/lib/testutil/mock-fetch.ts b/libs/providers/go-feature-flag/src/lib/testutil/mock-fetch.ts new file mode 100644 index 000000000..764261bd7 --- /dev/null +++ b/libs/providers/go-feature-flag/src/lib/testutil/mock-fetch.ts @@ -0,0 +1,89 @@ +// Mock Response class +export class MockResponse { + public status: number; + public headers: Headers; + public body: string; + public ok: boolean; + + constructor(status: number, body = '', headers: Record = {}) { + this.status = status; + this.body = body; + this.headers = new Headers(headers); + this.ok = status >= 200 && status < 300; + } + + async text(): Promise { + return this.body; + } + + async json(): Promise { + return JSON.parse(this.body); + } +} + +// Mock fetch implementation +export class MockFetch { + private responses: Map = new Map(); + private lastRequest?: { + url: string; + options: RequestInit; + }; + + setResponse(url: string, response: MockResponse): void { + this.responses.set(url, response); + } + + setResponseByStatus(status: string, response: MockResponse): void { + this.responses.set(status, response); + } + + getLastRequest() { + return this.lastRequest; + } + + reset(): void { + this.responses.clear(); + this.lastRequest = undefined; + } + + async fetch(url: string, options: RequestInit = {}): Promise { + this.lastRequest = { url, options }; + + // Handle AbortSignal for timeout tests + if (options.signal) { + const signal = options.signal as AbortSignal; + if (signal.aborted) { + throw new Error('Request aborted'); + } + + // For timeout tests, we'll simulate a delay and then check if aborted + if (url.includes('timeout')) { + await new Promise((resolve) => setTimeout(resolve, 100)); + if (signal.aborted) { + throw new Error('Request aborted'); + } + } + } + + // Check if we have a specific response for this URL + if (this.responses.has(url)) { + return this.responses.get(url)! as unknown as Response; + } + + // Check if we have a response by status code + const statusMatch = url.match(/(\d{3})/); + if (statusMatch && this.responses.has(statusMatch[1])) { + return this.responses.get(statusMatch[1])! as unknown as Response; + } + + // Check if we have a response by status code in the responses map + for (const [key, response] of this.responses.entries()) { + if (key.match(/^\d{3}$/) && response.status === parseInt(key)) { + return response as unknown as Response; + } + } + + // Default response + return new MockResponse(200, '{}') as unknown as Response; + } +} From 2e37b050aae562f592bc89c87f28abace03cf454 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 5 Aug 2025 19:54:10 +0200 Subject: [PATCH 06/29] adding mock for config Signed-off-by: Thomas Poignant --- .../src/lib/go-feature-flag-provider.test.ts | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts index 7133057cb..f812985fa 100644 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts @@ -1190,6 +1190,16 @@ describe('GoFeatureFlagProvider', () => { it('should track events without context', async () => { jest.setSystemTime(new Date('2021-01-01T00:00:00Z')); fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/data\/collector/, async () => { + return { + body: getConfigurationEndpointResult(), + status: 200, + headers: { + 'Content-Type': 'application/json', + }, + }; + }); + + fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/flag\/configuration/, async () => { return { body: JSON.stringify({}), status: 200, @@ -1245,6 +1255,17 @@ describe('GoFeatureFlagProvider', () => { }, }; }); + + fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/flag\/configuration/, async () => { + return { + body: JSON.stringify({}), + status: 200, + headers: { + 'Content-Type': 'application/json', + }, + }; + }); + const provider = new GoFeatureFlagProvider({ endpoint: 'http://localhost:1031', dataFlushInterval: 100, From 2bbc06e0f117706f9780b0f85cd1cf0f781037ee Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 5 Aug 2025 22:04:09 +0200 Subject: [PATCH 07/29] set default flush interval to 2 minutes Signed-off-by: Thomas Poignant --- libs/providers/go-feature-flag/README.md | 2 +- .../go-feature-flag/src/lib/go-feature-flag-provider-options.ts | 2 +- libs/providers/go-feature-flag/src/lib/helper/constants.ts | 2 +- .../go-feature-flag/src/lib/service/event-publisher.test.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libs/providers/go-feature-flag/README.md b/libs/providers/go-feature-flag/README.md index 42e651cd0..a0a27d170 100644 --- a/libs/providers/go-feature-flag/README.md +++ b/libs/providers/go-feature-flag/README.md @@ -78,7 +78,7 @@ const provider = new GoFeatureFlagProvider({ | `evaluationType` | `EvaluationType` | `InProcess` | Evaluation mode: `InProcess` or `Remote` | | `timeout` | `number` | `10000` | HTTP request timeout in milliseconds | | `flagChangePollingIntervalMs` | `number` | `120000` | Polling interval for configuration changes | -| `dataFlushInterval` | `number` | `1000` | Data collection flush interval | +| `dataFlushInterval` | `number` | `120000` | Data collection flush interval | | `maxPendingEvents` | `number` | `10000` | Maximum pending events before flushing | | `disableDataCollection` | `boolean` | `false` | Disable data collection entirely | | `apiKey` | `string` | `undefined` | API key for authentication | diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider-options.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider-options.ts index 385f626ea..2b4bd22ea 100644 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider-options.ts +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider-options.ts @@ -27,7 +27,7 @@ export interface GoFeatureFlagProviderOptions { /** * The interval for flushing data collection events in milliseconds. - * @default 1000 + * @default 120000 */ dataFlushInterval?: number; diff --git a/libs/providers/go-feature-flag/src/lib/helper/constants.ts b/libs/providers/go-feature-flag/src/lib/helper/constants.ts index 51b3df1e0..c0e9ecac3 100644 --- a/libs/providers/go-feature-flag/src/lib/helper/constants.ts +++ b/libs/providers/go-feature-flag/src/lib/helper/constants.ts @@ -19,7 +19,7 @@ export const HTTP_STATUS = { NOT_MODIFIED: 304, } as const; -export const DEFAULT_FLUSH_INTERVAL_MS = 10000; +export const DEFAULT_FLUSH_INTERVAL_MS = 120000; export const DEFAULT_MAX_PENDING_EVENTS = 10000; export const DEFAULT_TARGETING_KEY = 'undefined-targetingKey'; diff --git a/libs/providers/go-feature-flag/src/lib/service/event-publisher.test.ts b/libs/providers/go-feature-flag/src/lib/service/event-publisher.test.ts index 1c331da2c..8925183b9 100644 --- a/libs/providers/go-feature-flag/src/lib/service/event-publisher.test.ts +++ b/libs/providers/go-feature-flag/src/lib/service/event-publisher.test.ts @@ -243,7 +243,7 @@ describe('EventPublisher', () => { publisher.addEvent(mockEvent); // Default should be 10000ms (from constants) - jest.advanceTimersByTime(10100); + jest.advanceTimersByTime(120010); expect(mockApi.sendEventToDataCollector).toHaveBeenCalled(); From c5ef0d15ab43e161fbbc735f96891a6180b0ab3f Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 5 Aug 2025 22:13:18 +0200 Subject: [PATCH 08/29] Add script to copy wasm file Signed-off-by: Thomas Poignant --- libs/providers/go-feature-flag/project.json | 22 ++++--- .../go-feature-flag/scripts/README.md | 41 +++++++++++++ .../scripts/copy-latest-wasm.js | 58 +++++++++++++++++++ 3 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 libs/providers/go-feature-flag/scripts/README.md create mode 100755 libs/providers/go-feature-flag/scripts/copy-latest-wasm.js diff --git a/libs/providers/go-feature-flag/project.json b/libs/providers/go-feature-flag/project.json index d20075afd..00b7c7c52 100644 --- a/libs/providers/go-feature-flag/project.json +++ b/libs/providers/go-feature-flag/project.json @@ -20,8 +20,7 @@ "executor": "nx:run-commands", "options": { "commands": [ - "git submodule update --init wasm-releases", - "cp wasm-releases/evaluation/gofeatureflag-evaluation_v1.45.6.wasm src/lib/wasm/wasm-module/gofeatureflag-evaluation.wasm" + "node scripts/copy-latest-wasm.js" ], "cwd": "libs/providers/go-feature-flag", "parallel": false @@ -29,11 +28,15 @@ }, "lint": { "executor": "@nx/eslint:lint", - "outputs": ["{options.outputFile}"] + "outputs": [ + "{options.outputFile}" + ] }, "test": { "executor": "@nx/jest:jest", - "outputs": ["{workspaceRoot}/coverage/libs/providers/go-feature-flag"], + "outputs": [ + "{workspaceRoot}/coverage/libs/providers/go-feature-flag" + ], "options": { "jestConfig": "libs/providers/go-feature-flag/jest.config.ts" }, @@ -45,7 +48,9 @@ }, "package": { "executor": "@nx/rollup:rollup", - "outputs": ["{options.outputPath}"], + "outputs": [ + "{options.outputPath}" + ], "dependsOn": [ { "target": "copy-wasm" @@ -60,7 +65,10 @@ "generateExportsField": true, "umdName": "go-feature-flag", "external": "all", - "format": ["cjs", "esm"], + "format": [ + "cjs", + "esm" + ], "assets": [ { "glob": "package.json", @@ -82,4 +90,4 @@ } }, "tags": [] -} +} \ No newline at end of file diff --git a/libs/providers/go-feature-flag/scripts/README.md b/libs/providers/go-feature-flag/scripts/README.md new file mode 100644 index 000000000..cc21e8538 --- /dev/null +++ b/libs/providers/go-feature-flag/scripts/README.md @@ -0,0 +1,41 @@ +# Scripts + +This directory contains utility scripts for the go-feature-flag provider. + +## copy-latest-wasm.js + +This script copies the go-feature-flag WASM evaluation module from the `wasm-releases` submodule. + +### Purpose + +Previously, the WASM filename was hardcoded with a specific version (e.g., `gofeatureflag-evaluation_v1.45.6.wasm`), which made updates cumbersome and error-prone. This script replaces that approach with a configurable solution that: + +1. Uses an explicit version constant (`TARGET_WASM_VERSION`) for controlled updates +2. Updates the git submodule to get the latest WASM releases +3. Validates that the requested version exists before copying +4. Copies the WASM file to the expected location + +### Configuration + +The script has one configuration constant at the top: + +- `TARGET_WASM_VERSION`: The explicit version to use (e.g., `'v1.45.6'`) + +### Usage + +The script is automatically executed by the `copy-wasm` target in `project.json` and is used as a dependency for the `test` and `package` targets. + +You can also run it manually: + +```bash +node scripts/copy-latest-wasm.js +``` + +### Benefits + +- **Explicit control**: You can specify exactly which version to use +- **Easy updates**: Simply change the `TARGET_WASM_VERSION` constant when you want to upgrade +- **Error prevention**: Validates that the requested version exists before copying +- **Maintainability**: Reduces manual maintenance overhead while providing control +- **Consistency**: Ensures reproducible builds with known versions +- **Simplicity**: Clear and straightforward approach without complex logic diff --git a/libs/providers/go-feature-flag/scripts/copy-latest-wasm.js b/libs/providers/go-feature-flag/scripts/copy-latest-wasm.js new file mode 100755 index 000000000..547a5f1f9 --- /dev/null +++ b/libs/providers/go-feature-flag/scripts/copy-latest-wasm.js @@ -0,0 +1,58 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const path = require('path'); +const { execSync } = require('child_process'); + +/** + * Script to copy the go-feature-flag WASM evaluation module + * This replaces the hardcoded version approach with a configurable one + */ +const TARGET_WASM_VERSION = 'v1.45.6'; + +function copyWasmFile() { + try { + // Update git submodule first + console.log('Updating git submodule...'); + execSync('git submodule update --init wasm-releases', { + cwd: path.join(__dirname, '..'), + stdio: 'inherit', + }); + + const wasmFileName = `gofeatureflag-evaluation_${TARGET_WASM_VERSION}.wasm`; + console.log(`Using explicit WASM version: ${TARGET_WASM_VERSION}`); + + const sourcePath = path.join(__dirname, '../wasm-releases/evaluation', wasmFileName); + const targetPath = path.join(__dirname, '../src/lib/wasm/wasm-module/gofeatureflag-evaluation.wasm'); + + // Check if the source file exists + if (!fs.existsSync(sourcePath)) { + console.error(`Error: WASM file not found: ${sourcePath}`); + console.error('Available files in wasm-releases/evaluation:'); + const evaluationDir = path.join(__dirname, '../wasm-releases/evaluation'); + if (fs.existsSync(evaluationDir)) { + const files = fs.readdirSync(evaluationDir).filter((file) => file.endsWith('.wasm')); + files.forEach((file) => console.error(` - ${file}`)); + } + process.exit(1); + } + + // Ensure target directory exists + const targetDir = path.dirname(targetPath); + if (!fs.existsSync(targetDir)) { + fs.mkdirSync(targetDir, { recursive: true }); + } + + // Copy the file + console.log(`Copying ${wasmFileName} to ${targetPath}...`); + fs.copyFileSync(sourcePath, targetPath); + + console.log('✅ Successfully copied WASM file'); + } catch (error) { + console.error('Error copying WASM file:', error.message); + process.exit(1); + } +} + +// Run the script +copyWasmFile(); From e1f3d433d278fe576014e91086012cdd6616590e Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 5 Aug 2025 22:18:36 +0200 Subject: [PATCH 09/29] fixing linter Signed-off-by: Thomas Poignant --- libs/providers/go-feature-flag/project.json | 23 ++++++--------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/libs/providers/go-feature-flag/project.json b/libs/providers/go-feature-flag/project.json index 00b7c7c52..fc9e01ff6 100644 --- a/libs/providers/go-feature-flag/project.json +++ b/libs/providers/go-feature-flag/project.json @@ -19,24 +19,18 @@ "copy-wasm": { "executor": "nx:run-commands", "options": { - "commands": [ - "node scripts/copy-latest-wasm.js" - ], + "commands": ["node scripts/copy-latest-wasm.js"], "cwd": "libs/providers/go-feature-flag", "parallel": false } }, "lint": { "executor": "@nx/eslint:lint", - "outputs": [ - "{options.outputFile}" - ] + "outputs": ["{options.outputFile}"] }, "test": { "executor": "@nx/jest:jest", - "outputs": [ - "{workspaceRoot}/coverage/libs/providers/go-feature-flag" - ], + "outputs": ["{workspaceRoot}/coverage/libs/providers/go-feature-flag"], "options": { "jestConfig": "libs/providers/go-feature-flag/jest.config.ts" }, @@ -48,9 +42,7 @@ }, "package": { "executor": "@nx/rollup:rollup", - "outputs": [ - "{options.outputPath}" - ], + "outputs": ["{options.outputPath}"], "dependsOn": [ { "target": "copy-wasm" @@ -65,10 +57,7 @@ "generateExportsField": true, "umdName": "go-feature-flag", "external": "all", - "format": [ - "cjs", - "esm" - ], + "format": ["cjs", "esm"], "assets": [ { "glob": "package.json", @@ -90,4 +79,4 @@ } }, "tags": [] -} \ No newline at end of file +} From 9b70a3d7091879e13896807e065d70adabfb7b37 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 5 Aug 2025 22:44:30 +0200 Subject: [PATCH 10/29] rework readme Signed-off-by: Thomas Poignant --- libs/providers/go-feature-flag/README.md | 134 +---------------------- 1 file changed, 6 insertions(+), 128 deletions(-) diff --git a/libs/providers/go-feature-flag/README.md b/libs/providers/go-feature-flag/README.md index a0a27d170..8442e0e9f 100644 --- a/libs/providers/go-feature-flag/README.md +++ b/libs/providers/go-feature-flag/README.md @@ -90,14 +90,14 @@ const provider = new GoFeatureFlagProvider({ #### InProcess Evaluation - **Performance**: Fastest evaluation with local caching -- **Network**: Minimal network calls, only for configuration updates +- **Network**: Minimal network calls, only for configuration updates and tracking - **Use Case**: High-performance applications, real-time evaluation #### Remote Evaluation - **Performance**: Network-dependent evaluation -- **Network**: Each evaluation requires a network call -- **Use Case**: Centralized control, complex targeting rules +- **Network**: Each evaluation requires a network call, works well with side-cars or in the edge +- **Use Case**: Centralized control ## Advanced Usage 🔧 @@ -132,7 +132,7 @@ const provider = new GoFeatureFlagProvider({ endpoint: 'https://your-relay-proxy.com', evaluationType: EvaluationType.Remote, disableDataCollection: false, // Enable data collection - dataFlushInterval: 2000, // Flush every 2 seconds + dataFlushInterval: 20000, // Flush every 20 seconds maxPendingEvents: 5000, // Max 5000 pending events }); ``` @@ -156,36 +156,6 @@ const provider = new GoFeatureFlagProvider({ }); ``` -### Custom Fetch Implementation - -For environments with specific HTTP requirements: - -```typescript -const provider = new GoFeatureFlagProvider({ - endpoint: 'https://your-relay-proxy.com', - evaluationType: EvaluationType.Remote, - fetchImplementation: customFetch, // Your custom fetch implementation -}); -``` - -### Error Handling - -The provider includes comprehensive error handling: - -```typescript -try { - const flagValue = await client.getBooleanValue('my-feature-flag', false, context); -} catch (error) { - if (error.code === 'FLAG_NOT_FOUND') { - // Handle flag not found - } else if (error.code === 'UNAUTHORIZED') { - // Handle authentication error - } else { - // Handle other errors - } -} -``` - ## Flag Types Supported 🎯 The provider supports all OpenFeature flag types: @@ -231,97 +201,6 @@ client.track('user_action', context, { }); ``` -## Performance Considerations ⚡ - -### Caching Strategy - -- **InProcess**: Local caching with automatic invalidation on configuration changes -- **Remote**: HTTP caching headers respected -- **Configuration**: Automatic polling with configurable intervals - -### Best Practices - -1. **Use InProcess for high-frequency evaluations** -2. **Configure appropriate polling intervals** -3. **Monitor data collection volume** -4. **Set reasonable timeouts for your network** - -## Troubleshooting 🔧 - -### Common Issues - -**Configuration not updating** - -- Check `flagChangePollingIntervalMs` setting -- Verify relay-proxy endpoint is accessible - -**High latency** - -- Consider switching to `InProcess` evaluation -- Check network connectivity to relay-proxy - -**Data collection issues** - -- Verify `disableDataCollection` is not set to `true` -- Check `maxPendingEvents` and `dataFlushInterval` settings - -### Debug Mode - -Enable debug logging: - -```typescript -import { Logger } from '@openfeature/server-sdk'; - -const logger = { - debug: (message: string) => console.log(`[DEBUG] ${message}`), - info: (message: string) => console.log(`[INFO] ${message}`), - warn: (message: string) => console.log(`[WARN] ${message}`), - error: (message: string) => console.log(`[ERROR] ${message}`), -}; - -const provider = new GoFeatureFlagProvider( - { - endpoint: 'https://your-relay-proxy.com', - evaluationType: EvaluationType.Remote, - }, - logger, -); -``` - -## API Reference 📚 - -### GoFeatureFlagProvider - -The main provider class that implements the OpenFeature Provider interface. - -#### Constructor - -```typescript -constructor(options: GoFeatureFlagProviderOptions, logger?: Logger) -``` - -#### Methods - -- `resolveBooleanEvaluation(flagKey: string, defaultValue: boolean, context: EvaluationContext): Promise>` -- `resolveStringEvaluation(flagKey: string, defaultValue: string, context: EvaluationContext): Promise>` -- `resolveNumberEvaluation(flagKey: string, defaultValue: number, context: EvaluationContext): Promise>` -- `resolveObjectEvaluation(flagKey: string, defaultValue: T, context: EvaluationContext): Promise>` -- `track(trackingEventName: string, context?: EvaluationContext, trackingEventDetails?: TrackingEventDetails): void` - -### EvaluationType - -Enum defining evaluation modes: - -- `EvaluationType.InProcess`: Local evaluation -- `EvaluationType.Remote`: Remote evaluation - -### ExporterMetadata - -Class for adding custom metadata to evaluation events: - -- `add(key: string, value: string | boolean | number): ExporterMetadata` -- `asObject(): Record` - ## Contributing 🤝 We welcome contributions! Please see our [contributing guidelines](CONTRIBUTING.md) for details. @@ -332,6 +211,5 @@ This project is licensed under the Apache License 2.0 - see the [LICENSE](LICENS ## Support 💬 -- **Documentation**: [OpenFeature Documentation](https://openfeature.dev/) -- **Issues**: [GitHub Issues](https://github.com/open-feature/js-sdk-contrib/issues) -- **Discussions**: [GitHub Discussions](https://github.com/open-feature/js-sdk-contrib/discussions) +- **Documentation**: [GO Feature Flag Documentation](https://gofeatureflag.org/), [OpenFeature Documentation](https://openfeature.dev/) +- **Issues**: [GitHub Issues](https://github.com/thomaspoignant/go-feature-flag/issues) From 00533ed59f164fc2289b00d583714bb7ed3a5824 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 5 Aug 2025 22:47:00 +0200 Subject: [PATCH 11/29] simplify addEvent Signed-off-by: Thomas Poignant --- .../go-feature-flag/src/lib/service/event-publisher.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/libs/providers/go-feature-flag/src/lib/service/event-publisher.ts b/libs/providers/go-feature-flag/src/lib/service/event-publisher.ts index 9e3f93fb7..005cf5afc 100644 --- a/libs/providers/go-feature-flag/src/lib/service/event-publisher.ts +++ b/libs/providers/go-feature-flag/src/lib/service/event-publisher.ts @@ -78,13 +78,8 @@ export class EventPublisher { * @returns {void} */ addEvent(eventToAdd: ExportEvent): void { - let shouldPublish = false; - // Simple thread-safe check and add - if (this.events.length + 1 >= (this.options.maxPendingEvents || DEFAULT_MAX_PENDING_EVENTS)) { - shouldPublish = true; - } this.events.push(eventToAdd); - if (shouldPublish) { + if (this.events.length >= (this.options.maxPendingEvents || DEFAULT_MAX_PENDING_EVENTS)) { // Fire and forget - don't await to avoid blocking this.publishEvents().catch((error) => { this.logger?.error('Error publishing events:', error); From d799bdf623f01594659a846931cff0d7cd69c3fa Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 5 Aug 2025 22:48:54 +0200 Subject: [PATCH 12/29] use integer Unix timestamps Signed-off-by: Thomas Poignant --- .../go-feature-flag/src/lib/go-feature-flag-provider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.ts index 535763020..572f423bb 100644 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.ts +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.ts @@ -60,7 +60,7 @@ export class GoFeatureFlagProvider implements Provider, Tracking { contextKind: getContextKind(context), key: trackingEventName, trackingEventDetails: trackingEventDetails ?? {}, - creationDate: Date.now() / 1000, + creationDate: Math.floor(Date.now() / 1000), evaluationContext: context ?? {}, }; this.eventPublisher.addEvent(event); From 94c9a108a7407162e8766ca5c09c933f997b979b Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 11:50:31 +0200 Subject: [PATCH 13/29] defer initialization of the wasm module Signed-off-by: Thomas Poignant --- .../src/lib/evaluator/inprocess-evaluator.test.ts | 1 + .../src/lib/evaluator/inprocess-evaluator.ts | 3 ++- .../go-feature-flag/src/lib/wasm/evaluate-wasm.ts | 8 ++------ 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.test.ts b/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.test.ts index 289d3e8d8..5b94d9bc7 100644 --- a/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.test.ts +++ b/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.test.ts @@ -7,6 +7,7 @@ import { EvaluationType } from '../model'; // Mock the EvaluateWasm class jest.mock('../wasm/evaluate-wasm', () => ({ EvaluateWasm: jest.fn().mockImplementation(() => ({ + initialize: jest.fn().mockResolvedValue(undefined), evaluate: jest.fn().mockResolvedValue({ value: true, reason: 'TARGETING_MATCH', diff --git a/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts b/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts index a8b3a1173..853689e57 100644 --- a/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts +++ b/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts @@ -64,8 +64,9 @@ export class InProcessEvaluator implements IEvaluator { * Initialize the evaluator. */ async initialize(): Promise { - await this.loadConfiguration(true); + await this.evaluationEngine.initialize(); + await this.loadConfiguration(true); // Start periodic configuration polling if (this.options.flagChangePollingIntervalMs && this.options.flagChangePollingIntervalMs > 0) { this.periodicRunner = setInterval( diff --git a/libs/providers/go-feature-flag/src/lib/wasm/evaluate-wasm.ts b/libs/providers/go-feature-flag/src/lib/wasm/evaluate-wasm.ts index d3af0ef1f..eb47591e0 100644 --- a/libs/providers/go-feature-flag/src/lib/wasm/evaluate-wasm.ts +++ b/libs/providers/go-feature-flag/src/lib/wasm/evaluate-wasm.ts @@ -23,17 +23,13 @@ export class EvaluateWasm { constructor(logger?: Logger) { this.logger = logger; this.go = new Go(); - // Initialize WASM asynchronously - this.initializeWasm().catch((error) => { - logger?.error('Failed to initialize WASM:', error); - }); } /** * Initializes the WASM module. * In a real implementation, this would load the WASM binary and instantiate it. */ - private async initializeWasm(): Promise { + public async initialize(): Promise { try { // Load the WASM binary const wasmBuffer = await this.loadWasmBinary(); @@ -119,7 +115,7 @@ export class EvaluateWasm { try { // Ensure WASM is initialized if (!this.wasmExports || !this.wasmMemory) { - await this.initializeWasm(); + await this.initialize(); } // Serialize the input to JSON From 96f0404f8b5dcb0fce458ac59d70c7d35d0c6c53 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 11:56:50 +0200 Subject: [PATCH 14/29] use setTimeout instead of setInterval Signed-off-by: Thomas Poignant --- .../src/lib/evaluator/inprocess-evaluator.ts | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts b/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts index 853689e57..309990c28 100644 --- a/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts +++ b/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts @@ -69,14 +69,24 @@ export class InProcessEvaluator implements IEvaluator { await this.loadConfiguration(true); // Start periodic configuration polling if (this.options.flagChangePollingIntervalMs && this.options.flagChangePollingIntervalMs > 0) { - this.periodicRunner = setInterval( - () => - this.loadConfiguration(false).catch((error) => this.logger?.error('Failed to load configuration:', error)), - this.options.flagChangePollingIntervalMs, - ); + this.periodicRunner = setTimeout(() => this.poll(), this.options.flagChangePollingIntervalMs); } } + /** + * Poll the configuration from the API. + */ + private poll(): void { + this.loadConfiguration(false) + .catch((error) => this.logger?.error('Failed to load configuration:', error)) + .finally(() => { + if (this.periodicRunner) { + // check if polling is still active + this.periodicRunner = setTimeout(() => this.poll(), this.options.flagChangePollingIntervalMs); + } + }); + } + /** * Evaluates a boolean flag. * @param flagKey - The key of the flag to evaluate. From a0b021fa27b1a3871ba1b1b7e06ba62d49a0eb08 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 11:59:20 +0200 Subject: [PATCH 15/29] (event publisher) use setTimeout instead of setInterval Signed-off-by: Thomas Poignant --- .../src/lib/service/event-publisher.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/libs/providers/go-feature-flag/src/lib/service/event-publisher.ts b/libs/providers/go-feature-flag/src/lib/service/event-publisher.ts index 005cf5afc..6c2e0511b 100644 --- a/libs/providers/go-feature-flag/src/lib/service/event-publisher.ts +++ b/libs/providers/go-feature-flag/src/lib/service/event-publisher.ts @@ -49,10 +49,19 @@ export class EventPublisher { return; } this.isRunning = true; - const flushInterval = this.options.dataFlushInterval || DEFAULT_FLUSH_INTERVAL_MS; - this.intervalId = setInterval(async () => { - await this.publishEvents(); - }, flushInterval); + this.runPublisher(); + } + + /** + * Runs the publisher and sets up a periodic runner. + * @returns {Promise} A promise that resolves when the publisher has run. + */ + private async runPublisher(): Promise { + await this.publishEvents(); + if (this.isRunning) { + const flushInterval = this.options.dataFlushInterval || DEFAULT_FLUSH_INTERVAL_MS; + this.intervalId = setTimeout(() => this.runPublisher(), flushInterval); + } } /** From 62af0209a771109724c213e748e6095329b26c4f Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 14:19:15 +0200 Subject: [PATCH 16/29] change advanced time Signed-off-by: Thomas Poignant --- .../go-feature-flag/src/lib/go-feature-flag-provider.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts index f812985fa..4ee19bdee 100644 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts @@ -1280,7 +1280,7 @@ describe('GoFeatureFlagProvider', () => { userId: '123', }); - jest.advanceTimersByTime(110); + jest.advanceTimersByTime(150); const want = { meta: {}, From 8725b7c23b9b3a716b9e94a14b57098ca6cf47d0 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 14:33:55 +0200 Subject: [PATCH 17/29] check only the collector endpoint Signed-off-by: Thomas Poignant --- .../src/lib/go-feature-flag-provider.test.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts index 4ee19bdee..3a0e69023 100644 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts @@ -1237,11 +1237,15 @@ describe('GoFeatureFlagProvider', () => { ], }; - const lastCall = fetchMock.mock.calls[fetchMock.mock.calls.length - 1]; - expect(lastCall).toBeDefined(); - expect(lastCall[0]).toBe('http://localhost:1031/v1/data/collector'); - expect(lastCall[1]?.body).toBeDefined(); - expect(JSON.parse(lastCall[1]?.body as string)).toEqual(want); + // Find the last call to /v1/data/collector + const dataCollectorCalls = fetchMock.mock.calls.filter( + (call) => call[0] === 'http://localhost:1031/v1/data/collector', + ); + const lastDataCollectorCall = dataCollectorCalls[dataCollectorCalls.length - 1]; + expect(lastDataCollectorCall).toBeDefined(); + expect(lastDataCollectorCall[0]).toBe('http://localhost:1031/v1/data/collector'); + expect(lastDataCollectorCall[1]?.body).toBeDefined(); + expect(JSON.parse(lastDataCollectorCall[1]?.body as string)).toEqual(want); }); it('should track events without tracking details', async () => { From 172cf4e96b0e308ad05b3243c6b844856f5d9d95 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 14:35:44 +0200 Subject: [PATCH 18/29] test debug CI Signed-off-by: Thomas Poignant --- libs/providers/go-feature-flag/src/lib/service/api.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/providers/go-feature-flag/src/lib/service/api.ts b/libs/providers/go-feature-flag/src/lib/service/api.ts index 889f3f5fa..5f9727a64 100644 --- a/libs/providers/go-feature-flag/src/lib/service/api.ts +++ b/libs/providers/go-feature-flag/src/lib/service/api.ts @@ -214,6 +214,7 @@ export class GoFeatureFlagApi { const goffResp = JSON.parse(body) as FlagConfigResponse; result.evaluationContextEnrichment = goffResp.evaluationContextEnrichment || {}; result.flags = goffResp.flags || {}; + console.log('result.flags', result.flags); } catch (error) { this.logger?.warn(`Failed to parse flag configuration response: ${error}. Response body: "${body}"`); // Return the default result with empty flags and enrichment From cdde2b2ec62ab22f06fe3611800191263bd1a5b3 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 14:43:02 +0200 Subject: [PATCH 19/29] check only the collector endpoint Signed-off-by: Thomas Poignant --- .../src/lib/go-feature-flag-provider.test.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts index 3a0e69023..039b73ef8 100644 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts @@ -1304,11 +1304,15 @@ describe('GoFeatureFlagProvider', () => { ], }; - const lastCall = fetchMock.mock.calls[fetchMock.mock.calls.length - 1]; - expect(lastCall).toBeDefined(); - expect(lastCall[0]).toBe('http://localhost:1031/v1/data/collector'); - expect(lastCall[1]?.body).toBeDefined(); - expect(JSON.parse(lastCall[1]?.body as string)).toEqual(want); + // Find the last call to /v1/data/collector + const dataCollectorCalls = fetchMock.mock.calls.filter( + (call) => call[0] === 'http://localhost:1031/v1/data/collector', + ); + const lastDataCollectorCall = dataCollectorCalls[dataCollectorCalls.length - 1]; + expect(lastDataCollectorCall).toBeDefined(); + expect(lastDataCollectorCall[0]).toBe('http://localhost:1031/v1/data/collector'); + expect(lastDataCollectorCall[1]?.body).toBeDefined(); + expect(JSON.parse(lastDataCollectorCall[1]?.body as string)).toEqual(want); }); it('should track multiple events', async () => { From 7a079424e090149ea95188721914aed7ade355e7 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 15:00:29 +0200 Subject: [PATCH 20/29] try to specify mock Signed-off-by: Thomas Poignant --- .../src/lib/go-feature-flag-provider.test.ts | 12 +++++++++--- .../providers/go-feature-flag/src/lib/service/api.ts | 1 - 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts index 039b73ef8..e93ddd207 100644 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts @@ -1093,9 +1093,15 @@ describe('GoFeatureFlagProvider', () => { }); it('Should not apply a scheduled rollout in the future', async () => { - fetchMock.mockResponseOnce(getConfigurationEndpointResult('scheduled-rollout'), { - status: 200, - headers: { 'Content-Type': 'application/json' }, + jest.setSystemTime(new Date('2021-01-01T00:00:00Z')); + fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/flag\/configuration/, async () => { + return { + body: getConfigurationEndpointResult('scheduled-rollout'), + status: 200, + headers: { + 'Content-Type': 'application/json', + }, + }; }); const provider = new GoFeatureFlagProvider({ diff --git a/libs/providers/go-feature-flag/src/lib/service/api.ts b/libs/providers/go-feature-flag/src/lib/service/api.ts index 5f9727a64..889f3f5fa 100644 --- a/libs/providers/go-feature-flag/src/lib/service/api.ts +++ b/libs/providers/go-feature-flag/src/lib/service/api.ts @@ -214,7 +214,6 @@ export class GoFeatureFlagApi { const goffResp = JSON.parse(body) as FlagConfigResponse; result.evaluationContextEnrichment = goffResp.evaluationContextEnrichment || {}; result.flags = goffResp.flags || {}; - console.log('result.flags', result.flags); } catch (error) { this.logger?.warn(`Failed to parse flag configuration response: ${error}. Response body: "${body}"`); // Return the default result with empty flags and enrichment From 27c926e65c13c311c65968c5ff8d2d249afc41e7 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 16:08:14 +0200 Subject: [PATCH 21/29] Change timing for tests Signed-off-by: Thomas Poignant --- .../go-feature-flag/src/lib/go-feature-flag-provider.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts index e93ddd207..11197abc0 100644 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts @@ -967,7 +967,7 @@ describe('GoFeatureFlagProvider', () => { it('Should change evaluation details if config has changed', async () => { jest.useRealTimers(); let callCount = 0; - fetchMock.mockIf(/^http:\/\/localhost:1031/, async () => { + fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/flag\/configuration/, async () => { callCount++; if (callCount <= 1) { return { @@ -994,7 +994,7 @@ describe('GoFeatureFlagProvider', () => { const provider = new GoFeatureFlagProvider({ endpoint: 'http://localhost:1031', - flagChangePollingIntervalMs: 200, + flagChangePollingIntervalMs: 150, }); await OpenFeature.setProviderAndWait(testClientName, provider); From 13a38365863a92d89af1fcf10259394e2738cdc7 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 16:16:00 +0200 Subject: [PATCH 22/29] log when error during initialization Signed-off-by: Thomas Poignant --- .../go-feature-flag/src/lib/go-feature-flag-provider.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.ts index 572f423bb..06350d077 100644 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.ts +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.ts @@ -105,8 +105,13 @@ export class GoFeatureFlagProvider implements Provider, Tracking { * Start the provider and initialize the event publisher. */ async initialize(): Promise { - this.evaluator && (await this.evaluator.initialize()); - this.eventPublisher && (await this.eventPublisher.start()); + try { + this.evaluator && (await this.evaluator.initialize()); + this.eventPublisher && (await this.eventPublisher.start()); + } catch (error) { + this.logger?.error('Failed to initialize the provider', error); + throw error; + } } /** From ae986e70e3af4cbd4c835fdb42f8c71759b57782 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 16:17:49 +0200 Subject: [PATCH 23/29] Change the return of configuration Signed-off-by: Thomas Poignant --- .../src/lib/go-feature-flag-provider.test.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts index 11197abc0..5378d037a 100644 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts @@ -1046,10 +1046,14 @@ describe('GoFeatureFlagProvider', () => { }); it('Should error if flag configuration endpoint return a 401', async () => { - jest.useRealTimers(); - fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { - status: 401, - headers: { 'Content-Type': 'application/json' }, + fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/flag\/configuration/, async () => { + return { + body: '{}', + status: 401, + headers: { + 'Content-Type': 'application/json', + }, + }; }); const provider = new GoFeatureFlagProvider({ From 291bd84300c789d92fe7df52a4814b15528cc482 Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 16:19:25 +0200 Subject: [PATCH 24/29] Change mock Signed-off-by: Thomas Poignant --- .../src/lib/go-feature-flag-provider.test.ts | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts index 5378d037a..dadc71e36 100644 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts @@ -1008,10 +1008,14 @@ describe('GoFeatureFlagProvider', () => { }); it('Should error if flag configuration endpoint return a 404', async () => { - jest.useRealTimers(); - fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { - status: 404, - headers: { 'Content-Type': 'application/json' }, + fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/flag\/configuration/, async () => { + return { + body: '{}', + status: 404, + headers: { + 'Content-Type': 'application/json', + }, + }; }); const provider = new GoFeatureFlagProvider({ @@ -1027,10 +1031,14 @@ describe('GoFeatureFlagProvider', () => { }); it('Should error if flag configuration endpoint return a 403', async () => { - jest.useRealTimers(); - fetchMock.mockResponseOnce(getConfigurationEndpointResult(), { - status: 403, - headers: { 'Content-Type': 'application/json' }, + fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/flag\/configuration/, async () => { + return { + body: '{}', + status: 403, + headers: { + 'Content-Type': 'application/json', + }, + }; }); const provider = new GoFeatureFlagProvider({ From 9b990d9ed38ba4802b257ff0367f69275a948c7a Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 16:21:27 +0200 Subject: [PATCH 25/29] Fix date Signed-off-by: Thomas Poignant --- .../src/lib/evaluator/inprocess-evaluator.ts | 1 - .../src/lib/go-feature-flag-provider.test.ts | 25 +++++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts b/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts index 309990c28..8a9954897 100644 --- a/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts +++ b/libs/providers/go-feature-flag/src/lib/evaluator/inprocess-evaluator.ts @@ -65,7 +65,6 @@ export class InProcessEvaluator implements IEvaluator { */ async initialize(): Promise { await this.evaluationEngine.initialize(); - await this.loadConfiguration(true); // Start periodic configuration polling if (this.options.flagChangePollingIntervalMs && this.options.flagChangePollingIntervalMs > 0) { diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts index dadc71e36..bd266197b 100644 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts @@ -967,7 +967,11 @@ describe('GoFeatureFlagProvider', () => { it('Should change evaluation details if config has changed', async () => { jest.useRealTimers(); let callCount = 0; - fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/flag\/configuration/, async () => { + fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/flag\/configuration/, async (request) => { + // read headers in the request + const headers = request.headers; + console.log('headers', headers.get('If-None-Match')); + callCount++; if (callCount <= 1) { return { @@ -1077,14 +1081,21 @@ describe('GoFeatureFlagProvider', () => { }); it('Should apply a scheduled rollout step', async () => { - fetchMock.mockResponseOnce(getConfigurationEndpointResult('scheduled-rollout'), { - status: 200, - headers: { 'Content-Type': 'application/json' }, + jest.useRealTimers(); + fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/flag\/configuration/, async () => { + const res = getConfigurationEndpointResult('scheduled-rollout'); + return { + body: res, + status: 200, + headers: { + 'Content-Type': 'application/json', + }, + }; }); const provider = new GoFeatureFlagProvider({ endpoint: 'http://localhost:1031', - flagChangePollingIntervalMs: 100, + flagChangePollingIntervalMs: 150, }); await OpenFeature.setProviderAndWait(testClientName, provider); @@ -1105,7 +1116,7 @@ describe('GoFeatureFlagProvider', () => { }); it('Should not apply a scheduled rollout in the future', async () => { - jest.setSystemTime(new Date('2021-01-01T00:00:00Z')); + jest.setSystemTime(new Date('2021-01-01T01:00:00Z')); fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/flag\/configuration/, async () => { return { body: getConfigurationEndpointResult('scheduled-rollout'), @@ -1452,7 +1463,7 @@ describe('GoFeatureFlagProvider', () => { }); }); -function getConfigurationEndpointResult(mode = 'default') { +function getConfigurationEndpointResult(mode = 'default'): string { const filePath = path.resolve(__dirname, 'testdata', 'flag-configuration', mode + '.json'); const fileContent = fs.readFileSync(filePath, 'utf-8'); return JSON.stringify(JSON.parse(fileContent)); From 53aab0f7bb96c52e039eefa29e07ec04035c063b Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 18:44:23 +0200 Subject: [PATCH 26/29] remove wasmer because it is not used Signed-off-by: Thomas Poignant --- package-lock.json | 47 ++--------------------------------------------- 1 file changed, 2 insertions(+), 45 deletions(-) diff --git a/package-lock.json b/package-lock.json index 78bfa520b..e7e8b5881 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,6 @@ "@protobuf-ts/grpc-transport": "^2.9.0", "@protobuf-ts/runtime-rpc": "^2.9.0", "@swc/helpers": "0.5.17", - "@wasmer/wasi": "^1.2.0", "ajv": "^8.12.0", "axios": "1.11.0", "configcat-common": "9.4.0", @@ -93,7 +92,8 @@ "verdaccio": "^5.0.4" }, "engines": { - "node": ">=24.0.0" + "node": ">=24.0.0", + "npm": "^8.0.0" } }, "node_modules/@ampproject/remapping": { @@ -8489,12 +8489,6 @@ "node": ">=10" } }, - "node_modules/@wasmer/wasi": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@wasmer/wasi/-/wasi-1.2.0.tgz", - "integrity": "sha512-Hxg/By00+nTWbEgj7qIfodCjU/N1k6H1yTLuSyp0x1KV6OK1AVTMGZAMcW/qOajToCkEVxYjw0BCW4mf5iPoyA==", - "license": "MIT" - }, "node_modules/@xhmikosr/archive-type": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@xhmikosr/archive-type/-/archive-type-7.0.0.tgz", @@ -14861,43 +14855,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/jest-circus/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/jest-circus/node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", From b18832b1dbb30d22b3be57074ebda5cc31c468aa Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 18:47:01 +0200 Subject: [PATCH 27/29] rollback package-lock Signed-off-by: Thomas Poignant --- package-lock.json | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index e7e8b5881..c8199b948 100644 --- a/package-lock.json +++ b/package-lock.json @@ -92,8 +92,7 @@ "verdaccio": "^5.0.4" }, "engines": { - "node": ">=24.0.0", - "npm": "^8.0.0" + "node": ">=24.0.0" } }, "node_modules/@ampproject/remapping": { @@ -14855,6 +14854,43 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-circus/node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/jest-circus/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jest-circus/node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", From 577f29012f9eb944000529b0f2d11372fdbb188b Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 18:51:12 +0200 Subject: [PATCH 28/29] remove console.log Signed-off-by: Thomas Poignant --- .../go-feature-flag/src/lib/go-feature-flag-provider.test.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts index bd266197b..d06300586 100644 --- a/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts +++ b/libs/providers/go-feature-flag/src/lib/go-feature-flag-provider.test.ts @@ -968,10 +968,6 @@ describe('GoFeatureFlagProvider', () => { jest.useRealTimers(); let callCount = 0; fetchMock.mockIf(/^http:\/\/localhost:1031\/v1\/flag\/configuration/, async (request) => { - // read headers in the request - const headers = request.headers; - console.log('headers', headers.get('If-None-Match')); - callCount++; if (callCount <= 1) { return { From 312fc00c467ef8159ec59d72a3f9c0d485e8ec6c Mon Sep 17 00:00:00 2001 From: Thomas Poignant Date: Tue, 26 Aug 2025 18:51:22 +0200 Subject: [PATCH 29/29] fix warning Signed-off-by: Thomas Poignant --- .../go-feature-flag/src/lib/service/api.test.ts | 8 ++++---- .../go-feature-flag/src/lib/testutil/mock-fetch.ts | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/libs/providers/go-feature-flag/src/lib/service/api.test.ts b/libs/providers/go-feature-flag/src/lib/service/api.test.ts index bca71b27c..f6c928643 100644 --- a/libs/providers/go-feature-flag/src/lib/service/api.test.ts +++ b/libs/providers/go-feature-flag/src/lib/service/api.test.ts @@ -48,9 +48,9 @@ describe('GoFeatureFlagApi', () => { await api.retrieveFlagConfiguration(); const request = mockFetch.getLastRequest(); - expect(request!.url).toBe('http://localhost:8080/v1/flag/configuration'); - expect(request!.options.method).toBe('POST'); - expect(request!.options.body).toBe(JSON.stringify({ flags: [] })); + expect(request?.url).toBe('http://localhost:8080/v1/flag/configuration'); + expect(request?.options.method).toBe('POST'); + expect(request?.options.body).toEqual(JSON.stringify({ flags: [] })); }); it('should include API key in authorization header when provided', async () => { @@ -64,7 +64,7 @@ describe('GoFeatureFlagApi', () => { await api.retrieveFlagConfiguration(); const request = mockFetch.getLastRequest(); - expect(request!.options.headers).toHaveProperty('Authorization', 'Bearer my-api-key'); + expect(request?.options.headers).toHaveProperty('Authorization', 'Bearer my-api-key'); }); it('should not include authorization header when API key is not provided', async () => { diff --git a/libs/providers/go-feature-flag/src/lib/testutil/mock-fetch.ts b/libs/providers/go-feature-flag/src/lib/testutil/mock-fetch.ts index 764261bd7..7405142d8 100644 --- a/libs/providers/go-feature-flag/src/lib/testutil/mock-fetch.ts +++ b/libs/providers/go-feature-flag/src/lib/testutil/mock-fetch.ts @@ -67,13 +67,23 @@ export class MockFetch { // Check if we have a specific response for this URL if (this.responses.has(url)) { - return this.responses.get(url)! as unknown as Response; + const response = this.responses.get(url); + if (typeof response === 'function') { + // Allow for dynamic response functions (for advanced mocking) + return (response as any)(url, options) as Response; + } + return response as unknown as Response; } // Check if we have a response by status code const statusMatch = url.match(/(\d{3})/); if (statusMatch && this.responses.has(statusMatch[1])) { - return this.responses.get(statusMatch[1])! as unknown as Response; + const response = this.responses.get(statusMatch[1]); + if (typeof response === 'function') { + // Allow for dynamic response functions (for advanced mocking) + return (response as any)(url, options) as Response; + } + return response as unknown as Response; } // Check if we have a response by status code in the responses map