telebirr-nodejs 1.1.7 → 1.1.9

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 CHANGED
@@ -21,13 +21,13 @@ You should never hard-code secrets. Always load them from process.env.
21
21
 
22
22
  ### Required Credentials
23
23
 
24
- | Name | Description |
25
- | ---------------------- | -------------------------------------------------------------------------------------- |
26
- | `FABRIC_APP_ID` | Fabric application ID (c4182ef8-9249-458a-985e-06d191f4d505 uuid-v4 string) |
27
- | `FABRIC_APP_SECRET` | Fabric application secret ("fad0f06383c6297f54rr78694b974599" 32 hex character string) |
28
- | `MERCHANT_APP_ID` | Merchant application ID ("7606201678956824" 16 integer character string) |
29
- | `MERCHANT_CODE` | Merchant code ("000000" 6 integer character string) |
30
- | `MERCHANT_PRIVATE_KEY` | RSA private key (PEM string) |
24
+ | Name | Description |
25
+ | ------------------- | -------------------------------------------------------------------------------------- |
26
+ | `FABRIC_APP_ID` | Fabric application ID (c4182ef8-9249-458a-985e-06d191f4d505 uuid-v4 string) |
27
+ | `FABRIC_APP_SECRET` | Fabric application secret ("fad0f06383c6297f54rr78694b974599" 32 hex character string) |
28
+ | `MERCHANT_APP_ID` | Merchant application ID ("7606201678956824" 16 integer character string) |
29
+ | `MERCHANT_CODE` | Merchant code ("000000" 6 integer character string) |
30
+ | `PRIVATE_KEY` | RSA private key (PEM string) |
31
31
 
32
32
  ---
33
33
 
