@grtsnx/payba3 1.0.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.
Files changed (118) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/CODE_OF_CONDUCT.md +24 -0
  3. package/CONTRIBUTING.md +149 -0
  4. package/LICENSE +21 -0
  5. package/README.md +282 -0
  6. package/SECURITY.md +53 -0
  7. package/SUPPORT.md +27 -0
  8. package/assets/payba3-logo.svg +17 -0
  9. package/dist/index.d.ts +18 -0
  10. package/dist/index.js +24 -0
  11. package/dist/lib/lib.module.d.ts +2 -0
  12. package/dist/lib/lib.module.js +37 -0
  13. package/dist/lib/lib.module.js.map +1 -0
  14. package/dist/lib/monnify/config/monnify.helper.d.ts +24 -0
  15. package/dist/lib/monnify/config/monnify.helper.js +234 -0
  16. package/dist/lib/monnify/config/monnify.helper.js.map +1 -0
  17. package/dist/lib/monnify/config/monnify.types.d.ts +93 -0
  18. package/dist/lib/monnify/config/monnify.types.js +3 -0
  19. package/dist/lib/monnify/config/monnify.types.js.map +1 -0
  20. package/dist/lib/monnify/monnify.module.d.ts +2 -0
  21. package/dist/lib/monnify/monnify.module.js +22 -0
  22. package/dist/lib/monnify/monnify.module.js.map +1 -0
  23. package/dist/lib/monnify/monnify.service.d.ts +19 -0
  24. package/dist/lib/monnify/monnify.service.js +113 -0
  25. package/dist/lib/monnify/monnify.service.js.map +1 -0
  26. package/dist/lib/mono/config/mono.helper.d.ts +11 -0
  27. package/dist/lib/mono/config/mono.helper.js +78 -0
  28. package/dist/lib/mono/config/mono.helper.js.map +1 -0
  29. package/dist/lib/mono/config/mono.types.d.ts +48 -0
  30. package/dist/lib/mono/config/mono.types.js +3 -0
  31. package/dist/lib/mono/config/mono.types.js.map +1 -0
  32. package/dist/lib/mono/mono.module.d.ts +2 -0
  33. package/dist/lib/mono/mono.module.js +22 -0
  34. package/dist/lib/mono/mono.module.js.map +1 -0
  35. package/dist/lib/mono/mono.service.d.ts +15 -0
  36. package/dist/lib/mono/mono.service.js +77 -0
  37. package/dist/lib/mono/mono.service.js.map +1 -0
  38. package/dist/lib/opay/config/opay.helper.d.ts +17 -0
  39. package/dist/lib/opay/config/opay.helper.js +175 -0
  40. package/dist/lib/opay/config/opay.helper.js.map +1 -0
  41. package/dist/lib/opay/config/opay.types.d.ts +73 -0
  42. package/dist/lib/opay/config/opay.types.js +3 -0
  43. package/dist/lib/opay/config/opay.types.js.map +1 -0
  44. package/dist/lib/opay/opay.module.d.ts +2 -0
  45. package/dist/lib/opay/opay.module.js +22 -0
  46. package/dist/lib/opay/opay.module.js.map +1 -0
  47. package/dist/lib/opay/opay.service.d.ts +17 -0
  48. package/dist/lib/opay/opay.service.js +104 -0
  49. package/dist/lib/opay/opay.service.js.map +1 -0
  50. package/dist/lib/payba3.service.d.ts +16 -0
  51. package/dist/lib/payba3.service.js +59 -0
  52. package/dist/lib/payba3.service.js.map +1 -0
  53. package/dist/lib/payba3.types.d.ts +18 -0
  54. package/dist/lib/payba3.types.js +13 -0
  55. package/dist/lib/payba3.types.js.map +1 -0
  56. package/dist/lib/paystack/config/paystack.helper.d.ts +15 -0
  57. package/dist/lib/paystack/config/paystack.helper.js +134 -0
  58. package/dist/lib/paystack/config/paystack.helper.js.map +1 -0
  59. package/dist/lib/paystack/config/paystack.types.d.ts +92 -0
  60. package/dist/lib/paystack/config/paystack.types.js +3 -0
  61. package/dist/lib/paystack/config/paystack.types.js.map +1 -0
  62. package/dist/lib/paystack/paystack.module.d.ts +2 -0
  63. package/dist/lib/paystack/paystack.module.js +22 -0
  64. package/dist/lib/paystack/paystack.module.js.map +1 -0
  65. package/dist/lib/paystack/paystack.service.d.ts +33 -0
  66. package/dist/lib/paystack/paystack.service.js +328 -0
  67. package/dist/lib/paystack/paystack.service.js.map +1 -0
  68. package/dist/lib/qoreid/config/qoreid.helper.d.ts +19 -0
  69. package/dist/lib/qoreid/config/qoreid.helper.js +132 -0
  70. package/dist/lib/qoreid/config/qoreid.helper.js.map +1 -0
  71. package/dist/lib/qoreid/config/qoreid.types.d.ts +35 -0
  72. package/dist/lib/qoreid/config/qoreid.types.js +3 -0
  73. package/dist/lib/qoreid/config/qoreid.types.js.map +1 -0
  74. package/dist/lib/qoreid/qoreid.module.d.ts +2 -0
  75. package/dist/lib/qoreid/qoreid.module.js +22 -0
  76. package/dist/lib/qoreid/qoreid.module.js.map +1 -0
  77. package/dist/lib/qoreid/qoreid.service.d.ts +10 -0
  78. package/dist/lib/qoreid/qoreid.service.js +63 -0
  79. package/dist/lib/qoreid/qoreid.service.js.map +1 -0
  80. package/dist/lib/safehaven/config/safe.helper.d.ts +16 -0
  81. package/dist/lib/safehaven/config/safe.helper.js +136 -0
  82. package/dist/lib/safehaven/config/safe.helper.js.map +1 -0
  83. package/dist/lib/safehaven/config/safe.types.d.ts +50 -0
  84. package/dist/lib/safehaven/config/safe.types.js +3 -0
  85. package/dist/lib/safehaven/config/safe.types.js.map +1 -0
  86. package/dist/lib/safehaven/safe.module.d.ts +2 -0
  87. package/dist/lib/safehaven/safe.module.js +22 -0
  88. package/dist/lib/safehaven/safe.module.js.map +1 -0
  89. package/dist/lib/safehaven/safe.service.d.ts +14 -0
  90. package/dist/lib/safehaven/safe.service.js +77 -0
  91. package/dist/lib/safehaven/safe.service.js.map +1 -0
  92. package/dist/lib/seerbit/config/seerbit.helper.d.ts +11 -0
  93. package/dist/lib/seerbit/config/seerbit.helper.js +88 -0
  94. package/dist/lib/seerbit/config/seerbit.helper.js.map +1 -0
  95. package/dist/lib/seerbit/config/seerbit.types.d.ts +49 -0
  96. package/dist/lib/seerbit/config/seerbit.types.js +3 -0
  97. package/dist/lib/seerbit/config/seerbit.types.js.map +1 -0
  98. package/dist/lib/seerbit/seerbit.module.d.ts +2 -0
  99. package/dist/lib/seerbit/seerbit.module.js +22 -0
  100. package/dist/lib/seerbit/seerbit.module.js.map +1 -0
  101. package/dist/lib/seerbit/seerbit.service.d.ts +11 -0
  102. package/dist/lib/seerbit/seerbit.service.js +83 -0
  103. package/dist/lib/seerbit/seerbit.service.js.map +1 -0
  104. package/dist/lib/shared/index.d.ts +1 -0
  105. package/dist/lib/shared/index.js +18 -0
  106. package/dist/lib/shared/index.js.map +1 -0
  107. package/dist/lib/shared/response.helper.d.ts +15 -0
  108. package/dist/lib/shared/response.helper.js +39 -0
  109. package/dist/lib/shared/response.helper.js.map +1 -0
  110. package/llms.txt +25 -0
  111. package/package.json +169 -0
  112. package/src/lib/monnify/monnify_llm.txt +429 -0
  113. package/src/lib/mono/mono_llm.txt +372 -0
  114. package/src/lib/opay/opay_llm.txt +1022 -0
  115. package/src/lib/paystack/paystack_llm.txt +382 -0
  116. package/src/lib/qoreid/qoreid_llm.txt +68 -0
  117. package/src/lib/safehaven/safehaven_llm.txt +77 -0
  118. package/src/lib/seerbit/seerbit_llm.txt +61 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.module.js","sourceRoot":"","sources":["../../src/lib/lib.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,oDAAgD;AAChD,6DAAyD;AACzD,oDAAgD;AAChD,gEAA4D;AAC5D,0DAAsD;AACtD,yDAA0D;AAC1D,6DAAyD;AACzD,qDAAiD;AAe1C,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IAbrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,wBAAU;YACV,8BAAa;YACb,wBAAU;YACV,gCAAc;YACd,4BAAY;YACZ,6BAAe;YACf,8BAAa;SACd;QACD,SAAS,EAAE,CAAC,8BAAa,CAAC;QAC1B,OAAO,EAAE,CAAC,8BAAa,CAAC;KACzB,CAAC;GACW,SAAS,CAAG"}
