@singularity-payments/nextjs 0.1.0 → 1.0.0-alpha.3

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 { NextRequest, NextResponse } from 'next/server';
2
2
  import { MpesaClient, MpesaConfig, MpesaClientOptions } from '@singularity-payments/core';
3
- export { AccountBalanceCallback, B2BCallback, B2CCallback, C2BCallback, C2BRegisterRequest, C2BRegisterResponse, MpesaClient, MpesaClientOptions, MpesaConfig, ParsedC2BCallback, ParsedCallbackData, ReversalCallback, STKCallback, STKPushRequest, STKPushResponse, TransactionStatusCallback, TransactionStatusRequest, TransactionStatusResponse } from '@singularity-payments/core';
3
+ export { AccountBalanceCallback, AccountBalanceRequest, AccountBalanceResponse, B2BCallback, B2BRequest, B2BResponse, B2CCallback, B2CRequest, B2CResponse, C2BCallback, C2BRegisterRequest, C2BRegisterResponse, GeneralTransactionStatusRequest, GeneralTransactionStatusResponse, MpesaClient, MpesaClientOptions, MpesaConfig, ParsedC2BCallback, ParsedCallbackData, ReversalCallback, ReversalRequest, ReversalResponse, STKCallback, STKPushRequest, STKPushResponse, TransactionStatusCallback, TransactionStatusRequest, TransactionStatusResponse } from '@singularity-payments/core';
4
4
 
