github Effect-TS/effect effect@4.0.0-rc.118

Patch Changes

  • #8367 f75468a Thanks @Marve10s! - Add Arbitrary.configureGlobal to set default options for property checking and sampling, including the run count used by @effect/vitest. Explicit per-call options take precedence; passing an empty object restores the built-in defaults.

  • #8543 34cc788 Thanks @front-depiction! - Fix missed updates through stale AtomRegistry nodes, premature dependency release, leaked superseded builds, and failed observed builds that never recover.

  • #8421 eb02cbb Thanks @danieljvdm! - Defer Atom.swr stale refreshes until after reads, skipping them if the source becomes fresh or the atom is disposed. One-shot unmounted reads no longer refresh stale sources after disposal.

  • #8534 4bb949e Thanks @tim-smart! - Check identity authorization before resolving unencrypted event-log session bindings

  • #8353 b409e3f Thanks @tim-smart! - Make Effect.awaitAllChildren interruptible while it waits for child fibers.

  • #8510 4093507 Thanks @tim-smart! - Fix Cache.get retaining zero-TTL lookup results, which could evict live entries.

  • #8339 325e0fb Thanks @tim-smart! - Add data-last forms for selected safe Queue operations and selected Option, TxSemaphore, and AsyncResult APIs

  • #8503 e54211a Thanks @marbemac! - Cause.pretty and Cause.prettyErrors now restore Error.stackTraceLimit when formatting an error throws, instead of leaving it at 1 for the rest of the process.

  • #8413 0c6c2de Thanks @front-depiction! - Cause.squash no longer allocates intermediate arrays to pick the first failure or defect.

  • #8371 cdeccc7 Thanks @front-depiction! - Fix asymmetric Chunk.makeEquivalence comparisons on sparse arrays. Avoid redundant copies in Chunk and Array.dedupeWith, and balance Chunk.flatMap concatenations.

  • #8504 254fcc1 Thanks @IMax153! - Fix the CLI lexer to treat negative numbers such as -3.70 as values instead of short options, so --lon -3.70 parses correctly

  • #8474 bd14b64 Thanks @tim-smart! - Scope.closeUnsafe now requires a Scope.Closeable, matching Scope.close. Use a scope created by Scope.make or Scope.fork; a plain Scope.Scope cannot be closed directly.

  • #8473 37064fd Thanks @tim-smart! - Scope.close now requires a Scope.Closeable. Use a scope created by Scope.make or Scope.fork; a plain Scope.Scope cannot be closed directly.

  • #8542 702c34e Thanks @Marve10s! - Avoid retaining completed request ids when MessageStorage is disabled. Without storage, redelivering a completed request id now runs the request again instead of failing with AlreadyProcessingMessage.

  • #8454 7ef0ce6 Thanks @front-depiction! - Delay copying a derived Context's base until it has been read at least as many times as its size (with a minimum of eight), avoiding full copies for short-lived contexts.

  • #8339 325e0fb Thanks @tim-smart! - TxPriorityQueue.fromIterable(order)(iterable) passed its arguments to the implementation in the wrong order and produced a queue of undefined values; the data-first form was unaffected.

  • #8414 cdec5ef Thanks @front-depiction! - Cache named time zones by the requested id as well as the Intl-resolved id, avoiding repeated formatter construction for aliases. Zones still report the Intl-resolved id.

  • #8386 f9179cb Thanks @front-depiction! - Clean up rendered error stacks for common Effect callbacks and avoid per-step closure allocations in several combinators on V8.

    Effect.flatMap callbacks now receive only the value, without internal fiber/exit arguments or an internal this receiver.

  • #8442 c760e1e Thanks @front-depiction! - Avoid allocating a closure context for each struct property and array element during sequential Schema traversal.

  • #8354 1b4461e Thanks @tim-smart! - Move unstable modules from effect/unstable/* to effect/* and remove the old export paths. Drop the unstable segment from imports. These APIs remain @stability unstable.

    Move Arbitrary to the top level and update @effect/vitest to use the new entrypoint. Replace imports from effect/arbitrary or effect/arbitrary/Arbitrary with import { Arbitrary } from "effect" or import * as Arbitrary from "effect/Arbitrary".

  • #8362 5709ef6 Thanks @xia-chao! - Add type guards for HttpBodyError, CookiesError, MultipartError, and NdjsonError.

  • #8475 6b84149 Thanks @mugnivenko! - Annotate Config.fail return type as Config<never>, so it composes with Config.orElse without widening the result to Config<unknown>

  • #8469 508c70b Thanks @Marve10s! - Honor startImmediately: false in FiberHandle.run, FiberMap.run, and FiberSet.run.

  • #8443 382992f Thanks @front-depiction! - Reduce the memory each fiber retains: the type brand now lives on the prototype, Effect.callback no longer binds its registration, and Fiber.joinAll no longer keeps a cancel closure per joined fiber.

  • #8427 83d7c95 Thanks @front-depiction! - Preserve the original failure or interruption when an onExit finalizer throws synchronously.

  • #8535 6bf2eb7 Thanks @BleedingDev! - Build FindMyWay route params without new Function, avoiding string code generation in environments with CSP restrictions.

  • #8556 ccade14 Thanks @Marve10s! - Process atom writes queued by batch commit listeners instead of dropping them.

  • #8150 b8d14d3 Thanks @Tyagiquamar! - Fix Formatter.formatJson to include name and message and preserve enumerable properties when stringifying Error instances without toJSON.

    import { Formatter } from "effect"
    
    Formatter.formatJson(new Error("boom")) // now `{"name":"Error","message":"boom"}`, previously `{}`
  • #8359 8fca194 Thanks @gcanti! - Fix Number.remainder for decimal operands whose scaled coefficients exceed the safe integer range, preserving the exact value of integer operands. This also prevents Schema.isMultipleOf from accepting or rejecting large values incorrectly.

  • #8459 34e09be Thanks @gcanti! - Align JSON Schema imports with Unicode string semantics by counting code points for string length keywords and applying regular expression patterns in ECMAScript Unicode mode.

  • #8415 97afa37 Thanks @front-depiction! - Reduce allocations in Graph traversals: neighbors / successors / predecessors deduplicate without an intermediate Set for typical degrees, and unweightedDistances, astar and allShortestPaths no longer allocate a closure or predecessor record per visited node or relaxation.

  • #8360 321bae6 Thanks @tim-smart! - Improve hash composition, number hashing, cyclic equality, native collection comparison, and HashMap hashing. Fix invalid caches and referential MutableHashMap lookups. Hash values may change.

  • #8572 fb718d3 Thanks @tim-smart! - Add per-slot HttpApi parse options for params, query, headers, payload, success and error codecs. Each slot falls back to ParseOptions when unset. Set HeadersParseOptions to {} to keep strict body parsing without rejecting transport headers.

  • #8477 ccd3440 Thanks @tim-smart! - Build each HttpRouter entrypoint with a fresh router in a forked layer memo map. Routes on separate servers and handlers no longer leak into each other.

    Breaking changes:

    • Routes registered on a router provided by the app itself (for example, via Layer.provide(HttpRouter.layer)) are not served; the entrypoint serves its own router. For RPC, put the protocol and its handlers in the app passed to serve, for example HttpRouter.serve(RpcLayer.pipe(Layer.provideMerge(RpcServer.layerProtocolHttp({ path: "/rpc" })))).
    • Layers first built inside an entrypoint are private to it. Providing the same stateful service to both the app and a sibling layer can build it twice depending on build order. Provide services that must be shared outside the entrypoint; services already built in the parent memo map are reused.
  • #8385 107dbec Thanks @front-depiction! - Fix interrupted Layer memoization so waiting and later requesters receive the interrupted build's exit instead of hanging, and shared layers are released when scopes close. Correct MemoMap.get observer accounting for effects run twice or never run.

  • #8511 af510e8 Thanks @tim-smart! - Skip LayerMap preloading for keys with a zero idle TTL. With the default TTL, preload failures now surface on first use; set a non-zero idleTimeToLive to retain eager validation.

  • #8453 537cd82 Thanks @front-depiction! - Reduce allocations per yield* in Effect.gen, Option.gen and Result.gen, and per Effect.fn call.

    Utils.SingleShotGen now serves as its own completion result and is no longer an IterableIterator: it only implements next, and its self field has been removed.

  • #8512 ff554ae Thanks @tim-smart! - Run Scope.close finalizers uninterruptibly so interruption cannot abandon remaining cleanup, including when closing a ManagedRuntime.

  • #8528 9a5a383 Thanks @tim-smart! - Wait for managed fibers and their cleanup to finish before releasing layer resources when disposing a ManagedRuntime.

  • #8439 d2f3547 Thanks @front-depiction! - Stop allocating closures on every Effect.match and Effect.matchCause call.

  • #8507 25d9e47 Thanks @IMax153! - Clarify the McpServer.toolkit error when a tool's parameters are not an object schema.

  • #8505 372a45d Thanks @IMax153! - Fix stdio MCP servers rejecting pings before initialization when a stateful protocol is configured, including when a stateless protocol is listed first. These pings now return an empty result without creating a session.

  • #8508 5e9fd25 Thanks @IMax153! - Report all parameter validation errors for MCP tools in a single response, including missing or invalid fields and, for strict tools, unknown keys.

  • #8465 c85c8c3 Thanks @izakfilmalter! - Preserve tool annotation titles in MCP tools/list responses for the 2025-06-18 and 2025-11-25 protocol revisions, alongside the top-level title and behavioral hints.

  • #8552 b501557 Thanks @Floriferous! - Report declared MCP tool failures with empty messages using their encoded value. Handler execution errors now return isError results on protocol version 2025-11-25 and -32603 Internal error on older versions, instead of -32602 Invalid params.

  • #8380 35ef06c Thanks @front-depiction! - Fix Metric series key collisions, duplicate series for empty attributes, and updates lost after a registry is cleared. Reuse series keys when contextual attributes are unchanged.

  • #8420 d6cc5d9 Thanks @danieljvdm! - Emit parts buffered while reading a multipart file before pulling more input.

  • #8450 83b7b1f Thanks @front-depiction! - Fix MutableList.prependAll with empty input corrupting the list and breaking subsequent takes or appends.

  • #8447 f05fe36 Thanks @front-depiction! - Release consumed slots in a growing MutableList bucket, and pass list indices rather than bucket offsets to MutableList.filter predicates.

  • #8448 1fd49d4 Thanks @front-depiction! - Fix MutableList.takeN leaving a drained bucket at the head when it stops at a bucket boundary. This also prevents Queue.takeN from making subsequent messages inaccessible after an offerAll boundary.

  • #8340 c79088d Thanks @fubhy! - Add family-aware internet address and multicast interface types to NetAddress

  • #8407 0cbb457 Thanks @tim-smart! - Store NetAddress IPv4 and IPv6 addresses as numbers instead of a Uint8Array, making construction, Equal and Hash cheaper, especially on Deno.

  • #8545 8202a6e Thanks @hsyntax! - Mark OpenAPI parameters and response headers as optional when their encoded key is optional, such as keys using Schema.withDecodingDefaultKey or Schema.withDecodingDefault. Generated documents previously marked these keys as required, even though they can be absent on the wire.

  • #8547 8d070c3 Thanks @gcanti! - Generate OpenAPI parameters and response headers from their encoded object representation while preserving property annotations.

  • #8551 0cf7655 Thanks @hsyntax! - Preserve encoded string literals and exportable checks such as pattern in OpenAPI schemas for HttpApiSchema.asText() bodies. Text bodies keep their string type even when their schemas are opaque or referenced components.

  • #8522 d470d54 Thanks @FNDEVVE! - Drain OTLP export response bodies before completing or retrying each request.

  • #8395 2121472 Thanks @tim-smart! - Prevent lost permits when a partitioned semaphore acquisition is interrupted, and keep competing immediate takes from acquiring the same permit.

  • #8558 4113bc7 Thanks @fe-franco! - Fail @effect/sql-pg transactions when PostgreSQL returns ROLLBACK for COMMIT after a caught statement error. SqlClient.make accepts a commit effect so drivers can inspect the result.

  • #8468 a41a441 Thanks @lloydrichards! - In MCP protocols that omit string structuredContent, return plain text for toolkit and hand-written tool results whose single text block is an exact JSON mirror of that string.

  • #8337 3af6bd0 Thanks @mugnivenko! - Add PlatformError.isPlatformError guard

  • #8502 67ee3b8 Thanks @elizabethcheng! - Use a consistent row-lock order for PostgreSQL shard lease acquisition, refresh, and bulk release when shardLockDisableAdvisory is enabled.

  • #8540 e8df3d8 Thanks @Marve10s! - Treat an Infinity capacity passed to PubSub as unbounded.

  • #8345 1dbc4c3 Thanks @xia-chao! - Add PubSub.isPubSub, matching Queue.isQueue and TxPubSub.isTxPubSub.

  • #8449 80d5adb Thanks @front-depiction! - Fix a race where interrupting a waiting PubSub subscriber could swallow a later message, or interrupting a backpressured publisher could still publish when space became available.

  • #8569 aa430d8 Thanks @tim-smart! - Batch takes drain remaining messages when a queue closes, even below the requested minimum. Later takes receive the terminal error.

  • #8568 24f7d32 Thanks @tim-smart! - Withdraw pending Queue.offer and Queue.offerAll values when their producer is interrupted after Queue.end or Queue.fail. The queue can finish closing once those offers are withdrawn.

  • #8412 f4dd1ae Thanks @front-depiction! - Fix lost wake-ups in Queue when a fiber yields between checking for a message or capacity and registering its waiter.

    Queue.offer on a zero-capacity dropping queue now hands the message to a waiting taker, matching offerUnsafe and offerAll.

  • #8472 0981d01 Thanks @tim-smart! - Fix Queue takers missing offers that arrive while they are registering.

  • #8514 0a29ca6 Thanks @tim-smart! - Retry failed background pool acquisitions when borrowed, rather than passing stale errors to later queries. Callers awaiting their own failed connection still receive its error.

  • #8397 17810b4 Thanks @tim-smart! - Close the interruption gap before scope and cache cleanup registration.

  • #8365 62b2ea9 Thanks @tim-smart! - Rename the HTTP API entry point from effect/httpapi to effect/http-api and remove the old export path. Runtime TypeIds under ~effect/httpapi/*, service keys under effect/httpapi/*, and the reserved effect/httpapi/stream/failure SSE event name now use http-api as well.

  • #8378 4e4fa8b Thanks @gcanti! - Rename range checks so their subject comes last: Schema.isBetweenLength, Schema.isBetweenCodePoints, Schema.isBetweenSize, and Schema.isBetweenProperties. Also rename the string checks to the grammatical Schema.isStartingWith, Schema.isEndingWith, and Schema.isIncluding. Update the corresponding SchemaRepresentation.*Reviver exports and persisted effect/schema/... check IDs to use the new names.

  • #8533 3495bd8 Thanks @tim-smart! - Keep the source result type for Effect.repeat with times or schedule, even when while or until is a refinement. Bounded repetition may finish before the predicate stops it, so callers relying on the previous narrowed type must check the result.

  • #8390 b3032f0 Thanks @front-depiction! - Fix interrupt-time resource leaks:

    • Pool.get, Pool.use and RcRef.get register cleanup before they can be interrupted.
    • RcRef and RcMap finish closing expired resources even if their idle fibers are interrupted.
    • ScopedRef closes in-flight replacements with their owner. make, fromAcquire and set now interrupt if the owning scope has closed.
  • #8541 d26a913 Thanks @Marve10s! - Skip malformed ndjson lines and non-object JSON-RPC messages so later requests still decode. Handle non-string notification methods without throwing.

  • #8437 93f826a Thanks @front-depiction! - Stop Effect.map, Effect.tap, Effect.exit, Effect.match and Effect.matchCause allocating a success Exit on every step.

  • #8519 330b747 Thanks @tim-smart! - Add Schedule.once, a schedule that recurs immediately once and outputs void.

  • #8441 b808b5d Thanks @front-depiction! - Skip generator allocation for synchronous array and tuple parsing.

  • #8440 2575fcc Thanks @front-depiction! - Avoid rebuilding the parser wrappers on every SchemaParser.asserts call.

  • #8364 287273c Thanks @gcanti! - Add Schema.isMinCodePoints, Schema.isMaxCodePoints, and Schema.isBetweenCodePoints to validate string lengths by Unicode code point count, with JSON Schema export, representation revivers, and arbitrary generation support.

  • #8430 0860c0c Thanks @front-depiction! - Speed up schema decoder generation for deeply nested schemas.

  • #8451 8d27554 Thanks @front-depiction! - Speed up Schema code generation for nested schemas, especially when a child cannot be generated.

  • #8429 c2e810c Thanks @front-depiction! - Memoize recursive Schema.toEquivalence compilation and remove unused path tracking, reducing work and retained memory for deeply nested values.

  • #8423 35ecbb9 Thanks @fml09! - Ignore non-enumerable own properties when checking schema excess properties, allowing Schema.TaggedError responses to encode under strict HttpApi.ParseOptions. Symbol index signatures now skip non-enumerable entries during decoding and encoding, matching string index signatures; make those properties enumerable or declare them explicitly in a Struct to retain them.

  • #8436 b442528 Thanks @front-depiction! - Fix Schema.toFormatter compiling a recursive schema again at every nesting level of the formatted value.

  • #8482 16623c7 Thanks @gcanti! - Improve Schema.toJsonSchemaDocument export of built-in checks. String code-unit length checks now use safe code-point bounds, regex and literal checks avoid patterns that would reject accepted values under Unicode matching, and cardinality checks reject non-finite bounds instead of emitting invalid schemas. Custom check exporters can mark a fragment as approximate by returning [schema, true]; oneOf then falls back to anyOf, and approximate record-key patterns are not used as patternProperties selectors.

    Built-in checks whose exported constraints can be looser than their runtime checks, including approximations that predate this change:

    Check Approximation Change in this PR
    isPattern The default applies to direct isPattern checks: the pattern is omitted unless the RegExp uses the Unicode flag and its other flags are d, g, or y. Sticky patterns are anchored at the start. Built-in checks may override the default when their Unicode semantics are known to be safe or intentionally loose. Updated export and approximation metadata.
    isStartingWith A trailing high surrogate is removed from the exported prefix; if nothing remains, the pattern is omitted. Other prefixes retain an exact pattern. Updated export.
    isEndingWith A leading low surrogate is removed from the exported suffix; if nothing remains, the pattern is omitted. Other suffixes retain an exact pattern. Updated export.
    isIncluding A leading low surrogate or trailing high surrogate is removed from the exported substring; if nothing remains, the pattern is omitted. Other substrings retain an exact pattern. Updated export.
    isMinLength On strings, the exported minimum is Math.ceil(minLength / 2) code points. Bounds of 0 and 1 are exact; array bounds are unchanged. Updated export; rejects non-finite bounds.
    isMaxLength On strings, the exported maximum counts code points rather than UTF-16 code units. A bound of 0 is exact; array bounds are unchanged. Updated type and union handling; rejects non-finite bounds.
    isBetweenLength On strings, combines the lower- and upper-bound approximations above. Array bounds are unchanged. Updated export; rejects non-finite bounds.
    isUppercased, isLowercased Patterns exclude only ASCII letters of the opposite case. Non-ASCII characters that change under JavaScript casing can still pass JSON Schema validation. Marked as approximate.
    isCapitalized, isUncapitalized Patterns exclude only ASCII letters of the opposite case at the start. Non-ASCII characters that change under JavaScript casing can still pass JSON Schema validation. Marked as approximate.
    isInt Exports type: "integer" without the safe-integer bounds required by the runtime check. Marked as approximate.
    isMinProperties, isMaxProperties, isBetweenProperties Counts match for parsed JSON objects, but JSON Schema property-count keywords do not constrain arrays, which these object-typed checks can also receive. Rejects non-finite bounds and tracks non-object use.
    isPropertyNames Inherits any approximation in the key schema. JSON Schema's propertyNames also does not constrain array keys. Propagates approximation from the key schema.
    isMinSize, isMaxSize, isBetweenSize The size constraint is omitted. Rejects non-finite bounds and marks omission approximate.
    isUniqueKey Uniqueness of tuple keys is omitted. Omission is now tracked as approximate.
    Comparison and range checks for Date, BigInt, and BigDecimal Their bounds are omitted from JSON Schema export. Omission is now tracked as approximate.

    Length checks on objects with a length property also omit that constraint. Code-point checks map directly to JSON Schema length bounds and are not approximate on strings; this PR adds rejection of non-finite bounds to those checks as well.

  • #8435 5521209 Thanks @front-depiction! - Build the detailed traversal for structs without index signatures only when needed, avoiding unused parser allocations under default parse options.

  • #8434 477394d Thanks @front-depiction! - Split compiled tuple rest elements once per schema instead of on every equivalence or formatter call.

  • #8428 3036241 Thanks @front-depiction! - Stop Schema unions rebuilding their runtime-type candidate list on every decode. The list is now built once per union and reused.

  • #8418 ca422fd Thanks @front-depiction! - Run all scope finalizers even when one throws synchronously, and preserve the original failure when closing the scope.

  • #8457 4f5f866 Thanks @front-depiction! - Forked scopes detach from their parent on close, even if cleanup throws or is interrupted, without a bookkeeping finalizer. The readonly Scope.parent field exposes the parent scope.

  • #8396 54ff4f2 Thanks @tim-smart! - Shared ScopedCache lookups survive individual caller interruption. If the last waiter leaves while a lookup is pending, it is interrupted and its scope closed. Missing-key lookups, including refresh, now run in daemon fibers like Cache, so children forked by a lookup end with it rather than with the caller.

  • #8488 c8a9f85 Thanks @gcanti! - - Allow Config.withDefault and Config.option to recover Config.all groups with missing children even when other children have values. Validation and source errors still propagate. A group default replaces the entire group; put defaults on individual children to preserve supplied values, or use Config.schema(Schema.Struct(...)) to reject incomplete objects.

    • Make Config.orElse adopt the fallback's result, allowing a later default or option to handle an absent fallback even after invalid input was recovered.
    • Return None for ShardingConfig.runnerListenAddress when listenHost is absent and listenPort is valid. Supply listenHost to configure the listen address.
  • #8433 0c0aa5e Thanks @front-depiction! - Avoid redundant context lookups for the tracer and tracing-enabled flag when creating spans.

  • #8356 d426feb Thanks @tim-smart! - Split the encoding API into effect/encoding/Base64, effect/encoding/Base64Url, effect/encoding/Hex, and effect/encoding/EncodingError. The former effect/Encoding module has been removed; migrate each helper to its format module and use the shared error entrypoint to name or narrow encoding failures.

    Two migrations need special attention: randomHex is now Hex.random, and the runtime value of EncodingErrorTypeId changed from ~effect/Encoding/EncodingError to ~effect/encoding/EncodingError.

  • #8529 2a8f5c7 Thanks @tim-smart! - Roll back SQLite transactions left open by a failed COMMIT, such as a deferred foreign key violation, so the connection can be reused.

  • #8445 6332de2 Thanks @front-depiction! - Keep long chains of Stream.concat linear in their length.

  • #8416 c00c8ff Thanks @front-depiction! - Fix Stream.forever and Stream.repeat slowing down and retaining pull layers with each repetition by using a constant-depth loop.

  • #8411 aa7de26 Thanks @front-depiction! - Fix concurrent Stream.mapEffect hanging when the mapping function throws synchronously. Run the function inside its forked fiber so the throw is reported as a defect.

  • #8410 6f44ca0 Thanks @front-depiction! - Fix Stream.broadcast, Stream.broadcastN, Stream.share and Stream.toPubSubTake subscribers that never end.

    The upstream's exit was published as an ordinary message, so a subscriber that arrived after it, or whose bounded dropping PubSub was full, waited forever. The new PubSub.end ends a PubSub with a final message that every subscriber, current or future, receives after draining its buffered messages, and the broadcast operators now use it for the exit.

  • #8405 98792c3 Thanks @tim-smart! - Add a probabilityPrecision option to DecisionModel.make that accepts and rescales the sum drift caused by a provider rounding each probability. OpenRouter and TypeSafe decision models set it to two decimals, so rounded distributions such as 0.02 / 0.93 / 0.04 no longer fail with InvalidOutputError. Providers that do not opt in keep strict sum validation.

  • #8531 1f76040 Thanks @tim-smart! - Toolkit.handle now requires tool handler services on the outer Effect as well as the returned Stream. If a parameter decoder needs a service, provide it when running the outer handle Effect, not only when consuming the Stream.

  • #8530 cf7cfd6 Thanks @tim-smart! - Expose AiError in the error type of streams returned by Toolkit.handle in return mode. Result-encoding failures already fail the stream at runtime; consumers that treated the extracted stream as infallible must handle or propagate that error.

  • #8387 6bc0eee Thanks @front-depiction! - End tracing spans and restore fiber context when interruption occurs as a traced region starts. Ensure HttpMiddleware.tracer ends its span on interruption.

  • #8370 88b79d7 Thanks @front-depiction! - Build Mime lookup tables on first lookup so bundlers can drop the MIME data when no lookup is used.

  • #8361 db7b69e Thanks @xia-chao! - Add isNonEmpty predicates to TxHashSet, TxPubSub, and TxQueue.

  • #8452 43bbb25 Thanks @front-depiction! - Fix Effect.tx never committing a TxRef write of -0 over 0, and only wake retry waiters for refs a transaction wrote, not refs it only read.

  • #8372 6ecd4b3 Thanks @front-depiction! - Fix Effect.txRetry blocking forever when a TxRef the transaction read was changed by another commit while the transaction was suspended. The transaction now reruns immediately instead of waiting for a later change.

  • #8348 7b81a95 Thanks @xia-chao! - Add TxChunk.isTxChunk, a type guard for TxChunk values. The other transactional data types already expose an equivalent isTx* guard.

  • #8446 dd8990b Thanks @front-depiction! - TxPriorityQueue.offerAll merges new values into the sorted queue instead of re-sorting existing values.

  • #8334 19835f2 Thanks @nikelborm! - Added Config.flatMap

  • #8455 1a3eb9e Thanks @henningpokriefke! - Derive workflow execution IDs from a length-prefixed workflow tag and idempotency key.

Don't miss a new effect release

NewReleases is sending notifications on new releases.