Effect 3.19 has been released! This release includes a number of new features and improvements. Here’s a summary of what’s new:
@effect/cluster improvements
The @effect/cluster package has been significantly improved. The cluster system no longer requires a Shard Manager, and instead relies on the RunnerStorage service to track runner state.
To migrate, remove any Shard Manager deployments and use the updated layers in @effect/platform-node or @effect/platform-bun.
Breaking Changes
ShardManagermodule has been removedEntityNotManagedByRunnererror has been removed- Shard locks now use database advisory locks, which requires stable sessions for database connections. This means load balancers or proxies that rotate connections may cause issues.
@effect/platform-node/NodeClusterSocketRunneris now@effect/cluster/NodeClusterSocket@effect/platform-node/NodeClusterHttpRunneris now@effect/cluster/NodeClusterHttp@effect/platform-bun/BunClusterSocketRunneris now@effect/cluster/BunClusterSocket@effect/platform-bun/BunClusterHttpRunneris now@effect/cluster/BunClusterHttp
New Features
RunnerHealth.layerK8shas been added, which uses the Kubernetes API to track runner health and liveness. To use it, you will need a service account with permissions to read pod information.
HashRing module
An experimental HashRing module has been added to the Effect core library.
This module can be used to consistently distribute keys across a set of nodes.
import { Data, HashRing, PrimaryKey } from "effect"
// The "nodes" in the hash ring need to implement PrimaryKeyclass Host extends Data.Class<{ ip: string}> { [PrimaryKey.symbol]() { return this.ip }}
// Make an empty hash ringconst ring = HashRing.make<Host>()
// Add some nodes to the ringHashRing.add(ring, new Host({ ip: "192.168.1.1" }))HashRing.add(ring, new Host({ ip: "192.168.1.2" }))HashRing.add(ring, new Host({ ip: "192.168.1.3" }))
// Get the node responsible for a given keyconst host = HashRing.get(ring, "my-key")!Effect.fn.Return
A new Effect.fn.Return type utility has been added to allow typing returns on Effect.fn.
import { Effect } from "effect"
const myfn = Effect.fn("myfn")(function* (n: number): Effect.fn.Return<string> { return `Number is ${n}`})Other changes
Graphmodule updates have been backported from Effect v4@effect/sql-pgnow uses the “pg” npm library as its backend
There were several other smaller changes made. Take a look through the CHANGELOG to see them all: CHANGELOG.
Don’t forget to join our Discord Community to follow the last updates and discuss every tiny detail!