{"version":3,"file":"index.cjs","names":["app: Inngest.Any | undefined","getSubscriptionToken","TokenSubscription"],"sources":["../../../../src/components/realtime/subscribe/index.ts"],"sourcesContent":["import type { Inngest } from \"../../Inngest.ts\";\nimport type { Realtime } from \"../types.ts\";\nimport { TokenSubscription } from \"./TokenSubscription.ts\";\n\ntype ChannelTopicNames<InputChannel extends Realtime.ChannelInput> = Extract<\n  keyof Realtime.Channel.InferTopics<InputChannel>,\n  string\n>;\n\ntype ChannelTopicsInput<InputChannel extends Realtime.ChannelInput> = [\n  ChannelTopicNames<InputChannel>,\n] extends [never]\n  ? string[]\n  : string extends ChannelTopicNames<InputChannel>\n    ? string[]\n    : ChannelTopicNames<InputChannel>[];\n\ntype SubscribeBaseArgs<\n  InputChannel extends Realtime.ChannelInput,\n  InputTopics extends ChannelTopicsInput<InputChannel>,\n> = {\n  app?: Inngest.Like;\n  key?: string;\n  channel: InputChannel;\n  topics: InputTopics;\n  validate?: boolean;\n  apiBaseUrl?: string;\n};\n\ntype SubscribeCallbackArgs<\n  TToken extends Realtime.Subscribe.Token = Realtime.Subscribe.Token,\n> = {\n  onMessage: Realtime.Subscribe.Callback<TToken>;\n  onError?: (err: unknown) => void;\n};\n\nexport function subscribe<\n  const InputChannel extends Realtime.ChannelInput,\n  const InputTopics extends ChannelTopicsInput<InputChannel>,\n  const TToken extends Realtime.Subscribe.Token<InputChannel, InputTopics>,\n  const TOutput extends Realtime.Subscribe.StreamSubscription<TToken>,\n>(token: SubscribeBaseArgs<InputChannel, InputTopics>): Promise<TOutput>;\nexport function subscribe<\n  const InputChannel extends Realtime.ChannelInput,\n  const InputTopics extends ChannelTopicsInput<InputChannel>,\n  const TToken extends Realtime.Subscribe.Token<InputChannel, InputTopics>,\n>(\n  token: SubscribeBaseArgs<InputChannel, InputTopics> &\n    SubscribeCallbackArgs<TToken>,\n): Promise<Realtime.Subscribe.CallbackSubscription>;\nexport function subscribe<\n  const InputChannel extends Realtime.ChannelInput,\n  const InputTopics extends ChannelTopicsInput<InputChannel>,\n  const TToken extends Realtime.Subscribe.Token<InputChannel, InputTopics>,\n  const TOutput extends Realtime.Subscribe.StreamSubscription<TToken>,\n>(\n  token: SubscribeBaseArgs<InputChannel, InputTopics>,\n  callback?: Realtime.Subscribe.Callback<TToken>,\n): Promise<TOutput>;\nexport async function subscribe<\n  const InputChannel extends Realtime.ChannelInput,\n  const InputTopics extends ChannelTopicsInput<InputChannel>,\n  const TToken extends Realtime.Subscribe.Token<InputChannel, InputTopics>,\n  const TOutput extends Realtime.Subscribe.StreamSubscription<TToken>,\n>(\n  token: SubscribeBaseArgs<InputChannel, InputTopics> &\n    Partial<SubscribeCallbackArgs<TToken>>,\n  callback?: Realtime.Subscribe.Callback<TToken>,\n): Promise<TOutput | Realtime.Subscribe.CallbackSubscription> {\n  const app: Inngest.Any | undefined = token.app as Inngest.Any | undefined;\n\n  const getSubscriptionToken = app\n    ? (channel: string, topics: string[]) =>\n        (app as Inngest.Any)[\"inngestApi\"].getSubscriptionToken(channel, topics)\n    : undefined;\n\n  const subscription = new TokenSubscription({\n    token: token as Realtime.Subscribe.Token,\n    apiBaseUrl: token.apiBaseUrl ?? app?.apiBaseUrl,\n    getSubscriptionToken,\n    validate: token.validate,\n  });\n\n  await subscription.connect();\n\n  const extras = {\n    getJsonStream: () => subscription.getJsonStream(),\n    getEncodedStream: () => subscription.getEncodedStream(),\n    close: (reason?: string) => subscription.close(reason),\n    unsubscribe: (reason?: string) => subscription.close(reason),\n  };\n\n  const onMessage = token.onMessage || callback;\n  if (onMessage) {\n    const callbackStream = subscription.getJsonStream();\n    subscription.useCallback(onMessage, callbackStream, token.onError);\n  }\n\n  if (token.onMessage) {\n    return extras;\n  }\n\n  const retStream = subscription.getJsonStream();\n  return Object.assign(retStream, extras) as unknown as TOutput;\n}\n\nexport const getSubscriptionToken = async <\n  const InputChannel extends Realtime.ChannelInput,\n  const InputTopics extends ChannelTopicsInput<InputChannel>,\n  const TToken extends Realtime.Subscribe.Token<InputChannel, InputTopics>,\n>(\n  app: Inngest.Like,\n  args: {\n    channel: InputChannel;\n    topics: InputTopics;\n  },\n): Promise<TToken> => {\n  const channelId =\n    typeof args.channel === \"string\" ? args.channel : args.channel.name;\n\n  if (!channelId) {\n    throw new Error(\"Channel ID is required to create a subscription token\");\n  }\n\n  const key = await (app as Inngest.Any)[\"inngestApi\"].getSubscriptionToken(\n    channelId,\n    args.topics,\n  );\n\n  return {\n    channel: args.channel,\n    topics: args.topics,\n    key,\n    apiBaseUrl: (app as Inngest.Any)?.apiBaseUrl,\n  } as TToken;\n};\n\nexport const getClientSubscriptionToken = async <\n  const InputChannel extends Realtime.ChannelInput,\n  const InputTopics extends ChannelTopicsInput<InputChannel>,\n>(\n  app: Inngest.Like,\n  args: {\n    channel: InputChannel;\n    topics: InputTopics;\n  },\n): Promise<Realtime.Subscribe.ClientToken> => {\n  const token = await getSubscriptionToken(app, args);\n\n  if (!token.key) {\n    throw new Error(\"No realtime subscription token key returned\");\n  }\n\n  return {\n    key: token.key,\n    apiBaseUrl: token.apiBaseUrl,\n  };\n};\n"],"mappings":";;;AA2DA,eAAsB,UAMpB,OAEA,UAC4D;CAC5D,MAAMA,MAA+B,MAAM;CAE3C,MAAMC,yBAAuB,OACxB,SAAiB,WACf,IAAoB,cAAc,qBAAqB,SAAS,OAAO,GAC1E;CAEJ,MAAM,eAAe,IAAIC,4CAAkB;EAClC;EACP,YAAY,MAAM,cAAc,KAAK;EACrC;EACA,UAAU,MAAM;EACjB,CAAC;AAEF,OAAM,aAAa,SAAS;CAE5B,MAAM,SAAS;EACb,qBAAqB,aAAa,eAAe;EACjD,wBAAwB,aAAa,kBAAkB;EACvD,QAAQ,WAAoB,aAAa,MAAM,OAAO;EACtD,cAAc,WAAoB,aAAa,MAAM,OAAO;EAC7D;CAED,MAAM,YAAY,MAAM,aAAa;AACrC,KAAI,WAAW;EACb,MAAM,iBAAiB,aAAa,eAAe;AACnD,eAAa,YAAY,WAAW,gBAAgB,MAAM,QAAQ;;AAGpE,KAAI,MAAM,UACR,QAAO;CAGT,MAAM,YAAY,aAAa,eAAe;AAC9C,QAAO,OAAO,OAAO,WAAW,OAAO;;AAGzC,MAAa,uBAAuB,OAKlC,KACA,SAIoB;CACpB,MAAM,YACJ,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,KAAK,QAAQ;AAEjE,KAAI,CAAC,UACH,OAAM,IAAI,MAAM,wDAAwD;CAG1E,MAAM,MAAM,MAAO,IAAoB,cAAc,qBACnD,WACA,KAAK,OACN;AAED,QAAO;EACL,SAAS,KAAK;EACd,QAAQ,KAAK;EACb;EACA,YAAa,KAAqB;EACnC;;AAGH,MAAa,6BAA6B,OAIxC,KACA,SAI4C;CAC5C,MAAM,QAAQ,MAAM,qBAAqB,KAAK,KAAK;AAEnD,KAAI,CAAC,MAAM,IACT,OAAM,IAAI,MAAM,8CAA8C;AAGhE,QAAO;EACL,KAAK,MAAM;EACX,YAAY,MAAM;EACnB"}