@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  import { RequestEvent } from '@sveltejs/kit';
2
2
  import { MpesaClient, MpesaConfig, MpesaClientOptions } from '@singularity-payments/core';
3
- export { C2BCallback, C2BRegisterRequest, C2BRegisterResponse, C2BSimulateRequest, C2BSimulateResponse, MpesaClient, MpesaClientOptions, MpesaConfig, ParsedC2BCallback, ParsedCallbackData, STKCallback, STKPushRequest, STKPushResponse, TransactionStatusRequest, TransactionStatusResponse } from '@singularity-payments/core';
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 { C2BCallback, C2BRegisterRequest, C2BRegisterResponse, C2BSimulateRequest, C2BSimulateResponse, MpesaClient, MpesaClientOptions, MpesaConfig, ParsedC2BCallback, ParsedCallbackData, STKCallback, STKPushRequest, STKPushResponse, TransactionStatusRequest, TransactionStatusResponse } from '@singularity-payments/core';
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 parsed = client.getCallbackHandler().parseB2CCallback(body);
110
- console.log("B2C Result:", parsed);
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
- const body = await event.request.json();
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
- const body = await event.request.json();
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
- const body = await event.request.json();
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
- const body = await event.request.json();
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
- const body = await event.request.json();
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
- const body = await event.request.json();
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
- const body = await event.request.json();
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
- const body = await event.request.json();
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 parsed = client.getCallbackHandler().parseB2CCallback(body);
84
- console.log("B2C Result:", parsed);
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
- const body = await event.request.json();
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
- const body = await event.request.json();
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
- const body = await event.request.json();
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
- const body = await event.request.json();
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
- const body = await event.request.json();
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
- const body = await event.request.json();
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
- const body = await event.request.json();
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
- const body = await event.request.json();
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-alpha.7",
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-alpha.7"
35
+ "@singularity-payments/core": "0.1.0"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@types/node": "^25.0.3",