@plural_pinelabs/mpp-seller-sdk 0.1.0
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/README.md +1 -0
- package/dist/config/environments.d.ts +8 -0
- package/dist/config/environments.d.ts.map +1 -0
- package/dist/config/environments.js +11 -0
- package/dist/config/environments.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +8 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/generic.d.ts +29 -0
- package/dist/middleware/generic.d.ts.map +1 -0
- package/dist/middleware/generic.js +161 -0
- package/dist/middleware/generic.js.map +1 -0
- package/dist/middleware/index.d.ts +3 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +6 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/server/auth-manager.d.ts +19 -0
- package/dist/server/auth-manager.d.ts.map +1 -0
- package/dist/server/auth-manager.js +110 -0
- package/dist/server/auth-manager.js.map +1 -0
- package/dist/server/capture-client.d.ts +13 -0
- package/dist/server/capture-client.d.ts.map +1 -0
- package/dist/server/capture-client.js +134 -0
- package/dist/server/capture-client.js.map +1 -0
- package/dist/server/challenge-generator.d.ts +10 -0
- package/dist/server/challenge-generator.d.ts.map +1 -0
- package/dist/server/challenge-generator.js +60 -0
- package/dist/server/challenge-generator.js.map +1 -0
- package/dist/server/credential-verifier.d.ts +10 -0
- package/dist/server/credential-verifier.d.ts.map +1 -0
- package/dist/server/credential-verifier.js +142 -0
- package/dist/server/credential-verifier.js.map +1 -0
- package/dist/server/grant-token-verifier.d.ts +15 -0
- package/dist/server/grant-token-verifier.d.ts.map +1 -0
- package/dist/server/grant-token-verifier.js +155 -0
- package/dist/server/grant-token-verifier.js.map +1 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +22 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/plural-mpp.d.ts +26 -0
- package/dist/server/plural-mpp.d.ts.map +1 -0
- package/dist/server/plural-mpp.js +50 -0
- package/dist/server/plural-mpp.js.map +1 -0
- package/dist/server/receipt-builder.d.ts +5 -0
- package/dist/server/receipt-builder.d.ts.map +1 -0
- package/dist/server/receipt-builder.js +45 -0
- package/dist/server/receipt-builder.js.map +1 -0
- package/dist/types/auth.d.ts +12 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +3 -0
- package/dist/types/auth.js.map +1 -0
- package/dist/types/capture.d.ts +51 -0
- package/dist/types/capture.d.ts.map +1 -0
- package/dist/types/capture.js +3 -0
- package/dist/types/capture.js.map +1 -0
- package/dist/types/challenge.d.ts +27 -0
- package/dist/types/challenge.d.ts.map +1 -0
- package/dist/types/challenge.js +3 -0
- package/dist/types/challenge.js.map +1 -0
- package/dist/types/config.d.ts +34 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/credential.d.ts +25 -0
- package/dist/types/credential.d.ts.map +1 -0
- package/dist/types/credential.js +3 -0
- package/dist/types/credential.js.map +1 -0
- package/dist/types/errors.d.ts +30 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +25 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/grantex.d.ts +27 -0
- package/dist/types/grantex.d.ts.map +1 -0
- package/dist/types/grantex.js +3 -0
- package/dist/types/grantex.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/base64url.d.ts +6 -0
- package/dist/utils/base64url.d.ts.map +1 -0
- package/dist/utils/base64url.js +25 -0
- package/dist/utils/base64url.js.map +1 -0
- package/dist/utils/errors.d.ts +16 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +46 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/fetch-helpers.d.ts +19 -0
- package/dist/utils/fetch-helpers.d.ts.map +1 -0
- package/dist/utils/fetch-helpers.js +108 -0
- package/dist/utils/fetch-helpers.js.map +1 -0
- package/dist/utils/hmac-sig.d.ts +3 -0
- package/dist/utils/hmac-sig.d.ts.map +1 -0
- package/dist/utils/hmac-sig.js +13 -0
- package/dist/utils/hmac-sig.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/validation.d.ts +3 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +27 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +29 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# pinelabs-online-seller-SDK-TypeScript
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Plural MPP environment base URLs. */
|
|
2
|
+
export declare const MppEnvironment: {
|
|
3
|
+
readonly SANDBOX: "https://pluraluat.v2.pinepg.in";
|
|
4
|
+
readonly PRODUCTION: "https://api.pluralpay.in";
|
|
5
|
+
};
|
|
6
|
+
export declare const DEFAULT_BASE_URL: string;
|
|
7
|
+
export declare const DEFAULT_REALM: string;
|
|
8
|
+
//# sourceMappingURL=environments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environments.d.ts","sourceRoot":"","sources":["../../src/config/environments.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,eAAO,MAAM,cAAc;;;CAGjB,CAAC;AAEX,eAAO,MAAM,gBAAgB,EAAE,MAAkC,CAAC;AAClE,eAAO,MAAM,aAAa,EAAE,MAAkC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_REALM = exports.DEFAULT_BASE_URL = exports.MppEnvironment = void 0;
|
|
4
|
+
/** Plural MPP environment base URLs. */
|
|
5
|
+
exports.MppEnvironment = {
|
|
6
|
+
SANDBOX: "https://pluraluat.v2.pinepg.in",
|
|
7
|
+
PRODUCTION: "https://api.pluralpay.in",
|
|
8
|
+
};
|
|
9
|
+
exports.DEFAULT_BASE_URL = exports.MppEnvironment.PRODUCTION;
|
|
10
|
+
exports.DEFAULT_REALM = exports.MppEnvironment.PRODUCTION;
|
|
11
|
+
//# sourceMappingURL=environments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environments.js","sourceRoot":"","sources":["../../src/config/environments.ts"],"names":[],"mappings":";;;AAAA,wCAAwC;AAC3B,QAAA,cAAc,GAAG;IAC5B,OAAO,EAAE,gCAAgC;IACzC,UAAU,EAAE,0BAA0B;CAC9B,CAAC;AAEE,QAAA,gBAAgB,GAAW,sBAAc,CAAC,UAAU,CAAC;AACrD,QAAA,aAAa,GAAW,sBAAc,CAAC,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_REALM = exports.DEFAULT_BASE_URL = exports.MppEnvironment = void 0;
|
|
4
|
+
var environments_js_1 = require("./environments.js");
|
|
5
|
+
Object.defineProperty(exports, "MppEnvironment", { enumerable: true, get: function () { return environments_js_1.MppEnvironment; } });
|
|
6
|
+
Object.defineProperty(exports, "DEFAULT_BASE_URL", { enumerable: true, get: function () { return environments_js_1.DEFAULT_BASE_URL; } });
|
|
7
|
+
Object.defineProperty(exports, "DEFAULT_REALM", { enumerable: true, get: function () { return environments_js_1.DEFAULT_REALM; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;;AAAA,qDAAoF;AAA3E,iHAAA,cAAc,OAAA;AAAE,mHAAA,gBAAgB,OAAA;AAAE,gHAAA,aAAa,OAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plural MPP Seller SDK — TypeScript port of `plural-mpp-seller-sdk`.
|
|
3
|
+
*
|
|
4
|
+
* Issues HTTP 402 challenges, verifies UPI SBMD credentials, captures
|
|
5
|
+
* payments, and returns receipts — works standalone or with any framework.
|
|
6
|
+
*/
|
|
7
|
+
export { PluralMPP, PluralMPPInstance, } from "./server/plural-mpp.js";
|
|
8
|
+
export { ChallengeGenerator } from "./server/challenge-generator.js";
|
|
9
|
+
export { CredentialVerifier } from "./server/credential-verifier.js";
|
|
10
|
+
export { CaptureClient } from "./server/capture-client.js";
|
|
11
|
+
export { AuthManager } from "./server/auth-manager.js";
|
|
12
|
+
export { GrantTokenVerifier, GRANTEX_TOKEN_HEADER, } from "./server/grant-token-verifier.js";
|
|
13
|
+
export { buildReceiptData, buildReceiptHeader, buildFailureReceiptData, } from "./server/receipt-builder.js";
|
|
14
|
+
export { decidePayment } from "./middleware/generic.js";
|
|
15
|
+
export type { PaymentDecision, DecidePaymentOptions } from "./middleware/generic.js";
|
|
16
|
+
export type { Amount, ChargeOptions, MppLogger, PluralSellerConfig, } from "./types/config.js";
|
|
17
|
+
export type { Challenge, ChallengeRequest, ChallengeResult, ProblemDetails, } from "./types/challenge.js";
|
|
18
|
+
export type { Credential, CredentialChallenge, CredentialPayload, VerificationResult, } from "./types/credential.js";
|
|
19
|
+
export type { CaptureOptions, CaptureResult, ReceiptData, Settlement, } from "./types/capture.js";
|
|
20
|
+
export type { GrantTokenClaims, GrantVerificationResult, SellerGrantexConfig, } from "./types/grantex.js";
|
|
21
|
+
export type { AuthResponse, AuthState } from "./types/auth.js";
|
|
22
|
+
export { MppErrorCode } from "./types/errors.js";
|
|
23
|
+
export type { MppErrorDetails, MppErrorResponse } from "./types/errors.js";
|
|
24
|
+
export { MppError, MppCaptureError, MppVerificationError } from "./utils/errors.js";
|
|
25
|
+
export { MppEnvironment, DEFAULT_BASE_URL, DEFAULT_REALM } from "./config/environments.js";
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,SAAS,EACT,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAGrF,YAAY,EACV,MAAM,EACN,aAAa,EACb,SAAS,EACT,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,UAAU,EACV,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,cAAc,EACd,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG3E,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGpF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Plural MPP Seller SDK — TypeScript port of `plural-mpp-seller-sdk`.
|
|
4
|
+
*
|
|
5
|
+
* Issues HTTP 402 challenges, verifies UPI SBMD credentials, captures
|
|
6
|
+
* payments, and returns receipts — works standalone or with any framework.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.DEFAULT_REALM = exports.DEFAULT_BASE_URL = exports.MppEnvironment = exports.MppVerificationError = exports.MppCaptureError = exports.MppError = exports.MppErrorCode = exports.decidePayment = exports.buildFailureReceiptData = exports.buildReceiptHeader = exports.buildReceiptData = exports.GRANTEX_TOKEN_HEADER = exports.GrantTokenVerifier = exports.AuthManager = exports.CaptureClient = exports.CredentialVerifier = exports.ChallengeGenerator = exports.PluralMPPInstance = exports.PluralMPP = void 0;
|
|
10
|
+
// Server
|
|
11
|
+
var plural_mpp_js_1 = require("./server/plural-mpp.js");
|
|
12
|
+
Object.defineProperty(exports, "PluralMPP", { enumerable: true, get: function () { return plural_mpp_js_1.PluralMPP; } });
|
|
13
|
+
Object.defineProperty(exports, "PluralMPPInstance", { enumerable: true, get: function () { return plural_mpp_js_1.PluralMPPInstance; } });
|
|
14
|
+
var challenge_generator_js_1 = require("./server/challenge-generator.js");
|
|
15
|
+
Object.defineProperty(exports, "ChallengeGenerator", { enumerable: true, get: function () { return challenge_generator_js_1.ChallengeGenerator; } });
|
|
16
|
+
var credential_verifier_js_1 = require("./server/credential-verifier.js");
|
|
17
|
+
Object.defineProperty(exports, "CredentialVerifier", { enumerable: true, get: function () { return credential_verifier_js_1.CredentialVerifier; } });
|
|
18
|
+
var capture_client_js_1 = require("./server/capture-client.js");
|
|
19
|
+
Object.defineProperty(exports, "CaptureClient", { enumerable: true, get: function () { return capture_client_js_1.CaptureClient; } });
|
|
20
|
+
var auth_manager_js_1 = require("./server/auth-manager.js");
|
|
21
|
+
Object.defineProperty(exports, "AuthManager", { enumerable: true, get: function () { return auth_manager_js_1.AuthManager; } });
|
|
22
|
+
var grant_token_verifier_js_1 = require("./server/grant-token-verifier.js");
|
|
23
|
+
Object.defineProperty(exports, "GrantTokenVerifier", { enumerable: true, get: function () { return grant_token_verifier_js_1.GrantTokenVerifier; } });
|
|
24
|
+
Object.defineProperty(exports, "GRANTEX_TOKEN_HEADER", { enumerable: true, get: function () { return grant_token_verifier_js_1.GRANTEX_TOKEN_HEADER; } });
|
|
25
|
+
var receipt_builder_js_1 = require("./server/receipt-builder.js");
|
|
26
|
+
Object.defineProperty(exports, "buildReceiptData", { enumerable: true, get: function () { return receipt_builder_js_1.buildReceiptData; } });
|
|
27
|
+
Object.defineProperty(exports, "buildReceiptHeader", { enumerable: true, get: function () { return receipt_builder_js_1.buildReceiptHeader; } });
|
|
28
|
+
Object.defineProperty(exports, "buildFailureReceiptData", { enumerable: true, get: function () { return receipt_builder_js_1.buildFailureReceiptData; } });
|
|
29
|
+
// Middleware
|
|
30
|
+
var generic_js_1 = require("./middleware/generic.js");
|
|
31
|
+
Object.defineProperty(exports, "decidePayment", { enumerable: true, get: function () { return generic_js_1.decidePayment; } });
|
|
32
|
+
var errors_js_1 = require("./types/errors.js");
|
|
33
|
+
Object.defineProperty(exports, "MppErrorCode", { enumerable: true, get: function () { return errors_js_1.MppErrorCode; } });
|
|
34
|
+
// Utils / Errors
|
|
35
|
+
var errors_js_2 = require("./utils/errors.js");
|
|
36
|
+
Object.defineProperty(exports, "MppError", { enumerable: true, get: function () { return errors_js_2.MppError; } });
|
|
37
|
+
Object.defineProperty(exports, "MppCaptureError", { enumerable: true, get: function () { return errors_js_2.MppCaptureError; } });
|
|
38
|
+
Object.defineProperty(exports, "MppVerificationError", { enumerable: true, get: function () { return errors_js_2.MppVerificationError; } });
|
|
39
|
+
// Config
|
|
40
|
+
var environments_js_1 = require("./config/environments.js");
|
|
41
|
+
Object.defineProperty(exports, "MppEnvironment", { enumerable: true, get: function () { return environments_js_1.MppEnvironment; } });
|
|
42
|
+
Object.defineProperty(exports, "DEFAULT_BASE_URL", { enumerable: true, get: function () { return environments_js_1.DEFAULT_BASE_URL; } });
|
|
43
|
+
Object.defineProperty(exports, "DEFAULT_REALM", { enumerable: true, get: function () { return environments_js_1.DEFAULT_REALM; } });
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,SAAS;AACT,wDAGgC;AAF9B,0GAAA,SAAS,OAAA;AACT,kHAAA,iBAAiB,OAAA;AAEnB,0EAAqE;AAA5D,4HAAA,kBAAkB,OAAA;AAC3B,0EAAqE;AAA5D,4HAAA,kBAAkB,OAAA;AAC3B,gEAA2D;AAAlD,kHAAA,aAAa,OAAA;AACtB,4DAAuD;AAA9C,8GAAA,WAAW,OAAA;AACpB,4EAG0C;AAFxC,6HAAA,kBAAkB,OAAA;AAClB,+HAAA,oBAAoB,OAAA;AAEtB,kEAIqC;AAHnC,sHAAA,gBAAgB,OAAA;AAChB,wHAAA,kBAAkB,OAAA;AAClB,6HAAA,uBAAuB,OAAA;AAGzB,aAAa;AACb,sDAAwD;AAA/C,2GAAA,aAAa,OAAA;AAkCtB,+CAAiD;AAAxC,yGAAA,YAAY,OAAA;AAGrB,iBAAiB;AACjB,+CAAoF;AAA3E,qGAAA,QAAQ,OAAA;AAAE,4GAAA,eAAe,OAAA;AAAE,iHAAA,oBAAoB,OAAA;AAExD,SAAS;AACT,4DAA2F;AAAlF,iHAAA,cAAc,OAAA;AAAE,mHAAA,gBAAgB,OAAA;AAAE,gHAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-agnostic payment decision helper.
|
|
3
|
+
*
|
|
4
|
+
* Given an incoming request's `Authorization` (and optional `X-Grantex-Token`)
|
|
5
|
+
* header, returns a PaymentDecision describing what to do next — serve a
|
|
6
|
+
* challenge, reject the credential, or proceed with the handler (after capture).
|
|
7
|
+
*/
|
|
8
|
+
import type { CaptureResult } from "../types/capture.js";
|
|
9
|
+
import type { ChallengeResult } from "../types/challenge.js";
|
|
10
|
+
import type { ChargeOptions, PluralSellerConfig } from "../types/config.js";
|
|
11
|
+
import type { Credential } from "../types/credential.js";
|
|
12
|
+
export interface PaymentDecision {
|
|
13
|
+
action: string;
|
|
14
|
+
status: number;
|
|
15
|
+
headers: Record<string, string>;
|
|
16
|
+
problemDetails?: Record<string, unknown> | null;
|
|
17
|
+
captureResult?: CaptureResult | null;
|
|
18
|
+
credential?: Credential | null;
|
|
19
|
+
receiptHeader?: string | null;
|
|
20
|
+
challengeResult?: ChallengeResult | null;
|
|
21
|
+
}
|
|
22
|
+
export interface DecidePaymentOptions {
|
|
23
|
+
authorizationHeader?: string | null;
|
|
24
|
+
grantexTokenHeader?: string | null;
|
|
25
|
+
config: PluralSellerConfig;
|
|
26
|
+
chargeOptions: ChargeOptions;
|
|
27
|
+
}
|
|
28
|
+
export declare function decidePayment(opts: DecidePaymentOptions): Promise<PaymentDecision>;
|
|
29
|
+
//# sourceMappingURL=generic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic.d.ts","sourceRoot":"","sources":["../../src/middleware/generic.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAQzD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CA6JxF"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decidePayment = decidePayment;
|
|
4
|
+
const errors_js_1 = require("../utils/errors.js");
|
|
5
|
+
const capture_client_js_1 = require("../server/capture-client.js");
|
|
6
|
+
const challenge_generator_js_1 = require("../server/challenge-generator.js");
|
|
7
|
+
const credential_verifier_js_1 = require("../server/credential-verifier.js");
|
|
8
|
+
const grant_token_verifier_js_1 = require("../server/grant-token-verifier.js");
|
|
9
|
+
const receipt_builder_js_1 = require("../server/receipt-builder.js");
|
|
10
|
+
async function decidePayment(opts) {
|
|
11
|
+
const { config, chargeOptions } = opts;
|
|
12
|
+
const challengeGenerator = new challenge_generator_js_1.ChallengeGenerator(config);
|
|
13
|
+
const credentialVerifier = new credential_verifier_js_1.CredentialVerifier(config);
|
|
14
|
+
if (!opts.authorizationHeader || !opts.authorizationHeader.startsWith("Payment ")) {
|
|
15
|
+
const result = challengeGenerator.generate(chargeOptions);
|
|
16
|
+
return {
|
|
17
|
+
action: "challenge",
|
|
18
|
+
status: 402,
|
|
19
|
+
headers: {
|
|
20
|
+
"WWW-Authenticate": `Payment ${result.encoded}`,
|
|
21
|
+
"Content-Type": "application/problem+json",
|
|
22
|
+
"Cache-Control": "no-store",
|
|
23
|
+
},
|
|
24
|
+
problemDetails: {
|
|
25
|
+
type: result.problemDetails.type,
|
|
26
|
+
title: result.problemDetails.title,
|
|
27
|
+
status: result.problemDetails.status,
|
|
28
|
+
detail: result.problemDetails.detail,
|
|
29
|
+
challengeId: result.problemDetails.challengeId,
|
|
30
|
+
},
|
|
31
|
+
challengeResult: result,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
const verification = credentialVerifier.verify(opts.authorizationHeader);
|
|
35
|
+
if (!verification.valid) {
|
|
36
|
+
const result = challengeGenerator.generate(chargeOptions);
|
|
37
|
+
return {
|
|
38
|
+
action: "invalid",
|
|
39
|
+
status: 402,
|
|
40
|
+
headers: {
|
|
41
|
+
"WWW-Authenticate": `Payment ${result.encoded}`,
|
|
42
|
+
"Content-Type": "application/problem+json",
|
|
43
|
+
"Cache-Control": "no-store",
|
|
44
|
+
},
|
|
45
|
+
problemDetails: {
|
|
46
|
+
type: result.problemDetails.type.replace("payment-required", "payment-invalid"),
|
|
47
|
+
title: "Invalid Payment Credential",
|
|
48
|
+
status: 402,
|
|
49
|
+
detail: verification.error ?? "The payment credential could not be verified.",
|
|
50
|
+
challengeId: result.challenge.id,
|
|
51
|
+
},
|
|
52
|
+
challengeResult: result,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// Optional Grantex token verification
|
|
56
|
+
if (config.grantex) {
|
|
57
|
+
const enforce = !!config.grantex.enforceGrant;
|
|
58
|
+
if (!opts.grantexTokenHeader && enforce) {
|
|
59
|
+
return {
|
|
60
|
+
action: "grant_required",
|
|
61
|
+
status: 403,
|
|
62
|
+
headers: { "Content-Type": "application/problem+json" },
|
|
63
|
+
problemDetails: {
|
|
64
|
+
type: "urn:ietf:rfc:9725:error:grant-required",
|
|
65
|
+
title: "Grant Token Required",
|
|
66
|
+
status: 403,
|
|
67
|
+
detail: `A valid Grantex grant token is required in the ${grant_token_verifier_js_1.GRANTEX_TOKEN_HEADER} header.`,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (opts.grantexTokenHeader) {
|
|
72
|
+
const grantResult = await new grant_token_verifier_js_1.GrantTokenVerifier(config.grantex).verify(opts.grantexTokenHeader);
|
|
73
|
+
if (!grantResult.valid) {
|
|
74
|
+
if (enforce) {
|
|
75
|
+
return {
|
|
76
|
+
action: "grant_invalid",
|
|
77
|
+
status: 403,
|
|
78
|
+
headers: { "Content-Type": "application/problem+json" },
|
|
79
|
+
problemDetails: {
|
|
80
|
+
type: "urn:ietf:rfc:9725:error:grant-invalid",
|
|
81
|
+
title: "Invalid Grant Token",
|
|
82
|
+
status: 403,
|
|
83
|
+
detail: grantResult.error ?? "The grant token could not be verified.",
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
if (config.logger) {
|
|
88
|
+
try {
|
|
89
|
+
config.logger.info("Grantex token verification failed (non-enforcing)", {
|
|
90
|
+
error: grantResult.error,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// non-fatal
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const credential = verification.credential;
|
|
101
|
+
const captureClient = new capture_client_js_1.CaptureClient(config);
|
|
102
|
+
try {
|
|
103
|
+
const captureResult = await captureClient.capture({
|
|
104
|
+
token: credential.payload.token,
|
|
105
|
+
amount: chargeOptions.amount,
|
|
106
|
+
description: chargeOptions.description,
|
|
107
|
+
merchantOrderReference: chargeOptions.merchantOrderReference,
|
|
108
|
+
metadata: chargeOptions.metadata,
|
|
109
|
+
});
|
|
110
|
+
const receiptHeader = (0, receipt_builder_js_1.buildReceiptHeader)(captureResult, credential.challenge.id);
|
|
111
|
+
return {
|
|
112
|
+
action: "proceed",
|
|
113
|
+
status: 200,
|
|
114
|
+
headers: { "Payment-Receipt": receiptHeader },
|
|
115
|
+
captureResult,
|
|
116
|
+
credential,
|
|
117
|
+
receiptHeader,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
if (err instanceof errors_js_1.MppCaptureError && err.captureError) {
|
|
122
|
+
if (err.captureError.httpStatus >= 500) {
|
|
123
|
+
return {
|
|
124
|
+
action: "error",
|
|
125
|
+
status: 502,
|
|
126
|
+
headers: { "Content-Type": "application/problem+json" },
|
|
127
|
+
problemDetails: {
|
|
128
|
+
type: "urn:plural:error:payment-capture-failed",
|
|
129
|
+
title: "Payment Capture Failed",
|
|
130
|
+
status: 502,
|
|
131
|
+
detail: String(err),
|
|
132
|
+
upstream: {
|
|
133
|
+
code: err.captureError.code,
|
|
134
|
+
http_status: err.captureError.httpStatus,
|
|
135
|
+
details: err.captureError.details,
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const result = challengeGenerator.generate(chargeOptions);
|
|
142
|
+
return {
|
|
143
|
+
action: "failed",
|
|
144
|
+
status: 402,
|
|
145
|
+
headers: {
|
|
146
|
+
"WWW-Authenticate": `Payment ${result.encoded}`,
|
|
147
|
+
"Content-Type": "application/problem+json",
|
|
148
|
+
"Cache-Control": "no-store",
|
|
149
|
+
},
|
|
150
|
+
problemDetails: {
|
|
151
|
+
type: result.problemDetails.type.replace("payment-required", "payment-failed"),
|
|
152
|
+
title: "Payment Failed",
|
|
153
|
+
status: 402,
|
|
154
|
+
detail: "Previous payment token was invalid or expired. New challenge issued.",
|
|
155
|
+
challengeId: result.challenge.id,
|
|
156
|
+
},
|
|
157
|
+
challengeResult: result,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=generic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic.js","sourceRoot":"","sources":["../../src/middleware/generic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decidePayment = void 0;
|
|
4
|
+
var generic_js_1 = require("./generic.js");
|
|
5
|
+
Object.defineProperty(exports, "decidePayment", { enumerable: true, get: function () { return generic_js_1.decidePayment; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAApC,2GAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { MppLogger } from "../types/config.js";
|
|
2
|
+
export declare class AuthManager {
|
|
3
|
+
private readonly clientId;
|
|
4
|
+
private readonly clientSecret;
|
|
5
|
+
private readonly baseUrl;
|
|
6
|
+
private readonly timeoutMs?;
|
|
7
|
+
private readonly logger?;
|
|
8
|
+
private readonly maxRetries?;
|
|
9
|
+
private readonly initialRetryDelayMs?;
|
|
10
|
+
private readonly staticAccessToken;
|
|
11
|
+
private state;
|
|
12
|
+
constructor(clientId: string, clientSecret: string, baseUrl: string, timeoutMs?: number | null, logger?: MppLogger | null, maxRetries?: number | null, initialRetryDelayMs?: number | null, accessToken?: string | null);
|
|
13
|
+
getAccessToken(): Promise<string>;
|
|
14
|
+
invalidate(): void;
|
|
15
|
+
private isExpiringSoon;
|
|
16
|
+
private static normalizeAccessToken;
|
|
17
|
+
private exchangeToken;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=auth-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../../src/server/auth-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAMpD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAgB;IACrD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,KAAK,CAA0B;gBAGrC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,EACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAC1B,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,EACnC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAYvB,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAMvC,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,MAAM,CAAC,oBAAoB;YAQrB,aAAa;CA8D5B"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuthManager = void 0;
|
|
4
|
+
const errors_js_1 = require("../utils/errors.js");
|
|
5
|
+
const fetch_helpers_js_1 = require("../utils/fetch-helpers.js");
|
|
6
|
+
const REFRESH_BUFFER_MS = 60_000;
|
|
7
|
+
class AuthManager {
|
|
8
|
+
clientId;
|
|
9
|
+
clientSecret;
|
|
10
|
+
baseUrl;
|
|
11
|
+
timeoutMs;
|
|
12
|
+
logger;
|
|
13
|
+
maxRetries;
|
|
14
|
+
initialRetryDelayMs;
|
|
15
|
+
staticAccessToken;
|
|
16
|
+
state = null;
|
|
17
|
+
constructor(clientId, clientSecret, baseUrl, timeoutMs, logger, maxRetries, initialRetryDelayMs, accessToken) {
|
|
18
|
+
this.clientId = clientId;
|
|
19
|
+
this.clientSecret = clientSecret;
|
|
20
|
+
this.baseUrl = baseUrl.replace(/\/+$/, "");
|
|
21
|
+
this.timeoutMs = timeoutMs;
|
|
22
|
+
this.logger = logger;
|
|
23
|
+
this.maxRetries = maxRetries;
|
|
24
|
+
this.initialRetryDelayMs = initialRetryDelayMs;
|
|
25
|
+
this.staticAccessToken = AuthManager.normalizeAccessToken(accessToken);
|
|
26
|
+
}
|
|
27
|
+
async getAccessToken() {
|
|
28
|
+
if (this.staticAccessToken)
|
|
29
|
+
return this.staticAccessToken;
|
|
30
|
+
if (this.state && !this.isExpiringSoon())
|
|
31
|
+
return this.state.access_token;
|
|
32
|
+
return this.exchangeToken();
|
|
33
|
+
}
|
|
34
|
+
invalidate() {
|
|
35
|
+
this.state = null;
|
|
36
|
+
}
|
|
37
|
+
isExpiringSoon() {
|
|
38
|
+
if (!this.state)
|
|
39
|
+
return true;
|
|
40
|
+
return Date.now() >= this.state.expires_at - REFRESH_BUFFER_MS;
|
|
41
|
+
}
|
|
42
|
+
static normalizeAccessToken(accessToken) {
|
|
43
|
+
let token = (accessToken ?? "").trim();
|
|
44
|
+
if (token.toLowerCase().startsWith("bearer ")) {
|
|
45
|
+
token = token.slice(7).trim();
|
|
46
|
+
}
|
|
47
|
+
return token;
|
|
48
|
+
}
|
|
49
|
+
async exchangeToken() {
|
|
50
|
+
let response = null;
|
|
51
|
+
for (const path of ["/api/auth/v1/token", "/mpp/v1/auth/token"]) {
|
|
52
|
+
const url = `${this.baseUrl}${path}`;
|
|
53
|
+
response = await (0, fetch_helpers_js_1.requestWithRetry)({
|
|
54
|
+
method: "POST",
|
|
55
|
+
url,
|
|
56
|
+
headers: { "Content-Type": "application/json" },
|
|
57
|
+
body: JSON.stringify({
|
|
58
|
+
grant_type: "client_credentials",
|
|
59
|
+
client_id: this.clientId,
|
|
60
|
+
client_secret: this.clientSecret,
|
|
61
|
+
}),
|
|
62
|
+
timeoutMs: this.timeoutMs,
|
|
63
|
+
logger: this.logger,
|
|
64
|
+
maxRetries: this.maxRetries,
|
|
65
|
+
initialRetryDelayMs: this.initialRetryDelayMs,
|
|
66
|
+
});
|
|
67
|
+
if (response.status === 404)
|
|
68
|
+
continue;
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
if (!response || response.status >= 400) {
|
|
72
|
+
let body;
|
|
73
|
+
try {
|
|
74
|
+
body = response ? (await response.json()) : {};
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
body = {};
|
|
78
|
+
}
|
|
79
|
+
if (!body.error) {
|
|
80
|
+
body = {
|
|
81
|
+
error: {
|
|
82
|
+
code: "MPP_AUTHENTICATION_FAILED",
|
|
83
|
+
message: "Merchant token exchange failed",
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
throw errors_js_1.MppError.fromResponse(response?.status ?? 500, body);
|
|
88
|
+
}
|
|
89
|
+
const payload = (await response.json());
|
|
90
|
+
const data = payload.data ?? payload;
|
|
91
|
+
let expiresAtMs = null;
|
|
92
|
+
if (data.expires_at) {
|
|
93
|
+
try {
|
|
94
|
+
const dt = new Date(String(data.expires_at));
|
|
95
|
+
expiresAtMs = dt.getTime();
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
expiresAtMs = null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
this.state = {
|
|
102
|
+
access_token: data.access_token,
|
|
103
|
+
expires_at: expiresAtMs ?? Date.now() + data.expires_in * 1000,
|
|
104
|
+
scope: data.scope ?? "",
|
|
105
|
+
};
|
|
106
|
+
return this.state.access_token;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.AuthManager = AuthManager;
|
|
110
|
+
//# sourceMappingURL=auth-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-manager.js","sourceRoot":"","sources":["../../src/server/auth-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CaptureOptions, CaptureResult } from "../types/capture.js";
|
|
2
|
+
import type { PluralSellerConfig } from "../types/config.js";
|
|
3
|
+
export declare class CaptureClient {
|
|
4
|
+
private readonly baseUrl;
|
|
5
|
+
private readonly timeoutMs?;
|
|
6
|
+
private readonly maxRetries?;
|
|
7
|
+
private readonly initialRetryDelayMs?;
|
|
8
|
+
private readonly logger?;
|
|
9
|
+
private readonly auth;
|
|
10
|
+
constructor(config: PluralSellerConfig);
|
|
11
|
+
capture(options: CaptureOptions): Promise<CaptureResult>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=capture-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-client.d.ts","sourceRoot":"","sources":["../../src/server/capture-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,KAAK,EAAqB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAKhF,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAgB;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;gBAEvB,MAAM,EAAE,kBAAkB;IAkBhC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CAoD/D"}
|