5
5
  interface RouteHandler {
6
6
  POST: (request: NextRequest) => Promise<NextResponse>;
@@ -11,15 +11,15 @@ interface MpesaRouteHandlers {
11
11
  c2bConfirmation: RouteHandler;
12
12
  b2cResult: RouteHandler;
13
13
  b2cTimeout: RouteHandler;
14
+ catchAll: RouteHandler;
14
15
  b2bResult: RouteHandler;
15
16
  b2bTimeout: RouteHandler;
16
17
  balanceResult: RouteHandler;
17
18
  balanceTimeout: RouteHandler;
18
- statusResult: RouteHandler;
19
- statusTimeout: RouteHandler;
19
+ transactionStatusResult: RouteHandler;
20
+ transactionStatusTimeout: RouteHandler;
20
21
  reversalResult: RouteHandler;
21
22
  reversalTimeout: RouteHandler;
22
- catchAll: RouteHandler;
23
23
  }
24
24
 
25
25
  /**
@@ -28,12 +28,12 @@ interface MpesaRouteHandlers {
28
28
  declare function createMpesaHandlers(client: MpesaClient): MpesaRouteHandlers;
29
29
 
30
30
  /**
31
- * Create M-Pesa instance for Nuxt
31
+ * Create M-Pesa instance for Next.js
32
32
  *
33
33
  * @example
34
34
  * ```typescript
35
- * // utils/mpesa.ts
36
- * import { createMpesa } from "@singularity-payments/nuxt";
35
+ * // lib/mpesa.ts
36
+ * import { createMpesa } from "@singularity-payments/nextjs";
37
37
  *
38
38
  * export const mpesa = createMpesa({
39
39
  * consumerKey: process.env.MPESA_CONSUMER_KEY!,
@@ -41,7 +41,7 @@ declare function createMpesaHandlers(client: MpesaClient): MpesaRouteHandlers;
41
41
  * passkey: process.env.MPESA_PASSKEY!,
42
42
  * shortcode: process.env.MPESA_SHORTCODE!,
43
43
  * environment: "sandbox",
44
- * callbackUrl: `${process.env.NUXT_PUBLIC_APP_URL}/api/mpesa/callback`
44
+ * callbackUrl: `${process.env.NEXT_PUBLIC_APP_URL}/api/mpesa/callback`
45
45
  * }, {
46
46
  * callbackOptions: {
47
47
  * onSuccess: async (data) => {
@@ -57,10 +57,10 @@ declare function createMpesaHandlers(client: MpesaClient): MpesaRouteHandlers;
57
57
  *
58
58
  * @example
59
59
  * ```typescript
60
- * // server/api/mpesa/[...mpesa].ts
61
- * import { mpesa } from "~/utils/mpesa";
60
+ * // app/api/mpesa/callback/route.ts
61
+ * import { mpesa } from "@/lib/mpesa";
62
62
  *
63
- * export default mpesa.handlers.catchAll;
63
+ * export const { POST } = mpesa.handlers.stkCallback;
64
64
  * ```
65
65
  */
66
66
  declare function createMpesa(config: MpesaConfig, options?: MpesaClientOptions): {
@@ -69,7 +69,7 @@ declare function createMpesa(config: MpesaConfig, options?: MpesaClientOptions):
69
69
  */
70
70
  client: MpesaClient;
71
71
  /**
72
- * Pre-configured Nuxt event handlers for M-Pesa callbacks
72
+ * Pre-configured Next.js route handlers for M-Pesa callbacks
73
73
  */
74
74
  handlers: MpesaRouteHandlers;
75
75
  };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { NextRequest, NextResponse } from 'next/server';
2
2
  import { MpesaClient, MpesaConfig, MpesaClientOptions } from '@singularity-payments/core';
3
- export { AccountBalanceCallback, B2BCallback, B2CCallback, C2BCallback, C2BRegisterRequest, C2BRegisterResponse, MpesaClient, MpesaClientOptions, MpesaConfig, ParsedC2BCallback, ParsedCallbackData, ReversalCallback, STKCallback, STKPushRequest, STKPushResponse, TransactionStatusCallback, TransactionStatusRequest, TransactionStatusResponse } from '@singularity-payments/core';
3
+ export { AccountBalanceCallback, AccountBalanceRequest, AccountBalanceResponse, B2BCallback, B2BRequest, B2BResponse, B2CCallback, B2CRequest, B2CResponse, C2BCallback, C2BRegisterRequest, C2BRegisterResponse, GeneralTransactionStatusRequest, GeneralTransactionStatusResponse, MpesaClient, MpesaClientOptions, MpesaConfig, ParsedC2BCallback, ParsedCallbackData, ReversalCallback, ReversalRequest, ReversalResponse, STKCallback, STKPushRequest, STKPushResponse, TransactionStatusCallback, TransactionStatusRequest, TransactionStatusResponse } from '@singularity-payments/core';
4
4
 
5
5
  interface RouteHandler {
6
6
  POST: (request: NextRequest) => Promise<NextResponse>;
@@ -11,15 +11,15 @@ interface MpesaRouteHandlers {
11
11
  c2bConfirmation: RouteHandler;
12
12
  b2cResult: RouteHandler;
13
13
  b2cTimeout: RouteHandler;
14
+ catchAll: RouteHandler;
14
15
  b2bResult: RouteHandler;
15
16
  b2bTimeout: RouteHandler;
16
17
  balanceResult: RouteHandler;
17
18
  balanceTimeout: RouteHandler;
18
- statusResult: RouteHandler;
19
- statusTimeout: RouteHandler;
19
+ transactionStatusResult: RouteHandler;
20
+ transactionStatusTimeout: RouteHandler;
20
21
  reversalResult: RouteHandler;
21
22
  reversalTimeout: RouteHandler;
22
- catchAll: RouteHandler;
23
23
  }
24
24
 
25
25
  /**
@@ -28,12 +28,12 @@ interface MpesaRouteHandlers {
28
28
  declare function createMpesaHandlers(client: MpesaClient): MpesaRouteHandlers;
29
29
 
30
30
  /**
31
- * Create M-Pesa instance for Nuxt
31
+ * Create M-Pesa instance for Next.js
32
32
  *
33
33
  * @example
34
34
  * ```typescript
35
- * // utils/mpesa.ts
36
- * import { createMpesa } from "@singularity-payments/nuxt";
35
+ * // lib/mpesa.ts
36
+ * import { createMpesa } from "@singularity-payments/nextjs";
37
37
  *
38
38
  * export const mpesa = createMpesa({
39
39
  * consumerKey: process.env.MPESA_CONSUMER_KEY!,
@@ -41,7 +41,7 @@ declare function createMpesaHandlers(client: MpesaClient): MpesaRouteHandlers;
41
41
  * passkey: process.env.MPESA_PASSKEY!,
42
42
  * shortcode: process.env.MPESA_SHORTCODE!,
43
43
  * environment: "sandbox",
44
- * callbackUrl: `${process.env.NUXT_PUBLIC_APP_URL}/api/mpesa/callback`
44
+ * callbackUrl: `${process.env.NEXT_PUBLIC_APP_URL}/api/mpesa/callback`
45
45
  * }, {
46
46
  * callbackOptions: {
47
47
  * onSuccess: async (data) => {
@@ -57,10 +57,10 @@ declare function createMpesaHandlers(client: MpesaClient): MpesaRouteHandlers;
57
57
  *
58
58
  * @example
59
59
  * ```typescript
60
- * // server/api/mpesa/[...mpesa].ts
61
- * import { mpesa } from "~/utils/mpesa";
60
+ * // app/api/mpesa/callback/route.ts
61
+ * import { mpesa } from "@/lib/mpesa";
62
62
  *
63
- * export default mpesa.handlers.catchAll;
63
+ * export const { POST } = mpesa.handlers.stkCallback;
64
64
  * ```
65
65
  */
66
66
  declare function createMpesa(config: MpesaConfig, options?: MpesaClientOptions): {
@@ -69,7 +69,7 @@ declare function createMpesa(config: MpesaConfig, options?: MpesaClientOptions):
69
69
  */
70
70
  client: MpesaClient;
71
71
  /**
72
- * Pre-configured Nuxt event handlers for M-Pesa callbacks
72
+ * Pre-configured Next.js route handlers for M-Pesa callbacks
73
73
  */
74
74
  handlers: MpesaRouteHandlers;
75
75
  };
package/dist/index.js CHANGED
@@ -127,69 +127,6 @@ function createMpesaHandlers(client) {
127
127
  }
128
128
  }
129
129
  },
