@fire-spark/core 0.0.4 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -6224,6 +6224,32 @@ const logError = (error, options = {}) => {
6224
6224
  return enqueue(entry);
6225
6225
  };
6226
6226
  //#endregion
6227
+ //#region src/webhooks/verifyWebhookSignature.ts
6228
+ const SIGNATURE_PREFIX = "sha256=";
6229
+ const hmacHex = async (secret, body) => {
6230
+ const raw = new TextEncoder().encode(secret);
6231
+ const key = await crypto.subtle.importKey("raw", raw, {
6232
+ name: "HMAC",
6233
+ hash: "SHA-256"
6234
+ }, false, ["sign"]);
6235
+ const data = new TextEncoder().encode(body);
6236
+ const sig = new Uint8Array(await crypto.subtle.sign("HMAC", key, data));
6237
+ return Array.from(sig, (byte) => byte.toString(16).padStart(2, "0")).join("");
6238
+ };
6239
+ const safeEqual = (left, right) => {
6240
+ if (left.length !== right.length) return false;
6241
+ let diff = 0;
6242
+ for (let i = 0; i < left.length; i += 1) diff |= left.charCodeAt(i) ^ right.charCodeAt(i);
6243
+ return diff === 0;
6244
+ };
6245
+ /** Checks a Fire Spark webhook/callback signature in constant time. */
6246
+ const verifyWebhookSignature = async (input) => {
6247
+ const { secret, body, signature } = input;
6248
+ if (!secret || !signature?.startsWith(SIGNATURE_PREFIX)) return false;
6249
+ const received = signature.slice(7).toLowerCase();
6250
+ return safeEqual(received, await hmacHex(secret, body));
6251
+ };
6252
+ //#endregion
6227
6253
  //#region src/rules/assert.ts
6228
6254
  const assert = (value, message) => {
6229
6255
  if (value) return;
@@ -7831,4 +7857,4 @@ const cardPreviewGroups = (value) => {
7831
7857
  return groups;
7832
7858
  };
7833
7859
  //#endregion
7834
- export { CARD_BRANDS, DEFAULT_RECOMMENDATION_TYPES, Order, OrderSyncPendingError, OrderValidationError, RecurringDateCron, RulesEngine, StorefrontHttpError, addLines, auth, buildCustomerSnapshot, cardBrandSpec, cardDigits, cardNumberGaps, cardNumberMaxLength, cardPreviewGroups, caretAfterDigits, collectOrderLineDiffs, computeStartingPrice, countCartProducts, coveredAmount, createSession, currentNodes, cvcMaxLength, defaultConditionError, detectCardBrand, flattenMenuCategories, flushLogs, formatCardNumber, formatCvc, formatExpiry, fromOrderLines, genId, genOrderId, getLogContext, getScheduleWindow, indexMenu, isCardNumberComplete, isCardNumberDefinitelyInvalid, isCheckoutFieldFilled, isCvcComplete, isDeviceNotLinked, isExpiryComplete, isKioskUnauthorized, isMilestoneStepDone, isOnSchedule, isOrderValidationError, isPosDeviceNotLinked, isPosUnauthorized, isStorefrontNotFound, isVariantBase, listMenusStream, localizePosError, log, logError, luhnCheck, matchAbsoluteDateOperator, matchBooleanOperator, matchCurrencyOperator, matchEnumOperator, matchNumberOperator, matchRecurringDateOperator, matchRelativeDateOperator, matchStringOperator, milestoneSteps, milestoneTrack, nestMenuCategories, normalizeCardholderName, parseExpiry, paymentMatchesClientConditions, recomputeRedemptions, recomputeTotals, remainingAmount, removeLine, replaceLine, resolveCheckout, reversePayment, runPaymentAttempt, serializeError, services, setLineQuantity, storefrontJson, toOrderLines, toPaymentCardBrand, validateCardNumber, validateCardholderName, validateCvc, validateExpiry, validateOrderAgainstMenu, visitedStates };
7860
+ export { CARD_BRANDS, DEFAULT_RECOMMENDATION_TYPES, Order, OrderSyncPendingError, OrderValidationError, RecurringDateCron, RulesEngine, StorefrontHttpError, addLines, auth, buildCustomerSnapshot, cardBrandSpec, cardDigits, cardNumberGaps, cardNumberMaxLength, cardPreviewGroups, caretAfterDigits, collectOrderLineDiffs, computeStartingPrice, countCartProducts, coveredAmount, createSession, currentNodes, cvcMaxLength, defaultConditionError, detectCardBrand, flattenMenuCategories, flushLogs, formatCardNumber, formatCvc, formatExpiry, fromOrderLines, genId, genOrderId, getLogContext, getScheduleWindow, indexMenu, isCardNumberComplete, isCardNumberDefinitelyInvalid, isCheckoutFieldFilled, isCvcComplete, isDeviceNotLinked, isExpiryComplete, isKioskUnauthorized, isMilestoneStepDone, isOnSchedule, isOrderValidationError, isPosDeviceNotLinked, isPosUnauthorized, isStorefrontNotFound, isVariantBase, listMenusStream, localizePosError, log, logError, luhnCheck, matchAbsoluteDateOperator, matchBooleanOperator, matchCurrencyOperator, matchEnumOperator, matchNumberOperator, matchRecurringDateOperator, matchRelativeDateOperator, matchStringOperator, milestoneSteps, milestoneTrack, nestMenuCategories, normalizeCardholderName, parseExpiry, paymentMatchesClientConditions, recomputeRedemptions, recomputeTotals, remainingAmount, removeLine, replaceLine, resolveCheckout, reversePayment, runPaymentAttempt, serializeError, services, setLineQuantity, storefrontJson, toOrderLines, toPaymentCardBrand, validateCardNumber, validateCardholderName, validateCvc, validateExpiry, validateOrderAgainstMenu, verifyWebhookSignature, visitedStates };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fire-spark/core",
3
- "version": "0.0.4",
3
+ "version": "0.1.2",
4
4
  "description": "Fire Spark headless SDK",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -20,8 +20,8 @@
20
20
  "big.js": "6.2.1",
21
21
  "dayjs": "1.11.9",
22
22
  "@types/big.js": "6.2.2",
23
- "@fire-spark/payments": "0.1.0",
24
- "@fire-spark/types": "0.0.4"
23
+ "@fire-spark/payments": "^0.1.2",
24
+ "@fire-spark/types": "^0.1.2"
25
25
  },
26
26
  "devDependencies": {
27
27
  "tsdown": "^0.22.14",