{"version":3,"file":"define-Yxp4bcq5.mjs","names":["#url","#opts","#abort","#listeners","#startPromise","#resolveStart","#pump","#run","#resolveConnectionWaiters","#connections","#connectionsWaiters","#connectOnce","#readBody","#emit","#dispatch","#eventType","#data","#eventId"],"sources":["../src/channels/configure.ts","../src/channels/sse-reader.ts","../src/channels.ts","../src/tako/error.ts","../src/workflows/define.ts"],"sourcesContent":["type TokenResolver = () => string | null | Promise<string | null>;\n\ninterface ChannelsConfig {\n  token: TokenResolver | null;\n  fetch: typeof fetch;\n  websocket: typeof WebSocket;\n}\n\nfunction defaultFetch(): typeof fetch {\n  if (typeof globalThis.fetch !== \"function\") {\n    throw new Error(\"fetch is not available; pass configureChannels({ fetch }).\");\n  }\n  return globalThis.fetch.bind(globalThis);\n}\n\nfunction defaultWebSocket(): typeof WebSocket {\n  if (typeof globalThis.WebSocket !== \"function\") {\n    throw new Error(\"WebSocket is not available; pass configureChannels({ websocket }).\");\n  }\n  return globalThis.WebSocket;\n}\n\nfunction makeDefaultConfig(): ChannelsConfig {\n  return {\n    token: null,\n    fetch: defaultFetch(),\n    websocket: defaultWebSocket(),\n  };\n}\n\nlet current: ChannelsConfig | null = null;\n\nfunction getCurrent(): ChannelsConfig {\n  current ??= makeDefaultConfig();\n  return current;\n}\n\nexport function configureChannels(\n  input: Partial<{\n    token: TokenResolver;\n    fetch: typeof fetch;\n    websocket: typeof WebSocket;\n  }>,\n): void {\n  current = {\n    ...getCurrent(),\n    ...input,\n  };\n}\n\nexport function resetChannelsConfig(): void {\n  current = null;\n}\n\nexport function getChannelsConfig(): {\n  fetch: typeof fetch;\n  websocket: typeof WebSocket;\n  resolveToken(): Promise<string>;\n  resolveOptionalToken(): Promise<string | null>;\n} {\n  const config = getCurrent();\n  return {\n    fetch: config.fetch,\n    websocket: config.websocket,\n    async resolveToken() {\n      if (!config.token) {\n        throw new Error(\"configureChannels({ token }) is required for header-auth channels.\");\n      }\n      const token = await config.token();\n      if (!token) {\n        throw new Error(\"configureChannels token resolver returned null.\");\n      }\n      return token;\n    },\n    async resolveOptionalToken() {\n      if (!config.token) return null;\n      const token = await config.token();\n      return token || null;\n    },\n  };\n}\n","export interface SseReaderMessage {\n  id?: string;\n  type?: string;\n  data: string;\n}\n\nexport interface SseReaderOptions {\n  fetch?: typeof fetch;\n  headers?: Record<string, string>;\n  onMessage: (message: SseReaderMessage) => void;\n  onOpen?: () => void;\n  onError?: (error: Error) => void;\n  signal?: AbortSignal;\n  backoffBaseMs?: number;\n  backoffMaxMs?: number;\n  jitter?: number;\n  retryOnDisconnect?: boolean;\n}\n\ninterface DrainOptions {\n  connections?: number;\n}\n\ntype Listener = EventListenerOrEventListenerObject;\n\nexport class SseReader {\n  lastEventId: string | undefined;\n\n  readonly #url: string;\n  readonly #opts: SseReaderOptions;\n  readonly #abort = new AbortController();\n  readonly #listeners = new Map<string, Set<Listener>>();\n  #pump: Promise<void> | null = null;\n  #connections = 0;\n  #connectionsWaiters: Array<() => void> = [];\n  #startPromise: Promise<void> | null = null;\n  #resolveStart: (() => void) | null = null;\n\n  constructor(url: string, opts: SseReaderOptions) {\n    this.#url = url;\n    this.#opts = opts;\n    if (opts.signal) {\n      if (opts.signal.aborted) {\n        this.#abort.abort();\n      } else {\n        opts.signal.addEventListener(\"abort\", () => this.close(), { once: true });\n      }\n    }\n  }\n\n  start(): Promise<void> {\n    if (!this.#startPromise) {\n      this.#startPromise = new Promise((resolve) => {\n        this.#resolveStart = resolve;\n      });\n      this.#pump = this.#run();\n    }\n    return this.#startPromise;\n  }\n\n  close(): void {\n    this.#abort.abort();\n    this.#resolveConnectionWaiters();\n  }\n\n  addEventListener(type: string, listener: Listener | null): void {\n    if (!listener) {\n      return;\n    }\n    let listeners = this.#listeners.get(type);\n    if (!listeners) {\n      listeners = new Set();\n      this.#listeners.set(type, listeners);\n    }\n    listeners.add(listener);\n  }\n\n  removeEventListener(type: string, listener: Listener | null): void {\n    if (!listener) {\n      return;\n    }\n    this.#listeners.get(type)?.delete(listener);\n  }\n\n  dispatchEvent(event: Event): boolean {\n    const listeners = this.#listeners.get(event.type);\n    if (!listeners) {\n      return true;\n    }\n    for (const listener of listeners) {\n      if (typeof listener === \"function\") {\n        listener.call(this, event);\n      } else {\n        listener.handleEvent(event);\n      }\n    }\n    return true;\n  }\n\n  async drain(options: DrainOptions = {}): Promise<void> {\n    const targetConnections = options.connections;\n    if (targetConnections !== undefined) {\n      while (!this.#abort.signal.aborted && this.#connections < targetConnections) {\n        await new Promise<void>((resolve) => this.#connectionsWaiters.push(resolve));\n      }\n      this.close();\n    }\n    await this.#pump;\n  }\n\n  async #run(): Promise<void> {\n    let attempt = 0;\n    while (!this.#abort.signal.aborted) {\n      try {\n        await this.#connectOnce();\n        if (this.#abort.signal.aborted) {\n          this.#resolveStart?.();\n          return;\n        }\n        if (!this.#opts.retryOnDisconnect) {\n          this.#resolveStart?.();\n          return;\n        }\n        attempt = 0;\n        const err = new Error(\"SSE stream disconnected; reconnecting.\");\n        this.#opts.onError?.(err);\n        this.dispatchEvent(new ErrorEvent(\"error\", { error: err, message: err.message }));\n      } catch (error) {\n        if (this.#abort.signal.aborted) {\n          this.#resolveStart?.();\n          return;\n        }\n        const err = asError(error);\n        this.#opts.onError?.(err);\n        this.dispatchEvent(new ErrorEvent(\"error\", { error: err, message: err.message }));\n        if (!this.#opts.retryOnDisconnect) {\n          this.#resolveStart?.();\n          return;\n        }\n      }\n\n      attempt++;\n      await delay(backoff(attempt, this.#opts), this.#abort.signal);\n    }\n    this.#resolveStart?.();\n  }\n\n  async #connectOnce(): Promise<void> {\n    const fetchImpl = this.#opts.fetch ?? globalThis.fetch;\n    const headers = new Headers(this.#opts.headers);\n    if (this.lastEventId !== undefined) {\n      headers.set(\"Last-Event-ID\", this.lastEventId);\n    }\n\n    const response = await fetchImpl(this.#url, {\n      headers,\n      signal: this.#abort.signal,\n    });\n    if (!response.ok) {\n      throw new Error(`SSE request failed with status ${response.status}.`);\n    }\n    if (!response.body) {\n      throw new Error(\"SSE response body is not readable.\");\n    }\n\n    this.#connections++;\n    this.#resolveConnectionWaiters();\n    this.#resolveStart?.();\n    this.#opts.onOpen?.();\n    this.dispatchEvent(new Event(\"open\"));\n\n    await this.#readBody(response.body);\n  }\n\n  async #readBody(body: ReadableStream<Uint8Array>): Promise<void> {\n    const reader = body.getReader();\n    const decoder = new TextDecoder();\n    let buffer = \"\";\n    const parser = new SseParser((message) => {\n      if (message.id !== undefined) {\n        this.lastEventId = message.id;\n      }\n      this.#opts.onMessage(message);\n      this.dispatchEvent(new MessageEvent(\"message\", { data: message.data }));\n    });\n\n    try {\n      while (!this.#abort.signal.aborted) {\n        const { done, value } = await reader.read();\n        if (done) {\n          break;\n        }\n        buffer += decoder.decode(value, { stream: true });\n        const lines = buffer.split(/\\r\\n|\\r|\\n/);\n        buffer = lines.pop() ?? \"\";\n        for (const line of lines) {\n          parser.line(line);\n        }\n      }\n      buffer += decoder.decode();\n      if (buffer.length > 0) {\n        parser.line(buffer);\n      }\n      parser.end();\n    } finally {\n      reader.releaseLock();\n    }\n  }\n\n  #resolveConnectionWaiters(): void {\n    const waiters = this.#connectionsWaiters.splice(0);\n    for (const resolve of waiters) {\n      resolve();\n    }\n  }\n}\n\nclass SseParser {\n  #eventType: string | undefined;\n  #eventId: string | undefined;\n  #data: string[] = [];\n  readonly #emit: (message: SseReaderMessage) => void;\n\n  constructor(emit: (message: SseReaderMessage) => void) {\n    this.#emit = emit;\n  }\n\n  line(line: string): void {\n    if (line === \"\") {\n      this.#dispatch();\n      return;\n    }\n    if (line.startsWith(\":\")) {\n      return;\n    }\n\n    const separator = line.indexOf(\":\");\n    const field = separator === -1 ? line : line.slice(0, separator);\n    const value =\n      separator === -1 ? \"\" : line.slice(separator + (line[separator + 1] === \" \" ? 2 : 1));\n\n    switch (field) {\n      case \"event\":\n        this.#eventType = value;\n        break;\n      case \"data\":\n        this.#data.push(value);\n        break;\n      case \"id\":\n        this.#eventId = value;\n        break;\n    }\n  }\n\n  end(): void {\n    this.#dispatch();\n  }\n\n  #dispatch(): void {\n    if (this.#data.length === 0) {\n      this.#eventType = undefined;\n      return;\n    }\n\n    const message: SseReaderMessage = {\n      data: this.#data.join(\"\\n\"),\n    };\n    if (this.#eventId !== undefined) {\n      message.id = this.#eventId;\n    }\n    if (this.#eventType !== undefined) {\n      message.type = this.#eventType;\n    }\n    this.#emit(message);\n    this.#data = [];\n    this.#eventType = undefined;\n  }\n}\n\nfunction backoff(attempt: number, opts: SseReaderOptions): number {\n  const base = opts.backoffBaseMs ?? 1000;\n  const max = opts.backoffMaxMs ?? 30_000;\n  const jitter = opts.jitter ?? 0.3;\n  const capped = Math.min(max, base * 2 ** Math.max(0, attempt - 1));\n  if (jitter <= 0) {\n    return capped;\n  }\n  return capped + Math.floor(capped * jitter * Math.random());\n}\n\nfunction delay(ms: number, signal: AbortSignal): Promise<void> {\n  if (signal.aborted) {\n    return Promise.resolve();\n  }\n  return new Promise((resolve) => {\n    let settled = false;\n    let timer: ReturnType<typeof setTimeout>;\n    const finish = () => {\n      if (settled) return;\n      settled = true;\n      clearTimeout(timer);\n      signal.removeEventListener(\"abort\", finish);\n      globalThis.removeEventListener?.(\"online\", finish);\n      resolve();\n    };\n    timer = setTimeout(finish, ms);\n    signal.addEventListener(\"abort\", finish, { once: true });\n    globalThis.addEventListener?.(\"online\", finish, { once: true });\n  });\n}\n\nfunction asError(error: unknown): Error {\n  return error instanceof Error ? error : new Error(String(error));\n}\n","import type {\n  ChannelAuthorizeInput,\n  ChannelAuthorizeResponse,\n  ChannelConnectOptions,\n  ChannelDefinitionTransport,\n  ChannelMessage,\n  ChannelPublishInput,\n  ChannelPublishOptions,\n  ChannelSocket,\n  ChannelSubscribeOptions,\n  ChannelSubscription,\n} from \"./types\";\nimport { isChannelDefinition, type ChannelDefinition } from \"./channels/meta\";\nimport { getChannelsConfig } from \"./channels/configure\";\nimport { SseReader } from \"./channels/sse-reader\";\n\nexport type ChannelSocketPublisher = <T>(\n  channel: string,\n  message: ChannelPublishInput<T>,\n) => Promise<ChannelMessage<T>>;\n\nlet socketPublisher: ChannelSocketPublisher | null = null;\n\nexport function setChannelSocketPublisher(fn: ChannelSocketPublisher | null): void {\n  socketPublisher = fn;\n}\n\nexport const TAKO_CHANNELS_BASE_PATH = \"/_tako/channels\";\nconst DEFAULT_CHANNEL_REPLAY_WINDOW_MS = 24 * 60 * 60 * 1000;\nconst DEFAULT_CHANNEL_INACTIVITY_TTL_MS = 0;\nconst DEFAULT_CHANNEL_KEEPALIVE_INTERVAL_MS = 25 * 1000;\nconst DEFAULT_CHANNEL_MAX_CONNECTION_LIFETIME_MS = 2 * 60 * 60 * 1000;\n\nfunction normalizeBaseUrl(baseUrl?: string): URL {\n  if (baseUrl) {\n    return new URL(baseUrl);\n  }\n  if (typeof globalThis.location?.origin === \"string\" && globalThis.location.origin.length > 0) {\n    return new URL(globalThis.location.origin);\n  }\n  throw new Error(\"Channel operations require a baseUrl outside the browser.\");\n}\n\nfunction channelBaseUrl(\n  channel: string,\n  baseUrl?: string,\n  params: Record<string, unknown> = {},\n): URL {\n  const url = normalizeBaseUrl(baseUrl);\n  url.pathname = `${TAKO_CHANNELS_BASE_PATH}/${encodeURIComponent(channel)}`;\n  url.search = \"\";\n  for (const [key, value] of Object.entries(params)) {\n    if (value === undefined || value === null) continue;\n    url.searchParams.set(key, encodeQueryValue(value));\n  }\n  return url;\n}\n\nfunction encodeQueryValue(value: unknown): string {\n  if (typeof value === \"string\") return value;\n  if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n    return value.toString();\n  }\n  return JSON.stringify(value);\n}\n\nfunction withQuery(url: URL, key: string, value?: string | number): URL {\n  if (value !== undefined) {\n    url.searchParams.set(key, String(value));\n  }\n  return url;\n}\n\nfunction toWebSocketUrl(url: URL): string {\n  const ws = new URL(url.toString());\n  ws.protocol = ws.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n  return ws.toString();\n}\n\nfunction defaultWebSocketFactory(url: string): unknown {\n  const ctor = getChannelsConfig().websocket;\n  if (!ctor) {\n    throw new Error(\"WebSocket is not available in this runtime.\");\n  }\n  return new ctor(url);\n}\n\nfunction closeRaw(raw: unknown, code?: number, reason?: string): void {\n  if (typeof raw !== \"object\" || raw === null) {\n    return;\n  }\n  const maybeClose = (raw as { close?: (code?: number, reason?: string) => void }).close;\n  if (typeof maybeClose === \"function\") {\n    maybeClose.call(raw, code, reason);\n  }\n}\n\nfunction sendRaw(raw: unknown, data: unknown): void {\n  if (typeof raw !== \"object\" || raw === null) {\n    throw new Error(\"Channel connection does not support send().\");\n  }\n  const maybeSend = (raw as { send?: (data: unknown) => void }).send;\n  if (typeof maybeSend !== \"function\") {\n    throw new Error(\"Channel connection does not support send().\");\n  }\n  let payload = data;\n  if (\n    data !== null &&\n    typeof data === \"object\" &&\n    !(data instanceof ArrayBuffer) &&\n    !ArrayBuffer.isView(data) &&\n    !(typeof Blob !== \"undefined\" && data instanceof Blob)\n  ) {\n    payload = JSON.stringify(data);\n  }\n  maybeSend.call(raw, payload);\n}\n\nfunction sendWhenOpen(raw: unknown, data: unknown): void {\n  if (typeof raw !== \"object\" || raw === null) return;\n  const target = raw as {\n    readyState?: number;\n    OPEN?: number;\n    addEventListener?: (type: \"open\", listener: () => void, opts?: { once?: boolean }) => void;\n  };\n  const send = () => sendRaw(raw, data);\n  const openState = target.OPEN ?? 1;\n\n  if (target.readyState === undefined || target.readyState === openState) {\n    send();\n    return;\n  }\n\n  if (typeof target.addEventListener === \"function\") {\n    target.addEventListener(\"open\", send, { once: true });\n  }\n}\n\nfunction sendAuthEnvelope(raw: unknown, lastMessageId?: string): void {\n  void getChannelsConfig()\n    .resolveOptionalToken()\n    .then((token) => {\n      if (!token) return;\n      sendWhenOpen(raw, {\n        type: \"tako.auth\",\n        token,\n        ...(lastMessageId !== undefined && { lastMessageId }),\n      });\n    });\n}\n\nexport class Channel {\n  readonly name: string;\n  readonly transport: ChannelDefinitionTransport | undefined;\n  readonly params: Record<string, unknown>;\n\n  constructor(\n    name: string,\n    transport?: ChannelDefinitionTransport,\n    params: Record<string, unknown> = {},\n  ) {\n    this.name = name;\n    this.transport = transport;\n    this.params = params;\n  }\n\n  async publish<T = unknown>(\n    message: ChannelPublishInput<T>,\n    options: ChannelPublishOptions = {},\n  ): Promise<ChannelMessage<T>> {\n    if (socketPublisher && !options.baseUrl) {\n      return socketPublisher(this.name, message);\n    }\n\n    throw new Error(\n      \"Channel.publish requires the Tako server runtime. Browser clients should use connect().send() for WebSocket channels.\",\n    );\n  }\n\n  subscribe(options: ChannelSubscribeOptions = {}): ChannelSubscription {\n    const url = channelBaseUrl(this.name, options.baseUrl, this.params);\n    const factory = options.eventSourceFactory;\n    const init: { headers?: Record<string, string>; lastEventId?: string } = {};\n    if (options.headers !== undefined) {\n      init.headers = options.headers;\n    }\n    if (options.lastEventId !== undefined) {\n      init.lastEventId = options.lastEventId;\n    }\n    if (factory) {\n      const raw = factory(url.toString(), init);\n      return {\n        transport: \"sse\",\n        raw,\n        close() {\n          closeRaw(raw);\n        },\n      };\n    }\n\n    const readerOptions = {\n      fetch: getChannelsConfig().fetch,\n      onMessage: () => {},\n      retryOnDisconnect: true,\n      ...(options.headers !== undefined && { headers: options.headers }),\n    };\n    const reader = new SseReader(url.toString(), readerOptions);\n    if (options.lastEventId !== undefined) {\n      reader.lastEventId = options.lastEventId;\n    }\n    void reader.start();\n    return {\n      transport: \"sse\",\n      raw: reader,\n      close() {\n        reader.close();\n      },\n    };\n  }\n\n  connect(options: ChannelConnectOptions = {}): ChannelSocket {\n    if (this.transport !== \"ws\") {\n      throw new Error(\"Channel does not enable WebSocket transport.\");\n    }\n\n    const url = channelBaseUrl(this.name, options.baseUrl, this.params);\n    withQuery(url, \"last_message_id\", options.lastMessageId);\n\n    const factory = options.webSocketFactory ?? defaultWebSocketFactory;\n    const raw = factory(toWebSocketUrl(url));\n    sendAuthEnvelope(raw, options.lastMessageId);\n    return {\n      transport: \"ws\",\n      raw,\n      close(code?: number, reason?: string) {\n        closeRaw(raw, code, reason);\n      },\n      send(data: unknown) {\n        sendRaw(raw, data);\n      },\n    };\n  }\n}\n\ninterface RegistryEntry {\n  name: string;\n  definition: ChannelDefinition;\n}\n\n/**\n * Handle returned by the default export of a `<app_root>/channels/<name>.ts` file\n * (unparameterized) or by invoking a parameterized channel with its params.\n */\nexport interface ChannelHandle {\n  publish: Channel[\"publish\"];\n  subscribe: Channel[\"subscribe\"];\n  connect?: Channel[\"connect\"];\n}\n\n/**\n * Loose runtime shape for the default export of a channel module.\n * Unparameterized channels expose `publish/subscribe/connect` directly;\n * parameterized channels are callable `(params)` returning a handle. Typed\n * as an intersection so both usages compile — runtime enforces which one\n * is valid for a given channel.\n */\nexport type ChannelAccessorEntry = ChannelHandle &\n  ((params: Record<string, unknown>) => ChannelHandle);\n\nfunction makeHandle(\n  definition: ChannelDefinition,\n  resolvedName: string,\n  params: Record<string, unknown> = {},\n): ChannelHandle {\n  const isWs = definition.transport === \"ws\";\n  const channel = new Channel(resolvedName, isWs ? \"ws\" : undefined, params);\n  const handle: ChannelHandle = {\n    publish: channel.publish.bind(channel),\n    subscribe: channel.subscribe.bind(channel),\n  };\n  if (isWs) {\n    handle.connect = channel.connect.bind(channel);\n  }\n  return handle;\n}\n\nfunction buildAccessorEntry(definition: ChannelDefinition, baseName: string): ChannelAccessorEntry {\n  if (!definition.hasParams) {\n    return makeHandle(definition, baseName) as ChannelAccessorEntry;\n  }\n  return ((params: Record<string, unknown>) =>\n    makeHandle(definition, baseName, params)) as ChannelAccessorEntry;\n}\n\n/** Convert a camelCase prop to the kebab-case channel file name. */\nfunction propToChannelName(prop: string): string {\n  return prop\n    .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n    .replace(/([a-zA-Z])([0-9])/g, \"$1-$2\")\n    .replace(/([0-9])([a-zA-Z])/g, \"$1-$2\")\n    .toLowerCase();\n}\n\nexport class ChannelRegistry {\n  private entries: RegistryEntry[] = [];\n\n  get all(): ReadonlyArray<RegistryEntry> {\n    return this.entries;\n  }\n\n  register(\n    name: string,\n    input: ChannelDefinition | { readonly definition: ChannelDefinition },\n  ): void {\n    const definition: ChannelDefinition =\n      \"definition\" in input && isChannelDefinition(input.definition)\n        ? input.definition\n        : (input as ChannelDefinition);\n    if (this.entries.some((e) => e.name === name)) {\n      throw new Error(`duplicate channel '${name}'`);\n    }\n    if (definition.channel !== name) {\n      throw new Error(\n        `channel '${name}' registration received definition for '${definition.channel}'`,\n      );\n    }\n    this.entries.push({ name, definition });\n  }\n\n  clear(): void {\n    this.entries = [];\n  }\n\n  /** Look up a discovered channel by its declared channel name. */\n  findByName(name: string): RegistryEntry | undefined {\n    return this.entries.find((e) => e.name === name);\n  }\n\n  resolve(\n    channel: string,\n  ): { definition: ChannelDefinition; params: Record<string, unknown> } | null {\n    const entry = this.entries.find((candidate) => candidate.name === channel);\n    if (!entry) return null;\n    return { definition: entry.definition, params: {} };\n  }\n\n  async authorize(input: ChannelAuthorizeInput): Promise<ChannelAuthorizeResponse> {\n    const matched = this.resolve(input.channel);\n    if (!matched) return { ok: false };\n\n    if (input.operation === \"publish\" && matched.definition.handler === undefined) {\n      return { ok: false, reason: \"sse_publish_not_allowed\" };\n    }\n\n    if (matched.definition.auth === false) {\n      return { ok: true, ...definitionLifecycleConfig(matched.definition) };\n    }\n\n    const verdict = await matched.definition.auth.verify({\n      channel: input.channel,\n      operation: input.operation,\n      params: input.params,\n      ...(input.header !== undefined && { header: input.header }),\n      ...(input.cookie !== undefined && { cookie: input.cookie }),\n    });\n\n    if (verdict === false) return { ok: false };\n\n    const config = definitionLifecycleConfig(matched.definition);\n    if (verdict === true) return { ok: true, ...config };\n    return verdict.subject === undefined\n      ? { ok: true, ...config }\n      : { ok: true, ...config, subject: verdict.subject };\n  }\n}\n\n/**\n * Wrap a {@link ChannelRegistry} in a Proxy so property access via\n * `accessor.<name>` returns a {@link ChannelAccessorEntry} for the matching\n * discovered channel (the prop is kebab-cased first). Existing registry\n * methods (`register`, `resolve`, `authorize`, `clear`, `all`, `findByName`)\n * pass through.\n */\nexport function withChannelAccessor(\n  registry: ChannelRegistry,\n): ChannelRegistry & Record<string, ChannelAccessorEntry> {\n  const handler: ProxyHandler<ChannelRegistry> = {\n    get(target, prop, receiver) {\n      if (typeof prop === \"string\" && !(prop in target)) {\n        const entry = target.findByName(propToChannelName(prop));\n        if (entry) {\n          return buildAccessorEntry(entry.definition, entry.name);\n        }\n      }\n      return Reflect.get(target, prop, receiver);\n    },\n  };\n  return new Proxy(registry, handler) as ChannelRegistry & Record<string, ChannelAccessorEntry>;\n}\n\nfunction definitionLifecycleConfig(definition: ChannelDefinition) {\n  const config: Omit<ChannelAuthorizeResponse, \"ok\" | \"subject\" | \"reason\"> = {\n    replayWindowMs: definition.replayWindowMs ?? DEFAULT_CHANNEL_REPLAY_WINDOW_MS,\n    inactivityTtlMs: definition.inactivityTtlMs ?? DEFAULT_CHANNEL_INACTIVITY_TTL_MS,\n    keepaliveIntervalMs: definition.keepaliveIntervalMs ?? DEFAULT_CHANNEL_KEEPALIVE_INTERVAL_MS,\n    maxConnectionLifetimeMs:\n      definition.maxConnectionLifetimeMs ?? DEFAULT_CHANNEL_MAX_CONNECTION_LIFETIME_MS,\n  };\n  if (definition.handler !== undefined) {\n    config.transport = \"ws\";\n  }\n  return config;\n}\n","/**\n * Stable error codes raised by the Tako internal-RPC layer. Apps can switch\n * on `err.code` to render a user-safe message; the original cause is on\n * `err.cause` (and logged to stdout so operators can debug).\n */\nexport type TakoErrorCode =\n  | \"TAKO_UNAVAILABLE\"\n  | \"TAKO_TIMEOUT\"\n  | \"TAKO_PROTOCOL\"\n  | \"TAKO_RPC_ERROR\";\n\n/**\n * Error raised by Tako SDK operations that cross the internal socket\n * (workflows enqueue/signal/claim/..., channels publish). Every raw Node\n * socket failure is wrapped so internal paths and syscall names never leak\n * to end users — `message` stays generic, `code` is stable, and the\n * original error is preserved on `.cause`.\n */\nexport class TakoError extends Error {\n  readonly code: TakoErrorCode;\n\n  constructor(code: TakoErrorCode, message: string, options?: { cause?: unknown }) {\n    super(message, options);\n    this.name = \"TakoError\";\n    this.code = code;\n  }\n}\n","import { TakoError } from \"../tako/error\";\nimport type { EnqueueOptions } from \"./engine\";\nimport type { RunId, WorkflowOpts, WorkflowRuntimeOpts } from \"./types\";\nimport type { WorkflowHandler } from \"./worker\";\n\nexport const WORKFLOW_SYMBOL = Symbol(\"workflow\");\n\nexport interface WorkflowDefinition<P = unknown> {\n  readonly type: typeof WORKFLOW_SYMBOL;\n  readonly name: string;\n  readonly handler: WorkflowHandler<P>;\n  readonly opts: WorkflowRuntimeOpts;\n}\n\n/**\n * The default export from a `<app_root>/workflows/<name>.ts` file. `.enqueue(payload)`\n * schedules a run; `.definition` holds the discovery metadata.\n */\nexport interface WorkflowExport<P = unknown> {\n  readonly definition: WorkflowDefinition<P>;\n  /** Schedule a run of this workflow with the declared payload type. */\n  enqueue(payload: P, options?: EnqueueOptions): Promise<RunId>;\n}\n\n/**\n * Runtime hooks for workflow enqueue and signal. The server/worker\n * bootstrap installs these at boot; client bundles never install them,\n * so `.enqueue()` and `signal()` throw a clean `TakoError` if reached\n * from browser code (same failure shape as a missing Tako server).\n */\nexport interface WorkflowRuntime {\n  enqueue(name: string, payload: unknown, options?: EnqueueOptions): Promise<RunId>;\n  signal(event: string, payload?: unknown): Promise<number>;\n}\n\nlet runtime: WorkflowRuntime | null = null;\n\n/**\n * Install the workflow runtime. Called once at server/worker boot — keeps\n * `defineWorkflow`, `.enqueue`, and `signal` free of any static import\n * chain into the RPC client (and its `node:net` dep), so authoring files\n * stay safe to bundle into isomorphic code.\n */\nexport function setWorkflowRuntime(rt: WorkflowRuntime | null): void {\n  runtime = rt;\n}\n\nfunction requireRuntime(): WorkflowRuntime {\n  if (!runtime) {\n    throw new TakoError(\n      \"TAKO_UNAVAILABLE\",\n      \"Workflow runtime not installed. `.enqueue()` and `signal()` can only be called from server-side code.\",\n    );\n  }\n  return runtime;\n}\n\n/**\n * Define a workflow and return a typed handle ready to enqueue.\n *\n * The `name` must be unique per app — the conventional choice is the file\n * basename (kebab-case), matching the filename discovery scans for.\n *\n * @example\n * ```ts\n * // <app_root>/workflows/send-email.ts\n * import { defineWorkflow } from \"tako.sh\";\n *\n * export default defineWorkflow<{ userId: string }>(\n *   \"send-email\",\n *   {\n *     retries: 4,\n *     schedule: \"0 9 * * *\",\n *     handler: async (payload, ctx) => {\n *       ctx.logger.info(\"sending email\");\n *       await ctx.run(\"send\", (step) => {\n *         step.logger.info(\"calling mailer\");\n *         return sendEmail(payload.userId);\n *       });\n *     },\n *   },\n * );\n *\n * // anywhere:\n * import sendEmail from \"./workflows/send-email\";\n * await sendEmail.enqueue({ userId: \"u1\" });\n * ```\n */\nexport function defineWorkflow<P = unknown>(\n  name: string,\n  opts: WorkflowOpts<P>,\n): WorkflowExport<P> {\n  const { handler, ...runtimeOpts } = opts;\n  const definition: WorkflowDefinition<P> = {\n    type: WORKFLOW_SYMBOL,\n    name,\n    handler,\n    opts: runtimeOpts,\n  };\n  return {\n    definition,\n    enqueue(payload, options) {\n      return requireRuntime().enqueue(name, payload, options);\n    },\n  };\n}\n\n/**\n * Wake every workflow run parked on `ctx.waitFor(event)` with a payload.\n * Call from any server-side context — an HTTP handler, a webhook receiver,\n * a cron tick, another workflow. Returns the number of waiters woken.\n *\n * @example\n * ```ts\n * import { signal } from \"tako.sh\";\n * await signal(`approval:order-${orderId}`, { approved: true });\n * ```\n */\nexport function signal(event: string, payload?: unknown): Promise<number> {\n  return requireRuntime().signal(event, payload);\n}\n\n/** Narrow `value` to a `WorkflowExport` produced by `defineWorkflow`. */\nexport function isWorkflowExport(value: unknown): value is WorkflowExport {\n  return (\n    typeof value === \"object\" &&\n    value !== null &&\n    \"definition\" in value &&\n    isWorkflowDefinition((value as { definition: unknown }).definition)\n  );\n}\n\nexport function isWorkflowDefinition(value: unknown): value is WorkflowDefinition {\n  return (\n    typeof value === \"object\" &&\n    value !== null &&\n    \"type\" in value &&\n    \"name\" in value &&\n    \"handler\" in value &&\n    \"opts\" in value &&\n    (value as { type: unknown }).type === WORKFLOW_SYMBOL\n  );\n}\n"],"mappings":"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"}