///
/**
* Runs many effects against services built once from a `Layer`.
*
* A `ManagedRuntime` builds the services from a layer, keeps those services
* available for repeated effect runs, and releases acquired resources when it
* is disposed. This module includes the runtime type, a constructor, a guard,
* and runners for connecting Effect programs to JavaScript entry points such as
* promises, callbacks, and synchronous code.
*
* @stability stable
* @since 2.0.0
*/
import * as Context from "./Context.ts";
import * as Effect from "./Effect.ts";
import * as Exit from "./Exit.ts";
import * as Fiber from "./Fiber.ts";
import * as Layer from "./Layer.ts";
import * as Scope from "./Scope.ts";
declare const TypeId = "~effect/ManagedRuntime";
/**
* Checks whether the provided argument is a `ManagedRuntime`.
*
* **When to use**
*
* Use to narrow an unknown value before treating it as a `ManagedRuntime`.
*
* **Details**
*
* The guard checks the internal `ManagedRuntime` marker property. It does not
* build the layer or inspect the runtime's services.
*
* **Gotchas**
*
* Disposed runtimes still carry the marker, so this guard does not prove the
* runtime is still usable.
*
* @see {@link make} for creating managed runtimes this guard recognizes
*
* @stability stable
* @category guards
* @since 3.9.0
*/
export declare const isManagedRuntime: (input: unknown) => input is ManagedRuntime;
/**
* Type helpers associated with `ManagedRuntime`.
*
* **When to use**
*
* Use to reference type-level helpers for extracting managed runtime services
* and layer errors.
*
* @stability stable
* @since 3.4.0
*/
export declare namespace ManagedRuntime {
/**
* Extracts the services available from a `ManagedRuntime`.
*
* **When to use**
*
* Use to derive the service requirements provided by an existing
* `ManagedRuntime` type.
*
* @category utility types
* @since 3.4.0
*/
type Services> = [T] extends [ManagedRuntime] ? R : never;
/**
* Extracts the layer construction error type of a `ManagedRuntime`.
*
* **When to use**
*
* Use to derive the layer construction error type from an existing
* `ManagedRuntime` type.
*
* @category utility types
* @since 3.4.0
*/
type Error> = [T] extends [ManagedRuntime] ? E : never;
}
/**
* A runtime built from a layer that can execute effects requiring that layer's
* services.
*
* **When to use**
*
* Use as the reusable runtime value returned by `make` when application entry
* points or integration code need to run many effects against the same
* layer-built services.
*
* **Details**
*
* The runtime builds and caches its service context and owns the scope for
* resources acquired by the layer.
*
* **Gotchas**
*
* Dispose the runtime with `dispose` or `disposeEffect` when it is no longer
* needed.
*
* @see {@link make} for constructing a managed runtime from a layer
* @see {@link Layer.build} for lower-level scoped layer construction
*
* @stability stable
* @category models
* @since 2.0.0
*/
export interface ManagedRuntime {
readonly [TypeId]: typeof TypeId;
readonly memoMap: Layer.MemoMap;
readonly contextEffect: Effect.Effect, ER>;
readonly context: () => Promise>;
readonly scope: Scope.Closeable;
cachedContext: Context.Context | undefined;
/**
* Executes the effect using the provided Scheduler or using the global
* Scheduler if not provided
*
* **When to use**
*
* Use to fork an effect against this runtime's services and get the running
* fiber.
*/
readonly runFork: (self: Effect.Effect, options?: Effect.RunOptions) => Fiber.Fiber;
/**
* Executes the effect synchronously returning the exit.
*
* **When to use**
*
* Use when invoking this effectful method at the edges of your
* program.
*/
readonly runSyncExit: (effect: Effect.Effect) => Exit.Exit;
/**
* Executes the effect synchronously throwing in case of errors or async boundaries.
*
* **When to use**
*
* Use when invoking this effectful method at the edges of your
* program.
*/
readonly runSync: (effect: Effect.Effect) => A;
/**
* Executes the effect asynchronously, eventually passing the exit value to
* the specified callback.
*
* **When to use**
*
* Use when invoking this effectful method at the edges of your
* program.
*/
readonly runCallback: (effect: Effect.Effect, options?: (Effect.RunOptions & {
readonly onExit: (exit: Exit.Exit) => void;
}) | undefined) => (interruptor?: number | undefined) => void;
/**
* Runs the `Effect`, returning a JavaScript `Promise` that will be resolved
* with the value of the effect once the effect has been executed, or will be
* rejected with the first error or exception throw by the effect.
*
* **When to use**
*
* Use when invoking this effectful method at the edges of your
* program.
*/
readonly runPromise: (effect: Effect.Effect, options?: Effect.RunOptions) => Promise;
/**
* Runs the `Effect`, returning a JavaScript `Promise` that will be resolved
* with the `Exit` state of the effect once the effect has been executed.
*
* **When to use**
*
* Use when invoking this effectful method at the edges of your
* program.
*/
readonly runPromiseExit: (effect: Effect.Effect, options?: Effect.RunOptions) => Promise>;
/**
* Dispose of the resources associated with the runtime.
*
* **When to use**
*
* Use to release this runtime's layer resources from Promise-based code.
*
* **Details**
*
* Calls made while a disposal is in progress wait for it to finish.
*/
readonly dispose: () => Promise;
/**
* Dispose of the resources associated with the runtime.
*
* **When to use**
*
* Use with the `await using` syntax to automatically dispose the runtime
* when it goes out of scope.
*/
readonly [Symbol.asyncDispose]: () => Promise;
/**
* Dispose of the resources associated with the runtime.
*
* **When to use**
*
* Use to release this runtime's layer resources from an `Effect` workflow.
*
* **Details**
*
* Disposal runs uninterruptibly. Calls made while a disposal is in progress
* wait for it to finish, and interrupting a waiting call only stops the wait.
* Fibers started by this runtime, their child fibers, and the runtime's
* finalizers do not wait: the disposal interrupts or runs them, so waiting
* would deadlock.
*/
readonly disposeEffect: Effect.Effect;
}
/**
* Creates a `ManagedRuntime` from a layer.
*
* **When to use**
*
* Use to create a reusable runtime from a `Layer` for application entry points
* or integration code that runs many effects without rebuilding services.
*
* **Details**
*
* The layer is built lazily on first use and its context is cached for
* subsequent runs. Resources acquired by the layer are owned by the runtime and
* are released when `dispose` or `disposeEffect` is run. `options.memoMap` can
* be used to share layer memoization with other layer builds.
*
* **Gotchas**
*
* Dispose the runtime when it is no longer needed. A runtime cannot be reused
* after disposal.
*
* A failed layer build is also cached: subsequent runs return the same build
* failure without rebuilding the layer. For transient failures, retry inside
* the layer before passing it to `make`, or dispose the runtime and create a
* new one to attempt a fresh build.
*
* **Example** (Creating a managed runtime)
*
* ```ts import.meta.vitest
* import { Context, Effect, Layer, ManagedRuntime } from "effect"
*
* const notifications: Array = []
*
* class Notifications extends Context.Service Effect.Effect
* }>()("Notifications") {
* static readonly layer = Layer.succeed(this)({
* notify: Effect.fn("Notifications.notify")((message) =>
* Effect.sync(() => notifications.push(message))
* )
* })
* }
*
* const runtime = ManagedRuntime.make(Notifications.layer)
*
* const program = Effect.flatMap(
* Notifications,
* (_) => _.notify("Hello, world!")
* ).pipe(Effect.ensuring(runtime.disposeEffect))
*
* await runtime.runPromise(program)
* notifications // => ["Hello, world!"]
* ```
*
* @see {@link ManagedRuntime} for the returned runtime interface
* @see {@link Layer.MemoMap} for shared layer memoization
* @see {@link Layer.build} for lower-level scoped layer construction
*
* @stability stable
* @category constructors
* @since 2.0.0
*/
export declare const make: (layer: Layer.Layer, options?: {
readonly memoMap?: Layer.MemoMap | undefined;
} | undefined) => ManagedRuntime;
export {};
//# sourceMappingURL=ManagedRuntime.d.ts.map