130
- /**
131
- * B2C timeout handler
132
- * Handles timeout notifications from M-Pesa for B2C requests
133
- */
134
- b2cTimeout: {
135
- POST: async (request) => {
136
- try {
137
- const body = await request.json();
138
- console.log("B2C Timeout:", body);
139
- return import_server.NextResponse.json(
140
- {
141
- ResultCode: 0,
142
- ResultDesc: "Timeout received"
143
- },
144
- { status: 200 }
145
- );
146
- } catch (error) {
147
- console.error("B2C Timeout error:", error);
148
- return import_server.NextResponse.json(
149
- {
150
- ResultCode: 1,
151
- ResultDesc: "Processing failed"
152
- },
153
- { status: 200 }
154
- );
155
- }
156
- }
157
- },
158
- /**
159
- * Catch-all handler for all M-Pesa webhooks and client-side API requests
160
- * Routes based on URL path segment
161
- *
162
- * Usage: app/api/mpesa/[...mpesa]/route.ts
163
- * export const { POST } = mpesa.handlers.catchAll;
164
- *
165
- * Supported endpoints:
166
- *
167
- * WEBHOOKS (from M-Pesa):
168
- * - /api/mpesa/callback or /api/mpesa/stk-callback - STK Push callbacks
169
- * - /api/mpesa/validation or /api/mpesa/c2b-validation - C2B validation
170
- * - /api/mpesa/confirmation or /api/mpesa/c2b-confirmation - C2B confirmation
171
- * - /api/mpesa/b2c-result - B2C result callback
172
- * - /api/mpesa/b2c-timeout - B2C timeout callback
173
- * - /api/mpesa/b2b-result - B2B result callback
174
- * - /api/mpesa/b2b-timeout - B2B timeout callback
175
- * - /api/mpesa/balance-result - Account balance result
176
- * - /api/mpesa/balance-timeout - Account balance timeout
177
- * - /api/mpesa/reversal-result - Reversal result
178
- * - /api/mpesa/reversal-timeout - Reversal timeout
179
- * - /api/mpesa/status-result - Transaction status result
180
- * - /api/mpesa/status-timeout - Transaction status timeout
181
- *
182
- * CLIENT APIs (from the frontend package, will recode react soon):
183
- * - /api/mpesa/stk-push - Initiate STK Push request
184
- * - /api/mpesa/stk-query - Query STK Push status
185
- * - /api/mpesa/b2c - Initiate B2C payment
186
- * - /api/mpesa/b2b - Initiate B2B payment
187
- * - /api/mpesa/balance - Query account balance
188
- * - /api/mpesa/transaction-status - Query transaction status
189
- * - /api/mpesa/reversal - Reverse a transaction
190
- * - /api/mpesa/register-c2b - Register C2B URLs
191
- * - /api/mpesa/generate-qr - Generate dynamic QR code
192
- */
193
130
  /**
194
131
  * B2B result handler
195
132
  * Handles callbacks from M-Pesa after B2B requests
@@ -198,8 +135,7 @@ function createMpesaHandlers(client) {
198
135
  POST: async (request) => {
199
136
  try {
200
137
  const body = await request.json();
201
- const ipAddress = request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0;
202
- const response = await client.handleB2BResult(body, ipAddress);
138
+ const response = await client.handleB2BCallback(body);
203
139
  return import_server.NextResponse.json(response, { status: 200 });
204
140
  } catch (error) {
205
141
  console.error("B2B Result error:", error);
@@ -242,21 +178,17 @@ function createMpesaHandlers(client) {
242
178
  }
243
179
  },
244
180
  /**
245
- * Account balance result handler
181
+ * Account Balance result handler
246
182
  * Handles callbacks from M-Pesa after balance query requests
247
183
  */
