@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":"qoreid.service.js","sourceRoot":"","sources":["../../../src/lib/qoreid/qoreid.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,0DAOgC;AAYzB,IAAM,aAAa,GAAnB,MAAM,aAAa;IACP,OAAO,CAAS;IAChB,WAAW,CAAoB;IACxC,KAAK,CAAoB;IAEjC;QACE,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB;YACjD,OAAO,CAAC,GAAG,CAAC,QAAQ;YACpB,SAAS,CAAsB,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,IAAA,gCAAgB,EAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC1E,IAAI,CAAC,WAAW,GAAG,IAAA,oCAAoB,EAAC,WAAW,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,KAAK,GAAG,MAAM,IAAA,yCAAyB,EAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAC5D,IAAA,gCAAgB,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CACjD,CAAC;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,KAA+B;QAE/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEpC,OAAO,IAAA,6BAAa,EAA8B;YAChD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,cAAc;YACxB,OAAO,EAAE;gBACP,MAAM,EAAE,MAAM;gBACd,KAAK;gBACL,IAAI,EAAE,KAAK;aACZ;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,SAAiB,EACjB,UAAkC,EAAE;QAEpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,OAAO,GACX,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAEjE,OAAO,IAAA,6BAAa,EAA0B;YAC5C,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,IAAA,sCAAsB,EAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC;YACxD,OAAO,EAAE;gBACP,MAAM,EAAE,MAAM;gBACd,KAAK;gBACL,IAAI,EAAE;oBACJ,SAAS,EAAE,SAAS;iBACrB;aACF;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAxDY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;;GACA,aAAa,CAwDzB"}
@@ -0,0 +1,16 @@
1
+ import type { SafehavenBaseUrls, SafehavenEnvironment, SafehavenRequestContext, SafehavenRequestHeaders, SafehavenRequestOptions, SafehavenTokenCache, SafehavenTokenResponse } from './safe.types';
2
+ export declare const SAFEHAVEN_BASE_URLS: SafehavenBaseUrls;
3
+ export declare const getSafehavenBaseUrl: (environment: SafehavenEnvironment, baseUrlOverride?: string) => string;
4
+ export declare const buildSafehavenHeaders: (options: SafehavenRequestOptions) => SafehavenRequestHeaders;
5
+ export declare const parseSafehavenResponse: (response: Response) => Promise<unknown>;
6
+ export declare const getSafehavenErrorData: (error: unknown, isProduction: boolean) => unknown;
7
+ export declare const assertSafehavenClientId: (clientId: string) => string;
8
+ export declare const assertSafehavenClientAssertion: (clientAssertion: string) => string;
9
+ export declare const buildSafehavenTokenPayload: (clientId: string, clientAssertion: string) => Record<string, string>;
10
+ export declare const createSafehavenTokenCache: (response: SafehavenTokenResponse) => SafehavenTokenCache;
11
+ export declare const isSafehavenTokenFresh: (token?: SafehavenTokenCache) => token is SafehavenTokenCache;
12
+ export declare const getValidSafehavenAccessToken: (token: SafehavenTokenCache | undefined, refreshToken: () => Promise<SafehavenTokenResponse>) => Promise<string>;
13
+ export declare const getValidSafehavenToken: (token: SafehavenTokenCache | undefined, refreshToken: () => Promise<SafehavenTokenResponse>) => Promise<SafehavenTokenCache>;
14
+ export declare const getSafehavenClientHeaderValue: (token: SafehavenTokenCache, fallbackClientId: string) => string;
15
+ export declare const throwSafehavenRequestError: (status: number, responseBody: unknown, isProduction: boolean) => never;
16
+ export declare const requestSafehaven: <T>({ baseUrl, endpoint, options, timeoutMs, isProduction, }: SafehavenRequestContext) => Promise<T>;
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requestSafehaven = exports.throwSafehavenRequestError = exports.getSafehavenClientHeaderValue = exports.getValidSafehavenToken = exports.getValidSafehavenAccessToken = exports.isSafehavenTokenFresh = exports.createSafehavenTokenCache = exports.buildSafehavenTokenPayload = exports.assertSafehavenClientAssertion = exports.assertSafehavenClientId = exports.getSafehavenErrorData = exports.parseSafehavenResponse = exports.buildSafehavenHeaders = exports.getSafehavenBaseUrl = exports.SAFEHAVEN_BASE_URLS = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const TOKEN_REFRESH_BUFFER_MS = 60_000;
6
+ exports.SAFEHAVEN_BASE_URLS = {
7
+ sandbox: 'https://api.sandbox.safehavenmfb.com',
8
+ live: 'https://api.safehavenmfb.com',
9
+ };
10
+ const getSafehavenBaseUrl = (environment, baseUrlOverride) => (baseUrlOverride ?? exports.SAFEHAVEN_BASE_URLS[environment]).replace(/\/+$/, '');
11
+ exports.getSafehavenBaseUrl = getSafehavenBaseUrl;
12
+ const buildSafehavenHeaders = (options) => ({
13
+ accept: 'application/json',
14
+ 'content-type': 'application/json',
15
+ ...(options.accessToken
16
+ ? { authorization: `Bearer ${options.accessToken}` }
17
+ : {}),
18
+ ...options.headers,
19
+ });
20
+ exports.buildSafehavenHeaders = buildSafehavenHeaders;
21
+ const parseSafehavenResponse = async (response) => {
22
+ const text = await response.text();
23
+ if (!text) {
24
+ return null;
25
+ }
26
+ try {
27
+ return JSON.parse(text);
28
+ }
29
+ catch {
30
+ return text;
31
+ }
32
+ };
33
+ exports.parseSafehavenResponse = parseSafehavenResponse;
34
+ const getSafehavenErrorData = (error, isProduction) => {
35
+ if (isProduction) {
36
+ return undefined;
37
+ }
38
+ if (error instanceof Error) {
39
+ return error.message;
40
+ }
41
+ return error;
42
+ };
43
+ exports.getSafehavenErrorData = getSafehavenErrorData;
44
+ const assertSafehavenClientId = (clientId) => {
45
+ if (!clientId) {
46
+ throw new common_1.InternalServerErrorException('SAFEHAVEN_CLIENT_ID is not configured');
47
+ }
48
+ return clientId;
49
+ };
50
+ exports.assertSafehavenClientId = assertSafehavenClientId;
51
+ const assertSafehavenClientAssertion = (clientAssertion) => {
52
+ if (!clientAssertion) {
53
+ throw new common_1.InternalServerErrorException('SAFEHAVEN_CLIENT_ASSERTION is not configured');
54
+ }
55
+ return clientAssertion;
56
+ };
57
+ exports.assertSafehavenClientAssertion = assertSafehavenClientAssertion;
58
+ const buildSafehavenTokenPayload = (clientId, clientAssertion) => ({
59
+ grant_type: 'client_credentials',
60
+ client_assertion_type: 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer',
61
+ client_id: (0, exports.assertSafehavenClientId)(clientId),
62
+ client_assertion: (0, exports.assertSafehavenClientAssertion)(clientAssertion),
63
+ });
64
+ exports.buildSafehavenTokenPayload = buildSafehavenTokenPayload;
65
+ const createSafehavenTokenCache = (response) => ({
66
+ accessToken: response.access_token,
67
+ clientId: response.client_id,
68
+ ibsClientId: response.ibs_client_id,
69
+ ibsUserId: response.ibs_user_id,
70
+ expiresAt: Date.now() + response.expires_in * 1000,
71
+ });
72
+ exports.createSafehavenTokenCache = createSafehavenTokenCache;
73
+ const isSafehavenTokenFresh = (token) => Boolean(token && token.expiresAt - TOKEN_REFRESH_BUFFER_MS > Date.now());
74
+ exports.isSafehavenTokenFresh = isSafehavenTokenFresh;
75
+ const getValidSafehavenAccessToken = async (token, refreshToken) => {
76
+ const tokenCache = await (0, exports.getValidSafehavenToken)(token, refreshToken);
77
+ return tokenCache.accessToken;
78
+ };
79
+ exports.getValidSafehavenAccessToken = getValidSafehavenAccessToken;
80
+ const getValidSafehavenToken = async (token, refreshToken) => {
81
+ if ((0, exports.isSafehavenTokenFresh)(token)) {
82
+ return token;
83
+ }
84
+ const response = await refreshToken();
85
+ return (0, exports.createSafehavenTokenCache)(response);
86
+ };
87
+ exports.getValidSafehavenToken = getValidSafehavenToken;
88
+ const getSafehavenClientHeaderValue = (token, fallbackClientId) => token.ibsClientId || fallbackClientId;
89
+ exports.getSafehavenClientHeaderValue = getSafehavenClientHeaderValue;
90
+ const throwSafehavenRequestError = (status, responseBody, isProduction) => {
91
+ if (status === 401) {
92
+ throw new common_1.UnauthorizedException({
93
+ message: 'Unauthorized request to Safehaven',
94
+ data: (0, exports.getSafehavenErrorData)(responseBody, isProduction),
95
+ });
96
+ }
97
+ throw new common_1.BadGatewayException({
98
+ message: 'Safehaven request failed',
99
+ data: (0, exports.getSafehavenErrorData)(responseBody, isProduction),
100
+ });
101
+ };
102
+ exports.throwSafehavenRequestError = throwSafehavenRequestError;
103
+ const requestSafehaven = async ({ baseUrl, endpoint, options = {}, timeoutMs, isProduction, }) => {
104
+ const headers = (0, exports.buildSafehavenHeaders)(options);
105
+ const abortController = new AbortController();
106
+ const timeout = setTimeout(() => abortController.abort(), timeoutMs);
107
+ let response;
108
+ try {
109
+ response = await fetch(`${baseUrl}${endpoint}`, {
110
+ method: options.method ?? 'GET',
111
+ headers,
112
+ body: options.body ? JSON.stringify(options.body) : undefined,
113
+ redirect: 'error',
114
+ signal: abortController.signal,
115
+ });
116
+ }
117
+ catch (error) {
118
+ if (abortController.signal.aborted) {
119
+ throw new common_1.GatewayTimeoutException('Safehaven request timed out');
120
+ }
121
+ throw new common_1.BadGatewayException({
122
+ message: 'Safehaven request failed',
123
+ data: (0, exports.getSafehavenErrorData)(error, isProduction),
124
+ });
125
+ }
126
+ finally {
127
+ clearTimeout(timeout);
128
+ }
129
+ const responseBody = await (0, exports.parseSafehavenResponse)(response);
130
+ if (!response.ok) {
131
+ (0, exports.throwSafehavenRequestError)(response.status, responseBody, isProduction);
132
+ }
133
+ return responseBody;
134
+ };
135
+ exports.requestSafehaven = requestSafehaven;
136
+ //# sourceMappingURL=safe.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe.helper.js","sourceRoot":"","sources":["../../../../src/lib/safehaven/config/safe.helper.ts"],"names":[],"mappings":";;;AAAA,2CAKwB;AAWxB,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAE1B,QAAA,mBAAmB,GAAsB;IACpD,OAAO,EAAE,sCAAsC;IAC/C,IAAI,EAAE,8BAA8B;CACrC,CAAC;AAEK,MAAM,mBAAmB,GAAG,CACjC,WAAiC,EACjC,eAAwB,EAChB,EAAE,CACV,CAAC,eAAe,IAAI,2BAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAJ/D,QAAA,mBAAmB,uBAI4C;AAErE,MAAM,qBAAqB,GAAG,CACnC,OAAgC,EACP,EAAE,CAAC,CAAC;IAC7B,MAAM,EAAE,kBAAkB;IAC1B,cAAc,EAAE,kBAAkB;IAClC,GAAG,CAAC,OAAO,CAAC,WAAW;QACrB,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE;QACpD,CAAC,CAAC,EAAE,CAAC;IACP,GAAG,OAAO,CAAC,OAAO;CACnB,CAAC,CAAC;AATU,QAAA,qBAAqB,yBAS/B;AAEI,MAAM,sBAAsB,GAAG,KAAK,EACzC,QAAkB,EACA,EAAE;IACpB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAdW,QAAA,sBAAsB,0BAcjC;AAEK,MAAM,qBAAqB,GAAG,CACnC,KAAc,EACd,YAAqB,EACZ,EAAE;IACX,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAbW,QAAA,qBAAqB,yBAahC;AAEK,MAAM,uBAAuB,GAAG,CAAC,QAAgB,EAAU,EAAE;IAClE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,qCAA4B,CACpC,uCAAuC,CACxC,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AARW,QAAA,uBAAuB,2BAQlC;AAEK,MAAM,8BAA8B,GAAG,CAC5C,eAAuB,EACf,EAAE;IACV,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,qCAA4B,CACpC,8CAA8C,CAC/C,CAAC;IACJ,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC;AAVW,QAAA,8BAA8B,kCAUzC;AAEK,MAAM,0BAA0B,GAAG,CACxC,QAAgB,EAChB,eAAuB,EACC,EAAE,CAAC,CAAC;IAC5B,UAAU,EAAE,oBAAoB;IAChC,qBAAqB,EACnB,wDAAwD;IAC1D,SAAS,EAAE,IAAA,+BAAuB,EAAC,QAAQ,CAAC;IAC5C,gBAAgB,EAAE,IAAA,sCAA8B,EAAC,eAAe,CAAC;CAClE,CAAC,CAAC;AATU,QAAA,0BAA0B,8BASpC;AAEI,MAAM,yBAAyB,GAAG,CACvC,QAAgC,EACX,EAAE,CAAC,CAAC;IACzB,WAAW,EAAE,QAAQ,CAAC,YAAY;IAClC,QAAQ,EAAE,QAAQ,CAAC,SAAS;IAC5B,WAAW,EAAE,QAAQ,CAAC,aAAa;IACnC,SAAS,EAAE,QAAQ,CAAC,WAAW;IAC/B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,UAAU,GAAG,IAAI;CACnD,CAAC,CAAC;AARU,QAAA,yBAAyB,6BAQnC;AAEI,MAAM,qBAAqB,GAAG,CACnC,KAA2B,EACG,EAAE,CAChC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,uBAAuB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAH9D,QAAA,qBAAqB,yBAGyC;AAEpE,MAAM,4BAA4B,GAAG,KAAK,EAC/C,KAAsC,EACtC,YAAmD,EAClC,EAAE;IACnB,MAAM,UAAU,GAAG,MAAM,IAAA,8BAAsB,EAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAErE,OAAO,UAAU,CAAC,WAAW,CAAC;AAChC,CAAC,CAAC;AAPW,QAAA,4BAA4B,gCAOvC;AAEK,MAAM,sBAAsB,GAAG,KAAK,EACzC,KAAsC,EACtC,YAAmD,EACrB,EAAE;IAChC,IAAI,IAAA,6BAAqB,EAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,OAAO,IAAA,iCAAyB,EAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC;AAVW,QAAA,sBAAsB,0BAUjC;AAEK,MAAM,6BAA6B,GAAG,CAC3C,KAA0B,EAC1B,gBAAwB,EAChB,EAAE,CAAC,KAAK,CAAC,WAAW,IAAI,gBAAgB,CAAC;AAHtC,QAAA,6BAA6B,iCAGS;AAE5C,MAAM,0BAA0B,GAAG,CACxC,MAAc,EACd,YAAqB,EACrB,YAAqB,EACd,EAAE;IACT,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,MAAM,IAAI,8BAAqB,CAAC;YAC9B,OAAO,EAAE,mCAAmC;YAC5C,IAAI,EAAE,IAAA,6BAAqB,EAAC,YAAY,EAAE,YAAY,CAAC;SACxD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,4BAAmB,CAAC;QAC5B,OAAO,EAAE,0BAA0B;QACnC,IAAI,EAAE,IAAA,6BAAqB,EAAC,YAAY,EAAE,YAAY,CAAC;KACxD,CAAC,CAAC;AACL,CAAC,CAAC;AAhBW,QAAA,0BAA0B,8BAgBrC;AAEK,MAAM,gBAAgB,GAAG,KAAK,EAAK,EACxC,OAAO,EACP,QAAQ,EACR,OAAO,GAAG,EAAE,EACZ,SAAS,EACT,YAAY,GACY,EAAc,EAAE;IACxC,MAAM,OAAO,GAAG,IAAA,6BAAqB,EAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAErE,IAAI,QAAkB,CAAC;IAEvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,GAAG,QAAQ,EAAE,EAAE;YAC9C,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;YAC/B,OAAO;YACP,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YAC7D,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,eAAe,CAAC,MAAM;SAC/B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,IAAI,gCAAuB,CAAC,6BAA6B,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,IAAI,4BAAmB,CAAC;YAC5B,OAAO,EAAE,0BAA0B;YACnC,IAAI,EAAE,IAAA,6BAAqB,EAAC,KAAK,EAAE,YAAY,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,IAAA,8BAAsB,EAAC,QAAQ,CAAC,CAAC;IAE5D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAA,kCAA0B,EAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,YAAiB,CAAC;AAC3B,CAAC,CAAC;AAzCW,QAAA,gBAAgB,oBAyC3B"}
@@ -0,0 +1,50 @@
1
+ export type SafehavenEnvironment = 'sandbox' | 'live';
2
+ export type SafehavenHttpMethod = 'GET' | 'POST';
3
+ export type SafehavenBaseUrls = Record<SafehavenEnvironment, string>;
4
+ export type SafehavenTokenResponse = {
5
+ access_token: string;
6
+ client_id: string;
7
+ token_type: 'Bearer';
8
+ expires_in: number;
9
+ refresh_token: string;
10
+ ibs_client_id: string;
11
+ ibs_user_id: string;
12
+ };
13
+ export type SafehavenTokenCache = {
14
+ accessToken: string;
15
+ clientId: string;
16
+ ibsClientId: string;
17
+ ibsUserId: string;
18
+ expiresAt: number;
19
+ };
20
+ export type SafehavenIdentityType = 'NIN' | 'vNIN' | 'BVN' | 'BVNUSSD' | 'vID' | (string & {});
21
+ export type CreateSafehavenSubAccountPayload = {
22
+ phoneNumber: string;
23
+ identityType: SafehavenIdentityType;
24
+ identityId?: string;
25
+ identityNumber?: string;
26
+ otp?: string;
27
+ callbackUrl?: string;
28
+ emailAddress: string;
29
+ externalReference: string;
30
+ autoSweep?: boolean;
31
+ };
32
+ export type SafehavenSubAccountResponse = {
33
+ statusCode: number;
34
+ message: string;
35
+ data: Record<string, unknown>;
36
+ };
37
+ export type SafehavenRequestOptions = {
38
+ method?: SafehavenHttpMethod;
39
+ body?: unknown;
40
+ accessToken?: string;
41
+ headers?: Record<string, string>;
42
+ };
43
+ export type SafehavenRequestHeaders = Record<string, string>;
44
+ export type SafehavenRequestContext = {
45
+ baseUrl: string;
46
+ endpoint: string;
47
+ options?: SafehavenRequestOptions;
48
+ timeoutMs: number;
49
+ isProduction: boolean;
50
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=safe.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe.types.js","sourceRoot":"","sources":["../../../../src/lib/safehaven/config/safe.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare class SafehavenModule {
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.SafehavenModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const safe_service_1 = require("./safe.service");
12
+ let SafehavenModule = class SafehavenModule {
13
+ };
14
+ exports.SafehavenModule = SafehavenModule;
15
+ exports.SafehavenModule = SafehavenModule = __decorate([
16
+ (0, common_1.Global)(),
17
+ (0, common_1.Module)({
18
+ providers: [safe_service_1.SafehavenService],
19
+ exports: [safe_service_1.SafehavenService],
20
+ })
21
+ ], SafehavenModule);
22
+ //# sourceMappingURL=safe.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe.module.js","sourceRoot":"","sources":["../../../src/lib/safehaven/safe.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAgD;AAChD,iDAAkD;AAO3C,IAAM,eAAe,GAArB,MAAM,eAAe;CAAG,CAAA;AAAlB,0CAAe;0BAAf,eAAe;IAL3B,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,+BAAgB,CAAC;QAC7B,OAAO,EAAE,CAAC,+BAAgB,CAAC;KAC5B,CAAC;GACW,eAAe,CAAG"}
@@ -0,0 +1,14 @@
1
+ import { ConfigService } from '@nestjs/config';
2
+ import type { CreateSafehavenSubAccountPayload, SafehavenSubAccountResponse, SafehavenTokenResponse } from './config/safe.types';
3
+ export declare class SafehavenService {
4
+ private readonly configService;
5
+ private readonly baseUrl;
6
+ private readonly clientId;
7
+ private readonly clientAssertion;
8
+ private readonly isProduction;
9
+ private readonly timeoutMs;
10
+ private token?;
11
+ constructor(configService: ConfigService);
12
+ getAccessToken(): Promise<SafehavenTokenResponse>;
13
+ createSubAccount(payload: CreateSafehavenSubAccountPayload): Promise<SafehavenSubAccountResponse>;
14
+ }
@@ -0,0 +1,77 @@
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.SafehavenService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const config_1 = require("@nestjs/config");
15
+ const safe_helper_1 = require("./config/safe.helper");
16
+ let SafehavenService = class SafehavenService {
17
+ configService;
18
+ baseUrl;
19
+ clientId;
20
+ clientAssertion;
21
+ isProduction;
22
+ timeoutMs;
23
+ token;
24
+ constructor(configService) {
25
+ this.configService = configService;
26
+ this.isProduction =
27
+ this.configService.get('NODE_ENV', 'development') ===
28
+ 'production';
29
+ const environment = this.configService.get('SAFEHAVEN_ENVIRONMENT', 'sandbox');
30
+ this.baseUrl = (0, safe_helper_1.getSafehavenBaseUrl)(environment, this.configService.get('SAFEHAVEN_BASE_URL'));
31
+ this.clientId = this.configService.get('SAFEHAVEN_CLIENT_ID') ?? '';
32
+ this.clientAssertion =
33
+ this.configService.get('SAFEHAVEN_CLIENT_ASSERTION') ?? '';
34
+ this.timeoutMs = this.configService.get('SAFEHAVEN_TIMEOUT_MS', 10_000);
35
+ }
36
+ async getAccessToken() {
37
+ const response = await (0, safe_helper_1.requestSafehaven)({
38
+ baseUrl: this.baseUrl,
39
+ endpoint: '/oauth2/token',
40
+ timeoutMs: this.timeoutMs,
41
+ isProduction: this.isProduction,
42
+ options: {
43
+ method: 'POST',
44
+ body: (0, safe_helper_1.buildSafehavenTokenPayload)(this.clientId, this.clientAssertion),
45
+ },
46
+ });
47
+ this.token = (0, safe_helper_1.createSafehavenTokenCache)(response);
48
+ return response;
49
+ }
50
+ async createSubAccount(payload) {
51
+ const token = await (0, safe_helper_1.getValidSafehavenToken)(this.token, () => this.getAccessToken());
52
+ this.token = token;
53
+ return (0, safe_helper_1.requestSafehaven)({
54
+ baseUrl: this.baseUrl,
55
+ endpoint: '/accounts/v2/subaccount',
56
+ timeoutMs: this.timeoutMs,
57
+ isProduction: this.isProduction,
58
+ options: {
59
+ method: 'POST',
60
+ accessToken: token.accessToken,
61
+ headers: {
62
+ ClientID: (0, safe_helper_1.getSafehavenClientHeaderValue)(token, this.clientId),
63
+ },
64
+ body: {
65
+ autoSweep: false,
66
+ ...payload,
67
+ },
68
+ },
69
+ });
70
+ }
71
+ };
72
+ exports.SafehavenService = SafehavenService;
73
+ exports.SafehavenService = SafehavenService = __decorate([
74
+ (0, common_1.Injectable)(),
75
+ __metadata("design:paramtypes", [config_1.ConfigService])
76
+ ], SafehavenService);
77
+ //# sourceMappingURL=safe.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe.service.js","sourceRoot":"","sources":["../../../src/lib/safehaven/safe.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,2CAA+C;AAC/C,sDAO8B;AAUvB,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAQE;IAPZ,OAAO,CAAS;IAChB,QAAQ,CAAS;IACjB,eAAe,CAAS;IACxB,YAAY,CAAU;IACtB,SAAS,CAAS;IAC3B,KAAK,CAAuB;IAEpC,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;QACvD,IAAI,CAAC,YAAY;YACf,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,UAAU,EAAE,aAAa,CAAC;gBACzD,YAAY,CAAC;QACf,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CACxC,uBAAuB,EACvB,SAAS,CACV,CAAC;QAEF,IAAI,CAAC,OAAO,GAAG,IAAA,iCAAmB,EAChC,WAAW,EACX,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,oBAAoB,CAAC,CACrD,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,qBAAqB,CAAC,IAAI,EAAE,CAAC;QAC5E,IAAI,CAAC,eAAe;YAClB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAS,4BAA4B,CAAC,IAAI,EAAE,CAAC;QACrE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CACrC,sBAAsB,EACtB,MAAM,CACP,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAA,8BAAgB,EAAyB;YAC9D,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,OAAO,EAAE;gBACP,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAA,wCAA0B,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC;aACtE;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,GAAG,IAAA,uCAAyB,EAAC,QAAQ,CAAC,CAAC;QAEjD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,OAAyC;QAEzC,MAAM,KAAK,GAAG,MAAM,IAAA,oCAAsB,EAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAC1D,IAAI,CAAC,cAAc,EAAE,CACtB,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,OAAO,IAAA,8BAAgB,EAA8B;YACnD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,QAAQ,EAAE,yBAAyB;YACnC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,OAAO,EAAE;gBACP,MAAM,EAAE,MAAM;gBACd,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,OAAO,EAAE;oBACP,QAAQ,EAAE,IAAA,2CAA6B,EAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC;iBAC9D;gBACD,IAAI,EAAE;oBACJ,SAAS,EAAE,KAAK;oBAChB,GAAG,OAAO;iBACX;aACF;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAzEY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;qCASiC,sBAAa;GAR9C,gBAAgB,CAyE5B"}
@@ -0,0 +1,11 @@
1
+ import type { SeerbitBaseUrls, SeerbitCredentials, SeerbitEnvironment, SeerbitRequestContext, SeerbitRequestOptions } from './seerbit.types';
2
+ export declare const SEERBIT_BASE_URLS: SeerbitBaseUrls;
3
+ export declare const SEERBIT_BASE_URL: string;
4
+ export declare const getSeerbitBaseUrl: (environment: SeerbitEnvironment, baseUrlOverride?: string) => string;
5
+ export declare const getSeerbitCredentials: (environment: SeerbitEnvironment) => SeerbitCredentials;
6
+ export declare const buildSeerbitHeaders: (token?: string) => Record<string, string>;
7
+ export declare const buildSeerbitRequestInit: (options: SeerbitRequestOptions) => RequestInit;
8
+ export declare const parseSeerbitResponse: (response: Response) => Promise<unknown>;
9
+ export declare const assertSeerbitKeys: (publicKey: string, secretKey: string) => void;
10
+ export declare const requestSeerbit: <T>({ baseUrl, endpoint, options, }: SeerbitRequestContext) => Promise<T>;
11
+ export declare const generateSeerbitBearerToken: (baseUrl: string, publicKey: string, secretKey: string) => Promise<string>;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateSeerbitBearerToken = exports.requestSeerbit = exports.assertSeerbitKeys = exports.parseSeerbitResponse = exports.buildSeerbitRequestInit = exports.buildSeerbitHeaders = exports.getSeerbitCredentials = exports.getSeerbitBaseUrl = exports.SEERBIT_BASE_URL = exports.SEERBIT_BASE_URLS = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const response_helper_1 = require("../../shared/response.helper");
6
+ exports.SEERBIT_BASE_URLS = {
7
+ sandbox: 'https://seerbitapi.com/api/v2',
8
+ live: 'https://seerbitapi.com/api/v2',
9
+ };
10
+ exports.SEERBIT_BASE_URL = exports.SEERBIT_BASE_URLS.sandbox;
11
+ const getSeerbitBaseUrl = (environment, baseUrlOverride) => (baseUrlOverride ?? exports.SEERBIT_BASE_URLS[environment]).replace(/\/+$/, '');
12
+ exports.getSeerbitBaseUrl = getSeerbitBaseUrl;
13
+ const getSeerbitCredentials = (environment) => ({
14
+ publicKey: (environment === 'live'
15
+ ? process.env.SEERBIT_LIVE_PUBLIC_KEY
16
+ : process.env.SEERBIT_PUBLIC_KEY)?.trim() ?? '',
17
+ secretKey: (environment === 'live'
18
+ ? process.env.SEERBIT_LIVE_SECRET_KEY
19
+ : process.env.SEERBIT_SECRET_KEY)?.trim() ?? '',
20
+ });
21
+ exports.getSeerbitCredentials = getSeerbitCredentials;
22
+ const buildSeerbitHeaders = (token) => ({
23
+ 'Content-Type': 'application/json',
24
+ ...(token ? { Authorization: `Bearer ${token}` } : {}),
25
+ });
26
+ exports.buildSeerbitHeaders = buildSeerbitHeaders;
27
+ const buildSeerbitRequestInit = (options) => ({
28
+ method: options.method ?? 'GET',
29
+ headers: (0, exports.buildSeerbitHeaders)(options.token),
30
+ body: options.body ? JSON.stringify(options.body) : undefined,
31
+ redirect: 'error',
32
+ });
33
+ exports.buildSeerbitRequestInit = buildSeerbitRequestInit;
34
+ const parseSeerbitResponse = async (response) => {
35
+ const text = await response.text();
36
+ if (!text) {
37
+ return null;
38
+ }
39
+ try {
40
+ return JSON.parse(text);
41
+ }
42
+ catch {
43
+ return text;
44
+ }
45
+ };
46
+ exports.parseSeerbitResponse = parseSeerbitResponse;
47
+ const assertSeerbitKeys = (publicKey, secretKey) => {
48
+ if (!publicKey || !secretKey) {
49
+ throw new common_1.InternalServerErrorException('Seerbit secret keys not set');
50
+ }
51
+ };
52
+ exports.assertSeerbitKeys = assertSeerbitKeys;
53
+ const requestSeerbit = async ({ baseUrl, endpoint, options = {}, }) => {
54
+ let response;
55
+ try {
56
+ response = await fetch(`${baseUrl}${endpoint}`, (0, exports.buildSeerbitRequestInit)(options));
57
+ }
58
+ catch (error) {
59
+ throw new common_1.BadGatewayException({
60
+ message: 'Seerbit request failed',
61
+ data: error instanceof Error ? error.message : undefined,
62
+ });
63
+ }
64
+ const body = await (0, exports.parseSeerbitResponse)(response);
65
+ if (!response.ok) {
66
+ throw new response_helper_1.handleResponse(common_1.HttpStatus.BAD_REQUEST, 'Seerbit request failed', body);
67
+ }
68
+ return body;
69
+ };
70
+ exports.requestSeerbit = requestSeerbit;
71
+ const generateSeerbitBearerToken = async (baseUrl, publicKey, secretKey) => {
72
+ const response = await (0, exports.requestSeerbit)({
73
+ baseUrl,
74
+ endpoint: '/encrypt/keys',
75
+ options: {
76
+ method: 'POST',
77
+ body: { key: `${secretKey}.${publicKey}` },
78
+ },
79
+ });
80
+ const encryptedKey = response.data?.EncryptedSecKey?.encryptedKey ??
81
+ response.data?.EncrytedSecKey?.encryptedKey;
82
+ if (response.status !== 'SUCCESS' || !encryptedKey) {
83
+ throw new response_helper_1.handleResponse(common_1.HttpStatus.BAD_REQUEST, 'Failed to obtain Seerbit bearer token', response);
84
+ }
85
+ return encryptedKey;
86
+ };
87
+ exports.generateSeerbitBearerToken = generateSeerbitBearerToken;
88
+ //# sourceMappingURL=seerbit.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seerbit.helper.js","sourceRoot":"","sources":["../../../../src/lib/seerbit/config/seerbit.helper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export type SeerbitEnvironment = 'sandbox' | 'live';
2
+ export type SeerbitCredentials = {
3
+ publicKey: string;
4
+ secretKey: string;
5
+ };
6
+ export type SeerbitBaseUrls = Record<SeerbitEnvironment, string>;
7
+ export type SeerbitCreateVirtualAccountInput = {
8
+ fullName: string;
9
+ email: string;
10
+ reference: string;
11
+ bankVerificationNumber?: string;
12
+ currency?: string;
13
+ country?: string;
14
+ };
15
+ export type SeerbitVirtualAccountPayments = {
16
+ reference: string;
17
+ walletName: string;
18
+ bankName: string;
19
+ accountNumber: string;
20
+ };
21
+ export type SeerbitCreateVirtualAccountResult = {
22
+ status: string;
23
+ data: {
24
+ code: string;
25
+ payments: SeerbitVirtualAccountPayments;
26
+ message: string;
27
+ };
28
+ };
29
+ export type SeerbitEncryptedKeyResponse = {
30
+ status: string;
31
+ data?: {
32
+ EncryptedSecKey?: {
33
+ encryptedKey?: string;
34
+ };
35
+ EncrytedSecKey?: {
36
+ encryptedKey?: string;
37
+ };
38
+ };
39
+ };
40
+ export type SeerbitRequestOptions = {
41
+ method?: 'GET' | 'POST';
42
+ body?: unknown;
43
+ token?: string;
44
+ };
45
+ export type SeerbitRequestContext = {
46
+ baseUrl: string;
47
+ endpoint: string;
48
+ options?: SeerbitRequestOptions;
49
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=seerbit.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seerbit.types.js","sourceRoot":"","sources":["../../../../src/lib/seerbit/config/seerbit.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare class SeerbitModule {
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.SeerbitModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const seerbit_service_1 = require("./seerbit.service");
12
+ let SeerbitModule = class SeerbitModule {
13
+ };
14
+ exports.SeerbitModule = SeerbitModule;
15
+ exports.SeerbitModule = SeerbitModule = __decorate([
16
+ (0, common_1.Global)(),
17
+ (0, common_1.Module)({
18
+ providers: [seerbit_service_1.SeerbitService],
19
+ exports: [seerbit_service_1.SeerbitService],
20
+ })
21
+ ], SeerbitModule);
22
+ //# sourceMappingURL=seerbit.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seerbit.module.js","sourceRoot":"","sources":["../../../src/lib/seerbit/seerbit.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,11 @@
1
+ import type { SeerbitCreateVirtualAccountInput, SeerbitCreateVirtualAccountResult } from './config/seerbit.types';
2
+ export declare class SeerbitService {
3
+ private readonly baseUrl;
4
+ private readonly publicKey;
5
+ private readonly secretKey;
6
+ private bearerToken;
7
+ constructor();
8
+ getBearerToken(): Promise<string>;
9
+ createVirtualAccount(input: SeerbitCreateVirtualAccountInput): Promise<SeerbitCreateVirtualAccountResult>;
10
+ getVirtualAccount(reference: string): Promise<SeerbitCreateVirtualAccountResult | null>;
11
+ }