Hyperlinkv0.8.0-beta.28

QueueHyperlink

QueueHyperlink.Tagconstsrc/QueueHyperlink.ts:981
<Self>(): {
  <F extends Schema.Struct.Fields, HSelf>(
    key: string,
    payload: Schema.Struct<F>,
    options: {
      readonly description?: string
      readonly node: NodeKey<HSelf>
    }
  ): QueueNodeBoundTag<Self, F, HSelf> &
    QueueSuccessCarrier<typeof Schema.Void> &
    QueueErrorCarrier<typeof Schema.Never> &
    QueueItemSchemaCarrier<F>
  <
    F extends Schema.Struct.Fields,
    Success extends Schema.Top,
    Error extends Schema.Top = Schema.Never
  >(
    key: string,
    payload: Schema.Struct<F>,
    success: Success,
    error?: Error
  ): QueueTag<Self, F, Success, Error> &
    QueueSuccessCarrier<Success> &
    QueueErrorCarrier<Error> &
    QueueItemSchemaCarrier<F>
  <F extends Schema.Struct.Fields>(
    key: string,
    payload: Schema.Struct<F>,
    options?: { readonly description?: string }
  ): QueueTag<Self, F> &
    QueueSuccessCarrier<typeof Schema.Void> &
    QueueErrorCarrier<typeof Schema.Never> &
    QueueItemSchemaCarrier<F>
  <F extends Schema.Struct.Fields, HSelf>(
    key: string,
    config: QueueTagConfig<F> & { readonly node: NodeKey<HSelf> }
  ): QueueNodeBoundTag<Self, F, HSelf> &
    QueueSuccessCarrier<typeof Schema.Void> &
    QueueErrorCarrier<typeof Schema.Never> &
    QueueItemSchemaCarrier<F>
  <
    F extends Schema.Struct.Fields,
    Success extends Schema.Top = Schema.Void,
    Error extends Schema.Top = Schema.Never
  >(
    key: string,
    config: QueueTagConfig<F, Success, Error>
  ): QueueTag<Self, F, Success, Error> &
    QueueSuccessCarrier<Success> &
    QueueErrorCarrier<Error> &
    QueueItemSchemaCarrier<F>
}

Define a queue as a named service Tag: class Mail extends QueueHyperlink.Tag<Mail>()("@app/Mail", { payload: JobSchema }) {}. The class is the Tag — yield* Mail inside an Effect resolves the QueueHyperlink handle (enqueue / status / metrics), while layer provides the running queue and serve exposes it over RPC. payload is the item schema; the QueueTagConfig overload adds success / error wire schemas for the worker's result and failures.

const queueTag = <Self>() => {
  function build<F extends Schema.Struct.Fields, HSelf>(
    key: string,
    payload: Schema.Struct<F>,
    options: { readonly description?: string; readonly node: NodeKey<HSelf> },
  ): QueueNodeBoundTag<Self, F, HSelf> &
    QueueSuccessCarrier<typeof Schema.Void> &
    QueueErrorCarrier<typeof Schema.Never> &
    QueueItemSchemaCarrier<F>;
  function build<
    F extends Schema.Struct.Fields,
    Success extends Schema.Top,
    Error extends Schema.Top = typeof Schema.Never,
  >(
    key: string,
    payload: Schema.Struct<F>,
    success: Success,
    error?: Error,
  ): QueueTag<Self, F, Success, Error> &
    QueueSuccessCarrier<Success> &
    QueueErrorCarrier<Error> &
    QueueItemSchemaCarrier<F>;
  function build<F extends Schema.Struct.Fields>(
    key: string,
    payload: Schema.Struct<F>,
    options?: { readonly description?: string },
  ): QueueTag<Self, F> &
    QueueSuccessCarrier<typeof Schema.Void> &
    QueueErrorCarrier<typeof Schema.Never> &
    QueueItemSchemaCarrier<F>;
  function build<F extends Schema.Struct.Fields, HSelf>(
    key: string,
    config: QueueTagConfig<F> & { readonly node: NodeKey<HSelf> },
  ): QueueNodeBoundTag<Self, F, HSelf> &
    QueueSuccessCarrier<typeof Schema.Void> &
    QueueErrorCarrier<typeof Schema.Never> &
    QueueItemSchemaCarrier<F>;
  function build<
    F extends Schema.Struct.Fields,
    Success extends Schema.Top = typeof Schema.Void,
    Error extends Schema.Top = typeof Schema.Never,
  >(
    key: string,
    config: QueueTagConfig<F, Success, Error>,
  ): QueueTag<Self, F, Success, Error> &
    QueueSuccessCarrier<Success> &
    QueueErrorCarrier<Error> &
    QueueItemSchemaCarrier<F>;
  // Implementation signature — intentionally loose (`any` wire slots): the tag's real `Success`/
  // `Error` are fixed by the overload selected above. The runtime resolves them from the config /
  // positional args below; the phantom carriers are type-only.
  function build<F extends Schema.Struct.Fields>(
    key: string,
    second: Schema.Struct<F> | QueueTagConfig<F, Schema.Top, Schema.Top>,
    third?: Schema.Top | QueueTagPositionalOptions,
    fourth?: Schema.Top,
  ): QueueTag<Self, F, any, any> &
    QueueSuccessCarrier<any> &
    QueueErrorCarrier<any> &
    QueueItemSchemaCarrier<F> {
    const resolved = isQueueTagConfig(second)
      ? {
          payload: second.payload,
          success: second.success,
          error: second.error,
          description: second.description,
          node: second.node,
        }
      : Schema.isSchema(third)
        ? {
            payload: second,
            success: third,
            error: fourth,
            description: undefined,
            node: undefined,
          }
        : {
            payload: second,
            success: undefined,
            error: undefined,
            description: third?.description,
            node: third?.node,
          };
    return nameQueueService(materializeQueueTag<Self, F, Schema.Top, Schema.Top>(key, resolved));
  }
  return build;
};