248
184
  balanceResult: {
249
185
  POST: async (request) => {
250
186
  try {
251
187
  const body = await request.json();
252
- const ipAddress = request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0;
253
- const response = await client.handleAccountBalanceResult(
254
- body,
255
- ipAddress
256
- );
188
+ const response = await client.handleAccountBalanceCallback(body);
257
189
  return import_server.NextResponse.json(response, { status: 200 });
258
190
  } catch (error) {
259
- console.error("Account Balance Result error:", error);
191
+ console.error("Balance Result error:", error);
260
192
  return import_server.NextResponse.json(
261
193
  {
262
194
  ResultCode: 1,
@@ -268,7 +200,7 @@ function createMpesaHandlers(client) {
268
200
  }
269
201
  },
270
202
  /**
271
- * Account balance timeout handler
203
+ * Account Balance timeout handler
272
204
  * Handles timeout notifications from M-Pesa for balance queries
273
205
  */
274
206
  balanceTimeout: {
@@ -296,18 +228,14 @@ function createMpesaHandlers(client) {
296
228
  }
297
229
  },
298
230
  /**
299
- * Transaction status result handler
300
- * Handles callbacks from M-Pesa after transaction status requests
231
+ * Transaction Status result handler
232
+ * Handles callbacks from M-Pesa after transaction status queries
301
233
  */
302
- statusResult: {
234
+ transactionStatusResult: {
303
235
  POST: async (request) => {
304
236
  try {
305
237
  const body = await request.json();
306
- const ipAddress = request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0;
307
- const response = await client.handleTransactionStatusResult(
308
- body,
309
- ipAddress
310
- );
238
+ const response = await client.handleTransactionStatusCallback(body);
311
239
  return import_server.NextResponse.json(response, { status: 200 });
312
240
  } catch (error) {
313
241
  console.error("Transaction Status Result error:", error);
@@ -322,14 +250,14 @@ function createMpesaHandlers(client) {
322
250
  }
323
251
  },
324
252
  /**
325
- * Transaction status timeout handler
253
+ * Transaction Status timeout handler
326
254
  * Handles timeout notifications from M-Pesa for status queries
327
255
  */
328
- statusTimeout: {
256
+ transactionStatusTimeout: {
329
257
  POST: async (request) => {
330
258
  try {
331
259
  const body = await request.json();
332
- console.log("Status Timeout:", body);
260
+ console.log("Transaction Status Timeout:", body);
333
261
  return import_server.NextResponse.json(
334
262
  {
335
263
  ResultCode: 0,
@@ -338,7 +266,7 @@ function createMpesaHandlers(client) {
338
266
  { status: 200 }
339
267
  );
340
268
  } catch (error) {
341
- console.error("Status Timeout error:", error);
269
+ console.error("Transaction Status Timeout error:", error);
342
270
  return import_server.NextResponse.json(
343
271
  {
344
272
  ResultCode: 1,
@@ -357,8 +285,7 @@ function createMpesaHandlers(client) {
357
285
  POST: async (request) => {
358
286
  try {
359
287
  const body = await request.json();
360
- const ipAddress = request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0;
361
- const response = await client.handleReversalResult(body, ipAddress);
288
+ const response = await client.handleReversalCallback(body);
362
289
  return import_server.NextResponse.json(response, { status: 200 });
363
290
  } catch (error) {
364
291
  console.error("Reversal Result error:", error);
@@ -400,6 +327,69 @@ function createMpesaHandlers(client) {
400
327
  }
401
328
  }
402
329
  },
330
+ /**
331
+ * B2C timeout handler
332
+ * Handles timeout notifications from M-Pesa for B2C requests
333
+ */
334
+ b2cTimeout: {
335
+ POST: async (request) => {
336
+ try {
337
+ const body = await request.json();
338
+ console.log("B2C Timeout:", body);
339
+ return import_server.NextResponse.json(
340
+ {
341
+ ResultCode: 0,
342
+ ResultDesc: "Timeout received"
343
+ },
344
+ { status: 200 }
345
+ );
346
+ } catch (error) {
347
+ console.error("B2C Timeout error:", error);
348
+ return import_server.NextResponse.json(
349
+ {
350
+ ResultCode: 1,
351
+ ResultDesc: "Processing failed"
352
+ },
353
+ { status: 200 }
354
+ );
355
+ }
356
+ }
357
+ },
358
+ /**
359
+ * Catch-all handler for all M-Pesa webhooks and client-side API requests
360
+ * Routes based on URL path segment
361
+ *
362
+ * Usage: app/api/mpesa/[...mpesa]/route.ts
363
+ * export const { POST } = mpesa.handlers.catchAll;
364
+ *
365
+ * Supported endpoints:
366
+ *
367
+ * WEBHOOKS (from M-Pesa):
368
+ * - /api/mpesa/callback or /api/mpesa/stk-callback - STK Push callbacks
369
+ * - /api/mpesa/validation or /api/mpesa/c2b-validation - C2B validation
370
+ * - /api/mpesa/confirmation or /api/mpesa/c2b-confirmation - C2B confirmation
371
+ * - /api/mpesa/b2c-result - B2C result callback
372
+ * - /api/mpesa/b2c-timeout - B2C timeout callback
373
+ * - /api/mpesa/b2b-result - B2B result callback
374
+ * - /api/mpesa/b2b-timeout - B2B timeout callback
375
+ * - /api/mpesa/balance-result - Account balance result
376
+ * - /api/mpesa/balance-timeout - Account balance timeout
377
+ * - /api/mpesa/reversal-result - Reversal result
378
+ * - /api/mpesa/reversal-timeout - Reversal timeout
379
+ * - /api/mpesa/status-result - Transaction status result
380
+ * - /api/mpesa/status-timeout - Transaction status timeout
381
+ *
382
+ * CLIENT APIs (from the frontend package, will recode react soon):
383
+ * - /api/mpesa/stk-push - Initiate STK Push request
384
+ * - /api/mpesa/stk-query - Query STK Push status
385
+ * - /api/mpesa/b2c - Initiate B2C payment
386
+ * - /api/mpesa/b2b - Initiate B2B payment
387
+ * - /api/mpesa/balance - Query account balance
388
+ * - /api/mpesa/transaction-status - Query transaction status
389
+ * - /api/mpesa/reversal - Reverse a transaction
390
+ * - /api/mpesa/register-c2b - Register C2B URLs
391
+ * - /api/mpesa/generate-qr - Generate dynamic QR code
392
+ */
403
393
  catchAll: {
404
394
  POST: async (request) => {
405
395
  const pathname = request.nextUrl.pathname;
@@ -434,10 +424,10 @@ function createMpesaHandlers(client) {
434
424
  return handlers.balanceTimeout.POST(request);
435
425
  }
436
426
  if (lastSegment === "status-result") {
437
- return handlers.statusResult.POST(request);
427
+ return handlers.transactionStatusResult.POST(request);
438
428
  }
439
429
  if (lastSegment === "status-timeout") {
440
- return handlers.statusTimeout.POST(request);
430
+ return handlers.transactionStatusTimeout.POST(request);
441
431
  }
442
432
  if (lastSegment === "reversal-result") {
443
433
  return handlers.reversalResult.POST(request);
@@ -673,7 +663,7 @@ function createMpesa(config, options) {
673
663
  */
674
664
  client,
675
665
  /**
676
- * Pre-configured Nuxt event handlers for M-Pesa callbacks
666
+ * Pre-configured Next.js route handlers for M-Pesa callbacks
677
667
  */
678
668
  handlers
679
669
  };
package/dist/index.mjs CHANGED
@@ -101,69 +101,6 @@ function createMpesaHandlers(client) {
101
101
  }
102
102
  }
103
103
  },
104
- /**
105
- * B2C timeout handler
106
- * Handles timeout notifications from M-Pesa for B2C requests
107
- */
108
- b2cTimeout: {
109
- POST: async (request) => {
110
- try {
111
- const body = await request.json();
112
- console.log("B2C Timeout:", body);
113
- return NextResponse.json(
114
- {
115
- ResultCode: 0,
116
- ResultDesc: "Timeout received"
117
- },
118
- { status: 200 }
119
- );
120
- } catch (error) {
121
- console.error("B2C Timeout error:", error);
122
- return NextResponse.json(
123
- {
124
- ResultCode: 1,
125
- ResultDesc: "Processing failed"
126
- },
127
- { status: 200 }
128
- );
129
- }
130
- }
131
- },
132
- /**
133
- * Catch-all handler for all M-Pesa webhooks and client-side API requests
134
- * Routes based on URL path segment
135
- *
136
- * Usage: app/api/mpesa/[...mpesa]/route.ts
137
- * export const { POST } = mpesa.handlers.catchAll;
138
- *
139
- * Supported endpoints:
140
- *
141
- * WEBHOOKS (from M-Pesa):
142
- * - /api/mpesa/callback or /api/mpesa/stk-callback - STK Push callbacks
143
- * - /api/mpesa/validation or /api/mpesa/c2b-validation - C2B validation
144
- * - /api/mpesa/confirmation or /api/mpesa/c2b-confirmation - C2B confirmation
145
- * - /api/mpesa/b2c-result - B2C result callback
146
- * - /api/mpesa/b2c-timeout - B2C timeout callback
147
- * - /api/mpesa/b2b-result - B2B result callback
148
- * - /api/mpesa/b2b-timeout - B2B timeout callback
149
- * - /api/mpesa/balance-result - Account balance result
150
- * - /api/mpesa/balance-timeout - Account balance timeout
151
- * - /api/mpesa/reversal-result - Reversal result
152
- * - /api/mpesa/reversal-timeout - Reversal timeout
153
- * - /api/mpesa/status-result - Transaction status result
154
- * - /api/mpesa/status-timeout - Transaction status timeout
155
- *
156
- * CLIENT APIs (from the frontend package, will recode react soon):
157
- * - /api/mpesa/stk-push - Initiate STK Push request
158
- * - /api/mpesa/stk-query - Query STK Push status
159
- * - /api/mpesa/b2c - Initiate B2C payment
160
- * - /api/mpesa/b2b - Initiate B2B payment
161
- * - /api/mpesa/balance - Query account balance
162
- * - /api/mpesa/transaction-status - Query transaction status
163
- * - /api/mpesa/reversal - Reverse a transaction
164
- * - /api/mpesa/register-c2b - Register C2B URLs
165
- * - /api/mpesa/generate-qr - Generate dynamic QR code
166
- */
167
104
  /**
168
105
  * B2B result handler
169
106
  * Handles callbacks from M-Pesa after B2B requests
@@ -172,8 +109,7 @@ function createMpesaHandlers(client) {
172
109
  POST: async (request) => {
173
110
  try {
174
111
  const body = await request.json();
175
- const ipAddress = request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0;
176
- const response = await client.handleB2BResult(body, ipAddress);
112
+ const response = await client.handleB2BCallback(body);
177
113
  return NextResponse.json(response, { status: 200 });
178
114
  } catch (error) {
179
115
  console.error("B2B Result error:", error);
@@ -216,21 +152,17 @@ function createMpesaHandlers(client) {
216
152
  }
217
153
  },
218
154
  /**
219
- * Account balance result handler
155
+ * Account Balance result handler
220
156
  * Handles callbacks from M-Pesa after balance query requests
221
157
  */
222
158
  balanceResult: {
223
159
  POST: async (request) => {
224
160
  try {
225
161
  const body = await request.json();
226
- const ipAddress = request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0;
227
- const response = await client.handleAccountBalanceResult(
228
- body,
229
- ipAddress
230
- );
162
+ const response = await client.handleAccountBalanceCallback(body);
231
163
  return NextResponse.json(response, { status: 200 });
232
164
  } catch (error) {
233
- console.error("Account Balance Result error:", error);
165
+ console.error("Balance Result error:", error);
234
166
  return NextResponse.json(
235
167
  {
236
168
  ResultCode: 1,
@@ -242,7 +174,7 @@ function createMpesaHandlers(client) {
242
174
  }
243
175
  },
244
176
  /**
245
- * Account balance timeout handler
177
+ * Account Balance timeout handler
246
178
  * Handles timeout notifications from M-Pesa for balance queries
247
179
  */
248
180
  balanceTimeout: {
@@ -270,18 +202,14 @@ function createMpesaHandlers(client) {
270
202
  }
271
203
  },
272
204
  /**
273
- * Transaction status result handler
274
- * Handles callbacks from M-Pesa after transaction status requests
205
+ * Transaction Status result handler
206
+ * Handles callbacks from M-Pesa after transaction status queries
275
207
  */
276
- statusResult: {
208
+ transactionStatusResult: {
277
209
  POST: async (request) => {
278
210
  try {
279
211
  const body = await request.json();
280
- const ipAddress = request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0;
281
- const response = await client.handleTransactionStatusResult(
282
- body,
283
- ipAddress
284
- );
212
+ const response = await client.handleTransactionStatusCallback(body);
285
213
  return NextResponse.json(response, { status: 200 });
286
214
  } catch (error) {
287
215
  console.error("Transaction Status Result error:", error);
@@ -296,14 +224,14 @@ function createMpesaHandlers(client) {
296
224
  }
297
225
  },
298
226
  /**
299
- * Transaction status timeout handler
227
+ * Transaction Status timeout handler
300
228
  * Handles timeout notifications from M-Pesa for status queries
301
229
  */
302
- statusTimeout: {
230
+ transactionStatusTimeout: {
303
231
  POST: async (request) => {
304
232
  try {
305
233
  const body = await request.json();
306
- console.log("Status Timeout:", body);
234
+ console.log("Transaction Status Timeout:", body);
307
235
  return NextResponse.json(
308
236
  {
309
237
  ResultCode: 0,
@@ -312,7 +240,7 @@ function createMpesaHandlers(client) {
312
240
  { status: 200 }
313
241
  );
314
242
  } catch (error) {
315
- console.error("Status Timeout error:", error);
243
+ console.error("Transaction Status Timeout error:", error);
316
244
  return NextResponse.json(
317
245
  {
318
246
  ResultCode: 1,
@@ -331,8 +259,7 @@ function createMpesaHandlers(client) {
331
259
  POST: async (request) => {
332
260
  try {
333
261
  const body = await request.json();
334
- const ipAddress = request.headers.get("x-forwarded-for") || request.headers.get("x-real-ip") || void 0;
335
- const response = await client.handleReversalResult(body, ipAddress);
262
+ const response = await client.handleReversalCallback(body);
336
263
  return NextResponse.json(response, { status: 200 });
337
264
  } catch (error) {
338
265
  console.error("Reversal Result error:", error);
@@ -374,6 +301,69 @@ function createMpesaHandlers(client) {
374
301
  }
375
302
  }
376
303
  },
304
+ /**
305
+ * B2C timeout handler
306
+ * Handles timeout notifications from M-Pesa for B2C requests
307
+ */
308
+ b2cTimeout: {
309
+ POST: async (request) => {
310
+ try {
311
+ const body = await request.json();
312
+ console.log("B2C Timeout:", body);
313
+ return NextResponse.json(
314
+ {
315
+ ResultCode: 0,
316
+ ResultDesc: "Timeout received"
317
+ },
318
+ { status: 200 }
319
+ );
320
+ } catch (error) {
321
+ console.error("B2C Timeout error:", error);
322
+ return NextResponse.json(
323
+ {
324
+ ResultCode: 1,
325
+ ResultDesc: "Processing failed"
326
+ },
327
+ { status: 200 }
328
+ );
329
+ }
330
+ }
331
+ },
332
+ /**
333
+ * Catch-all handler for all M-Pesa webhooks and client-side API requests
334
+ * Routes based on URL path segment
335
+ *
336
+ * Usage: app/api/mpesa/[...mpesa]/route.ts
337
+ * export const { POST } = mpesa.handlers.catchAll;
338
+ *
339
+ * Supported endpoints:
340
+ *
341
+ * WEBHOOKS (from M-Pesa):
342
+ * - /api/mpesa/callback or /api/mpesa/stk-callback - STK Push callbacks
343
+ * - /api/mpesa/validation or /api/mpesa/c2b-validation - C2B validation
344
+ * - /api/mpesa/confirmation or /api/mpesa/c2b-confirmation - C2B confirmation
345
+ * - /api/mpesa/b2c-result - B2C result callback
346
+ * - /api/mpesa/b2c-timeout - B2C timeout callback
347
+ * - /api/mpesa/b2b-result - B2B result callback
348
+ * - /api/mpesa/b2b-timeout - B2B timeout callback
349
+ * - /api/mpesa/balance-result - Account balance result
350
+ * - /api/mpesa/balance-timeout - Account balance timeout
351
+ * - /api/mpesa/reversal-result - Reversal result
352
+ * - /api/mpesa/reversal-timeout - Reversal timeout
353
+ * - /api/mpesa/status-result - Transaction status result
354
+ * - /api/mpesa/status-timeout - Transaction status timeout
355
+ *
356
+ * CLIENT APIs (from the frontend package, will recode react soon):
357
+ * - /api/mpesa/stk-push - Initiate STK Push request
358
+ * - /api/mpesa/stk-query - Query STK Push status
359
+ * - /api/mpesa/b2c - Initiate B2C payment
360
+ * - /api/mpesa/b2b - Initiate B2B payment
361
+ * - /api/mpesa/balance - Query account balance
362
+ * - /api/mpesa/transaction-status - Query transaction status
363
+ * - /api/mpesa/reversal - Reverse a transaction
364
+ * - /api/mpesa/register-c2b - Register C2B URLs
365
+ * - /api/mpesa/generate-qr - Generate dynamic QR code
366
+ */
377
367
  catchAll: {
378
368
  POST: async (request) => {
379
369
  const pathname = request.nextUrl.pathname;
@@ -408,10 +398,10 @@ function createMpesaHandlers(client) {
408
398
  return handlers.balanceTimeout.POST(request);
409
399
  }
410
400
  if (lastSegment === "status-result") {
411
- return handlers.statusResult.POST(request);
401
+ return handlers.transactionStatusResult.POST(request);
412
402
  }
413
403
  if (lastSegment === "status-timeout") {
414
- return handlers.statusTimeout.POST(request);
404
+ return handlers.transactionStatusTimeout.POST(request);
415
405
  }
416
406
  if (lastSegment === "reversal-result") {
417
407
  return handlers.reversalResult.POST(request);
@@ -649,7 +639,7 @@ function createMpesa(config, options) {
649
639
  */
650
640
  client,
651
641
  /**
652
- * Pre-configured Nuxt event handlers for M-Pesa callbacks
642
+ * Pre-configured Next.js route handlers for M-Pesa callbacks
653
643
  */
654
644
  handlers
655
645
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@singularity-payments/nextjs",
3
- "version": "0.1.0",
3
+ "version": "1.0.0-alpha.3",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -31,7 +31,7 @@
31
31
  "next": ">=13.0.0"
32
32
  },
33
33
  "dependencies": {
34
- "@singularity-payments/core": "0.1.0"
34
+ "@singularity-payments/core": "1.0.0-alpha.3"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/node": "^25.0.3",