<Self, S extends Hyperlink.Spec, HSelf, R = never>(
tag: Hyperlink.NodeBoundTag<Self, S, HSelf>,
impl:
| Hyperlink.ImplOf<S>
| Hyperlink.Driver<S, R>
| Effect.Effect<
Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>,
never,
R
>,
options?: WsListenArg
): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>
<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(
tag: Hyperlink.HyperlinkTag<Self, S>,
impl:
| Hyperlink.ImplOf<S>
| Hyperlink.Driver<S, R>
| Effect.Effect<
Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>,
never,
R
>,
node: N
): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>
<Self, S extends Hyperlink.Spec, R = never>(
tag: Hyperlink.HyperlinkTag<Self, S>,
impl:
| Hyperlink.ImplOf<S>
| Hyperlink.Driver<S, R>
| Effect.Effect<
Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>,
never,
R
>,
options?: WsListenArg
): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>
<A, E, R>(
serve: Layer.Layer<A, E, R>,
options?: WsListenArg
): Layer.Layer<A | ListenNode, E, R>
<const Serves extends ServeLayerList>(
serves: Serves,
options?: WsListenArg
): Layer.Layer<
Layer.Success<Serves[number]> | ListenNode,
Layer.Error<Serves[number]>,
Layer.Services<Serves[number]>
>
<Node extends AnyNode, A, E, R>(
node: Node,
serve: Layer.Layer<A, E, R>,
options?: WsListenArg
): Layer.Layer<A | ListenNode, E, R>
<
Node extends AnyNode & { readonly [catalogSym]?: unknown },
const Serves extends ServeLayerList
>(
node: Node,
serves: Serves & ServesForCatalog<CatalogROut<Node>, Serves>,
options?: WsListenArg
): Layer.Layer<
Layer.Success<Serves[number]> | ListenNode,
Layer.Error<Serves[number]>,
Layer.Services<Serves[number]>
>Local WebSocket listen — localhost bind. Nameless forms Soft-bake Lookup.layer when
Identity is absent (claim + advertise); override with Layer.provide(Lookup.layerOptions(…)).
Overload family (keep aligned with unix / http / nPipe):
ws(tag, impl)/ws(tag, impl, address)— unbound Tag → nameless; bound Tag → that Nodews(tag, impl, node)— named listen withoutandNodews(serve, address?)/ws([serve…], address?)— nameless (brackets optional for one)ws(node, serve | [serve…], address?)— named node + serves
Address: 3000 / ":3000" / "ws://…" / { port | url | … }. Prefer this over
wsServer when the battery localhost bind is enough.
export function function ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R> (+6 overloads)Local WebSocket listen — localhost bind. Nameless forms Soft-bake
Lookup.layer
when
Identity is absent (claim + advertise); override with Layer.provide(Lookup.layerOptions(…)).
Overload family (keep aligned with
unix
/
http
/
nPipe
):
ws(tag, impl) / ws(tag, impl, address) — unbound Tag → nameless; bound Tag → that Node
ws(tag, impl, node) — named listen without andNode
ws(serve, address?) / ws([serve…], address?) — nameless (brackets optional for one)
ws(node, serve | [serve…], address?) — named node + serves
Address: 3000 / ":3000" / "ws://…" / { port | url | … }. Prefer this over
wsServer
when the battery localhost bind is enough.
ws<
function (type parameter) Self in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>Self,
function (type parameter) S in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S extends import HyperlinkHyperlink.Spec,
function (type parameter) HSelf in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>HSelf,
function (type parameter) R in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R = never,
>(
tag: Hyperlink.NodeBoundTag<Self, S, HSelf>(parameter) tag: {
description: string | undefined;
key: Identifier;
of: (this: void, self: Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<infer T> ? Hyperlink.LocalEffect<T, never, Self> : S[K] extends Hy…;
context: (self: Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<infer T> ? Hyperlink.LocalEffect<T, never, Self> : S[K] extends Hyperlink.Defa…;
use: (f: (service: Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<infer T> ? Hyperlink.LocalEffect<T, never, Self> : S[K] extends Hyperli…;
useSync: (f: (service: Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<infer T> ? Hyperlink.LocalEffect<T, never, Self> : S[K] extends Hyperli…;
Identifier: Identifier;
Service: Shape;
stack: string | undefined;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
tag: import HyperlinkHyperlink.interface NodeBoundTag<Self, S extends Hyperlink.Spec, HSelf, Svc = Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<...> ? Hyperlink.LocalEffect<...> : S[K] extends Hyperlink.DefaultMethod<...> ? F : S[K] extends { ...; } ? SuccessOf<...> : S[K] extends { ...; } ? Hyperlink.Subscribable<...> : S[K] extends { ...; } ? ClientMethod<...> : S[K] extends Hyperlink.Spec ? Simplify<...> : never; }>>A
HyperlinkTag
bound to a concrete
Node
— its [nodeSym] narrowed to that node's
NodeKey<HSelf>, which is how
Hyperlink.client
discriminates the node-aware path. Returned
by the node-bearing tag constructors. It's a named type (not an inline & { [nodeSym] }) so a
consumer can export a node-bearing tag without leaking the internal symbol (TS4020).
NodeBoundTag<function (type parameter) Self in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>Self, function (type parameter) S in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S, function (type parameter) HSelf in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>HSelf>,
impl: | Hyperlink.ImplOf<S>
| Hyperlink.Driver<S, R>
| Effect.Effect<
| Hyperlink.ImplOf<S>
| Hyperlink.Driver<S, R>,
never,
R
>
impl:
| import HyperlinkHyperlink.type ImplOf<S extends Hyperlink.Spec> = { readonly [K in keyof S as S[K] extends Hyperlink.AnyDefaultMethod ? never : K]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? M : S[K] extends Hyperlink.LocalMethod<infer T> ? T : S[K] extends {
readonly _tag: "ref";
} ? Hyperlink.Subscribable<SuccessOf<AsMethod<S[K]>>> : S[K] extends {
readonly kind: Hyperlink.MethodKind;
} ? Hyperlink.ServiceMethod<AsMethod<S[K]>> : S[K] extends Hyperlink.Spec ? Hyperlink.ImplOf<...> : never; }
The implementation a
localLayer
/
serve
expects: wire members are their
Effect/Stream/function, and each
LocalMethod
is its raw value T (the toolkit wraps
it to require the
Local
). When an impl needs a capability (e.g.
peers
) to
build, provide it via the Effect form of
Hyperlink.layer
/
Hyperlink.serve
— resolve it once, and the members close over it.
A
value
field's impl is the Effect<A, E> resolved once at acquire — that differs from how
it surfaces in
ServiceOf
(a plain A), so annotate an impl with ImplOf, not
ServiceOf. A
ref
's impl is the
Subscribable
(not the consumer shape alone).
default
members are Tag-baked — omitted from the impl. A nested group that is only
default members still appears as {} (pass an empty object). Piped
defaults
keys may
be overridden via
ImplWithDefaultOverrides
.
ImplOf<function (type parameter) S in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S>
| import HyperlinkHyperlink.interface Driver<S extends Hyperlink.Spec, R>A HyperService impl before worker-context discharge — the impl still carries requirement R on its
Effect methods, paired with the
Context.Context
captured at build time. Used by
WorkPool
,
Gate
, and
Daemon
(any toolkit HyperService that builds
its driver under ambient R).
layer
/
serve
grant locally via
grantLocal
;
serveRemote
defers discharge to each wire call via
invokeWireMethodWithContext
so
one materialization backs both paths.
Driver<function (type parameter) S in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S, function (type parameter) R in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R>
| import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<
import HyperlinkHyperlink.type ImplOf<S extends Hyperlink.Spec> = { readonly [K in keyof S as S[K] extends Hyperlink.AnyDefaultMethod ? never : K]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? M : S[K] extends Hyperlink.LocalMethod<infer T> ? T : S[K] extends {
readonly _tag: "ref";
} ? Hyperlink.Subscribable<SuccessOf<AsMethod<S[K]>>> : S[K] extends {
readonly kind: Hyperlink.MethodKind;
} ? Hyperlink.ServiceMethod<AsMethod<S[K]>> : S[K] extends Hyperlink.Spec ? Hyperlink.ImplOf<...> : never; }
The implementation a
localLayer
/
serve
expects: wire members are their
Effect/Stream/function, and each
LocalMethod
is its raw value T (the toolkit wraps
it to require the
Local
). When an impl needs a capability (e.g.
peers
) to
build, provide it via the Effect form of
Hyperlink.layer
/
Hyperlink.serve
— resolve it once, and the members close over it.
A
value
field's impl is the Effect<A, E> resolved once at acquire — that differs from how
it surfaces in
ServiceOf
(a plain A), so annotate an impl with ImplOf, not
ServiceOf. A
ref
's impl is the
Subscribable
(not the consumer shape alone).
default
members are Tag-baked — omitted from the impl. A nested group that is only
default members still appears as {} (pass an empty object). Piped
defaults
keys may
be overridden via
ImplWithDefaultOverrides
.
ImplOf<function (type parameter) S in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S> | import HyperlinkHyperlink.interface Driver<S extends Hyperlink.Spec, R>A HyperService impl before worker-context discharge — the impl still carries requirement R on its
Effect methods, paired with the
Context.Context
captured at build time. Used by
WorkPool
,
Gate
, and
Daemon
(any toolkit HyperService that builds
its driver under ambient R).
layer
/
serve
grant locally via
grantLocal
;
serveRemote
defers discharge to each wire call via
invokeWireMethodWithContext
so
one materialization backs both paths.
Driver<function (type parameter) S in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S, function (type parameter) R in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R>,
never,
function (type parameter) R in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R
>,
options: WsListenArgoptions?: type WsListenArg = number | `:${number}` | `ws://${string}` | `wss://${string}` | `http://${string}` | `https://${string}` | ListenOptionsPositional listen address for
ws
— port / ":port" / ws(s):// / http(s):// (rewritten)
or full
ListenOptions
.
WsListenArg,
): import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<function (type parameter) Self in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>Self | import HyperlinkHyperlink.interface Local<in out Self>Granted only by a HyperService's local layer (
Hyperlink.layer
/
serve
) — never by
Hyperlink.client
. Local to this runtime's materialized impl for the tag (not a remote
client, not a peer). A
LocalMethod
carries it in its requirement channel, so calling a
non-serializable method against a client is a compile error (unsatisfied requirement); the
same call resolves when the local layer is provided. Branded by Self so one HyperService's local
layer can't unlock another's.
Local<function (type parameter) Self in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>Self> | class ListenNodeclass ListenNode {
Service: Service;
key: Identifier;
}
The Node a protocol listen (unix / http / ws) is binding (concrete or minted).
Identity claims prefer this over a Tag-bound Node when present.
ListenNode, never, function (type parameter) R in ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R>;
export function function ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R> (+6 overloads)Local WebSocket listen — localhost bind. Nameless forms Soft-bake
Lookup.layer
when
Identity is absent (claim + advertise); override with Layer.provide(Lookup.layerOptions(…)).
Overload family (keep aligned with
unix
/
http
/
nPipe
):
ws(tag, impl) / ws(tag, impl, address) — unbound Tag → nameless; bound Tag → that Node
ws(tag, impl, node) — named listen without andNode
ws(serve, address?) / ws([serve…], address?) — nameless (brackets optional for one)
ws(node, serve | [serve…], address?) — named node + serves
Address: 3000 / ":3000" / "ws://…" / { port | url | … }. Prefer this over
wsServer
when the battery localhost bind is enough.
ws<
function (type parameter) Self in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>Self,
function (type parameter) S in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S extends import HyperlinkHyperlink.Spec,
function (type parameter) N in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>N extends type AnyNode = NodeKey<unknown> & {
readonly url: string | undefined;
readonly path: string | undefined;
readonly kind: ProtocolKind | undefined;
readonly endpoints?: Endpoints;
readonly onConflict?: OnConflict;
readonly [portSym]?: number;
}
A
Tag
erased — its transport endpoints set, plus the primary address
(url and/or Unix path) and
ProtocolKind
kind (the first-declared endpoint, kept for
single-protocol readers), so a tag's distributed set is self-describing about where AND how to
reach each one.
AnyNode,
function (type parameter) R in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R = never,
>(
tag: Hyperlink.HyperlinkTag<Self, S>(parameter) tag: {
description: string | undefined;
key: Identifier;
of: (this: void, self: Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<infer T> ? Hyperlink.LocalEffect<T, never, Self> : S[K] extends Hy…;
context: (self: Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<infer T> ? Hyperlink.LocalEffect<T, never, Self> : S[K] extends Hyperlink.Defa…;
use: (f: (service: Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<infer T> ? Hyperlink.LocalEffect<T, never, Self> : S[K] extends Hyperli…;
useSync: (f: (service: Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<infer T> ? Hyperlink.LocalEffect<T, never, Self> : S[K] extends Hyperli…;
Identifier: Identifier;
Service: Shape;
stack: string | undefined;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
tag: import HyperlinkHyperlink.interface HyperlinkTag<Self, S extends Hyperlink.Spec, Svc = Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<...> ? Hyperlink.LocalEffect<...> : S[K] extends Hyperlink.DefaultMethod<...> ? F : S[K] extends { ...; } ? SuccessOf<...> : S[K] extends { ...; } ? Hyperlink.Subscribable<...> : S[K] extends { ...; } ? ClientMethod<...> : S[K] extends Hyperlink.Spec ? Simplify<...> : never; }>>The type of a HyperService tag carrying spec S — what
Hyperlink.Tag
produces
(and what you extend). Lets a consumer write
<S extends Spec>(tag: HyperlinkTag<Self, S>) and read the spec through named types
(
specOf
/
groupOf
) instead of a Parameters<typeof specOf> workaround.
HyperlinkTag<function (type parameter) Self in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>Self, function (type parameter) S in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S>,
impl: | Hyperlink.ImplOf<S>
| Hyperlink.Driver<S, R>
| Effect.Effect<
| Hyperlink.ImplOf<S>
| Hyperlink.Driver<S, R>,
never,
R
>
impl:
| import HyperlinkHyperlink.type ImplOf<S extends Hyperlink.Spec> = { readonly [K in keyof S as S[K] extends Hyperlink.AnyDefaultMethod ? never : K]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? M : S[K] extends Hyperlink.LocalMethod<infer T> ? T : S[K] extends {
readonly _tag: "ref";
} ? Hyperlink.Subscribable<SuccessOf<AsMethod<S[K]>>> : S[K] extends {
readonly kind: Hyperlink.MethodKind;
} ? Hyperlink.ServiceMethod<AsMethod<S[K]>> : S[K] extends Hyperlink.Spec ? Hyperlink.ImplOf<...> : never; }
The implementation a
localLayer
/
serve
expects: wire members are their
Effect/Stream/function, and each
LocalMethod
is its raw value T (the toolkit wraps
it to require the
Local
). When an impl needs a capability (e.g.
peers
) to
build, provide it via the Effect form of
Hyperlink.layer
/
Hyperlink.serve
— resolve it once, and the members close over it.
A
value
field's impl is the Effect<A, E> resolved once at acquire — that differs from how
it surfaces in
ServiceOf
(a plain A), so annotate an impl with ImplOf, not
ServiceOf. A
ref
's impl is the
Subscribable
(not the consumer shape alone).
default
members are Tag-baked — omitted from the impl. A nested group that is only
default members still appears as {} (pass an empty object). Piped
defaults
keys may
be overridden via
ImplWithDefaultOverrides
.
ImplOf<function (type parameter) S in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S>
| import HyperlinkHyperlink.interface Driver<S extends Hyperlink.Spec, R>A HyperService impl before worker-context discharge — the impl still carries requirement R on its
Effect methods, paired with the
Context.Context
captured at build time. Used by
WorkPool
,
Gate
, and
Daemon
(any toolkit HyperService that builds
its driver under ambient R).
layer
/
serve
grant locally via
grantLocal
;
serveRemote
defers discharge to each wire call via
invokeWireMethodWithContext
so
one materialization backs both paths.
Driver<function (type parameter) S in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S, function (type parameter) R in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R>
| import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<
import HyperlinkHyperlink.type ImplOf<S extends Hyperlink.Spec> = { readonly [K in keyof S as S[K] extends Hyperlink.AnyDefaultMethod ? never : K]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? M : S[K] extends Hyperlink.LocalMethod<infer T> ? T : S[K] extends {
readonly _tag: "ref";
} ? Hyperlink.Subscribable<SuccessOf<AsMethod<S[K]>>> : S[K] extends {
readonly kind: Hyperlink.MethodKind;
} ? Hyperlink.ServiceMethod<AsMethod<S[K]>> : S[K] extends Hyperlink.Spec ? Hyperlink.ImplOf<...> : never; }
The implementation a
localLayer
/
serve
expects: wire members are their
Effect/Stream/function, and each
LocalMethod
is its raw value T (the toolkit wraps
it to require the
Local
). When an impl needs a capability (e.g.
peers
) to
build, provide it via the Effect form of
Hyperlink.layer
/
Hyperlink.serve
— resolve it once, and the members close over it.
A
value
field's impl is the Effect<A, E> resolved once at acquire — that differs from how
it surfaces in
ServiceOf
(a plain A), so annotate an impl with ImplOf, not
ServiceOf. A
ref
's impl is the
Subscribable
(not the consumer shape alone).
default
members are Tag-baked — omitted from the impl. A nested group that is only
default members still appears as {} (pass an empty object). Piped
defaults
keys may
be overridden via
ImplWithDefaultOverrides
.
ImplOf<function (type parameter) S in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S> | import HyperlinkHyperlink.interface Driver<S extends Hyperlink.Spec, R>A HyperService impl before worker-context discharge — the impl still carries requirement R on its
Effect methods, paired with the
Context.Context
captured at build time. Used by
WorkPool
,
Gate
, and
Daemon
(any toolkit HyperService that builds
its driver under ambient R).
layer
/
serve
grant locally via
grantLocal
;
serveRemote
defers discharge to each wire call via
invokeWireMethodWithContext
so
one materialization backs both paths.
Driver<function (type parameter) S in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S, function (type parameter) R in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R>,
never,
function (type parameter) R in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R
>,
node: N extends AnyNodenode: function (type parameter) N in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>N,
): import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<function (type parameter) Self in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>Self | import HyperlinkHyperlink.interface Local<in out Self>Granted only by a HyperService's local layer (
Hyperlink.layer
/
serve
) — never by
Hyperlink.client
. Local to this runtime's materialized impl for the tag (not a remote
client, not a peer). A
LocalMethod
carries it in its requirement channel, so calling a
non-serializable method against a client is a compile error (unsatisfied requirement); the
same call resolves when the local layer is provided. Branded by Self so one HyperService's local
layer can't unlock another's.
Local<function (type parameter) Self in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>Self> | class ListenNodeclass ListenNode {
Service: Service;
key: Identifier;
}
The Node a protocol listen (unix / http / ws) is binding (concrete or minted).
Identity claims prefer this over a Tag-bound Node when present.
ListenNode, never, function (type parameter) R in ws<Self, S extends Hyperlink.Spec, N extends AnyNode, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, node: N): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R>;
export function function ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R> (+6 overloads)Local WebSocket listen — localhost bind. Nameless forms Soft-bake
Lookup.layer
when
Identity is absent (claim + advertise); override with Layer.provide(Lookup.layerOptions(…)).
Overload family (keep aligned with
unix
/
http
/
nPipe
):
ws(tag, impl) / ws(tag, impl, address) — unbound Tag → nameless; bound Tag → that Node
ws(tag, impl, node) — named listen without andNode
ws(serve, address?) / ws([serve…], address?) — nameless (brackets optional for one)
ws(node, serve | [serve…], address?) — named node + serves
Address: 3000 / ":3000" / "ws://…" / { port | url | … }. Prefer this over
wsServer
when the battery localhost bind is enough.
ws<function (type parameter) Self in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>Self, function (type parameter) S in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S extends import HyperlinkHyperlink.Spec, function (type parameter) R in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R = never>(
tag: Hyperlink.HyperlinkTag<Self, S>(parameter) tag: {
description: string | undefined;
key: Identifier;
of: (this: void, self: Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<infer T> ? Hyperlink.LocalEffect<T, never, Self> : S[K] extends Hy…;
context: (self: Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<infer T> ? Hyperlink.LocalEffect<T, never, Self> : S[K] extends Hyperlink.Defa…;
use: (f: (service: Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<infer T> ? Hyperlink.LocalEffect<T, never, Self> : S[K] extends Hyperli…;
useSync: (f: (service: Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<infer T> ? Hyperlink.LocalEffect<T, never, Self> : S[K] extends Hyperli…;
Identifier: Identifier;
Service: Shape;
stack: string | undefined;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
}
tag: import HyperlinkHyperlink.interface HyperlinkTag<Self, S extends Hyperlink.Spec, Svc = Simplify<{ readonly [K in keyof S]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? Hyperlink.InjectLocal<M, Self> : S[K] extends Hyperlink.LocalMethod<...> ? Hyperlink.LocalEffect<...> : S[K] extends Hyperlink.DefaultMethod<...> ? F : S[K] extends { ...; } ? SuccessOf<...> : S[K] extends { ...; } ? Hyperlink.Subscribable<...> : S[K] extends { ...; } ? ClientMethod<...> : S[K] extends Hyperlink.Spec ? Simplify<...> : never; }>>The type of a HyperService tag carrying spec S — what
Hyperlink.Tag
produces
(and what you extend). Lets a consumer write
<S extends Spec>(tag: HyperlinkTag<Self, S>) and read the spec through named types
(
specOf
/
groupOf
) instead of a Parameters<typeof specOf> workaround.
HyperlinkTag<function (type parameter) Self in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>Self, function (type parameter) S in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S>,
impl: | Hyperlink.ImplOf<S>
| Hyperlink.Driver<S, R>
| Effect.Effect<
| Hyperlink.ImplOf<S>
| Hyperlink.Driver<S, R>,
never,
R
>
impl:
| import HyperlinkHyperlink.type ImplOf<S extends Hyperlink.Spec> = { readonly [K in keyof S as S[K] extends Hyperlink.AnyDefaultMethod ? never : K]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? M : S[K] extends Hyperlink.LocalMethod<infer T> ? T : S[K] extends {
readonly _tag: "ref";
} ? Hyperlink.Subscribable<SuccessOf<AsMethod<S[K]>>> : S[K] extends {
readonly kind: Hyperlink.MethodKind;
} ? Hyperlink.ServiceMethod<AsMethod<S[K]>> : S[K] extends Hyperlink.Spec ? Hyperlink.ImplOf<...> : never; }
The implementation a
localLayer
/
serve
expects: wire members are their
Effect/Stream/function, and each
LocalMethod
is its raw value T (the toolkit wraps
it to require the
Local
). When an impl needs a capability (e.g.
peers
) to
build, provide it via the Effect form of
Hyperlink.layer
/
Hyperlink.serve
— resolve it once, and the members close over it.
A
value
field's impl is the Effect<A, E> resolved once at acquire — that differs from how
it surfaces in
ServiceOf
(a plain A), so annotate an impl with ImplOf, not
ServiceOf. A
ref
's impl is the
Subscribable
(not the consumer shape alone).
default
members are Tag-baked — omitted from the impl. A nested group that is only
default members still appears as {} (pass an empty object). Piped
defaults
keys may
be overridden via
ImplWithDefaultOverrides
.
ImplOf<function (type parameter) S in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S>
| import HyperlinkHyperlink.interface Driver<S extends Hyperlink.Spec, R>A HyperService impl before worker-context discharge — the impl still carries requirement R on its
Effect methods, paired with the
Context.Context
captured at build time. Used by
WorkPool
,
Gate
, and
Daemon
(any toolkit HyperService that builds
its driver under ambient R).
layer
/
serve
grant locally via
grantLocal
;
serveRemote
defers discharge to each wire call via
invokeWireMethodWithContext
so
one materialization backs both paths.
Driver<function (type parameter) S in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S, function (type parameter) R in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R>
| import EffectEffect.interface Effect<out A, out E = never, out R = never>The Effect interface defines a value that lazily describes a workflow or
job. The workflow requires some context R, and may fail with an error of
type E, or succeed with a value of type A.
When to use
Use when you need to represent a lazy, composable workflow that can require
services, fail with a typed error, or succeed with a typed value.
Details
Effect values model resourceful interaction with the outside world,
including synchronous, asynchronous, concurrent, and parallel interaction.
They use a fiber-based concurrency model, with built-in support for
scheduling, fine-grained interruption, structured concurrency, and high
scalability.
To run an Effect value, you need a Runtime, which is a type that is
capable of executing Effect values.
Effect<
import HyperlinkHyperlink.type ImplOf<S extends Hyperlink.Spec> = { readonly [K in keyof S as S[K] extends Hyperlink.AnyDefaultMethod ? never : K]: S[K] extends Hyperlink.FromLocalMethod<infer M> ? M : S[K] extends Hyperlink.LocalMethod<infer T> ? T : S[K] extends {
readonly _tag: "ref";
} ? Hyperlink.Subscribable<SuccessOf<AsMethod<S[K]>>> : S[K] extends {
readonly kind: Hyperlink.MethodKind;
} ? Hyperlink.ServiceMethod<AsMethod<S[K]>> : S[K] extends Hyperlink.Spec ? Hyperlink.ImplOf<...> : never; }
The implementation a
localLayer
/
serve
expects: wire members are their
Effect/Stream/function, and each
LocalMethod
is its raw value T (the toolkit wraps
it to require the
Local
). When an impl needs a capability (e.g.
peers
) to
build, provide it via the Effect form of
Hyperlink.layer
/
Hyperlink.serve
— resolve it once, and the members close over it.
A
value
field's impl is the Effect<A, E> resolved once at acquire — that differs from how
it surfaces in
ServiceOf
(a plain A), so annotate an impl with ImplOf, not
ServiceOf. A
ref
's impl is the
Subscribable
(not the consumer shape alone).
default
members are Tag-baked — omitted from the impl. A nested group that is only
default members still appears as {} (pass an empty object). Piped
defaults
keys may
be overridden via
ImplWithDefaultOverrides
.
ImplOf<function (type parameter) S in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S> | import HyperlinkHyperlink.interface Driver<S extends Hyperlink.Spec, R>A HyperService impl before worker-context discharge — the impl still carries requirement R on its
Effect methods, paired with the
Context.Context
captured at build time. Used by
WorkPool
,
Gate
, and
Daemon
(any toolkit HyperService that builds
its driver under ambient R).
layer
/
serve
grant locally via
grantLocal
;
serveRemote
defers discharge to each wire call via
invokeWireMethodWithContext
so
one materialization backs both paths.
Driver<function (type parameter) S in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>S, function (type parameter) R in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R>,
never,
function (type parameter) R in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R
>,
options: WsListenArgoptions?: type WsListenArg = number | `:${number}` | `ws://${string}` | `wss://${string}` | `http://${string}` | `https://${string}` | ListenOptionsPositional listen address for
ws
— port / ":port" / ws(s):// / http(s):// (rewritten)
or full
ListenOptions
.
WsListenArg,
): import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<function (type parameter) Self in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>Self | import HyperlinkHyperlink.interface Local<in out Self>Granted only by a HyperService's local layer (
Hyperlink.layer
/
serve
) — never by
Hyperlink.client
. Local to this runtime's materialized impl for the tag (not a remote
client, not a peer). A
LocalMethod
carries it in its requirement channel, so calling a
non-serializable method against a client is a compile error (unsatisfied requirement); the
same call resolves when the local layer is provided. Branded by Self so one HyperService's local
layer can't unlock another's.
Local<function (type parameter) Self in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>Self> | class ListenNodeclass ListenNode {
Service: Service;
key: Identifier;
}
The Node a protocol listen (unix / http / ws) is binding (concrete or minted).
Identity claims prefer this over a Tag-bound Node when present.
ListenNode, never, function (type parameter) R in ws<Self, S extends Hyperlink.Spec, R = never>(tag: Hyperlink.HyperlinkTag<Self, S>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R>R>;
export function function ws<A, E, R>(serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R> (+6 overloads)Local WebSocket listen — localhost bind. Nameless forms Soft-bake
Lookup.layer
when
Identity is absent (claim + advertise); override with Layer.provide(Lookup.layerOptions(…)).
Overload family (keep aligned with
unix
/
http
/
nPipe
):
ws(tag, impl) / ws(tag, impl, address) — unbound Tag → nameless; bound Tag → that Node
ws(tag, impl, node) — named listen without andNode
ws(serve, address?) / ws([serve…], address?) — nameless (brackets optional for one)
ws(node, serve | [serve…], address?) — named node + serves
Address: 3000 / ":3000" / "ws://…" / { port | url | … }. Prefer this over
wsServer
when the battery localhost bind is enough.
ws<function (type parameter) A in ws<A, E, R>(serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>A, function (type parameter) E in ws<A, E, R>(serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>E, function (type parameter) R in ws<A, E, R>(serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>R>(
serve: Layer.Layer<A, E, R>(parameter) serve: {
build: (memoMap: MemoMap, scope: Scope.Scope) => Effect<Context.Context<A>, E, R>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
serve: import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<function (type parameter) A in ws<A, E, R>(serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>A, function (type parameter) E in ws<A, E, R>(serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>E, function (type parameter) R in ws<A, E, R>(serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>R>,
options: WsListenArgoptions?: type WsListenArg = number | `:${number}` | `ws://${string}` | `wss://${string}` | `http://${string}` | `https://${string}` | ListenOptionsPositional listen address for
ws
— port / ":port" / ws(s):// / http(s):// (rewritten)
or full
ListenOptions
.
WsListenArg,
): import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<function (type parameter) A in ws<A, E, R>(serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>A | class ListenNodeclass ListenNode {
Service: Service;
key: Identifier;
}
The Node a protocol listen (unix / http / ws) is binding (concrete or minted).
Identity claims prefer this over a Tag-bound Node when present.
ListenNode, function (type parameter) E in ws<A, E, R>(serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>E, function (type parameter) R in ws<A, E, R>(serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>R>;
export function function ws<const Serves extends ServeLayerList>(serves: Serves, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>> (+6 overloads)Local WebSocket listen — localhost bind. Nameless forms Soft-bake
Lookup.layer
when
Identity is absent (claim + advertise); override with Layer.provide(Lookup.layerOptions(…)).
Overload family (keep aligned with
unix
/
http
/
nPipe
):
ws(tag, impl) / ws(tag, impl, address) — unbound Tag → nameless; bound Tag → that Node
ws(tag, impl, node) — named listen without andNode
ws(serve, address?) / ws([serve…], address?) — nameless (brackets optional for one)
ws(node, serve | [serve…], address?) — named node + serves
Address: 3000 / ":3000" / "ws://…" / { port | url | … }. Prefer this over
wsServer
when the battery localhost bind is enough.
ws<const function (type parameter) Serves in ws<const Serves extends ServeLayerList>(serves: Serves, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>>Serves extends type ServeLayerList = readonly [Layer.Any, ...Layer.Any[]]Non-empty serve-layer list for
listen
/
unix
/
http
/
ws
/
nPipe
. Open in E/R — a HyperService may depend on other services (including other
HyperServices); callers Layer.provide outside. Uses
Layer.Any
(not closed never
channels) so deps remain expressible without expression-level any.
ServeLayerList>(
serves: const Serves extends ServeLayerListserves: function (type parameter) Serves in ws<const Serves extends ServeLayerList>(serves: Serves, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>>Serves,
options: WsListenArgoptions?: type WsListenArg = number | `:${number}` | `ws://${string}` | `wss://${string}` | `http://${string}` | `https://${string}` | ListenOptionsPositional listen address for
ws
— port / ":port" / ws(s):// / http(s):// (rewritten)
or full
ListenOptions
.
WsListenArg,
): import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<
import LayerLayer.type Success<T extends Layer.Any> =
T extends Layer.Layer<
infer _ROut,
infer _E,
infer _RIn
>
? _ROut
: never
Extracts the service output type (ROut) from a Layer type.
When to use
Use to derive the services provided by an existing or generic Layer without
restating its ROut type parameter.
Success<function (type parameter) Serves in ws<const Serves extends ServeLayerList>(serves: Serves, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>>Serves[number]> | class ListenNodeclass ListenNode {
Service: Service;
key: Identifier;
}
The Node a protocol listen (unix / http / ws) is binding (concrete or minted).
Identity claims prefer this over a Tag-bound Node when present.
ListenNode,
import LayerLayer.type Error<T extends Layer.Any> =
T extends Layer.Layer<
infer _ROut,
infer _E,
infer _RIn
>
? _E
: never
Extracts the error type (E) from a Layer type.
When to use
Use to derive a layer construction error type for helper types, wrappers, or
APIs that preserve a layer failure channel.
Error<function (type parameter) Serves in ws<const Serves extends ServeLayerList>(serves: Serves, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>>Serves[number]>,
import LayerLayer.type Services<T extends Layer.Any> =
T extends infer L
? L extends Layer.Layer<
infer _ROut,
infer _E,
infer _RIn
>
? _RIn
: never
: never
Extracts the service requirements (RIn) from a Layer type.
When to use
Use to derive the dependency requirements of a generic or inferred Layer
without restating its RIn type parameter.
Services<function (type parameter) Serves in ws<const Serves extends ServeLayerList>(serves: Serves, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>>Serves[number]>
>;
export function function ws<Node extends AnyNode, A, E, R>(node: Node, serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R> (+6 overloads)Local WebSocket listen — localhost bind. Nameless forms Soft-bake
Lookup.layer
when
Identity is absent (claim + advertise); override with Layer.provide(Lookup.layerOptions(…)).
Overload family (keep aligned with
unix
/
http
/
nPipe
):
ws(tag, impl) / ws(tag, impl, address) — unbound Tag → nameless; bound Tag → that Node
ws(tag, impl, node) — named listen without andNode
ws(serve, address?) / ws([serve…], address?) — nameless (brackets optional for one)
ws(node, serve | [serve…], address?) — named node + serves
Address: 3000 / ":3000" / "ws://…" / { port | url | … }. Prefer this over
wsServer
when the battery localhost bind is enough.
ws<function (type parameter) Node in ws<Node extends AnyNode, A, E, R>(node: Node, serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>Node extends type AnyNode = NodeKey<unknown> & {
readonly url: string | undefined;
readonly path: string | undefined;
readonly kind: ProtocolKind | undefined;
readonly endpoints?: Endpoints;
readonly onConflict?: OnConflict;
readonly [portSym]?: number;
}
A
Tag
erased — its transport endpoints set, plus the primary address
(url and/or Unix path) and
ProtocolKind
kind (the first-declared endpoint, kept for
single-protocol readers), so a tag's distributed set is self-describing about where AND how to
reach each one.
AnyNode, function (type parameter) A in ws<Node extends AnyNode, A, E, R>(node: Node, serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>A, function (type parameter) E in ws<Node extends AnyNode, A, E, R>(node: Node, serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>E, function (type parameter) R in ws<Node extends AnyNode, A, E, R>(node: Node, serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>R>(
node: Node extends AnyNodenode: function (type parameter) Node in ws<Node extends AnyNode, A, E, R>(node: Node, serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>Node,
serve: Layer.Layer<A, E, R>(parameter) serve: {
build: (memoMap: MemoMap, scope: Scope.Scope) => Effect<Context.Context<A>, E, R>;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
}
serve: import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<function (type parameter) A in ws<Node extends AnyNode, A, E, R>(node: Node, serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>A, function (type parameter) E in ws<Node extends AnyNode, A, E, R>(node: Node, serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>E, function (type parameter) R in ws<Node extends AnyNode, A, E, R>(node: Node, serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>R>,
options: WsListenArgoptions?: type WsListenArg = number | `:${number}` | `ws://${string}` | `wss://${string}` | `http://${string}` | `https://${string}` | ListenOptionsPositional listen address for
ws
— port / ":port" / ws(s):// / http(s):// (rewritten)
or full
ListenOptions
.
WsListenArg,
): import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<function (type parameter) A in ws<Node extends AnyNode, A, E, R>(node: Node, serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>A | class ListenNodeclass ListenNode {
Service: Service;
key: Identifier;
}
The Node a protocol listen (unix / http / ws) is binding (concrete or minted).
Identity claims prefer this over a Tag-bound Node when present.
ListenNode, function (type parameter) E in ws<Node extends AnyNode, A, E, R>(node: Node, serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>E, function (type parameter) R in ws<Node extends AnyNode, A, E, R>(node: Node, serve: Layer.Layer<A, E, R>, options?: WsListenArg): Layer.Layer<A | ListenNode, E, R>R>;
export function function ws<Node extends AnyNode & {
readonly [catalogSym]?: unknown;
}, const Serves extends ServeLayerList>(node: Node, serves: Serves & ServesForCatalog<CatalogROut<Node>, Serves>, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>> (+6 overloads)
Local WebSocket listen — localhost bind. Nameless forms Soft-bake
Lookup.layer
when
Identity is absent (claim + advertise); override with Layer.provide(Lookup.layerOptions(…)).
Overload family (keep aligned with
unix
/
http
/
nPipe
):
ws(tag, impl) / ws(tag, impl, address) — unbound Tag → nameless; bound Tag → that Node
ws(tag, impl, node) — named listen without andNode
ws(serve, address?) / ws([serve…], address?) — nameless (brackets optional for one)
ws(node, serve | [serve…], address?) — named node + serves
Address: 3000 / ":3000" / "ws://…" / { port | url | … }. Prefer this over
wsServer
when the battery localhost bind is enough.
ws<
function (type parameter) Node in ws<Node extends AnyNode & {
readonly [catalogSym]?: unknown;
}, const Serves extends ServeLayerList>(node: Node, serves: Serves & ServesForCatalog<CatalogROut<Node>, Serves>, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>>
Node extends type AnyNode = NodeKey<unknown> & {
readonly url: string | undefined;
readonly path: string | undefined;
readonly kind: ProtocolKind | undefined;
readonly endpoints?: Endpoints;
readonly onConflict?: OnConflict;
readonly [portSym]?: number;
}
A
Tag
erased — its transport endpoints set, plus the primary address
(url and/or Unix path) and
ProtocolKind
kind (the first-declared endpoint, kept for
single-protocol readers), so a tag's distributed set is self-describing about where AND how to
reach each one.
AnyNode & { readonly [const catalogSym: typeof catalogSymType-only catalog brand on a
Node
— ROut is erased at runtime (C2 / C4).
catalogSym]?: unknown },
const function (type parameter) Serves in ws<Node extends AnyNode & {
readonly [catalogSym]?: unknown;
}, const Serves extends ServeLayerList>(node: Node, serves: Serves & ServesForCatalog<CatalogROut<Node>, Serves>, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>>
Serves extends type ServeLayerList = readonly [Layer.Any, ...Layer.Any[]]Non-empty serve-layer list for
listen
/
unix
/
http
/
ws
/
nPipe
. Open in E/R — a HyperService may depend on other services (including other
HyperServices); callers Layer.provide outside. Uses
Layer.Any
(not closed never
channels) so deps remain expressible without expression-level any.
ServeLayerList,
>(
node: Node extends AnyNode & { readonly [catalogSym]?: unknown; }node: function (type parameter) Node in ws<Node extends AnyNode & {
readonly [catalogSym]?: unknown;
}, const Serves extends ServeLayerList>(node: Node, serves: Serves & ServesForCatalog<CatalogROut<Node>, Serves>, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>>
Node,
serves: Serves &
ServesForCatalog<CatalogROut<Node>, Serves>
serves: function (type parameter) Serves in ws<Node extends AnyNode & {
readonly [catalogSym]?: unknown;
}, const Serves extends ServeLayerList>(node: Node, serves: Serves & ServesForCatalog<CatalogROut<Node>, Serves>, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>>
Serves & type ServesForCatalog<ROut, Serves extends ServeLayerList> = [ROut] extends [never] ? Serves : [ROut] extends [Layer.Success<Serves[number]>] ? Serves : neverC3: every member of ROut must appear in the merged serve Layer.Success.
ServesForCatalog<type CatalogROut<Node> = Node extends {
readonly [catalogSym]?: infer R;
} ? Exclude<R, undefined> : never
ROut stamped on a catalog Node, or never when undeclared.
CatalogROut<function (type parameter) Node in ws<Node extends AnyNode & {
readonly [catalogSym]?: unknown;
}, const Serves extends ServeLayerList>(node: Node, serves: Serves & ServesForCatalog<CatalogROut<Node>, Serves>, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>>
Node>, function (type parameter) Serves in ws<Node extends AnyNode & {
readonly [catalogSym]?: unknown;
}, const Serves extends ServeLayerList>(node: Node, serves: Serves & ServesForCatalog<CatalogROut<Node>, Serves>, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>>
Serves>,
options: WsListenArgoptions?: type WsListenArg = number | `:${number}` | `ws://${string}` | `wss://${string}` | `http://${string}` | `https://${string}` | ListenOptionsPositional listen address for
ws
— port / ":port" / ws(s):// / http(s):// (rewritten)
or full
ListenOptions
.
WsListenArg,
): import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<
import LayerLayer.type Success<T extends Layer.Any> =
T extends Layer.Layer<
infer _ROut,
infer _E,
infer _RIn
>
? _ROut
: never
Extracts the service output type (ROut) from a Layer type.
When to use
Use to derive the services provided by an existing or generic Layer without
restating its ROut type parameter.
Success<function (type parameter) Serves in ws<Node extends AnyNode & {
readonly [catalogSym]?: unknown;
}, const Serves extends ServeLayerList>(node: Node, serves: Serves & ServesForCatalog<CatalogROut<Node>, Serves>, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>>
Serves[number]> | class ListenNodeclass ListenNode {
Service: Service;
key: Identifier;
}
The Node a protocol listen (unix / http / ws) is binding (concrete or minted).
Identity claims prefer this over a Tag-bound Node when present.
ListenNode,
import LayerLayer.type Error<T extends Layer.Any> =
T extends Layer.Layer<
infer _ROut,
infer _E,
infer _RIn
>
? _E
: never
Extracts the error type (E) from a Layer type.
When to use
Use to derive a layer construction error type for helper types, wrappers, or
APIs that preserve a layer failure channel.
Error<function (type parameter) Serves in ws<Node extends AnyNode & {
readonly [catalogSym]?: unknown;
}, const Serves extends ServeLayerList>(node: Node, serves: Serves & ServesForCatalog<CatalogROut<Node>, Serves>, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>>
Serves[number]>,
import LayerLayer.type Services<T extends Layer.Any> =
T extends infer L
? L extends Layer.Layer<
infer _ROut,
infer _E,
infer _RIn
>
? _RIn
: never
: never
Extracts the service requirements (RIn) from a Layer type.
When to use
Use to derive the dependency requirements of a generic or inferred Layer
without restating its RIn type parameter.
Services<function (type parameter) Serves in ws<Node extends AnyNode & {
readonly [catalogSym]?: unknown;
}, const Serves extends ServeLayerList>(node: Node, serves: Serves & ServesForCatalog<CatalogROut<Node>, Serves>, options?: WsListenArg): Layer.Layer<Layer.Success<Serves[number]> | ListenNode, Layer.Error<Serves[number]>, Layer.Services<Serves[number]>>
Serves[number]>
>;
export function function ws<Self, S extends Hyperlink.Spec, HSelf, R = never>(tag: Hyperlink.NodeBoundTag<Self, S, HSelf>, impl: Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R> | Effect.Effect<Hyperlink.ImplOf<S> | Hyperlink.Driver<S, R>, never, R>, options?: WsListenArg): Layer.Layer<Self | Hyperlink.Local<Self> | ListenNode, never, R> (+6 overloads)Local WebSocket listen — localhost bind. Nameless forms Soft-bake
Lookup.layer
when
Identity is absent (claim + advertise); override with Layer.provide(Lookup.layerOptions(…)).
Overload family (keep aligned with
unix
/
http
/
nPipe
):
ws(tag, impl) / ws(tag, impl, address) — unbound Tag → nameless; bound Tag → that Node
ws(tag, impl, node) — named listen without andNode
ws(serve, address?) / ws([serve…], address?) — nameless (brackets optional for one)
ws(node, serve | [serve…], address?) — named node + serves
Address: 3000 / ":3000" / "ws://…" / { port | url | … }. Prefer this over
wsServer
when the battery localhost bind is enough.
ws(
nodeOrServesOrTag: | AnyNode
| Layer.Any
| ServeLayerList
| Hyperlink.PipeableTag
nodeOrServesOrTag:
| type AnyNode = NodeKey<unknown> & {
readonly url: string | undefined;
readonly path: string | undefined;
readonly kind: ProtocolKind | undefined;
readonly endpoints?: Endpoints;
readonly onConflict?: OnConflict;
readonly [portSym]?: number;
}
A
Tag
erased — its transport endpoints set, plus the primary address
(url and/or Unix path) and
ProtocolKind
kind (the first-declared endpoint, kept for
single-protocol readers), so a tag's distributed set is self-describing about where AND how to
reach each one.
AnyNode
| import LayerLayer.Any
| type ServeLayerList = readonly [Layer.Any, ...Layer.Any[]]Non-empty serve-layer list for
listen
/
unix
/
http
/
ws
/
nPipe
. Open in E/R — a HyperService may depend on other services (including other
HyperServices); callers Layer.provide outside. Uses
Layer.Any
(not closed never
channels) so deps remain expressible without expression-level any.
ServeLayerList
| import HyperlinkHyperlink.type PipeableTag = {
readonly [specSym]: Hyperlink.FlatSpec
}
PipeableTag,
servesOrOptionsOrImpl: | Layer.Any
| ServeLayerList
| WsListenArg
| AnyNode
| object
servesOrOptionsOrImpl?:
| import LayerLayer.Any
| type ServeLayerList = readonly [Layer.Any, ...Layer.Any[]]Non-empty serve-layer list for
listen
/
unix
/
http
/
ws
/
nPipe
. Open in E/R — a HyperService may depend on other services (including other
HyperServices); callers Layer.provide outside. Uses
Layer.Any
(not closed never
channels) so deps remain expressible without expression-level any.
ServeLayerList
| type WsListenArg = number | `:${number}` | `ws://${string}` | `wss://${string}` | `http://${string}` | `https://${string}` | ListenOptionsPositional listen address for
ws
— port / ":port" / ws(s):// / http(s):// (rewritten)
or full
ListenOptions
.
WsListenArg
| type AnyNode = NodeKey<unknown> & {
readonly url: string | undefined;
readonly path: string | undefined;
readonly kind: ProtocolKind | undefined;
readonly endpoints?: Endpoints;
readonly onConflict?: OnConflict;
readonly [portSym]?: number;
}
A
Tag
erased — its transport endpoints set, plus the primary address
(url and/or Unix path) and
ProtocolKind
kind (the first-declared endpoint, kept for
single-protocol readers), so a tag's distributed set is self-describing about where AND how to
reach each one.
AnyNode
| object,
options: WsListenArg | AnyNodeoptions?: type WsListenArg = number | `:${number}` | `ws://${string}` | `wss://${string}` | `http://${string}` | `https://${string}` | ListenOptionsPositional listen address for
ws
— port / ":port" / ws(s):// / http(s):// (rewritten)
or full
ListenOptions
.
WsListenArg | type AnyNode = NodeKey<unknown> & {
readonly url: string | undefined;
readonly path: string | undefined;
readonly kind: ProtocolKind | undefined;
readonly endpoints?: Endpoints;
readonly onConflict?: OnConflict;
readonly [portSym]?: number;
}
A
Tag
erased — its transport endpoints set, plus the primary address
(url and/or Unix path) and
ProtocolKind
kind (the first-declared endpoint, kept for
single-protocol readers), so a tag's distributed set is self-describing about where AND how to
reach each one.
AnyNode,
): import LayerLayer.Any {
if (function isServeArg(u: unknown): u is Layer.Any | ServeLayerListTrue when the first arg is a serve layer or non-empty serve list.
isServeArg(nodeOrServesOrTag: | AnyNode
| Layer.Any
| ServeLayerList
| Hyperlink.PipeableTag
nodeOrServesOrTag)) {
const const list: readonly [
Layer.Any,
...Layer.Any[]
]
const list: {
0: Layer.Any;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
concat: { (...items: Array<ConcatArray<Layer.Any>>): Array<Layer.Any>; (...items: Array<Layer.Any | ConcatArray<Layer.Any>>): Array<Layer.Any> };
join: (separator?: string) => string;
slice: (start?: number, end?: number) => Array<Layer.Any>;
indexOf: (searchElement: Layer.Any, fromIndex?: number) => number;
lastIndexOf: (searchElement: Layer.Any, fromIndex?: number) => number;
every: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): this is readonly S[]; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any)…;
some: (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Array<Laye…;
reduce: { (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, array: ReadonlyArray<Layer.Any>) => Layer.Any): Layer.Any; (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, arra…;
reduceRight: { (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, array: ReadonlyArray<Layer.Any>) => Layer.Any): Layer.Any; (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, arra…;
find: { (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Layer.Any…;
findIndex: (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => number;
entries: () => ArrayIterator<[number, Layer.Any]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Layer.Any>;
includes: (searchElement: Layer.Any, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Layer.Any, index: number, array: Array<Layer.Any>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Layer.Any | undefined;
findLast: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Layer…;
findLastIndex: (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Layer.Any>;
toSorted: (compareFn?: ((a: Layer.Any, b: Layer.Any) => number) | undefined) => Array<Layer.Any>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Layer.Any>): Array<Layer.Any>; (start: number, deleteCount?: number): Array<Layer.Any> };
with: (index: number, value: Layer.Any) => Array<Layer.Any>;
}
list = (
var Array: ArrayConstructorArray.ArrayConstructor.isArray(arg: any): arg is any[]isArray(nodeOrServesOrTag: | AnyNode
| Layer.Any
| ServeLayerList
| Hyperlink.PipeableTag
nodeOrServesOrTag)
? nodeOrServesOrTag: | AnyNode
| Layer.Any
| ServeLayerList
| Hyperlink.PipeableTag
nodeOrServesOrTag
: [nodeOrServesOrTag: | AnyNode
| Layer.Any
| ServeLayerList
| Hyperlink.PipeableTag
nodeOrServesOrTag]
) as type ServeLayerList = readonly [Layer.Any, ...Layer.Any[]]Non-empty serve-layer list for
listen
/
unix
/
http
/
ws
/
nPipe
. Open in E/R — a HyperService may depend on other services (including other
HyperServices); callers Layer.provide outside. Uses
Layer.Any
(not closed never
channels) so deps remain expressible without expression-level any.
ServeLayerList;
return const wsNameless: (
list: ServeLayerList,
options: ListenOptions | undefined
) => Layer.Layer<never, never, never>
Nameless anonymous WebSocket Node + bind. Soft-bakes
Lookup.layer
when Identity is
absent (same as
unix
nameless).
wsNameless(
const list: readonly [
Layer.Any,
...Layer.Any[]
]
const list: {
0: Layer.Any;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
concat: { (...items: Array<ConcatArray<Layer.Any>>): Array<Layer.Any>; (...items: Array<Layer.Any | ConcatArray<Layer.Any>>): Array<Layer.Any> };
join: (separator?: string) => string;
slice: (start?: number, end?: number) => Array<Layer.Any>;
indexOf: (searchElement: Layer.Any, fromIndex?: number) => number;
lastIndexOf: (searchElement: Layer.Any, fromIndex?: number) => number;
every: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): this is readonly S[]; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any)…;
some: (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Array<Laye…;
reduce: { (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, array: ReadonlyArray<Layer.Any>) => Layer.Any): Layer.Any; (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, arra…;
reduceRight: { (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, array: ReadonlyArray<Layer.Any>) => Layer.Any): Layer.Any; (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, arra…;
find: { (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Layer.Any…;
findIndex: (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => number;
entries: () => ArrayIterator<[number, Layer.Any]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Layer.Any>;
includes: (searchElement: Layer.Any, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Layer.Any, index: number, array: Array<Layer.Any>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Layer.Any | undefined;
findLast: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Layer…;
findLastIndex: (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Layer.Any>;
toSorted: (compareFn?: ((a: Layer.Any, b: Layer.Any) => number) | undefined) => Array<Layer.Any>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Layer.Any>): Array<Layer.Any>; (start: number, deleteCount?: number): Array<Layer.Any> };
with: (index: number, value: Layer.Any) => Array<Layer.Any>;
}
list,
function coerceWsListenOptions(arg: number | string | ListenOptions | undefined): ListenOptions | undefinedNormalize a positional
WsListenArg
to
ListenOptions
.
coerceWsListenOptions(servesOrOptionsOrImpl: | Layer.Any
| ServeLayerList
| WsListenArg
| AnyNode
| object
servesOrOptionsOrImpl as type WsListenArg = number | `:${number}` | `ws://${string}` | `wss://${string}` | `http://${string}` | `https://${string}` | ListenOptionsPositional listen address for
ws
— port / ":port" / ws(s):// / http(s):// (rewritten)
or full
ListenOptions
.
WsListenArg | undefined),
);
}
if (function isHyperlinkTagArg(u: unknown): u is Hyperlink.PipeableTagTrue when the first arg is a
Hyperlink.Tag
(has
Hyperlink.specSym
).
isHyperlinkTagArg(nodeOrServesOrTag: | AnyNode
| Layer.Any
| ServeLayerList
| Hyperlink.PipeableTag
nodeOrServesOrTag)) {
const const tag: Hyperlink.PipeableTagtag = nodeOrServesOrTag: | AnyNode
| Layer.Any
| ServeLayerList
| Hyperlink.PipeableTag
nodeOrServesOrTag;
const const resolved: ResolvedTagListenTargetresolved = function resolveTagListenTarget(tag: Hyperlink.PipeableTag, third: unknown): ResolvedTagListenTargetresolveTagListenTarget(const tag: Hyperlink.PipeableTagtag, options: WsListenArg | AnyNodeoptions);
if (const resolved: ResolvedTagListenTargetresolved._tag: "node" | "nameless" | "tagNodeError"_tag === "tagNodeError") {
return function failListenTagNode(fields: { readonly tag: string; readonly reason: 'missing' | 'ambiguous'; readonly count: number }): Layer.Layer<never, ListenTagNodeRequired>A Layer that fails with a tag-node resolution error (missing / ambiguous bound node).
failListenTagNode({
tag: stringtag: const resolved: {
readonly _tag: "tagNodeError"
readonly tag: string
readonly reason: "missing" | "ambiguous"
readonly count: number
}
resolved.tag: stringtag,
reason: "missing" | "ambiguous"reason: const resolved: {
readonly _tag: "tagNodeError"
readonly tag: string
readonly reason: "missing" | "ambiguous"
readonly count: number
}
resolved.reason: "missing" | "ambiguous"reason,
count: numbercount: const resolved: {
readonly _tag: "tagNodeError"
readonly tag: string
readonly reason: "missing" | "ambiguous"
readonly count: number
}
resolved.count: numbercount,
});
}
const const list: readonly [
Layer.Any,
...Layer.Any[]
]
const list: {
0: Layer.Any;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
concat: { (...items: Array<ConcatArray<Layer.Any>>): Array<Layer.Any>; (...items: Array<Layer.Any | ConcatArray<Layer.Any>>): Array<Layer.Any> };
join: (separator?: string) => string;
slice: (start?: number, end?: number) => Array<Layer.Any>;
indexOf: (searchElement: Layer.Any, fromIndex?: number) => number;
lastIndexOf: (searchElement: Layer.Any, fromIndex?: number) => number;
every: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): this is readonly S[]; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any)…;
some: (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Array<Laye…;
reduce: { (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, array: ReadonlyArray<Layer.Any>) => Layer.Any): Layer.Any; (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, arra…;
reduceRight: { (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, array: ReadonlyArray<Layer.Any>) => Layer.Any): Layer.Any; (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, arra…;
find: { (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Layer.Any…;
findIndex: (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => number;
entries: () => ArrayIterator<[number, Layer.Any]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Layer.Any>;
includes: (searchElement: Layer.Any, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Layer.Any, index: number, array: Array<Layer.Any>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Layer.Any | undefined;
findLast: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Layer…;
findLastIndex: (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Layer.Any>;
toSorted: (compareFn?: ((a: Layer.Any, b: Layer.Any) => number) | undefined) => Array<Layer.Any>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Layer.Any>): Array<Layer.Any>; (start: number, deleteCount?: number): Array<Layer.Any> };
with: (index: number, value: Layer.Any) => Array<Layer.Any>;
}
list = function serveListFromTagImpl(tag: Hyperlink.PipeableTag, impl: unknown): ServeLayerListOne-serve list from Tag+impl (erased serve for listen dispatch).
serveListFromTagImpl(const tag: Hyperlink.PipeableTagtag, servesOrOptionsOrImpl: | Layer.Any
| ServeLayerList
| WsListenArg
| AnyNode
| object
servesOrOptionsOrImpl);
const const listenOptions:
| ListenOptions
| undefined
listenOptions = function coerceWsListenOptions(arg: number | string | ListenOptions | undefined): ListenOptions | undefinedNormalize a positional
WsListenArg
to
ListenOptions
.
coerceWsListenOptions(
const resolved:
| {
readonly _tag: "node"
readonly node: AnyNode
readonly addressArg: unknown
}
| {
readonly _tag: "nameless"
readonly addressArg: unknown
}
resolved.addressArg: unknownaddressArg as type WsListenArg = number | `:${number}` | `ws://${string}` | `wss://${string}` | `http://${string}` | `https://${string}` | ListenOptionsPositional listen address for
ws
— port / ":port" / ws(s):// / http(s):// (rewritten)
or full
ListenOptions
.
WsListenArg | undefined,
);
if (const resolved:
| {
readonly _tag: "node"
readonly node: AnyNode
readonly addressArg: unknown
}
| {
readonly _tag: "nameless"
readonly addressArg: unknown
}
resolved._tag: "node" | "nameless"_tag === "nameless") {
return const wsNameless: (
list: ServeLayerList,
options: ListenOptions | undefined
) => Layer.Layer<never, never, never>
Nameless anonymous WebSocket Node + bind. Soft-bakes
Lookup.layer
when Identity is
absent (same as
unix
nameless).
wsNameless(const list: readonly [
Layer.Any,
...Layer.Any[]
]
const list: {
0: Layer.Any;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
concat: { (...items: Array<ConcatArray<Layer.Any>>): Array<Layer.Any>; (...items: Array<Layer.Any | ConcatArray<Layer.Any>>): Array<Layer.Any> };
join: (separator?: string) => string;
slice: (start?: number, end?: number) => Array<Layer.Any>;
indexOf: (searchElement: Layer.Any, fromIndex?: number) => number;
lastIndexOf: (searchElement: Layer.Any, fromIndex?: number) => number;
every: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): this is readonly S[]; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any)…;
some: (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Array<Laye…;
reduce: { (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, array: ReadonlyArray<Layer.Any>) => Layer.Any): Layer.Any; (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, arra…;
reduceRight: { (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, array: ReadonlyArray<Layer.Any>) => Layer.Any): Layer.Any; (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, arra…;
find: { (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Layer.Any…;
findIndex: (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => number;
entries: () => ArrayIterator<[number, Layer.Any]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Layer.Any>;
includes: (searchElement: Layer.Any, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Layer.Any, index: number, array: Array<Layer.Any>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Layer.Any | undefined;
findLast: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Layer…;
findLastIndex: (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Layer.Any>;
toSorted: (compareFn?: ((a: Layer.Any, b: Layer.Any) => number) | undefined) => Array<Layer.Any>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Layer.Any>): Array<Layer.Any>; (start: number, deleteCount?: number): Array<Layer.Any> };
with: (index: number, value: Layer.Any) => Array<Layer.Any>;
}
list, const listenOptions:
| ListenOptions
| undefined
listenOptions);
}
const const node: AnyNodenode = const resolved: {
readonly _tag: "node"
readonly node: AnyNode
readonly addressArg: unknown
}
resolved.node: AnyNodenode;
if (function isNonWsNode(node: AnyNode): booleanNodes that are not WebSocket for
ws
(IpcSocket / Http / http(s) urls / unix paths).
isNonWsNode(const node: AnyNodenode)) {
return function wsRequiresWsLayer(node: string, kind: string): Layer.Layer<never, WsListenRequiresWs>Fail a Layer build with
WsListenRequiresWs
.
wsRequiresWsLayer(
const node: AnyNodenode.Key<unknown, NodeProtocol>.key: stringkey,
const node: AnyNodenode.kind: ProtocolKind | undefinedkind ??
(typeof const node: AnyNodenode.path: string | undefinedpath === "string"
? "IpcSocket"
: typeof const node: AnyNodenode.url: string | undefinedurl === "string"
? "url"
: "unknown"),
);
}
return const wsListenOn: (
node: AnyNode,
list: ServeLayerList,
options: ListenOptions | undefined
) => ListenLayer
Bind WebSocket for a Node — mint/claim when address-less or dynamic; else
wsServer
on a loopback port.
wsListenOn(const node: AnyNodenode, const list: readonly [
Layer.Any,
...Layer.Any[]
]
const list: {
0: Layer.Any;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
concat: { (...items: Array<ConcatArray<Layer.Any>>): Array<Layer.Any>; (...items: Array<Layer.Any | ConcatArray<Layer.Any>>): Array<Layer.Any> };
join: (separator?: string) => string;
slice: (start?: number, end?: number) => Array<Layer.Any>;
indexOf: (searchElement: Layer.Any, fromIndex?: number) => number;
lastIndexOf: (searchElement: Layer.Any, fromIndex?: number) => number;
every: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): this is readonly S[]; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any)…;
some: (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Array<Laye…;
reduce: { (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, array: ReadonlyArray<Layer.Any>) => Layer.Any): Layer.Any; (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, arra…;
reduceRight: { (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, array: ReadonlyArray<Layer.Any>) => Layer.Any): Layer.Any; (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, arra…;
find: { (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Layer.Any…;
findIndex: (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => number;
entries: () => ArrayIterator<[number, Layer.Any]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Layer.Any>;
includes: (searchElement: Layer.Any, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Layer.Any, index: number, array: Array<Layer.Any>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Layer.Any | undefined;
findLast: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Layer…;
findLastIndex: (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Layer.Any>;
toSorted: (compareFn?: ((a: Layer.Any, b: Layer.Any) => number) | undefined) => Array<Layer.Any>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Layer.Any>): Array<Layer.Any>; (start: number, deleteCount?: number): Array<Layer.Any> };
with: (index: number, value: Layer.Any) => Array<Layer.Any>;
}
list, const listenOptions:
| ListenOptions
| undefined
listenOptions);
}
const const node: AnyNodenode = nodeOrServesOrTag: | AnyNode
| Layer.Any
| ServeLayerList
| Hyperlink.PipeableTag
nodeOrServesOrTag as type AnyNode = NodeKey<unknown> & {
readonly url: string | undefined;
readonly path: string | undefined;
readonly kind: ProtocolKind | undefined;
readonly endpoints?: Endpoints;
readonly onConflict?: OnConflict;
readonly [portSym]?: number;
}
A
Tag
erased — its transport endpoints set, plus the primary address
(url and/or Unix path) and
ProtocolKind
kind (the first-declared endpoint, kept for
single-protocol readers), so a tag's distributed set is self-describing about where AND how to
reach each one.
AnyNode;
if (function isNonWsNode(node: AnyNode): booleanNodes that are not WebSocket for
ws
(IpcSocket / Http / http(s) urls / unix paths).
isNonWsNode(const node: AnyNodenode)) {
return function wsRequiresWsLayer(node: string, kind: string): Layer.Layer<never, WsListenRequiresWs>Fail a Layer build with
WsListenRequiresWs
.
wsRequiresWsLayer(
const node: AnyNodenode.Key<unknown, NodeProtocol>.key: stringkey,
const node: AnyNodenode.kind: ProtocolKind | undefinedkind ??
(typeof const node: AnyNodenode.path: string | undefinedpath === "string"
? "IpcSocket"
: typeof const node: AnyNodenode.url: string | undefinedurl === "string"
? "url"
: "unknown"),
);
}
const const serves:
| readonly [Layer.Any, ...Layer.Any[]]
| Layer.Layer<never, never, never>
serves = servesOrOptionsOrImpl: | Layer.Any
| ServeLayerList
| WsListenArg
| AnyNode
| object
servesOrOptionsOrImpl as
| import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<never, never, never>
| type ServeLayerList = readonly [Layer.Any, ...Layer.Any[]]Non-empty serve-layer list for
listen
/
unix
/
http
/
ws
/
nPipe
. Open in E/R — a HyperService may depend on other services (including other
HyperServices); callers Layer.provide outside. Uses
Layer.Any
(not closed never
channels) so deps remain expressible without expression-level any.
ServeLayerList;
const const list: readonly [
Layer.Any,
...Layer.Any[]
]
const list: {
0: Layer.Any;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
concat: { (...items: Array<ConcatArray<Layer.Any>>): Array<Layer.Any>; (...items: Array<Layer.Any | ConcatArray<Layer.Any>>): Array<Layer.Any> };
join: (separator?: string) => string;
slice: (start?: number, end?: number) => Array<Layer.Any>;
indexOf: (searchElement: Layer.Any, fromIndex?: number) => number;
lastIndexOf: (searchElement: Layer.Any, fromIndex?: number) => number;
every: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): this is readonly S[]; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any)…;
some: (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Array<Laye…;
reduce: { (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, array: ReadonlyArray<Layer.Any>) => Layer.Any): Layer.Any; (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, arra…;
reduceRight: { (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, array: ReadonlyArray<Layer.Any>) => Layer.Any): Layer.Any; (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, arra…;
find: { (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Layer.Any…;
findIndex: (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => number;
entries: () => ArrayIterator<[number, Layer.Any]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Layer.Any>;
includes: (searchElement: Layer.Any, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Layer.Any, index: number, array: Array<Layer.Any>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Layer.Any | undefined;
findLast: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Layer…;
findLastIndex: (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Layer.Any>;
toSorted: (compareFn?: ((a: Layer.Any, b: Layer.Any) => number) | undefined) => Array<Layer.Any>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Layer.Any>): Array<Layer.Any>; (start: number, deleteCount?: number): Array<Layer.Any> };
with: (index: number, value: Layer.Any) => Array<Layer.Any>;
}
list = (var Array: ArrayConstructorArray.ArrayConstructor.isArray(arg: any): arg is any[]isArray(const serves:
| readonly [Layer.Any, ...Layer.Any[]]
| Layer.Layer<never, never, never>
serves) ? const serves: (
| readonly [Layer.Any, ...Layer.Any[]]
| Layer.Layer<never, never, never>
) &
any[]
serves : [const serves:
| readonly [Layer.Any, ...Layer.Any[]]
| Layer.Layer<never, never, never>
serves]) as type ServeLayerList = readonly [Layer.Any, ...Layer.Any[]]Non-empty serve-layer list for
listen
/
unix
/
http
/
ws
/
nPipe
. Open in E/R — a HyperService may depend on other services (including other
HyperServices); callers Layer.provide outside. Uses
Layer.Any
(not closed never
channels) so deps remain expressible without expression-level any.
ServeLayerList;
return const wsListenOn: (
node: AnyNode,
list: ServeLayerList,
options: ListenOptions | undefined
) => ListenLayer
Bind WebSocket for a Node — mint/claim when address-less or dynamic; else
wsServer
on a loopback port.
wsListenOn(
const node: AnyNodenode,
const list: readonly [
Layer.Any,
...Layer.Any[]
]
const list: {
0: Layer.Any;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
concat: { (...items: Array<ConcatArray<Layer.Any>>): Array<Layer.Any>; (...items: Array<Layer.Any | ConcatArray<Layer.Any>>): Array<Layer.Any> };
join: (separator?: string) => string;
slice: (start?: number, end?: number) => Array<Layer.Any>;
indexOf: (searchElement: Layer.Any, fromIndex?: number) => number;
lastIndexOf: (searchElement: Layer.Any, fromIndex?: number) => number;
every: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): this is readonly S[]; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any)…;
some: (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => void, thisArg?: any) => void;
map: (callbackfn: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): Array<S>; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Array<Laye…;
reduce: { (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, array: ReadonlyArray<Layer.Any>) => Layer.Any): Layer.Any; (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, arra…;
reduceRight: { (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, array: ReadonlyArray<Layer.Any>) => Layer.Any): Layer.Any; (callbackfn: (previousValue: Layer.Any, currentValue: Layer.Any, currentIndex: number, arra…;
find: { (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Layer.Any…;
findIndex: (predicate: (value: Layer.Any, index: number, obj: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => number;
entries: () => ArrayIterator<[number, Layer.Any]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<Layer.Any>;
includes: (searchElement: Layer.Any, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: Layer.Any, index: number, array: Array<Layer.Any>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => Layer.Any | undefined;
findLast: { (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any): Layer…;
findLastIndex: (predicate: (value: Layer.Any, index: number, array: ReadonlyArray<Layer.Any>) => unknown, thisArg?: any) => number;
toReversed: () => Array<Layer.Any>;
toSorted: (compareFn?: ((a: Layer.Any, b: Layer.Any) => number) | undefined) => Array<Layer.Any>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<Layer.Any>): Array<Layer.Any>; (start: number, deleteCount?: number): Array<Layer.Any> };
with: (index: number, value: Layer.Any) => Array<Layer.Any>;
}
list,
function coerceWsListenOptions(arg: number | string | ListenOptions | undefined): ListenOptions | undefinedNormalize a positional
WsListenArg
to
ListenOptions
.
coerceWsListenOptions(options: WsListenArg | AnyNodeoptions as type WsListenArg = number | `:${number}` | `ws://${string}` | `wss://${string}` | `http://${string}` | `https://${string}` | ListenOptionsPositional listen address for
ws
— port / ":port" / ws(s):// / http(s):// (rewritten)
or full
ListenOptions
.
WsListenArg | undefined),
);
}