t3-code-android-nightly/.repos/effect-smol/migration/fiberref.md
Julius Marminge 108e01746c
Upgrade Effect and Alchemy betas (#4643)
Prepare Relay production infrastructure for the PlanetScale PS_20 HA topology, upgrade Effect and Alchemy to compatible betas, reconcile migration state, and preserve patched MCP session termination behavior.\n\nCo-authored-by: codex <codex@users.noreply.github.com>
2026-07-27 16:21:02 +02:00

2.8 KiB

FiberRef: FiberRef → Context.Reference

In v4, FiberRef, FiberRefs, FiberRefsPatch, and Differ have been removed. Fiber-local state is now handled by Context.Reference — the same mechanism used for services with default values.

Built-in References

v3's built-in FiberRef values are now Context.Reference values exported from References and related modules.

v3 FiberRef v4 Reference
FiberRef.currentLogLevel References.CurrentLogLevel
FiberRef.currentMinimumLogLevel References.MinimumLogLevel
FiberRef.currentLogAnnotations References.CurrentLogAnnotations
FiberRef.currentLogSpan References.CurrentLogSpans
FiberRef.currentScheduler References.Scheduler
FiberRef.currentMaxOpsBeforeYield References.MaxOpsBeforeYield
FiberRef.currentTracerEnabled References.TracerEnabled
FiberRef.unhandledErrorLogLevel References.UnhandledLogLevel

Reading References

In v3, FiberRef.get retrieved the current value. In v4, references are services — yield* them directly.

v3

import { Effect, FiberRef } from "effect"

const program = Effect.gen(function*() {
  const level = yield* FiberRef.get(FiberRef.currentLogLevel)
  console.log(level)
})

v4

import { Effect, References } from "effect"

const program = Effect.gen(function*() {
  const level = yield* References.CurrentLogLevel
  console.log(level) // "Info" (default)
})

Scoped Updates (Effect.locally → Effect.provideService)

v3's Effect.locally set a FiberRef value for the duration of an effect. In v4, use Effect.provideService with the reference.

v3

import { Effect, FiberRef, LogLevel } from "effect"

const program = Effect.locally(
  myEffect,
  FiberRef.currentLogLevel,
  LogLevel.Debug
)

v4

import { Effect, References } from "effect"

const program = Effect.provideService(
  myEffect,
  References.CurrentLogLevel,
  "Debug"
)

Writing References

v3's FiberRef.set mutated the current fiber's ref value. In v4, references are set via Effect.provideService, which scopes the value to the provided effect.

v3

import { Effect, FiberRef } from "effect"

const program = Effect.gen(function*() {
  yield* FiberRef.set(FiberRef.currentMaxOpsBeforeYield, 500)
  // subsequent code sees maxOpsBeforeYield = 500
})

v4

import { Effect, References } from "effect"

const program = Effect.provideService(
  Effect.gen(function*() {
    const maxOps = yield* References.MaxOpsBeforeYield
    console.log(maxOps) // 500
  }),
  References.MaxOpsBeforeYield,
  500
)