@waffo/waffo-node 2.0.4 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +84 -28
- package/dist/index.d.mts +283 -166
- package/dist/index.d.ts +283 -166
- package/dist/index.js +260 -342
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +232 -321
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -2
package/dist/index.js
CHANGED
|
@@ -22,279 +22,242 @@ function _interopNamespace(e) {
|
|
|
22
22
|
|
|
23
23
|
var crypto__namespace = /*#__PURE__*/_interopNamespace(crypto);
|
|
24
24
|
|
|
25
|
-
var __defProp = Object.defineProperty;
|
|
26
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
27
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
28
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
29
|
-
var __esm = (fn, res) => function __init() {
|
|
30
|
-
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
31
|
-
};
|
|
32
|
-
var __export = (target, all) => {
|
|
33
|
-
for (var name in all)
|
|
34
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
35
|
-
};
|
|
36
|
-
var __copyProps = (to, from, except, desc) => {
|
|
37
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
38
|
-
for (let key of __getOwnPropNames(from))
|
|
39
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
40
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
41
|
-
}
|
|
42
|
-
return to;
|
|
43
|
-
};
|
|
44
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
45
|
-
|
|
46
25
|
// src/types/config/environment.ts
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
"
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
["SANDBOX" /* SANDBOX */]: "https://api-sandbox.waffo.com/api/v1",
|
|
57
|
-
["PRODUCTION" /* PRODUCTION */]: "https://api.waffo.com/api/v1"
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
});
|
|
26
|
+
var Environment = /* @__PURE__ */ ((Environment2) => {
|
|
27
|
+
Environment2["SANDBOX"] = "SANDBOX";
|
|
28
|
+
Environment2["PRODUCTION"] = "PRODUCTION";
|
|
29
|
+
return Environment2;
|
|
30
|
+
})(Environment || {});
|
|
31
|
+
var EnvironmentBaseUrl = {
|
|
32
|
+
["SANDBOX" /* SANDBOX */]: "https://api-sandbox.waffo.com/api/v1",
|
|
33
|
+
["PRODUCTION" /* PRODUCTION */]: "https://api.waffo.com/api/v1"
|
|
34
|
+
};
|
|
61
35
|
|
|
62
36
|
// src/errors/waffo-error.ts
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
*/
|
|
90
|
-
toString() {
|
|
91
|
-
return `[${this.errorCode}] ${this.message}`;
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
exports.WaffoErrorCode = {
|
|
95
|
-
/** Invalid public key */
|
|
96
|
-
INVALID_PUBLIC_KEY: "S0002",
|
|
97
|
-
/** Failed to sign data */
|
|
98
|
-
SIGN_FAILED: "S0003",
|
|
99
|
-
/** Response signature verification failed */
|
|
100
|
-
VERIFY_FAILED: "S0004",
|
|
101
|
-
/** Request serialization failed */
|
|
102
|
-
SERIALIZE_FAILED: "S0005",
|
|
103
|
-
/** Unexpected error */
|
|
104
|
-
UNEXPECTED: "S0006",
|
|
105
|
-
/** Invalid private key */
|
|
106
|
-
INVALID_PRIVATE_KEY: "S0007"
|
|
107
|
-
};
|
|
37
|
+
var WaffoError = class _WaffoError extends Error {
|
|
38
|
+
/** Error code identifying the type of error */
|
|
39
|
+
errorCode;
|
|
40
|
+
/** The underlying error that caused this error, if any */
|
|
41
|
+
cause;
|
|
42
|
+
/**
|
|
43
|
+
* Creates a new WaffoError.
|
|
44
|
+
*
|
|
45
|
+
* @param errorCode - The error code (e.g., "S0003" for signing failure)
|
|
46
|
+
* @param message - Human-readable error message
|
|
47
|
+
* @param cause - The underlying error that caused this error
|
|
48
|
+
*/
|
|
49
|
+
constructor(errorCode, message, cause) {
|
|
50
|
+
super(message);
|
|
51
|
+
this.name = "WaffoError";
|
|
52
|
+
this.errorCode = errorCode;
|
|
53
|
+
this.cause = cause;
|
|
54
|
+
if (Error.captureStackTrace) {
|
|
55
|
+
Error.captureStackTrace(this, _WaffoError);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Returns a string representation of the error.
|
|
60
|
+
*/
|
|
61
|
+
toString() {
|
|
62
|
+
return `[${this.errorCode}] ${this.message}`;
|
|
108
63
|
}
|
|
109
|
-
}
|
|
64
|
+
};
|
|
65
|
+
var WaffoErrorCode = {
|
|
66
|
+
/** Invalid public key */
|
|
67
|
+
INVALID_PUBLIC_KEY: "S0002",
|
|
68
|
+
/** Failed to sign data */
|
|
69
|
+
SIGN_FAILED: "S0003",
|
|
70
|
+
/** Response signature verification failed */
|
|
71
|
+
VERIFY_FAILED: "S0004",
|
|
72
|
+
/** Request serialization failed */
|
|
73
|
+
SERIALIZE_FAILED: "S0005",
|
|
74
|
+
/** Unexpected error */
|
|
75
|
+
UNEXPECTED: "S0006",
|
|
76
|
+
/** Invalid private key */
|
|
77
|
+
INVALID_PRIVATE_KEY: "S0007"
|
|
78
|
+
};
|
|
110
79
|
|
|
111
80
|
// src/errors/waffo-unknown-status-error.ts
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
"
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
*/
|
|
143
|
-
toString() {
|
|
144
|
-
return `[${this.errorCode}] ${this.message}`;
|
|
145
|
-
}
|
|
146
|
-
};
|
|
81
|
+
var WaffoUnknownStatusError = class _WaffoUnknownStatusError extends Error {
|
|
82
|
+
/** Error code for network errors */
|
|
83
|
+
static CODE_NETWORK_ERROR = "S0001";
|
|
84
|
+
/** Error code for unknown server status */
|
|
85
|
+
static CODE_UNKNOWN_STATUS = "E0001";
|
|
86
|
+
/** Error code identifying the type of error */
|
|
87
|
+
errorCode;
|
|
88
|
+
/** The underlying error that caused this error, if any */
|
|
89
|
+
cause;
|
|
90
|
+
/**
|
|
91
|
+
* Creates a new WaffoUnknownStatusError.
|
|
92
|
+
*
|
|
93
|
+
* @param errorCode - The error code (e.g., "S0001" for network error)
|
|
94
|
+
* @param message - Human-readable error message
|
|
95
|
+
* @param cause - The underlying error that caused this error
|
|
96
|
+
*/
|
|
97
|
+
constructor(errorCode, message, cause) {
|
|
98
|
+
super(message);
|
|
99
|
+
this.name = "WaffoUnknownStatusError";
|
|
100
|
+
this.errorCode = errorCode;
|
|
101
|
+
this.cause = cause;
|
|
102
|
+
if (Error.captureStackTrace) {
|
|
103
|
+
Error.captureStackTrace(this, _WaffoUnknownStatusError);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Returns a string representation of the error.
|
|
108
|
+
*/
|
|
109
|
+
toString() {
|
|
110
|
+
return `[${this.errorCode}] ${this.message}`;
|
|
147
111
|
}
|
|
148
|
-
}
|
|
112
|
+
};
|
|
149
113
|
|
|
150
|
-
// src/
|
|
151
|
-
var
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
);
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
RsaUtils2.validatePublicKey = validatePublicKey;
|
|
267
|
-
function generateKeyPair() {
|
|
268
|
-
try {
|
|
269
|
-
const { privateKey, publicKey } = crypto__namespace.generateKeyPairSync("rsa", {
|
|
270
|
-
modulusLength: KEY_SIZE,
|
|
271
|
-
publicKeyEncoding: {
|
|
272
|
-
type: "spki",
|
|
273
|
-
format: "der"
|
|
274
|
-
},
|
|
275
|
-
privateKeyEncoding: {
|
|
276
|
-
type: "pkcs8",
|
|
277
|
-
format: "der"
|
|
278
|
-
}
|
|
279
|
-
});
|
|
280
|
-
return {
|
|
281
|
-
privateKey: privateKey.toString("base64"),
|
|
282
|
-
publicKey: publicKey.toString("base64")
|
|
283
|
-
};
|
|
284
|
-
} catch (error) {
|
|
285
|
-
throw new exports.WaffoError(
|
|
286
|
-
exports.WaffoErrorCode.SIGN_FAILED,
|
|
287
|
-
`Failed to generate key pair: ${error instanceof Error ? error.message : String(error)}`,
|
|
288
|
-
error instanceof Error ? error : void 0
|
|
289
|
-
);
|
|
290
|
-
}
|
|
114
|
+
// src/utils/rsa-utils.ts
|
|
115
|
+
var ALGORITHM = "RSA-SHA256";
|
|
116
|
+
var KEY_SIZE = 2048;
|
|
117
|
+
function sign(data, base64PrivateKey) {
|
|
118
|
+
try {
|
|
119
|
+
const privateKeyBuffer = Buffer.from(base64PrivateKey, "base64");
|
|
120
|
+
const signer = crypto__namespace.createSign(ALGORITHM);
|
|
121
|
+
signer.update(data, "utf8");
|
|
122
|
+
const signature = signer.sign({
|
|
123
|
+
key: privateKeyBuffer,
|
|
124
|
+
format: "der",
|
|
125
|
+
type: "pkcs8"
|
|
126
|
+
});
|
|
127
|
+
return signature.toString("base64");
|
|
128
|
+
} catch (error) {
|
|
129
|
+
throw new WaffoError(
|
|
130
|
+
WaffoErrorCode.SIGN_FAILED,
|
|
131
|
+
`Failed to sign data: ${error instanceof Error ? error.message : String(error)}`,
|
|
132
|
+
error instanceof Error ? error : void 0
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function verify(data, base64Signature, base64PublicKey) {
|
|
137
|
+
try {
|
|
138
|
+
const publicKeyBuffer = Buffer.from(base64PublicKey, "base64");
|
|
139
|
+
const signatureBuffer = Buffer.from(base64Signature, "base64");
|
|
140
|
+
const verifier = crypto__namespace.createVerify(ALGORITHM);
|
|
141
|
+
verifier.update(data, "utf8");
|
|
142
|
+
return verifier.verify(
|
|
143
|
+
{
|
|
144
|
+
key: publicKeyBuffer,
|
|
145
|
+
format: "der",
|
|
146
|
+
type: "spki"
|
|
147
|
+
},
|
|
148
|
+
signatureBuffer
|
|
149
|
+
);
|
|
150
|
+
} catch {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function validatePrivateKey(base64PrivateKey) {
|
|
155
|
+
if (!base64PrivateKey || base64PrivateKey.trim() === "") {
|
|
156
|
+
throw new WaffoError(
|
|
157
|
+
WaffoErrorCode.INVALID_PRIVATE_KEY,
|
|
158
|
+
"Private key is null or empty"
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
const keyBuffer = Buffer.from(base64PrivateKey, "base64");
|
|
163
|
+
crypto__namespace.createPrivateKey({
|
|
164
|
+
key: keyBuffer,
|
|
165
|
+
format: "der",
|
|
166
|
+
type: "pkcs8"
|
|
167
|
+
});
|
|
168
|
+
} catch (error) {
|
|
169
|
+
if (error instanceof WaffoError) throw error;
|
|
170
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
171
|
+
if (message.includes("bad base64")) {
|
|
172
|
+
throw new WaffoError(
|
|
173
|
+
WaffoErrorCode.INVALID_PRIVATE_KEY,
|
|
174
|
+
"Invalid private key: not valid Base64 encoding",
|
|
175
|
+
error instanceof Error ? error : void 0
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
throw new WaffoError(
|
|
179
|
+
WaffoErrorCode.INVALID_PRIVATE_KEY,
|
|
180
|
+
`Invalid private key: ${message}`,
|
|
181
|
+
error instanceof Error ? error : void 0
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function validatePublicKey(base64PublicKey) {
|
|
186
|
+
if (!base64PublicKey || base64PublicKey.trim() === "") {
|
|
187
|
+
throw new WaffoError(
|
|
188
|
+
WaffoErrorCode.INVALID_PUBLIC_KEY,
|
|
189
|
+
"Public key is null or empty"
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
const keyBuffer = Buffer.from(base64PublicKey, "base64");
|
|
194
|
+
crypto__namespace.createPublicKey({
|
|
195
|
+
key: keyBuffer,
|
|
196
|
+
format: "der",
|
|
197
|
+
type: "spki"
|
|
198
|
+
});
|
|
199
|
+
} catch (error) {
|
|
200
|
+
if (error instanceof WaffoError) throw error;
|
|
201
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
202
|
+
if (message.includes("bad base64")) {
|
|
203
|
+
throw new WaffoError(
|
|
204
|
+
WaffoErrorCode.INVALID_PUBLIC_KEY,
|
|
205
|
+
"Invalid public key: not valid Base64 encoding",
|
|
206
|
+
error instanceof Error ? error : void 0
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
throw new WaffoError(
|
|
210
|
+
WaffoErrorCode.INVALID_PUBLIC_KEY,
|
|
211
|
+
`Invalid public key: ${message}`,
|
|
212
|
+
error instanceof Error ? error : void 0
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function generateKeyPair() {
|
|
217
|
+
try {
|
|
218
|
+
const { privateKey, publicKey } = crypto__namespace.generateKeyPairSync("rsa", {
|
|
219
|
+
modulusLength: KEY_SIZE,
|
|
220
|
+
publicKeyEncoding: {
|
|
221
|
+
type: "spki",
|
|
222
|
+
format: "der"
|
|
223
|
+
},
|
|
224
|
+
privateKeyEncoding: {
|
|
225
|
+
type: "pkcs8",
|
|
226
|
+
format: "der"
|
|
291
227
|
}
|
|
292
|
-
|
|
293
|
-
|
|
228
|
+
});
|
|
229
|
+
return {
|
|
230
|
+
privateKey: privateKey.toString("base64"),
|
|
231
|
+
publicKey: publicKey.toString("base64")
|
|
232
|
+
};
|
|
233
|
+
} catch (error) {
|
|
234
|
+
throw new WaffoError(
|
|
235
|
+
WaffoErrorCode.SIGN_FAILED,
|
|
236
|
+
`Failed to generate key pair: ${error instanceof Error ? error.message : String(error)}`,
|
|
237
|
+
error instanceof Error ? error : void 0
|
|
238
|
+
);
|
|
294
239
|
}
|
|
295
|
-
}
|
|
240
|
+
}
|
|
241
|
+
var RsaUtils = {
|
|
242
|
+
sign,
|
|
243
|
+
verify,
|
|
244
|
+
validatePrivateKey,
|
|
245
|
+
validatePublicKey,
|
|
246
|
+
generateKeyPair
|
|
247
|
+
};
|
|
296
248
|
|
|
297
249
|
// src/types/config/waffo-config.ts
|
|
250
|
+
var WaffoConfigEnvVars = {
|
|
251
|
+
API_KEY: "WAFFO_API_KEY",
|
|
252
|
+
PRIVATE_KEY: "WAFFO_PRIVATE_KEY",
|
|
253
|
+
PUBLIC_KEY: "WAFFO_PUBLIC_KEY",
|
|
254
|
+
MERCHANT_ID: "WAFFO_MERCHANT_ID",
|
|
255
|
+
ENVIRONMENT: "WAFFO_ENVIRONMENT"
|
|
256
|
+
};
|
|
257
|
+
var WaffoConfigDefaults = {
|
|
258
|
+
CONNECT_TIMEOUT: 1e4,
|
|
259
|
+
READ_TIMEOUT: 3e4
|
|
260
|
+
};
|
|
298
261
|
function createWaffoConfig(config) {
|
|
299
262
|
if (!config.apiKey) {
|
|
300
263
|
throw new Error("apiKey is required");
|
|
@@ -311,12 +274,12 @@ function createWaffoConfig(config) {
|
|
|
311
274
|
if (!config.merchantId) {
|
|
312
275
|
throw new Error("merchantId is required");
|
|
313
276
|
}
|
|
314
|
-
|
|
315
|
-
|
|
277
|
+
RsaUtils.validatePrivateKey(config.privateKey);
|
|
278
|
+
RsaUtils.validatePublicKey(config.waffoPublicKey);
|
|
316
279
|
return {
|
|
317
280
|
...config,
|
|
318
|
-
connectTimeout: config.connectTimeout ??
|
|
319
|
-
readTimeout: config.readTimeout ??
|
|
281
|
+
connectTimeout: config.connectTimeout ?? WaffoConfigDefaults.CONNECT_TIMEOUT,
|
|
282
|
+
readTimeout: config.readTimeout ?? WaffoConfigDefaults.READ_TIMEOUT
|
|
320
283
|
};
|
|
321
284
|
}
|
|
322
285
|
function fromEnv() {
|
|
@@ -346,44 +309,6 @@ function fromEnv() {
|
|
|
346
309
|
merchantId
|
|
347
310
|
});
|
|
348
311
|
}
|
|
349
|
-
var WaffoConfigEnvVars; exports.WaffoConfigDefaults = void 0;
|
|
350
|
-
var init_waffo_config = __esm({
|
|
351
|
-
"src/types/config/waffo-config.ts"() {
|
|
352
|
-
init_environment();
|
|
353
|
-
init_rsa_utils();
|
|
354
|
-
WaffoConfigEnvVars = {
|
|
355
|
-
API_KEY: "WAFFO_API_KEY",
|
|
356
|
-
PRIVATE_KEY: "WAFFO_PRIVATE_KEY",
|
|
357
|
-
PUBLIC_KEY: "WAFFO_PUBLIC_KEY",
|
|
358
|
-
MERCHANT_ID: "WAFFO_MERCHANT_ID",
|
|
359
|
-
ENVIRONMENT: "WAFFO_ENVIRONMENT"
|
|
360
|
-
};
|
|
361
|
-
exports.WaffoConfigDefaults = {
|
|
362
|
-
CONNECT_TIMEOUT: 1e4,
|
|
363
|
-
READ_TIMEOUT: 3e4
|
|
364
|
-
};
|
|
365
|
-
}
|
|
366
|
-
});
|
|
367
|
-
|
|
368
|
-
// src/types/config/index.ts
|
|
369
|
-
var config_exports = {};
|
|
370
|
-
__export(config_exports, {
|
|
371
|
-
Environment: () => exports.Environment,
|
|
372
|
-
EnvironmentBaseUrl: () => exports.EnvironmentBaseUrl,
|
|
373
|
-
WaffoConfigDefaults: () => exports.WaffoConfigDefaults,
|
|
374
|
-
WaffoConfigEnvVars: () => WaffoConfigEnvVars,
|
|
375
|
-
createWaffoConfig: () => createWaffoConfig,
|
|
376
|
-
fromEnv: () => fromEnv
|
|
377
|
-
});
|
|
378
|
-
var init_config = __esm({
|
|
379
|
-
"src/types/config/index.ts"() {
|
|
380
|
-
init_environment();
|
|
381
|
-
init_waffo_config();
|
|
382
|
-
}
|
|
383
|
-
});
|
|
384
|
-
|
|
385
|
-
// src/core/waffo-http-client.ts
|
|
386
|
-
init_config();
|
|
387
312
|
|
|
388
313
|
// src/types/api-response.ts
|
|
389
314
|
var ApiResponse = class _ApiResponse {
|
|
@@ -531,9 +456,6 @@ var DefaultHttpTransport = class {
|
|
|
531
456
|
};
|
|
532
457
|
|
|
533
458
|
// src/core/waffo-http-client.ts
|
|
534
|
-
init_rsa_utils();
|
|
535
|
-
init_waffo_error();
|
|
536
|
-
init_waffo_unknown_status_error();
|
|
537
459
|
var HEADER_API_KEY = "x-api-key";
|
|
538
460
|
var HEADER_SIGNATURE = "x-signature";
|
|
539
461
|
var HEADER_API_VERSION = "x-api-version";
|
|
@@ -541,7 +463,7 @@ var HEADER_SDK_VERSION = "x-sdk-version";
|
|
|
541
463
|
var HEADER_CONTENT_TYPE = "content-type";
|
|
542
464
|
var CONTENT_TYPE_JSON = "application/json";
|
|
543
465
|
var API_VERSION = "1.0.0";
|
|
544
|
-
var SDK_VERSION = "waffo-node/
|
|
466
|
+
var SDK_VERSION = "waffo-node/2.2.0";
|
|
545
467
|
var WaffoHttpClient = class {
|
|
546
468
|
baseUrl;
|
|
547
469
|
apiKey;
|
|
@@ -553,13 +475,13 @@ var WaffoHttpClient = class {
|
|
|
553
475
|
logger;
|
|
554
476
|
httpTransport;
|
|
555
477
|
constructor(config) {
|
|
556
|
-
this.baseUrl =
|
|
478
|
+
this.baseUrl = EnvironmentBaseUrl[config.environment];
|
|
557
479
|
this.apiKey = config.apiKey;
|
|
558
480
|
this.privateKey = config.privateKey;
|
|
559
481
|
this.waffoPublicKey = config.waffoPublicKey;
|
|
560
482
|
this.merchantId = config.merchantId;
|
|
561
|
-
this.connectTimeout = config.connectTimeout ??
|
|
562
|
-
this.readTimeout = config.readTimeout ??
|
|
483
|
+
this.connectTimeout = config.connectTimeout ?? WaffoConfigDefaults.CONNECT_TIMEOUT;
|
|
484
|
+
this.readTimeout = config.readTimeout ?? WaffoConfigDefaults.READ_TIMEOUT;
|
|
563
485
|
this.logger = config.logger;
|
|
564
486
|
this.httpTransport = config.httpTransport ?? new DefaultHttpTransport();
|
|
565
487
|
}
|
|
@@ -579,7 +501,7 @@ var WaffoHttpClient = class {
|
|
|
579
501
|
try {
|
|
580
502
|
this.injectMerchantIdIfNeeded(request);
|
|
581
503
|
const requestBody = JSON.stringify(request);
|
|
582
|
-
const signature =
|
|
504
|
+
const signature = RsaUtils.sign(requestBody, this.privateKey);
|
|
583
505
|
this.logger?.debug(`Request URL: ${url}`);
|
|
584
506
|
this.logger?.debug(`Request Body: ${requestBody}`);
|
|
585
507
|
const httpResponse = await this.httpTransport.send({
|
|
@@ -600,7 +522,7 @@ var WaffoHttpClient = class {
|
|
|
600
522
|
this.logger?.debug(`Response Body: ${httpResponse.body}`);
|
|
601
523
|
const responseSignature = httpResponse.headers[HEADER_SIGNATURE];
|
|
602
524
|
if (responseSignature) {
|
|
603
|
-
const isValid =
|
|
525
|
+
const isValid = RsaUtils.verify(
|
|
604
526
|
httpResponse.body,
|
|
605
527
|
responseSignature,
|
|
606
528
|
this.waffoPublicKey
|
|
@@ -608,27 +530,27 @@ var WaffoHttpClient = class {
|
|
|
608
530
|
if (!isValid) {
|
|
609
531
|
this.logger?.error("Response signature verification failed");
|
|
610
532
|
return ApiResponse.error(
|
|
611
|
-
|
|
533
|
+
WaffoErrorCode.VERIFY_FAILED,
|
|
612
534
|
"Response signature verification failed"
|
|
613
535
|
);
|
|
614
536
|
}
|
|
615
537
|
}
|
|
616
538
|
const response = this.parseResponse(httpResponse.body);
|
|
617
539
|
if (response.code === "E0001") {
|
|
618
|
-
throw new
|
|
619
|
-
|
|
540
|
+
throw new WaffoUnknownStatusError(
|
|
541
|
+
WaffoUnknownStatusError.CODE_UNKNOWN_STATUS,
|
|
620
542
|
response.getMessage() ?? "Unknown status from server"
|
|
621
543
|
);
|
|
622
544
|
}
|
|
623
545
|
return response;
|
|
624
546
|
} catch (error) {
|
|
625
|
-
if (error instanceof
|
|
547
|
+
if (error instanceof WaffoUnknownStatusError) {
|
|
626
548
|
throw error;
|
|
627
549
|
}
|
|
628
550
|
if (this.isNetworkError(error)) {
|
|
629
551
|
this.logger?.error("Network error", error);
|
|
630
|
-
throw new
|
|
631
|
-
|
|
552
|
+
throw new WaffoUnknownStatusError(
|
|
553
|
+
WaffoUnknownStatusError.CODE_NETWORK_ERROR,
|
|
632
554
|
`Network error, payment status unknown: ${error instanceof Error ? error.message : String(error)}`,
|
|
633
555
|
error instanceof Error ? error : void 0
|
|
634
556
|
);
|
|
@@ -636,13 +558,13 @@ var WaffoHttpClient = class {
|
|
|
636
558
|
if (error instanceof SyntaxError) {
|
|
637
559
|
this.logger?.error("JSON serialization error", error);
|
|
638
560
|
return ApiResponse.error(
|
|
639
|
-
|
|
561
|
+
WaffoErrorCode.SERIALIZE_FAILED,
|
|
640
562
|
`Request serialization failed: ${error.message}`
|
|
641
563
|
);
|
|
642
564
|
}
|
|
643
565
|
this.logger?.error("Unexpected error", error);
|
|
644
566
|
return ApiResponse.error(
|
|
645
|
-
|
|
567
|
+
WaffoErrorCode.UNEXPECTED,
|
|
646
568
|
`Unexpected error: ${error instanceof Error ? error.message : String(error)}`
|
|
647
569
|
);
|
|
648
570
|
}
|
|
@@ -690,12 +612,10 @@ var WaffoHttpClient = class {
|
|
|
690
612
|
};
|
|
691
613
|
|
|
692
614
|
// src/core/webhook-handler.ts
|
|
693
|
-
init_rsa_utils();
|
|
694
615
|
var WebhookEventType = /* @__PURE__ */ ((WebhookEventType2) => {
|
|
695
616
|
WebhookEventType2["PAYMENT_NOTIFICATION"] = "PAYMENT_NOTIFICATION";
|
|
696
617
|
WebhookEventType2["REFUND_NOTIFICATION"] = "REFUND_NOTIFICATION";
|
|
697
618
|
WebhookEventType2["SUBSCRIPTION_STATUS_NOTIFICATION"] = "SUBSCRIPTION_STATUS_NOTIFICATION";
|
|
698
|
-
WebhookEventType2["SUBSCRIPTION_PAYMENT_NOTIFICATION"] = "SUBSCRIPTION_PAYMENT_NOTIFICATION";
|
|
699
619
|
WebhookEventType2["SUBSCRIPTION_PERIOD_CHANGED_NOTIFICATION"] = "SUBSCRIPTION_PERIOD_CHANGED_NOTIFICATION";
|
|
700
620
|
return WebhookEventType2;
|
|
701
621
|
})(WebhookEventType || {});
|
|
@@ -735,7 +655,8 @@ var WebhookHandler = class {
|
|
|
735
655
|
return this;
|
|
736
656
|
}
|
|
737
657
|
/**
|
|
738
|
-
* Registers a handler for
|
|
658
|
+
* Registers a fallback handler for SUBSCRIPTION_STATUS_NOTIFICATION events.
|
|
659
|
+
* Only called when onSubscriptionStatus handler is not registered.
|
|
739
660
|
*/
|
|
740
661
|
onSubscriptionPayment(handler) {
|
|
741
662
|
this.subscriptionPaymentHandler = handler;
|
|
@@ -761,7 +682,7 @@ var WebhookHandler = class {
|
|
|
761
682
|
this.logger?.warn("Missing webhook signature");
|
|
762
683
|
return this.createFailedResult("Missing signature");
|
|
763
684
|
}
|
|
764
|
-
const isValid =
|
|
685
|
+
const isValid = RsaUtils.verify(body, signature, this.waffoPublicKey);
|
|
765
686
|
if (!isValid) {
|
|
766
687
|
this.logger?.error("Invalid webhook signature");
|
|
767
688
|
return this.createFailedResult("Invalid signature");
|
|
@@ -782,10 +703,7 @@ var WebhookHandler = class {
|
|
|
782
703
|
case "SUBSCRIPTION_STATUS_NOTIFICATION" /* SUBSCRIPTION_STATUS_NOTIFICATION */:
|
|
783
704
|
if (this.subscriptionStatusHandler) {
|
|
784
705
|
await this.subscriptionStatusHandler(parsed);
|
|
785
|
-
}
|
|
786
|
-
break;
|
|
787
|
-
case "SUBSCRIPTION_PAYMENT_NOTIFICATION" /* SUBSCRIPTION_PAYMENT_NOTIFICATION */:
|
|
788
|
-
if (this.subscriptionPaymentHandler) {
|
|
706
|
+
} else if (this.subscriptionPaymentHandler) {
|
|
789
707
|
await this.subscriptionPaymentHandler(parsed);
|
|
790
708
|
}
|
|
791
709
|
break;
|
|
@@ -814,14 +732,14 @@ var WebhookHandler = class {
|
|
|
814
732
|
* @returns true if signature is valid
|
|
815
733
|
*/
|
|
816
734
|
verifySignature(body, signature) {
|
|
817
|
-
return
|
|
735
|
+
return RsaUtils.verify(body, signature, this.waffoPublicKey);
|
|
818
736
|
}
|
|
819
737
|
/**
|
|
820
738
|
* Builds a success response with signature.
|
|
821
739
|
*/
|
|
822
740
|
buildSuccessResponse() {
|
|
823
741
|
const body = JSON.stringify({ status: "success" });
|
|
824
|
-
const signature =
|
|
742
|
+
const signature = RsaUtils.sign(body, this.privateKey);
|
|
825
743
|
return { body, signature };
|
|
826
744
|
}
|
|
827
745
|
/**
|
|
@@ -829,7 +747,7 @@ var WebhookHandler = class {
|
|
|
829
747
|
*/
|
|
830
748
|
buildFailedResponse(message) {
|
|
831
749
|
const body = JSON.stringify({ status: "failed", message });
|
|
832
|
-
const signature =
|
|
750
|
+
const signature = RsaUtils.sign(body, this.privateKey);
|
|
833
751
|
return { body, signature };
|
|
834
752
|
}
|
|
835
753
|
createSuccessResult() {
|
|
@@ -1205,8 +1123,7 @@ var Waffo = class _Waffo {
|
|
|
1205
1123
|
* @returns Waffo SDK instance
|
|
1206
1124
|
*/
|
|
1207
1125
|
static fromEnv() {
|
|
1208
|
-
|
|
1209
|
-
return new _Waffo(WaffoConfig.fromEnv());
|
|
1126
|
+
return new _Waffo(fromEnv());
|
|
1210
1127
|
}
|
|
1211
1128
|
/**
|
|
1212
1129
|
* Returns the order resource for managing payment orders.
|
|
@@ -1273,13 +1190,13 @@ var Waffo = class _Waffo {
|
|
|
1273
1190
|
* // Setup webhook handler
|
|
1274
1191
|
* const handler = waffo.webhook()
|
|
1275
1192
|
* .onPayment((notification) => {
|
|
1276
|
-
* console.log('Payment:', notification.orderStatus);
|
|
1193
|
+
* console.log('Payment:', notification.result?.orderStatus);
|
|
1277
1194
|
* })
|
|
1278
1195
|
* .onRefund((notification) => {
|
|
1279
|
-
* console.log('Refund:', notification.refundStatus);
|
|
1196
|
+
* console.log('Refund:', notification.result?.refundStatus);
|
|
1280
1197
|
* })
|
|
1281
1198
|
* .onSubscriptionStatus((notification) => {
|
|
1282
|
-
* console.log('Subscription:', notification.subscriptionStatus);
|
|
1199
|
+
* console.log('Subscription:', notification.result?.subscriptionStatus);
|
|
1283
1200
|
* });
|
|
1284
1201
|
*
|
|
1285
1202
|
* // In Express.js route handler
|
|
@@ -1306,20 +1223,21 @@ var Waffo = class _Waffo {
|
|
|
1306
1223
|
}
|
|
1307
1224
|
};
|
|
1308
1225
|
|
|
1309
|
-
// src/index.ts
|
|
1310
|
-
init_config();
|
|
1311
|
-
init_waffo_error();
|
|
1312
|
-
init_waffo_unknown_status_error();
|
|
1313
|
-
init_rsa_utils();
|
|
1314
|
-
|
|
1315
1226
|
exports.ApiResponse = ApiResponse;
|
|
1227
|
+
exports.Environment = Environment;
|
|
1228
|
+
exports.EnvironmentBaseUrl = EnvironmentBaseUrl;
|
|
1316
1229
|
exports.MerchantConfigResource = MerchantConfigResource;
|
|
1317
1230
|
exports.OrderResource = OrderResource;
|
|
1318
1231
|
exports.PayMethodConfigResource = PayMethodConfigResource;
|
|
1319
1232
|
exports.RefundResource = RefundResource;
|
|
1233
|
+
exports.RsaUtils = RsaUtils;
|
|
1320
1234
|
exports.SubscriptionResource = SubscriptionResource;
|
|
1321
1235
|
exports.Waffo = Waffo;
|
|
1236
|
+
exports.WaffoConfigDefaults = WaffoConfigDefaults;
|
|
1237
|
+
exports.WaffoError = WaffoError;
|
|
1238
|
+
exports.WaffoErrorCode = WaffoErrorCode;
|
|
1322
1239
|
exports.WaffoHttpClient = WaffoHttpClient;
|
|
1240
|
+
exports.WaffoUnknownStatusError = WaffoUnknownStatusError;
|
|
1323
1241
|
exports.WebhookEventType = WebhookEventType;
|
|
1324
1242
|
exports.WebhookHandler = WebhookHandler;
|
|
1325
1243
|
//# sourceMappingURL=index.js.map
|