@muhammedaksam/sipay-node 1.1.2 → 1.1.3
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/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/resources/webhooks.js +147 -0
- package/dist/esm/resources/webhooks.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/resources/webhooks.d.ts +96 -0
- package/dist/resources/webhooks.d.ts.map +1 -0
- package/dist/resources/webhooks.js +151 -0
- package/dist/resources/webhooks.js.map +1 -0
- package/package.json +1 -1
package/dist/esm/index.js
CHANGED
|
@@ -8,6 +8,7 @@ import { PaymentCompletion } from './resources/payment-completion';
|
|
|
8
8
|
import { Marketplace } from './resources/marketplace';
|
|
9
9
|
import { Cashout } from './resources/cashout';
|
|
10
10
|
import { SubMerchant } from './resources/sub-merchant';
|
|
11
|
+
import { SipayWebhooks } from './resources/webhooks';
|
|
11
12
|
export class Sipay {
|
|
12
13
|
constructor(config) {
|
|
13
14
|
this.client = new SipayHttpClient(config);
|
|
@@ -21,6 +22,7 @@ export class Sipay {
|
|
|
21
22
|
this.marketplace = new Marketplace(this.client);
|
|
22
23
|
this.cashout = new Cashout(this.client);
|
|
23
24
|
this.subMerchant = new SubMerchant(this.client);
|
|
25
|
+
this.webhooks = new SipayWebhooks(this.client);
|
|
24
26
|
}
|
|
25
27
|
/**
|
|
26
28
|
* Manually authenticate with Sipay API
|
|
@@ -57,5 +59,6 @@ export { PaymentCompletion } from './resources/payment-completion';
|
|
|
57
59
|
export { Marketplace } from './resources/marketplace';
|
|
58
60
|
export { Cashout } from './resources/cashout';
|
|
59
61
|
export { SubMerchant } from './resources/sub-merchant';
|
|
62
|
+
export { SipayWebhooks } from './resources/webhooks';
|
|
60
63
|
export * from './utils';
|
|
61
64
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { SipayResource } from './base';
|
|
2
|
+
import { validateHashKey } from '../utils';
|
|
3
|
+
/**
|
|
4
|
+
* Webhooks resource for handling Sipay webhook events
|
|
5
|
+
* Provides methods to validate and parse webhook notifications
|
|
6
|
+
*
|
|
7
|
+
* Uses the existing validateHashKey utility from utils for hash validation,
|
|
8
|
+
* which provides full AES-256-CBC decryption compatible with PHP SDK
|
|
9
|
+
*/
|
|
10
|
+
export class SipayWebhooks extends SipayResource {
|
|
11
|
+
/**
|
|
12
|
+
* Validate webhook hash key to ensure request authenticity
|
|
13
|
+
* Uses the existing validateHashKey utility function
|
|
14
|
+
*/
|
|
15
|
+
validateHashKey(hashKey, secretKey) {
|
|
16
|
+
try {
|
|
17
|
+
if (!hashKey) {
|
|
18
|
+
return { isValid: false, error: 'Hash key is required' };
|
|
19
|
+
}
|
|
20
|
+
// Use the existing validateHashKey function from utils
|
|
21
|
+
const [status, total, invoiceId, orderId, currencyCode] = validateHashKey(hashKey, secretKey);
|
|
22
|
+
// If we got valid data back, consider it a successful validation
|
|
23
|
+
const isValid = status !== '' || total !== 0 || invoiceId !== '' || orderId !== 0 || currencyCode !== '';
|
|
24
|
+
return {
|
|
25
|
+
isValid,
|
|
26
|
+
status,
|
|
27
|
+
total,
|
|
28
|
+
invoiceId,
|
|
29
|
+
orderId,
|
|
30
|
+
currencyCode,
|
|
31
|
+
error: isValid ? undefined : 'Hash validation failed',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
return {
|
|
36
|
+
isValid: false,
|
|
37
|
+
error: `Hash validation error: ${error.message}`,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Parse sales webhook payload
|
|
43
|
+
*/
|
|
44
|
+
parseSalesWebhook(payload) {
|
|
45
|
+
return {
|
|
46
|
+
sipay_status: payload.sipay_status || '',
|
|
47
|
+
order_no: payload.order_no || '',
|
|
48
|
+
invoice_id: payload.invoice_id || '',
|
|
49
|
+
status_code: payload.status_code || '',
|
|
50
|
+
status_description: payload.status_description || '',
|
|
51
|
+
sipay_payment_method: payload.sipay_payment_method || '',
|
|
52
|
+
credit_card_no: payload.credit_card_no || '',
|
|
53
|
+
transaction_type: payload.transaction_type || 'Auth',
|
|
54
|
+
payment_status: payload.payment_status || '0',
|
|
55
|
+
payment_method: payload.payment_method || '1',
|
|
56
|
+
error_code: payload.error_code || '',
|
|
57
|
+
error: payload.error || '',
|
|
58
|
+
status: payload.status || '',
|
|
59
|
+
hash_key: payload.hash_key || '',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Parse recurring webhook payload
|
|
64
|
+
*/
|
|
65
|
+
parseRecurringWebhook(payload) {
|
|
66
|
+
return {
|
|
67
|
+
merchant_key: payload.merchant_key || '',
|
|
68
|
+
invoice_id: payload.invoice_id || '',
|
|
69
|
+
order_id: payload.order_id || '',
|
|
70
|
+
product_price: parseFloat(payload.product_price) || 0,
|
|
71
|
+
plan_code: payload.plan_code || '',
|
|
72
|
+
recurring_number: payload.recurring_number || '',
|
|
73
|
+
status: payload.status || '',
|
|
74
|
+
attempts: payload.attempts || '',
|
|
75
|
+
action_date: payload.action_date || '',
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Parse refund webhook payload
|
|
80
|
+
*/
|
|
81
|
+
parseRefundWebhook(payload) {
|
|
82
|
+
return {
|
|
83
|
+
invoice_id: payload.invoice_id || '',
|
|
84
|
+
order_id: payload.order_id || '',
|
|
85
|
+
amount: parseFloat(payload.amount) || 0,
|
|
86
|
+
status: payload.status || '',
|
|
87
|
+
hash_key: payload.hash_key || '',
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Verify sales webhook - validates hash and parses event
|
|
92
|
+
*/
|
|
93
|
+
verifySalesWebhook(payload, appSecret) {
|
|
94
|
+
try {
|
|
95
|
+
const event = this.parseSalesWebhook(payload);
|
|
96
|
+
if (!event.hash_key) {
|
|
97
|
+
return { isValid: false, error: 'Missing hash key in webhook payload' };
|
|
98
|
+
}
|
|
99
|
+
const validation = this.validateHashKey(event.hash_key, appSecret);
|
|
100
|
+
return {
|
|
101
|
+
isValid: validation.isValid,
|
|
102
|
+
event: validation.isValid ? event : undefined,
|
|
103
|
+
validation,
|
|
104
|
+
error: validation.error,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
return {
|
|
109
|
+
isValid: false,
|
|
110
|
+
error: `Webhook verification failed: ${error.message}`,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Check if payment was successful based on webhook data
|
|
116
|
+
*/
|
|
117
|
+
isPaymentSuccessful(event) {
|
|
118
|
+
return event.payment_status === '1' && event.status_code === '100';
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Check if payment was pre-authorized (needs confirmation)
|
|
122
|
+
*/
|
|
123
|
+
isPaymentPreAuthorized(event) {
|
|
124
|
+
return event.payment_status === '1' && event.transaction_type === 'Pre-Authorization';
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Check if payment failed
|
|
128
|
+
*/
|
|
129
|
+
isPaymentFailed(event) {
|
|
130
|
+
return event.payment_status === '0';
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get human-readable payment status
|
|
134
|
+
*/
|
|
135
|
+
getPaymentStatusDescription(event) {
|
|
136
|
+
if (this.isPaymentSuccessful(event)) {
|
|
137
|
+
return event.transaction_type === 'Pre-Authorization'
|
|
138
|
+
? 'Payment pre-authorized successfully - requires confirmation'
|
|
139
|
+
: 'Payment completed successfully';
|
|
140
|
+
}
|
|
141
|
+
if (this.isPaymentFailed(event)) {
|
|
142
|
+
return `Payment failed: ${event.status_description}`;
|
|
143
|
+
}
|
|
144
|
+
return `Payment status: ${event.status_description}`;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../src/resources/webhooks.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { PaymentCompletion } from './resources/payment-completion';
|
|
|
8
8
|
import { Marketplace } from './resources/marketplace';
|
|
9
9
|
import { Cashout } from './resources/cashout';
|
|
10
10
|
import { SubMerchant } from './resources/sub-merchant';
|
|
11
|
+
import { SipayWebhooks } from './resources/webhooks';
|
|
11
12
|
export declare class Sipay {
|
|
12
13
|
private client;
|
|
13
14
|
payments: Payments;
|
|
@@ -19,6 +20,7 @@ export declare class Sipay {
|
|
|
19
20
|
marketplace: Marketplace;
|
|
20
21
|
cashout: Cashout;
|
|
21
22
|
subMerchant: SubMerchant;
|
|
23
|
+
webhooks: SipayWebhooks;
|
|
22
24
|
constructor(config: SipayConfig);
|
|
23
25
|
/**
|
|
24
26
|
* Manually authenticate with Sipay API
|
|
@@ -47,5 +49,6 @@ export { PaymentCompletion } from './resources/payment-completion';
|
|
|
47
49
|
export { Marketplace } from './resources/marketplace';
|
|
48
50
|
export { Cashout } from './resources/cashout';
|
|
49
51
|
export { SubMerchant } from './resources/sub-merchant';
|
|
52
|
+
export { SipayWebhooks } from './resources/webhooks';
|
|
50
53
|
export * from './utils';
|
|
51
54
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAkB;IAEzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,aAAa,CAAC;gBAEnB,MAAM,EAAE,WAAW;IAgB/B;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC;;OAEG;IACH,QAAQ,IAAI,MAAM,GAAG,SAAS;IAI9B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAG9B;AAGD,eAAe,KAAK,CAAC;AAGrB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,cAAc,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.SubMerchant = exports.Cashout = exports.Marketplace = exports.PaymentCompletion = exports.Cards = exports.Commissions = exports.BrandedSolution = exports.Recurring = exports.Payments = exports.SipayResource = exports.SipayHttpClient = exports.Sipay = void 0;
|
|
17
|
+
exports.SipayWebhooks = exports.SubMerchant = exports.Cashout = exports.Marketplace = exports.PaymentCompletion = exports.Cards = exports.Commissions = exports.BrandedSolution = exports.Recurring = exports.Payments = exports.SipayResource = exports.SipayHttpClient = exports.Sipay = void 0;
|
|
18
18
|
const http_client_1 = require("./utils/http-client");
|
|
19
19
|
const payments_1 = require("./resources/payments");
|
|
20
20
|
const recurring_1 = require("./resources/recurring");
|
|
@@ -25,6 +25,7 @@ const payment_completion_1 = require("./resources/payment-completion");
|
|
|
25
25
|
const marketplace_1 = require("./resources/marketplace");
|
|
26
26
|
const cashout_1 = require("./resources/cashout");
|
|
27
27
|
const sub_merchant_1 = require("./resources/sub-merchant");
|
|
28
|
+
const webhooks_1 = require("./resources/webhooks");
|
|
28
29
|
class Sipay {
|
|
29
30
|
constructor(config) {
|
|
30
31
|
this.client = new http_client_1.SipayHttpClient(config);
|
|
@@ -38,6 +39,7 @@ class Sipay {
|
|
|
38
39
|
this.marketplace = new marketplace_1.Marketplace(this.client);
|
|
39
40
|
this.cashout = new cashout_1.Cashout(this.client);
|
|
40
41
|
this.subMerchant = new sub_merchant_1.SubMerchant(this.client);
|
|
42
|
+
this.webhooks = new webhooks_1.SipayWebhooks(this.client);
|
|
41
43
|
}
|
|
42
44
|
/**
|
|
43
45
|
* Manually authenticate with Sipay API
|
|
@@ -86,5 +88,7 @@ var cashout_2 = require("./resources/cashout");
|
|
|
86
88
|
Object.defineProperty(exports, "Cashout", { enumerable: true, get: function () { return cashout_2.Cashout; } });
|
|
87
89
|
var sub_merchant_2 = require("./resources/sub-merchant");
|
|
88
90
|
Object.defineProperty(exports, "SubMerchant", { enumerable: true, get: function () { return sub_merchant_2.SubMerchant; } });
|
|
91
|
+
var webhooks_2 = require("./resources/webhooks");
|
|
92
|
+
Object.defineProperty(exports, "SipayWebhooks", { enumerable: true, get: function () { return webhooks_2.SipayWebhooks; } });
|
|
89
93
|
__exportStar(require("./utils"), exports);
|
|
90
94
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qDAAsD;AAEtD,mDAAgD;AAChD,qDAAkD;AAClD,mEAA+D;AAC/D,yDAAsD;AACtD,6CAA0C;AAC1C,uEAAmE;AACnE,yDAAsD;AACtD,iDAA8C;AAC9C,2DAAuD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qDAAsD;AAEtD,mDAAgD;AAChD,qDAAkD;AAClD,mEAA+D;AAC/D,yDAAsD;AACtD,6CAA0C;AAC1C,uEAAmE;AACnE,yDAAsD;AACtD,iDAA8C;AAC9C,2DAAuD;AACvD,mDAAqD;AAErD,MAAa,KAAK;IAchB,YAAY,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,6BAAe,CAAC,MAAM,CAAC,CAAC;QAE1C,uBAAuB;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,mBAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,GAAG,IAAI,kCAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,IAAI,aAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,IAAI,sCAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,WAAW,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,IAAI,0BAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,IAAI,wBAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AAnDD,sBAmDC;AAED,iBAAiB;AACjB,kBAAe,KAAK,CAAC;AAErB,gBAAgB;AAChB,0CAAwB;AACxB,mDAAsD;AAA7C,8GAAA,eAAe,OAAA;AACxB,yCAAiD;AAAxC,qGAAA,aAAa,OAAA;AACtB,iDAAgD;AAAvC,oGAAA,QAAQ,OAAA;AACjB,mDAAkD;AAAzC,sGAAA,SAAS,OAAA;AAClB,iEAA+D;AAAtD,mHAAA,eAAe,OAAA;AACxB,uDAAsD;AAA7C,0GAAA,WAAW,OAAA;AACpB,2CAA0C;AAAjC,8FAAA,KAAK,OAAA;AACd,qEAAmE;AAA1D,uHAAA,iBAAiB,OAAA;AAC1B,uDAAsD;AAA7C,0GAAA,WAAW,OAAA;AACpB,+CAA8C;AAArC,kGAAA,OAAO,OAAA;AAChB,yDAAuD;AAA9C,2GAAA,WAAW,OAAA;AACpB,iDAAqD;AAA5C,yGAAA,aAAa,OAAA;AACtB,0CAAwB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { SipayResource } from './base';
|
|
2
|
+
export interface SalesWebhookEvent {
|
|
3
|
+
sipay_status: string;
|
|
4
|
+
order_no: string;
|
|
5
|
+
invoice_id: string;
|
|
6
|
+
status_code: string;
|
|
7
|
+
status_description: string;
|
|
8
|
+
sipay_payment_method: string;
|
|
9
|
+
credit_card_no: string;
|
|
10
|
+
transaction_type: 'Auth' | 'Pre-Authorization';
|
|
11
|
+
payment_status: '0' | '1';
|
|
12
|
+
payment_method: '1' | '2' | '3';
|
|
13
|
+
error_code: string;
|
|
14
|
+
error: string;
|
|
15
|
+
status: string;
|
|
16
|
+
hash_key: string;
|
|
17
|
+
}
|
|
18
|
+
export interface RecurringWebhookEvent {
|
|
19
|
+
merchant_key: string;
|
|
20
|
+
invoice_id: string;
|
|
21
|
+
order_id: string;
|
|
22
|
+
product_price: number;
|
|
23
|
+
plan_code: string;
|
|
24
|
+
recurring_number: string;
|
|
25
|
+
status: string;
|
|
26
|
+
attempts: string;
|
|
27
|
+
action_date: string;
|
|
28
|
+
}
|
|
29
|
+
export interface RefundWebhookEvent {
|
|
30
|
+
invoice_id: string;
|
|
31
|
+
order_id: string;
|
|
32
|
+
amount: number;
|
|
33
|
+
status: string;
|
|
34
|
+
hash_key: string;
|
|
35
|
+
}
|
|
36
|
+
export interface WebhookValidationResult {
|
|
37
|
+
isValid: boolean;
|
|
38
|
+
status?: string;
|
|
39
|
+
total?: number;
|
|
40
|
+
invoiceId?: string;
|
|
41
|
+
orderId?: number;
|
|
42
|
+
currencyCode?: string;
|
|
43
|
+
error?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Webhooks resource for handling Sipay webhook events
|
|
47
|
+
* Provides methods to validate and parse webhook notifications
|
|
48
|
+
*
|
|
49
|
+
* Uses the existing validateHashKey utility from utils for hash validation,
|
|
50
|
+
* which provides full AES-256-CBC decryption compatible with PHP SDK
|
|
51
|
+
*/
|
|
52
|
+
export declare class SipayWebhooks extends SipayResource {
|
|
53
|
+
/**
|
|
54
|
+
* Validate webhook hash key to ensure request authenticity
|
|
55
|
+
* Uses the existing validateHashKey utility function
|
|
56
|
+
*/
|
|
57
|
+
validateHashKey(hashKey: string, secretKey: string): WebhookValidationResult;
|
|
58
|
+
/**
|
|
59
|
+
* Parse sales webhook payload
|
|
60
|
+
*/
|
|
61
|
+
parseSalesWebhook(payload: any): SalesWebhookEvent;
|
|
62
|
+
/**
|
|
63
|
+
* Parse recurring webhook payload
|
|
64
|
+
*/
|
|
65
|
+
parseRecurringWebhook(payload: any): RecurringWebhookEvent;
|
|
66
|
+
/**
|
|
67
|
+
* Parse refund webhook payload
|
|
68
|
+
*/
|
|
69
|
+
parseRefundWebhook(payload: any): RefundWebhookEvent;
|
|
70
|
+
/**
|
|
71
|
+
* Verify sales webhook - validates hash and parses event
|
|
72
|
+
*/
|
|
73
|
+
verifySalesWebhook(payload: any, appSecret: string): {
|
|
74
|
+
isValid: boolean;
|
|
75
|
+
event?: SalesWebhookEvent;
|
|
76
|
+
validation?: WebhookValidationResult;
|
|
77
|
+
error?: string;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Check if payment was successful based on webhook data
|
|
81
|
+
*/
|
|
82
|
+
isPaymentSuccessful(event: SalesWebhookEvent): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Check if payment was pre-authorized (needs confirmation)
|
|
85
|
+
*/
|
|
86
|
+
isPaymentPreAuthorized(event: SalesWebhookEvent): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* Check if payment failed
|
|
89
|
+
*/
|
|
90
|
+
isPaymentFailed(event: SalesWebhookEvent): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Get human-readable payment status
|
|
93
|
+
*/
|
|
94
|
+
getPaymentStatusDescription(event: SalesWebhookEvent): string;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=webhooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/resources/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAGvC,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,mBAAmB,CAAC;IAC/C,cAAc,EAAE,GAAG,GAAG,GAAG,CAAC;IAC1B,cAAc,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,aAAa;IAC9C;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,uBAAuB;IA8B5E;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,GAAG,GAAG,iBAAiB;IAmBlD;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,GAAG,GAAG,qBAAqB;IAc1D;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAG,kBAAkB;IAUpD;;OAEG;IACH,kBAAkB,CAChB,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,MAAM,GAChB;QACD,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,iBAAiB,CAAC;QAC1B,UAAU,CAAC,EAAE,uBAAuB,CAAC;QACrC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;IAwBD;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO;IAItD;;OAEG;IACH,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO;IAIzD;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO;IAIlD;;OAEG;IACH,2BAA2B,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM;CAa9D"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SipayWebhooks = void 0;
|
|
4
|
+
const base_1 = require("./base");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
/**
|
|
7
|
+
* Webhooks resource for handling Sipay webhook events
|
|
8
|
+
* Provides methods to validate and parse webhook notifications
|
|
9
|
+
*
|
|
10
|
+
* Uses the existing validateHashKey utility from utils for hash validation,
|
|
11
|
+
* which provides full AES-256-CBC decryption compatible with PHP SDK
|
|
12
|
+
*/
|
|
13
|
+
class SipayWebhooks extends base_1.SipayResource {
|
|
14
|
+
/**
|
|
15
|
+
* Validate webhook hash key to ensure request authenticity
|
|
16
|
+
* Uses the existing validateHashKey utility function
|
|
17
|
+
*/
|
|
18
|
+
validateHashKey(hashKey, secretKey) {
|
|
19
|
+
try {
|
|
20
|
+
if (!hashKey) {
|
|
21
|
+
return { isValid: false, error: 'Hash key is required' };
|
|
22
|
+
}
|
|
23
|
+
// Use the existing validateHashKey function from utils
|
|
24
|
+
const [status, total, invoiceId, orderId, currencyCode] = (0, utils_1.validateHashKey)(hashKey, secretKey);
|
|
25
|
+
// If we got valid data back, consider it a successful validation
|
|
26
|
+
const isValid = status !== '' || total !== 0 || invoiceId !== '' || orderId !== 0 || currencyCode !== '';
|
|
27
|
+
return {
|
|
28
|
+
isValid,
|
|
29
|
+
status,
|
|
30
|
+
total,
|
|
31
|
+
invoiceId,
|
|
32
|
+
orderId,
|
|
33
|
+
currencyCode,
|
|
34
|
+
error: isValid ? undefined : 'Hash validation failed',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
return {
|
|
39
|
+
isValid: false,
|
|
40
|
+
error: `Hash validation error: ${error.message}`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Parse sales webhook payload
|
|
46
|
+
*/
|
|
47
|
+
parseSalesWebhook(payload) {
|
|
48
|
+
return {
|
|
49
|
+
sipay_status: payload.sipay_status || '',
|
|
50
|
+
order_no: payload.order_no || '',
|
|
51
|
+
invoice_id: payload.invoice_id || '',
|
|
52
|
+
status_code: payload.status_code || '',
|
|
53
|
+
status_description: payload.status_description || '',
|
|
54
|
+
sipay_payment_method: payload.sipay_payment_method || '',
|
|
55
|
+
credit_card_no: payload.credit_card_no || '',
|
|
56
|
+
transaction_type: payload.transaction_type || 'Auth',
|
|
57
|
+
payment_status: payload.payment_status || '0',
|
|
58
|
+
payment_method: payload.payment_method || '1',
|
|
59
|
+
error_code: payload.error_code || '',
|
|
60
|
+
error: payload.error || '',
|
|
61
|
+
status: payload.status || '',
|
|
62
|
+
hash_key: payload.hash_key || '',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Parse recurring webhook payload
|
|
67
|
+
*/
|
|
68
|
+
parseRecurringWebhook(payload) {
|
|
69
|
+
return {
|
|
70
|
+
merchant_key: payload.merchant_key || '',
|
|
71
|
+
invoice_id: payload.invoice_id || '',
|
|
72
|
+
order_id: payload.order_id || '',
|
|
73
|
+
product_price: parseFloat(payload.product_price) || 0,
|
|
74
|
+
plan_code: payload.plan_code || '',
|
|
75
|
+
recurring_number: payload.recurring_number || '',
|
|
76
|
+
status: payload.status || '',
|
|
77
|
+
attempts: payload.attempts || '',
|
|
78
|
+
action_date: payload.action_date || '',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Parse refund webhook payload
|
|
83
|
+
*/
|
|
84
|
+
parseRefundWebhook(payload) {
|
|
85
|
+
return {
|
|
86
|
+
invoice_id: payload.invoice_id || '',
|
|
87
|
+
order_id: payload.order_id || '',
|
|
88
|
+
amount: parseFloat(payload.amount) || 0,
|
|
89
|
+
status: payload.status || '',
|
|
90
|
+
hash_key: payload.hash_key || '',
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Verify sales webhook - validates hash and parses event
|
|
95
|
+
*/
|
|
96
|
+
verifySalesWebhook(payload, appSecret) {
|
|
97
|
+
try {
|
|
98
|
+
const event = this.parseSalesWebhook(payload);
|
|
99
|
+
if (!event.hash_key) {
|
|
100
|
+
return { isValid: false, error: 'Missing hash key in webhook payload' };
|
|
101
|
+
}
|
|
102
|
+
const validation = this.validateHashKey(event.hash_key, appSecret);
|
|
103
|
+
return {
|
|
104
|
+
isValid: validation.isValid,
|
|
105
|
+
event: validation.isValid ? event : undefined,
|
|
106
|
+
validation,
|
|
107
|
+
error: validation.error,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
return {
|
|
112
|
+
isValid: false,
|
|
113
|
+
error: `Webhook verification failed: ${error.message}`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Check if payment was successful based on webhook data
|
|
119
|
+
*/
|
|
120
|
+
isPaymentSuccessful(event) {
|
|
121
|
+
return event.payment_status === '1' && event.status_code === '100';
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Check if payment was pre-authorized (needs confirmation)
|
|
125
|
+
*/
|
|
126
|
+
isPaymentPreAuthorized(event) {
|
|
127
|
+
return event.payment_status === '1' && event.transaction_type === 'Pre-Authorization';
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Check if payment failed
|
|
131
|
+
*/
|
|
132
|
+
isPaymentFailed(event) {
|
|
133
|
+
return event.payment_status === '0';
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get human-readable payment status
|
|
137
|
+
*/
|
|
138
|
+
getPaymentStatusDescription(event) {
|
|
139
|
+
if (this.isPaymentSuccessful(event)) {
|
|
140
|
+
return event.transaction_type === 'Pre-Authorization'
|
|
141
|
+
? 'Payment pre-authorized successfully - requires confirmation'
|
|
142
|
+
: 'Payment completed successfully';
|
|
143
|
+
}
|
|
144
|
+
if (this.isPaymentFailed(event)) {
|
|
145
|
+
return `Payment failed: ${event.status_description}`;
|
|
146
|
+
}
|
|
147
|
+
return `Payment status: ${event.status_description}`;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
exports.SipayWebhooks = SipayWebhooks;
|
|
151
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/resources/webhooks.ts"],"names":[],"mappings":";;;AAAA,iCAAuC;AACvC,oCAA2C;AAiD3C;;;;;;GAMG;AACH,MAAa,aAAc,SAAQ,oBAAa;IAC9C;;;OAGG;IACH,eAAe,CAAC,OAAe,EAAE,SAAiB;QAChD,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;YAC3D,CAAC;YAED,uDAAuD;YACvD,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,GAAG,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAE9F,iEAAiE;YACjE,MAAM,OAAO,GACX,MAAM,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC,IAAI,SAAS,KAAK,EAAE,IAAI,OAAO,KAAK,CAAC,IAAI,YAAY,KAAK,EAAE,CAAC;YAE3F,OAAO;gBACL,OAAO;gBACP,MAAM;gBACN,KAAK;gBACL,SAAS;gBACT,OAAO;gBACP,YAAY;gBACZ,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,wBAAwB;aACtD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,0BAA2B,KAAe,CAAC,OAAO,EAAE;aAC5D,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAY;QAC5B,OAAO;YACL,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;YACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;YAChC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;YACpC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;YACtC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,EAAE;YACpD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,IAAI,EAAE;YACxD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;YAC5C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,MAAM;YACpD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,GAAG;YAC7C,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,GAAG;YAC7C,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;YACpC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;SACjC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,OAAY;QAChC,OAAO;YACL,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;YACxC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;YACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;YAChC,aAAa,EAAE,UAAU,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC;YACrD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;YAClC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,EAAE;YAChD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;YAChC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,EAAE;SACvC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,OAAY;QAC7B,OAAO;YACL,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;YACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;YAChC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;YACvC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;SACjC,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,kBAAkB,CAChB,OAAY,EACZ,SAAiB;QAOjB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAE9C,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAC;YAC1E,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAEnE,OAAO;gBACL,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBAC7C,UAAU;gBACV,KAAK,EAAE,UAAU,CAAC,KAAK;aACxB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,gCAAiC,KAAe,CAAC,OAAO,EAAE;aAClE,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,KAAwB;QAC1C,OAAO,KAAK,CAAC,cAAc,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,sBAAsB,CAAC,KAAwB;QAC7C,OAAO,KAAK,CAAC,cAAc,KAAK,GAAG,IAAI,KAAK,CAAC,gBAAgB,KAAK,mBAAmB,CAAC;IACxF,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,KAAwB;QACtC,OAAO,KAAK,CAAC,cAAc,KAAK,GAAG,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,2BAA2B,CAAC,KAAwB;QAClD,IAAI,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC,gBAAgB,KAAK,mBAAmB;gBACnD,CAAC,CAAC,6DAA6D;gBAC/D,CAAC,CAAC,gCAAgC,CAAC;QACvC,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,mBAAmB,KAAK,CAAC,kBAAkB,EAAE,CAAC;QACvD,CAAC;QAED,OAAO,mBAAmB,KAAK,CAAC,kBAAkB,EAAE,CAAC;IACvD,CAAC;CACF;AA/JD,sCA+JC"}
|