@singularity-payments/sveltekit 0.1.0-alpha.7 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -48
- package/dist/index.d.ts +1 -48
- package/dist/index.js +221 -65
- package/dist/index.mjs +221 -65
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { RequestEvent } from '@sveltejs/kit';
|
|
2
2
|
import { MpesaClient, MpesaConfig, MpesaClientOptions } from '@singularity-payments/core';
|
|
3
|
-
export {
|
|
3
|
+
export { AccountBalanceCallback, B2BCallback, C2BCallback, C2BRegisterRequest, C2BRegisterResponse, MpesaClient, MpesaClientOptions, MpesaConfig, ParsedC2BCallback, ParsedCallbackData, ReversalCallback, STKCallback, STKPushRequest, STKPushResponse, TransactionStatusCallback, TransactionStatusRequest, TransactionStatusResponse } from '@singularity-payments/core';
|
|
4
4
|
|
|
5
5
|
interface RouteHandler {
|
|
6
6
|
POST: (event: RequestEvent) => Promise<Response>;
|
|
@@ -21,56 +21,9 @@ declare function createMpesaHandlers(client: MpesaClient): MpesaRouteHandlers;
|
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Create M-Pesa instance for SvelteKit
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* ```typescript
|
|
27
|
-
* // lib/mpesa.ts
|
|
28
|
-
* import { createMpesa } from "@singularity-payments/sveltekit";
|
|
29
|
-
*
|
|
30
|
-
* export const mpesa = createMpesa({
|
|
31
|
-
* consumerKey: process.env.MPESA_CONSUMER_KEY!,
|
|
32
|
-
* consumerSecret: process.env.MPESA_CONSUMER_SECRET!,
|
|
33
|
-
* passkey: process.env.MPESA_PASSKEY!,
|
|
34
|
-
* shortcode: process.env.MPESA_SHORTCODE!,
|
|
35
|
-
* environment: "sandbox",
|
|
36
|
-
* callbackUrl: `${process.env.PUBLIC_APP_URL}/api/mpesa/callback`
|
|
37
|
-
* }, {
|
|
38
|
-
* callbackOptions: {
|
|
39
|
-
* onSuccess: async (data) => {
|
|
40
|
-
* console.log("Payment successful:", data);
|
|
41
|
-
* // Save to database
|
|
42
|
-
* },
|
|
43
|
-
* onFailure: async (data) => {
|
|
44
|
-
* console.log("Payment failed:", data);
|
|
45
|
-
* }
|
|
46
|
-
* }
|
|
47
|
-
* });
|
|
48
|
-
* ```
|
|
49
|
-
*
|
|
50
|
-
* @example
|
|
51
|
-
* ```typescript
|
|
52
|
-
* // src/routes/api/mpesa/callback/+server.ts
|
|
53
|
-
* import { mpesa } from "$lib/mpesa";
|
|
54
|
-
*
|
|
55
|
-
* export const POST = mpesa.handlers.stkCallback.POST;
|
|
56
|
-
* ```
|
|
57
|
-
*
|
|
58
|
-
* @example
|
|
59
|
-
* ```typescript
|
|
60
|
-
* // src/routes/api/mpesa/[...path]/+server.ts - Catch-all route
|
|
61
|
-
* import { mpesa } from "$lib/mpesa";
|
|
62
|
-
*
|
|
63
|
-
* export const POST = mpesa.handlers.catchAll.POST;
|
|
64
|
-
* ```
|
|
65
24
|
*/
|
|
66
25
|
declare function createMpesa(config: MpesaConfig, options?: MpesaClientOptions): {
|
|
67
|
-
/**
|
|
68
|
-
* M-Pesa client instance for making API calls
|
|
69
|
-
*/
|
|
70
26
|
client: MpesaClient;
|
|
71
|
-
/**
|
|
72
|
-
* Pre-configured SvelteKit route handlers for M-Pesa callbacks
|
|
73
|
-
*/
|
|
74
27
|
handlers: MpesaRouteHandlers;
|
|
75
28
|
};
|
|
76
29
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { RequestEvent } from '@sveltejs/kit';
|
|
2
2
|
import { MpesaClient, MpesaConfig, MpesaClientOptions } from '@singularity-payments/core';
|
|
3
|
-
export {
|
|
3
|
+
export { AccountBalanceCallback, B2BCallback, C2BCallback, C2BRegisterRequest, C2BRegisterResponse, MpesaClient, MpesaClientOptions, MpesaConfig, ParsedC2BCallback, ParsedCallbackData, ReversalCallback, STKCallback, STKPushRequest, STKPushResponse, TransactionStatusCallback, TransactionStatusRequest, TransactionStatusResponse } from '@singularity-payments/core';
|
|
4
4
|
|
|
5
5
|
interface RouteHandler {
|
|
6
6
|
POST: (event: RequestEvent) => Promise<Response>;
|
|
@@ -21,56 +21,9 @@ declare function createMpesaHandlers(client: MpesaClient): MpesaRouteHandlers;
|
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Create M-Pesa instance for SvelteKit
|
|
24
|
-
*
|
|
25
|
-
* @example
|
|
26
|
-
* ```typescript
|
|
27
|
-
* // lib/mpesa.ts
|
|
28
|
-
* import { createMpesa } from "@singularity-payments/sveltekit";
|
|
29
|
-
*
|
|
30
|
-
* export const mpesa = createMpesa({
|
|
31
|
-
* consumerKey: process.env.MPESA_CONSUMER_KEY!,
|
|
32
|
-
* consumerSecret: process.env.MPESA_CONSUMER_SECRET!,
|
|
33
|
-
* passkey: process.env.MPESA_PASSKEY!,
|
|
34
|
-
* shortcode: process.env.MPESA_SHORTCODE!,
|
|
35
|
-
* environment: "sandbox",
|
|
36
|
-
* callbackUrl: `${process.env.PUBLIC_APP_URL}/api/mpesa/callback`
|
|
37
|
-
* }, {
|
|
38
|
-
* callbackOptions: {
|
|
39
|
-
* onSuccess: async (data) => {
|
|
40
|
-
* console.log("Payment successful:", data);
|
|
41
|
-
* // Save to database
|
|
42
|
-
* },
|
|
43
|
-
* onFailure: async (data) => {
|
|
44
|
-
* console.log("Payment failed:", data);
|
|
45
|
-
* }
|
|
46
|
-
* }
|
|
47
|
-
* });
|
|
48
|
-
* ```
|
|
49
|
-
*
|
|
50
|
-
* @example
|
|
51
|
-
* ```typescript
|
|
52
|
-
* // src/routes/api/mpesa/callback/+server.ts
|
|
53
|
-
* import { mpesa } from "$lib/mpesa";
|
|
54
|
-
*
|
|
55
|
-
* export const POST = mpesa.handlers.stkCallback.POST;
|
|
56
|
-
* ```
|
|
57
|
-
*
|
|
58
|
-
* @example
|
|
59
|
-
* ```typescript
|
|
60
|
-
* // src/routes/api/mpesa/[...path]/+server.ts - Catch-all route
|
|
61
|
-
* import { mpesa } from "$lib/mpesa";
|
|
62
|
-
*
|
|
63
|
-
* export const POST = mpesa.handlers.catchAll.POST;
|
|
64
|
-
* ```
|
|
65
24
|
*/
|
|
66
25
|
declare function createMpesa(config: MpesaConfig, options?: MpesaClientOptions): {
|
|
67
|
-
/**
|
|
68
|
-
* M-Pesa client instance for making API calls
|
|
69
|
-
*/
|
|
70
26
|
client: MpesaClient;
|
|
71
|
-
/**
|
|
72
|
-
* Pre-configured SvelteKit route handlers for M-Pesa callbacks
|
|
73
|
-
*/
|
|
74
27
|
handlers: MpesaRouteHandlers;
|
|
75
28
|
};
|
|
76
29
|
|
package/dist/index.js
CHANGED
|
@@ -106,15 +106,9 @@ function createMpesaHandlers(client) {
|
|
|
106
106
|
POST: async (event) => {
|
|
107
107
|
try {
|
|
108
108
|
const body = await event.request.json();
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
return (0, import_kit.json)(
|
|
112
|
-
{
|
|
113
|
-
ResultCode: 0,
|
|
114
|
-
ResultDesc: "Accepted"
|
|
115
|
-
},
|
|
116
|
-
{ status: 200 }
|
|
117
|
-
);
|
|
109
|
+
const ipAddress = event.request.headers.get("x-forwarded-for") || event.request.headers.get("x-real-ip") || void 0;
|
|
110
|
+
const response = await client.handleB2CResult(body, ipAddress);
|
|
111
|
+
return (0, import_kit.json)(response, { status: 200 });
|
|
118
112
|
} catch (error) {
|
|
119
113
|
console.error("B2C Result error:", error);
|
|
120
114
|
return (0, import_kit.json)(
|
|
@@ -155,6 +149,216 @@ function createMpesaHandlers(client) {
|
|
|
155
149
|
}
|
|
156
150
|
}
|
|
157
151
|
},
|
|
152
|
+
/**
|
|
153
|
+
* B2B result handler
|
|
154
|
+
* Handles callbacks from M-Pesa after B2B requests
|
|
155
|
+
*/
|
|
156
|
+
b2bResult: {
|
|
157
|
+
POST: async (event) => {
|
|
158
|
+
try {
|
|
159
|
+
const body = await event.request.json();
|
|
160
|
+
const ipAddress = event.request.headers.get("x-forwarded-for") || event.request.headers.get("x-real-ip") || void 0;
|
|
161
|
+
const response = await client.handleB2BResult(body, ipAddress);
|
|
162
|
+
return (0, import_kit.json)(response, { status: 200 });
|
|
163
|
+
} catch (error) {
|
|
164
|
+
console.error("B2B Result error:", error);
|
|
165
|
+
return (0, import_kit.json)(
|
|
166
|
+
{
|
|
167
|
+
ResultCode: 1,
|
|
168
|
+
ResultDesc: "Processing failed"
|
|
169
|
+
},
|
|
170
|
+
{ status: 200 }
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
},
|
|
175
|
+
/**
|
|
176
|
+
* B2B timeout handler
|
|
177
|
+
* Handles timeout notifications from M-Pesa for B2B requests
|
|
178
|
+
*/
|
|
179
|
+
b2bTimeout: {
|
|
180
|
+
POST: async (event) => {
|
|
181
|
+
try {
|
|
182
|
+
const body = await event.request.json();
|
|
183
|
+
console.log("B2B Timeout:", body);
|
|
184
|
+
return (0, import_kit.json)(
|
|
185
|
+
{
|
|
186
|
+
ResultCode: 0,
|
|
187
|
+
ResultDesc: "Timeout received"
|
|
188
|
+
},
|
|
189
|
+
{ status: 200 }
|
|
190
|
+
);
|
|
191
|
+
} catch (error) {
|
|
192
|
+
console.error("B2B Timeout error:", error);
|
|
193
|
+
return (0, import_kit.json)(
|
|
194
|
+
{
|
|
195
|
+
ResultCode: 1,
|
|
196
|
+
ResultDesc: "Processing failed"
|
|
197
|
+
},
|
|
198
|
+
{ status: 200 }
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
/**
|
|
204
|
+
* Account Balance result handler
|
|
205
|
+
* Handles callbacks from M-Pesa after account balance queries
|
|
206
|
+
*/
|
|
207
|
+
accountBalanceResult: {
|
|
208
|
+
POST: async (event) => {
|
|
209
|
+
try {
|
|
210
|
+
const body = await event.request.json();
|
|
211
|
+
const ipAddress = event.request.headers.get("x-forwarded-for") || event.request.headers.get("x-real-ip") || void 0;
|
|
212
|
+
const response = await client.handleAccountBalanceResult(
|
|
213
|
+
body,
|
|
214
|
+
ipAddress
|
|
215
|
+
);
|
|
216
|
+
return (0, import_kit.json)(response, { status: 200 });
|
|
217
|
+
} catch (error) {
|
|
218
|
+
console.error("Account Balance Result error:", error);
|
|
219
|
+
return (0, import_kit.json)(
|
|
220
|
+
{
|
|
221
|
+
ResultCode: 1,
|
|
222
|
+
ResultDesc: "Processing failed"
|
|
223
|
+
},
|
|
224
|
+
{ status: 200 }
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
/**
|
|
230
|
+
* Account Balance timeout handler
|
|
231
|
+
* Handles timeout notifications from M-Pesa for account balance queries
|
|
232
|
+
*/
|
|
233
|
+
accountBalanceTimeout: {
|
|
234
|
+
POST: async (event) => {
|
|
235
|
+
try {
|
|
236
|
+
const body = await event.request.json();
|
|
237
|
+
console.log("Account Balance Timeout:", body);
|
|
238
|
+
return (0, import_kit.json)(
|
|
239
|
+
{
|
|
240
|
+
ResultCode: 0,
|
|
241
|
+
ResultDesc: "Timeout received"
|
|
242
|
+
},
|
|
243
|
+
{ status: 200 }
|
|
244
|
+
);
|
|
245
|
+
} catch (error) {
|
|
246
|
+
console.error("Account Balance Timeout error:", error);
|
|
247
|
+
return (0, import_kit.json)(
|
|
248
|
+
{
|
|
249
|
+
ResultCode: 1,
|
|
250
|
+
ResultDesc: "Processing failed"
|
|
251
|
+
},
|
|
252
|
+
{ status: 200 }
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
/**
|
|
258
|
+
* Transaction Status result handler
|
|
259
|
+
* Handles callbacks from M-Pesa after transaction status queries
|
|
260
|
+
*/
|
|
261
|
+
transactionStatusResult: {
|
|
262
|
+
POST: async (event) => {
|
|
263
|
+
try {
|
|
264
|
+
const body = await event.request.json();
|
|
265
|
+
const ipAddress = event.request.headers.get("x-forwarded-for") || event.request.headers.get("x-real-ip") || void 0;
|
|
266
|
+
const response = await client.handleTransactionStatusResult(
|
|
267
|
+
body,
|
|
268
|
+
ipAddress
|
|
269
|
+
);
|
|
270
|
+
return (0, import_kit.json)(response, { status: 200 });
|
|
271
|
+
} catch (error) {
|
|
272
|
+
console.error("Transaction Status Result error:", error);
|
|
273
|
+
return (0, import_kit.json)(
|
|
274
|
+
{
|
|
275
|
+
ResultCode: 1,
|
|
276
|
+
ResultDesc: "Processing failed"
|
|
277
|
+
},
|
|
278
|
+
{ status: 200 }
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
/**
|
|
284
|
+
* Transaction Status timeout handler
|
|
285
|
+
* Handles timeout notifications from M-Pesa for transaction status queries
|
|
286
|
+
*/
|
|
287
|
+
transactionStatusTimeout: {
|
|
288
|
+
POST: async (event) => {
|
|
289
|
+
try {
|
|
290
|
+
const body = await event.request.json();
|
|
291
|
+
console.log("Transaction Status Timeout:", body);
|
|
292
|
+
return (0, import_kit.json)(
|
|
293
|
+
{
|
|
294
|
+
ResultCode: 0,
|
|
295
|
+
ResultDesc: "Timeout received"
|
|
296
|
+
},
|
|
297
|
+
{ status: 200 }
|
|
298
|
+
);
|
|
299
|
+
} catch (error) {
|
|
300
|
+
console.error("Transaction Status Timeout error:", error);
|
|
301
|
+
return (0, import_kit.json)(
|
|
302
|
+
{
|
|
303
|
+
ResultCode: 1,
|
|
304
|
+
ResultDesc: "Processing failed"
|
|
305
|
+
},
|
|
306
|
+
{ status: 200 }
|
|
307
|
+
);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
/**
|
|
312
|
+
* Reversal result handler
|
|
313
|
+
* Handles callbacks from M-Pesa after reversal requests
|
|
314
|
+
*/
|
|
315
|
+
reversalResult: {
|
|
316
|
+
POST: async (event) => {
|
|
317
|
+
try {
|
|
318
|
+
const body = await event.request.json();
|
|
319
|
+
const ipAddress = event.request.headers.get("x-forwarded-for") || event.request.headers.get("x-real-ip") || void 0;
|
|
320
|
+
const response = await client.handleReversalResult(body, ipAddress);
|
|
321
|
+
return (0, import_kit.json)(response, { status: 200 });
|
|
322
|
+
} catch (error) {
|
|
323
|
+
console.error("Reversal Result error:", error);
|
|
324
|
+
return (0, import_kit.json)(
|
|
325
|
+
{
|
|
326
|
+
ResultCode: 1,
|
|
327
|
+
ResultDesc: "Processing failed"
|
|
328
|
+
},
|
|
329
|
+
{ status: 200 }
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
},
|
|
334
|
+
/**
|
|
335
|
+
* Reversal timeout handler
|
|
336
|
+
* Handles timeout notifications from M-Pesa for reversal requests
|
|
337
|
+
*/
|
|
338
|
+
reversalTimeout: {
|
|
339
|
+
POST: async (event) => {
|
|
340
|
+
try {
|
|
341
|
+
const body = await event.request.json();
|
|
342
|
+
console.log("Reversal Timeout:", body);
|
|
343
|
+
return (0, import_kit.json)(
|
|
344
|
+
{
|
|
345
|
+
ResultCode: 0,
|
|
346
|
+
ResultDesc: "Timeout received"
|
|
347
|
+
},
|
|
348
|
+
{ status: 200 }
|
|
349
|
+
);
|
|
350
|
+
} catch (error) {
|
|
351
|
+
console.error("Reversal Timeout error:", error);
|
|
352
|
+
return (0, import_kit.json)(
|
|
353
|
+
{
|
|
354
|
+
ResultCode: 1,
|
|
355
|
+
ResultDesc: "Processing failed"
|
|
356
|
+
},
|
|
357
|
+
{ status: 200 }
|
|
358
|
+
);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
},
|
|
158
362
|
/**
|
|
159
363
|
* Catch-all handler for all M-Pesa webhooks and client-side API requests
|
|
160
364
|
* Routes based on URL path segment
|
|
@@ -213,60 +417,28 @@ function createMpesaHandlers(client) {
|
|
|
213
417
|
return handlers.b2cTimeout.POST(event);
|
|
214
418
|
}
|
|
215
419
|
if (lastSegment === "b2b-result") {
|
|
216
|
-
|
|
217
|
-
const parsed = client.getCallbackHandler().parseB2BCallback(body);
|
|
218
|
-
console.log("B2B Result:", parsed);
|
|
219
|
-
return (0, import_kit.json)({ ResultCode: 0, ResultDesc: "Accepted" });
|
|
420
|
+
return handlers.b2bResult.POST(event);
|
|
220
421
|
}
|
|
221
422
|
if (lastSegment === "b2b-timeout") {
|
|
222
|
-
|
|
223
|
-
console.log("B2B Timeout:", body);
|
|
224
|
-
return (0, import_kit.json)({
|
|
225
|
-
ResultCode: 0,
|
|
226
|
-
ResultDesc: "Timeout received"
|
|
227
|
-
});
|
|
423
|
+
return handlers.b2bTimeout.POST(event);
|
|
228
424
|
}
|
|
229
425
|
if (lastSegment === "balance-result") {
|
|
230
|
-
|
|
231
|
-
const parsed = client.getCallbackHandler().parseAccountBalanceCallback(body);
|
|
232
|
-
console.log("Balance Result:", parsed);
|
|
233
|
-
return (0, import_kit.json)({ ResultCode: 0, ResultDesc: "Accepted" });
|
|
426
|
+
return handlers.accountBalanceResult.POST(event);
|
|
234
427
|
}
|
|
235
428
|
if (lastSegment === "balance-timeout") {
|
|
236
|
-
|
|
237
|
-
console.log("Balance Timeout:", body);
|
|
238
|
-
return (0, import_kit.json)({
|
|
239
|
-
ResultCode: 0,
|
|
240
|
-
ResultDesc: "Timeout received"
|
|
241
|
-
});
|
|
429
|
+
return handlers.accountBalanceTimeout.POST(event);
|
|
242
430
|
}
|
|
243
431
|
if (lastSegment === "status-result") {
|
|
244
|
-
|
|
245
|
-
const parsed = client.getCallbackHandler().parseTransactionStatusCallback(body);
|
|
246
|
-
console.log("Status Result:", parsed);
|
|
247
|
-
return (0, import_kit.json)({ ResultCode: 0, ResultDesc: "Accepted" });
|
|
432
|
+
return handlers.transactionStatusResult.POST(event);
|
|
248
433
|
}
|
|
249
434
|
if (lastSegment === "status-timeout") {
|
|
250
|
-
|
|
251
|
-
console.log("Status Timeout:", body);
|
|
252
|
-
return (0, import_kit.json)({
|
|
253
|
-
ResultCode: 0,
|
|
254
|
-
ResultDesc: "Timeout received"
|
|
255
|
-
});
|
|
435
|
+
return handlers.transactionStatusTimeout.POST(event);
|
|
256
436
|
}
|
|
257
437
|
if (lastSegment === "reversal-result") {
|
|
258
|
-
|
|
259
|
-
const parsed = client.getCallbackHandler().parseReversalCallback(body);
|
|
260
|
-
console.log("Reversal Result:", parsed);
|
|
261
|
-
return (0, import_kit.json)({ ResultCode: 0, ResultDesc: "Accepted" });
|
|
438
|
+
return handlers.reversalResult.POST(event);
|
|
262
439
|
}
|
|
263
440
|
if (lastSegment === "reversal-timeout") {
|
|
264
|
-
|
|
265
|
-
console.log("Reversal Timeout:", body);
|
|
266
|
-
return (0, import_kit.json)({
|
|
267
|
-
ResultCode: 0,
|
|
268
|
-
ResultDesc: "Timeout received"
|
|
269
|
-
});
|
|
441
|
+
return handlers.reversalTimeout.POST(event);
|
|
270
442
|
}
|
|
271
443
|
if (lastSegment === "stk-push") {
|
|
272
444
|
const body = await event.request.json();
|
|
@@ -345,15 +517,6 @@ function createMpesaHandlers(client) {
|
|
|
345
517
|
resultUrl,
|
|
346
518
|
timeoutUrl
|
|
347
519
|
} = body;
|
|
348
|
-
console.log("B2B Request Parameters:", {
|
|
349
|
-
amount,
|
|
350
|
-
partyB,
|
|
351
|
-
commandID,
|
|
352
|
-
senderIdentifierType,
|
|
353
|
-
receiverIdentifierType,
|
|
354
|
-
accountReference,
|
|
355
|
-
remarks
|
|
356
|
-
});
|
|
357
520
|
if (!amount || !partyB || !commandID || !accountReference) {
|
|
358
521
|
return (0, import_kit.json)(
|
|
359
522
|
{
|
|
@@ -373,7 +536,6 @@ function createMpesaHandlers(client) {
|
|
|
373
536
|
resultUrl,
|
|
374
537
|
timeoutUrl
|
|
375
538
|
});
|
|
376
|
-
console.log("B2B Response:", response);
|
|
377
539
|
return (0, import_kit.json)(response);
|
|
378
540
|
}
|
|
379
541
|
if (lastSegment === "balance") {
|
|
@@ -491,13 +653,7 @@ function createMpesa(config, options) {
|
|
|
491
653
|
const client = new import_core.MpesaClient(config, options);
|
|
492
654
|
const handlers = createMpesaHandlers(client);
|
|
493
655
|
return {
|
|
494
|
-
/**
|
|
495
|
-
* M-Pesa client instance for making API calls
|
|
496
|
-
*/
|
|
497
656
|
client,
|
|
498
|
-
/**
|
|
499
|
-
* Pre-configured SvelteKit route handlers for M-Pesa callbacks
|
|
500
|
-
*/
|
|
501
657
|
handlers
|
|
502
658
|
};
|
|
503
659
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -80,15 +80,9 @@ function createMpesaHandlers(client) {
|
|
|
80
80
|
POST: async (event) => {
|
|
81
81
|
try {
|
|
82
82
|
const body = await event.request.json();
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
return json(
|
|
86
|
-
{
|
|
87
|
-
ResultCode: 0,
|
|
88
|
-
ResultDesc: "Accepted"
|
|
89
|
-
},
|
|
90
|
-
{ status: 200 }
|
|
91
|
-
);
|
|
83
|
+
const ipAddress = event.request.headers.get("x-forwarded-for") || event.request.headers.get("x-real-ip") || void 0;
|
|
84
|
+
const response = await client.handleB2CResult(body, ipAddress);
|
|
85
|
+
return json(response, { status: 200 });
|
|
92
86
|
} catch (error) {
|
|
93
87
|
console.error("B2C Result error:", error);
|
|
94
88
|
return json(
|
|
@@ -129,6 +123,216 @@ function createMpesaHandlers(client) {
|
|
|
129
123
|
}
|
|
130
124
|
}
|
|
131
125
|
},
|
|
126
|
+
/**
|
|
127
|
+
* B2B result handler
|
|
128
|
+
* Handles callbacks from M-Pesa after B2B requests
|
|
129
|
+
*/
|
|
130
|
+
b2bResult: {
|
|
131
|
+
POST: async (event) => {
|
|
132
|
+
try {
|
|
133
|
+
const body = await event.request.json();
|
|
134
|
+
const ipAddress = event.request.headers.get("x-forwarded-for") || event.request.headers.get("x-real-ip") || void 0;
|
|
135
|
+
const response = await client.handleB2BResult(body, ipAddress);
|
|
136
|
+
return json(response, { status: 200 });
|
|
137
|
+
} catch (error) {
|
|
138
|
+
console.error("B2B Result error:", error);
|
|
139
|
+
return json(
|
|
140
|
+
{
|
|
141
|
+
ResultCode: 1,
|
|
142
|
+
ResultDesc: "Processing failed"
|
|
143
|
+
},
|
|
144
|
+
{ status: 200 }
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
/**
|
|
150
|
+
* B2B timeout handler
|
|
151
|
+
* Handles timeout notifications from M-Pesa for B2B requests
|
|
152
|
+
*/
|
|
153
|
+
b2bTimeout: {
|
|
154
|
+
POST: async (event) => {
|
|
155
|
+
try {
|
|
156
|
+
const body = await event.request.json();
|
|
157
|
+
console.log("B2B Timeout:", body);
|
|
158
|
+
return json(
|
|
159
|
+
{
|
|
160
|
+
ResultCode: 0,
|
|
161
|
+
ResultDesc: "Timeout received"
|
|
162
|
+
},
|
|
163
|
+
{ status: 200 }
|
|
164
|
+
);
|
|
165
|
+
} catch (error) {
|
|
166
|
+
console.error("B2B Timeout error:", error);
|
|
167
|
+
return json(
|
|
168
|
+
{
|
|
169
|
+
ResultCode: 1,
|
|
170
|
+
ResultDesc: "Processing failed"
|
|
171
|
+
},
|
|
172
|
+
{ status: 200 }
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
/**
|
|
178
|
+
* Account Balance result handler
|
|
179
|
+
* Handles callbacks from M-Pesa after account balance queries
|
|
180
|
+
*/
|
|
181
|
+
accountBalanceResult: {
|
|
182
|
+
POST: async (event) => {
|
|
183
|
+
try {
|
|
184
|
+
const body = await event.request.json();
|
|
185
|
+
const ipAddress = event.request.headers.get("x-forwarded-for") || event.request.headers.get("x-real-ip") || void 0;
|
|
186
|
+
const response = await client.handleAccountBalanceResult(
|
|
187
|
+
body,
|
|
188
|
+
ipAddress
|
|
189
|
+
);
|
|
190
|
+
return json(response, { status: 200 });
|
|
191
|
+
} catch (error) {
|
|
192
|
+
console.error("Account Balance Result error:", error);
|
|
193
|
+
return json(
|
|
194
|
+
{
|
|
195
|
+
ResultCode: 1,
|
|
196
|
+
ResultDesc: "Processing failed"
|
|
197
|
+
},
|
|
198
|
+
{ status: 200 }
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
/**
|
|
204
|
+
* Account Balance timeout handler
|
|
205
|
+
* Handles timeout notifications from M-Pesa for account balance queries
|
|
206
|
+
*/
|
|
207
|
+
accountBalanceTimeout: {
|
|
208
|
+
POST: async (event) => {
|
|
209
|
+
try {
|
|
210
|
+
const body = await event.request.json();
|
|
211
|
+
console.log("Account Balance Timeout:", body);
|
|
212
|
+
return json(
|
|
213
|
+
{
|
|
214
|
+
ResultCode: 0,
|
|
215
|
+
ResultDesc: "Timeout received"
|
|
216
|
+
},
|
|
217
|
+
{ status: 200 }
|
|
218
|
+
);
|
|
219
|
+
} catch (error) {
|
|
220
|
+
console.error("Account Balance Timeout error:", error);
|
|
221
|
+
return json(
|
|
222
|
+
{
|
|
223
|
+
ResultCode: 1,
|
|
224
|
+
ResultDesc: "Processing failed"
|
|
225
|
+
},
|
|
226
|
+
{ status: 200 }
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
/**
|
|
232
|
+
* Transaction Status result handler
|
|
233
|
+
* Handles callbacks from M-Pesa after transaction status queries
|
|
234
|
+
*/
|
|
235
|
+
transactionStatusResult: {
|
|
236
|
+
POST: async (event) => {
|
|
237
|
+
try {
|
|
238
|
+
const body = await event.request.json();
|
|
239
|
+
const ipAddress = event.request.headers.get("x-forwarded-for") || event.request.headers.get("x-real-ip") || void 0;
|
|
240
|
+
const response = await client.handleTransactionStatusResult(
|
|
241
|
+
body,
|
|
242
|
+
ipAddress
|
|
243
|
+
);
|
|
244
|
+
return json(response, { status: 200 });
|
|
245
|
+
} catch (error) {
|
|
246
|
+
console.error("Transaction Status Result error:", error);
|
|
247
|
+
return json(
|
|
248
|
+
{
|
|
249
|
+
ResultCode: 1,
|
|
250
|
+
ResultDesc: "Processing failed"
|
|
251
|
+
},
|
|
252
|
+
{ status: 200 }
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
/**
|
|
258
|
+
* Transaction Status timeout handler
|
|
259
|
+
* Handles timeout notifications from M-Pesa for transaction status queries
|
|
260
|
+
*/
|
|
261
|
+
transactionStatusTimeout: {
|
|
262
|
+
POST: async (event) => {
|
|
263
|
+
try {
|
|
264
|
+
const body = await event.request.json();
|
|
265
|
+
console.log("Transaction Status Timeout:", body);
|
|
266
|
+
return json(
|
|
267
|
+
{
|
|
268
|
+
ResultCode: 0,
|
|
269
|
+
ResultDesc: "Timeout received"
|
|
270
|
+
},
|
|
271
|
+
{ status: 200 }
|
|
272
|
+
);
|
|
273
|
+
} catch (error) {
|
|
274
|
+
console.error("Transaction Status Timeout error:", error);
|
|
275
|
+
return json(
|
|
276
|
+
{
|
|
277
|
+
ResultCode: 1,
|
|
278
|
+
ResultDesc: "Processing failed"
|
|
279
|
+
},
|
|
280
|
+
{ status: 200 }
|
|
281
|
+
);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
/**
|
|
286
|
+
* Reversal result handler
|
|
287
|
+
* Handles callbacks from M-Pesa after reversal requests
|
|
288
|
+
*/
|
|
289
|
+
reversalResult: {
|
|
290
|
+
POST: async (event) => {
|
|
291
|
+
try {
|
|
292
|
+
const body = await event.request.json();
|
|
293
|
+
const ipAddress = event.request.headers.get("x-forwarded-for") || event.request.headers.get("x-real-ip") || void 0;
|
|
294
|
+
const response = await client.handleReversalResult(body, ipAddress);
|
|
295
|
+
return json(response, { status: 200 });
|
|
296
|
+
} catch (error) {
|
|
297
|
+
console.error("Reversal Result error:", error);
|
|
298
|
+
return json(
|
|
299
|
+
{
|
|
300
|
+
ResultCode: 1,
|
|
301
|
+
ResultDesc: "Processing failed"
|
|
302
|
+
},
|
|
303
|
+
{ status: 200 }
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
/**
|
|
309
|
+
* Reversal timeout handler
|
|
310
|
+
* Handles timeout notifications from M-Pesa for reversal requests
|
|
311
|
+
*/
|
|
312
|
+
reversalTimeout: {
|
|
313
|
+
POST: async (event) => {
|
|
314
|
+
try {
|
|
315
|
+
const body = await event.request.json();
|
|
316
|
+
console.log("Reversal Timeout:", body);
|
|
317
|
+
return json(
|
|
318
|
+
{
|
|
319
|
+
ResultCode: 0,
|
|
320
|
+
ResultDesc: "Timeout received"
|
|
321
|
+
},
|
|
322
|
+
{ status: 200 }
|
|
323
|
+
);
|
|
324
|
+
} catch (error) {
|
|
325
|
+
console.error("Reversal Timeout error:", error);
|
|
326
|
+
return json(
|
|
327
|
+
{
|
|
328
|
+
ResultCode: 1,
|
|
329
|
+
ResultDesc: "Processing failed"
|
|
330
|
+
},
|
|
331
|
+
{ status: 200 }
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
},
|
|
132
336
|
/**
|
|
133
337
|
* Catch-all handler for all M-Pesa webhooks and client-side API requests
|
|
134
338
|
* Routes based on URL path segment
|
|
@@ -187,60 +391,28 @@ function createMpesaHandlers(client) {
|
|
|
187
391
|
return handlers.b2cTimeout.POST(event);
|
|
188
392
|
}
|
|
189
393
|
if (lastSegment === "b2b-result") {
|
|
190
|
-
|
|
191
|
-
const parsed = client.getCallbackHandler().parseB2BCallback(body);
|
|
192
|
-
console.log("B2B Result:", parsed);
|
|
193
|
-
return json({ ResultCode: 0, ResultDesc: "Accepted" });
|
|
394
|
+
return handlers.b2bResult.POST(event);
|
|
194
395
|
}
|
|
195
396
|
if (lastSegment === "b2b-timeout") {
|
|
196
|
-
|
|
197
|
-
console.log("B2B Timeout:", body);
|
|
198
|
-
return json({
|
|
199
|
-
ResultCode: 0,
|
|
200
|
-
ResultDesc: "Timeout received"
|
|
201
|
-
});
|
|
397
|
+
return handlers.b2bTimeout.POST(event);
|
|
202
398
|
}
|
|
203
399
|
if (lastSegment === "balance-result") {
|
|
204
|
-
|
|
205
|
-
const parsed = client.getCallbackHandler().parseAccountBalanceCallback(body);
|
|
206
|
-
console.log("Balance Result:", parsed);
|
|
207
|
-
return json({ ResultCode: 0, ResultDesc: "Accepted" });
|
|
400
|
+
return handlers.accountBalanceResult.POST(event);
|
|
208
401
|
}
|
|
209
402
|
if (lastSegment === "balance-timeout") {
|
|
210
|
-
|
|
211
|
-
console.log("Balance Timeout:", body);
|
|
212
|
-
return json({
|
|
213
|
-
ResultCode: 0,
|
|
214
|
-
ResultDesc: "Timeout received"
|
|
215
|
-
});
|
|
403
|
+
return handlers.accountBalanceTimeout.POST(event);
|
|
216
404
|
}
|
|
217
405
|
if (lastSegment === "status-result") {
|
|
218
|
-
|
|
219
|
-
const parsed = client.getCallbackHandler().parseTransactionStatusCallback(body);
|
|
220
|
-
console.log("Status Result:", parsed);
|
|
221
|
-
return json({ ResultCode: 0, ResultDesc: "Accepted" });
|
|
406
|
+
return handlers.transactionStatusResult.POST(event);
|
|
222
407
|
}
|
|
223
408
|
if (lastSegment === "status-timeout") {
|
|
224
|
-
|
|
225
|
-
console.log("Status Timeout:", body);
|
|
226
|
-
return json({
|
|
227
|
-
ResultCode: 0,
|
|
228
|
-
ResultDesc: "Timeout received"
|
|
229
|
-
});
|
|
409
|
+
return handlers.transactionStatusTimeout.POST(event);
|
|
230
410
|
}
|
|
231
411
|
if (lastSegment === "reversal-result") {
|
|
232
|
-
|
|
233
|
-
const parsed = client.getCallbackHandler().parseReversalCallback(body);
|
|
234
|
-
console.log("Reversal Result:", parsed);
|
|
235
|
-
return json({ ResultCode: 0, ResultDesc: "Accepted" });
|
|
412
|
+
return handlers.reversalResult.POST(event);
|
|
236
413
|
}
|
|
237
414
|
if (lastSegment === "reversal-timeout") {
|
|
238
|
-
|
|
239
|
-
console.log("Reversal Timeout:", body);
|
|
240
|
-
return json({
|
|
241
|
-
ResultCode: 0,
|
|
242
|
-
ResultDesc: "Timeout received"
|
|
243
|
-
});
|
|
415
|
+
return handlers.reversalTimeout.POST(event);
|
|
244
416
|
}
|
|
245
417
|
if (lastSegment === "stk-push") {
|
|
246
418
|
const body = await event.request.json();
|
|
@@ -319,15 +491,6 @@ function createMpesaHandlers(client) {
|
|
|
319
491
|
resultUrl,
|
|
320
492
|
timeoutUrl
|
|
321
493
|
} = body;
|
|
322
|
-
console.log("B2B Request Parameters:", {
|
|
323
|
-
amount,
|
|
324
|
-
partyB,
|
|
325
|
-
commandID,
|
|
326
|
-
senderIdentifierType,
|
|
327
|
-
receiverIdentifierType,
|
|
328
|
-
accountReference,
|
|
329
|
-
remarks
|
|
330
|
-
});
|
|
331
494
|
if (!amount || !partyB || !commandID || !accountReference) {
|
|
332
495
|
return json(
|
|
333
496
|
{
|
|
@@ -347,7 +510,6 @@ function createMpesaHandlers(client) {
|
|
|
347
510
|
resultUrl,
|
|
348
511
|
timeoutUrl
|
|
349
512
|
});
|
|
350
|
-
console.log("B2B Response:", response);
|
|
351
513
|
return json(response);
|
|
352
514
|
}
|
|
353
515
|
if (lastSegment === "balance") {
|
|
@@ -467,13 +629,7 @@ function createMpesa(config, options) {
|
|
|
467
629
|
const client = new MpesaClient(config, options);
|
|
468
630
|
const handlers = createMpesaHandlers(client);
|
|
469
631
|
return {
|
|
470
|
-
/**
|
|
471
|
-
* M-Pesa client instance for making API calls
|
|
472
|
-
*/
|
|
473
632
|
client,
|
|
474
|
-
/**
|
|
475
|
-
* Pre-configured SvelteKit route handlers for M-Pesa callbacks
|
|
476
|
-
*/
|
|
477
633
|
handlers
|
|
478
634
|
};
|
|
479
635
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@singularity-payments/sveltekit",
|
|
3
|
-
"version": "0.1.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@sveltejs/kit": "^2.49.2",
|
|
35
|
-
"@singularity-payments/core": "0.1.0
|
|
35
|
+
"@singularity-payments/core": "0.1.0"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/node": "^25.0.3",
|