/** * @since 1.0.0 */ import type * as Context from "effect/Context" import type * as Deferred from "effect/Deferred" import type * as Effect from "effect/Effect" import type * as Layer from "effect/Layer" import type * as Mailbox from "effect/Mailbox" import type * as Schema from "effect/Schema" import type * as Scope from "effect/Scope" import type * as Stream from "effect/Stream" import * as internal from "./internal/workerRunner.js" import type { WorkerError } from "./WorkerError.js" /** * @since 1.0.0 * @category models */ export interface BackingRunner { readonly run: ( handler: (portId: number, message: I) => Effect.Effect | void ) => Effect.Effect readonly send: ( portId: number, message: O, transfers?: ReadonlyArray ) => Effect.Effect readonly disconnects?: Mailbox.ReadonlyMailbox } /** * @since 1.0.0 * @category models */ export declare namespace BackingRunner { /** * @since 1.0.0 * @category models */ export type Message = readonly [request: 0, I] | readonly [close: 1] } /** * @since 1.0.0 * @category type ids */ export const PlatformRunnerTypeId: unique symbol = internal.PlatformRunnerTypeId /** * @since 1.0.0 * @category type ids */ export type PlatformRunnerTypeId = typeof PlatformRunnerTypeId /** * @since 1.0.0 * @category models */ export interface PlatformRunner { readonly [PlatformRunnerTypeId]: PlatformRunnerTypeId readonly start: (closeLatch: typeof CloseLatch.Service) => Effect.Effect, WorkerError> } /** * @since 1.0.0 * @category tags */ export const PlatformRunner: Context.Tag = internal.PlatformRunner /** * The worker close latch is used by platform runners to signal that the worker * has been closed. * * @since 1.0.0 * @category CloseLatch */ export interface CloseLatch { readonly _: unique symbol } /** * The worker close latch is used by platform runners to signal that the worker * has been closed. * * @since 1.0.0 * @category CloseLatch */ export const CloseLatch: Context.Reference> = internal.CloseLatch /** * @since 1.0.0 * @category CloseLatch */ export const layerCloseLatch: Layer.Layer = internal.layerCloseLatch /** * @since 1.0.0 * @category models */ export declare namespace Runner { /** * @since 1.0.0 * @category models */ export interface Options { readonly decode?: ( message: unknown ) => Effect.Effect readonly encodeOutput?: ( request: I, message: O ) => Effect.Effect readonly encodeError?: ( request: I, error: E ) => Effect.Effect } } /** * @since 1.0.0 * @category constructors */ export const make: ( process: (request: I) => Stream.Stream | Effect.Effect, options?: Runner.Options ) => Effect.Effect = internal.make /** * @since 1.0.0 * @category layers */ export const layer: ( process: (request: I) => Stream.Stream | Effect.Effect, options?: Runner.Options | undefined ) => Layer.Layer = internal.layer /** * @since 1.0.0 * @category models */ export declare namespace SerializedRunner { /** * @since 1.0.0 */ export type Handlers = { readonly [K in A["_tag"]]: Extract< A, { readonly _tag: K } > extends Schema.SerializableWithResult< infer S, infer _SI, infer _SR, infer A, infer _AI, infer E, infer _EI, infer _RR > ? ( _: S ) => | Stream.Stream | Effect.Effect | Layer.Layer | Layer.Layer : never } /** * @since 1.0.0 */ export type HandlersContext< Handlers extends Record) => any> > = | Exclude< { [K in keyof Handlers]: ReturnType extends Stream.Stream< infer _A, infer _E, infer R > ? R : never }[keyof Handlers], InitialContext > | InitialEnv /** * @since 1.0.0 */ type InitialContext< Handlers extends Record) => any> > = Handlers["InitialMessage"] extends ( ...args: ReadonlyArray ) => Layer.Layer ? A : never /** * @since 1.0.0 */ type InitialEnv< Handlers extends Record) => any> > = Handlers["InitialMessage"] extends ( ...args: ReadonlyArray ) => Layer.Layer ? R : never } /** * @since 1.0.0 * @category constructors */ export const makeSerialized: < R, I, A extends Schema.TaggedRequest.All, const Handlers extends SerializedRunner.Handlers >( schema: Schema.Schema, handlers: Handlers ) => Effect.Effect< void, WorkerError, PlatformRunner | Scope.Scope | R | SerializedRunner.HandlersContext > = internal.makeSerialized /** * @since 1.0.0 * @category layers */ export const layerSerialized: < R, I, A extends Schema.TaggedRequest.All, const Handlers extends SerializedRunner.Handlers >( schema: Schema.Schema, handlers: Handlers ) => Layer.Layer> = internal.layerSerialized /** * Launch the specified layer, interrupting the fiber when the CloseLatch is * triggered. * * @since 1.0.0 * @category Execution */ export const launch: (layer: Layer.Layer) => Effect.Effect = internal.launch