{"version":3,"file":"channel.cjs","names":["accessors: Record<string, Realtime.TopicRef>"],"sources":["../../../src/components/realtime/channel.ts"],"sourcesContent":["import type { Realtime } from \"./types.ts\";\n\ntype ChannelOptions<\n  TName extends string | ((...args: never[]) => string),\n  TTopics extends Realtime.TopicsConfig,\n> = {\n  name: TName;\n  topics: TTopics;\n};\n\ntype InferChannelReturn<\n  TName extends string | ((...args: never[]) => string),\n  TTopics extends Realtime.TopicsConfig,\n> = TName extends string\n  ? Realtime.ChannelInstance<TName, TTopics> & {\n      $infer: { [K in keyof TTopics]: Realtime.InferTopicData<TTopics[K]> };\n    }\n  : TName extends (...args: infer TArgs) => string\n    ? Realtime.ChannelDef<(...args: TArgs) => string, TTopics> & {\n        $infer: { [K in keyof TTopics]: Realtime.InferTopicData<TTopics[K]> };\n        $params: TArgs[0];\n      }\n    : never;\n\nconst createTopicAccessors = (\n  channelName: string,\n  topics: Realtime.TopicsConfig,\n): Record<string, Realtime.TopicRef> => {\n  const accessors: Record<string, Realtime.TopicRef> = {};\n  for (const [topicName, config] of Object.entries(topics)) {\n    accessors[topicName] = {\n      channel: channelName,\n      topic: topicName,\n      config,\n    };\n  }\n  return accessors;\n};\n\nexport const channel = <\n  const TName extends string | ((...args: never[]) => string),\n  const TTopics extends Realtime.TopicsConfig,\n>(\n  options: ChannelOptions<TName, TTopics>,\n): InferChannelReturn<TName, TTopics> => {\n  const { name, topics } = options;\n\n  if (typeof name === \"function\") {\n    //\n    // Parameterized channel: calling the definition with params returns a ChannelInstance\n    const def = (...args: unknown[]) => {\n      const resolvedName = (name as (...args: unknown[]) => string)(...args);\n      return {\n        name: resolvedName,\n        topics,\n        ...createTopicAccessors(resolvedName, topics),\n      };\n    };\n\n    Object.defineProperties(def, {\n      topics: { value: topics, enumerable: true },\n      $infer: { get: () => topics },\n      $params: { get: () => undefined },\n    });\n\n    // biome-ignore lint/suspicious/noExplicitAny: sacrifice for clean generics\n    return def as any;\n  }\n\n  //\n  // Static channel: the definition itself acts as a ChannelInstance\n  const instance = {\n    name,\n    topics,\n    ...createTopicAccessors(name, topics),\n    get $infer() {\n      return topics;\n    },\n  };\n\n  // biome-ignore lint/suspicious/noExplicitAny: sacrifice for clean generics\n  return instance as any;\n};\n"],"mappings":";;AAwBA,MAAM,wBACJ,aACA,WACsC;CACtC,MAAMA,YAA+C,EAAE;AACvD,MAAK,MAAM,CAAC,WAAW,WAAW,OAAO,QAAQ,OAAO,CACtD,WAAU,aAAa;EACrB,SAAS;EACT,OAAO;EACP;EACD;AAEH,QAAO;;AAGT,MAAa,WAIX,YACuC;CACvC,MAAM,EAAE,MAAM,WAAW;AAEzB,KAAI,OAAO,SAAS,YAAY;EAG9B,MAAM,OAAO,GAAG,SAAoB;GAClC,MAAM,eAAgB,KAAwC,GAAG,KAAK;AACtE,UAAO;IACL,MAAM;IACN;IACA,GAAG,qBAAqB,cAAc,OAAO;IAC9C;;AAGH,SAAO,iBAAiB,KAAK;GAC3B,QAAQ;IAAE,OAAO;IAAQ,YAAY;IAAM;GAC3C,QAAQ,EAAE,WAAW,QAAQ;GAC7B,SAAS,EAAE,WAAW,QAAW;GAClC,CAAC;AAGF,SAAO;;AAeT,QAViB;EACf;EACA;EACA,GAAG,qBAAqB,MAAM,OAAO;EACrC,IAAI,SAAS;AACX,UAAO;;EAEV"}