@sakeetech/viva-payments-core 0.2.1 → 0.2.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/auth/http.js +14 -9
- package/dist/auth/http.js.map +1 -1
- package/dist/auth/index.js +18 -5
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/oauth2-strategy.js +24 -20
- package/dist/auth/oauth2-strategy.js.map +1 -1
- package/dist/auth/reseller-strategy.js +5 -1
- package/dist/auth/reseller-strategy.js.map +1 -1
- package/dist/auth/single-flight.js +8 -3
- package/dist/auth/single-flight.js.map +1 -1
- package/dist/auth/token-cache.js +7 -2
- package/dist/auth/token-cache.js.map +1 -1
- package/dist/errors/api-error.js +6 -2
- package/dist/errors/api-error.js.map +1 -1
- package/dist/errors/auth-error.js +6 -2
- package/dist/errors/auth-error.js.map +1 -1
- package/dist/errors/base.js +5 -1
- package/dist/errors/base.js.map +1 -1
- package/dist/errors/index.js +17 -7
- package/dist/errors/index.js.map +1 -1
- package/dist/errors/mode-mismatch-error.js +6 -2
- package/dist/errors/mode-mismatch-error.js.map +1 -1
- package/dist/errors/rate-limit-error.js +6 -2
- package/dist/errors/rate-limit-error.js.map +1 -1
- package/dist/errors/validation-error.js +6 -2
- package/dist/errors/validation-error.js.map +1 -1
- package/dist/errors/webhook-error.js +6 -2
- package/dist/errors/webhook-error.js.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/isv/accounts.js +5 -1
- package/dist/isv/accounts.js.map +1 -1
- package/dist/isv/client.js +23 -19
- package/dist/isv/client.js.map +1 -1
- package/dist/isv/index.js +17 -8
- package/dist/isv/index.js.map +1 -1
- package/dist/isv/sources.js +8 -4
- package/dist/isv/sources.js.map +1 -1
- package/dist/isv/webhooks-api.js +5 -1
- package/dist/isv/webhooks-api.js.map +1 -1
- package/dist/legacy/client.js +19 -15
- package/dist/legacy/client.js.map +1 -1
- package/dist/legacy/index.js +5 -1
- package/dist/legacy/index.js.map +1 -1
- package/dist/observability/context.js +15 -11
- package/dist/observability/context.js.map +1 -1
- package/dist/observability/index.js +16 -5
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/logger.js +11 -5
- package/dist/observability/logger.js.map +1 -1
- package/dist/observability/metrics.js +5 -1
- package/dist/observability/metrics.js.map +1 -1
- package/dist/observability/redact.js +4 -1
- package/dist/observability/redact.js.map +1 -1
- package/dist/observability/tracer.js +5 -1
- package/dist/observability/tracer.js.map +1 -1
- package/dist/payments/client.d.ts.map +1 -1
- package/dist/payments/client.js +23 -14
- package/dist/payments/client.js.map +1 -1
- package/dist/payments/index.js +5 -1
- package/dist/payments/index.js.map +1 -1
- package/dist/refunds/fast-refund-client.js +11 -7
- package/dist/refunds/fast-refund-client.js.map +1 -1
- package/dist/refunds/index.js +7 -2
- package/dist/refunds/index.js.map +1 -1
- package/dist/refunds/strategy.js +4 -1
- package/dist/refunds/strategy.js.map +1 -1
- package/dist/types/auth.js +2 -1
- package/dist/types/auth.js.map +1 -1
- package/dist/types/card-types.js +7 -3
- package/dist/types/card-types.js.map +1 -1
- package/dist/types/common.js +8 -4
- package/dist/types/common.js.map +1 -1
- package/dist/types/index.js +14 -6
- package/dist/types/index.js.map +1 -1
- package/dist/types/isv-accounts.js +2 -1
- package/dist/types/isv-accounts.js.map +1 -1
- package/dist/types/isv-payments.js +2 -1
- package/dist/types/isv-payments.js.map +1 -1
- package/dist/types/status.js +2 -1
- package/dist/types/status.js.map +1 -1
- package/dist/types/webhook-events.js +5 -2
- package/dist/types/webhook-events.js.map +1 -1
- package/dist/webhooks/challenge-response.js +6 -3
- package/dist/webhooks/challenge-response.js.map +1 -1
- package/dist/webhooks/event-types.js +10 -4
- package/dist/webhooks/event-types.js.map +1 -1
- package/dist/webhooks/extract-client-ip.js +4 -1
- package/dist/webhooks/extract-client-ip.js.map +1 -1
- package/dist/webhooks/hmac-verify.js +14 -11
- package/dist/webhooks/hmac-verify.js.map +1 -1
- package/dist/webhooks/index.js +22 -6
- package/dist/webhooks/index.js.map +1 -1
- package/dist/webhooks/ip-allowlist.js +11 -7
- package/dist/webhooks/ip-allowlist.js.map +1 -1
- package/dist/webhooks/status-lattice.js +8 -3
- package/dist/webhooks/status-lattice.js.map +1 -1
- package/package.json +12 -12
- package/dist/isv/legacy-basic-client.d.ts +0 -122
- package/dist/isv/legacy-basic-client.d.ts.map +0 -1
- package/dist/isv/legacy-basic-client.js +0 -281
- package/dist/isv/legacy-basic-client.js.map +0 -1
- package/dist/isv/payments.d.ts +0 -199
- package/dist/isv/payments.d.ts.map +0 -1
- package/dist/isv/payments.js +0 -385
- package/dist/isv/payments.js.map +0 -1
package/dist/types/auth.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Authentication types for the Viva Wallet ISV OAuth 2.0 and reseller
|
|
3
4
|
* basic-auth flows.
|
|
@@ -8,5 +9,5 @@
|
|
|
8
9
|
* @see references/viva-docs/md/oauth2-authentication.txt:179
|
|
9
10
|
* @see references/viva-docs/md/isv-credentials.txt:107
|
|
10
11
|
*/
|
|
11
|
-
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
13
|
//# sourceMappingURL=auth.js.map
|
package/dist/types/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/types/auth.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG"}
|
package/dist/types/card-types.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CARD_TYPE_BY_ID = void 0;
|
|
4
|
+
exports.resolveCardType = resolveCardType;
|
|
1
5
|
/**
|
|
2
6
|
* Viva's numeric CardTypeId → string scheme name mapping.
|
|
3
7
|
*
|
|
@@ -35,7 +39,7 @@
|
|
|
35
39
|
* @see ../refunds/strategy.ts (FAST_REFUND_ELIGIBLE_SCHEMES)
|
|
36
40
|
* @see docs/STATE-MACHINE.md §3.1
|
|
37
41
|
*/
|
|
38
|
-
|
|
42
|
+
exports.CARD_TYPE_BY_ID = Object.freeze({
|
|
39
43
|
0: 'Visa',
|
|
40
44
|
1: 'MasterCard',
|
|
41
45
|
2: 'Diners',
|
|
@@ -54,9 +58,9 @@ export const CARD_TYPE_BY_ID = Object.freeze({
|
|
|
54
58
|
* Pure, no I/O. Safe to call from anywhere — including refund strategy
|
|
55
59
|
* decisions and tests.
|
|
56
60
|
*/
|
|
57
|
-
|
|
61
|
+
function resolveCardType(cardTypeId) {
|
|
58
62
|
if (cardTypeId == null)
|
|
59
63
|
return undefined;
|
|
60
|
-
return CARD_TYPE_BY_ID[cardTypeId];
|
|
64
|
+
return exports.CARD_TYPE_BY_ID[cardTypeId];
|
|
61
65
|
}
|
|
62
66
|
//# sourceMappingURL=card-types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card-types.js","sourceRoot":"","sources":["../../src/types/card-types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"card-types.js","sourceRoot":"","sources":["../../src/types/card-types.ts"],"names":[],"mappings":";;;AAyDA,0CAKC;AA9DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACU,QAAA,eAAe,GAAqC,MAAM,CAAC,MAAM,CAAC;IAC7E,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,YAAY;IACf,CAAC,EAAE,QAAQ;IACX,CAAC,EAAE,MAAM;IACT,gEAAgE;IAChE,gEAAgE;IAChE,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,UAAU;IACb,CAAC,EAAE,KAAK;CACT,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,SAAgB,eAAe,CAC7B,UAAqC;IAErC,IAAI,UAAU,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IACzC,OAAO,uBAAe,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC"}
|
package/dist/types/common.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Common primitives shared across the Viva Wallet ISV API surface.
|
|
3
4
|
*
|
|
@@ -8,11 +9,14 @@
|
|
|
8
9
|
* @see references/viva-docs/md/webhooks-for-payments.txt:383
|
|
9
10
|
* @see references/viva-docs/md/oauth2-authentication.txt:145
|
|
10
11
|
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.LEGACY_HOST = exports.ENVIRONMENT_URLS = exports.CURRENCY_CODES = void 0;
|
|
14
|
+
exports.asCurrencyCode = asCurrencyCode;
|
|
11
15
|
/**
|
|
12
16
|
* Narrow cast helper — call when you have a validated ISO 4217 numeric string.
|
|
13
17
|
* Runtime validation lives in the implementation layer (S2/S6).
|
|
14
18
|
*/
|
|
15
|
-
|
|
19
|
+
function asCurrencyCode(code) {
|
|
16
20
|
return code;
|
|
17
21
|
}
|
|
18
22
|
/**
|
|
@@ -22,7 +26,7 @@ export function asCurrencyCode(code) {
|
|
|
22
26
|
*
|
|
23
27
|
* @see references/viva-docs/md/wh-transaction-payment-created.txt:487
|
|
24
28
|
*/
|
|
25
|
-
|
|
29
|
+
exports.CURRENCY_CODES = {
|
|
26
30
|
EUR: asCurrencyCode('978'),
|
|
27
31
|
GBP: asCurrencyCode('826'),
|
|
28
32
|
USD: asCurrencyCode('840'),
|
|
@@ -40,7 +44,7 @@ export const CURRENCY_CODES = {
|
|
|
40
44
|
*
|
|
41
45
|
* @see references/viva-docs/md/oauth2-authentication.txt:145
|
|
42
46
|
*/
|
|
43
|
-
|
|
47
|
+
exports.ENVIRONMENT_URLS = {
|
|
44
48
|
demo: {
|
|
45
49
|
authBaseUrl: 'https://demo-accounts.vivapayments.com',
|
|
46
50
|
apiBaseUrl: 'https://demo-api.vivapayments.com',
|
|
@@ -63,7 +67,7 @@ export const ENVIRONMENT_URLS = {
|
|
|
63
67
|
*
|
|
64
68
|
* @see references/viva-docs/md/tut-create-recurring-payment.txt:288
|
|
65
69
|
*/
|
|
66
|
-
|
|
70
|
+
exports.LEGACY_HOST = {
|
|
67
71
|
demo: 'https://demo.vivapayments.com',
|
|
68
72
|
production: 'https://www.vivapayments.com',
|
|
69
73
|
};
|
package/dist/types/common.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/types/common.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAoBH,wCAEC;AAND;;;GAGG;AACH,SAAgB,cAAc,CAAC,IAAY;IACzC,OAAO,IAAoB,CAAC;AAC9B,CAAC;AAED;;;;;;GAMG;AACU,QAAA,cAAc,GAAG;IAC5B,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC;IAC1B,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC;IAC1B,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC;IAC1B,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC;IAC1B,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC;IAC1B,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC;IAC1B,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC;IAC1B,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC;IAC1B,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC;IAC1B,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC;IAC1B,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC;CACqB,CAAC;AAsFlD;;;;GAIG;AACU,QAAA,gBAAgB,GAAiD;IAC5E,IAAI,EAAE;QACJ,WAAW,EAAE,wCAAwC;QACrD,UAAU,EAAE,mCAAmC;KAChD;IACD,UAAU,EAAE;QACV,WAAW,EAAE,mCAAmC;QAChD,UAAU,EAAE,8BAA8B;KAC3C;CACO,CAAC;AAEX;;;;;;;;;;;;GAYG;AACU,QAAA,WAAW,GAAoC;IAC1D,IAAI,EAAE,+BAA+B;IACrC,UAAU,EAAE,8BAA8B;CAClC,CAAC"}
|
package/dist/types/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* viva-payments-core/types — barrel re-export.
|
|
3
4
|
*
|
|
@@ -9,13 +10,20 @@
|
|
|
9
10
|
* Attribution: types hand-rolled fresh. Structure partially referenced from
|
|
10
11
|
* @nkhind/vivawallet-sdk for API surface awareness — no code copied.
|
|
11
12
|
*/
|
|
12
|
-
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.DEFERRED_EVENT_TYPES = exports.EVENT_TYPES = exports.resolveCardType = exports.CARD_TYPE_BY_ID = exports.LEGACY_HOST = exports.ENVIRONMENT_URLS = exports.CURRENCY_CODES = exports.asCurrencyCode = void 0;
|
|
15
|
+
var common_js_1 = require("./common.js");
|
|
13
16
|
// common.ts — runtime values
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
Object.defineProperty(exports, "asCurrencyCode", { enumerable: true, get: function () { return common_js_1.asCurrencyCode; } });
|
|
18
|
+
Object.defineProperty(exports, "CURRENCY_CODES", { enumerable: true, get: function () { return common_js_1.CURRENCY_CODES; } });
|
|
19
|
+
Object.defineProperty(exports, "ENVIRONMENT_URLS", { enumerable: true, get: function () { return common_js_1.ENVIRONMENT_URLS; } });
|
|
20
|
+
Object.defineProperty(exports, "LEGACY_HOST", { enumerable: true, get: function () { return common_js_1.LEGACY_HOST; } });
|
|
21
|
+
var card_types_js_1 = require("./card-types.js");
|
|
16
22
|
// card-types.ts — runtime values
|
|
17
|
-
CARD_TYPE_BY_ID,
|
|
18
|
-
|
|
23
|
+
Object.defineProperty(exports, "CARD_TYPE_BY_ID", { enumerable: true, get: function () { return card_types_js_1.CARD_TYPE_BY_ID; } });
|
|
24
|
+
Object.defineProperty(exports, "resolveCardType", { enumerable: true, get: function () { return card_types_js_1.resolveCardType; } });
|
|
25
|
+
var webhook_events_js_1 = require("./webhook-events.js");
|
|
19
26
|
// webhook-events.ts — runtime values
|
|
20
|
-
EVENT_TYPES,
|
|
27
|
+
Object.defineProperty(exports, "EVENT_TYPES", { enumerable: true, get: function () { return webhook_events_js_1.EVENT_TYPES; } });
|
|
28
|
+
Object.defineProperty(exports, "DEFERRED_EVENT_TYPES", { enumerable: true, get: function () { return webhook_events_js_1.DEFERRED_EVENT_TYPES; } });
|
|
21
29
|
//# sourceMappingURL=index.js.map
|
package/dist/types/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAiBH,yCAMqB;AALnB,6BAA6B;AAC7B,2GAAA,cAAc,OAAA;AACd,2GAAA,cAAc,OAAA;AACd,6GAAA,gBAAgB,OAAA;AAChB,wGAAA,WAAW,OAAA;AAqBb,iDAIyB;AAHvB,iCAAiC;AACjC,gHAAA,eAAe,OAAA;AACf,gHAAA,eAAe,OAAA;AAuCjB,yDAI6B;AAH3B,qCAAqC;AACrC,gHAAA,WAAW,OAAA;AACX,yHAAA,oBAAoB,OAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* ISV Connected Account + Webhook Registration types.
|
|
3
4
|
*
|
|
@@ -18,5 +19,5 @@
|
|
|
18
19
|
* - Update/Delete webhook (not exposed; manage via banking UI)
|
|
19
20
|
* - Update connected account (not exposed for ISV; merchant edits via UI)
|
|
20
21
|
*/
|
|
21
|
-
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
23
|
//# sourceMappingURL=isv-accounts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isv-accounts.js","sourceRoot":"","sources":["../../src/types/isv-accounts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}
|
|
1
|
+
{"version":3,"file":"isv-accounts.js","sourceRoot":"","sources":["../../src/types/isv-accounts.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* ISV Payment API request and response types.
|
|
3
4
|
*
|
|
@@ -15,5 +16,5 @@
|
|
|
15
16
|
* @see references/viva-docs/md/wh-transaction-payment-created.txt:158
|
|
16
17
|
* @see references/viva-docs/md/webhooks-for-payments.txt:248
|
|
17
18
|
*/
|
|
18
|
-
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
20
|
//# sourceMappingURL=isv-payments.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isv-payments.js","sourceRoot":"","sources":["../../src/types/isv-payments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
|
1
|
+
{"version":3,"file":"isv-payments.js","sourceRoot":"","sources":["../../src/types/isv-payments.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
package/dist/types/status.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Viva transaction status letter mapping and plugin status enum.
|
|
3
4
|
*
|
|
@@ -15,5 +16,5 @@
|
|
|
15
16
|
* @see references/viva-docs/md/wh-transaction-payment-created.txt:398
|
|
16
17
|
* @see references/viva-docs/md/wh-sale-transactions.txt:210
|
|
17
18
|
*/
|
|
18
|
-
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
20
|
//# sourceMappingURL=status.js.map
|
package/dist/types/status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/types/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/types/status.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Webhook event types and payloads for the Viva Wallet ISV integration.
|
|
3
4
|
*
|
|
@@ -19,6 +20,8 @@
|
|
|
19
20
|
* @see references/viva-docs/md/wh-account-connected.txt:150
|
|
20
21
|
* @see references/viva-docs/md/wh-account-verif-status-changed.txt:152
|
|
21
22
|
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.DEFERRED_EVENT_TYPES = exports.EVENT_TYPES = void 0;
|
|
22
25
|
// ---------------------------------------------------------------------------
|
|
23
26
|
// EventTypeId const object (not a TypeScript enum)
|
|
24
27
|
// ---------------------------------------------------------------------------
|
|
@@ -30,7 +33,7 @@
|
|
|
30
33
|
*
|
|
31
34
|
* @see references/viva-docs/md/webhooks-for-payments.txt:141
|
|
32
35
|
*/
|
|
33
|
-
|
|
36
|
+
exports.EVENT_TYPES = {
|
|
34
37
|
/** A customer payment has been successful. */
|
|
35
38
|
TRANSACTION_PAYMENT_CREATED: 1796,
|
|
36
39
|
/** A customer refund has been successfully actioned. */
|
|
@@ -50,7 +53,7 @@ export const EVENT_TYPES = {
|
|
|
50
53
|
*
|
|
51
54
|
* @see references/viva-docs/md/webhooks-for-payments.txt:141
|
|
52
55
|
*/
|
|
53
|
-
|
|
56
|
+
exports.DEFERRED_EVENT_TYPES = {
|
|
54
57
|
/** Commission payment withdrawn by Viva. Post-v1. */
|
|
55
58
|
TRANSACTION_PRICE_CALCULATED: 1799,
|
|
56
59
|
/** ECR integration only. Post-v1. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-events.js","sourceRoot":"","sources":["../../src/types/webhook-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG
|
|
1
|
+
{"version":3,"file":"webhook-events.js","sourceRoot":"","sources":["../../src/types/webhook-events.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;AAIH,8EAA8E;AAC9E,mDAAmD;AACnD,8EAA8E;AAE9E;;;;;;;GAOG;AACU,QAAA,WAAW,GAAG;IACzB,8CAA8C;IAC9C,2BAA2B,EAAE,IAAI;IACjC,wDAAwD;IACxD,4BAA4B,EAAE,IAAI;IAClC,iCAAiC;IACjC,kBAAkB,EAAE,IAAI;IACxB,kEAAkE;IAClE,aAAa,EAAE,IAAI;IACnB,+DAA+D;IAC/D,iBAAiB,EAAE,IAAI;IACvB,0DAA0D;IAC1D,mCAAmC,EAAE,IAAI;CACjC,CAAC;AAOX;;;;;GAKG;AACU,QAAA,oBAAoB,GAAG;IAClC,qDAAqD;IACrD,4BAA4B,EAAE,IAAI;IAClC,qCAAqC;IACrC,mCAAmC,EAAE,IAAI;IACzC,qCAAqC;IACrC,kCAAkC,EAAE,IAAI;IACxC,8CAA8C;IAC9C,2BAA2B,EAAE,IAAI;IACjC,sCAAsC;IACtC,6BAA6B,EAAE,GAAG;IAClC,uCAAuC;IACvC,8BAA8B,EAAE,GAAG;IACnC;;;;;OAKG;IACH,iBAAiB,EAAE,IAAI;IACvB,2DAA2D;IAC3D,gBAAgB,EAAE,IAAI;CACd,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Viva Wallet webhook challenge-response handler.
|
|
3
4
|
*
|
|
@@ -6,7 +7,9 @@
|
|
|
6
7
|
*
|
|
7
8
|
* @see references/viva-docs/md/webhooks-for-payments.txt:311
|
|
8
9
|
*/
|
|
9
|
-
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.buildChallengeResponse = buildChallengeResponse;
|
|
12
|
+
const index_js_1 = require("../errors/index.js");
|
|
10
13
|
/**
|
|
11
14
|
* Returns the GET-request response body for Viva's URL verification challenge.
|
|
12
15
|
*
|
|
@@ -23,9 +26,9 @@ import { VivaWebhookError } from '../errors/index.js';
|
|
|
23
26
|
* return res.json(buildChallengeResponse(env.VIVA_WEBHOOK_KEY));
|
|
24
27
|
* }
|
|
25
28
|
*/
|
|
26
|
-
|
|
29
|
+
function buildChallengeResponse(webhookVerificationKey) {
|
|
27
30
|
if (!webhookVerificationKey || webhookVerificationKey.trim().length === 0) {
|
|
28
|
-
throw new VivaWebhookError({
|
|
31
|
+
throw new index_js_1.VivaWebhookError({
|
|
29
32
|
message: 'webhookVerificationKey must be a non-empty string. ' +
|
|
30
33
|
'Obtain it from GET /api/messages/config/token and set VIVA_WEBHOOK_KEY.',
|
|
31
34
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"challenge-response.js","sourceRoot":"","sources":["../../src/webhooks/challenge-response.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"challenge-response.js","sourceRoot":"","sources":["../../src/webhooks/challenge-response.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAoBH,wDAUC;AA5BD,iDAAsD;AAEtD;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,sBAAsB,CAAC,sBAA8B;IACnE,IAAI,CAAC,sBAAsB,IAAI,sBAAsB,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,2BAAgB,CAAC;YACzB,OAAO,EACL,qDAAqD;gBACrD,yEAAyE;SAC5E,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,sBAAsB,EAAE,CAAC;AACzC,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Runtime helpers for Viva webhook event type IDs.
|
|
3
4
|
*
|
|
@@ -6,7 +7,12 @@
|
|
|
6
7
|
*
|
|
7
8
|
* @see references/viva-docs/md/webhooks-for-payments.txt:141
|
|
8
9
|
*/
|
|
9
|
-
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.V1_EVENT_TYPE_IDS = exports.EVENT_TYPES = void 0;
|
|
12
|
+
exports.isTransactionEvent = isTransactionEvent;
|
|
13
|
+
exports.isOnboardingEvent = isOnboardingEvent;
|
|
14
|
+
var webhook_events_js_1 = require("../types/webhook-events.js");
|
|
15
|
+
Object.defineProperty(exports, "EVENT_TYPES", { enumerable: true, get: function () { return webhook_events_js_1.EVENT_TYPES; } });
|
|
10
16
|
/**
|
|
11
17
|
* Returns `true` for event types that carry a transaction payload and require
|
|
12
18
|
* MerchantId-based tenant resolution.
|
|
@@ -20,7 +26,7 @@ export { EVENT_TYPES } from '../types/webhook-events.js';
|
|
|
20
26
|
*
|
|
21
27
|
* @see references/viva-docs/md/webhooks-for-payments.txt:141
|
|
22
28
|
*/
|
|
23
|
-
|
|
29
|
+
function isTransactionEvent(id) {
|
|
24
30
|
return id === 1796 || id === 1797 || id === 1798 || id === 4865 || id === 7936;
|
|
25
31
|
}
|
|
26
32
|
/**
|
|
@@ -33,7 +39,7 @@ export function isTransactionEvent(id) {
|
|
|
33
39
|
*
|
|
34
40
|
* @see references/viva-docs/md/webhooks-for-payments.txt:224
|
|
35
41
|
*/
|
|
36
|
-
|
|
42
|
+
function isOnboardingEvent(id) {
|
|
37
43
|
return id === 8193 || id === 8194;
|
|
38
44
|
}
|
|
39
45
|
/**
|
|
@@ -44,7 +50,7 @@ export function isOnboardingEvent(id) {
|
|
|
44
50
|
*
|
|
45
51
|
* @see references/viva-docs/md/webhooks-for-payments.txt:141
|
|
46
52
|
*/
|
|
47
|
-
|
|
53
|
+
exports.V1_EVENT_TYPE_IDS = Object.freeze([
|
|
48
54
|
1796, 1797, 1798, 4865, 8193, 8194,
|
|
49
55
|
]);
|
|
50
56
|
//# sourceMappingURL=event-types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-types.js","sourceRoot":"","sources":["../../src/webhooks/event-types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"event-types.js","sourceRoot":"","sources":["../../src/webhooks/event-types.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAiBH,gDAEC;AAYD,8CAEC;AA/BD,gEAA+E;AAAtE,gHAAA,WAAW,OAAA;AAEpB;;;;;;;;;;;;GAYG;AACH,SAAgB,kBAAkB,CAAC,EAAU;IAC3C,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC;AACjF,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,iBAAiB,CAAC,EAAU;IAC1C,OAAO,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC;AACpC,CAAC;AAED;;;;;;;GAOG;AACU,QAAA,iBAAiB,GAAyD,MAAM,CAAC,MAAM,CAAC;IACnG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CAC1B,CAAC,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* extract-client-ip.ts — Source IP extraction with explicit proxy-depth trust.
|
|
3
4
|
*
|
|
@@ -18,6 +19,8 @@
|
|
|
18
19
|
*
|
|
19
20
|
* @see docs/TODO-CSO.md "Finding 2"
|
|
20
21
|
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.extractClientIp = extractClientIp;
|
|
21
24
|
/**
|
|
22
25
|
* Extract the trusted client IP from a request.
|
|
23
26
|
*
|
|
@@ -25,7 +28,7 @@
|
|
|
25
28
|
* whether to reject or fall back to a default). Strips IPv6 brackets if
|
|
26
29
|
* present (e.g. `[2001:db8::1]:443` → `2001:db8::1`).
|
|
27
30
|
*/
|
|
28
|
-
|
|
31
|
+
function extractClientIp(req, trustedProxyDepth) {
|
|
29
32
|
const depth = Number.isInteger(trustedProxyDepth) && trustedProxyDepth >= 0
|
|
30
33
|
? trustedProxyDepth
|
|
31
34
|
: 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-client-ip.js","sourceRoot":"","sources":["../../src/webhooks/extract-client-ip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"extract-client-ip.js","sourceRoot":"","sources":["../../src/webhooks/extract-client-ip.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;AAoBH,0CAuBC;AA9BD;;;;;;GAMG;AACH,SAAgB,eAAe,CAC7B,GAAoB,EACpB,iBAAyB;IAEzB,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,iBAAiB,IAAI,CAAC;QACzE,CAAC,CAAC,iBAAiB;QACnB,CAAC,CAAC,CAAC,CAAC;IAEN,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAE9B,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QACzB,uEAAuE;QACvE,wEAAwE;QACxE,0CAA0C;QAC1C,OAAO,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,UAAU,CACjB,GAAkC;IAElC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,0EAA0E;IAC1E,oEAAoE;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACxD,OAAO,MAAM;SACV,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,8CAA8C;IAC9C,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,uEAAuE;IACvE,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* HMAC-SHA256 signature verification for the Sale Transactions webhook (event 7936).
|
|
3
4
|
*
|
|
@@ -14,8 +15,10 @@
|
|
|
14
15
|
*
|
|
15
16
|
* @see references/viva-docs/md/wh-sale-transactions.txt:149
|
|
16
17
|
*/
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.verifyHmacSignature = verifyHmacSignature;
|
|
20
|
+
const node_crypto_1 = require("node:crypto");
|
|
21
|
+
const index_js_1 = require("../errors/index.js");
|
|
19
22
|
/**
|
|
20
23
|
* Verify the `Viva-Signature-256` header for the Sale Transactions webhook
|
|
21
24
|
* (event 7936 only).
|
|
@@ -36,10 +39,10 @@ import { VivaWebhookError } from '../errors/index.js';
|
|
|
36
39
|
*
|
|
37
40
|
* @see references/viva-docs/md/wh-sale-transactions.txt:149
|
|
38
41
|
*/
|
|
39
|
-
|
|
42
|
+
function verifyHmacSignature(rawBody, signature, secret) {
|
|
40
43
|
// --- 1. Guard: signature header must be present and non-empty ---
|
|
41
44
|
if (signature == null || signature.length === 0) {
|
|
42
|
-
throw new VivaWebhookError({
|
|
45
|
+
throw new index_js_1.VivaWebhookError({
|
|
43
46
|
message: 'Missing Viva-Signature-256 header. This header is required for event 7936 (Sale Transactions).',
|
|
44
47
|
});
|
|
45
48
|
}
|
|
@@ -49,7 +52,7 @@ export function verifyHmacSignature(rawBody, signature, secret) {
|
|
|
49
52
|
const expectedByteLength = 32; // SHA-256 output is 32 bytes
|
|
50
53
|
const hexRegex = /^[0-9a-f]+$/i;
|
|
51
54
|
if (!hexRegex.test(signature)) {
|
|
52
|
-
throw new VivaWebhookError({
|
|
55
|
+
throw new index_js_1.VivaWebhookError({
|
|
53
56
|
message: `Malformed Viva-Signature-256 header: not a valid hex string. Received: "${signature.slice(0, 20)}..."`,
|
|
54
57
|
});
|
|
55
58
|
}
|
|
@@ -58,12 +61,12 @@ export function verifyHmacSignature(rawBody, signature, secret) {
|
|
|
58
61
|
candidateBuffer = Buffer.from(signature, 'hex');
|
|
59
62
|
}
|
|
60
63
|
catch {
|
|
61
|
-
throw new VivaWebhookError({
|
|
64
|
+
throw new index_js_1.VivaWebhookError({
|
|
62
65
|
message: 'Malformed Viva-Signature-256 header: hex decode failed.',
|
|
63
66
|
});
|
|
64
67
|
}
|
|
65
68
|
// --- 3. Compute expected HMAC-SHA256 ---
|
|
66
|
-
const hmac = createHmac('sha256', secret);
|
|
69
|
+
const hmac = (0, node_crypto_1.createHmac)('sha256', secret);
|
|
67
70
|
hmac.update(rawBody);
|
|
68
71
|
const expectedBuffer = hmac.digest(); // returns a Buffer (32 bytes)
|
|
69
72
|
// --- 4. Constant-time comparison ---
|
|
@@ -76,15 +79,15 @@ export function verifyHmacSignature(rawBody, signature, secret) {
|
|
|
76
79
|
// This runs in constant time relative to expectedByteLength.
|
|
77
80
|
const zeros = Buffer.alloc(expectedByteLength, 0);
|
|
78
81
|
// We deliberately ignore the result here — length mismatch is always a fail.
|
|
79
|
-
void timingSafeEqual(zeros, expectedBuffer);
|
|
80
|
-
throw new VivaWebhookError({
|
|
82
|
+
void (0, node_crypto_1.timingSafeEqual)(zeros, expectedBuffer);
|
|
83
|
+
throw new index_js_1.VivaWebhookError({
|
|
81
84
|
message: `Viva-Signature-256 header length mismatch: expected ${expectedByteLength} bytes (${expectedByteLength * 2} hex chars), got ${candidateBuffer.length} bytes.`,
|
|
82
85
|
});
|
|
83
86
|
}
|
|
84
87
|
// Both buffers are 32 bytes — safe to call timingSafeEqual.
|
|
85
|
-
const valid = timingSafeEqual(expectedBuffer, candidateBuffer);
|
|
88
|
+
const valid = (0, node_crypto_1.timingSafeEqual)(expectedBuffer, candidateBuffer);
|
|
86
89
|
if (!valid) {
|
|
87
|
-
throw new VivaWebhookError({
|
|
90
|
+
throw new index_js_1.VivaWebhookError({
|
|
88
91
|
message: 'Viva-Signature-256 signature mismatch. Request body may have been tampered with.',
|
|
89
92
|
});
|
|
90
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hmac-verify.js","sourceRoot":"","sources":["../../src/webhooks/hmac-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"hmac-verify.js","sourceRoot":"","sources":["../../src/webhooks/hmac-verify.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;AAyBH,kDA8DC;AArFD,6CAA0D;AAC1D,iDAAsD;AAEtD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAgB,mBAAmB,CACjC,OAA4B,EAC5B,SAAoC,EACpC,MAAc;IAEd,mEAAmE;IACnE,IAAI,SAAS,IAAI,IAAI,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,2BAAgB,CAAC;YACzB,OAAO,EAAE,gGAAgG;SAC1G,CAAC,CAAC;IACL,CAAC;IAED,kDAAkD;IAClD,qEAAqE;IACrE,uEAAuE;IACvE,MAAM,kBAAkB,GAAG,EAAE,CAAC,CAAC,6BAA6B;IAC5D,MAAM,QAAQ,GAAG,cAAc,CAAC;IAEhC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,2BAAgB,CAAC;YACzB,OAAO,EAAE,2EAA2E,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM;SACjH,CAAC,CAAC;IACL,CAAC;IAED,IAAI,eAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,2BAAgB,CAAC;YACzB,OAAO,EAAE,yDAAyD;SACnE,CAAC,CAAC;IACL,CAAC;IAED,0CAA0C;IAC1C,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,8BAA8B;IAEpE,sCAAsC;IACtC,iEAAiE;IACjE,kEAAkE;IAClE,0EAA0E;IAC1E,8BAA8B;IAC9B,IAAI,eAAe,CAAC,MAAM,KAAK,kBAAkB,EAAE,CAAC;QAClD,kEAAkE;QAClE,6DAA6D;QAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;QAClD,6EAA6E;QAC7E,KAAK,IAAA,6BAAe,EAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAC5C,MAAM,IAAI,2BAAgB,CAAC;YACzB,OAAO,EAAE,uDAAuD,kBAAkB,WAAW,kBAAkB,GAAG,CAAC,oBAAoB,eAAe,CAAC,MAAM,SAAS;SACvK,CAAC,CAAC;IACL,CAAC;IAED,4DAA4D;IAC5D,MAAM,KAAK,GAAG,IAAA,6BAAe,EAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IAE/D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,2BAAgB,CAAC;YACzB,OAAO,EAAE,kFAAkF;SAC5F,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
package/dist/webhooks/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* viva-payments-core/webhooks — barrel export.
|
|
3
4
|
*
|
|
@@ -10,10 +11,25 @@
|
|
|
10
11
|
*
|
|
11
12
|
* @see references/viva-docs/md/webhooks-for-payments.txt:254
|
|
12
13
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.applyStatusTransition = exports.validateStatusTransition = exports.mapStatusLetter = exports.V1_EVENT_TYPE_IDS = exports.isOnboardingEvent = exports.isTransactionEvent = exports.EVENT_TYPES = exports.verifyHmacSignature = exports.extractClientIp = exports.isAllowedSourceIp = exports.VIVA_PROD_IPS = exports.VIVA_DEMO_IPS = exports.buildChallengeResponse = void 0;
|
|
16
|
+
var challenge_response_js_1 = require("./challenge-response.js");
|
|
17
|
+
Object.defineProperty(exports, "buildChallengeResponse", { enumerable: true, get: function () { return challenge_response_js_1.buildChallengeResponse; } });
|
|
18
|
+
var ip_allowlist_js_1 = require("./ip-allowlist.js");
|
|
19
|
+
Object.defineProperty(exports, "VIVA_DEMO_IPS", { enumerable: true, get: function () { return ip_allowlist_js_1.VIVA_DEMO_IPS; } });
|
|
20
|
+
Object.defineProperty(exports, "VIVA_PROD_IPS", { enumerable: true, get: function () { return ip_allowlist_js_1.VIVA_PROD_IPS; } });
|
|
21
|
+
Object.defineProperty(exports, "isAllowedSourceIp", { enumerable: true, get: function () { return ip_allowlist_js_1.isAllowedSourceIp; } });
|
|
22
|
+
var extract_client_ip_js_1 = require("./extract-client-ip.js");
|
|
23
|
+
Object.defineProperty(exports, "extractClientIp", { enumerable: true, get: function () { return extract_client_ip_js_1.extractClientIp; } });
|
|
24
|
+
var hmac_verify_js_1 = require("./hmac-verify.js");
|
|
25
|
+
Object.defineProperty(exports, "verifyHmacSignature", { enumerable: true, get: function () { return hmac_verify_js_1.verifyHmacSignature; } });
|
|
26
|
+
var event_types_js_1 = require("./event-types.js");
|
|
27
|
+
Object.defineProperty(exports, "EVENT_TYPES", { enumerable: true, get: function () { return event_types_js_1.EVENT_TYPES; } });
|
|
28
|
+
Object.defineProperty(exports, "isTransactionEvent", { enumerable: true, get: function () { return event_types_js_1.isTransactionEvent; } });
|
|
29
|
+
Object.defineProperty(exports, "isOnboardingEvent", { enumerable: true, get: function () { return event_types_js_1.isOnboardingEvent; } });
|
|
30
|
+
Object.defineProperty(exports, "V1_EVENT_TYPE_IDS", { enumerable: true, get: function () { return event_types_js_1.V1_EVENT_TYPE_IDS; } });
|
|
31
|
+
var status_lattice_js_1 = require("./status-lattice.js");
|
|
32
|
+
Object.defineProperty(exports, "mapStatusLetter", { enumerable: true, get: function () { return status_lattice_js_1.mapStatusLetter; } });
|
|
33
|
+
Object.defineProperty(exports, "validateStatusTransition", { enumerable: true, get: function () { return status_lattice_js_1.validateStatusTransition; } });
|
|
34
|
+
Object.defineProperty(exports, "applyStatusTransition", { enumerable: true, get: function () { return status_lattice_js_1.applyStatusTransition; } });
|
|
19
35
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/webhooks/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/webhooks/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAEH,iEAAiE;AAAxD,+HAAA,sBAAsB,OAAA;AAE/B,qDAI2B;AAHzB,gHAAA,aAAa,OAAA;AACb,gHAAA,aAAa,OAAA;AACb,oHAAA,iBAAiB,OAAA;AAGnB,+DAGgC;AAF9B,uHAAA,eAAe,OAAA;AAIjB,mDAAuD;AAA9C,qHAAA,mBAAmB,OAAA;AAE5B,mDAM0B;AALxB,6GAAA,WAAW,OAAA;AAEX,oHAAA,kBAAkB,OAAA;AAClB,mHAAA,iBAAiB,OAAA;AACjB,mHAAA,iBAAiB,OAAA;AAGnB,yDAK6B;AAJ3B,oHAAA,eAAe,OAAA;AACf,6HAAA,wBAAwB,OAAA;AACxB,0HAAA,qBAAqB,OAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Viva Wallet webhook source IP allowlist.
|
|
3
4
|
*
|
|
@@ -26,7 +27,10 @@
|
|
|
26
27
|
*
|
|
27
28
|
* @see references/viva-docs/md/webhooks-for-payments.txt:270
|
|
28
29
|
*/
|
|
29
|
-
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.VIVA_PROD_IPS = exports.VIVA_DEMO_IPS = void 0;
|
|
32
|
+
exports.isAllowedSourceIp = isAllowedSourceIp;
|
|
33
|
+
const node_net_1 = require("node:net");
|
|
30
34
|
// ---------------------------------------------------------------------------
|
|
31
35
|
// Published IP lists
|
|
32
36
|
// ---------------------------------------------------------------------------
|
|
@@ -36,7 +40,7 @@ import { BlockList } from 'node:net';
|
|
|
36
40
|
*
|
|
37
41
|
* @see references/viva-docs/md/webhooks-for-payments.txt:289
|
|
38
42
|
*/
|
|
39
|
-
|
|
43
|
+
exports.VIVA_DEMO_IPS = [
|
|
40
44
|
'20.50.240.57',
|
|
41
45
|
'40.74.20.78',
|
|
42
46
|
'195.167.87.181',
|
|
@@ -49,7 +53,7 @@ export const VIVA_DEMO_IPS = [
|
|
|
49
53
|
*
|
|
50
54
|
* @see references/viva-docs/md/webhooks-for-payments.txt:276
|
|
51
55
|
*/
|
|
52
|
-
|
|
56
|
+
exports.VIVA_PROD_IPS = [
|
|
53
57
|
'51.138.37.238',
|
|
54
58
|
'13.80.70.181',
|
|
55
59
|
'13.80.71.223',
|
|
@@ -84,15 +88,15 @@ function addToBlockList(bl, entry) {
|
|
|
84
88
|
}
|
|
85
89
|
/** Build a BlockList from an array of IP/CIDR strings. */
|
|
86
90
|
function buildBlockList(ips) {
|
|
87
|
-
const bl = new BlockList();
|
|
91
|
+
const bl = new node_net_1.BlockList();
|
|
88
92
|
for (const entry of ips) {
|
|
89
93
|
addToBlockList(bl, entry);
|
|
90
94
|
}
|
|
91
95
|
return bl;
|
|
92
96
|
}
|
|
93
97
|
// Cached BlockLists built once per process.
|
|
94
|
-
const _demoList = buildBlockList(VIVA_DEMO_IPS);
|
|
95
|
-
const _prodList = buildBlockList(VIVA_PROD_IPS);
|
|
98
|
+
const _demoList = buildBlockList(exports.VIVA_DEMO_IPS);
|
|
99
|
+
const _prodList = buildBlockList(exports.VIVA_PROD_IPS);
|
|
96
100
|
// ---------------------------------------------------------------------------
|
|
97
101
|
// Normaliser
|
|
98
102
|
// ---------------------------------------------------------------------------
|
|
@@ -127,7 +131,7 @@ function normaliseIp(ip) {
|
|
|
127
131
|
*
|
|
128
132
|
* @see references/viva-docs/md/webhooks-for-payments.txt:270
|
|
129
133
|
*/
|
|
130
|
-
|
|
134
|
+
function isAllowedSourceIp(ip, env, extraAllowlist) {
|
|
131
135
|
const normalised = normaliseIp(ip);
|
|
132
136
|
const type = normalised.includes(':') ? 'ipv6' : 'ipv4';
|
|
133
137
|
// Check the env-specific block list.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ip-allowlist.js","sourceRoot":"","sources":["../../src/webhooks/ip-allowlist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;
|
|
1
|
+
{"version":3,"file":"ip-allowlist.js","sourceRoot":"","sources":["../../src/webhooks/ip-allowlist.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* Viva transaction status mapping and monotonic status lattice.
|
|
3
4
|
*
|
|
@@ -16,6 +17,10 @@
|
|
|
16
17
|
* @see references/viva-docs/md/wh-sale-transactions.txt:210
|
|
17
18
|
* @see references/viva-docs/md/wh-transaction-payment-created.txt:398
|
|
18
19
|
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.mapStatusLetter = mapStatusLetter;
|
|
22
|
+
exports.validateStatusTransition = validateStatusTransition;
|
|
23
|
+
exports.applyStatusTransition = applyStatusTransition;
|
|
19
24
|
/**
|
|
20
25
|
* Pure mapping from Viva's `StatusId` letter to the plugin's canonical status.
|
|
21
26
|
*
|
|
@@ -25,7 +30,7 @@
|
|
|
25
30
|
* @see references/viva-docs/md/wh-sale-transactions.txt:210
|
|
26
31
|
* @see references/viva-docs/md/wh-transaction-payment-created.txt:398
|
|
27
32
|
*/
|
|
28
|
-
|
|
33
|
+
function mapStatusLetter(letter) {
|
|
29
34
|
switch (letter) {
|
|
30
35
|
case 'F':
|
|
31
36
|
return { status: 'captured', claimSubstate: null };
|
|
@@ -171,7 +176,7 @@ const _ANCESTORS = new Map(_ALL_STATUSES.map((s) => [s, computeAncestors(s)]));
|
|
|
171
176
|
* @see Plan P17 (status lattice), Plan A9 (authorized → cancelled)
|
|
172
177
|
* @see references/viva-docs/md/wh-transaction-payment-created.txt:398
|
|
173
178
|
*/
|
|
174
|
-
|
|
179
|
+
function validateStatusTransition(current, next) {
|
|
175
180
|
// Idempotent re-apply: same → same is always OK.
|
|
176
181
|
if (current === next) {
|
|
177
182
|
return { ok: true, next };
|
|
@@ -200,7 +205,7 @@ export function validateStatusTransition(current, next) {
|
|
|
200
205
|
*
|
|
201
206
|
* Not part of the core interface spec, provided for S8 convenience.
|
|
202
207
|
*/
|
|
203
|
-
|
|
208
|
+
function applyStatusTransition(current, incomingLetter) {
|
|
204
209
|
const { status: next, claimSubstate } = mapStatusLetter(incomingLetter);
|
|
205
210
|
const result = validateStatusTransition(current, next);
|
|
206
211
|
return { ...result, claimSubstate };
|