Hyperlinkv0.9.0-beta.0

Gate

Gate.Serviceconstsrc/Gate.ts:1038
<Self>(): <const Name extends string, I extends Schema.Top = Schema.Void, A extends Schema.Top = Schema.Void, E extends Schema.Top = Schema.Never, R = never>(name: Name, config: ServiceConfig<I, A, E, R>) => Hyperlink.HyperlinkTag<Self, InstanceSpec<I, A, E>, Gate<PrettifyPayload<I['Type']>, Schema.Schema<out T>.Type<A>, Schema.Schema.Type<E>, never>> & { readonly run: StaticRun<I, A, E, Self>; } & { defaultSpec: { error: E; payload: I; success: A; effect: ServiceEffect<I, A, E, R>; concurrency?: number; rateLimit?: RateLimitOptions; name: Name; }; configure: (patch: ConfigPatch<LayerConfig<Schema.Schema.Type<I>, Schema.Schema.Type<A>, Schema.Schema.Type<E>, R>>) => Layer.Layer<never, never, never>; wrapGate: (fn: (previous: LayerConfig<Schema.Schema.Type<I>, Schema.Schema.Type<A>, Schema.Schema.Type<E>, R>['effect']) => LayerConfig<Schema.Schema.Type<I>, Schema.Schema.Type<A>, Schema.Schema.Type<E>, R>['effect']) => Layer.Layer<never, never, never>; layer: Layer.Layer<Store.Storage | Self | Hyperlink.Local<Self>, never, R>; }

Class factory: tag + wire schemas + baked-in .layer + .configure.

constructors
Source src/Gate.ts:103864 lines
export const Service = <Self>() => {
  function build<
    const Name extends string,
    I extends Schema.Top = typeof Schema.Void,
    A extends Schema.Top = typeof Schema.Void,
    E extends Schema.Top = typeof Schema.Never,
    R = never,
  >(
    name: Name,
    config: ServiceConfig<I, A, E, R>,
  ) {
    const wire = resolveRunWireSchemas(config);
    // Pass rateLimit onto TagSchemas so `rateLimitKey` metadata stamps at mint.
    const tag = runTag<Self>()(name, {
      ...config,
      rateLimit: config.rateLimit,
    });
    const error = wire.error;
    const defaultSpec = { name, ...config, ...wire, error };
    const layerConfig: LayerConfig<
      Schema.Schema.Type<I>,
      Schema.Schema.Type<A>,
      Schema.Schema.Type<E>,
      R
    > = {
      effect: config.effect,
      concurrency: config.concurrency,
      rateLimit: config.rateLimit,
      name,
    };
    return Object.assign(tag, {
      defaultSpec,
      configure: (
        patch: ConfigPatch<
          LayerConfig<
            Schema.Schema.Type<I>,
            Schema.Schema.Type<A>,
            Schema.Schema.Type<E>,
            R
          >
        >,
      ) => configureLayer(name, patch),
      wrapGate: (
        fn: (
          previous: LayerConfig<
            Schema.Schema.Type<I>,
            Schema.Schema.Type<A>,
            Schema.Schema.Type<E>,
            R
          >["effect"],
        ) => LayerConfig<
          Schema.Schema.Type<I>,
          Schema.Schema.Type<A>,
          Schema.Schema.Type<E>,
          R
        >["effect"],
      ) => configureWrapEffectField(name, fn),
      layer: layer(tag, layerConfig),
      // `tag` already carries the named static `.run` (stamped by `materializeGateTag`), so it is not
      // re-set here — `Object.assign` preserves it.
    });
  }
  return build;
};