@@ -0,0 +1,24 @@
1
+ import type { MonnifyBaseUrls, MonnifyCredentials, MonnifyEnvironment, MonnifyResponse, MonnifyRequestContext, MonnifyRequestOptions, MonnifyTokenCache } from './monnify.types';
2
+ export declare const MONNIFY_BASE_URLS: MonnifyBaseUrls;
3
+ export declare const getMonnifyBaseUrl: (environment: MonnifyEnvironment, baseUrlOverride?: string) => string;
4
+ export declare const getMonnifyCredentials: (environment: MonnifyEnvironment) => MonnifyCredentials;
5
+ export declare const assertMonnifyCredentials: (credentials: MonnifyCredentials) => void;
6
+ export declare const assertMonnifySecretKey: (secretKey: string) => string;
7
+ export declare const assertMonnifyContractCode: (contractCode: string) => string;
8
+ export declare const buildMonnifyHeaders: (options: MonnifyRequestOptions) => Record<string, string>;
9
+ export declare const buildMonnifyRequestInit: (options: MonnifyRequestOptions) => RequestInit;
10
+ export declare const buildMonnifyQuery: (params: Record<string, string | number | boolean | undefined>) => string;
11
+ export declare const parseMonnifyResponse: (response: Response) => Promise<unknown>;
12
+ export declare const getMonnifyErrorMessage: (error: unknown) => string;
13
+ export declare const isMonnifyResponse: (value: unknown) => value is MonnifyResponse;
14
+ export declare const throwMonnifyResponseError: (body: MonnifyResponse) => never;
15
+ export declare const requestMonnify: <T = unknown>({ baseUrl, endpoint, options, }: MonnifyRequestContext) => Promise<T>;
16
+ export declare const getMonnifyBasicAuth: (credentials: MonnifyCredentials) => string;
17
+ export declare const fetchMonnifyToken: (baseUrl: string, credentials: MonnifyCredentials) => Promise<MonnifyTokenCache>;
18
+ export declare const decodeJwtPayload: (token: string) => Record<string, unknown>;
19
+ export declare const createMonnifyTokenCache: (accessToken: string) => MonnifyTokenCache;
20
+ export declare const isMonnifyTokenFresh: (token?: MonnifyTokenCache) => token is MonnifyTokenCache;
21
+ export declare const getValidMonnifyAccessToken: (token: MonnifyTokenCache | undefined, refreshToken: () => Promise<MonnifyTokenCache>) => Promise<MonnifyTokenCache>;
22
+ export declare const stringifyMonnifyWebhookPayload: (body: unknown) => string | Buffer;
23
+ export declare const createMonnifyWebhookSignature: (body: unknown, secretKey: string) => string;
24
+ export declare const verifyMonnifyWebhookSignature: (body: unknown, signature: string, secretKey: string) => boolean;
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.verifyMonnifyWebhookSignature = exports.createMonnifyWebhookSignature = exports.stringifyMonnifyWebhookPayload = exports.getValidMonnifyAccessToken = exports.isMonnifyTokenFresh = exports.createMonnifyTokenCache = exports.decodeJwtPayload = exports.fetchMonnifyToken = exports.getMonnifyBasicAuth = exports.requestMonnify = exports.throwMonnifyResponseError = exports.isMonnifyResponse = exports.getMonnifyErrorMessage = exports.parseMonnifyResponse = exports.buildMonnifyQuery = exports.buildMonnifyRequestInit = exports.buildMonnifyHeaders = exports.assertMonnifyContractCode = exports.assertMonnifySecretKey = exports.assertMonnifyCredentials = exports.getMonnifyCredentials = exports.getMonnifyBaseUrl = exports.MONNIFY_BASE_URLS = void 0;
37
+ const common_1 = require("@nestjs/common");
38
+ const crypto = __importStar(require("crypto"));
39
+ const response_helper_1 = require("../../shared/response.helper");
40
+ const TOKEN_REFRESH_BUFFER_MS = 60_000;
41
+ const DEFAULT_TOKEN_TTL_MS = 50 * 60 * 1000;
42
+ exports.MONNIFY_BASE_URLS = {
43
+ sandbox: 'https://sandbox.monnify.com',
44
+ live: 'https://api.monnify.com',
45
+ };
46
+ const getMonnifyBaseUrl = (environment, baseUrlOverride) => (baseUrlOverride ?? exports.MONNIFY_BASE_URLS[environment]).replace(/\/+$/, '');
47
+ exports.getMonnifyBaseUrl = getMonnifyBaseUrl;
48
+ const getMonnifyCredentials = (environment) => ({
49
+ apiKey: (environment === 'live'
50
+ ? process.env.MONNIFY_LIVE_API_KEY
51
+ : process.env.MONNIFY_API_KEY)?.trim() ?? '',
52
+ secretKey: (environment === 'live'
53
+ ? process.env.MONNIFY_LIVE_SECRET_KEY
54
+ : process.env.MONNIFY_SECRET_KEY)?.trim() ?? '',
55
+ contractCode: (environment === 'live'
56
+ ? process.env.MONNIFY_LIVE_CONTRACT_CODE
57
+ : process.env.MONNIFY_CONTRACT_CODE)?.trim() ?? '',
58
+ });
59
+ exports.getMonnifyCredentials = getMonnifyCredentials;
60
+ const assertMonnifyCredentials = (credentials) => {
61
+ if (!credentials.apiKey || !credentials.secretKey) {
62
+ throw new common_1.InternalServerErrorException('MONNIFY_API_KEY and MONNIFY_SECRET_KEY are required');
63
+ }
64
+ };
65
+ exports.assertMonnifyCredentials = assertMonnifyCredentials;
66
+ const assertMonnifySecretKey = (secretKey) => {
67
+ if (!secretKey) {
68
+ throw new common_1.InternalServerErrorException('MONNIFY_SECRET_KEY is not configured');
69
+ }
70
+ return secretKey;
71
+ };
72
+ exports.assertMonnifySecretKey = assertMonnifySecretKey;
73
+ const assertMonnifyContractCode = (contractCode) => {
74
+ if (!contractCode) {
75
+ throw new common_1.InternalServerErrorException('MONNIFY_CONTRACT_CODE is not configured');
76
+ }
77
+ return contractCode;
78
+ };
79
+ exports.assertMonnifyContractCode = assertMonnifyContractCode;
80
+ const buildMonnifyHeaders = (options) => ({
81
+ Accept: 'application/json',
82
+ 'Content-Type': 'application/json',
83
+ ...(options.token ? { Authorization: `Bearer ${options.token}` } : {}),
84
+ });
85
+ exports.buildMonnifyHeaders = buildMonnifyHeaders;
86
+ const buildMonnifyRequestInit = (options) => ({
87
+ method: options.method ?? 'GET',
88
+ headers: (0, exports.buildMonnifyHeaders)(options),
89
+ body: options.body ? JSON.stringify(options.body) : undefined,
90
+ redirect: 'error',
91
+ });
92
+ exports.buildMonnifyRequestInit = buildMonnifyRequestInit;
93
+ const buildMonnifyQuery = (params) => {
94
+ const query = new URLSearchParams();
95
+ Object.entries(params).forEach(([key, value]) => {
96
+ if (value !== undefined) {
97
+ query.set(key, String(value));
98
+ }
99
+ });
100
+ const queryString = query.toString();
101
+ return queryString ? `?${queryString}` : '';
102
+ };
103
+ exports.buildMonnifyQuery = buildMonnifyQuery;
104
+ const parseMonnifyResponse = async (response) => {
105
+ const text = await response.text();
106
+ if (!text) {
107
+ return null;
108
+ }
109
+ try {
110
+ return JSON.parse(text);
111
+ }
112
+ catch {
113
+ return text;
114
+ }
115
+ };
116
+ exports.parseMonnifyResponse = parseMonnifyResponse;
117
+ const getMonnifyErrorMessage = (error) => error instanceof Error ? error.message : 'Monnify request failed';
118
+ exports.getMonnifyErrorMessage = getMonnifyErrorMessage;
119
+ const isMonnifyResponse = (value) => typeof value === 'object' &&
120
+ value !== null &&
121
+ 'requestSuccessful' in value &&
122
+ 'responseMessage' in value;
123
+ exports.isMonnifyResponse = isMonnifyResponse;
124
+ const throwMonnifyResponseError = (body) => {
125
+ throw new response_helper_1.handleResponse(common_1.HttpStatus.BAD_REQUEST, body.responseMessage || 'Monnify request failed', body);
126
+ };
127
+ exports.throwMonnifyResponseError = throwMonnifyResponseError;
128
+ const requestMonnify = async ({ baseUrl, endpoint, options = {}, }) => {
129
+ let response;
130
+ try {
131
+ response = await fetch(`${baseUrl}${endpoint}`, (0, exports.buildMonnifyRequestInit)(options));
132
+ }
133
+ catch (error) {
134
+ throw new common_1.BadGatewayException({
135
+ message: 'Monnify request failed',
136
+ data: (0, exports.getMonnifyErrorMessage)(error),
137
+ });
138
+ }
139
+ const body = await (0, exports.parseMonnifyResponse)(response);
140
+ if (!response.ok) {
141
+ throw new response_helper_1.handleResponse(common_1.HttpStatus.BAD_REQUEST, 'Monnify request failed', body);
142
+ }
143
+ if ((0, exports.isMonnifyResponse)(body) && body.requestSuccessful === false) {
144
+ (0, exports.throwMonnifyResponseError)(body);
145
+ }
146
+ return body;
147
+ };
148
+ exports.requestMonnify = requestMonnify;
149
+ const getMonnifyBasicAuth = (credentials) => {
150
+ (0, exports.assertMonnifyCredentials)(credentials);
151
+ return Buffer.from(`${credentials.apiKey}:${credentials.secretKey}`).toString('base64');
152
+ };
153
+ exports.getMonnifyBasicAuth = getMonnifyBasicAuth;
154
+ const fetchMonnifyToken = async (baseUrl, credentials) => {
155
+ let response;
156
+ try {
157
+ response = await fetch(`${baseUrl}/api/v1/auth/login`, {
158
+ method: 'POST',
159
+ headers: {
160
+ Accept: 'application/json',
161
+ Authorization: `Basic ${(0, exports.getMonnifyBasicAuth)(credentials)}`,
162
+ },
163
+ redirect: 'error',
164
+ });
165
+ }
166
+ catch (error) {
167
+ throw new common_1.BadGatewayException({
168
+ message: 'Monnify token request failed',
169
+ data: (0, exports.getMonnifyErrorMessage)(error),
170
+ });
171
+ }
172
+ const body = (await (0, exports.parseMonnifyResponse)(response));
173
+ if (!response.ok || !body.responseBody?.accessToken) {
174
+ throw new response_helper_1.handleResponse(common_1.HttpStatus.BAD_REQUEST, 'Failed to obtain Monnify access token', body);
175
+ }
176
+ return (0, exports.createMonnifyTokenCache)(body.responseBody.accessToken);
177
+ };
178
+ exports.fetchMonnifyToken = fetchMonnifyToken;
179
+ const decodeJwtPayload = (token) => {
180
+ const payload = token.split('.')[1];
181
+ if (!payload) {
182
+ return {};
183
+ }
184
+ try {
185
+ const normalized = payload.replace(/-/g, '+').replace(/_/g, '/');
186
+ const padded = normalized.padEnd(normalized.length + ((4 - (normalized.length % 4)) % 4), '=');
187
+ return JSON.parse(Buffer.from(padded, 'base64').toString('utf8'));
188
+ }
189
+ catch {
190
+ return {};
191
+ }
192
+ };
193
+ exports.decodeJwtPayload = decodeJwtPayload;
194
+ const createMonnifyTokenCache = (accessToken) => {
195
+ const payload = (0, exports.decodeJwtPayload)(accessToken);
196
+ const exp = typeof payload.exp === 'number' ? payload.exp * 1000 : undefined;
197
+ return {
198
+ accessToken,
199
+ expiresAt: exp ?? Date.now() + DEFAULT_TOKEN_TTL_MS,
200
+ };
201
+ };
202
+ exports.createMonnifyTokenCache = createMonnifyTokenCache;
203
+ const isMonnifyTokenFresh = (token) => Boolean(token && token.expiresAt - TOKEN_REFRESH_BUFFER_MS > Date.now());
204
+ exports.isMonnifyTokenFresh = isMonnifyTokenFresh;
205
+ const getValidMonnifyAccessToken = async (token, refreshToken) => {
206
+ if ((0, exports.isMonnifyTokenFresh)(token)) {
207
+ return token;
208
+ }
209
+ return refreshToken();
210
+ };
211
+ exports.getValidMonnifyAccessToken = getValidMonnifyAccessToken;
212
+ const stringifyMonnifyWebhookPayload = (body) => {
213
+ if (typeof body === 'string' || Buffer.isBuffer(body)) {
214
+ return body;
215
+ }
216
+ return JSON.stringify(body ?? {});
217
+ };
218
+ exports.stringifyMonnifyWebhookPayload = stringifyMonnifyWebhookPayload;
219
+ const createMonnifyWebhookSignature = (body, secretKey) => crypto
220
+ .createHmac('sha512', (0, exports.assertMonnifySecretKey)(secretKey))
221
+ .update((0, exports.stringifyMonnifyWebhookPayload)(body))
222
+ .digest('hex');
223
+ exports.createMonnifyWebhookSignature = createMonnifyWebhookSignature;
224
+ const verifyMonnifyWebhookSignature = (body, signature, secretKey) => {
225
+ if (!/^[a-f0-9]+$/i.test(signature) || signature.length % 2 !== 0) {
226
+ return false;
227
+ }
228
+ const expected = Buffer.from((0, exports.createMonnifyWebhookSignature)(body, secretKey), 'hex');
229
+ const received = Buffer.from(signature, 'hex');
230
+ return (expected.length === received.length &&
231
+ crypto.timingSafeEqual(expected, received));
232
+ };
233
+ exports.verifyMonnifyWebhookSignature = verifyMonnifyWebhookSignature;
234
+ //# sourceMappingURL=monnify.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monnify.helper.js","sourceRoot":"","sources":["../../../../src/lib/monnify/config/monnify.helper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ export type MonnifyEnvironment = 'sandbox' | 'live';
2
+ export type MonnifyHttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
3
+ export type MonnifyCredentials = {
4
+ apiKey: string;
5
+ secretKey: string;
6
+ contractCode: string;
7
+ };
8
+ export type MonnifyBaseUrls = Record<MonnifyEnvironment, string>;
9
+ export type MonnifyTokenCache = {
10
+ accessToken: string;
11
+ expiresAt: number;
12
+ };
13
+ export type MonnifyAuthResponse = {
14
+ requestSuccessful: boolean;
15
+ responseMessage: string;
16
+ responseCode: string;
17
+ responseBody?: {
18
+ accessToken?: string;
19
+ [key: string]: unknown;
20
+ };
21
+ };
22
+ export type MonnifyRequestOptions = {
23
+ method?: MonnifyHttpMethod;
24
+ body?: unknown;
25
+ token?: string;
26
+ };
27
+ export type MonnifyRequestContext = {
28
+ baseUrl: string;
29
+ endpoint: string;
30
+ options?: MonnifyRequestOptions;
31
+ };
32
+ export type MonnifyResponse<T = unknown> = {
33
+ requestSuccessful: boolean;
34
+ responseMessage: string;
35
+ responseCode: string;
36
+ responseBody?: T;
37
+ };
38
+ export type MonnifyInitializeTransactionInput = {
39
+ amount: number;
40
+ customerName: string;
41
+ customerEmail: string;
42
+ paymentReference: string;
43
+ paymentDescription: string;
44
+ currencyCode?: string;
45
+ contractCode?: string;
46
+ redirectUrl?: string;
47
+ paymentMethods?: string[];
48
+ metadata?: Record<string, unknown>;
49
+ [key: string]: unknown;
50
+ };
51
+ export type MonnifyTransactionStatusQuery = {
52
+ paymentReference?: string;
53
+ transactionReference?: string;
54
+ };
55
+ export type MonnifyReservedAccountInput = {
56
+ accountReference: string;
57
+ accountName: string;
58
+ currencyCode?: string;
59
+ contractCode?: string;
60
+ customerEmail: string;
61
+ customerName: string;
62
+ bvn?: string;
63
+ nin?: string;
64
+ getAllAvailableBanks?: boolean;
65
+ preferredBanks?: string[];
66
+ [key: string]: unknown;
67
+ };
68
+ export type MonnifyTransferInput = {
69
+ amount: number;
70
+ reference: string;
71
+ narration: string;
72
+ destinationBankCode: string;
73
+ destinationAccountNumber: string;
74
+ currency?: string;
75
+ sourceAccountNumber?: string;
76
+ [key: string]: unknown;
77
+ };
78
+ export type MonnifyRefundInput = {
79
+ transactionReference: string;
80
+ refundReference: string;
81
+ refundAmount: number;
82
+ refundReason?: string;
83
+ customerNote?: string;
84
+ [key: string]: unknown;
85
+ };
86
+ export type MonnifySubAccountInput = {
87
+ currencyCode?: string;
88
+ bankCode: string;
89
+ accountNumber: string;
90
+ email: string;
91
+ defaultSplitPercentage: number;
92
+ [key: string]: unknown;
93
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=monnify.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monnify.types.js","sourceRoot":"","sources":["../../../../src/lib/monnify/config/monnify.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare class MonnifyModule {
2
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MonnifyModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const monnify_service_1 = require("./monnify.service");
12
+ let MonnifyModule = class MonnifyModule {
13
+ };
14
+ exports.MonnifyModule = MonnifyModule;
15
+ exports.MonnifyModule = MonnifyModule = __decorate([
16
+ (0, common_1.Global)(),
17
+ (0, common_1.Module)({
18
+ providers: [monnify_service_1.MonnifyService],
19
+ exports: [monnify_service_1.MonnifyService],
20
+ })
21
+ ], MonnifyModule);
22
+ //# sourceMappingURL=monnify.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monnify.module.js","sourceRoot":"","sources":["../../../src/lib/monnify/monnify.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,uDAAmD;AAO5C,IAAM,aAAa,GAAnB,MAAM,aAAa;CAAG,CAAA;AAAhB,sCAAa;wBAAb,aAAa;IALzB,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,gCAAc,CAAC;QAC3B,OAAO,EAAE,CAAC,gCAAc,CAAC;KAC1B,CAAC;GACW,aAAa,CAAG"}
@@ -0,0 +1,19 @@
1
+ import type { MonnifyInitializeTransactionInput, MonnifyRefundInput, MonnifyRequestOptions, MonnifyReservedAccountInput, MonnifyResponse, MonnifySubAccountInput, MonnifyTransactionStatusQuery, MonnifyTransferInput } from './config/monnify.types';
2
+ export declare class MonnifyService {
3
+ private readonly baseUrl;
4
+ private readonly credentials;
5
+ private token?;
6
+ constructor();
7
+ getAccessToken(): Promise<string>;
8
+ request<T = unknown>(endpoint: string, options?: MonnifyRequestOptions): Promise<T>;
9
+ initializeTransaction(input: MonnifyInitializeTransactionInput): Promise<MonnifyResponse>;
10
+ initializeBankTransfer(input: MonnifyInitializeTransactionInput): Promise<MonnifyResponse>;
11
+ getTransactionStatus(transactionReference: string): Promise<MonnifyResponse>;
12
+ queryTransactionStatus(query: MonnifyTransactionStatusQuery): Promise<MonnifyResponse>;
13
+ createReservedAccount(input: MonnifyReservedAccountInput): Promise<MonnifyResponse>;
14
+ getReservedAccountDetails(accountReference: string): Promise<MonnifyResponse>;
15
+ initiateSingleTransfer(input: MonnifyTransferInput): Promise<MonnifyResponse>;
16
+ createSubAccounts(input: MonnifySubAccountInput[]): Promise<MonnifyResponse>;
17
+ initiateRefund(input: MonnifyRefundInput): Promise<MonnifyResponse>;
18
+ verifyWebhookSignature(body: unknown, signature: string): boolean;
19
+ }
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.MonnifyService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const monnify_helper_1 = require("./config/monnify.helper");
15
+ let MonnifyService = class MonnifyService {
16
+ baseUrl;
17
+ credentials;
18
+ token;
19
+ constructor() {
20
+ const environment = (process.env.MONNIFY_ENVIRONMENT ??
21
+ 'sandbox');
22
+ this.baseUrl = (0, monnify_helper_1.getMonnifyBaseUrl)(environment, process.env.MONNIFY_BASE_URL);
23
+ this.credentials = (0, monnify_helper_1.getMonnifyCredentials)(environment);
24
+ }
25
+ async getAccessToken() {
26
+ this.token = await (0, monnify_helper_1.getValidMonnifyAccessToken)(this.token, () => (0, monnify_helper_1.fetchMonnifyToken)(this.baseUrl, this.credentials));
27
+ return this.token.accessToken;
28
+ }
29
+ async request(endpoint, options = {}) {
30
+ const token = options.token ?? (await this.getAccessToken());
31
+ return (0, monnify_helper_1.requestMonnify)({
32
+ baseUrl: this.baseUrl,
33
+ endpoint,
34
+ options: {
35
+ ...options,
36
+ token,
37
+ },
38
+ });
39
+ }
40
+ async initializeTransaction(input) {
41
+ return this.request('/api/v1/merchant/transactions/init-transaction', {
42
+ method: 'POST',
43
+ body: {
44
+ ...input,
45
+ currencyCode: input.currencyCode ?? 'NGN',
46
+ contractCode: (0, monnify_helper_1.assertMonnifyContractCode)(input.contractCode ?? this.credentials.contractCode),
47
+ },
48
+ });
49
+ }
50
+ async initializeBankTransfer(input) {
51
+ return this.request('/api/v1/merchant/bank-transfer/init-payment', {
52
+ method: 'POST',
53
+ body: {
54
+ ...input,
55
+ currencyCode: input.currencyCode ?? 'NGN',
56
+ contractCode: (0, monnify_helper_1.assertMonnifyContractCode)(input.contractCode ?? this.credentials.contractCode),
57
+ },
58
+ });
59
+ }
60
+ async getTransactionStatus(transactionReference) {
61
+ return this.request(`/api/v2/transactions/${encodeURIComponent(transactionReference)}`);
62
+ }
63
+ async queryTransactionStatus(query) {
64
+ return this.request(`/api/v2/merchant/transactions/query${(0, monnify_helper_1.buildMonnifyQuery)(query)}`);
65
+ }
66
+ async createReservedAccount(input) {
67
+ return this.request('/api/v2/bank-transfer/reserved-accounts', {
68
+ method: 'POST',
69
+ body: {
70
+ currencyCode: 'NGN',
71
+ contractCode: (0, monnify_helper_1.assertMonnifyContractCode)(input.contractCode ?? this.credentials.contractCode),
72
+ getAllAvailableBanks: true,
73
+ ...input,
74
+ },
75
+ });
76
+ }
77
+ async getReservedAccountDetails(accountReference) {
78
+ return this.request(`/api/v2/bank-transfer/reserved-accounts/${encodeURIComponent(accountReference)}`);
79
+ }
80
+ async initiateSingleTransfer(input) {
81
+ return this.request('/api/v2/disbursements/single', {
82
+ method: 'POST',
83
+ body: {
84
+ currency: 'NGN',
85
+ ...input,
86
+ },
87
+ });
88
+ }
89
+ async createSubAccounts(input) {
90
+ return this.request('/api/v1/sub-accounts', {
91
+ method: 'POST',
92
+ body: input.map((account) => ({
93
+ currencyCode: 'NGN',
94
+ ...account,
95
+ })),
96
+ });
97
+ }
98
+ async initiateRefund(input) {
99
+ return this.request('/api/v1/refunds/initiate-refund', {
100
+ method: 'POST',
101
+ body: input,
102
+ });
103
+ }
104
+ verifyWebhookSignature(body, signature) {
105
+ return (0, monnify_helper_1.verifyMonnifyWebhookSignature)(body, signature, this.credentials.secretKey);
106
+ }
107
+ };
108
+ exports.MonnifyService = MonnifyService;
109
+ exports.MonnifyService = MonnifyService = __decorate([
110
+ (0, common_1.Injectable)(),
111
+ __metadata("design:paramtypes", [])
112
+ ], MonnifyService);
113
+ //# sourceMappingURL=monnify.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monnify.service.js","sourceRoot":"","sources":["../../../src/lib/monnify/monnify.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { MonoEnvironment, MonoRequestContext, MonoRequestOptions } from './mono.types';
2
+ export declare const MONO_BASE_URL = "https://api.withmono.com";
3
+ export declare const getMonoBaseUrl: (baseUrlOverride?: string) => string;
4
+ export declare const getMonoSecretKey: (environment: MonoEnvironment) => string | undefined;
5
+ export declare const assertMonoSecretKey: (secretKey: string) => string;
6
+ export declare const buildMonoHeaders: (secretKey: string) => Record<string, string>;
7
+ export declare const buildMonoRequestInit: (secretKey: string, options: MonoRequestOptions) => RequestInit;
8
+ export declare const parseMonoResponse: (response: Response) => Promise<unknown>;
9
+ export declare const getMonoErrorMessage: (error: unknown) => string;
10
+ export declare const requestMono: <T = unknown>({ baseUrl, secretKey, endpoint, options, }: MonoRequestContext) => Promise<T>;
11
+ export declare const buildMonoQuery: (params: Record<string, string | number | boolean | undefined>) => string;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildMonoQuery = exports.requestMono = exports.getMonoErrorMessage = exports.parseMonoResponse = exports.buildMonoRequestInit = exports.buildMonoHeaders = exports.assertMonoSecretKey = exports.getMonoSecretKey = exports.getMonoBaseUrl = exports.MONO_BASE_URL = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const response_helper_1 = require("../../shared/response.helper");
6
+ exports.MONO_BASE_URL = 'https://api.withmono.com';
7
+ const getMonoBaseUrl = (baseUrlOverride) => (baseUrlOverride ?? exports.MONO_BASE_URL).replace(/\/+$/, '');
8
+ exports.getMonoBaseUrl = getMonoBaseUrl;
9
+ const getMonoSecretKey = (environment) => (environment === 'live'
10
+ ? process.env.MONO_LIVE_SECRET_KEY
11
+ : process.env.MONO_SECRET_KEY)?.trim();
12
+ exports.getMonoSecretKey = getMonoSecretKey;
13
+ const assertMonoSecretKey = (secretKey) => {
14
+ if (!secretKey) {
15
+ throw new common_1.InternalServerErrorException('MONO_SECRET_KEY is not configured');
16
+ }
17
+ return secretKey;
18
+ };
19
+ exports.assertMonoSecretKey = assertMonoSecretKey;
20
+ const buildMonoHeaders = (secretKey) => ({
21
+ Accept: 'application/json',
22
+ 'Content-Type': 'application/json',
23
+ 'mono-sec-key': secretKey,
24
+ });
25
+ exports.buildMonoHeaders = buildMonoHeaders;
26
+ const buildMonoRequestInit = (secretKey, options) => ({
27
+ method: options.method ?? 'GET',
28
+ headers: (0, exports.buildMonoHeaders)(secretKey),
29
+ body: options.body ? JSON.stringify(options.body) : undefined,
30
+ redirect: 'error',
31
+ });
32
+ exports.buildMonoRequestInit = buildMonoRequestInit;
33
+ const parseMonoResponse = async (response) => {
34
+ const text = await response.text();
35
+ if (!text) {
36
+ return null;
37
+ }
38
+ try {
39
+ return JSON.parse(text);
40
+ }
41
+ catch {
42
+ return text;
43
+ }
44
+ };
45
+ exports.parseMonoResponse = parseMonoResponse;
46
+ const getMonoErrorMessage = (error) => error instanceof Error ? error.message : 'Mono request failed';
47
+ exports.getMonoErrorMessage = getMonoErrorMessage;
48
+ const requestMono = async ({ baseUrl, secretKey, endpoint, options = {}, }) => {
49
+ const key = (0, exports.assertMonoSecretKey)(secretKey);
50
+ let response;
51
+ try {
52
+ response = await fetch(`${baseUrl}${endpoint}`, (0, exports.buildMonoRequestInit)(key, options));
53
+ }
54
+ catch (error) {
55
+ throw new common_1.BadGatewayException({
56
+ message: 'Mono request failed',
57
+ data: (0, exports.getMonoErrorMessage)(error),
58
+ });
59
+ }
60
+ const body = await (0, exports.parseMonoResponse)(response);
61
+ if (!response.ok) {
62
+ throw new response_helper_1.handleResponse(common_1.HttpStatus.BAD_REQUEST, 'Mono request failed', body);
63
+ }
64
+ return body;
65
+ };
66
+ exports.requestMono = requestMono;
67
+ const buildMonoQuery = (params) => {
68
+ const query = new URLSearchParams();
69
+ Object.entries(params).forEach(([key, value]) => {
70
+ if (value !== undefined) {
71
+ query.set(key, String(value));
72
+ }
73
+ });
74
+ const queryString = query.toString();
75
+ return queryString ? `?${queryString}` : '';
76
+ };
77
+ exports.buildMonoQuery = buildMonoQuery;
78
+ //# sourceMappingURL=mono.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mono.helper.js","sourceRoot":"","sources":["../../../../src/lib/mono/config/mono.helper.ts"],"names":[],"mappings":"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"}