feat: add keyFor for global symbol support#188
Merged
Conversation
This enables compatibility with React Server Components, which require global symbols for serialization between server and client boundaries.
Gnuk
approved these changes
Apr 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This enables compatibility with React Server Components, which require global symbols for serialization between server and client boundaries.
📖 Context
When using piqure with Next.js App Router (React Server Components), injection keys created with key() cannot be passed from Server Components to Client Components.
React Server Components can only serialize global symbols. Local symbols created with Symbol() fail with:
This happens because key() uses Symbol(description), which creates a unique local symbol on each call.
✅ Solution
Add
keyFor()function that usesSymbol.for()to create global symbols. These symbols are registered in a global registry and can be serialized across server/client boundaries.🤔 Why not change key() directly?
Symbol.for()uses a global registry, which means any code knowing the description can access the same symbol. This reduces isolation compared to Symbol(). Keeping both functions lets users choose based on their environment:key(): strict isolation, for non-RSC environmentskeyFor(): global symbols, required for RSC compatibility📸 Screenshot