spotify / spotify/confidence-resolver

Consider a MaterializingResolver compositional layer for local resolver stacks

Open
#308 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Rust
Stars
16
Forks
14
Avg merge
2d 7m
Merged PRs (30d)
40

Description

Context

The local resolver providers use a compositional pattern: WasmResolver → RecoveringResolver → PooledResolver. Materialization suspend/resume logic currently lives in the provider/caller layer across all implementations (Go, Java).

Suggestion

Add a MaterializingResolver as a composable layer in the resolver stack, wrapping the pooled resolver and a MaterializationStore:

WasmResolver → RecoveringResolver → PooledResolver → MaterializingResolver

This would apply to all providers that use the compositional pattern.

Benefits
  • Single responsibility — each layer does exactly one thing; the provider focuses on OpenFeature lifecycle (init, shutdown, scheduling)
  • Testability — materialization suspend/resume can be tested in isolation without standing up the full provider
  • Reusability — the resolver stack becomes self-contained and usable outside the provider (e.g. proxy services like FlagResolverService)
  • Consistency — materialization handling is defined once per language rather than duplicated across different callers
Trade-offs
  • Adds one more layer to the composition chain
  • The LocalResolver interface stays materialization-unaware — the MaterializingResolver handles ResolveProcessResponse suspend/resume internally and exposes a simpler resolve contract to callers

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

The issue names no files or tests. Start by locating the Go and Java local resolver providers, their PooledResolver composition, and the existing MaterializationStore and suspend/resume handling. Compare those paths before deciding whether the proposed MaterializingResolver can be shared; done means an agreed design and implementation that preserves the described resolver behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
go, java, rust
Domain
backend, backend-api-design
Issue type
Refactor
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.