Hyperlinkv0.9.0-beta.0

Hyperlink

Hyperlink.serveconstsrc/Hyperlink.ts:4480
<Self, S extends Spec, R = never>(
  tag: HyperlinkTag<Self, S>,
  impl:
    | ImplWithDefaultOverrides<S>
    | Driver<S, R>
    | Effect.Effect<ImplWithDefaultOverrides<S> | Driver<S, R>, never, R>
): Layer.Layer<
  Self | Local<Self> | HandlerContextOf<S>,
  ValueErrorsOf<S>,
  R
>

Expose a Tag's implementation as an RPC server layer — the served counterpart of layer. Pair it with Node.httpServer / Node.wsServer (or listen) to put it on a transport, and dial it with client / connect.

Shared-Spec instances (Tag(wireKey, spec)Factory<Self>()(instanceKey)) share one RpcGroup: Layer.mergeAll(serve(A, …), serve(B, …)) mounts handlers once and routes by the per-call key header.

servingTaglayerNode.httpServerNode.wsServerlistenclientconnect
Source src/Hyperlink.ts:448025 lines
export const serve = <Self, S extends Spec, R = never>(
  tag: HyperlinkTag<Self, S>,
  impl:
    | ImplWithDefaultOverrides<S>
    | Driver<S, R>
    | Effect.Effect<ImplWithDefaultOverrides<S> | Driver<S, R>, never, R>,
): Layer.Layer<Self | Local<Self> | HandlerContextOf<S>, ValueErrorsOf<S>, R> => {
  // Stamp the served tag's key so an anonymous `listen` can derive a legible node name from the first
  // resource it serves (see {@link servedKeyOf} / anonymousNodeKey). Stamped on the FINAL layer both
  // paths return (servePlain re-merges, which would drop an earlier stamp).
  const plain = Object.assign(servePlain(tag, impl), {
    [servedKeySym]: tag.key,
  });
  if (!isIdentity(tag)) {
    return plain;
  }
  // Identity path requires Lookup.Identity at runtime (fail-closed). Kept off the public
  // `R` channel so plain `serve` stays TS2589-free (HyperlinkTag & identity brand blows up).
  const claimed = identityClaimLayer(tag, plain) as Layer.Layer<
    Self | Local<Self> | HandlerContextOf<S>,
    ValueErrorsOf<S>,
    R
  >;
  return Object.assign(claimed, { [servedKeySym]: tag.key });
};
Referenced by 7 symbols