@@ -53,7 +53,7 @@ const c2bClient = new C2B({
53
53
  appSecret: process.env.FABRIC_APP_SECRET,
54
54
  merchantAppId: process.env.MERCHANT_APP_ID,
55
55
  merchantCode: process.env.MERCHANT_CODE,
56
- privateKey: process.env.MERCHANT_PRIVATE_KEY,
56
+ privateKey: process.env.PRIVATE_KEY,
57
57
  notifyUrl: process.env.TELEBIRR_NOTIFY_URL,
58
58
  redirectUrl: process.env.TELEBIRR_REDIRECT_URL,
59
59
  http: true, // allow HTTP in simulator mode
@@ -158,7 +158,7 @@ const c2bClient = new C2B({
158
158
  appSecret: process.env.FABRIC_APP_SECRET,
159
159
  merchantAppId: process.env.MERCHANT_APP_ID,
160
160
  merchantCode: process.env.MERCHANT_CODE,
161
- privateKey: process.env.MERCHANT_PRIVATE_KEY,
161
+ privateKey: process.env.PRIVATE_KEY,
162
162
  notifyUrl: "https://example.com/notify",
163
163
  redirectUrl: "https://example.com/redirect",
164
164
  http: true
@@ -166,7 +166,7 @@ const c2bClient = new C2B({
166
166
 
167
167
  ```
168
168
 
169
- This mode will generate credentials and add the in .env file in your project root directory
169
+ This will help u to use the simulator but make sure you add enviroment variables that will be changed through out the request flow.
170
170
  The simulator is for learning and development purposes only.
171
171
  The simulation server is provided by this package, not by Telebirr. For real testing, use Telebirr’s sandbox mode and whitelist your public IP address in the Telebirr portal.
172
172
 
package/dist/index.cjs CHANGED
@@ -1,114 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } var _class;// src/utils/credentials.ts
2
- var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs);
3
- var _path = require('path'); var _path2 = _interopRequireDefault(_path);
4
- var _crypto = require('crypto'); var _crypto2 = _interopRequireDefault(_crypto);
5
- var _nanoid = require('nanoid');
6
-
7
- // src/utils/keys.ts
8
-
9
-
10
-
11
- function generatePrivateKey() {
12
- const { privateKey } = _crypto.generateKeyPairSync.call(void 0, "rsa", {
13
- modulusLength: 2048,
14
- privateKeyEncoding: {
15
- type: "pkcs1",
16
- format: "pem"
17
- },
18
- publicKeyEncoding: {
19
- type: "pkcs1",
20
- format: "pem"
21
- }
22
- });
23
- return privateKey;
24
- }
25
- function generateKeys(options = {}) {
26
- const {
27
- dir = process.cwd(),
28
- privateKeyName = "telebirr_private.pem",
29
- publicKeyName = "telebirr_public.pem",
30
- overwrite = false
31
- } = options;
32
- const privateKeyPath = _path2.default.join(dir, privateKeyName);
33
- const publicKeyPath = _path2.default.join(dir, publicKeyName);
34
- const exists = _fs2.default.existsSync(privateKeyPath) && _fs2.default.existsSync(publicKeyPath);
35
- if (exists && !overwrite) {
36
- return { privateKeyPath, publicKeyPath };
37
- }
38
- const { privateKey, publicKey } = _crypto.generateKeyPairSync.call(void 0, "rsa", {
39
- modulusLength: 2048,
40
- publicKeyEncoding: {
41
- type: "pkcs1",
42
- format: "pem"
43
- },
44
- privateKeyEncoding: {
45
- type: "pkcs1",
46
- format: "pem"
47
- }
48
- });
49
- _fs2.default.writeFileSync(privateKeyPath, privateKey, { mode: 384 });
50
- _fs2.default.writeFileSync(publicKeyPath, publicKey);
51
- return { privateKeyPath, publicKeyPath };
52
- }
53
-
54
- // src/utils/credentials.ts
55
- var numeric16 = _nanoid.customAlphabet.call(void 0, "0123456789", 16);
56
- var numeric6 = _nanoid.customAlphabet.call(void 0, "0123456789", 6);
57
- var ENV_FILE_NAME = ".env";
58
- function generateCredentials() {
59
- const envPath = _path2.default.join(process.cwd(), ENV_FILE_NAME);
60
- const existingEnv = _fs2.default.existsSync(envPath) ? _fs2.default.readFileSync(envPath, "utf8") : "";
61
- const existingMap = /* @__PURE__ */ new Map();
62
- existingEnv.split("\n").forEach((line) => {
63
- const [key, ...rest] = line.split("=");
64
- if (!key || rest.length === 0) return;
65
- existingMap.set(key.trim(), rest.join("=").trim());
66
- });
67
- const getOrGenerate = (key, generator) => {
68
- if (process.env[key]) return process.env[key];
69
- if (existingMap.has(key)) return existingMap.get(key);
70
- return generator();
71
- };
72
- const generated = {
73
- FABRIC_APP_ID: getOrGenerate("FABRIC_APP_ID", () => _crypto.randomUUID.call(void 0, )),
74
- FABRIC_APP_SECRET: getOrGenerate(
75
- "FABRIC_APP_SECRET",
76
- () => _crypto.randomBytes.call(void 0, 16).toString("hex")
77
- ),
78
- MERCHANT_APP_ID: getOrGenerate("MERCHANT_APP_ID", () => numeric16()),
79
- MERCHANT_CODE: getOrGenerate("MERCHANT_CODE", () => numeric6()),
80
- PRIVATE_KEY: ""
81
- };
82
- if (process.env.PRIVATE_KEY || existingMap.has("PRIVATE_KEY")) {
83
- const stored = _nullishCoalesce(process.env.PRIVATE_KEY, () => ( existingMap.get("PRIVATE_KEY")));
84
- generated.PRIVATE_KEY = stored.replace(/\\n/g, "\n").replace(/^"(.*)"$/, "$1");
85
- } else {
86
- const rawPrivateKey = generatePrivateKey();
87
- generated.PRIVATE_KEY = rawPrivateKey;
88
- }
89
- const entries = [];
90
- Object.entries(generated).forEach(([key, value]) => {
91
- if (key === "PRIVATE_KEY") return;
92
- if (!existingMap.has(key)) {
93
- entries.push(`${key}="${value}"`);
94
- }
95
- });
96
- if (!existingMap.has("PRIVATE_KEY")) {
97
- const escaped = generated.PRIVATE_KEY.replace(/\n/g, "\\n");
98
- entries.push(`PRIVATE_KEY="${escaped}"`);
99
- }
100
- if (entries.length > 0) {
101
- const header = existingEnv.trim().length === 0 ? "# Telebirr Simulator Credentials\n" : "\n\n# Telebirr Simulator Credentials\n";
102
- _fs2.default.writeFileSync(
103
- envPath,
104
- existingEnv + header + entries.join("\n") + "\n",
105
- "utf8"
106
- );
107
- }
108
- return generated;
109
- }
110
-
111
- // src/services/requestToken.ts
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _class;// src/services/requestToken.ts
112
2
  var _http = require('http'); var _http2 = _interopRequireDefault(_http);
113
3
  var _https = require('https'); var _https2 = _interopRequireDefault(_https);
114
4
 
@@ -161,7 +51,7 @@ function requestToken(config) {
161
51
 
162
52
 
163
53
  // src/utils/nonce.ts
164
-
54
+ var _crypto = require('crypto'); var _crypto2 = _interopRequireDefault(_crypto);
165
55
  function createNonceStr() {
166
56
  const bytes = Math.ceil(16);
167
57
  return _crypto.randomBytes.call(void 0, bytes).toString("hex").slice(0, 32);
@@ -423,19 +313,7 @@ var C2B = (_class = class _C2B {
423
313
 
424
314
 
425
315
  constructor(config) {
426
- if (config.mode === "simulate") {
427
- const credentials = generateCredentials();
428
- this.config = {
429
- ...config,
430
- appId: credentials.FABRIC_APP_ID,
431
- appSecret: credentials.FABRIC_APP_SECRET,
432
- merchantAppId: credentials.MERCHANT_APP_ID,
433
- merchantCode: credentials.MERCHANT_CODE,
434
- privateKey: credentials.PRIVATE_KEY
435
- };
436
- } else {
437
- this.config = config;
438
- }
316
+ this.config = config;
439
317
  }
440
318
  async getFabricToken() {
441
319
  if (this.token && !this.isTokenExpired(this.token)) {
@@ -515,6 +393,39 @@ var C2B = (_class = class _C2B {
515
393
  }
516
394
  }, _class.__initStatic(), _class);
517
395
 
396
+ // src/utils/keys.ts
397
+
398
+ var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs);
399
+ var _path = require('path'); var _path2 = _interopRequireDefault(_path);
400
+ function generateKeys(options = {}) {
401
+ const {
402
+ dir = process.cwd(),
403
+ privateKeyName = "telebirr_private.pem",
404
+ publicKeyName = "telebirr_public.pem",
405
+ overwrite = false
406
+ } = options;
407
+ const privateKeyPath = _path2.default.join(dir, privateKeyName);
408
+ const publicKeyPath = _path2.default.join(dir, publicKeyName);
409
+ const exists = _fs2.default.existsSync(privateKeyPath) && _fs2.default.existsSync(publicKeyPath);
410
+ if (exists && !overwrite) {
411
+ return { privateKeyPath, publicKeyPath };
412
+ }
413
+ const { privateKey, publicKey } = _crypto.generateKeyPairSync.call(void 0, "rsa", {
414
+ modulusLength: 2048,
415
+ publicKeyEncoding: {
416
+ type: "pkcs1",
417
+ format: "pem"
418
+ },
419
+ privateKeyEncoding: {
420
+ type: "pkcs1",
421
+ format: "pem"
422
+ }
423
+ });
424
+ _fs2.default.writeFileSync(privateKeyPath, privateKey, { mode: 384 });
425
+ _fs2.default.writeFileSync(publicKeyPath, publicKey);
426
+ return { privateKeyPath, publicKeyPath };
427
+ }
428
+
518
429
 
519
430
 
520
431
  exports.C2B = C2B; exports.generateKeys = generateKeys;
@@ -1 +1 @@
1
- {"version":3,"sources":["c:\\Users\\Dell\\Desktop\\Projects\\telebirr-nodejs\\dist\\index.cjs"],"names":[],"mappings":"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,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA","file":"C:\\Users\\Dell\\Desktop\\Projects\\telebirr-nodejs\\dist\\index.cjs","sourcesContent":[null]}
1
+ {"version":3,"sources":["c:\\Users\\Dell\\Desktop\\Projects\\telebirr-nodejs\\dist\\index.cjs"],"names":[],"mappings":"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,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,QAAA;AACA,QAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,cAAA;AACA,cAAA;AACA,YAAA;AACA,UAAA;AACA,UAAA;AACA,YAAA;AACA,YAAA;AACA,UAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,QAAA;AACA,QAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,IAAA;AACA,MAAA;AACA,MAAA;AACA,IAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA;AACA;AACA;AACA;AACA","file":"C:\\Users\\Dell\\Desktop\\Projects\\telebirr-nodejs\\dist\\index.cjs","sourcesContent":[null]}
package/dist/index.js CHANGED
@@ -1,113 +1,3 @@
1
- // src/utils/credentials.ts
2
- import fs2 from "fs";
3
- import path2 from "path";
4
- import { randomUUID, randomBytes } from "crypto";
5
- import { customAlphabet } from "nanoid";
6
-
7
- // src/utils/keys.ts
8
- import { generateKeyPairSync } from "crypto";
9
- import fs from "fs";
10
- import path from "path";
11
- function generatePrivateKey() {
12
- const { privateKey } = generateKeyPairSync("rsa", {
13
- modulusLength: 2048,
14
- privateKeyEncoding: {
15
- type: "pkcs1",
16
- format: "pem"
17
- },
18
- publicKeyEncoding: {
19
- type: "pkcs1",
20
- format: "pem"
21
- }
22
- });
23
- return privateKey;
24
- }
25
- function generateKeys(options = {}) {
26
- const {
27
- dir = process.cwd(),
28
- privateKeyName = "telebirr_private.pem",
29
- publicKeyName = "telebirr_public.pem",
30
- overwrite = false
31
- } = options;
32
- const privateKeyPath = path.join(dir, privateKeyName);
33
- const publicKeyPath = path.join(dir, publicKeyName);
34
- const exists = fs.existsSync(privateKeyPath) && fs.existsSync(publicKeyPath);
35
- if (exists && !overwrite) {
36
- return { privateKeyPath, publicKeyPath };
37
- }
38
- const { privateKey, publicKey } = generateKeyPairSync("rsa", {
39
- modulusLength: 2048,
40
- publicKeyEncoding: {
41
- type: "pkcs1",
42
- format: "pem"
43
- },
44
- privateKeyEncoding: {
45
- type: "pkcs1",
46
- format: "pem"
47
- }
48
- });
49
- fs.writeFileSync(privateKeyPath, privateKey, { mode: 384 });
50
- fs.writeFileSync(publicKeyPath, publicKey);
51
- return { privateKeyPath, publicKeyPath };
52
- }
53
-
54
- // src/utils/credentials.ts
55
- var numeric16 = customAlphabet("0123456789", 16);
56
- var numeric6 = customAlphabet("0123456789", 6);
57
- var ENV_FILE_NAME = ".env";
58
- function generateCredentials() {
59
- const envPath = path2.join(process.cwd(), ENV_FILE_NAME);
60
- const existingEnv = fs2.existsSync(envPath) ? fs2.readFileSync(envPath, "utf8") : "";
61
- const existingMap = /* @__PURE__ */ new Map();
62
- existingEnv.split("\n").forEach((line) => {
63
- const [key, ...rest] = line.split("=");
64
- if (!key || rest.length === 0) return;
65
- existingMap.set(key.trim(), rest.join("=").trim());
66
- });
67
- const getOrGenerate = (key, generator) => {
68
- if (process.env[key]) return process.env[key];
69
- if (existingMap.has(key)) return existingMap.get(key);
70
- return generator();
71
- };
72
- const generated = {
73
- FABRIC_APP_ID: getOrGenerate("FABRIC_APP_ID", () => randomUUID()),
74
- FABRIC_APP_SECRET: getOrGenerate(
75
- "FABRIC_APP_SECRET",
76
- () => randomBytes(16).toString("hex")
77
- ),
78
- MERCHANT_APP_ID: getOrGenerate("MERCHANT_APP_ID", () => numeric16()),
79
- MERCHANT_CODE: getOrGenerate("MERCHANT_CODE", () => numeric6()),
80
- PRIVATE_KEY: ""
81
- };
82
- if (process.env.PRIVATE_KEY || existingMap.has("PRIVATE_KEY")) {
83
- const stored = process.env.PRIVATE_KEY ?? existingMap.get("PRIVATE_KEY");
84
- generated.PRIVATE_KEY = stored.replace(/\\n/g, "\n").replace(/^"(.*)"$/, "$1");
85
- } else {
86
- const rawPrivateKey = generatePrivateKey();
87
- generated.PRIVATE_KEY = rawPrivateKey;
88
- }
89
- const entries = [];
90
- Object.entries(generated).forEach(([key, value]) => {
91
- if (key === "PRIVATE_KEY") return;
92
- if (!existingMap.has(key)) {
93
- entries.push(`${key}="${value}"`);
94
- }
95
- });
96
- if (!existingMap.has("PRIVATE_KEY")) {
97
- const escaped = generated.PRIVATE_KEY.replace(/\n/g, "\\n");
98
- entries.push(`PRIVATE_KEY="${escaped}"`);
99
- }
100
- if (entries.length > 0) {
101
- const header = existingEnv.trim().length === 0 ? "# Telebirr Simulator Credentials\n" : "\n\n# Telebirr Simulator Credentials\n";
102
- fs2.writeFileSync(
103
- envPath,
104
- existingEnv + header + entries.join("\n") + "\n",
105
- "utf8"
106
- );
107
- }
108
- return generated;
109
- }
110
-
111
1
  // src/services/requestToken.ts
112
2
  import http from "http";
113
3
  import https from "https";
@@ -161,10 +51,10 @@ import http2 from "http";
161
51
  import https2 from "https";
162
52
 
163
53
  // src/utils/nonce.ts
164
- import { randomBytes as randomBytes2 } from "crypto";
54
+ import { randomBytes } from "crypto";
165
55
  function createNonceStr() {
166
56
  const bytes = Math.ceil(16);
167
- return randomBytes2(bytes).toString("hex").slice(0, 32);
57
+ return randomBytes(bytes).toString("hex").slice(0, 32);
168
58
  }
169
59
 
170
60
  // src/utils/timestamp.ts
@@ -423,19 +313,7 @@ var C2B = class _C2B {
423
313
  token;
424
314
  config;
425
315
  constructor(config) {
426
- if (config.mode === "simulate") {
427
- const credentials = generateCredentials();
428
- this.config = {
429
- ...config,
430
- appId: credentials.FABRIC_APP_ID,
431
- appSecret: credentials.FABRIC_APP_SECRET,
432
- merchantAppId: credentials.MERCHANT_APP_ID,
433
- merchantCode: credentials.MERCHANT_CODE,
434
- privateKey: credentials.PRIVATE_KEY
435
- };
436
- } else {
437
- this.config = config;
438
- }
316
+ this.config = config;
439
317
  }
440
318
  async getFabricToken() {
441
319
  if (this.token && !this.isTokenExpired(this.token)) {
@@ -514,6 +392,39 @@ var C2B = class _C2B {
514
392
  return new Date(Date.UTC(year, month, day, hour, minute, second));
515
393
  }
516
394
  };
395
+
396
+ // src/utils/keys.ts
397
+ import { generateKeyPairSync } from "crypto";
398
+ import fs from "fs";
399
+ import path from "path";
400
+ function generateKeys(options = {}) {
401
+ const {
402
+ dir = process.cwd(),
403
+ privateKeyName = "telebirr_private.pem",
404
+ publicKeyName = "telebirr_public.pem",
405
+ overwrite = false
406
+ } = options;
407
+ const privateKeyPath = path.join(dir, privateKeyName);
408
+ const publicKeyPath = path.join(dir, publicKeyName);
409
+ const exists = fs.existsSync(privateKeyPath) && fs.existsSync(publicKeyPath);
410
+ if (exists && !overwrite) {
411
+ return { privateKeyPath, publicKeyPath };
412
+ }
413
+ const { privateKey, publicKey } = generateKeyPairSync("rsa", {
414
+ modulusLength: 2048,
415
+ publicKeyEncoding: {
416
+ type: "pkcs1",
417
+ format: "pem"
418
+ },
419
+ privateKeyEncoding: {
420
+ type: "pkcs1",
421
+ format: "pem"
422
+ }
423
+ });
424
+ fs.writeFileSync(privateKeyPath, privateKey, { mode: 384 });
425
+ fs.writeFileSync(publicKeyPath, publicKey);
426
+ return { privateKeyPath, publicKeyPath };
427
+ }
517
428
  export {
518
429
  C2B,
519
430
  generateKeys
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/credentials.ts","../src/utils/keys.ts","../src/services/requestToken.ts","../src/constants/urls.ts","../src/services/requestCreateOrder.ts","../src/utils/nonce.ts","../src/utils/timestamp.ts","../src/utils/signature.ts","../src/services/requestRefundOrder.ts","../src/services/requestQueryOrder.ts","../src/client/c2b.ts"],"sourcesContent":["import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { randomUUID, randomBytes } from \"crypto\";\r\nimport { customAlphabet } from \"nanoid\";\r\nimport { generatePrivateKey } from \"./keys\";\r\nimport { GeneratedCredentials } from \"../types/credentials\";\r\n\r\nconst numeric16 = customAlphabet(\"0123456789\", 16);\r\nconst numeric6 = customAlphabet(\"0123456789\", 6);\r\n\r\nconst ENV_FILE_NAME = \".env\";\r\n\r\nexport function generateCredentials(): GeneratedCredentials {\r\n const envPath = path.join(process.cwd(), ENV_FILE_NAME);\r\n\r\n const existingEnv = fs.existsSync(envPath)\r\n ? fs.readFileSync(envPath, \"utf8\")\r\n : \"\";\r\n\r\n const existingMap = new Map<string, string>();\r\n\r\n existingEnv.split(\"\\n\").forEach((line) => {\r\n const [key, ...rest] = line.split(\"=\");\r\n if (!key || rest.length === 0) return;\r\n existingMap.set(key.trim(), rest.join(\"=\").trim());\r\n });\r\n\r\n const getOrGenerate = (key: string, generator: () => string): string => {\r\n if (process.env[key]) return process.env[key]!;\r\n if (existingMap.has(key)) return existingMap.get(key)!;\r\n return generator();\r\n };\r\n\r\n const generated: GeneratedCredentials = {\r\n FABRIC_APP_ID: getOrGenerate(\"FABRIC_APP_ID\", () => randomUUID()),\r\n FABRIC_APP_SECRET: getOrGenerate(\"FABRIC_APP_SECRET\", () =>\r\n randomBytes(16).toString(\"hex\")\r\n ),\r\n MERCHANT_APP_ID: getOrGenerate(\"MERCHANT_APP_ID\", () => numeric16()),\r\n MERCHANT_CODE: getOrGenerate(\"MERCHANT_CODE\", () => numeric6()),\r\n PRIVATE_KEY: \"\",\r\n };\r\n\r\n // Handle private key\r\n if (process.env.PRIVATE_KEY || existingMap.has(\"PRIVATE_KEY\")) {\r\n const stored = process.env.PRIVATE_KEY ?? existingMap.get(\"PRIVATE_KEY\")!;\r\n\r\n generated.PRIVATE_KEY = stored\r\n .replace(/\\\\n/g, \"\\n\")\r\n .replace(/^\"(.*)\"$/, \"$1\");\r\n } else {\r\n const rawPrivateKey = generatePrivateKey();\r\n generated.PRIVATE_KEY = rawPrivateKey;\r\n }\r\n\r\n // Write missing entries only\r\n const entries: string[] = [];\r\n Object.entries(generated).forEach(([key, value]) => {\r\n if (key === \"PRIVATE_KEY\") return;\r\n if (!existingMap.has(key)) {\r\n entries.push(`${key}=\"${value}\"`);\r\n }\r\n });\r\n\r\n if (!existingMap.has(\"PRIVATE_KEY\")) {\r\n const escaped = generated.PRIVATE_KEY.replace(/\\n/g, \"\\\\n\");\r\n entries.push(`PRIVATE_KEY=\"${escaped}\"`);\r\n }\r\n\r\n if (entries.length > 0) {\r\n const header =\r\n existingEnv.trim().length === 0\r\n ? \"# Telebirr Simulator Credentials\\n\"\r\n : \"\\n\\n# Telebirr Simulator Credentials\\n\";\r\n\r\n fs.writeFileSync(\r\n envPath,\r\n existingEnv + header + entries.join(\"\\n\") + \"\\n\",\r\n \"utf8\"\r\n );\r\n }\r\n\r\n return generated;\r\n}\r\n","import { generateKeyPairSync } from \"crypto\";\r\nimport fs from \"fs\";\r\nimport path from \"path\";\r\n\r\nexport function generatePrivateKey(): string {\r\n const { privateKey } = generateKeyPairSync(\"rsa\", {\r\n modulusLength: 2048,\r\n privateKeyEncoding: {\r\n type: \"pkcs1\",\r\n format: \"pem\",\r\n },\r\n publicKeyEncoding: {\r\n type: \"pkcs1\",\r\n format: \"pem\",\r\n },\r\n });\r\n\r\n return privateKey;\r\n}\r\n\r\nexport interface KeyPairOptions {\r\n dir?: string; // default: process.cwd()\r\n privateKeyName?: string;\r\n publicKeyName?: string;\r\n overwrite?: boolean; // default: false\r\n}\r\n\r\nexport function generateKeys(options: KeyPairOptions = {}): {\r\n privateKeyPath: string;\r\n publicKeyPath: string;\r\n} {\r\n const {\r\n dir = process.cwd(),\r\n privateKeyName = \"telebirr_private.pem\",\r\n publicKeyName = \"telebirr_public.pem\",\r\n overwrite = false,\r\n } = options;\r\n\r\n const privateKeyPath = path.join(dir, privateKeyName);\r\n const publicKeyPath = path.join(dir, publicKeyName);\r\n\r\n const exists = fs.existsSync(privateKeyPath) && fs.existsSync(publicKeyPath);\r\n\r\n if (exists && !overwrite) {\r\n return { privateKeyPath, publicKeyPath };\r\n }\r\n\r\n const { privateKey, publicKey } = generateKeyPairSync(\"rsa\", {\r\n modulusLength: 2048,\r\n publicKeyEncoding: {\r\n type: \"pkcs1\",\r\n format: \"pem\",\r\n },\r\n privateKeyEncoding: {\r\n type: \"pkcs1\",\r\n format: \"pem\",\r\n },\r\n });\r\n\r\n fs.writeFileSync(privateKeyPath, privateKey, { mode: 0o600 });\r\n fs.writeFileSync(publicKeyPath, publicKey);\r\n\r\n return { privateKeyPath, publicKeyPath };\r\n}\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\nimport { TelebirrConfig } from \"../types/telebirrConfig\";\r\n\r\nexport function requestToken(config: TelebirrConfig) {\r\n const isHttps = TELEBIRR_URLS[config.mode].apiBase.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n ` ${TELEBIRR_URLS[config.mode].apiBase}/payment/v1/token`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-APP-Key\": config.appId,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let body = \"\";\r\n\r\n res.on(\"data\", (chunk) => (body += chunk));\r\n res.on(\"end\", () => resolve(body));\r\n }\r\n );\r\n\r\n req.on(\"error\", reject);\r\n req.write(JSON.stringify({ appSecret: config.appSecret }));\r\n req.end();\r\n });\r\n}\r\n","export const TELEBIRR_URLS = {\r\n sandbox: {\r\n apiBase:\r\n \"https://developerportal.ethiotelebirr.et:38443/apiaccess/payment/gateway\",\r\n webBase:\r\n \"https://developerportal.ethiotelebirr.et:38443/payment/web/paygate?\",\r\n },\r\n production: {\r\n apiBase:\r\n \"https://telebirrappcube.ethiomobilemoney.et:38443/apiaccess/payment/gateway\",\r\n webBase:\r\n \"https://telebirrappcube.ethiomobilemoney.et:38443/payment/web/paygate?\",\r\n },\r\n simulate: {\r\n apiBase: \"https://telebirr-node-simulator.onrender.com\",\r\n webBase: \"https://telebirr-node-simulator.onrender.com/web/?\",\r\n },\r\n};\r\n\r\nexport const CHECKOUT_OTHER_PARAMS = \"&version=1.0&trade_type=Checkout\";\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport {\r\n GenerateCheckoutUrlInput,\r\n CreateOrderResponse,\r\n TelebirrPreorderRequest,\r\n} from \"../types/createOrder\";\r\nimport { createNonceStr } from \"../utils/nonce\";\r\nimport { createTimestamp } from \"../utils/timestamp\";\r\nimport { signRequest } from \"../utils/signature\";\r\nimport { TelebirrMode } from \"../types/telebirrConfig\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\n\r\nexport function requestCreateOrder(\r\n fabricToken: string,\r\n input: GenerateCheckoutUrlInput,\r\n config: {\r\n mode: TelebirrMode;\r\n appId: string;\r\n appSecret: string;\r\n merchantAppId: string;\r\n merchantCode: string;\r\n notifyUrl: string;\r\n redirectUrl: string;\r\n privateKey: string;\r\n http: boolean;\r\n }\r\n): Promise<{\r\n message: string;\r\n data: CreateOrderResponse;\r\n}> {\r\n const reqBody: TelebirrPreorderRequest = {\r\n timestamp: createTimestamp(),\r\n nonce_str: createNonceStr(),\r\n method: \"payment.preorder\",\r\n version: \"1.0\",\r\n biz_content: {\r\n appid: config.merchantAppId,\r\n merch_code: config.merchantCode,\r\n merch_order_id: input.merchOrderId,\r\n notify_url: config.notifyUrl,\r\n redirect_url: config.redirectUrl,\r\n trade_type: \"Checkout\",\r\n title: input.title,\r\n total_amount: input.amount,\r\n trans_currency: \"ETB\",\r\n timeout_express: \"120m\",\r\n business_type: \"BuyGoods\",\r\n payee_type: \"3000\",\r\n payee_identifier: config.merchantCode,\r\n payee_identifier_type: \"04\",\r\n callback_info: \"From web\",\r\n },\r\n };\r\n\r\n reqBody.sign = signRequest(reqBody, config.privateKey);\r\n reqBody.sign_type = \"SHA256WithRSA\";\r\n\r\n const payload = JSON.stringify(reqBody);\r\n\r\n const baseUrl = TELEBIRR_URLS[config.mode].apiBase;\r\n const isHttps = baseUrl.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n `${baseUrl}/payment/v1/merchant/preOrder`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Content-Length\": Buffer.byteLength(payload),\r\n \"X-APP-Key\": config.appId,\r\n Authorization: fabricToken,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let raw = \"\";\r\n\r\n res.on(\"data\", (chunk) => {\r\n raw += chunk;\r\n });\r\n\r\n res.on(\"end\", () => {\r\n const status = res.statusCode || 0;\r\n let parsed: any = raw;\r\n\r\n parsed = JSON.parse(raw);\r\n\r\n if (status < 200 || status >= 300) {\r\n return reject({\r\n message: \"Telebirr preorder request failed\",\r\n data: parsed,\r\n });\r\n }\r\n\r\n resolve({\r\n message: \"Telebirr preorder request successful\",\r\n data: parsed,\r\n });\r\n });\r\n }\r\n );\r\n\r\n req.on(\"error\", (err) => {\r\n reject({\r\n message: \"Telebirr preorder network error\",\r\n data: err,\r\n });\r\n });\r\n\r\n req.write(payload);\r\n req.end();\r\n });\r\n}\r\n","import { randomBytes } from \"crypto\";\r\n\r\nexport function createNonceStr(): string {\r\n const bytes = Math.ceil(16);\r\n return randomBytes(bytes).toString(\"hex\").slice(0, 32);\r\n}\r\n","export function createTimestamp(): string {\r\n return Math.floor(Date.now() / 1000).toString();\r\n}\r\n","import crypto from \"crypto\";\r\n\r\nfunction flattenParams(params: Record<string, any>): Record<string, string> {\r\n const flat: Record<string, string> = {};\r\n\r\n for (const key in params) {\r\n const value = params[key];\r\n\r\n if (\r\n value === undefined ||\r\n value === null ||\r\n value === \"\" ||\r\n key === \"sign\" ||\r\n key === \"signType\" ||\r\n key === \"sign_type\"\r\n ) {\r\n continue;\r\n }\r\n\r\n if (key === \"biz_content\" && typeof value === \"object\") {\r\n for (const bizKey in value) {\r\n const bizValue = value[bizKey];\r\n if (bizValue !== undefined && bizValue !== null && bizValue !== \"\") {\r\n flat[bizKey] = String(bizValue);\r\n }\r\n }\r\n } else {\r\n flat[key] = String(value);\r\n }\r\n }\r\n\r\n return flat;\r\n}\r\n\r\nexport function buildSignString(params: Record<string, any>): string {\r\n const flat = flattenParams(params);\r\n\r\n return Object.keys(flat)\r\n .sort()\r\n .map((key) => `${key}=${flat[key]}`)\r\n .join(\"&\");\r\n}\r\n\r\nexport function signRequest(\r\n data: Record<string, any>,\r\n privateKey: string\r\n): string {\r\n const signString = buildSignString(data);\r\n\r\n return crypto\r\n .createSign(\"RSA-SHA256\")\r\n .update(signString, \"utf8\")\r\n .sign(privateKey, \"base64\");\r\n}\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport { createNonceStr } from \"../utils/nonce\";\r\nimport { createTimestamp } from \"../utils/timestamp\";\r\nimport { signRequest } from \"../utils/signature\";\r\nimport { TelebirrMode } from \"../types/telebirrConfig\";\r\nimport {\r\n RefundInput,\r\n RefundResponse,\r\n TelebirrRefundRequest,\r\n} from \"../types/refund\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\n\r\nexport function requestRefund(\r\n fabricToken: string,\r\n input: RefundInput,\r\n config: {\r\n mode: TelebirrMode;\r\n appId: string;\r\n merchantAppId: string;\r\n merchantCode: string;\r\n privateKey: string;\r\n http: boolean;\r\n }\r\n): Promise<{\r\n data: RefundResponse;\r\n message: string;\r\n}> {\r\n const reqBody: TelebirrRefundRequest = {\r\n timestamp: createTimestamp(),\r\n nonce_str: createNonceStr(),\r\n method: \"payment.refund\",\r\n version: \"1.0\",\r\n biz_content: {\r\n appid: config.merchantAppId,\r\n merch_code: config.merchantCode,\r\n merch_order_id: input.merchOrderId,\r\n trans_currency: \"ETB\",\r\n actual_amount: input.amount,\r\n refund_request_no: input.refundRequestNo,\r\n refund_reason: input.refundReason,\r\n },\r\n };\r\n\r\n reqBody.sign = signRequest(reqBody, config.privateKey);\r\n reqBody.sign_type = \"SHA256WithRSA\";\r\n\r\n const payload = JSON.stringify(reqBody);\r\n\r\n const baseUrl = TELEBIRR_URLS[config.mode].apiBase;\r\n const isHttps = baseUrl.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n `${baseUrl}/payment/v1/merchant/refund`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Content-Length\": Buffer.byteLength(payload),\r\n \"X-APP-Key\": config.appId,\r\n Authorization: fabricToken,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let raw = \"\";\r\n\r\n res.on(\"data\", (chunk) => {\r\n raw += chunk;\r\n });\r\n\r\n res.on(\"end\", () => {\r\n const status = res.statusCode || 0;\r\n let parsed: any = raw;\r\n\r\n parsed = JSON.parse(raw);\r\n\r\n if (status < 200 || status >= 300) {\r\n return reject({\r\n message: \"Telebirr refund request failed\",\r\n\r\n data: parsed,\r\n });\r\n }\r\n\r\n resolve({\r\n data: parsed,\r\n\r\n message: \"Telebirr refund request successful\",\r\n });\r\n });\r\n }\r\n );\r\n\r\n req.on(\"error\", (err) => {\r\n reject({\r\n message: \"Telebirr refund network error\",\r\n data: err,\r\n });\r\n });\r\n\r\n req.write(payload);\r\n req.end();\r\n });\r\n}\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport {\r\n TelebirrQueryorderRequest,\r\n QueryOrderResponse,\r\n} from \"../types/queryOrder\";\r\nimport { createNonceStr } from \"../utils/nonce\";\r\nimport { createTimestamp } from \"../utils/timestamp\";\r\nimport { signRequest } from \"../utils/signature\";\r\nimport { TelebirrMode } from \"../types/telebirrConfig\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\n\r\nexport function requestQueryOrder(\r\n fabricToken: string,\r\n merchOrderId: string,\r\n config: {\r\n appId: string;\r\n appSecret: string;\r\n merchantAppId: string;\r\n merchantCode: string;\r\n privateKey: string;\r\n notifyUrl: string;\r\n redirectUrl: string;\r\n mode: TelebirrMode;\r\n http: boolean;\r\n }\r\n): Promise<{\r\n data: QueryOrderResponse;\r\n message: string;\r\n}> {\r\n const reqBody: TelebirrQueryorderRequest = {\r\n timestamp: createTimestamp(),\r\n nonce_str: createNonceStr(),\r\n method: \"payment.queryorder\",\r\n version: \"1.0\",\r\n biz_content: {\r\n appid: config.merchantAppId,\r\n merch_code: config.merchantCode,\r\n merch_order_id: merchOrderId,\r\n },\r\n };\r\n\r\n reqBody.sign = signRequest(reqBody, config.privateKey);\r\n reqBody.sign_type = \"SHA256WithRSA\";\r\n\r\n const payload = JSON.stringify(reqBody);\r\n\r\n const baseUrl = TELEBIRR_URLS[config.mode].apiBase;\r\n const isHttps = baseUrl.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n `${baseUrl}/payment/v1/merchant/queryOrder`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Content-Length\": Buffer.byteLength(payload),\r\n \"X-APP-Key\": config.appId,\r\n Authorization: fabricToken,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let raw = \"\";\r\n\r\n res.on(\"data\", (chunk) => {\r\n raw += chunk;\r\n });\r\n\r\n res.on(\"end\", () => {\r\n const status = res.statusCode || 0;\r\n let parsed: any = raw;\r\n\r\n parsed = JSON.parse(raw);\r\n\r\n if (status < 200 || status >= 300) {\r\n return reject({\r\n message: \"Telebirr queryOrder request failed\",\r\n data: parsed,\r\n });\r\n }\r\n\r\n resolve({\r\n data: parsed,\r\n message: \"Telebirr queryOrder request successful\",\r\n });\r\n });\r\n }\r\n );\r\n\r\n req.on(\"error\", (err) => {\r\n reject({\r\n message: \"Telebirr queryOrder network error\",\r\n data: err,\r\n });\r\n });\r\n\r\n req.write(payload);\r\n req.end();\r\n });\r\n}\r\n","import { TelebirrConfig } from \"../types/telebirrConfig\";\r\nimport { FabricTokenResponse } from \"../types/fabricToken\";\r\nimport { GenerateCheckoutUrlInput } from \"../types/createOrder\";\r\nimport { generateCredentials } from \"../utils/credentials\";\r\nimport { QueryOrderResponse } from \"../types/queryOrder\";\r\nimport { RefundInput, RefundResponse } from \"../types/refund\";\r\nimport { requestToken } from \"../services/requestToken\";\r\nimport { requestCreateOrder } from \"../services/requestCreateOrder\";\r\nimport { requestRefund } from \"../services/requestRefundOrder\";\r\nimport { requestQueryOrder } from \"../services/requestQueryOrder\";\r\nimport { TELEBIRR_URLS, CHECKOUT_OTHER_PARAMS } from \"../constants/urls\";\r\nimport { signRequest } from \"../utils/signature\";\r\nimport { createTimestamp } from \"../utils/timestamp\";\r\nimport { createNonceStr } from \"../utils/nonce\";\r\nimport { GeneratedCredentials } from \"../types/credentials\";\r\n\r\nexport class C2B {\r\n private token?: typeof FabricTokenResponse;\r\n private config: TelebirrConfig;\r\n\r\n constructor(config: TelebirrConfig) {\r\n if (config.mode === \"simulate\") {\r\n const credentials: GeneratedCredentials = generateCredentials();\r\n\r\n this.config = {\r\n ...config,\r\n appId: credentials.FABRIC_APP_ID,\r\n appSecret: credentials.FABRIC_APP_SECRET,\r\n merchantAppId: credentials.MERCHANT_APP_ID,\r\n merchantCode: credentials.MERCHANT_CODE,\r\n privateKey: credentials.PRIVATE_KEY,\r\n };\r\n } else {\r\n this.config = config;\r\n }\r\n }\r\n\r\n async getFabricToken(): Promise<any> {\r\n if (this.token && !this.isTokenExpired(this.token)) {\r\n return this.token;\r\n }\r\n\r\n let token: any = await requestToken(this.config);\r\n token = JSON.parse(token);\r\n if (!token) return;\r\n this.token = token;\r\n return token;\r\n }\r\n\r\n private createCheckoutUrl(prepayId: string): string {\r\n const map = {\r\n appid: this.config.merchantAppId,\r\n merch_code: this.config.merchantCode,\r\n nonce_str: createNonceStr(),\r\n prepay_id: prepayId,\r\n timestamp: createTimestamp(),\r\n };\r\n\r\n const sign = signRequest(map, this.config.privateKey);\r\n\r\n const rawRequest = [\r\n `appid=${map.appid}`,\r\n `merch_code=${map.merch_code}`,\r\n `nonce_str=${map.nonce_str}`,\r\n `prepay_id=${map.prepay_id}`,\r\n `timestamp=${map.timestamp}`,\r\n `sign=${sign}`,\r\n `sign_type=SHA256WithRSA`,\r\n ].join(\"&\");\r\n\r\n const webBase = TELEBIRR_URLS[this.config.mode].webBase;\r\n\r\n return webBase + rawRequest + CHECKOUT_OTHER_PARAMS;\r\n }\r\n async checkout(input: GenerateCheckoutUrlInput): Promise<string | void> {\r\n const token = await this.getFabricToken();\r\n\r\n if (!token) return;\r\n\r\n let response: any = await requestCreateOrder(\r\n token.token,\r\n input,\r\n this.config\r\n );\r\n if (!response) return;\r\n\r\n return this.createCheckoutUrl(response.data.biz_content.prepay_id);\r\n }\r\n\r\n async queryOrder(input: string): Promise<QueryOrderResponse | void> {\r\n let token = await this.getFabricToken();\r\n\r\n if (!token) return;\r\n\r\n const response: any = await requestQueryOrder(\r\n token.token,\r\n input,\r\n this.config\r\n );\r\n\r\n return response.data;\r\n }\r\n async refundOrder(input: RefundInput): Promise<RefundResponse | void> {\r\n const token = await this.getFabricToken();\r\n if (!token) return;\r\n const response: any = await requestRefund(token.token, input, this.config);\r\n\r\n return response.data;\r\n }\r\n\r\n private static readonly TOKEN_EXPIRY_SAFETY_WINDOW_MS = 5 * 60 * 1000;\r\n\r\n private isTokenExpired(token?: typeof FabricTokenResponse): boolean {\r\n if (!token) {\r\n return true;\r\n }\r\n\r\n const now = Date.now();\r\n const expiry = this.parseTelebirrDate(token.expirationDate).getTime();\r\n\r\n return now >= expiry - C2B.TOKEN_EXPIRY_SAFETY_WINDOW_MS;\r\n }\r\n\r\n private parseTelebirrDate(value: string): Date {\r\n const year = Number(value.slice(0, 4));\r\n const month = Number(value.slice(4, 6)) - 1;\r\n const day = Number(value.slice(6, 8));\r\n const hour = Number(value.slice(8, 10));\r\n const minute = Number(value.slice(10, 12));\r\n const second = Number(value.slice(12, 14));\r\n\r\n return new Date(Date.UTC(year, month, day, hour, minute, second));\r\n }\r\n}\r\n"],"mappings":";AAAA,OAAOA,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,YAAY,mBAAmB;AACxC,SAAS,sBAAsB;;;ACH/B,SAAS,2BAA2B;AACpC,OAAO,QAAQ;AACf,OAAO,UAAU;AAEV,SAAS,qBAA6B;AAC3C,QAAM,EAAE,WAAW,IAAI,oBAAoB,OAAO;AAAA,IAChD,eAAe;AAAA,IACf,oBAAoB;AAAA,MAClB,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,mBAAmB;AAAA,MACjB,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AAED,SAAO;AACT;AASO,SAAS,aAAa,UAA0B,CAAC,GAGtD;AACA,QAAM;AAAA,IACJ,MAAM,QAAQ,IAAI;AAAA,IAClB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,YAAY;AAAA,EACd,IAAI;AAEJ,QAAM,iBAAiB,KAAK,KAAK,KAAK,cAAc;AACpD,QAAM,gBAAgB,KAAK,KAAK,KAAK,aAAa;AAElD,QAAM,SAAS,GAAG,WAAW,cAAc,KAAK,GAAG,WAAW,aAAa;AAE3E,MAAI,UAAU,CAAC,WAAW;AACxB,WAAO,EAAE,gBAAgB,cAAc;AAAA,EACzC;AAEA,QAAM,EAAE,YAAY,UAAU,IAAI,oBAAoB,OAAO;AAAA,IAC3D,eAAe;AAAA,IACf,mBAAmB;AAAA,MACjB,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,oBAAoB;AAAA,MAClB,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AAED,KAAG,cAAc,gBAAgB,YAAY,EAAE,MAAM,IAAM,CAAC;AAC5D,KAAG,cAAc,eAAe,SAAS;AAEzC,SAAO,EAAE,gBAAgB,cAAc;AACzC;;;ADxDA,IAAM,YAAY,eAAe,cAAc,EAAE;AACjD,IAAM,WAAW,eAAe,cAAc,CAAC;AAE/C,IAAM,gBAAgB;AAEf,SAAS,sBAA4C;AAC1D,QAAM,UAAUC,MAAK,KAAK,QAAQ,IAAI,GAAG,aAAa;AAEtD,QAAM,cAAcC,IAAG,WAAW,OAAO,IACrCA,IAAG,aAAa,SAAS,MAAM,IAC/B;AAEJ,QAAM,cAAc,oBAAI,IAAoB;AAE5C,cAAY,MAAM,IAAI,EAAE,QAAQ,CAAC,SAAS;AACxC,UAAM,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,MAAM,GAAG;AACrC,QAAI,CAAC,OAAO,KAAK,WAAW,EAAG;AAC/B,gBAAY,IAAI,IAAI,KAAK,GAAG,KAAK,KAAK,GAAG,EAAE,KAAK,CAAC;AAAA,EACnD,CAAC;AAED,QAAM,gBAAgB,CAAC,KAAa,cAAoC;AACtE,QAAI,QAAQ,IAAI,GAAG,EAAG,QAAO,QAAQ,IAAI,GAAG;AAC5C,QAAI,YAAY,IAAI,GAAG,EAAG,QAAO,YAAY,IAAI,GAAG;AACpD,WAAO,UAAU;AAAA,EACnB;AAEA,QAAM,YAAkC;AAAA,IACtC,eAAe,cAAc,iBAAiB,MAAM,WAAW,CAAC;AAAA,IAChE,mBAAmB;AAAA,MAAc;AAAA,MAAqB,MACpD,YAAY,EAAE,EAAE,SAAS,KAAK;AAAA,IAChC;AAAA,IACA,iBAAiB,cAAc,mBAAmB,MAAM,UAAU,CAAC;AAAA,IACnE,eAAe,cAAc,iBAAiB,MAAM,SAAS,CAAC;AAAA,IAC9D,aAAa;AAAA,EACf;AAGA,MAAI,QAAQ,IAAI,eAAe,YAAY,IAAI,aAAa,GAAG;AAC7D,UAAM,SAAS,QAAQ,IAAI,eAAe,YAAY,IAAI,aAAa;AAEvE,cAAU,cAAc,OACrB,QAAQ,QAAQ,IAAI,EACpB,QAAQ,YAAY,IAAI;AAAA,EAC7B,OAAO;AACL,UAAM,gBAAgB,mBAAmB;AACzC,cAAU,cAAc;AAAA,EAC1B;AAGA,QAAM,UAAoB,CAAC;AAC3B,SAAO,QAAQ,SAAS,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAClD,QAAI,QAAQ,cAAe;AAC3B,QAAI,CAAC,YAAY,IAAI,GAAG,GAAG;AACzB,cAAQ,KAAK,GAAG,GAAG,KAAK,KAAK,GAAG;AAAA,IAClC;AAAA,EACF,CAAC;AAED,MAAI,CAAC,YAAY,IAAI,aAAa,GAAG;AACnC,UAAM,UAAU,UAAU,YAAY,QAAQ,OAAO,KAAK;AAC1D,YAAQ,KAAK,gBAAgB,OAAO,GAAG;AAAA,EACzC;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,SACJ,YAAY,KAAK,EAAE,WAAW,IAC1B,uCACA;AAEN,IAAAA,IAAG;AAAA,MACD;AAAA,MACA,cAAc,SAAS,QAAQ,KAAK,IAAI,IAAI;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AEnFA,OAAO,UAAU;AACjB,OAAO,WAAW;;;ACDX,IAAM,gBAAgB;AAAA,EAC3B,SAAS;AAAA,IACP,SACE;AAAA,IACF,SACE;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,IACV,SACE;AAAA,IACF,SACE;AAAA,EACJ;AAAA,EACA,UAAU;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACF;AAEO,IAAM,wBAAwB;;;ADd9B,SAAS,aAAa,QAAwB;AACnD,QAAM,UAAU,cAAc,OAAO,IAAI,EAAE,QAAQ,WAAW,UAAU;AACxE,QAAM,SAAS,UAAU,QAAQ;AACjC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,OAAO;AAAA,MACjB,IAAI,cAAc,OAAO,IAAI,EAAE,OAAO;AAAA,MACtC;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,aAAa,OAAO;AAAA,QACtB;AAAA,QACA,GAAI,WAAW,EAAE,oBAAoB,MAAM;AAAA,MAC7C;AAAA,MACA,CAAC,QAAQ;AACP,YAAI,OAAO;AAEX,YAAI,GAAG,QAAQ,CAAC,UAAW,QAAQ,KAAM;AACzC,YAAI,GAAG,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,GAAG,SAAS,MAAM;AACtB,QAAI,MAAM,KAAK,UAAU,EAAE,WAAW,OAAO,UAAU,CAAC,CAAC;AACzD,QAAI,IAAI;AAAA,EACV,CAAC;AACH;;;AE/BA,OAAOC,WAAU;AACjB,OAAOC,YAAW;;;ACDlB,SAAS,eAAAC,oBAAmB;AAErB,SAAS,iBAAyB;AACvC,QAAM,QAAQ,KAAK,KAAK,EAAE;AAC1B,SAAOA,aAAY,KAAK,EAAE,SAAS,KAAK,EAAE,MAAM,GAAG,EAAE;AACvD;;;ACLO,SAAS,kBAA0B;AACxC,SAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,EAAE,SAAS;AAChD;;;ACFA,OAAO,YAAY;AAEnB,SAAS,cAAc,QAAqD;AAC1E,QAAM,OAA+B,CAAC;AAEtC,aAAW,OAAO,QAAQ;AACxB,UAAM,QAAQ,OAAO,GAAG;AAExB,QACE,UAAU,UACV,UAAU,QACV,UAAU,MACV,QAAQ,UACR,QAAQ,cACR,QAAQ,aACR;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,iBAAiB,OAAO,UAAU,UAAU;AACtD,iBAAW,UAAU,OAAO;AAC1B,cAAM,WAAW,MAAM,MAAM;AAC7B,YAAI,aAAa,UAAa,aAAa,QAAQ,aAAa,IAAI;AAClE,eAAK,MAAM,IAAI,OAAO,QAAQ;AAAA,QAChC;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,GAAG,IAAI,OAAO,KAAK;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,QAAqC;AACnE,QAAM,OAAO,cAAc,MAAM;AAEjC,SAAO,OAAO,KAAK,IAAI,EACpB,KAAK,EACL,IAAI,CAAC,QAAQ,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC,EAAE,EAClC,KAAK,GAAG;AACb;AAEO,SAAS,YACd,MACA,YACQ;AACR,QAAM,aAAa,gBAAgB,IAAI;AAEvC,SAAO,OACJ,WAAW,YAAY,EACvB,OAAO,YAAY,MAAM,EACzB,KAAK,YAAY,QAAQ;AAC9B;;;AHxCO,SAAS,mBACd,aACA,OACA,QAcC;AACD,QAAM,UAAmC;AAAA,IACvC,WAAW,gBAAgB;AAAA,IAC3B,WAAW,eAAe;AAAA,IAC1B,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,aAAa;AAAA,MACX,OAAO,OAAO;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,gBAAgB,MAAM;AAAA,MACtB,YAAY,OAAO;AAAA,MACnB,cAAc,OAAO;AAAA,MACrB,YAAY;AAAA,MACZ,OAAO,MAAM;AAAA,MACb,cAAc,MAAM;AAAA,MACpB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,kBAAkB,OAAO;AAAA,MACzB,uBAAuB;AAAA,MACvB,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,UAAQ,OAAO,YAAY,SAAS,OAAO,UAAU;AACrD,UAAQ,YAAY;AAEpB,QAAM,UAAU,KAAK,UAAU,OAAO;AAEtC,QAAM,UAAU,cAAc,OAAO,IAAI,EAAE;AAC3C,QAAM,UAAU,QAAQ,WAAW,UAAU;AAC7C,QAAM,SAAS,UAAUC,SAAQC;AAEjC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,OAAO;AAAA,MACjB,GAAG,OAAO;AAAA,MACV;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,kBAAkB,OAAO,WAAW,OAAO;AAAA,UAC3C,aAAa,OAAO;AAAA,UACpB,eAAe;AAAA,QACjB;AAAA,QACA,GAAI,WAAW,EAAE,oBAAoB,MAAM;AAAA,MAC7C;AAAA,MACA,CAAC,QAAQ;AACP,YAAI,MAAM;AAEV,YAAI,GAAG,QAAQ,CAAC,UAAU;AACxB,iBAAO;AAAA,QACT,CAAC;AAED,YAAI,GAAG,OAAO,MAAM;AAClB,gBAAM,SAAS,IAAI,cAAc;AACjC,cAAI,SAAc;AAElB,mBAAS,KAAK,MAAM,GAAG;AAEvB,cAAI,SAAS,OAAO,UAAU,KAAK;AACjC,mBAAO,OAAO;AAAA,cACZ,SAAS;AAAA,cACT,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAEA,kBAAQ;AAAA,YACN,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH,CAAC;AAED,QAAI,MAAM,OAAO;AACjB,QAAI,IAAI;AAAA,EACV,CAAC;AACH;;;AInHA,OAAOC,WAAU;AACjB,OAAOC,YAAW;AAYX,SAAS,cACd,aACA,OACA,QAWC;AACD,QAAM,UAAiC;AAAA,IACrC,WAAW,gBAAgB;AAAA,IAC3B,WAAW,eAAe;AAAA,IAC1B,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,aAAa;AAAA,MACX,OAAO,OAAO;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,gBAAgB,MAAM;AAAA,MACtB,gBAAgB;AAAA,MAChB,eAAe,MAAM;AAAA,MACrB,mBAAmB,MAAM;AAAA,MACzB,eAAe,MAAM;AAAA,IACvB;AAAA,EACF;AAEA,UAAQ,OAAO,YAAY,SAAS,OAAO,UAAU;AACrD,UAAQ,YAAY;AAEpB,QAAM,UAAU,KAAK,UAAU,OAAO;AAEtC,QAAM,UAAU,cAAc,OAAO,IAAI,EAAE;AAC3C,QAAM,UAAU,QAAQ,WAAW,UAAU;AAC7C,QAAM,SAAS,UAAUC,SAAQC;AAEjC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,OAAO;AAAA,MACjB,GAAG,OAAO;AAAA,MACV;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,kBAAkB,OAAO,WAAW,OAAO;AAAA,UAC3C,aAAa,OAAO;AAAA,UACpB,eAAe;AAAA,QACjB;AAAA,QACA,GAAI,WAAW,EAAE,oBAAoB,MAAM;AAAA,MAC7C;AAAA,MACA,CAAC,QAAQ;AACP,YAAI,MAAM;AAEV,YAAI,GAAG,QAAQ,CAAC,UAAU;AACxB,iBAAO;AAAA,QACT,CAAC;AAED,YAAI,GAAG,OAAO,MAAM;AAClB,gBAAM,SAAS,IAAI,cAAc;AACjC,cAAI,SAAc;AAElB,mBAAS,KAAK,MAAM,GAAG;AAEvB,cAAI,SAAS,OAAO,UAAU,KAAK;AACjC,mBAAO,OAAO;AAAA,cACZ,SAAS;AAAA,cAET,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAEA,kBAAQ;AAAA,YACN,MAAM;AAAA,YAEN,SAAS;AAAA,UACX,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH,CAAC;AAED,QAAI,MAAM,OAAO;AACjB,QAAI,IAAI;AAAA,EACV,CAAC;AACH;;;AC1GA,OAAOC,WAAU;AACjB,OAAOC,YAAW;AAWX,SAAS,kBACd,aACA,cACA,QAcC;AACD,QAAM,UAAqC;AAAA,IACzC,WAAW,gBAAgB;AAAA,IAC3B,WAAW,eAAe;AAAA,IAC1B,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,aAAa;AAAA,MACX,OAAO,OAAO;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,UAAQ,OAAO,YAAY,SAAS,OAAO,UAAU;AACrD,UAAQ,YAAY;AAEpB,QAAM,UAAU,KAAK,UAAU,OAAO;AAEtC,QAAM,UAAU,cAAc,OAAO,IAAI,EAAE;AAC3C,QAAM,UAAU,QAAQ,WAAW,UAAU;AAC7C,QAAM,SAAS,UAAUC,SAAQC;AAEjC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,OAAO;AAAA,MACjB,GAAG,OAAO;AAAA,MACV;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,kBAAkB,OAAO,WAAW,OAAO;AAAA,UAC3C,aAAa,OAAO;AAAA,UACpB,eAAe;AAAA,QACjB;AAAA,QACA,GAAI,WAAW,EAAE,oBAAoB,MAAM;AAAA,MAC7C;AAAA,MACA,CAAC,QAAQ;AACP,YAAI,MAAM;AAEV,YAAI,GAAG,QAAQ,CAAC,UAAU;AACxB,iBAAO;AAAA,QACT,CAAC;AAED,YAAI,GAAG,OAAO,MAAM;AAClB,gBAAM,SAAS,IAAI,cAAc;AACjC,cAAI,SAAc;AAElB,mBAAS,KAAK,MAAM,GAAG;AAEvB,cAAI,SAAS,OAAO,UAAU,KAAK;AACjC,mBAAO,OAAO;AAAA,cACZ,SAAS;AAAA,cACT,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAEA,kBAAQ;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH,CAAC;AAED,QAAI,MAAM,OAAO;AACjB,QAAI,IAAI;AAAA,EACV,CAAC;AACH;;;ACtFO,IAAM,MAAN,MAAM,KAAI;AAAA,EACP;AAAA,EACA;AAAA,EAER,YAAY,QAAwB;AAClC,QAAI,OAAO,SAAS,YAAY;AAC9B,YAAM,cAAoC,oBAAoB;AAE9D,WAAK,SAAS;AAAA,QACZ,GAAG;AAAA,QACH,OAAO,YAAY;AAAA,QACnB,WAAW,YAAY;AAAA,QACvB,eAAe,YAAY;AAAA,QAC3B,cAAc,YAAY;AAAA,QAC1B,YAAY,YAAY;AAAA,MAC1B;AAAA,IACF,OAAO;AACL,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,MAAM,iBAA+B;AACnC,QAAI,KAAK,SAAS,CAAC,KAAK,eAAe,KAAK,KAAK,GAAG;AAClD,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,QAAa,MAAM,aAAa,KAAK,MAAM;AAC/C,YAAQ,KAAK,MAAM,KAAK;AACxB,QAAI,CAAC,MAAO;AACZ,SAAK,QAAQ;AACb,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,UAA0B;AAClD,UAAM,MAAM;AAAA,MACV,OAAO,KAAK,OAAO;AAAA,MACnB,YAAY,KAAK,OAAO;AAAA,MACxB,WAAW,eAAe;AAAA,MAC1B,WAAW;AAAA,MACX,WAAW,gBAAgB;AAAA,IAC7B;AAEA,UAAM,OAAO,YAAY,KAAK,KAAK,OAAO,UAAU;AAEpD,UAAM,aAAa;AAAA,MACjB,SAAS,IAAI,KAAK;AAAA,MAClB,cAAc,IAAI,UAAU;AAAA,MAC5B,aAAa,IAAI,SAAS;AAAA,MAC1B,aAAa,IAAI,SAAS;AAAA,MAC1B,aAAa,IAAI,SAAS;AAAA,MAC1B,QAAQ,IAAI;AAAA,MACZ;AAAA,IACF,EAAE,KAAK,GAAG;AAEV,UAAM,UAAU,cAAc,KAAK,OAAO,IAAI,EAAE;AAEhD,WAAO,UAAU,aAAa;AAAA,EAChC;AAAA,EACA,MAAM,SAAS,OAAyD;AACtE,UAAM,QAAQ,MAAM,KAAK,eAAe;AAExC,QAAI,CAAC,MAAO;AAEZ,QAAI,WAAgB,MAAM;AAAA,MACxB,MAAM;AAAA,MACN;AAAA,MACA,KAAK;AAAA,IACP;AACA,QAAI,CAAC,SAAU;AAEf,WAAO,KAAK,kBAAkB,SAAS,KAAK,YAAY,SAAS;AAAA,EACnE;AAAA,EAEA,MAAM,WAAW,OAAmD;AAClE,QAAI,QAAQ,MAAM,KAAK,eAAe;AAEtC,QAAI,CAAC,MAAO;AAEZ,UAAM,WAAgB,MAAM;AAAA,MAC1B,MAAM;AAAA,MACN;AAAA,MACA,KAAK;AAAA,IACP;AAEA,WAAO,SAAS;AAAA,EAClB;AAAA,EACA,MAAM,YAAY,OAAoD;AACpE,UAAM,QAAQ,MAAM,KAAK,eAAe;AACxC,QAAI,CAAC,MAAO;AACZ,UAAM,WAAgB,MAAM,cAAc,MAAM,OAAO,OAAO,KAAK,MAAM;AAEzE,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,OAAwB,gCAAgC,IAAI,KAAK;AAAA,EAEzD,eAAe,OAA6C;AAClE,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,SAAS,KAAK,kBAAkB,MAAM,cAAc,EAAE,QAAQ;AAEpE,WAAO,OAAO,SAAS,KAAI;AAAA,EAC7B;AAAA,EAEQ,kBAAkB,OAAqB;AAC7C,UAAM,OAAO,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC;AACrC,UAAM,QAAQ,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI;AAC1C,UAAM,MAAM,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC;AACpC,UAAM,OAAO,OAAO,MAAM,MAAM,GAAG,EAAE,CAAC;AACtC,UAAM,SAAS,OAAO,MAAM,MAAM,IAAI,EAAE,CAAC;AACzC,UAAM,SAAS,OAAO,MAAM,MAAM,IAAI,EAAE,CAAC;AAEzC,WAAO,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,KAAK,MAAM,QAAQ,MAAM,CAAC;AAAA,EAClE;AACF;","names":["fs","path","path","fs","http","https","randomBytes","https","http","http","https","https","http","http","https","https","http"]}
1
+ {"version":3,"sources":["../src/services/requestToken.ts","../src/constants/urls.ts","../src/services/requestCreateOrder.ts","../src/utils/nonce.ts","../src/utils/timestamp.ts","../src/utils/signature.ts","../src/services/requestRefundOrder.ts","../src/services/requestQueryOrder.ts","../src/client/c2b.ts","../src/utils/keys.ts"],"sourcesContent":["import http from \"http\";\r\nimport https from \"https\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\nimport { TelebirrConfig } from \"../types/telebirrConfig\";\r\n\r\nexport function requestToken(config: TelebirrConfig) {\r\n const isHttps = TELEBIRR_URLS[config.mode].apiBase.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n ` ${TELEBIRR_URLS[config.mode].apiBase}/payment/v1/token`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"X-APP-Key\": config.appId,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let body = \"\";\r\n\r\n res.on(\"data\", (chunk) => (body += chunk));\r\n res.on(\"end\", () => resolve(body));\r\n }\r\n );\r\n\r\n req.on(\"error\", reject);\r\n req.write(JSON.stringify({ appSecret: config.appSecret }));\r\n req.end();\r\n });\r\n}\r\n","export const TELEBIRR_URLS = {\r\n sandbox: {\r\n apiBase:\r\n \"https://developerportal.ethiotelebirr.et:38443/apiaccess/payment/gateway\",\r\n webBase:\r\n \"https://developerportal.ethiotelebirr.et:38443/payment/web/paygate?\",\r\n },\r\n production: {\r\n apiBase:\r\n \"https://telebirrappcube.ethiomobilemoney.et:38443/apiaccess/payment/gateway\",\r\n webBase:\r\n \"https://telebirrappcube.ethiomobilemoney.et:38443/payment/web/paygate?\",\r\n },\r\n simulate: {\r\n apiBase: \"https://telebirr-node-simulator.onrender.com\",\r\n webBase: \"https://telebirr-node-simulator.onrender.com/web/?\",\r\n },\r\n};\r\n\r\nexport const CHECKOUT_OTHER_PARAMS = \"&version=1.0&trade_type=Checkout\";\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport {\r\n GenerateCheckoutUrlInput,\r\n CreateOrderResponse,\r\n TelebirrPreorderRequest,\r\n} from \"../types/createOrder\";\r\nimport { createNonceStr } from \"../utils/nonce\";\r\nimport { createTimestamp } from \"../utils/timestamp\";\r\nimport { signRequest } from \"../utils/signature\";\r\nimport { TelebirrMode } from \"../types/telebirrConfig\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\n\r\nexport function requestCreateOrder(\r\n fabricToken: string,\r\n input: GenerateCheckoutUrlInput,\r\n config: {\r\n mode: TelebirrMode;\r\n appId: string;\r\n appSecret: string;\r\n merchantAppId: string;\r\n merchantCode: string;\r\n notifyUrl: string;\r\n redirectUrl: string;\r\n privateKey: string;\r\n http: boolean;\r\n }\r\n): Promise<{\r\n message: string;\r\n data: CreateOrderResponse;\r\n}> {\r\n const reqBody: TelebirrPreorderRequest = {\r\n timestamp: createTimestamp(),\r\n nonce_str: createNonceStr(),\r\n method: \"payment.preorder\",\r\n version: \"1.0\",\r\n biz_content: {\r\n appid: config.merchantAppId,\r\n merch_code: config.merchantCode,\r\n merch_order_id: input.merchOrderId,\r\n notify_url: config.notifyUrl,\r\n redirect_url: config.redirectUrl,\r\n trade_type: \"Checkout\",\r\n title: input.title,\r\n total_amount: input.amount,\r\n trans_currency: \"ETB\",\r\n timeout_express: \"120m\",\r\n business_type: \"BuyGoods\",\r\n payee_type: \"3000\",\r\n payee_identifier: config.merchantCode,\r\n payee_identifier_type: \"04\",\r\n callback_info: \"From web\",\r\n },\r\n };\r\n\r\n reqBody.sign = signRequest(reqBody, config.privateKey);\r\n reqBody.sign_type = \"SHA256WithRSA\";\r\n\r\n const payload = JSON.stringify(reqBody);\r\n\r\n const baseUrl = TELEBIRR_URLS[config.mode].apiBase;\r\n const isHttps = baseUrl.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n `${baseUrl}/payment/v1/merchant/preOrder`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Content-Length\": Buffer.byteLength(payload),\r\n \"X-APP-Key\": config.appId,\r\n Authorization: fabricToken,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let raw = \"\";\r\n\r\n res.on(\"data\", (chunk) => {\r\n raw += chunk;\r\n });\r\n\r\n res.on(\"end\", () => {\r\n const status = res.statusCode || 0;\r\n let parsed: any = raw;\r\n\r\n parsed = JSON.parse(raw);\r\n\r\n if (status < 200 || status >= 300) {\r\n return reject({\r\n message: \"Telebirr preorder request failed\",\r\n data: parsed,\r\n });\r\n }\r\n\r\n resolve({\r\n message: \"Telebirr preorder request successful\",\r\n data: parsed,\r\n });\r\n });\r\n }\r\n );\r\n\r\n req.on(\"error\", (err) => {\r\n reject({\r\n message: \"Telebirr preorder network error\",\r\n data: err,\r\n });\r\n });\r\n\r\n req.write(payload);\r\n req.end();\r\n });\r\n}\r\n","import { randomBytes } from \"crypto\";\r\n\r\nexport function createNonceStr(): string {\r\n const bytes = Math.ceil(16);\r\n return randomBytes(bytes).toString(\"hex\").slice(0, 32);\r\n}\r\n","export function createTimestamp(): string {\r\n return Math.floor(Date.now() / 1000).toString();\r\n}\r\n","import crypto from \"crypto\";\r\n\r\nfunction flattenParams(params: Record<string, any>): Record<string, string> {\r\n const flat: Record<string, string> = {};\r\n\r\n for (const key in params) {\r\n const value = params[key];\r\n\r\n if (\r\n value === undefined ||\r\n value === null ||\r\n value === \"\" ||\r\n key === \"sign\" ||\r\n key === \"signType\" ||\r\n key === \"sign_type\"\r\n ) {\r\n continue;\r\n }\r\n\r\n if (key === \"biz_content\" && typeof value === \"object\") {\r\n for (const bizKey in value) {\r\n const bizValue = value[bizKey];\r\n if (bizValue !== undefined && bizValue !== null && bizValue !== \"\") {\r\n flat[bizKey] = String(bizValue);\r\n }\r\n }\r\n } else {\r\n flat[key] = String(value);\r\n }\r\n }\r\n\r\n return flat;\r\n}\r\n\r\nexport function buildSignString(params: Record<string, any>): string {\r\n const flat = flattenParams(params);\r\n\r\n return Object.keys(flat)\r\n .sort()\r\n .map((key) => `${key}=${flat[key]}`)\r\n .join(\"&\");\r\n}\r\n\r\nexport function signRequest(\r\n data: Record<string, any>,\r\n privateKey: string\r\n): string {\r\n const signString = buildSignString(data);\r\n\r\n return crypto\r\n .createSign(\"RSA-SHA256\")\r\n .update(signString, \"utf8\")\r\n .sign(privateKey, \"base64\");\r\n}\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport { createNonceStr } from \"../utils/nonce\";\r\nimport { createTimestamp } from \"../utils/timestamp\";\r\nimport { signRequest } from \"../utils/signature\";\r\nimport { TelebirrMode } from \"../types/telebirrConfig\";\r\nimport {\r\n RefundInput,\r\n RefundResponse,\r\n TelebirrRefundRequest,\r\n} from \"../types/refund\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\n\r\nexport function requestRefund(\r\n fabricToken: string,\r\n input: RefundInput,\r\n config: {\r\n mode: TelebirrMode;\r\n appId: string;\r\n merchantAppId: string;\r\n merchantCode: string;\r\n privateKey: string;\r\n http: boolean;\r\n }\r\n): Promise<{\r\n data: RefundResponse;\r\n message: string;\r\n}> {\r\n const reqBody: TelebirrRefundRequest = {\r\n timestamp: createTimestamp(),\r\n nonce_str: createNonceStr(),\r\n method: \"payment.refund\",\r\n version: \"1.0\",\r\n biz_content: {\r\n appid: config.merchantAppId,\r\n merch_code: config.merchantCode,\r\n merch_order_id: input.merchOrderId,\r\n trans_currency: \"ETB\",\r\n actual_amount: input.amount,\r\n refund_request_no: input.refundRequestNo,\r\n refund_reason: input.refundReason,\r\n },\r\n };\r\n\r\n reqBody.sign = signRequest(reqBody, config.privateKey);\r\n reqBody.sign_type = \"SHA256WithRSA\";\r\n\r\n const payload = JSON.stringify(reqBody);\r\n\r\n const baseUrl = TELEBIRR_URLS[config.mode].apiBase;\r\n const isHttps = baseUrl.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n `${baseUrl}/payment/v1/merchant/refund`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Content-Length\": Buffer.byteLength(payload),\r\n \"X-APP-Key\": config.appId,\r\n Authorization: fabricToken,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let raw = \"\";\r\n\r\n res.on(\"data\", (chunk) => {\r\n raw += chunk;\r\n });\r\n\r\n res.on(\"end\", () => {\r\n const status = res.statusCode || 0;\r\n let parsed: any = raw;\r\n\r\n parsed = JSON.parse(raw);\r\n\r\n if (status < 200 || status >= 300) {\r\n return reject({\r\n message: \"Telebirr refund request failed\",\r\n\r\n data: parsed,\r\n });\r\n }\r\n\r\n resolve({\r\n data: parsed,\r\n\r\n message: \"Telebirr refund request successful\",\r\n });\r\n });\r\n }\r\n );\r\n\r\n req.on(\"error\", (err) => {\r\n reject({\r\n message: \"Telebirr refund network error\",\r\n data: err,\r\n });\r\n });\r\n\r\n req.write(payload);\r\n req.end();\r\n });\r\n}\r\n","import http from \"http\";\r\nimport https from \"https\";\r\nimport {\r\n TelebirrQueryorderRequest,\r\n QueryOrderResponse,\r\n} from \"../types/queryOrder\";\r\nimport { createNonceStr } from \"../utils/nonce\";\r\nimport { createTimestamp } from \"../utils/timestamp\";\r\nimport { signRequest } from \"../utils/signature\";\r\nimport { TelebirrMode } from \"../types/telebirrConfig\";\r\nimport { TELEBIRR_URLS } from \"../constants/urls\";\r\n\r\nexport function requestQueryOrder(\r\n fabricToken: string,\r\n merchOrderId: string,\r\n config: {\r\n appId: string;\r\n appSecret: string;\r\n merchantAppId: string;\r\n merchantCode: string;\r\n privateKey: string;\r\n notifyUrl: string;\r\n redirectUrl: string;\r\n mode: TelebirrMode;\r\n http: boolean;\r\n }\r\n): Promise<{\r\n data: QueryOrderResponse;\r\n message: string;\r\n}> {\r\n const reqBody: TelebirrQueryorderRequest = {\r\n timestamp: createTimestamp(),\r\n nonce_str: createNonceStr(),\r\n method: \"payment.queryorder\",\r\n version: \"1.0\",\r\n biz_content: {\r\n appid: config.merchantAppId,\r\n merch_code: config.merchantCode,\r\n merch_order_id: merchOrderId,\r\n },\r\n };\r\n\r\n reqBody.sign = signRequest(reqBody, config.privateKey);\r\n reqBody.sign_type = \"SHA256WithRSA\";\r\n\r\n const payload = JSON.stringify(reqBody);\r\n\r\n const baseUrl = TELEBIRR_URLS[config.mode].apiBase;\r\n const isHttps = baseUrl.startsWith(\"https://\");\r\n const client = isHttps ? https : http;\r\n\r\n return new Promise((resolve, reject) => {\r\n const req = client.request(\r\n `${baseUrl}/payment/v1/merchant/queryOrder`,\r\n {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n \"Content-Length\": Buffer.byteLength(payload),\r\n \"X-APP-Key\": config.appId,\r\n Authorization: fabricToken,\r\n },\r\n ...(isHttps && { rejectUnauthorized: false }),\r\n },\r\n (res) => {\r\n let raw = \"\";\r\n\r\n res.on(\"data\", (chunk) => {\r\n raw += chunk;\r\n });\r\n\r\n res.on(\"end\", () => {\r\n const status = res.statusCode || 0;\r\n let parsed: any = raw;\r\n\r\n parsed = JSON.parse(raw);\r\n\r\n if (status < 200 || status >= 300) {\r\n return reject({\r\n message: \"Telebirr queryOrder request failed\",\r\n data: parsed,\r\n });\r\n }\r\n\r\n resolve({\r\n data: parsed,\r\n message: \"Telebirr queryOrder request successful\",\r\n });\r\n });\r\n }\r\n );\r\n\r\n req.on(\"error\", (err) => {\r\n reject({\r\n message: \"Telebirr queryOrder network error\",\r\n data: err,\r\n });\r\n });\r\n\r\n req.write(payload);\r\n req.end();\r\n });\r\n}\r\n","import { TelebirrConfig } from \"../types/telebirrConfig\";\r\nimport { FabricTokenResponse } from \"../types/fabricToken\";\r\nimport { GenerateCheckoutUrlInput } from \"../types/createOrder\";\r\nimport { QueryOrderResponse } from \"../types/queryOrder\";\r\nimport { RefundInput, RefundResponse } from \"../types/refund\";\r\nimport { requestToken } from \"../services/requestToken\";\r\nimport { requestCreateOrder } from \"../services/requestCreateOrder\";\r\nimport { requestRefund } from \"../services/requestRefundOrder\";\r\nimport { requestQueryOrder } from \"../services/requestQueryOrder\";\r\nimport { TELEBIRR_URLS, CHECKOUT_OTHER_PARAMS } from \"../constants/urls\";\r\nimport { signRequest } from \"../utils/signature\";\r\nimport { createTimestamp } from \"../utils/timestamp\";\r\nimport { createNonceStr } from \"../utils/nonce\";\r\n\r\nexport class C2B {\r\n private token?: typeof FabricTokenResponse;\r\n private config: TelebirrConfig;\r\n\r\n constructor(config: TelebirrConfig) {\r\n this.config = config;\r\n }\r\n\r\n async getFabricToken(): Promise<any> {\r\n if (this.token && !this.isTokenExpired(this.token)) {\r\n return this.token;\r\n }\r\n\r\n let token: any = await requestToken(this.config);\r\n token = JSON.parse(token);\r\n if (!token) return;\r\n this.token = token;\r\n return token;\r\n }\r\n\r\n private createCheckoutUrl(prepayId: string): string {\r\n const map = {\r\n appid: this.config.merchantAppId,\r\n merch_code: this.config.merchantCode,\r\n nonce_str: createNonceStr(),\r\n prepay_id: prepayId,\r\n timestamp: createTimestamp(),\r\n };\r\n\r\n const sign = signRequest(map, this.config.privateKey);\r\n\r\n const rawRequest = [\r\n `appid=${map.appid}`,\r\n `merch_code=${map.merch_code}`,\r\n `nonce_str=${map.nonce_str}`,\r\n `prepay_id=${map.prepay_id}`,\r\n `timestamp=${map.timestamp}`,\r\n `sign=${sign}`,\r\n `sign_type=SHA256WithRSA`,\r\n ].join(\"&\");\r\n\r\n const webBase = TELEBIRR_URLS[this.config.mode].webBase;\r\n\r\n return webBase + rawRequest + CHECKOUT_OTHER_PARAMS;\r\n }\r\n async checkout(input: GenerateCheckoutUrlInput): Promise<string | void> {\r\n const token = await this.getFabricToken();\r\n\r\n if (!token) return;\r\n\r\n let response: any = await requestCreateOrder(\r\n token.token,\r\n input,\r\n this.config,\r\n );\r\n if (!response) return;\r\n\r\n return this.createCheckoutUrl(response.data.biz_content.prepay_id);\r\n }\r\n\r\n async queryOrder(input: string): Promise<QueryOrderResponse | void> {\r\n let token = await this.getFabricToken();\r\n\r\n if (!token) return;\r\n\r\n const response: any = await requestQueryOrder(\r\n token.token,\r\n input,\r\n this.config,\r\n );\r\n\r\n return response.data;\r\n }\r\n async refundOrder(input: RefundInput): Promise<RefundResponse | void> {\r\n const token = await this.getFabricToken();\r\n if (!token) return;\r\n const response: any = await requestRefund(token.token, input, this.config);\r\n\r\n return response.data;\r\n }\r\n\r\n private static readonly TOKEN_EXPIRY_SAFETY_WINDOW_MS = 5 * 60 * 1000;\r\n\r\n private isTokenExpired(token?: typeof FabricTokenResponse): boolean {\r\n if (!token) {\r\n return true;\r\n }\r\n\r\n const now = Date.now();\r\n const expiry = this.parseTelebirrDate(token.expirationDate).getTime();\r\n\r\n return now >= expiry - C2B.TOKEN_EXPIRY_SAFETY_WINDOW_MS;\r\n }\r\n\r\n private parseTelebirrDate(value: string): Date {\r\n const year = Number(value.slice(0, 4));\r\n const month = Number(value.slice(4, 6)) - 1;\r\n const day = Number(value.slice(6, 8));\r\n const hour = Number(value.slice(8, 10));\r\n const minute = Number(value.slice(10, 12));\r\n const second = Number(value.slice(12, 14));\r\n\r\n return new Date(Date.UTC(year, month, day, hour, minute, second));\r\n }\r\n}\r\n","import { generateKeyPairSync } from \"crypto\";\r\nimport fs from \"fs\";\r\nimport path from \"path\";\r\n\r\nexport function generatePrivateKey(): string {\r\n const { privateKey } = generateKeyPairSync(\"rsa\", {\r\n modulusLength: 2048,\r\n privateKeyEncoding: {\r\n type: \"pkcs1\",\r\n format: \"pem\",\r\n },\r\n publicKeyEncoding: {\r\n type: \"pkcs1\",\r\n format: \"pem\",\r\n },\r\n });\r\n\r\n return privateKey;\r\n}\r\n\r\nexport interface KeyPairOptions {\r\n dir?: string; // default: process.cwd()\r\n privateKeyName?: string;\r\n publicKeyName?: string;\r\n overwrite?: boolean; // default: false\r\n}\r\n\r\nexport function generateKeys(options: KeyPairOptions = {}): {\r\n privateKeyPath: string;\r\n publicKeyPath: string;\r\n} {\r\n const {\r\n dir = process.cwd(),\r\n privateKeyName = \"telebirr_private.pem\",\r\n publicKeyName = \"telebirr_public.pem\",\r\n overwrite = false,\r\n } = options;\r\n\r\n const privateKeyPath = path.join(dir, privateKeyName);\r\n const publicKeyPath = path.join(dir, publicKeyName);\r\n\r\n const exists = fs.existsSync(privateKeyPath) && fs.existsSync(publicKeyPath);\r\n\r\n if (exists && !overwrite) {\r\n return { privateKeyPath, publicKeyPath };\r\n }\r\n\r\n const { privateKey, publicKey } = generateKeyPairSync(\"rsa\", {\r\n modulusLength: 2048,\r\n publicKeyEncoding: {\r\n type: \"pkcs1\",\r\n format: \"pem\",\r\n },\r\n privateKeyEncoding: {\r\n type: \"pkcs1\",\r\n format: \"pem\",\r\n },\r\n });\r\n\r\n fs.writeFileSync(privateKeyPath, privateKey, { mode: 0o600 });\r\n fs.writeFileSync(publicKeyPath, publicKey);\r\n\r\n return { privateKeyPath, publicKeyPath };\r\n}\r\n"],"mappings":";AAAA,OAAO,UAAU;AACjB,OAAO,WAAW;;;ACDX,IAAM,gBAAgB;AAAA,EAC3B,SAAS;AAAA,IACP,SACE;AAAA,IACF,SACE;AAAA,EACJ;AAAA,EACA,YAAY;AAAA,IACV,SACE;AAAA,IACF,SACE;AAAA,EACJ;AAAA,EACA,UAAU;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACF;AAEO,IAAM,wBAAwB;;;ADd9B,SAAS,aAAa,QAAwB;AACnD,QAAM,UAAU,cAAc,OAAO,IAAI,EAAE,QAAQ,WAAW,UAAU;AACxE,QAAM,SAAS,UAAU,QAAQ;AACjC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,OAAO;AAAA,MACjB,IAAI,cAAc,OAAO,IAAI,EAAE,OAAO;AAAA,MACtC;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,aAAa,OAAO;AAAA,QACtB;AAAA,QACA,GAAI,WAAW,EAAE,oBAAoB,MAAM;AAAA,MAC7C;AAAA,MACA,CAAC,QAAQ;AACP,YAAI,OAAO;AAEX,YAAI,GAAG,QAAQ,CAAC,UAAW,QAAQ,KAAM;AACzC,YAAI,GAAG,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,GAAG,SAAS,MAAM;AACtB,QAAI,MAAM,KAAK,UAAU,EAAE,WAAW,OAAO,UAAU,CAAC,CAAC;AACzD,QAAI,IAAI;AAAA,EACV,CAAC;AACH;;;AE/BA,OAAOA,WAAU;AACjB,OAAOC,YAAW;;;ACDlB,SAAS,mBAAmB;AAErB,SAAS,iBAAyB;AACvC,QAAM,QAAQ,KAAK,KAAK,EAAE;AAC1B,SAAO,YAAY,KAAK,EAAE,SAAS,KAAK,EAAE,MAAM,GAAG,EAAE;AACvD;;;ACLO,SAAS,kBAA0B;AACxC,SAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,EAAE,SAAS;AAChD;;;ACFA,OAAO,YAAY;AAEnB,SAAS,cAAc,QAAqD;AAC1E,QAAM,OAA+B,CAAC;AAEtC,aAAW,OAAO,QAAQ;AACxB,UAAM,QAAQ,OAAO,GAAG;AAExB,QACE,UAAU,UACV,UAAU,QACV,UAAU,MACV,QAAQ,UACR,QAAQ,cACR,QAAQ,aACR;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,iBAAiB,OAAO,UAAU,UAAU;AACtD,iBAAW,UAAU,OAAO;AAC1B,cAAM,WAAW,MAAM,MAAM;AAC7B,YAAI,aAAa,UAAa,aAAa,QAAQ,aAAa,IAAI;AAClE,eAAK,MAAM,IAAI,OAAO,QAAQ;AAAA,QAChC;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,GAAG,IAAI,OAAO,KAAK;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,QAAqC;AACnE,QAAM,OAAO,cAAc,MAAM;AAEjC,SAAO,OAAO,KAAK,IAAI,EACpB,KAAK,EACL,IAAI,CAAC,QAAQ,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC,EAAE,EAClC,KAAK,GAAG;AACb;AAEO,SAAS,YACd,MACA,YACQ;AACR,QAAM,aAAa,gBAAgB,IAAI;AAEvC,SAAO,OACJ,WAAW,YAAY,EACvB,OAAO,YAAY,MAAM,EACzB,KAAK,YAAY,QAAQ;AAC9B;;;AHxCO,SAAS,mBACd,aACA,OACA,QAcC;AACD,QAAM,UAAmC;AAAA,IACvC,WAAW,gBAAgB;AAAA,IAC3B,WAAW,eAAe;AAAA,IAC1B,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,aAAa;AAAA,MACX,OAAO,OAAO;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,gBAAgB,MAAM;AAAA,MACtB,YAAY,OAAO;AAAA,MACnB,cAAc,OAAO;AAAA,MACrB,YAAY;AAAA,MACZ,OAAO,MAAM;AAAA,MACb,cAAc,MAAM;AAAA,MACpB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,kBAAkB,OAAO;AAAA,MACzB,uBAAuB;AAAA,MACvB,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,UAAQ,OAAO,YAAY,SAAS,OAAO,UAAU;AACrD,UAAQ,YAAY;AAEpB,QAAM,UAAU,KAAK,UAAU,OAAO;AAEtC,QAAM,UAAU,cAAc,OAAO,IAAI,EAAE;AAC3C,QAAM,UAAU,QAAQ,WAAW,UAAU;AAC7C,QAAM,SAAS,UAAUC,SAAQC;AAEjC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,OAAO;AAAA,MACjB,GAAG,OAAO;AAAA,MACV;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,kBAAkB,OAAO,WAAW,OAAO;AAAA,UAC3C,aAAa,OAAO;AAAA,UACpB,eAAe;AAAA,QACjB;AAAA,QACA,GAAI,WAAW,EAAE,oBAAoB,MAAM;AAAA,MAC7C;AAAA,MACA,CAAC,QAAQ;AACP,YAAI,MAAM;AAEV,YAAI,GAAG,QAAQ,CAAC,UAAU;AACxB,iBAAO;AAAA,QACT,CAAC;AAED,YAAI,GAAG,OAAO,MAAM;AAClB,gBAAM,SAAS,IAAI,cAAc;AACjC,cAAI,SAAc;AAElB,mBAAS,KAAK,MAAM,GAAG;AAEvB,cAAI,SAAS,OAAO,UAAU,KAAK;AACjC,mBAAO,OAAO;AAAA,cACZ,SAAS;AAAA,cACT,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAEA,kBAAQ;AAAA,YACN,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH,CAAC;AAED,QAAI,MAAM,OAAO;AACjB,QAAI,IAAI;AAAA,EACV,CAAC;AACH;;;AInHA,OAAOC,WAAU;AACjB,OAAOC,YAAW;AAYX,SAAS,cACd,aACA,OACA,QAWC;AACD,QAAM,UAAiC;AAAA,IACrC,WAAW,gBAAgB;AAAA,IAC3B,WAAW,eAAe;AAAA,IAC1B,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,aAAa;AAAA,MACX,OAAO,OAAO;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,gBAAgB,MAAM;AAAA,MACtB,gBAAgB;AAAA,MAChB,eAAe,MAAM;AAAA,MACrB,mBAAmB,MAAM;AAAA,MACzB,eAAe,MAAM;AAAA,IACvB;AAAA,EACF;AAEA,UAAQ,OAAO,YAAY,SAAS,OAAO,UAAU;AACrD,UAAQ,YAAY;AAEpB,QAAM,UAAU,KAAK,UAAU,OAAO;AAEtC,QAAM,UAAU,cAAc,OAAO,IAAI,EAAE;AAC3C,QAAM,UAAU,QAAQ,WAAW,UAAU;AAC7C,QAAM,SAAS,UAAUC,SAAQC;AAEjC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,OAAO;AAAA,MACjB,GAAG,OAAO;AAAA,MACV;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,kBAAkB,OAAO,WAAW,OAAO;AAAA,UAC3C,aAAa,OAAO;AAAA,UACpB,eAAe;AAAA,QACjB;AAAA,QACA,GAAI,WAAW,EAAE,oBAAoB,MAAM;AAAA,MAC7C;AAAA,MACA,CAAC,QAAQ;AACP,YAAI,MAAM;AAEV,YAAI,GAAG,QAAQ,CAAC,UAAU;AACxB,iBAAO;AAAA,QACT,CAAC;AAED,YAAI,GAAG,OAAO,MAAM;AAClB,gBAAM,SAAS,IAAI,cAAc;AACjC,cAAI,SAAc;AAElB,mBAAS,KAAK,MAAM,GAAG;AAEvB,cAAI,SAAS,OAAO,UAAU,KAAK;AACjC,mBAAO,OAAO;AAAA,cACZ,SAAS;AAAA,cAET,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAEA,kBAAQ;AAAA,YACN,MAAM;AAAA,YAEN,SAAS;AAAA,UACX,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH,CAAC;AAED,QAAI,MAAM,OAAO;AACjB,QAAI,IAAI;AAAA,EACV,CAAC;AACH;;;AC1GA,OAAOC,WAAU;AACjB,OAAOC,YAAW;AAWX,SAAS,kBACd,aACA,cACA,QAcC;AACD,QAAM,UAAqC;AAAA,IACzC,WAAW,gBAAgB;AAAA,IAC3B,WAAW,eAAe;AAAA,IAC1B,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,aAAa;AAAA,MACX,OAAO,OAAO;AAAA,MACd,YAAY,OAAO;AAAA,MACnB,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,UAAQ,OAAO,YAAY,SAAS,OAAO,UAAU;AACrD,UAAQ,YAAY;AAEpB,QAAM,UAAU,KAAK,UAAU,OAAO;AAEtC,QAAM,UAAU,cAAc,OAAO,IAAI,EAAE;AAC3C,QAAM,UAAU,QAAQ,WAAW,UAAU;AAC7C,QAAM,SAAS,UAAUC,SAAQC;AAEjC,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,OAAO;AAAA,MACjB,GAAG,OAAO;AAAA,MACV;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,kBAAkB,OAAO,WAAW,OAAO;AAAA,UAC3C,aAAa,OAAO;AAAA,UACpB,eAAe;AAAA,QACjB;AAAA,QACA,GAAI,WAAW,EAAE,oBAAoB,MAAM;AAAA,MAC7C;AAAA,MACA,CAAC,QAAQ;AACP,YAAI,MAAM;AAEV,YAAI,GAAG,QAAQ,CAAC,UAAU;AACxB,iBAAO;AAAA,QACT,CAAC;AAED,YAAI,GAAG,OAAO,MAAM;AAClB,gBAAM,SAAS,IAAI,cAAc;AACjC,cAAI,SAAc;AAElB,mBAAS,KAAK,MAAM,GAAG;AAEvB,cAAI,SAAS,OAAO,UAAU,KAAK;AACjC,mBAAO,OAAO;AAAA,cACZ,SAAS;AAAA,cACT,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAEA,kBAAQ;AAAA,YACN,MAAM;AAAA,YACN,SAAS;AAAA,UACX,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,GAAG,SAAS,CAAC,QAAQ;AACvB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH,CAAC;AAED,QAAI,MAAM,OAAO;AACjB,QAAI,IAAI;AAAA,EACV,CAAC;AACH;;;ACxFO,IAAM,MAAN,MAAM,KAAI;AAAA,EACP;AAAA,EACA;AAAA,EAER,YAAY,QAAwB;AAClC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,iBAA+B;AACnC,QAAI,KAAK,SAAS,CAAC,KAAK,eAAe,KAAK,KAAK,GAAG;AAClD,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,QAAa,MAAM,aAAa,KAAK,MAAM;AAC/C,YAAQ,KAAK,MAAM,KAAK;AACxB,QAAI,CAAC,MAAO;AACZ,SAAK,QAAQ;AACb,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,UAA0B;AAClD,UAAM,MAAM;AAAA,MACV,OAAO,KAAK,OAAO;AAAA,MACnB,YAAY,KAAK,OAAO;AAAA,MACxB,WAAW,eAAe;AAAA,MAC1B,WAAW;AAAA,MACX,WAAW,gBAAgB;AAAA,IAC7B;AAEA,UAAM,OAAO,YAAY,KAAK,KAAK,OAAO,UAAU;AAEpD,UAAM,aAAa;AAAA,MACjB,SAAS,IAAI,KAAK;AAAA,MAClB,cAAc,IAAI,UAAU;AAAA,MAC5B,aAAa,IAAI,SAAS;AAAA,MAC1B,aAAa,IAAI,SAAS;AAAA,MAC1B,aAAa,IAAI,SAAS;AAAA,MAC1B,QAAQ,IAAI;AAAA,MACZ;AAAA,IACF,EAAE,KAAK,GAAG;AAEV,UAAM,UAAU,cAAc,KAAK,OAAO,IAAI,EAAE;AAEhD,WAAO,UAAU,aAAa;AAAA,EAChC;AAAA,EACA,MAAM,SAAS,OAAyD;AACtE,UAAM,QAAQ,MAAM,KAAK,eAAe;AAExC,QAAI,CAAC,MAAO;AAEZ,QAAI,WAAgB,MAAM;AAAA,MACxB,MAAM;AAAA,MACN;AAAA,MACA,KAAK;AAAA,IACP;AACA,QAAI,CAAC,SAAU;AAEf,WAAO,KAAK,kBAAkB,SAAS,KAAK,YAAY,SAAS;AAAA,EACnE;AAAA,EAEA,MAAM,WAAW,OAAmD;AAClE,QAAI,QAAQ,MAAM,KAAK,eAAe;AAEtC,QAAI,CAAC,MAAO;AAEZ,UAAM,WAAgB,MAAM;AAAA,MAC1B,MAAM;AAAA,MACN;AAAA,MACA,KAAK;AAAA,IACP;AAEA,WAAO,SAAS;AAAA,EAClB;AAAA,EACA,MAAM,YAAY,OAAoD;AACpE,UAAM,QAAQ,MAAM,KAAK,eAAe;AACxC,QAAI,CAAC,MAAO;AACZ,UAAM,WAAgB,MAAM,cAAc,MAAM,OAAO,OAAO,KAAK,MAAM;AAEzE,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,OAAwB,gCAAgC,IAAI,KAAK;AAAA,EAEzD,eAAe,OAA6C;AAClE,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,SAAS,KAAK,kBAAkB,MAAM,cAAc,EAAE,QAAQ;AAEpE,WAAO,OAAO,SAAS,KAAI;AAAA,EAC7B;AAAA,EAEQ,kBAAkB,OAAqB;AAC7C,UAAM,OAAO,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC;AACrC,UAAM,QAAQ,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI;AAC1C,UAAM,MAAM,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC;AACpC,UAAM,OAAO,OAAO,MAAM,MAAM,GAAG,EAAE,CAAC;AACtC,UAAM,SAAS,OAAO,MAAM,MAAM,IAAI,EAAE,CAAC;AACzC,UAAM,SAAS,OAAO,MAAM,MAAM,IAAI,EAAE,CAAC;AAEzC,WAAO,IAAI,KAAK,KAAK,IAAI,MAAM,OAAO,KAAK,MAAM,QAAQ,MAAM,CAAC;AAAA,EAClE;AACF;;;ACtHA,SAAS,2BAA2B;AACpC,OAAO,QAAQ;AACf,OAAO,UAAU;AAyBV,SAAS,aAAa,UAA0B,CAAC,GAGtD;AACA,QAAM;AAAA,IACJ,MAAM,QAAQ,IAAI;AAAA,IAClB,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,YAAY;AAAA,EACd,IAAI;AAEJ,QAAM,iBAAiB,KAAK,KAAK,KAAK,cAAc;AACpD,QAAM,gBAAgB,KAAK,KAAK,KAAK,aAAa;AAElD,QAAM,SAAS,GAAG,WAAW,cAAc,KAAK,GAAG,WAAW,aAAa;AAE3E,MAAI,UAAU,CAAC,WAAW;AACxB,WAAO,EAAE,gBAAgB,cAAc;AAAA,EACzC;AAEA,QAAM,EAAE,YAAY,UAAU,IAAI,oBAAoB,OAAO;AAAA,IAC3D,eAAe;AAAA,IACf,mBAAmB;AAAA,MACjB,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,oBAAoB;AAAA,MAClB,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AAED,KAAG,cAAc,gBAAgB,YAAY,EAAE,MAAM,IAAM,CAAC;AAC5D,KAAG,cAAc,eAAe,SAAS;AAEzC,SAAO,EAAE,gBAAgB,cAAc;AACzC;","names":["http","https","https","http","http","https","https","http","http","https","https","http"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "telebirr-nodejs",
3
- "version": "1.1.7",
3
+ "version": "1.1.9",
4
4
  "description": "Unofficial Node.js SDK for Telebirr C2B payments with automatic request signing, Fabric token handling, checkout URL generation, simulator support, and simplified refunds & payment status APIs.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",