UNPKG

@commercelayer/sdk-utils

Version:
233 lines (228 loc) 7.05 kB
'use strict'; var chunkOGEPN5MT_cjs = require('./chunk-OGEPN5MT.cjs'); var sdk = require('@commercelayer/sdk'); var crypto = require('crypto'); function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } var crypto__default = /*#__PURE__*/_interopDefault(crypto); var checkPayload = (payload) => { let resource; try { resource = JSON.parse(payload); } catch (error) { throw new Error(`Error parsing payload [${error.message}]`); } if (!sdk.CommerceLayerStatic.resources().includes(resource.data?.type)) throw new Error(`Invalid resource type [${resource.data?.type}]`); return resource; }; var denormalizePayload = (payload) => { let denormalized; const resource = checkPayload(payload); if (resource.links) delete resource.links; const data = resource.data; const included = resource.included; if (!data) denormalized = data; else { if (Array.isArray(data)) denormalized = data.map((res) => denormalizeResource(res, included)); else denormalized = denormalizeResource(data, included); } return denormalized; }; var findIncluded = (rel, included = []) => { const inc = included.find((inc2) => { return rel.id === inc2.id && rel.type === inc2.type; }); return inc || rel; }; var denormalizeResource = (res, included, chain = []) => { if (!res) return res; const resource = { id: res.id, type: res.type, ...res.attributes }; if (res.relationships) Object.keys(res.relationships).forEach((key) => { const rel = res.relationships[key].data; if (rel) { if (chain.filter((r) => r.id === rel.id && r.type === rel.type).length >= chunkOGEPN5MT_cjs.config.webhooks.jsonapi.maxResourceIncluded) resource[key] = rel; if (Array.isArray(rel)) resource[key] = rel.map((r) => denormalizeResource(findIncluded(r, included), included, [...chain, r])); else resource[key] = denormalizeResource(findIncluded(rel, included), included, [...chain, rel]); } else if (rel === null) resource[key] = null; }); return resource; }; var generateHMAC = (payload, sharedSecret) => { const { algorithm, digest } = chunkOGEPN5MT_cjs.config.webhooks.signature; return crypto__default.default.createHmac(algorithm, sharedSecret).update(payload).digest(digest); }; var checkSignature = (body, headers, secret) => { const status = { ok: false }; try { const topic = typeof headers === "string" ? void 0 : headers[chunkOGEPN5MT_cjs.config.webhooks.topic]; const signature = typeof headers === "string" ? headers : headers[chunkOGEPN5MT_cjs.config.webhooks.signature.header]; if (!secret) return { ...status, message: "Missing shared secret" }; if (!signature) return { ...status, message: "Missing webhook signature" }; const hash = generateHMAC(body, secret); status.topic = topic; if (signature === hash) { status.ok = true; status.message = "Signature successfully checked"; } else status.message = "Payload signature verification failed"; } catch (err) { status.ok = false; status.message = err.message; } return status; }; var ParseError = class extends Error { constructor(message) { super(message); this.name = "ParseError"; } }; var parse = (payload, type) => { try { const res = denormalizePayload(payload); const resType = res.type; if (resType !== type) throw new ParseError(`Invalid resource type [${resType}]`); return res; } catch (error) { throw new ParseError(`Payload parse error [${error.message}]`); } }; var parsers = { addresses(payload) { return parse(payload, "addresses"); }, authorizations(payload) { return parse(payload, "authorizations"); }, avalara_accounts(payload) { return parse(payload, "avalara_accounts"); }, bundles(payload) { return parse(payload, "bundles"); }, buy_x_pay_y_promotions(payload) { return parse(payload, "buy_x_pay_y_promotions"); }, captures(payload) { return parse(payload, "captures"); }, cleanups(payload) { return parse(payload, "cleanups"); }, coupons(payload) { return parse(payload, "coupons"); }, customer_addresses(payload) { return parse(payload, "customer_addresses"); }, customer_password_resets(payload) { return parse(payload, "customer_password_resets"); }, customer_subscriptions(payload) { return parse(payload, "customer_subscriptions"); }, customers(payload) { return parse(payload, "customers"); }, exports(payload) { return parse(payload, "exports"); }, external_promotions(payload) { return parse(payload, "external_promotions"); }, fixed_amount_promotions(payload) { return parse(payload, "fixed_amount_promotions"); }, fixed_price_promotions(payload) { return parse(payload, "fixed_price_promotions"); }, free_gift_promotions(payload) { return parse(payload, "free_gift_promotions"); }, free_shipping_promotions(payload) { return parse(payload, "free_shipping_promotions"); }, gift_cards(payload) { return parse(payload, "gift_cards"); }, imports(payload) { return parse(payload, "imports"); }, in_stock_subscriptions(payload) { return parse(payload, "in_stock_subscriptions"); }, line_items(payload) { return parse(payload, "line_items"); }, line_items_options(payload) { return parse(payload, "line_items_options"); }, orders(payload) { return parse(payload, "orders"); }, order_copies(payload) { return parse(payload, "order_copies"); }, order_subscriptions(payload) { return parse(payload, "order_subscriptions"); }, parcels(payload) { return parse(payload, "parcels"); }, percentage_discount_promotions(payload) { return parse(payload, "percentage_discount_promotions"); }, price_frequency_tiers(payload) { return parse(payload, "price_frequency_tiers"); }, price_volume_tiers(payload) { return parse(payload, "price_volume_tiers"); }, promotions(payload) { return parse(payload, "promotions"); }, recurring_order_copies(payload) { return parse(payload, "recurring_order_copies"); }, refunds(payload) { return parse(payload, "refunds"); }, returns(payload) { return parse(payload, "returns"); }, shipments(payload) { return parse(payload, "shipments"); }, shipping_weight_tiers(payload) { return parse(payload, "shipping_weight_tiers"); }, skus(payload) { return parse(payload, "skus"); }, sku_options(payload) { return parse(payload, "sku_options"); }, stock_transfers(payload) { return parse(payload, "stock_transfers"); }, transactions(payload) { return parse(payload, "transactions"); }, voids(payload) { return parse(payload, "voids"); } }; var webhooks = { denormalizePayload, checkSignature, parse: parsers }; exports.checkSignature = checkSignature; exports.denormalizePayload = denormalizePayload; exports.webhooks = webhooks; //# sourceMappingURL=chunk-N2YKKMHB.cjs.map //# sourceMappingURL=chunk-N2YKKMHB.cjs.map