{"version":3,"sources":["../src/server.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport PusherServer from \"pusher\";\r\nimport type { z } from \"zod\";\r\n\r\nexport function createPusherServer<\r\n  S extends Record<string, Record<string, z.ZodType<any, any>>>,\r\n  P extends Partial<Record<string, z.ZodType<any, any>>> = Record<string, never>\r\n>({\r\n  setup,\r\n  channel_id_separator = \".\",\r\n  userEvents = {} as P,\r\n}: {\r\n  setup: S;\r\n  channel_id_separator?: \"_\" | \"-\" | \"=\" | \"@\" | \",\" | \".\" | \";\";\r\n  userEvents?: P;\r\n}) {\r\n  type ChannelsNames = keyof S;\r\n  type EventKeys<K extends ChannelsNames> = keyof S[K];\r\n\r\n  type MyPusherServer = PusherServer & {\r\n    trigger<K extends ChannelsNames, E extends EventKeys<K>>(\r\n      channelName: K,\r\n      eventName: E,\r\n      data: S[K][E]\r\n    ): void;\r\n  };\r\n\r\n  class TypeSafePusherServer extends PusherServer implements MyPusherServer {\r\n    invoke<K extends ChannelsNames, E extends EventKeys<K>>(\r\n      channelName: K extends string ? K : never,\r\n      channel_id: K extends string ? string : never,\r\n      eventName: E extends string ? E : never,\r\n      data: z.infer<S[K][E]>\r\n    ) {\r\n      return super.trigger(\r\n        `${channelName}${channel_id_separator}${channel_id}`,\r\n        eventName,\r\n        data\r\n      );\r\n    }\r\n\r\n    invokeBatch<K extends ChannelsNames, E extends EventKeys<K>>(\r\n      batch: Array<{\r\n        channel: K;\r\n        channel_id: string | number;\r\n        name: E;\r\n        data: z.infer<S[K][E]>;\r\n        socket_id?: string;\r\n        info?: any;\r\n      }>\r\n    ) {\r\n      return super.triggerBatch(\r\n        batch.map((b) => ({\r\n          channel: `${String(b.channel)}${channel_id_separator}${b.channel_id}`,\r\n          name: String(b.name),\r\n          data: b.data,\r\n          socket_id: b.socket_id,\r\n          info: b.info,\r\n        }))\r\n      );\r\n    }\r\n\r\n    override sendToUser<E extends keyof P>(\r\n      userId: string,\r\n      event: E,\r\n      data: z.infer<Exclude<P[E], undefined>>\r\n    ): Promise<PusherServer.Response> {\r\n      const parsedData = parseData(userEvents[event]!, data);\r\n      if (parsedData === undefined) {\r\n        throw new Error(`Invalid data for user event ${String(event)}`);\r\n      }\r\n      return super.sendToUser(userId, String(event), parsedData);\r\n    }\r\n\r\n    getChannels<K extends ChannelsNames>(): Array<K> {\r\n      return Object.keys(setup) as Array<K>;\r\n    }\r\n\r\n    getPrivateChannels<K extends ChannelsNames>(): Array<\r\n      Extract<K, `private-${string}`>\r\n    > {\r\n      return this.getChannels().filter(this.isPrivateChannel) as Array<\r\n        Extract<K, `private-${string}`>\r\n      >;\r\n    }\r\n\r\n    getPresenceChannels<K extends ChannelsNames>(): Array<\r\n      Extract<keyof S, `presence-${string}`>\r\n    > {\r\n      return this.getChannels().filter(this.isPresenceChannel);\r\n    }\r\n\r\n    isPrivateChannel<K extends ChannelsNames>(\r\n      channel: K\r\n    ): channel is Extract<K, `private-${string}`> {\r\n      return typeof channel === \"string\" && channel.startsWith(\"private-\");\r\n    }\r\n\r\n    isPresenceChannel<K extends ChannelsNames>(\r\n      channel: K\r\n    ): channel is Extract<K, `presence-${string}`> {\r\n      return typeof channel === \"string\" && channel.startsWith(\"presence-\");\r\n    }\r\n  }\r\n\r\n  function parseData<K>(\r\n    zodSchema: z.ZodType<any, any>,\r\n    data: K\r\n  ): K | undefined {\r\n    try {\r\n      return zodSchema.parse(data);\r\n    } catch (error) {\r\n      console.error(error);\r\n      return undefined;\r\n    }\r\n  }\r\n\r\n  return {\r\n    TypeSafePusherServer,\r\n  };\r\n}\r\n\r\nexport default createPusherServer;\r\n"],"mappings":";;;AACA,OAAO,kBAAkB;AAGlB,SAAS,mBAGd;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB,aAAa,CAAC;AAChB,GAIG;AAAA,EAYD,MAAM,6BAA6B,aAAuC;AAAA,IACxE,OACE,aACA,YACA,WACA,MACA;AACA,aAAO,MAAM;AAAA,QACX,GAAG,WAAW,GAAG,oBAAoB,GAAG,UAAU;AAAA,QAClD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IAEA,YACE,OAQA;AACA,aAAO,MAAM;AAAA,QACX,MAAM,IAAI,CAAC,OAAO;AAAA,UAChB,SAAS,GAAG,OAAO,EAAE,OAAO,CAAC,GAAG,oBAAoB,GAAG,EAAE,UAAU;AAAA,UACnE,MAAM,OAAO,EAAE,IAAI;AAAA,UACnB,MAAM,EAAE;AAAA,UACR,WAAW,EAAE;AAAA,UACb,MAAM,EAAE;AAAA,QACV,EAAE;AAAA,MACJ;AAAA,IACF;AAAA,IAES,WACP,QACA,OACA,MACgC;AAChC,YAAM,aAAa,UAAU,WAAW,KAAK,GAAI,IAAI;AACrD,UAAI,eAAe,QAAW;AAC5B,cAAM,IAAI,MAAM,+BAA+B,OAAO,KAAK,CAAC,EAAE;AAAA,MAChE;AACA,aAAO,MAAM,WAAW,QAAQ,OAAO,KAAK,GAAG,UAAU;AAAA,IAC3D;AAAA,IAEA,cAAiD;AAC/C,aAAO,OAAO,KAAK,KAAK;AAAA,IAC1B;AAAA,IAEA,qBAEE;AACA,aAAO,KAAK,YAAY,EAAE,OAAO,KAAK,gBAAgB;AAAA,IAGxD;AAAA,IAEA,sBAEE;AACA,aAAO,KAAK,YAAY,EAAE,OAAO,KAAK,iBAAiB;AAAA,IACzD;AAAA,IAEA,iBACE,SAC4C;AAC5C,aAAO,OAAO,YAAY,YAAY,QAAQ,WAAW,UAAU;AAAA,IACrE;AAAA,IAEA,kBACE,SAC6C;AAC7C,aAAO,OAAO,YAAY,YAAY,QAAQ,WAAW,WAAW;AAAA,IACtE;AAAA,EACF;AAEA,WAAS,UACP,WACA,MACe;AACf,QAAI;AACF,aAAO,UAAU,MAAM,IAAI;AAAA,IAC7B,SAAS,OAAO;AACd,cAAQ,MAAM,KAAK;AACnB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,EACF;AACF;AAEA,IAAO,iBAAQ;","names":[]}