UNPKG

pusher-zod

Version:

Pusher with type safety using Zod to parse the data

1 lines 5.16 kB
{"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":[]}