@easypayment/medusa-payment-paypal 0.9.28 → 0.9.30
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/.medusa/server/src/admin/index.js +12 -10
- package/.medusa/server/src/admin/index.mjs +12 -10
- package/.medusa/server/src/api/admin/paypal/onboarding-link/route.d.ts.map +1 -1
- package/.medusa/server/src/api/admin/paypal/onboarding-link/route.js +24 -4
- package/.medusa/server/src/api/admin/paypal/onboarding-link/route.js.map +1 -1
- package/.medusa/server/src/api/store/paypal/capture-order/route.d.ts.map +1 -1
- package/.medusa/server/src/api/store/paypal/capture-order/route.js +4 -2
- package/.medusa/server/src/api/store/paypal/capture-order/route.js.map +1 -1
- package/.medusa/server/src/api/store/paypal/webhook/route.js +1 -1
- package/.medusa/server/src/api/store/paypal/webhook/route.js.map +1 -1
- package/.medusa/server/src/modules/paypal/migrations/20270301000000_add_webhook_transmission_id_index.d.ts +6 -0
- package/.medusa/server/src/modules/paypal/migrations/20270301000000_add_webhook_transmission_id_index.d.ts.map +1 -0
- package/.medusa/server/src/modules/paypal/migrations/20270301000000_add_webhook_transmission_id_index.js +14 -0
- package/.medusa/server/src/modules/paypal/migrations/20270301000000_add_webhook_transmission_id_index.js.map +1 -0
- package/.medusa/server/src/modules/paypal/payment-provider/card-service.d.ts +1 -1
- package/.medusa/server/src/modules/paypal/payment-provider/card-service.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/payment-provider/card-service.js +9 -35
- package/.medusa/server/src/modules/paypal/payment-provider/card-service.js.map +1 -1
- package/.medusa/server/src/modules/paypal/payment-provider/service.d.ts +2 -5
- package/.medusa/server/src/modules/paypal/payment-provider/service.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/payment-provider/service.js +14 -66
- package/.medusa/server/src/modules/paypal/payment-provider/service.js.map +1 -1
- package/.medusa/server/src/modules/paypal/service.d.ts +1 -1
- package/.medusa/server/src/modules/paypal/service.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/service.js +41 -22
- package/.medusa/server/src/modules/paypal/service.js.map +1 -1
- package/.medusa/server/src/modules/paypal/utils/amounts.d.ts +1 -1
- package/.medusa/server/src/modules/paypal/utils/amounts.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/utils/amounts.js +17 -6
- package/.medusa/server/src/modules/paypal/utils/amounts.js.map +1 -1
- package/.medusa/server/src/modules/paypal/utils/credential-resolver.d.ts +42 -0
- package/.medusa/server/src/modules/paypal/utils/credential-resolver.d.ts.map +1 -0
- package/.medusa/server/src/modules/paypal/utils/credential-resolver.js +186 -0
- package/.medusa/server/src/modules/paypal/utils/credential-resolver.js.map +1 -0
- package/.medusa/server/src/modules/paypal/utils/payment-session.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/utils/payment-session.js +7 -1
- package/.medusa/server/src/modules/paypal/utils/payment-session.js.map +1 -1
- package/.medusa/server/src/modules/paypal/utils/paypal-fetch.d.ts +3 -11
- package/.medusa/server/src/modules/paypal/utils/paypal-fetch.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/utils/paypal-fetch.js +119 -18
- package/.medusa/server/src/modules/paypal/utils/paypal-fetch.js.map +1 -1
- package/.medusa/server/src/modules/paypal/utils/secret-crypto.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/utils/secret-crypto.js +6 -0
- package/.medusa/server/src/modules/paypal/utils/secret-crypto.js.map +1 -1
- package/.medusa/server/src/modules/paypal/webhook-processor.d.ts.map +1 -1
- package/.medusa/server/src/modules/paypal/webhook-processor.js +10 -9
- package/.medusa/server/src/modules/paypal/webhook-processor.js.map +1 -1
- package/package.json +16 -16
- package/src/admin/routes/settings/paypal/connection/page.tsx +6 -4
- package/src/api/admin/paypal/onboarding-link/route.ts +30 -5
- package/src/api/store/paypal/capture-order/route.ts +4 -2
- package/src/api/store/paypal/webhook/route.ts +1 -1
- package/src/modules/paypal/migrations/20270301000000_add_webhook_transmission_id_index.ts +15 -0
- package/src/modules/paypal/payment-provider/card-service.ts +9 -40
- package/src/modules/paypal/payment-provider/service.ts +18 -68
- package/src/modules/paypal/service.ts +43 -23
- package/src/modules/paypal/utils/amounts.ts +17 -6
- package/src/modules/paypal/utils/credential-resolver.ts +257 -0
- package/src/modules/paypal/utils/payment-session.ts +11 -2
- package/src/modules/paypal/utils/paypal-fetch.ts +139 -17
- package/src/modules/paypal/utils/secret-crypto.ts +5 -0
- package/src/modules/paypal/webhook-processor.ts +15 -10
- package/.medusa/server/src/admin/index.d.ts +0 -2
- package/.medusa/server/src/admin/index.d.ts.map +0 -1
- package/.medusa/server/src/admin/index.js.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/_components/FieldRow.d.ts +0 -8
- package/.medusa/server/src/admin/routes/settings/paypal/_components/FieldRow.d.ts.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/_components/FieldRow.js +0 -8
- package/.medusa/server/src/admin/routes/settings/paypal/_components/FieldRow.js.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/_components/SectionCard.d.ts +0 -8
- package/.medusa/server/src/admin/routes/settings/paypal/_components/SectionCard.d.ts.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/_components/SectionCard.js +0 -8
- package/.medusa/server/src/admin/routes/settings/paypal/_components/SectionCard.js.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/_components/Tabs.d.ts +0 -2
- package/.medusa/server/src/admin/routes/settings/paypal/_components/Tabs.d.ts.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/_components/Tabs.js +0 -25
- package/.medusa/server/src/admin/routes/settings/paypal/_components/Tabs.js.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/_components/Toast.d.ts +0 -12
- package/.medusa/server/src/admin/routes/settings/paypal/_components/Toast.d.ts.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/_components/Toast.js +0 -22
- package/.medusa/server/src/admin/routes/settings/paypal/_components/Toast.js.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/_utils/adminFetch.d.ts +0 -7
- package/.medusa/server/src/admin/routes/settings/paypal/_utils/adminFetch.d.ts.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/_utils/adminFetch.js +0 -40
- package/.medusa/server/src/admin/routes/settings/paypal/_utils/adminFetch.js.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/additional-settings/page.d.ts +0 -2
- package/.medusa/server/src/admin/routes/settings/paypal/additional-settings/page.d.ts.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/additional-settings/page.js +0 -76
- package/.medusa/server/src/admin/routes/settings/paypal/additional-settings/page.js.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/advanced-card-payments/page.d.ts +0 -2
- package/.medusa/server/src/admin/routes/settings/paypal/advanced-card-payments/page.d.ts.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/advanced-card-payments/page.js +0 -81
- package/.medusa/server/src/admin/routes/settings/paypal/advanced-card-payments/page.js.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/apple-pay/page.d.ts +0 -2
- package/.medusa/server/src/admin/routes/settings/paypal/apple-pay/page.d.ts.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/apple-pay/page.js +0 -9
- package/.medusa/server/src/admin/routes/settings/paypal/apple-pay/page.js.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/connection/page.d.ts +0 -22
- package/.medusa/server/src/admin/routes/settings/paypal/connection/page.d.ts.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/connection/page.js +0 -595
- package/.medusa/server/src/admin/routes/settings/paypal/connection/page.js.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/google-pay/page.d.ts +0 -2
- package/.medusa/server/src/admin/routes/settings/paypal/google-pay/page.d.ts.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/google-pay/page.js +0 -9
- package/.medusa/server/src/admin/routes/settings/paypal/google-pay/page.js.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/page.d.ts +0 -4
- package/.medusa/server/src/admin/routes/settings/paypal/page.d.ts.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/page.js +0 -14
- package/.medusa/server/src/admin/routes/settings/paypal/page.js.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/pay-later-messaging/page.d.ts +0 -2
- package/.medusa/server/src/admin/routes/settings/paypal/pay-later-messaging/page.d.ts.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/pay-later-messaging/page.js +0 -9
- package/.medusa/server/src/admin/routes/settings/paypal/pay-later-messaging/page.js.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/paypal-settings/page.d.ts +0 -2
- package/.medusa/server/src/admin/routes/settings/paypal/paypal-settings/page.d.ts.map +0 -1
- package/.medusa/server/src/admin/routes/settings/paypal/paypal-settings/page.js +0 -109
- package/.medusa/server/src/admin/routes/settings/paypal/paypal-settings/page.js.map +0 -1
|
@@ -52,11 +52,17 @@ function toAmountNumber(amount) {
|
|
|
52
52
|
return 0;
|
|
53
53
|
}
|
|
54
54
|
if (typeof amount === "number") {
|
|
55
|
-
|
|
55
|
+
if (!Number.isFinite(amount)) {
|
|
56
|
+
throw new Error(`Invalid payment amount: non-finite number (${amount})`);
|
|
57
|
+
}
|
|
58
|
+
return amount;
|
|
56
59
|
}
|
|
57
60
|
if (typeof amount === "string") {
|
|
58
61
|
const parsed = Number(amount);
|
|
59
|
-
|
|
62
|
+
if (!Number.isFinite(parsed)) {
|
|
63
|
+
throw new Error(`Invalid payment amount: unparseable string "${amount}"`);
|
|
64
|
+
}
|
|
65
|
+
return parsed;
|
|
60
66
|
}
|
|
61
67
|
if (typeof amount === "object") {
|
|
62
68
|
const obj = amount;
|
|
@@ -67,11 +73,13 @@ function toAmountNumber(amount) {
|
|
|
67
73
|
// Serialized raw form: { value: "20", precision: 20 }.
|
|
68
74
|
if (obj.value !== undefined && obj.value !== null) {
|
|
69
75
|
const parsed = Number(obj.value);
|
|
70
|
-
|
|
76
|
+
if (!Number.isFinite(parsed)) {
|
|
77
|
+
throw new Error(`Invalid payment amount: unparseable BigNumber value "${obj.value}"`);
|
|
78
|
+
}
|
|
79
|
+
return parsed;
|
|
71
80
|
}
|
|
72
81
|
}
|
|
73
|
-
|
|
74
|
-
return Number.isFinite(fallback) ? fallback : 0;
|
|
82
|
+
throw new Error(`Invalid payment amount: unrecognized type (${typeof amount})`);
|
|
75
83
|
}
|
|
76
84
|
/**
|
|
77
85
|
* Format a Medusa amount for the PayPal REST API.
|
|
@@ -82,7 +90,10 @@ function toAmountNumber(amount) {
|
|
|
82
90
|
* for the currency — it must NOT divide/convert to minor units.
|
|
83
91
|
*/
|
|
84
92
|
function formatAmountForPayPal(amount, currencyCode) {
|
|
93
|
+
if (!Number.isFinite(amount)) {
|
|
94
|
+
throw new Error(`Invalid payment amount for PayPal formatting: ${amount}`);
|
|
95
|
+
}
|
|
85
96
|
const exponent = getCurrencyExponent(currencyCode);
|
|
86
|
-
return
|
|
97
|
+
return amount.toFixed(exponent);
|
|
87
98
|
}
|
|
88
99
|
//# sourceMappingURL=amounts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"amounts.js","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/amounts.ts"],"names":[],"mappings":";;AA2BA,kDASC;AAWD,
|
|
1
|
+
{"version":3,"file":"amounts.js","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/amounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
type Environment = "sandbox" | "live";
|
|
2
|
+
interface ActiveCredentials {
|
|
3
|
+
environment: Environment;
|
|
4
|
+
client_id: string;
|
|
5
|
+
client_secret: string;
|
|
6
|
+
}
|
|
7
|
+
interface AccessTokenResult {
|
|
8
|
+
accessToken: string;
|
|
9
|
+
base: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ResolvedSettings {
|
|
12
|
+
additionalSettings: Record<string, unknown>;
|
|
13
|
+
advancedCardSettings: Record<string, unknown>;
|
|
14
|
+
apiDetails: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Self-contained credential and token management for PayPal payment providers.
|
|
18
|
+
*
|
|
19
|
+
* Payment providers in Medusa v2 run inside the payment module's scoped
|
|
20
|
+
* container, which is isolated from the application container where the
|
|
21
|
+
* PayPal module service lives. This resolver bypasses the container boundary
|
|
22
|
+
* entirely by reading credentials directly from the database via pgConnection
|
|
23
|
+
* (knex), which Medusa injects into every module container.
|
|
24
|
+
*
|
|
25
|
+
* Same source of truth (paypal_connection / paypal_settings tables), zero
|
|
26
|
+
* cross-container dependencies.
|
|
27
|
+
*/
|
|
28
|
+
export declare class PayPalCredentialResolver {
|
|
29
|
+
private db;
|
|
30
|
+
private tokenRefreshPromise;
|
|
31
|
+
constructor(pgConnection: any);
|
|
32
|
+
private getConnectionRow;
|
|
33
|
+
private getEnvCreds;
|
|
34
|
+
getActiveCredentials(): Promise<ActiveCredentials>;
|
|
35
|
+
getAccessToken(): Promise<AccessTokenResult>;
|
|
36
|
+
private refreshAccessToken;
|
|
37
|
+
getSettings(): Promise<ResolvedSettings>;
|
|
38
|
+
recordAuditEvent(eventType: string, metadata?: Record<string, unknown>): Promise<void>;
|
|
39
|
+
recordMetric(name: string, metadata?: Record<string, unknown>): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=credential-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-resolver.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/credential-resolver.ts"],"names":[],"mappings":"AAMA,KAAK,WAAW,GAAG,SAAS,GAAG,MAAM,CAAA;AAErC,UAAU,iBAAiB;IACzB,WAAW,EAAE,WAAW,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,UAAU,iBAAiB;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC3C,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACpC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,mBAAmB,CAA+B;gBAE9C,YAAY,EAAE,GAAG;YAIf,gBAAgB;IAS9B,OAAO,CAAC,WAAW;IAab,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAyBlD,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC;YAiCpC,kBAAkB;IAsD1B,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA2BxC,gBAAgB,CACpB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAgB9B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAgCpE"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PayPalCredentialResolver = void 0;
|
|
4
|
+
const paypal_fetch_1 = require("./paypal-fetch");
|
|
5
|
+
const secret_crypto_1 = require("./secret-crypto");
|
|
6
|
+
const BN_CODE = "MBJTechnolabs_SI_SPB";
|
|
7
|
+
const TOKEN_MARGIN_MS = 2 * 60 * 1000;
|
|
8
|
+
/**
|
|
9
|
+
* Self-contained credential and token management for PayPal payment providers.
|
|
10
|
+
*
|
|
11
|
+
* Payment providers in Medusa v2 run inside the payment module's scoped
|
|
12
|
+
* container, which is isolated from the application container where the
|
|
13
|
+
* PayPal module service lives. This resolver bypasses the container boundary
|
|
14
|
+
* entirely by reading credentials directly from the database via pgConnection
|
|
15
|
+
* (knex), which Medusa injects into every module container.
|
|
16
|
+
*
|
|
17
|
+
* Same source of truth (paypal_connection / paypal_settings tables), zero
|
|
18
|
+
* cross-container dependencies.
|
|
19
|
+
*/
|
|
20
|
+
class PayPalCredentialResolver {
|
|
21
|
+
db;
|
|
22
|
+
tokenRefreshPromise = null;
|
|
23
|
+
constructor(pgConnection) {
|
|
24
|
+
this.db = pgConnection;
|
|
25
|
+
}
|
|
26
|
+
async getConnectionRow() {
|
|
27
|
+
const rows = await this.db("paypal_connection")
|
|
28
|
+
.select("*")
|
|
29
|
+
.orderBy("created_at", "desc")
|
|
30
|
+
.limit(1);
|
|
31
|
+
return rows?.[0] ?? null;
|
|
32
|
+
}
|
|
33
|
+
getEnvCreds(row, env) {
|
|
34
|
+
const meta = (row?.metadata || {});
|
|
35
|
+
const creds = meta?.credentials?.[env] || {};
|
|
36
|
+
return {
|
|
37
|
+
clientId: creds.client_id || creds.clientId || undefined,
|
|
38
|
+
clientSecret: (0, secret_crypto_1.decryptSecret)(creds.client_secret || creds.clientSecret) || undefined,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async getActiveCredentials() {
|
|
42
|
+
const row = await this.getConnectionRow();
|
|
43
|
+
if (!row) {
|
|
44
|
+
throw new Error("PayPal connection not found. Please complete onboarding in the admin panel.");
|
|
45
|
+
}
|
|
46
|
+
const env = row.environment === "sandbox" ? "sandbox" : "live";
|
|
47
|
+
const c = this.getEnvCreds(row, env);
|
|
48
|
+
if (!c.clientId || !c.clientSecret) {
|
|
49
|
+
throw new Error(`PayPal credentials missing for environment "${env}". Please save credentials in the admin panel.`);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
environment: env,
|
|
53
|
+
client_id: c.clientId,
|
|
54
|
+
client_secret: c.clientSecret,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
async getAccessToken() {
|
|
58
|
+
const creds = await this.getActiveCredentials();
|
|
59
|
+
const base = creds.environment === "live"
|
|
60
|
+
? "https://api-m.paypal.com"
|
|
61
|
+
: "https://api-m.sandbox.paypal.com";
|
|
62
|
+
const row = await this.getConnectionRow();
|
|
63
|
+
if (row?.app_access_token && row.app_access_token_expires_at) {
|
|
64
|
+
const expiresAt = new Date(row.app_access_token_expires_at);
|
|
65
|
+
if (expiresAt.getTime() - Date.now() > TOKEN_MARGIN_MS) {
|
|
66
|
+
return {
|
|
67
|
+
accessToken: (0, secret_crypto_1.decryptSecret)(row.app_access_token),
|
|
68
|
+
base,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (this.tokenRefreshPromise) {
|
|
73
|
+
const accessToken = await this.tokenRefreshPromise;
|
|
74
|
+
return { accessToken, base };
|
|
75
|
+
}
|
|
76
|
+
this.tokenRefreshPromise = this.refreshAccessToken(row, creds).finally(() => {
|
|
77
|
+
this.tokenRefreshPromise = null;
|
|
78
|
+
});
|
|
79
|
+
const accessToken = await this.tokenRefreshPromise;
|
|
80
|
+
return { accessToken, base };
|
|
81
|
+
}
|
|
82
|
+
async refreshAccessToken(row, creds) {
|
|
83
|
+
const base = creds.environment === "live"
|
|
84
|
+
? "https://api-m.paypal.com"
|
|
85
|
+
: "https://api-m.sandbox.paypal.com";
|
|
86
|
+
const basic = Buffer.from(`${creds.client_id}:${creds.client_secret}`).toString("base64");
|
|
87
|
+
const body = new URLSearchParams();
|
|
88
|
+
body.set("grant_type", "client_credentials");
|
|
89
|
+
const res = await (0, paypal_fetch_1.paypalFetch)(`${base}/v1/oauth2/token`, {
|
|
90
|
+
method: "POST",
|
|
91
|
+
headers: {
|
|
92
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
93
|
+
Authorization: `Basic ${basic}`,
|
|
94
|
+
"PayPal-Partner-Attribution-Id": BN_CODE,
|
|
95
|
+
},
|
|
96
|
+
body,
|
|
97
|
+
signal: AbortSignal.timeout(30_000),
|
|
98
|
+
});
|
|
99
|
+
const json = await res.json().catch(() => ({}));
|
|
100
|
+
if (!res.ok) {
|
|
101
|
+
throw new Error(`PayPal client_credentials failed (${res.status}): ${JSON.stringify(json)}`);
|
|
102
|
+
}
|
|
103
|
+
const accessToken = String(json.access_token || "");
|
|
104
|
+
if (!accessToken) {
|
|
105
|
+
throw new Error("PayPal client_credentials succeeded but access_token is missing.");
|
|
106
|
+
}
|
|
107
|
+
const expiresIn = Number(json.expires_in || 3600);
|
|
108
|
+
const newExpiresAt = new Date(Date.now() + expiresIn * 1000);
|
|
109
|
+
if (row?.id) {
|
|
110
|
+
await this.db("paypal_connection").where("id", row.id).update({
|
|
111
|
+
app_access_token: (0, secret_crypto_1.encryptSecret)(accessToken),
|
|
112
|
+
app_access_token_expires_at: newExpiresAt,
|
|
113
|
+
updated_at: new Date(),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return accessToken;
|
|
117
|
+
}
|
|
118
|
+
async getSettings() {
|
|
119
|
+
try {
|
|
120
|
+
const rows = await this.db("paypal_settings")
|
|
121
|
+
.select("data")
|
|
122
|
+
.limit(1);
|
|
123
|
+
const data = (rows?.[0]?.data || {});
|
|
124
|
+
return {
|
|
125
|
+
additionalSettings: (data.additional_settings || {}),
|
|
126
|
+
advancedCardSettings: (data.advanced_card_payments || {}),
|
|
127
|
+
apiDetails: (data.api_details || {}),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return {
|
|
132
|
+
additionalSettings: {},
|
|
133
|
+
advancedCardSettings: {},
|
|
134
|
+
apiDetails: {},
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async recordAuditEvent(eventType, metadata) {
|
|
139
|
+
try {
|
|
140
|
+
console.info(JSON.stringify({
|
|
141
|
+
log: "paypal_audit",
|
|
142
|
+
event_type: eventType,
|
|
143
|
+
at: new Date().toISOString(),
|
|
144
|
+
...(metadata ? { metadata } : {}),
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// audit logging must never break the payment flow
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async recordMetric(name, metadata) {
|
|
152
|
+
try {
|
|
153
|
+
const rows = await this.db("paypal_metric")
|
|
154
|
+
.select("*")
|
|
155
|
+
.where("name", name)
|
|
156
|
+
.limit(1);
|
|
157
|
+
const row = rows?.[0];
|
|
158
|
+
const current = (row?.data || {});
|
|
159
|
+
const next = {
|
|
160
|
+
...current,
|
|
161
|
+
...(metadata || {}),
|
|
162
|
+
count: Number(current.count || 0) + 1,
|
|
163
|
+
last_recorded_at: new Date().toISOString(),
|
|
164
|
+
};
|
|
165
|
+
if (row) {
|
|
166
|
+
await this.db("paypal_metric")
|
|
167
|
+
.where("id", row.id)
|
|
168
|
+
.update({ data: JSON.stringify(next), updated_at: new Date() });
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
await this.db("paypal_metric").insert({
|
|
172
|
+
id: `ppmet_${Date.now().toString(36)}${Math.random().toString(36).slice(2, 8)}`,
|
|
173
|
+
name,
|
|
174
|
+
data: JSON.stringify(next),
|
|
175
|
+
created_at: new Date(),
|
|
176
|
+
updated_at: new Date(),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// metrics must never break the payment flow
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
exports.PayPalCredentialResolver = PayPalCredentialResolver;
|
|
186
|
+
//# sourceMappingURL=credential-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-resolver.js","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/credential-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-session.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/payment-session.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACjC,cAAc,EAAE,MAAM,CAAA;CACvB,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,GAAG,GACT,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAmCnC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GACvC,MAAM,GAAG,IAAI,CAIf;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,KAAK,EAAE,GAAG,GACT,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"payment-session.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/payment-session.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACjC,cAAc,EAAE,MAAM,CAAA;CACvB,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,GAAG,GACT,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAmCnC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GACvC,MAAM,GAAG,IAAI,CAIf;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,KAAK,EAAE,GAAG,GACT,OAAO,CAAC,IAAI,CAAC,CAuBf"}
|
|
@@ -72,7 +72,13 @@ async function updatePayPalSessionData(sessionId, extraData, scope) {
|
|
|
72
72
|
});
|
|
73
73
|
}
|
|
74
74
|
catch (e) {
|
|
75
|
-
|
|
75
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
76
|
+
console.error("[PayPal] updatePayPalSessionData failed:", msg);
|
|
77
|
+
const hasCaptureData = "capture_id" in extraData || "order_id" in extraData;
|
|
78
|
+
if (hasCaptureData) {
|
|
79
|
+
console.error("[PayPal] CRITICAL: Payment data (capture/order) was NOT persisted to session.", { sessionId, keys: Object.keys(extraData) });
|
|
80
|
+
}
|
|
81
|
+
throw e;
|
|
76
82
|
}
|
|
77
83
|
}
|
|
78
84
|
//# sourceMappingURL=payment-session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-session.js","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/payment-session.ts"],"names":[],"mappings":";;AA2BA,4DAsCC;AAOD,wDAMC;AAOD,
|
|
1
|
+
{"version":3,"file":"payment-session.js","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/payment-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Without a timeout, a slow or hung PayPal socket holds a Node request handler
|
|
5
|
-
* (and any DB connection it owns) open indefinitely; under load these
|
|
6
|
-
* accumulate and exhaust the event loop / connection pool, cascading into
|
|
7
|
-
* checkout-wide failures. Override with PAYPAL_HTTP_TIMEOUT_MS.
|
|
2
|
+
* Outbound HTTP for PayPal API calls with timeout, circuit breaker, and
|
|
3
|
+
* optional retry for critical payment operations.
|
|
8
4
|
*/
|
|
9
5
|
export declare const PAYPAL_HTTP_TIMEOUT_MS: number;
|
|
10
|
-
/**
|
|
11
|
-
* `fetch` that always enforces a timeout for PayPal / outbound calls. If the
|
|
12
|
-
* caller already supplies an AbortSignal, it is respected as-is (the caller is
|
|
13
|
-
* assumed to manage its own deadline).
|
|
14
|
-
*/
|
|
15
6
|
export declare function paypalFetch(input: string | URL, init?: RequestInit): Promise<Response>;
|
|
7
|
+
export declare function paypalFetchWithRetry(input: string | URL, init?: RequestInit): Promise<Response>;
|
|
16
8
|
//# sourceMappingURL=paypal-fetch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paypal-fetch.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/paypal-fetch.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"paypal-fetch.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/paypal-fetch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,sBAAsB,QAG/B,CAAA;AAkEJ,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,GAAG,GAAG,EACnB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC,CA0BnB;AA0BD,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,GAAG,GAAG,EACnB,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,QAAQ,CAAC,CAmBnB"}
|
|
@@ -1,31 +1,132 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Outbound HTTP for PayPal API calls with timeout, circuit breaker, and
|
|
4
|
+
* optional retry for critical payment operations.
|
|
5
|
+
*/
|
|
2
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
7
|
exports.PAYPAL_HTTP_TIMEOUT_MS = void 0;
|
|
4
8
|
exports.paypalFetch = paypalFetch;
|
|
5
|
-
|
|
6
|
-
* Default timeout (ms) for all server-side outbound PayPal HTTP calls.
|
|
7
|
-
*
|
|
8
|
-
* Without a timeout, a slow or hung PayPal socket holds a Node request handler
|
|
9
|
-
* (and any DB connection it owns) open indefinitely; under load these
|
|
10
|
-
* accumulate and exhaust the event loop / connection pool, cascading into
|
|
11
|
-
* checkout-wide failures. Override with PAYPAL_HTTP_TIMEOUT_MS.
|
|
12
|
-
*/
|
|
9
|
+
exports.paypalFetchWithRetry = paypalFetchWithRetry;
|
|
13
10
|
exports.PAYPAL_HTTP_TIMEOUT_MS = (() => {
|
|
14
11
|
const v = Number(process.env.PAYPAL_HTTP_TIMEOUT_MS);
|
|
15
12
|
return Number.isFinite(v) && v > 0 ? v : 30_000;
|
|
16
13
|
})();
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Circuit breaker
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
const CB_FAILURE_THRESHOLD = 5;
|
|
18
|
+
const CB_WINDOW_MS = 30_000;
|
|
19
|
+
const CB_HALF_OPEN_MS = 60_000;
|
|
20
|
+
let cbState = "closed";
|
|
21
|
+
let cbFailures = [];
|
|
22
|
+
let cbOpenedAt = 0;
|
|
23
|
+
let cbHalfOpenProbeInFlight = false;
|
|
24
|
+
function cbRecordSuccess() {
|
|
25
|
+
cbState = "closed";
|
|
26
|
+
cbFailures = [];
|
|
27
|
+
cbHalfOpenProbeInFlight = false;
|
|
28
|
+
}
|
|
29
|
+
function cbRecordFailure() {
|
|
30
|
+
cbHalfOpenProbeInFlight = false;
|
|
31
|
+
const now = Date.now();
|
|
32
|
+
cbFailures = cbFailures.filter((t) => now - t < CB_WINDOW_MS);
|
|
33
|
+
cbFailures.push(now);
|
|
34
|
+
if (cbFailures.length >= CB_FAILURE_THRESHOLD) {
|
|
35
|
+
cbState = "open";
|
|
36
|
+
cbOpenedAt = now;
|
|
37
|
+
console.warn(`[PayPal] circuit breaker OPEN after ${CB_FAILURE_THRESHOLD} failures in ${CB_WINDOW_MS / 1000}s`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function cbAllowRequest() {
|
|
41
|
+
if (cbState === "closed")
|
|
42
|
+
return true;
|
|
43
|
+
if (cbState === "open") {
|
|
44
|
+
if (Date.now() - cbOpenedAt >= CB_HALF_OPEN_MS) {
|
|
45
|
+
cbState = "half-open";
|
|
46
|
+
cbHalfOpenProbeInFlight = true;
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
// half-open: allow only one probe at a time
|
|
52
|
+
if (cbHalfOpenProbeInFlight)
|
|
53
|
+
return false;
|
|
54
|
+
cbHalfOpenProbeInFlight = true;
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
class CircuitOpenError extends Error {
|
|
58
|
+
constructor() {
|
|
59
|
+
super("PayPal circuit breaker is open — API calls are temporarily blocked after repeated failures. Will retry automatically.");
|
|
60
|
+
this.name = "CircuitOpenError";
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// Core fetch with timeout + circuit breaker
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
22
66
|
function paypalFetch(input, init = {}) {
|
|
23
|
-
if (
|
|
24
|
-
return
|
|
67
|
+
if (!cbAllowRequest()) {
|
|
68
|
+
return Promise.reject(new CircuitOpenError());
|
|
25
69
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
70
|
+
const fetchPromise = init.signal
|
|
71
|
+
? fetch(input, init)
|
|
72
|
+
: fetch(input, {
|
|
73
|
+
...init,
|
|
74
|
+
signal: AbortSignal.timeout(exports.PAYPAL_HTTP_TIMEOUT_MS),
|
|
75
|
+
});
|
|
76
|
+
return fetchPromise.then((res) => {
|
|
77
|
+
if (res.status >= 500) {
|
|
78
|
+
cbRecordFailure();
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
cbRecordSuccess();
|
|
82
|
+
}
|
|
83
|
+
return res;
|
|
84
|
+
}, (err) => {
|
|
85
|
+
cbRecordFailure();
|
|
86
|
+
throw err;
|
|
29
87
|
});
|
|
30
88
|
}
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
// Retry wrapper for critical payment operations (capture, refund)
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
const MAX_RETRIES = 2;
|
|
93
|
+
const BASE_DELAY_MS = 500;
|
|
94
|
+
function jitteredDelay(attempt) {
|
|
95
|
+
const base = BASE_DELAY_MS * Math.pow(2, attempt);
|
|
96
|
+
return base + Math.random() * base;
|
|
97
|
+
}
|
|
98
|
+
function isRetryable(err) {
|
|
99
|
+
if (err instanceof CircuitOpenError)
|
|
100
|
+
return true;
|
|
101
|
+
if (err instanceof Error) {
|
|
102
|
+
if (err.name === "TimeoutError" || err.name === "AbortError")
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
function isRetryableStatus(status) {
|
|
108
|
+
return status >= 500 || status === 429;
|
|
109
|
+
}
|
|
110
|
+
async function paypalFetchWithRetry(input, init = {}) {
|
|
111
|
+
let lastError;
|
|
112
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
113
|
+
try {
|
|
114
|
+
const res = await paypalFetch(input, init);
|
|
115
|
+
if (isRetryableStatus(res.status) && attempt < MAX_RETRIES) {
|
|
116
|
+
const delay = jitteredDelay(attempt);
|
|
117
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
return res;
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
lastError = err;
|
|
124
|
+
if (!isRetryable(err) || attempt >= MAX_RETRIES)
|
|
125
|
+
throw err;
|
|
126
|
+
const delay = jitteredDelay(attempt);
|
|
127
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
throw lastError;
|
|
131
|
+
}
|
|
31
132
|
//# sourceMappingURL=paypal-fetch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paypal-fetch.js","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/paypal-fetch.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"paypal-fetch.js","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/paypal-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secret-crypto.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/secret-crypto.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"secret-crypto.d.ts","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/secret-crypto.ts"],"names":[],"mappings":"AA4FA,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKnD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAevF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CA+BvF"}
|
|
@@ -39,6 +39,7 @@ const SALT_LEN = 16;
|
|
|
39
39
|
let cachedRaw;
|
|
40
40
|
let cachedRawKey = null;
|
|
41
41
|
let legacyV1Key = null;
|
|
42
|
+
const V2_KEY_CACHE_MAX = 100;
|
|
42
43
|
const v2KeyCache = new Map();
|
|
43
44
|
/**
|
|
44
45
|
* `@types/node` 22.0-22.6 typed `Buffer` as `Buffer<ArrayBufferLike>`, which is
|
|
@@ -70,6 +71,11 @@ function deriveV2Key(raw, salt) {
|
|
|
70
71
|
r: SCRYPT_R,
|
|
71
72
|
p: SCRYPT_P,
|
|
72
73
|
});
|
|
74
|
+
if (v2KeyCache.size >= V2_KEY_CACHE_MAX) {
|
|
75
|
+
const oldest = v2KeyCache.keys().next().value;
|
|
76
|
+
if (oldest !== undefined)
|
|
77
|
+
v2KeyCache.delete(oldest);
|
|
78
|
+
}
|
|
73
79
|
v2KeyCache.set(cacheKey, key);
|
|
74
80
|
}
|
|
75
81
|
return key;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secret-crypto.js","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/secret-crypto.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"secret-crypto.js","sourceRoot":"","sources":["../../../../../../src/modules/paypal/utils/secret-crypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-processor.d.ts","sourceRoot":"","sources":["../../../../../src/modules/paypal/webhook-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAKhE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CACnC,MAAM,EACN,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAejD,CAAA;AAWD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAErE;AAGD,eAAO,MAAM,wBAAwB,UAKpC,CAAA;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE7D;AAWD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKxD;AAID,eAAO,MAAM,oBAAoB,QAAoC,CAAA;AAErE,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAKpE;AAGD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAWnF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CASjF;AAGD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,SAAS,EAAE,MAAM,GAChB,oBAAoB,CAwCtB;AA+GD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,cAAc,EAAE,OAAO,CAAA;CACxB;AAED,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE;IACL,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC7B,GACA,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"webhook-processor.d.ts","sourceRoot":"","sources":["../../../../../src/modules/paypal/webhook-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAKhE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CACnC,MAAM,EACN,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAejD,CAAA;AAWD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAErE;AAGD,eAAO,MAAM,wBAAwB,UAKpC,CAAA;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE7D;AAWD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAKxD;AAID,eAAO,MAAM,oBAAoB,QAAoC,CAAA;AAErE,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAKpE;AAGD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAWnF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CASjF;AAGD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,SAAS,EAAE,MAAM,GAChB,oBAAoB,CAwCtB;AA+GD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,cAAc,EAAE,OAAO,CAAA;CACxB;AAED,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,eAAe,EAC1B,KAAK,EAAE;IACL,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC7B,GACA,OAAO,CAAC,aAAa,CAAC,CA8GxB"}
|