{"version":3,"sources":["../src/UberDirectWebhook.ts"],"sourcesContent":["import JsSHA from 'jssha'\nimport {\n    CourierUpdateWebookEvent,\n    courierUpdateSchema,\n    DeliveryStatusWebhookEvent,\n    DeliveryStatusWebhookEventSchema,\n    RefundRequestWebhookEvent,\n    refundRequestEventSchema,\n    WebhookEventKind,\n} from './types/WebhookTypes'\nimport { ZodError } from 'zod'\nimport { UberDirectTypeProtectErrorHandling } from './UberDirectTypeProtect'\n\nexport class UberDirectWebhook extends UberDirectTypeProtectErrorHandling {\n    private readonly secret: string\n\n    constructor(secret: string) {\n        super()\n        this.secret = secret\n    }\n\n    public verifySignature(payload: string, signatureHeader: string): boolean {\n        const signature = this.calculateSignature(payload)\n        return signature === signatureHeader\n    }\n\n    public verifySignatureWebhook(payload: string, headers: Record<string, unknown>): boolean {\n        let signature = headers['x-postmates-signature']\n        if (!signature)\n            throw new Error('No signature provided')\n\n        if (Array.isArray(signature) && signature.length > 0)\n            signature = signature[0]\n\n        if (typeof signature !== 'string')\n            throw new Error('Invalid signature type')\n        return this.verifySignature(payload, signature)\n    }\n\n    public getRequestEventKind(payload: string | Record<string, unknown>): WebhookEventKind {\n        if (typeof payload === 'string') {\n            const parsedPayload = JSON.parse(payload)\n            return parsedPayload.kind\n        }\n        if (!payload.kind) throw new Error('Invalid payload')\n        return payload.kind as WebhookEventKind\n    }\n\n    /**\n     * Webhooks allow you to receive real-time updates to your ongoing deliveries. By configuring a URL we can POST updates to,\n     * you’ll get the most up-to-date information to show to your customers.\n     * @param payload\n     * @param headers\n     */\n    public verifyAndHandleWebhook(payload: string | Record<string, unknown>, headers: Record<string, unknown>): DeliveryStatusWebhookEvent | CourierUpdateWebookEvent | RefundRequestWebhookEvent {\n        let stringPayload: string\n        if (typeof payload === 'string') {\n            stringPayload = payload\n        } else {\n            stringPayload = JSON.stringify(payload)\n        }\n        if (!this.verifySignatureWebhook(stringPayload, headers)) {\n            throw new Error('Invalid signature')\n        }\n        return this.handleWebhook(payload)\n    }\n\n    public handleWebhook(payload: string | Record<string, unknown>): DeliveryStatusWebhookEvent | CourierUpdateWebookEvent | RefundRequestWebhookEvent {\n        const parsedPayload = typeof payload === 'string' ? JSON.parse(payload) : payload\n\n        const eventKind = this.getRequestEventKind(parsedPayload)\n        switch (eventKind) {\n            case WebhookEventKind.DeliveryStatus:\n                try {\n                    DeliveryStatusWebhookEventSchema.parse(parsedPayload)\n                } catch (e: unknown) {\n                    if (e instanceof ZodError)\n                        this.throw(e)\n                    else\n                        throw e // should not happen\n                }\n                return parsedPayload as DeliveryStatusWebhookEvent\n            case WebhookEventKind.CourierUpdate:\n                try {\n                    courierUpdateSchema.parse(parsedPayload)\n                } catch (e: unknown) {\n                    if (e instanceof ZodError)\n                        this.throw(e)\n                    else\n                        throw e // should not happen\n                }\n                return parsedPayload as CourierUpdateWebookEvent\n            case WebhookEventKind.RefundRequest:\n                try {\n                    refundRequestEventSchema.parse(parsedPayload)\n                } catch (e: unknown) {\n                    if (e instanceof ZodError)\n                        this.throw(e)\n                    else\n                        throw e // should not\n                }\n                return parsedPayload as RefundRequestWebhookEvent\n        }\n\n        throw new Error('Unknown webhook event')\n    }\n\n    private calculateSignature(payload: string): string {\n        const shaObj = new JsSHA('SHA-256', 'TEXT')\n        shaObj.setHMACKey(this.secret, 'TEXT')\n        shaObj.update(payload)\n        return shaObj.getHMAC('HEX')\n    }\n}\n"],"mappings":";AAAA,OAAO,WAAW;AAClB;AAAA,EAEI;AAAA,EAEA;AAAA,EAEA;AAAA,EACA;AAAA,OACG;AACP,SAAS,gBAAgB;AACzB,SAAS,0CAA0C;AAE5C,MAAM,0BAA0B,mCAAmC;AAAA,EAGtE,YAAY,QAAgB;AACxB,UAAM;AACN,SAAK,SAAS;AAAA,EAClB;AAAA,EAEO,gBAAgB,SAAiB,iBAAkC;AACtE,UAAM,YAAY,KAAK,mBAAmB,OAAO;AACjD,WAAO,cAAc;AAAA,EACzB;AAAA,EAEO,uBAAuB,SAAiB,SAA2C;AACtF,QAAI,YAAY,QAAQ,uBAAuB;AAC/C,QAAI,CAAC;AACD,YAAM,IAAI,MAAM,uBAAuB;AAE3C,QAAI,MAAM,QAAQ,SAAS,KAAK,UAAU,SAAS;AAC/C,kBAAY,UAAU,CAAC;AAE3B,QAAI,OAAO,cAAc;AACrB,YAAM,IAAI,MAAM,wBAAwB;AAC5C,WAAO,KAAK,gBAAgB,SAAS,SAAS;AAAA,EAClD;AAAA,EAEO,oBAAoB,SAA6D;AACpF,QAAI,OAAO,YAAY,UAAU;AAC7B,YAAM,gBAAgB,KAAK,MAAM,OAAO;AACxC,aAAO,cAAc;AAAA,IACzB;AACA,QAAI,CAAC,QAAQ,KAAM,OAAM,IAAI,MAAM,iBAAiB;AACpD,WAAO,QAAQ;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,uBAAuB,SAA2C,SAAqH;AAC1L,QAAI;AACJ,QAAI,OAAO,YAAY,UAAU;AAC7B,sBAAgB;AAAA,IACpB,OAAO;AACH,sBAAgB,KAAK,UAAU,OAAO;AAAA,IAC1C;AACA,QAAI,CAAC,KAAK,uBAAuB,eAAe,OAAO,GAAG;AACtD,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACvC;AACA,WAAO,KAAK,cAAc,OAAO;AAAA,EACrC;AAAA,EAEO,cAAc,SAA8H;AAC/I,UAAM,gBAAgB,OAAO,YAAY,WAAW,KAAK,MAAM,OAAO,IAAI;AAE1E,UAAM,YAAY,KAAK,oBAAoB,aAAa;AACxD,YAAQ,WAAW;AAAA,MACf,KAAK,iBAAiB;AAClB,YAAI;AACA,2CAAiC,MAAM,aAAa;AAAA,QACxD,SAAS,GAAY;AACjB,cAAI,aAAa;AACb,iBAAK,MAAM,CAAC;AAAA;AAEZ,kBAAM;AAAA,QACd;AACA,eAAO;AAAA,MACX,KAAK,iBAAiB;AAClB,YAAI;AACA,8BAAoB,MAAM,aAAa;AAAA,QAC3C,SAAS,GAAY;AACjB,cAAI,aAAa;AACb,iBAAK,MAAM,CAAC;AAAA;AAEZ,kBAAM;AAAA,QACd;AACA,eAAO;AAAA,MACX,KAAK,iBAAiB;AAClB,YAAI;AACA,mCAAyB,MAAM,aAAa;AAAA,QAChD,SAAS,GAAY;AACjB,cAAI,aAAa;AACb,iBAAK,MAAM,CAAC;AAAA;AAEZ,kBAAM;AAAA,QACd;AACA,eAAO;AAAA,IACf;AAEA,UAAM,IAAI,MAAM,uBAAuB;AAAA,EAC3C;AAAA,EAEQ,mBAAmB,SAAyB;AAChD,UAAM,SAAS,IAAI,MAAM,WAAW,MAAM;AAC1C,WAAO,WAAW,KAAK,QAAQ,MAAM;AACrC,WAAO,OAAO,OAAO;AACrB,WAAO,OAAO,QAAQ,KAAK;AAAA,EAC/B;AACJ;","names":[]}