mpesa-mock 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/LICENSE +25 -0
- package/README.md +180 -0
- package/dist/cli.cjs +2573 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +2 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +2574 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +1407 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +167 -0
- package/dist/index.d.ts +167 -0
- package/dist/index.js +1368 -0
- package/dist/index.js.map +1 -0
- package/package.json +75 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../node_modules/.pnpm/tsup@8.5.1_postcss@8.5.14_tsx@4.21.0_typescript@5.9.3/node_modules/tsup/assets/esm_shims.js","../src/core/transactions.ts","../src/core/webhook-dispatcher.ts","../src/core/id-generator.ts","../src/config/defaults.ts","../src/core/auth.ts","../src/routes/oauth.ts","../src/schemas/index.ts","../src/core/failure-injector.ts","../src/routes/stk-push.ts","../src/routes/stk-query.ts","../src/routes/c2b.ts","../src/routes/b2c.ts","../src/routes/b2b.ts","../src/routes/transaction-status.ts","../src/routes/account-balance.ts","../src/routes/reversal.ts","../src/routes/dashboard.ts","../src/server.ts","../node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/lib/util.js","../node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/lib/sqlite-error.js","../node_modules/.pnpm/file-uri-to-path@1.0.0/node_modules/file-uri-to-path/index.js","../node_modules/.pnpm/bindings@1.5.0/node_modules/bindings/bindings.js","../node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/lib/methods/wrappers.js","../node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/lib/methods/transaction.js","../node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/lib/methods/pragma.js","../node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/lib/methods/backup.js","../node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/lib/methods/serialize.js","../node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/lib/methods/function.js","../node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/lib/methods/aggregate.js","../node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/lib/methods/table.js","../node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/lib/methods/inspect.js","../node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/lib/database.js","../node_modules/.pnpm/better-sqlite3@11.10.0/node_modules/better-sqlite3/lib/index.js","../src/ui/dashboard.ts","../src/cli.ts","../src/core/persistence.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import { EventEmitter } from \"node:events\";\nimport type { TransactionRecord, TransactionState } from \"../types/daraja.js\";\n\nexport interface TransactionStore {\n put(record: TransactionRecord): void;\n get(checkoutRequestID: string): TransactionRecord | undefined;\n getByConversationID(id: string): TransactionRecord | undefined;\n list(limit?: number): TransactionRecord[];\n update(checkoutRequestID: string, patch: Partial<TransactionRecord>): TransactionRecord | undefined;\n clear(): void;\n}\n\nexport class InMemoryStore extends EventEmitter implements TransactionStore {\n private byCheckout = new Map<string, TransactionRecord>();\n private byConversation = new Map<string, string>();\n\n put(record: TransactionRecord): void {\n this.byCheckout.set(record.checkoutRequestID, record);\n if (record.conversationID) {\n this.byConversation.set(record.conversationID, record.checkoutRequestID);\n }\n this.emit(\"change\", record);\n }\n\n get(checkoutRequestID: string): TransactionRecord | undefined {\n return this.byCheckout.get(checkoutRequestID);\n }\n\n getByConversationID(id: string): TransactionRecord | undefined {\n const key = this.byConversation.get(id);\n return key ? this.byCheckout.get(key) : undefined;\n }\n\n list(limit?: number): TransactionRecord[] {\n const all = Array.from(this.byCheckout.values()).sort((a, b) => b.createdAt - a.createdAt);\n return typeof limit === \"number\" ? all.slice(0, limit) : all;\n }\n\n update(checkoutRequestID: string, patch: Partial<TransactionRecord>): TransactionRecord | undefined {\n const existing = this.byCheckout.get(checkoutRequestID);\n if (!existing) return undefined;\n const next = { ...existing, ...patch };\n this.byCheckout.set(checkoutRequestID, next);\n if (next.conversationID) this.byConversation.set(next.conversationID, checkoutRequestID);\n this.emit(\"change\", next);\n return next;\n }\n\n clear(): void {\n this.byCheckout.clear();\n this.byConversation.clear();\n this.emit(\"clear\");\n }\n}\n\nexport function stateToResultCode(state: TransactionState): number {\n switch (state) {\n case \"success\": return 0;\n case \"insufficient_funds\": return 1;\n case \"user_cancelled\": return 1032;\n case \"wrong_pin\": return 2001;\n case \"expired\": return 1037;\n case \"system_error\": return 1025;\n case \"pending\": return 1019;\n case \"timeout\": return 1037;\n }\n}\n\nexport function stateToResultDesc(state: TransactionState): string {\n switch (state) {\n case \"success\": return \"The service request is processed successfully.\";\n case \"insufficient_funds\": return \"The balance is insufficient for the transaction.\";\n case \"user_cancelled\": return \"Request cancelled by user.\";\n case \"wrong_pin\": return \"The initiator information is invalid.\";\n case \"expired\": return \"DS timeout. User cannot be reached.\";\n case \"system_error\": return \"An error occurred while sending a push request.\";\n case \"pending\": return \"The transaction is being processed.\";\n case \"timeout\": return \"DS timeout. User cannot be reached.\";\n }\n}\n","import { EventEmitter } from \"node:events\";\nimport pRetry, { AbortError } from \"p-retry\";\nimport type { InMemoryStore } from \"./transactions.js\";\n\nexport interface WebhookJob {\n id: string;\n url: string;\n body: unknown;\n scheduledAt: number;\n attempts: number;\n maxAttempts: number;\n backoffMs: number;\n transactionId?: string;\n failNTimesFirst?: number;\n}\n\nexport interface DispatcherOptions {\n store?: InMemoryStore;\n fetchImpl?: typeof fetch;\n onLog?: (msg: string) => void;\n}\n\nexport class WebhookDispatcher extends EventEmitter {\n private pending = new Map<string, NodeJS.Timeout>();\n private store?: InMemoryStore;\n private fetchImpl: typeof fetch;\n private onLog?: (msg: string) => void;\n\n constructor(opts: DispatcherOptions = {}) {\n super();\n this.store = opts.store;\n this.fetchImpl = opts.fetchImpl ?? fetch;\n this.onLog = opts.onLog;\n }\n\n schedule(job: WebhookJob, delayMs: number): void {\n if (delayMs < 0) {\n this.emit(\"skipped\", { id: job.id, reason: \"timeout\" });\n return;\n }\n if (this.pending.has(job.id)) {\n clearTimeout(this.pending.get(job.id));\n }\n const handle = setTimeout(() => {\n this.pending.delete(job.id);\n void this.fire(job);\n }, delayMs);\n this.pending.set(job.id, handle);\n this.emit(\"scheduled\", { id: job.id, delayMs, url: job.url });\n }\n\n cancel(id: string): boolean {\n const h = this.pending.get(id);\n if (!h) return false;\n clearTimeout(h);\n this.pending.delete(id);\n return true;\n }\n\n pendingIds(): string[] {\n return Array.from(this.pending.keys());\n }\n\n async fire(job: WebhookJob): Promise<void> {\n let attempt = 0;\n try {\n await pRetry(\n async () => {\n attempt += 1;\n if (typeof job.failNTimesFirst === \"number\" && attempt <= job.failNTimesFirst) {\n this.onLog?.(`webhook attempt ${attempt} forced-fail for ${job.url}`);\n throw new Error(`forced fail ${attempt}`);\n }\n const res = await this.fetchImpl(job.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(job.body),\n });\n if (!res.ok && res.status >= 500) {\n throw new Error(`callback ${res.status}`);\n }\n if (!res.ok && res.status >= 400) {\n throw new AbortError(`callback ${res.status}`);\n }\n this.emit(\"delivered\", { id: job.id, url: job.url, attempts: attempt });\n if (this.store && job.transactionId) {\n this.store.update(job.transactionId, {\n callbackAttempts: attempt,\n callbackDeliveredAt: Date.now(),\n });\n }\n },\n {\n retries: job.maxAttempts - 1,\n minTimeout: job.backoffMs,\n factor: 2,\n onFailedAttempt: (err) => {\n this.onLog?.(`webhook ${job.url} attempt ${err.attemptNumber} failed: ${err.message}`);\n },\n },\n );\n } catch (err) {\n this.emit(\"failed\", {\n id: job.id,\n url: job.url,\n attempts: attempt,\n error: err instanceof Error ? err.message : String(err),\n });\n if (this.store && job.transactionId) {\n this.store.update(job.transactionId, { callbackAttempts: attempt });\n }\n }\n }\n\n shutdown(): void {\n for (const handle of this.pending.values()) clearTimeout(handle);\n this.pending.clear();\n }\n}\n","import { randomBytes, randomInt } from \"node:crypto\";\n\nexport function generateAccessToken(): string {\n return randomBytes(24).toString(\"base64\").replace(/[^a-zA-Z0-9]/g, \"\").slice(0, 32).padEnd(32, \"0\");\n}\n\nexport function generateMerchantRequestID(): string {\n const a = randomInt(10000, 99999);\n const b = randomInt(10000000, 99999999);\n const c = randomInt(1, 9);\n return `${a}-${b}-${c}`;\n}\n\nexport function generateCheckoutRequestID(date = new Date()): string {\n const pad = (n: number, len = 2) => String(n).padStart(len, \"0\");\n const dd = pad(date.getDate());\n const mm = pad(date.getMonth() + 1);\n const yyyy = String(date.getFullYear());\n const hh = pad(date.getHours());\n const mi = pad(date.getMinutes());\n const ss = pad(date.getSeconds());\n const ms = pad(date.getMilliseconds(), 3);\n return `ws_CO_${dd}${mm}${yyyy}${hh}${mi}${ss}${ms}`;\n}\n\nexport function generateConversationID(): string {\n const a = randomInt(1000, 9999);\n const b = randomInt(100000, 999999);\n const c = randomInt(10, 99);\n return `AG_${formatDate(new Date())}_${a}${b}${c}`;\n}\n\nexport function generateOriginatorConversationID(): string {\n const a = randomInt(10000, 99999);\n const b = randomInt(1000000, 9999999);\n const c = randomInt(1, 9);\n return `${a}-${b}-${c}`;\n}\n\nexport function generateMpesaReceiptNumber(): string {\n const chars = \"ABCDEFGHJKMNPQRSTUVWXYZ23456789\";\n let out = \"\";\n for (let i = 0; i < 10; i++) {\n out += chars[randomInt(0, chars.length)];\n }\n return out;\n}\n\nexport function generateTransactionDate(date = new Date()): number {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const yyyy = date.getFullYear();\n const mm = pad(date.getMonth() + 1);\n const dd = pad(date.getDate());\n const hh = pad(date.getHours());\n const mi = pad(date.getMinutes());\n const ss = pad(date.getSeconds());\n return Number(`${yyyy}${mm}${dd}${hh}${mi}${ss}`);\n}\n\nfunction formatDate(d: Date): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return `${pad(d.getDate())}${pad(d.getMonth() + 1)}${d.getFullYear()}${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`;\n}\n","export const DEFAULTS = {\n port: 4000,\n host: \"0.0.0.0\",\n callbackDelayMs: 8000,\n callbackRetryAttempts: 3,\n callbackRetryBackoffMs: 1000,\n oauthTokenExpiresIn: \"3599\",\n testCredentials: {\n consumerKey: \"test_key\",\n consumerSecret: \"test_secret\",\n },\n testShortcode: \"174379\",\n testTill: \"600000\",\n partyB: \"254708374149\",\n} as const;\n\nexport const RESULT_CODES = {\n SUCCESS: 0,\n INSUFFICIENT_FUNDS: 1,\n SYSTEM_ERROR: 1025,\n USER_CANCELLED: 1032,\n TRANSACTION_EXPIRED: 1037,\n WRONG_PIN: 2001,\n} as const;\n\nexport const RESULT_DESCS: Record<number, string> = {\n 0: \"The service request is processed successfully.\",\n 1: \"The balance is insufficient for the transaction.\",\n 1025: \"An error occurred while sending a push request.\",\n 1032: \"Request cancelled by user.\",\n 1037: \"DS timeout. User cannot be reached.\",\n 2001: \"The initiator information is invalid.\",\n};\n","import { generateAccessToken } from \"./id-generator.js\";\nimport { DEFAULTS } from \"../config/defaults.js\";\n\nconst issuedTokens = new Map<string, number>();\nconst TOKEN_TTL_MS = 3599 * 1000;\n\nexport function parseBasicAuth(header: string | undefined): { key: string; secret: string } | null {\n if (!header || !header.toLowerCase().startsWith(\"basic \")) return null;\n const encoded = header.slice(6).trim();\n let decoded: string;\n try {\n decoded = Buffer.from(encoded, \"base64\").toString(\"utf-8\");\n } catch {\n return null;\n }\n const idx = decoded.indexOf(\":\");\n if (idx < 0) return null;\n const key = decoded.slice(0, idx);\n const secret = decoded.slice(idx + 1);\n if (!key || !secret) return null;\n return { key, secret };\n}\n\nexport function issueToken(): { access_token: string; expires_in: string } {\n const token = generateAccessToken();\n issuedTokens.set(token, Date.now() + TOKEN_TTL_MS);\n return { access_token: token, expires_in: DEFAULTS.oauthTokenExpiresIn };\n}\n\nexport function isUsingTestCredentials(key: string, secret: string): boolean {\n return key === DEFAULTS.testCredentials.consumerKey && secret === DEFAULTS.testCredentials.consumerSecret;\n}\n\nexport function parseBearerToken(header: string | undefined): string | null {\n if (!header) return null;\n const m = header.match(/^Bearer\\s+(.+)$/i);\n return m && m[1] ? m[1].trim() : null;\n}\n\nexport function isValidToken(token: string): boolean {\n const exp = issuedTokens.get(token);\n if (!exp) {\n // Mock leniency: accept any 32-char alphanumeric token so devs who\n // hard-code one for tests don't get blocked across server restarts.\n return /^[a-zA-Z0-9]{20,}$/.test(token);\n }\n if (Date.now() > exp) {\n issuedTokens.delete(token);\n return false;\n }\n return true;\n}\n\nexport function clearTokens(): void {\n issuedTokens.clear();\n}\n","import { Hono } from \"hono\";\nimport { issueToken, isUsingTestCredentials, parseBasicAuth } from \"../core/auth.js\";\nimport type { AppContext } from \"../server.js\";\n\nexport function oauthRoute(): Hono<AppContext> {\n const app = new Hono<AppContext>();\n\n app.get(\"/oauth/v1/generate\", (c) => {\n const grantType = c.req.query(\"grant_type\");\n if (grantType !== \"client_credentials\") {\n return c.json(\n { requestId: \"no-request-id\", errorCode: \"400.001.01\", errorMessage: \"Invalid grant_type\" },\n 400,\n );\n }\n const parsed = parseBasicAuth(c.req.header(\"authorization\"));\n if (!parsed) {\n return c.json(\n { requestId: \"no-request-id\", errorCode: \"401.002.01\", errorMessage: \"Invalid Authentication passed\" },\n 401,\n );\n }\n if (isUsingTestCredentials(parsed.key, parsed.secret)) {\n c.get(\"log\")?.(\"warn: using default test credentials (test_key:test_secret) — fine for mock\");\n }\n return c.json(issueToken());\n });\n\n return app;\n}\n","import { z } from \"zod\";\n\nexport const stkPushSchema = z.object({\n BusinessShortCode: z.string().min(1),\n Password: z.string().min(1),\n Timestamp: z.string().min(1),\n TransactionType: z.enum([\"CustomerPayBillOnline\", \"CustomerBuyGoodsOnline\"]),\n Amount: z.number().int().positive(),\n PartyA: z.string().min(1),\n PartyB: z.string().min(1),\n PhoneNumber: z.string().min(1),\n CallBackURL: z.string().url(),\n AccountReference: z.string().min(1).max(12),\n TransactionDesc: z.string().min(1).max(13),\n});\n\nexport const stkQuerySchema = z.object({\n BusinessShortCode: z.string().min(1),\n Password: z.string().min(1),\n Timestamp: z.string().min(1),\n CheckoutRequestID: z.string().min(1),\n});\n\nexport const c2bRegisterUrlSchema = z.object({\n ShortCode: z.string().min(1),\n ResponseType: z.enum([\"Completed\", \"Cancelled\"]),\n ConfirmationURL: z.string().url(),\n ValidationURL: z.string().url(),\n});\n\nexport const c2bSimulateSchema = z.object({\n ShortCode: z.string().min(1),\n CommandID: z.enum([\"CustomerPayBillOnline\", \"CustomerBuyGoodsOnline\"]),\n Amount: z.number().int().positive(),\n Msisdn: z.string().min(1),\n BillRefNumber: z.string().min(1),\n});\n\nexport const b2cSchema = z.object({\n InitiatorName: z.string().min(1),\n SecurityCredential: z.string().min(1),\n CommandID: z.enum([\"SalaryPayment\", \"BusinessPayment\", \"PromotionPayment\"]),\n Amount: z.number().int().positive(),\n PartyA: z.string().min(1),\n PartyB: z.string().min(1),\n Remarks: z.string().min(1),\n QueueTimeOutURL: z.string().url(),\n ResultURL: z.string().url(),\n Occasion: z.string().optional().default(\"\"),\n});\n\nexport const b2bSchema = z.object({\n Initiator: z.string().min(1),\n SecurityCredential: z.string().min(1),\n CommandID: z.string().min(1),\n SenderIdentifierType: z.string().min(1),\n RecieverIdentifierType: z.string().min(1),\n Amount: z.number().int().positive(),\n PartyA: z.string().min(1),\n PartyB: z.string().min(1),\n AccountReference: z.string().optional().default(\"\"),\n Remarks: z.string().min(1),\n QueueTimeOutURL: z.string().url(),\n ResultURL: z.string().url(),\n});\n\nexport const transactionStatusSchema = z.object({\n Initiator: z.string().min(1),\n SecurityCredential: z.string().min(1),\n CommandID: z.literal(\"TransactionStatusQuery\"),\n TransactionID: z.string().min(1),\n PartyA: z.string().min(1),\n IdentifierType: z.string().min(1),\n ResultURL: z.string().url(),\n QueueTimeOutURL: z.string().url(),\n Remarks: z.string().min(1),\n Occasion: z.string().optional().default(\"\"),\n});\n\nexport const accountBalanceSchema = z.object({\n Initiator: z.string().min(1),\n SecurityCredential: z.string().min(1),\n CommandID: z.literal(\"AccountBalance\"),\n PartyA: z.string().min(1),\n IdentifierType: z.string().min(1),\n Remarks: z.string().min(1),\n QueueTimeOutURL: z.string().url(),\n ResultURL: z.string().url(),\n});\n\nexport const reversalSchema = z.object({\n Initiator: z.string().min(1),\n SecurityCredential: z.string().min(1),\n CommandID: z.literal(\"TransactionReversal\"),\n TransactionID: z.string().min(1),\n Amount: z.number().int().positive(),\n ReceiverParty: z.string().min(1),\n RecieverIdentifierType: z.string().min(1),\n ResultURL: z.string().url(),\n QueueTimeOutURL: z.string().url(),\n Remarks: z.string().min(1),\n Occasion: z.string().optional().default(\"\"),\n});\n","import type { FailureScenario } from \"../types/daraja.js\";\n\nexport interface MockConfig {\n defaultCallbackDelayMs: number;\n scenarios: Record<string, FailureScenario>;\n webhookRetry: {\n attempts: number;\n backoffMs: number;\n };\n}\n\nconst SUFFIX_MAP: Record<string, FailureScenario> = {\n \"00\": \"success\",\n \"01\": \"user_cancelled\",\n \"02\": \"insufficient_funds\",\n \"03\": \"wrong_pin\",\n \"04\": \"timeout\",\n \"05\": \"callback_retry\",\n \"06\": \"expired\",\n \"07\": \"system_error\",\n \"99\": \"slow\",\n};\n\nexport function pickScenario(phoneNumber: string, config: MockConfig): FailureScenario {\n const direct = config.scenarios[phoneNumber];\n if (direct) return direct;\n const suffix = phoneNumber.slice(-2);\n return SUFFIX_MAP[suffix] ?? \"success\";\n}\n\nexport function callbackDelayFor(scenario: FailureScenario, config: MockConfig): number {\n if (scenario === \"slow\") return 30_000;\n if (scenario === \"timeout\") return -1;\n return config.defaultCallbackDelayMs;\n}\n\nexport function isFailure(scenario: FailureScenario): boolean {\n return scenario !== \"success\" && scenario !== \"callback_retry\" && scenario !== \"slow\";\n}\n","import { Hono } from \"hono\";\nimport type { AppContext } from \"../server.js\";\nimport { isValidToken, parseBearerToken } from \"../core/auth.js\";\nimport {\n generateCheckoutRequestID,\n generateMerchantRequestID,\n generateMpesaReceiptNumber,\n generateTransactionDate,\n} from \"../core/id-generator.js\";\nimport { stkPushSchema } from \"../schemas/index.js\";\nimport { callbackDelayFor, isFailure, pickScenario } from \"../core/failure-injector.js\";\nimport { stateToResultCode, stateToResultDesc } from \"../core/transactions.js\";\nimport type { FailureScenario, StkCallbackBody, TransactionRecord, TransactionState } from \"../types/daraja.js\";\n\nfunction scenarioToState(s: FailureScenario): TransactionState {\n switch (s) {\n case \"success\":\n case \"callback_retry\":\n case \"slow\":\n return \"success\";\n case \"user_cancelled\": return \"user_cancelled\";\n case \"insufficient_funds\": return \"insufficient_funds\";\n case \"wrong_pin\": return \"wrong_pin\";\n case \"expired\": return \"expired\";\n case \"system_error\": return \"system_error\";\n case \"timeout\": return \"timeout\";\n }\n}\n\nexport function stkPushRoute(): Hono<AppContext> {\n const app = new Hono<AppContext>();\n\n app.post(\"/mpesa/stkpush/v1/processrequest\", async (c) => {\n const token = parseBearerToken(c.req.header(\"authorization\"));\n if (!token || !isValidToken(token)) {\n return c.json({ errorCode: \"404.001.03\", errorMessage: \"Invalid Access Token\" }, 401);\n }\n\n const raw = await c.req.json().catch(() => null);\n const parsed = stkPushSchema.safeParse(raw);\n if (!parsed.success) {\n return c.json(\n {\n requestId: \"no-request-id\",\n errorCode: \"400.002.05\",\n errorMessage: \"Invalid request payload\",\n errors: parsed.error.flatten(),\n },\n 400,\n );\n }\n const body = parsed.data;\n\n const merchantRequestID = generateMerchantRequestID();\n const checkoutRequestID = generateCheckoutRequestID();\n const scenario = pickScenario(body.PhoneNumber, c.var.config);\n const targetState = scenarioToState(scenario);\n const delay = callbackDelayFor(scenario, c.var.config);\n\n const record: TransactionRecord = {\n checkoutRequestID,\n merchantRequestID,\n kind: \"stk\",\n amount: body.Amount,\n phoneNumber: body.PhoneNumber,\n shortCode: body.BusinessShortCode,\n callbackUrl: body.CallBackURL,\n state: \"pending\",\n createdAt: Date.now(),\n callbackAttempts: 0,\n };\n c.var.store.put(record);\n\n const failNTimesFirst = scenario === \"callback_retry\" ? 3 : undefined;\n\n const callbackBody = buildStkCallback({\n merchantRequestID,\n checkoutRequestID,\n state: targetState,\n amount: body.Amount,\n phoneNumber: body.PhoneNumber,\n });\n\n if (scenario === \"timeout\") {\n c.var.log?.(`stk-push ${checkoutRequestID}: timeout scenario, no callback will fire`);\n } else {\n c.var.dispatcher.schedule(\n {\n id: checkoutRequestID,\n url: body.CallBackURL,\n body: callbackBody,\n scheduledAt: Date.now() + delay,\n attempts: 0,\n maxAttempts: c.var.config.webhookRetry.attempts + (failNTimesFirst ?? 0),\n backoffMs: c.var.config.webhookRetry.backoffMs,\n transactionId: checkoutRequestID,\n ...(failNTimesFirst !== undefined ? { failNTimesFirst } : {}),\n },\n delay,\n );\n }\n\n setTimeout(() => {\n const cur = c.var.store.get(checkoutRequestID);\n if (cur && cur.state === \"pending\") {\n c.var.store.update(checkoutRequestID, {\n state: targetState,\n resultCode: stateToResultCode(targetState),\n resultDesc: stateToResultDesc(targetState),\n completedAt: Date.now(),\n ...(targetState === \"success\" ? { mpesaReceiptNumber: generateMpesaReceiptNumber() } : {}),\n });\n }\n }, Math.max(0, delay));\n\n return c.json({\n MerchantRequestID: merchantRequestID,\n CheckoutRequestID: checkoutRequestID,\n ResponseCode: \"0\",\n ResponseDescription: \"Success. Request accepted for processing\",\n CustomerMessage: \"Success. Request accepted for processing\",\n });\n });\n\n return app;\n}\n\nfunction buildStkCallback(params: {\n merchantRequestID: string;\n checkoutRequestID: string;\n state: TransactionState;\n amount: number;\n phoneNumber: string;\n}): StkCallbackBody {\n const resultCode = stateToResultCode(params.state);\n const resultDesc = stateToResultDesc(params.state);\n if (params.state === \"success\") {\n return {\n Body: {\n stkCallback: {\n MerchantRequestID: params.merchantRequestID,\n CheckoutRequestID: params.checkoutRequestID,\n ResultCode: resultCode,\n ResultDesc: resultDesc,\n CallbackMetadata: {\n Item: [\n { Name: \"Amount\", Value: params.amount },\n { Name: \"MpesaReceiptNumber\", Value: generateMpesaReceiptNumber() },\n { Name: \"TransactionDate\", Value: generateTransactionDate() },\n { Name: \"PhoneNumber\", Value: Number(params.phoneNumber) },\n ],\n },\n },\n },\n };\n }\n return {\n Body: {\n stkCallback: {\n MerchantRequestID: params.merchantRequestID,\n CheckoutRequestID: params.checkoutRequestID,\n ResultCode: resultCode,\n ResultDesc: resultDesc,\n },\n },\n };\n}\n","import { Hono } from \"hono\";\nimport type { AppContext } from \"../server.js\";\nimport { isValidToken, parseBearerToken } from \"../core/auth.js\";\nimport { stkQuerySchema } from \"../schemas/index.js\";\nimport { stateToResultCode, stateToResultDesc } from \"../core/transactions.js\";\n\nexport function stkQueryRoute(): Hono<AppContext> {\n const app = new Hono<AppContext>();\n\n app.post(\"/mpesa/stkpushquery/v1/query\", async (c) => {\n const token = parseBearerToken(c.req.header(\"authorization\"));\n if (!token || !isValidToken(token)) {\n return c.json({ errorCode: \"404.001.03\", errorMessage: \"Invalid Access Token\" }, 401);\n }\n\n const raw = await c.req.json().catch(() => null);\n const parsed = stkQuerySchema.safeParse(raw);\n if (!parsed.success) {\n return c.json(\n { errorCode: \"400.002.05\", errorMessage: \"Invalid request payload\", errors: parsed.error.flatten() },\n 400,\n );\n }\n\n const record = c.var.store.get(parsed.data.CheckoutRequestID);\n if (!record) {\n return c.json(\n {\n requestId: \"no-request-id\",\n errorCode: \"500.001.1001\",\n errorMessage: \"The transaction is being processed\",\n },\n 500,\n );\n }\n\n const resultCode = record.resultCode ?? stateToResultCode(record.state);\n return c.json({\n ResponseCode: \"0\",\n ResponseDescription: \"The service request has been accepted successfully\",\n MerchantRequestID: record.merchantRequestID,\n CheckoutRequestID: record.checkoutRequestID,\n ResultCode: String(resultCode),\n ResultDesc: record.resultDesc ?? stateToResultDesc(record.state),\n });\n });\n\n return app;\n}\n","import { Hono } from \"hono\";\nimport type { AppContext } from \"../server.js\";\nimport { isValidToken, parseBearerToken } from \"../core/auth.js\";\nimport { c2bRegisterUrlSchema, c2bSimulateSchema } from \"../schemas/index.js\";\nimport {\n generateConversationID,\n generateMpesaReceiptNumber,\n generateOriginatorConversationID,\n generateTransactionDate,\n} from \"../core/id-generator.js\";\nimport type { TransactionRecord } from \"../types/daraja.js\";\n\ninterface RegisteredUrl {\n shortCode: string;\n confirmationURL: string;\n validationURL: string;\n responseType: \"Completed\" | \"Cancelled\";\n}\n\nconst registry = new Map<string, RegisteredUrl>();\n\nexport function c2bRoute(): Hono<AppContext> {\n const app = new Hono<AppContext>();\n\n app.post(\"/mpesa/c2b/v1/registerurl\", async (c) => {\n const token = parseBearerToken(c.req.header(\"authorization\"));\n if (!token || !isValidToken(token)) {\n return c.json({ errorCode: \"404.001.03\", errorMessage: \"Invalid Access Token\" }, 401);\n }\n const raw = await c.req.json().catch(() => null);\n const parsed = c2bRegisterUrlSchema.safeParse(raw);\n if (!parsed.success) {\n return c.json(\n { errorCode: \"400.002.05\", errorMessage: \"Invalid request payload\", errors: parsed.error.flatten() },\n 400,\n );\n }\n registry.set(parsed.data.ShortCode, {\n shortCode: parsed.data.ShortCode,\n confirmationURL: parsed.data.ConfirmationURL,\n validationURL: parsed.data.ValidationURL,\n responseType: parsed.data.ResponseType,\n });\n return c.json({\n OriginatorCoversationID: generateOriginatorConversationID(),\n ResponseCode: \"0\",\n ResponseDescription: \"success\",\n });\n });\n\n app.post(\"/mpesa/c2b/v1/simulate\", async (c) => {\n const token = parseBearerToken(c.req.header(\"authorization\"));\n if (!token || !isValidToken(token)) {\n return c.json({ errorCode: \"404.001.03\", errorMessage: \"Invalid Access Token\" }, 401);\n }\n const raw = await c.req.json().catch(() => null);\n const parsed = c2bSimulateSchema.safeParse(raw);\n if (!parsed.success) {\n return c.json(\n { errorCode: \"400.002.05\", errorMessage: \"Invalid request payload\", errors: parsed.error.flatten() },\n 400,\n );\n }\n const result = await runC2BSimulation(c, parsed.data.ShortCode, parsed.data.Amount, parsed.data.Msisdn, parsed.data.BillRefNumber);\n if (result.kind === \"no-registration\") {\n return c.json(\n { errorCode: \"500.001.1001\", errorMessage: \"No registered URLs found for this shortcode\" },\n 500,\n );\n }\n return c.json({\n OriginatorCoversationID: result.originatorConversationID,\n ConversationID: result.conversationID,\n ResponseDescription: \"Accept the service request successfully.\",\n });\n });\n\n app.post(\"/__mock__/c2b/trigger\", async (c) => {\n const raw = (await c.req.json().catch(() => null)) as Record<string, unknown> | null;\n if (!raw) {\n return c.json({ error: \"invalid body\" }, 400);\n }\n const shortCode = String(raw.ShortCode ?? raw.shortCode ?? \"\");\n const amount = Number(raw.Amount ?? raw.amount ?? 0);\n const msisdn = String(raw.Msisdn ?? raw.msisdn ?? \"\");\n const billRef = String(raw.BillRefNumber ?? raw.billRefNumber ?? \"TEST\");\n if (!shortCode || !amount || !msisdn) {\n return c.json({ error: \"ShortCode, Amount, Msisdn required\" }, 400);\n }\n const result = await runC2BSimulation(c, shortCode, amount, msisdn, billRef);\n return c.json(result, result.kind === \"no-registration\" ? 404 : 200);\n });\n\n return app;\n}\n\nasync function runC2BSimulation(\n c: { var: AppContext[\"Variables\"]; get<K extends keyof AppContext[\"Variables\"]>(k: K): AppContext[\"Variables\"][K] },\n shortCode: string,\n amount: number,\n msisdn: string,\n billRef: string,\n): Promise<\n | { kind: \"delivered\"; originatorConversationID: string; conversationID: string }\n | { kind: \"rejected\"; originatorConversationID: string; conversationID: string }\n | { kind: \"no-registration\" }\n> {\n const reg = registry.get(shortCode);\n if (!reg) return { kind: \"no-registration\" };\n\n const conversationID = generateConversationID();\n const originatorConversationID = generateOriginatorConversationID();\n const receipt = generateMpesaReceiptNumber();\n const transactionDate = generateTransactionDate();\n\n const txn: TransactionRecord = {\n checkoutRequestID: conversationID,\n merchantRequestID: originatorConversationID,\n conversationID,\n originatorConversationID,\n kind: \"c2b\",\n amount,\n phoneNumber: msisdn,\n shortCode,\n callbackUrl: reg.confirmationURL,\n state: \"pending\",\n createdAt: Date.now(),\n callbackAttempts: 0,\n mpesaReceiptNumber: receipt,\n };\n c.var.store.put(txn);\n\n const callbackPayload = {\n TransactionType: \"Pay Bill\",\n TransID: receipt,\n TransTime: String(transactionDate),\n TransAmount: String(amount),\n BusinessShortCode: shortCode,\n BillRefNumber: billRef,\n InvoiceNumber: \"\",\n OrgAccountBalance: \"0.00\",\n ThirdPartyTransID: \"\",\n MSISDN: msisdn,\n FirstName: \"Test\",\n MiddleName: \"C2B\",\n LastName: \"Customer\",\n };\n\n let validationOk = true;\n try {\n const res = await fetch(reg.validationURL, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(callbackPayload),\n });\n if (res.ok) {\n const body = (await res.json().catch(() => ({}))) as { ResultCode?: string };\n if (body.ResultCode && body.ResultCode !== \"0\") validationOk = false;\n }\n } catch {\n validationOk = true;\n }\n\n if (!validationOk) {\n c.var.store.update(conversationID, { state: \"user_cancelled\", resultCode: 1, resultDesc: \"Validation rejected\", completedAt: Date.now() });\n return { kind: \"rejected\", originatorConversationID, conversationID };\n }\n\n c.var.dispatcher.schedule(\n {\n id: conversationID,\n url: reg.confirmationURL,\n body: callbackPayload,\n scheduledAt: Date.now(),\n attempts: 0,\n maxAttempts: c.var.config.webhookRetry.attempts,\n backoffMs: c.var.config.webhookRetry.backoffMs,\n transactionId: conversationID,\n },\n 0,\n );\n\n c.var.store.update(conversationID, { state: \"success\", resultCode: 0, resultDesc: \"Success\", completedAt: Date.now() });\n return { kind: \"delivered\", originatorConversationID, conversationID };\n}\n\nexport function clearC2BRegistry(): void {\n registry.clear();\n}\n","import { Hono } from \"hono\";\nimport type { AppContext } from \"../server.js\";\nimport { isValidToken, parseBearerToken } from \"../core/auth.js\";\nimport { b2cSchema } from \"../schemas/index.js\";\nimport {\n generateConversationID,\n generateMpesaReceiptNumber,\n generateOriginatorConversationID,\n} from \"../core/id-generator.js\";\nimport { pickScenario } from \"../core/failure-injector.js\";\nimport type { ResultCallbackBody, TransactionRecord } from \"../types/daraja.js\";\n\nexport function b2cRoute(): Hono<AppContext> {\n const app = new Hono<AppContext>();\n\n app.post(\"/mpesa/b2c/v1/paymentrequest\", async (c) => {\n const token = parseBearerToken(c.req.header(\"authorization\"));\n if (!token || !isValidToken(token)) {\n return c.json({ errorCode: \"404.001.03\", errorMessage: \"Invalid Access Token\" }, 401);\n }\n const raw = await c.req.json().catch(() => null);\n const parsed = b2cSchema.safeParse(raw);\n if (!parsed.success) {\n return c.json(\n { errorCode: \"400.002.05\", errorMessage: \"Invalid request payload\", errors: parsed.error.flatten() },\n 400,\n );\n }\n const body = parsed.data;\n const conversationID = generateConversationID();\n const originatorConversationID = generateOriginatorConversationID();\n const scenario = pickScenario(body.PartyB, c.var.config);\n const isSuccess = scenario === \"success\" || scenario === \"slow\" || scenario === \"callback_retry\";\n\n const record: TransactionRecord = {\n checkoutRequestID: conversationID,\n merchantRequestID: originatorConversationID,\n conversationID,\n originatorConversationID,\n kind: \"b2c\",\n amount: body.Amount,\n phoneNumber: body.PartyB,\n shortCode: body.PartyA,\n callbackUrl: body.ResultURL,\n state: isSuccess ? \"success\" : \"system_error\",\n createdAt: Date.now(),\n callbackAttempts: 0,\n ...(isSuccess ? { mpesaReceiptNumber: generateMpesaReceiptNumber() } : {}),\n };\n c.var.store.put(record);\n\n const callback: ResultCallbackBody = {\n Result: {\n ResultType: 0,\n ResultCode: isSuccess ? 0 : 2001,\n ResultDesc: isSuccess\n ? \"The service request is processed successfully.\"\n : \"The initiator information is invalid.\",\n OriginatorConversationID: originatorConversationID,\n ConversationID: conversationID,\n TransactionID: record.mpesaReceiptNumber ?? \"N/A\",\n ResultParameters: {\n ResultParameter: isSuccess\n ? [\n { Key: \"TransactionAmount\", Value: body.Amount },\n { Key: \"TransactionReceipt\", Value: record.mpesaReceiptNumber ?? \"\" },\n { Key: \"B2CRecipientIsRegisteredCustomer\", Value: \"Y\" },\n { Key: \"B2CChargesPaidAccountAvailableFunds\", Value: 0 },\n { Key: \"ReceiverPartyPublicName\", Value: `${body.PartyB} - Test Recipient` },\n { Key: \"TransactionCompletedDateTime\", Value: new Date().toISOString() },\n { Key: \"B2CUtilityAccountAvailableFunds\", Value: 1000000 },\n { Key: \"B2CWorkingAccountAvailableFunds\", Value: 1000000 },\n ]\n : [],\n },\n ReferenceData: {\n ReferenceItem: { Key: \"QueueTimeoutURL\", Value: body.QueueTimeOutURL },\n },\n },\n };\n\n c.var.dispatcher.schedule(\n {\n id: conversationID,\n url: body.ResultURL,\n body: callback,\n scheduledAt: Date.now() + c.var.config.defaultCallbackDelayMs,\n attempts: 0,\n maxAttempts: c.var.config.webhookRetry.attempts,\n backoffMs: c.var.config.webhookRetry.backoffMs,\n transactionId: conversationID,\n },\n c.var.config.defaultCallbackDelayMs,\n );\n\n return c.json({\n ConversationID: conversationID,\n OriginatorConversationID: originatorConversationID,\n ResponseCode: \"0\",\n ResponseDescription: \"Accept the service request successfully.\",\n });\n });\n\n return app;\n}\n","import { Hono } from \"hono\";\nimport type { AppContext } from \"../server.js\";\nimport { isValidToken, parseBearerToken } from \"../core/auth.js\";\nimport { b2bSchema } from \"../schemas/index.js\";\nimport {\n generateConversationID,\n generateMpesaReceiptNumber,\n generateOriginatorConversationID,\n} from \"../core/id-generator.js\";\nimport type { ResultCallbackBody, TransactionRecord } from \"../types/daraja.js\";\n\nexport function b2bRoute(): Hono<AppContext> {\n const app = new Hono<AppContext>();\n\n app.post(\"/mpesa/b2b/v1/paymentrequest\", async (c) => {\n const token = parseBearerToken(c.req.header(\"authorization\"));\n if (!token || !isValidToken(token)) {\n return c.json({ errorCode: \"404.001.03\", errorMessage: \"Invalid Access Token\" }, 401);\n }\n const raw = await c.req.json().catch(() => null);\n const parsed = b2bSchema.safeParse(raw);\n if (!parsed.success) {\n return c.json(\n { errorCode: \"400.002.05\", errorMessage: \"Invalid request payload\", errors: parsed.error.flatten() },\n 400,\n );\n }\n const body = parsed.data;\n const conversationID = generateConversationID();\n const originatorConversationID = generateOriginatorConversationID();\n const receipt = generateMpesaReceiptNumber();\n\n const record: TransactionRecord = {\n checkoutRequestID: conversationID,\n merchantRequestID: originatorConversationID,\n conversationID,\n originatorConversationID,\n kind: \"b2b\",\n amount: body.Amount,\n phoneNumber: body.PartyB,\n shortCode: body.PartyA,\n callbackUrl: body.ResultURL,\n state: \"success\",\n createdAt: Date.now(),\n callbackAttempts: 0,\n mpesaReceiptNumber: receipt,\n };\n c.var.store.put(record);\n\n const callback: ResultCallbackBody = {\n Result: {\n ResultType: 0,\n ResultCode: 0,\n ResultDesc: \"The service request is processed successfully.\",\n OriginatorConversationID: originatorConversationID,\n ConversationID: conversationID,\n TransactionID: receipt,\n ResultParameters: {\n ResultParameter: [\n { Key: \"DebitAccountBalance\", Value: \"Working Account|KES|1000000.00|1000000.00|0.00|0.00\" },\n { Key: \"Amount\", Value: body.Amount },\n { Key: \"DebitPartyAffectedAccountBalance\", Value: \"Working Account|KES|1000000.00|1000000.00|0.00|0.00\" },\n { Key: \"TransCompletedTime\", Value: new Date().toISOString() },\n { Key: \"DebitPartyCharges\", Value: \"\" },\n { Key: \"ReceiverPartyPublicName\", Value: `${body.PartyB} - Test Business` },\n { Key: \"Currency\", Value: \"KES\" },\n { Key: \"InitiatorAccountCurrentBalance\", Value: \"{Amount={CurrencyCode=KES, MinimumAmount=99999900, BasicAmount=999999.00}}\" },\n ],\n },\n ReferenceData: {\n ReferenceItem: [\n { Key: \"BillReferenceNumber\", Value: body.AccountReference ?? \"\" },\n { Key: \"QueueTimeoutURL\", Value: body.QueueTimeOutURL },\n ],\n },\n },\n };\n\n c.var.dispatcher.schedule(\n {\n id: conversationID,\n url: body.ResultURL,\n body: callback,\n scheduledAt: Date.now() + c.var.config.defaultCallbackDelayMs,\n attempts: 0,\n maxAttempts: c.var.config.webhookRetry.attempts,\n backoffMs: c.var.config.webhookRetry.backoffMs,\n transactionId: conversationID,\n },\n c.var.config.defaultCallbackDelayMs,\n );\n\n return c.json({\n ConversationID: conversationID,\n OriginatorConversationID: originatorConversationID,\n ResponseCode: \"0\",\n ResponseDescription: \"Accept the service request successfully.\",\n });\n });\n\n return app;\n}\n","import { Hono } from \"hono\";\nimport type { AppContext } from \"../server.js\";\nimport { isValidToken, parseBearerToken } from \"../core/auth.js\";\nimport { transactionStatusSchema } from \"../schemas/index.js\";\nimport { generateConversationID, generateOriginatorConversationID } from \"../core/id-generator.js\";\nimport type { ResultCallbackBody } from \"../types/daraja.js\";\n\nexport function transactionStatusRoute(): Hono<AppContext> {\n const app = new Hono<AppContext>();\n\n app.post(\"/mpesa/transactionstatus/v1/query\", async (c) => {\n const token = parseBearerToken(c.req.header(\"authorization\"));\n if (!token || !isValidToken(token)) {\n return c.json({ errorCode: \"404.001.03\", errorMessage: \"Invalid Access Token\" }, 401);\n }\n const raw = await c.req.json().catch(() => null);\n const parsed = transactionStatusSchema.safeParse(raw);\n if (!parsed.success) {\n return c.json(\n { errorCode: \"400.002.05\", errorMessage: \"Invalid request payload\", errors: parsed.error.flatten() },\n 400,\n );\n }\n const body = parsed.data;\n const conversationID = generateConversationID();\n const originatorConversationID = generateOriginatorConversationID();\n\n const existing = c.var.store.get(body.TransactionID);\n\n const callback: ResultCallbackBody = {\n Result: {\n ResultType: 0,\n ResultCode: 0,\n ResultDesc: \"The service request is processed successfully.\",\n OriginatorConversationID: originatorConversationID,\n ConversationID: conversationID,\n TransactionID: body.TransactionID,\n ResultParameters: {\n ResultParameter: [\n { Key: \"ReceiptNo\", Value: existing?.mpesaReceiptNumber ?? body.TransactionID },\n { Key: \"ConversationID\", Value: existing?.conversationID ?? conversationID },\n { Key: \"FinalisedTime\", Value: new Date().toISOString() },\n { Key: \"Amount\", Value: existing?.amount ?? 0 },\n { Key: \"TransactionStatus\", Value: existing?.state === \"success\" ? \"Completed\" : \"Failed\" },\n { Key: \"ReasonType\", Value: \"Salary Payment via API\" },\n { Key: \"TransactionReason\", Value: body.Remarks },\n { Key: \"DebitPartyCharges\", Value: \"\" },\n { Key: \"DebitAccountType\", Value: \"Utility Account\" },\n { Key: \"InitiatedTime\", Value: new Date().toISOString() },\n { Key: \"OriginatorConversationID\", Value: existing?.originatorConversationID ?? originatorConversationID },\n { Key: \"CreditPartyName\", Value: existing ? `${existing.phoneNumber} - Test Recipient` : \"Test Recipient\" },\n { Key: \"DebitPartyName\", Value: existing ? `${existing.shortCode} - Test Merchant` : \"Test Merchant\" },\n ],\n },\n ReferenceData: {\n ReferenceItem: { Key: \"Occasion\", Value: body.Occasion ?? \"\" },\n },\n },\n };\n\n c.var.dispatcher.schedule(\n {\n id: conversationID,\n url: body.ResultURL,\n body: callback,\n scheduledAt: Date.now() + c.var.config.defaultCallbackDelayMs,\n attempts: 0,\n maxAttempts: c.var.config.webhookRetry.attempts,\n backoffMs: c.var.config.webhookRetry.backoffMs,\n },\n c.var.config.defaultCallbackDelayMs,\n );\n\n return c.json({\n OriginatorConversationID: originatorConversationID,\n ConversationID: conversationID,\n ResponseCode: \"0\",\n ResponseDescription: \"Accept the service request successfully.\",\n });\n });\n\n return app;\n}\n","import { Hono } from \"hono\";\nimport type { AppContext } from \"../server.js\";\nimport { isValidToken, parseBearerToken } from \"../core/auth.js\";\nimport { accountBalanceSchema } from \"../schemas/index.js\";\nimport { generateConversationID, generateOriginatorConversationID } from \"../core/id-generator.js\";\nimport type { ResultCallbackBody } from \"../types/daraja.js\";\n\nexport function accountBalanceRoute(): Hono<AppContext> {\n const app = new Hono<AppContext>();\n\n app.post(\"/mpesa/accountbalance/v1/query\", async (c) => {\n const token = parseBearerToken(c.req.header(\"authorization\"));\n if (!token || !isValidToken(token)) {\n return c.json({ errorCode: \"404.001.03\", errorMessage: \"Invalid Access Token\" }, 401);\n }\n const raw = await c.req.json().catch(() => null);\n const parsed = accountBalanceSchema.safeParse(raw);\n if (!parsed.success) {\n return c.json(\n { errorCode: \"400.002.05\", errorMessage: \"Invalid request payload\", errors: parsed.error.flatten() },\n 400,\n );\n }\n const body = parsed.data;\n const conversationID = generateConversationID();\n const originatorConversationID = generateOriginatorConversationID();\n\n const callback: ResultCallbackBody = {\n Result: {\n ResultType: 0,\n ResultCode: 0,\n ResultDesc: \"The service request is processed successfully.\",\n OriginatorConversationID: originatorConversationID,\n ConversationID: conversationID,\n TransactionID: \"BALANCE-QUERY\",\n ResultParameters: {\n ResultParameter: [\n { Key: \"AccountBalance\", Value: \"Working Account|KES|1000000.00|1000000.00|0.00|0.00&Float Account|KES|0.00|0.00|0.00|0.00&Utility Account|KES|1000000.00|1000000.00|0.00|0.00&Charges Paid Account|KES|0.00|0.00|0.00|0.00&Organization Settlement Account|KES|0.00|0.00|0.00|0.00\" },\n { Key: \"BOCompletedTime\", Value: new Date().toISOString() },\n ],\n },\n ReferenceData: {\n ReferenceItem: { Key: \"QueueTimeoutURL\", Value: body.QueueTimeOutURL },\n },\n },\n };\n\n c.var.dispatcher.schedule(\n {\n id: conversationID,\n url: body.ResultURL,\n body: callback,\n scheduledAt: Date.now() + c.var.config.defaultCallbackDelayMs,\n attempts: 0,\n maxAttempts: c.var.config.webhookRetry.attempts,\n backoffMs: c.var.config.webhookRetry.backoffMs,\n },\n c.var.config.defaultCallbackDelayMs,\n );\n\n return c.json({\n OriginatorConversationID: originatorConversationID,\n ConversationID: conversationID,\n ResponseCode: \"0\",\n ResponseDescription: \"Accept the service request successfully.\",\n });\n });\n\n return app;\n}\n","import { Hono } from \"hono\";\nimport type { AppContext } from \"../server.js\";\nimport { isValidToken, parseBearerToken } from \"../core/auth.js\";\nimport { reversalSchema } from \"../schemas/index.js\";\nimport { generateConversationID, generateOriginatorConversationID } from \"../core/id-generator.js\";\nimport type { ResultCallbackBody } from \"../types/daraja.js\";\n\nexport function reversalRoute(): Hono<AppContext> {\n const app = new Hono<AppContext>();\n\n app.post(\"/mpesa/reversal/v1/request\", async (c) => {\n const token = parseBearerToken(c.req.header(\"authorization\"));\n if (!token || !isValidToken(token)) {\n return c.json({ errorCode: \"404.001.03\", errorMessage: \"Invalid Access Token\" }, 401);\n }\n const raw = await c.req.json().catch(() => null);\n const parsed = reversalSchema.safeParse(raw);\n if (!parsed.success) {\n return c.json(\n { errorCode: \"400.002.05\", errorMessage: \"Invalid request payload\", errors: parsed.error.flatten() },\n 400,\n );\n }\n const body = parsed.data;\n const conversationID = generateConversationID();\n const originatorConversationID = generateOriginatorConversationID();\n\n const callback: ResultCallbackBody = {\n Result: {\n ResultType: 0,\n ResultCode: 0,\n ResultDesc: \"The service request is processed successfully.\",\n OriginatorConversationID: originatorConversationID,\n ConversationID: conversationID,\n TransactionID: body.TransactionID,\n ResultParameters: {\n ResultParameter: [\n { Key: \"DebitAccountBalance\", Value: \"Working Account|KES|1000000.00|1000000.00|0.00|0.00\" },\n { Key: \"Amount\", Value: body.Amount },\n { Key: \"TransCompletedTime\", Value: new Date().toISOString() },\n { Key: \"OriginalTransactionID\", Value: body.TransactionID },\n { Key: \"Charge\", Value: 0 },\n { Key: \"CreditPartyPublicName\", Value: `${body.ReceiverParty} - Test Recipient` },\n { Key: \"DebitPartyPublicName\", Value: \"Test Merchant\" },\n ],\n },\n ReferenceData: {\n ReferenceItem: { Key: \"QueueTimeoutURL\", Value: body.QueueTimeOutURL },\n },\n },\n };\n\n c.var.dispatcher.schedule(\n {\n id: conversationID,\n url: body.ResultURL,\n body: callback,\n scheduledAt: Date.now() + c.var.config.defaultCallbackDelayMs,\n attempts: 0,\n maxAttempts: c.var.config.webhookRetry.attempts,\n backoffMs: c.var.config.webhookRetry.backoffMs,\n },\n c.var.config.defaultCallbackDelayMs,\n );\n\n return c.json({\n OriginatorConversationID: originatorConversationID,\n ConversationID: conversationID,\n ResponseCode: \"0\",\n ResponseDescription: \"Accept the service request successfully.\",\n });\n });\n\n return app;\n}\n","import { Hono } from \"hono\";\nimport { streamSSE } from \"hono/streaming\";\nimport type { AppContext } from \"../server.js\";\n\nconst DASHBOARD_HTML = `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <title>mpesa-mock dashboard</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <script src=\"https://cdn.tailwindcss.com\"></script>\n</head>\n<body class=\"bg-slate-950 text-slate-100 font-mono min-h-screen\">\n <div class=\"max-w-6xl mx-auto p-6\">\n <header class=\"flex items-center justify-between mb-6\">\n <div>\n <h1 class=\"text-2xl font-bold\">mpesa-mock <span class=\"text-emerald-400\">●</span></h1>\n <p class=\"text-slate-400 text-sm\">Local M-Pesa Daraja emulator — live transactions</p>\n </div>\n <div class=\"text-right text-xs text-slate-500\">\n <div id=\"health\">checking…</div>\n <div>SSE: <span id=\"sse-status\">connecting</span></div>\n </div>\n </header>\n\n <section class=\"grid grid-cols-1 md:grid-cols-3 gap-4 mb-6\">\n <div class=\"bg-slate-900 rounded-lg p-4 border border-slate-800\">\n <div class=\"text-xs text-slate-500 uppercase\">Transactions</div>\n <div id=\"count-total\" class=\"text-3xl font-bold\">0</div>\n </div>\n <div class=\"bg-slate-900 rounded-lg p-4 border border-slate-800\">\n <div class=\"text-xs text-slate-500 uppercase\">Pending callbacks</div>\n <div id=\"count-pending\" class=\"text-3xl font-bold text-amber-300\">0</div>\n </div>\n <div class=\"bg-slate-900 rounded-lg p-4 border border-slate-800\">\n <div class=\"text-xs text-slate-500 uppercase\">Delivered</div>\n <div id=\"count-delivered\" class=\"text-3xl font-bold text-emerald-300\">0</div>\n </div>\n </section>\n\n <section class=\"bg-slate-900 rounded-lg border border-slate-800 overflow-hidden\">\n <table class=\"w-full text-sm\">\n <thead class=\"bg-slate-800 text-slate-400 text-xs uppercase\">\n <tr>\n <th class=\"text-left p-3\">Kind</th>\n <th class=\"text-left p-3\">CheckoutRequestID</th>\n <th class=\"text-left p-3\">Phone</th>\n <th class=\"text-right p-3\">Amount</th>\n <th class=\"text-left p-3\">State</th>\n <th class=\"text-right p-3\">Cb attempts</th>\n <th class=\"text-right p-3\">Age</th>\n </tr>\n </thead>\n <tbody id=\"rows\"></tbody>\n </table>\n </section>\n\n <footer class=\"text-center text-slate-600 text-xs mt-8\">\n mpesa-mock — not affiliated with Safaricom PLC\n </footer>\n </div>\n\n <script>\n const stateColors = {\n success: 'text-emerald-300',\n pending: 'text-amber-300',\n user_cancelled: 'text-rose-300',\n insufficient_funds: 'text-rose-400',\n wrong_pin: 'text-rose-400',\n expired: 'text-rose-400',\n system_error: 'text-rose-500',\n timeout: 'text-slate-400',\n };\n\n function renderRow(t) {\n const age = Math.round((Date.now() - t.createdAt) / 1000);\n const colorCls = stateColors[t.state] ?? 'text-slate-200';\n return \\`<tr class=\"border-t border-slate-800 hover:bg-slate-800/50\">\n <td class=\"p-3 uppercase text-xs text-slate-400\">\\${t.kind}</td>\n <td class=\"p-3 text-xs\">\\${t.checkoutRequestID}</td>\n <td class=\"p-3\">\\${t.phoneNumber}</td>\n <td class=\"p-3 text-right\">\\${t.amount.toLocaleString()}</td>\n <td class=\"p-3 \\${colorCls}\">\\${t.state}</td>\n <td class=\"p-3 text-right\">\\${t.callbackAttempts}</td>\n <td class=\"p-3 text-right text-slate-500\">\\${age}s</td>\n </tr>\\`;\n }\n\n function refresh(data) {\n const txns = data.transactions ?? [];\n document.getElementById('count-total').textContent = txns.length;\n document.getElementById('count-pending').textContent = data.pendingCallbacks ?? 0;\n document.getElementById('count-delivered').textContent = txns.filter(t => t.callbackDeliveredAt).length;\n document.getElementById('rows').innerHTML = txns.slice(0, 50).map(renderRow).join('');\n }\n\n fetch('/__mock__/health').then(r => r.json()).then(d => {\n document.getElementById('health').textContent = 'up · ' + Math.round(d.uptime) + 's';\n });\n\n fetch('/__mock__/state').then(r => r.json()).then(refresh);\n\n const es = new EventSource('/__mock__/events');\n es.onopen = () => { document.getElementById('sse-status').textContent = 'live'; };\n es.onerror = () => { document.getElementById('sse-status').textContent = 'disconnected'; };\n es.onmessage = (e) => { try { refresh(JSON.parse(e.data)); } catch {} };\n </script>\n</body>\n</html>`;\n\nexport function dashboardRoute(): Hono<AppContext> {\n const app = new Hono<AppContext>();\n\n app.get(\"/__mock__/dashboard\", (c) => c.html(DASHBOARD_HTML));\n\n app.get(\"/__mock__/state\", (c) => {\n const transactions = c.var.store.list(100);\n return c.json({\n transactions,\n pendingCallbacks: c.var.dispatcher.pendingIds().length,\n });\n });\n\n app.get(\"/__mock__/events\", (c) => {\n return streamSSE(c, async (stream) => {\n const send = async () => {\n await stream.writeSSE({\n data: JSON.stringify({\n transactions: c.var.store.list(100),\n pendingCallbacks: c.var.dispatcher.pendingIds().length,\n }),\n });\n };\n await send();\n const onChange = () => { void send(); };\n c.var.store.on(\"change\", onChange);\n c.var.store.on(\"clear\", onChange);\n const heartbeat = setInterval(() => { void send(); }, 5000);\n try {\n while (true) {\n await stream.sleep(1000);\n }\n } finally {\n clearInterval(heartbeat);\n c.var.store.off(\"change\", onChange);\n c.var.store.off(\"clear\", onChange);\n }\n });\n });\n\n app.post(\"/__mock__/clear\", (c) => {\n c.var.store.clear();\n return c.json({ cleared: true });\n });\n\n return app;\n}\n","import { Hono } from \"hono\";\nimport { logger as honoLogger } from \"hono/logger\";\nimport { InMemoryStore } from \"./core/transactions.js\";\nimport { WebhookDispatcher } from \"./core/webhook-dispatcher.js\";\nimport { oauthRoute } from \"./routes/oauth.js\";\nimport { stkPushRoute } from \"./routes/stk-push.js\";\nimport { stkQueryRoute } from \"./routes/stk-query.js\";\nimport { c2bRoute } from \"./routes/c2b.js\";\nimport { b2cRoute } from \"./routes/b2c.js\";\nimport { b2bRoute } from \"./routes/b2b.js\";\nimport { transactionStatusRoute } from \"./routes/transaction-status.js\";\nimport { accountBalanceRoute } from \"./routes/account-balance.js\";\nimport { reversalRoute } from \"./routes/reversal.js\";\nimport { dashboardRoute } from \"./routes/dashboard.js\";\nimport type { MockConfig } from \"./core/failure-injector.js\";\nimport { DEFAULTS } from \"./config/defaults.js\";\n\nexport interface AppVariables {\n store: InMemoryStore;\n dispatcher: WebhookDispatcher;\n config: MockConfig;\n log?: (msg: string) => void;\n recorder?: (entry: RecorderEntry) => void;\n}\n\nexport interface AppContext {\n Variables: AppVariables;\n}\n\nexport interface RecorderEntry {\n ts: number;\n direction: \"request\" | \"response\" | \"callback\";\n method: string;\n path: string;\n status?: number;\n body?: unknown;\n}\n\nexport interface CreateServerOptions {\n config?: Partial<MockConfig>;\n quiet?: boolean;\n recorder?: (entry: RecorderEntry) => void;\n store?: InMemoryStore;\n}\n\nexport function defaultConfig(overrides: Partial<MockConfig> = {}): MockConfig {\n return {\n defaultCallbackDelayMs: overrides.defaultCallbackDelayMs ?? DEFAULTS.callbackDelayMs,\n scenarios: overrides.scenarios ?? {},\n webhookRetry: {\n attempts: overrides.webhookRetry?.attempts ?? DEFAULTS.callbackRetryAttempts,\n backoffMs: overrides.webhookRetry?.backoffMs ?? DEFAULTS.callbackRetryBackoffMs,\n },\n };\n}\n\nexport function createServer(opts: CreateServerOptions = {}): {\n app: Hono<AppContext>;\n store: InMemoryStore;\n dispatcher: WebhookDispatcher;\n config: MockConfig;\n} {\n const store = opts.store ?? new InMemoryStore();\n const config = defaultConfig(opts.config);\n const log = opts.quiet ? undefined : (msg: string) => console.log(msg);\n const dispatcher = new WebhookDispatcher({ store, onLog: log });\n\n const app = new Hono<AppContext>();\n\n if (!opts.quiet) {\n app.use(\"*\", honoLogger((msg) => console.log(msg)));\n }\n\n app.use(\"*\", async (c, next) => {\n c.set(\"store\", store);\n c.set(\"dispatcher\", dispatcher);\n c.set(\"config\", config);\n if (log) c.set(\"log\", log);\n if (opts.recorder) c.set(\"recorder\", opts.recorder);\n await next();\n });\n\n app.get(\"/\", (c) => c.json({ name: \"mpesa-mock\", status: \"ok\" }));\n app.get(\"/__mock__/health\", (c) => c.json({ status: \"ok\", uptime: process.uptime() }));\n\n app.route(\"/\", oauthRoute());\n app.route(\"/\", stkPushRoute());\n app.route(\"/\", stkQueryRoute());\n app.route(\"/\", c2bRoute());\n app.route(\"/\", b2cRoute());\n app.route(\"/\", b2bRoute());\n app.route(\"/\", transactionStatusRoute());\n app.route(\"/\", accountBalanceRoute());\n app.route(\"/\", reversalRoute());\n app.route(\"/\", dashboardRoute());\n\n app.notFound((c) =>\n c.json(\n {\n errorCode: \"404.000.01\",\n errorMessage: `Not found: ${c.req.method} ${c.req.path}`,\n },\n 404,\n ),\n );\n\n return { app, store, dispatcher, config };\n}\n","'use strict';\n\nexports.getBooleanOption = (options, key) => {\n\tlet value = false;\n\tif (key in options && typeof (value = options[key]) !== 'boolean') {\n\t\tthrow new TypeError(`Expected the \"${key}\" option to be a boolean`);\n\t}\n\treturn value;\n};\n\nexports.cppdb = Symbol();\nexports.inspect = Symbol.for('nodejs.util.inspect.custom');\n","'use strict';\nconst descriptor = { value: 'SqliteError', writable: true, enumerable: false, configurable: true };\n\nfunction SqliteError(message, code) {\n\tif (new.target !== SqliteError) {\n\t\treturn new SqliteError(message, code);\n\t}\n\tif (typeof code !== 'string') {\n\t\tthrow new TypeError('Expected second argument to be a string');\n\t}\n\tError.call(this, message);\n\tdescriptor.value = '' + message;\n\tObject.defineProperty(this, 'message', descriptor);\n\tError.captureStackTrace(this, SqliteError);\n\tthis.code = code;\n}\nObject.setPrototypeOf(SqliteError, Error);\nObject.setPrototypeOf(SqliteError.prototype, Error.prototype);\nObject.defineProperty(SqliteError.prototype, 'name', descriptor);\nmodule.exports = SqliteError;\n","\n/**\n * Module dependencies.\n */\n\nvar sep = require('path').sep || '/';\n\n/**\n * Module exports.\n */\n\nmodule.exports = fileUriToPath;\n\n/**\n * File URI to Path function.\n *\n * @param {String} uri\n * @return {String} path\n * @api public\n */\n\nfunction fileUriToPath (uri) {\n if ('string' != typeof uri ||\n uri.length <= 7 ||\n 'file://' != uri.substring(0, 7)) {\n throw new TypeError('must pass in a file:// URI to convert to a file path');\n }\n\n var rest = decodeURI(uri.substring(7));\n var firstSlash = rest.indexOf('/');\n var host = rest.substring(0, firstSlash);\n var path = rest.substring(firstSlash + 1);\n\n // 2. Scheme Definition\n // As a special case, <host> can be the string \"localhost\" or the empty\n // string; this is interpreted as \"the machine from which the URL is\n // being interpreted\".\n if ('localhost' == host) host = '';\n\n if (host) {\n host = sep + sep + host;\n }\n\n // 3.2 Drives, drive letters, mount points, file system root\n // Drive letters are mapped into the top of a file URI in various ways,\n // depending on the implementation; some applications substitute\n // vertical bar (\"|\") for the colon after the drive letter, yielding\n // \"file:///c|/tmp/test.txt\". In some cases, the colon is left\n // unchanged, as in \"file:///c:/tmp/test.txt\". In other cases, the\n // colon is simply omitted, as in \"file:///c/tmp/test.txt\".\n path = path.replace(/^(.+)\\|/, '$1:');\n\n // for Windows, we need to invert the path separators from what a URI uses\n if (sep == '\\\\') {\n path = path.replace(/\\//g, '\\\\');\n }\n\n if (/^.+\\:/.test(path)) {\n // has Windows drive at beginning of path\n } else {\n // unix path…\n path = sep + path;\n }\n\n return host + path;\n}\n","/**\n * Module dependencies.\n */\n\nvar fs = require('fs'),\n path = require('path'),\n fileURLToPath = require('file-uri-to-path'),\n join = path.join,\n dirname = path.dirname,\n exists =\n (fs.accessSync &&\n function(path) {\n try {\n fs.accessSync(path);\n } catch (e) {\n return false;\n }\n return true;\n }) ||\n fs.existsSync ||\n path.existsSync,\n defaults = {\n arrow: process.env.NODE_BINDINGS_ARROW || ' → ',\n compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled',\n platform: process.platform,\n arch: process.arch,\n nodePreGyp:\n 'node-v' +\n process.versions.modules +\n '-' +\n process.platform +\n '-' +\n process.arch,\n version: process.versions.node,\n bindings: 'bindings.node',\n try: [\n // node-gyp's linked version in the \"build\" dir\n ['module_root', 'build', 'bindings'],\n // node-waf and gyp_addon (a.k.a node-gyp)\n ['module_root', 'build', 'Debug', 'bindings'],\n ['module_root', 'build', 'Release', 'bindings'],\n // Debug files, for development (legacy behavior, remove for node v0.9)\n ['module_root', 'out', 'Debug', 'bindings'],\n ['module_root', 'Debug', 'bindings'],\n // Release files, but manually compiled (legacy behavior, remove for node v0.9)\n ['module_root', 'out', 'Release', 'bindings'],\n ['module_root', 'Release', 'bindings'],\n // Legacy from node-waf, node <= 0.4.x\n ['module_root', 'build', 'default', 'bindings'],\n // Production \"Release\" buildtype binary (meh...)\n ['module_root', 'compiled', 'version', 'platform', 'arch', 'bindings'],\n // node-qbs builds\n ['module_root', 'addon-build', 'release', 'install-root', 'bindings'],\n ['module_root', 'addon-build', 'debug', 'install-root', 'bindings'],\n ['module_root', 'addon-build', 'default', 'install-root', 'bindings'],\n // node-pre-gyp path ./lib/binding/{node_abi}-{platform}-{arch}\n ['module_root', 'lib', 'binding', 'nodePreGyp', 'bindings']\n ]\n };\n\n/**\n * The main `bindings()` function loads the compiled bindings for a given module.\n * It uses V8's Error API to determine the parent filename that this function is\n * being invoked from, which is then used to find the root directory.\n */\n\nfunction bindings(opts) {\n // Argument surgery\n if (typeof opts == 'string') {\n opts = { bindings: opts };\n } else if (!opts) {\n opts = {};\n }\n\n // maps `defaults` onto `opts` object\n Object.keys(defaults).map(function(i) {\n if (!(i in opts)) opts[i] = defaults[i];\n });\n\n // Get the module root\n if (!opts.module_root) {\n opts.module_root = exports.getRoot(exports.getFileName());\n }\n\n // Ensure the given bindings name ends with .node\n if (path.extname(opts.bindings) != '.node') {\n opts.bindings += '.node';\n }\n\n // https://github.com/webpack/webpack/issues/4175#issuecomment-342931035\n var requireFunc =\n typeof __webpack_require__ === 'function'\n ? __non_webpack_require__\n : require;\n\n var tries = [],\n i = 0,\n l = opts.try.length,\n n,\n b,\n err;\n\n for (; i < l; i++) {\n n = join.apply(\n null,\n opts.try[i].map(function(p) {\n return opts[p] || p;\n })\n );\n tries.push(n);\n try {\n b = opts.path ? requireFunc.resolve(n) : requireFunc(n);\n if (!opts.path) {\n b.path = n;\n }\n return b;\n } catch (e) {\n if (e.code !== 'MODULE_NOT_FOUND' &&\n e.code !== 'QUALIFIED_PATH_RESOLUTION_FAILED' &&\n !/not find/i.test(e.message)) {\n throw e;\n }\n }\n }\n\n err = new Error(\n 'Could not locate the bindings file. Tried:\\n' +\n tries\n .map(function(a) {\n return opts.arrow + a;\n })\n .join('\\n')\n );\n err.tries = tries;\n throw err;\n}\nmodule.exports = exports = bindings;\n\n/**\n * Gets the filename of the JavaScript file that invokes this function.\n * Used to help find the root directory of a module.\n * Optionally accepts an filename argument to skip when searching for the invoking filename\n */\n\nexports.getFileName = function getFileName(calling_file) {\n var origPST = Error.prepareStackTrace,\n origSTL = Error.stackTraceLimit,\n dummy = {},\n fileName;\n\n Error.stackTraceLimit = 10;\n\n Error.prepareStackTrace = function(e, st) {\n for (var i = 0, l = st.length; i < l; i++) {\n fileName = st[i].getFileName();\n if (fileName !== __filename) {\n if (calling_file) {\n if (fileName !== calling_file) {\n return;\n }\n } else {\n return;\n }\n }\n }\n };\n\n // run the 'prepareStackTrace' function above\n Error.captureStackTrace(dummy);\n dummy.stack;\n\n // cleanup\n Error.prepareStackTrace = origPST;\n Error.stackTraceLimit = origSTL;\n\n // handle filename that starts with \"file://\"\n var fileSchema = 'file://';\n if (fileName.indexOf(fileSchema) === 0) {\n fileName = fileURLToPath(fileName);\n }\n\n return fileName;\n};\n\n/**\n * Gets the root directory of a module, given an arbitrary filename\n * somewhere in the module tree. The \"root directory\" is the directory\n * containing the `package.json` file.\n *\n * In: /home/nate/node-native-module/lib/index.js\n * Out: /home/nate/node-native-module\n */\n\nexports.getRoot = function getRoot(file) {\n var dir = dirname(file),\n prev;\n while (true) {\n if (dir === '.') {\n // Avoids an infinite loop in rare cases, like the REPL\n dir = process.cwd();\n }\n if (\n exists(join(dir, 'package.json')) ||\n exists(join(dir, 'node_modules'))\n ) {\n // Found the 'package.json' file or 'node_modules' dir; we're done\n return dir;\n }\n if (prev === dir) {\n // Got to the top\n throw new Error(\n 'Could not find module root given file: \"' +\n file +\n '\". Do you have a `package.json` file? '\n );\n }\n // Try the parent dir next\n prev = dir;\n dir = join(dir, '..');\n }\n};\n","'use strict';\nconst { cppdb } = require('../util');\n\nexports.prepare = function prepare(sql) {\n\treturn this[cppdb].prepare(sql, this, false);\n};\n\nexports.exec = function exec(sql) {\n\tthis[cppdb].exec(sql);\n\treturn this;\n};\n\nexports.close = function close() {\n\tthis[cppdb].close();\n\treturn this;\n};\n\nexports.loadExtension = function loadExtension(...args) {\n\tthis[cppdb].loadExtension(...args);\n\treturn this;\n};\n\nexports.defaultSafeIntegers = function defaultSafeIntegers(...args) {\n\tthis[cppdb].defaultSafeIntegers(...args);\n\treturn this;\n};\n\nexports.unsafeMode = function unsafeMode(...args) {\n\tthis[cppdb].unsafeMode(...args);\n\treturn this;\n};\n\nexports.getters = {\n\tname: {\n\t\tget: function name() { return this[cppdb].name; },\n\t\tenumerable: true,\n\t},\n\topen: {\n\t\tget: function open() { return this[cppdb].open; },\n\t\tenumerable: true,\n\t},\n\tinTransaction: {\n\t\tget: function inTransaction() { return this[cppdb].inTransaction; },\n\t\tenumerable: true,\n\t},\n\treadonly: {\n\t\tget: function readonly() { return this[cppdb].readonly; },\n\t\tenumerable: true,\n\t},\n\tmemory: {\n\t\tget: function memory() { return this[cppdb].memory; },\n\t\tenumerable: true,\n\t},\n};\n","'use strict';\nconst { cppdb } = require('../util');\nconst controllers = new WeakMap();\n\nmodule.exports = function transaction(fn) {\n\tif (typeof fn !== 'function') throw new TypeError('Expected first argument to be a function');\n\n\tconst db = this[cppdb];\n\tconst controller = getController(db, this);\n\tconst { apply } = Function.prototype;\n\n\t// Each version of the transaction function has these same properties\n\tconst properties = {\n\t\tdefault: { value: wrapTransaction(apply, fn, db, controller.default) },\n\t\tdeferred: { value: wrapTransaction(apply, fn, db, controller.deferred) },\n\t\timmediate: { value: wrapTransaction(apply, fn, db, controller.immediate) },\n\t\texclusive: { value: wrapTransaction(apply, fn, db, controller.exclusive) },\n\t\tdatabase: { value: this, enumerable: true },\n\t};\n\n\tObject.defineProperties(properties.default.value, properties);\n\tObject.defineProperties(properties.deferred.value, properties);\n\tObject.defineProperties(properties.immediate.value, properties);\n\tObject.defineProperties(properties.exclusive.value, properties);\n\n\t// Return the default version of the transaction function\n\treturn properties.default.value;\n};\n\n// Return the database's cached transaction controller, or create a new one\nconst getController = (db, self) => {\n\tlet controller = controllers.get(db);\n\tif (!controller) {\n\t\tconst shared = {\n\t\t\tcommit: db.prepare('COMMIT', self, false),\n\t\t\trollback: db.prepare('ROLLBACK', self, false),\n\t\t\tsavepoint: db.prepare('SAVEPOINT `\\t_bs3.\\t`', self, false),\n\t\t\trelease: db.prepare('RELEASE `\\t_bs3.\\t`', self, false),\n\t\t\trollbackTo: db.prepare('ROLLBACK TO `\\t_bs3.\\t`', self, false),\n\t\t};\n\t\tcontrollers.set(db, controller = {\n\t\t\tdefault: Object.assign({ begin: db.prepare('BEGIN', self, false) }, shared),\n\t\t\tdeferred: Object.assign({ begin: db.prepare('BEGIN DEFERRED', self, false) }, shared),\n\t\t\timmediate: Object.assign({ begin: db.prepare('BEGIN IMMEDIATE', self, false) }, shared),\n\t\t\texclusive: Object.assign({ begin: db.prepare('BEGIN EXCLUSIVE', self, false) }, shared),\n\t\t});\n\t}\n\treturn controller;\n};\n\n// Return a new transaction function by wrapping the given function\nconst wrapTransaction = (apply, fn, db, { begin, commit, rollback, savepoint, release, rollbackTo }) => function sqliteTransaction() {\n\tlet before, after, undo;\n\tif (db.inTransaction) {\n\t\tbefore = savepoint;\n\t\tafter = release;\n\t\tundo = rollbackTo;\n\t} else {\n\t\tbefore = begin;\n\t\tafter = commit;\n\t\tundo = rollback;\n\t}\n\tbefore.run();\n\ttry {\n\t\tconst result = apply.call(fn, this, arguments);\n\t\tif (result && typeof result.then === 'function') {\n\t\t\tthrow new TypeError('Transaction function cannot return a promise');\n\t\t}\n\t\tafter.run();\n\t\treturn result;\n\t} catch (ex) {\n\t\tif (db.inTransaction) {\n\t\t\tundo.run();\n\t\t\tif (undo !== rollback) after.run();\n\t\t}\n\t\tthrow ex;\n\t}\n};\n","'use strict';\nconst { getBooleanOption, cppdb } = require('../util');\n\nmodule.exports = function pragma(source, options) {\n\tif (options == null) options = {};\n\tif (typeof source !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');\n\tconst simple = getBooleanOption(options, 'simple');\n\n\tconst stmt = this[cppdb].prepare(`PRAGMA ${source}`, this, true);\n\treturn simple ? stmt.pluck().get() : stmt.all();\n};\n","'use strict';\nconst fs = require('fs');\nconst path = require('path');\nconst { promisify } = require('util');\nconst { cppdb } = require('../util');\nconst fsAccess = promisify(fs.access);\n\nmodule.exports = async function backup(filename, options) {\n\tif (options == null) options = {};\n\n\t// Validate arguments\n\tif (typeof filename !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');\n\n\t// Interpret options\n\tfilename = filename.trim();\n\tconst attachedName = 'attached' in options ? options.attached : 'main';\n\tconst handler = 'progress' in options ? options.progress : null;\n\n\t// Validate interpreted options\n\tif (!filename) throw new TypeError('Backup filename cannot be an empty string');\n\tif (filename === ':memory:') throw new TypeError('Invalid backup filename \":memory:\"');\n\tif (typeof attachedName !== 'string') throw new TypeError('Expected the \"attached\" option to be a string');\n\tif (!attachedName) throw new TypeError('The \"attached\" option cannot be an empty string');\n\tif (handler != null && typeof handler !== 'function') throw new TypeError('Expected the \"progress\" option to be a function');\n\n\t// Make sure the specified directory exists\n\tawait fsAccess(path.dirname(filename)).catch(() => {\n\t\tthrow new TypeError('Cannot save backup because the directory does not exist');\n\t});\n\n\tconst isNewFile = await fsAccess(filename).then(() => false, () => true);\n\treturn runBackup(this[cppdb].backup(this, attachedName, filename, isNewFile), handler || null);\n};\n\nconst runBackup = (backup, handler) => {\n\tlet rate = 0;\n\tlet useDefault = true;\n\n\treturn new Promise((resolve, reject) => {\n\t\tsetImmediate(function step() {\n\t\t\ttry {\n\t\t\t\tconst progress = backup.transfer(rate);\n\t\t\t\tif (!progress.remainingPages) {\n\t\t\t\t\tbackup.close();\n\t\t\t\t\tresolve(progress);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (useDefault) {\n\t\t\t\t\tuseDefault = false;\n\t\t\t\t\trate = 100;\n\t\t\t\t}\n\t\t\t\tif (handler) {\n\t\t\t\t\tconst ret = handler(progress);\n\t\t\t\t\tif (ret !== undefined) {\n\t\t\t\t\t\tif (typeof ret === 'number' && ret === ret) rate = Math.max(0, Math.min(0x7fffffff, Math.round(ret)));\n\t\t\t\t\t\telse throw new TypeError('Expected progress callback to return a number or undefined');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsetImmediate(step);\n\t\t\t} catch (err) {\n\t\t\t\tbackup.close();\n\t\t\t\treject(err);\n\t\t\t}\n\t\t});\n\t});\n};\n","'use strict';\nconst { cppdb } = require('../util');\n\nmodule.exports = function serialize(options) {\n\tif (options == null) options = {};\n\n\t// Validate arguments\n\tif (typeof options !== 'object') throw new TypeError('Expected first argument to be an options object');\n\n\t// Interpret and validate options\n\tconst attachedName = 'attached' in options ? options.attached : 'main';\n\tif (typeof attachedName !== 'string') throw new TypeError('Expected the \"attached\" option to be a string');\n\tif (!attachedName) throw new TypeError('The \"attached\" option cannot be an empty string');\n\n\treturn this[cppdb].serialize(attachedName);\n};\n","'use strict';\nconst { getBooleanOption, cppdb } = require('../util');\n\nmodule.exports = function defineFunction(name, options, fn) {\n\t// Apply defaults\n\tif (options == null) options = {};\n\tif (typeof options === 'function') { fn = options; options = {}; }\n\n\t// Validate arguments\n\tif (typeof name !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof fn !== 'function') throw new TypeError('Expected last argument to be a function');\n\tif (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');\n\tif (!name) throw new TypeError('User-defined function name cannot be an empty string');\n\n\t// Interpret options\n\tconst safeIntegers = 'safeIntegers' in options ? +getBooleanOption(options, 'safeIntegers') : 2;\n\tconst deterministic = getBooleanOption(options, 'deterministic');\n\tconst directOnly = getBooleanOption(options, 'directOnly');\n\tconst varargs = getBooleanOption(options, 'varargs');\n\tlet argCount = -1;\n\n\t// Determine argument count\n\tif (!varargs) {\n\t\targCount = fn.length;\n\t\tif (!Number.isInteger(argCount) || argCount < 0) throw new TypeError('Expected function.length to be a positive integer');\n\t\tif (argCount > 100) throw new RangeError('User-defined functions cannot have more than 100 arguments');\n\t}\n\n\tthis[cppdb].function(fn, name, argCount, safeIntegers, deterministic, directOnly);\n\treturn this;\n};\n","'use strict';\nconst { getBooleanOption, cppdb } = require('../util');\n\nmodule.exports = function defineAggregate(name, options) {\n\t// Validate arguments\n\tif (typeof name !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof options !== 'object' || options === null) throw new TypeError('Expected second argument to be an options object');\n\tif (!name) throw new TypeError('User-defined function name cannot be an empty string');\n\n\t// Interpret options\n\tconst start = 'start' in options ? options.start : null;\n\tconst step = getFunctionOption(options, 'step', true);\n\tconst inverse = getFunctionOption(options, 'inverse', false);\n\tconst result = getFunctionOption(options, 'result', false);\n\tconst safeIntegers = 'safeIntegers' in options ? +getBooleanOption(options, 'safeIntegers') : 2;\n\tconst deterministic = getBooleanOption(options, 'deterministic');\n\tconst directOnly = getBooleanOption(options, 'directOnly');\n\tconst varargs = getBooleanOption(options, 'varargs');\n\tlet argCount = -1;\n\n\t// Determine argument count\n\tif (!varargs) {\n\t\targCount = Math.max(getLength(step), inverse ? getLength(inverse) : 0);\n\t\tif (argCount > 0) argCount -= 1;\n\t\tif (argCount > 100) throw new RangeError('User-defined functions cannot have more than 100 arguments');\n\t}\n\n\tthis[cppdb].aggregate(start, step, inverse, result, name, argCount, safeIntegers, deterministic, directOnly);\n\treturn this;\n};\n\nconst getFunctionOption = (options, key, required) => {\n\tconst value = key in options ? options[key] : null;\n\tif (typeof value === 'function') return value;\n\tif (value != null) throw new TypeError(`Expected the \"${key}\" option to be a function`);\n\tif (required) throw new TypeError(`Missing required option \"${key}\"`);\n\treturn null;\n};\n\nconst getLength = ({ length }) => {\n\tif (Number.isInteger(length) && length >= 0) return length;\n\tthrow new TypeError('Expected function.length to be a positive integer');\n};\n","'use strict';\nconst { cppdb } = require('../util');\n\nmodule.exports = function defineTable(name, factory) {\n\t// Validate arguments\n\tif (typeof name !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (!name) throw new TypeError('Virtual table module name cannot be an empty string');\n\n\t// Determine whether the module is eponymous-only or not\n\tlet eponymous = false;\n\tif (typeof factory === 'object' && factory !== null) {\n\t\teponymous = true;\n\t\tfactory = defer(parseTableDefinition(factory, 'used', name));\n\t} else {\n\t\tif (typeof factory !== 'function') throw new TypeError('Expected second argument to be a function or a table definition object');\n\t\tfactory = wrapFactory(factory);\n\t}\n\n\tthis[cppdb].table(factory, name, eponymous);\n\treturn this;\n};\n\nfunction wrapFactory(factory) {\n\treturn function virtualTableFactory(moduleName, databaseName, tableName, ...args) {\n\t\tconst thisObject = {\n\t\t\tmodule: moduleName,\n\t\t\tdatabase: databaseName,\n\t\t\ttable: tableName,\n\t\t};\n\n\t\t// Generate a new table definition by invoking the factory\n\t\tconst def = apply.call(factory, thisObject, args);\n\t\tif (typeof def !== 'object' || def === null) {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" did not return a table definition object`);\n\t\t}\n\n\t\treturn parseTableDefinition(def, 'returned', moduleName);\n\t};\n}\n\nfunction parseTableDefinition(def, verb, moduleName) {\n\t// Validate required properties\n\tif (!hasOwnProperty.call(def, 'rows')) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition without a \"rows\" property`);\n\t}\n\tif (!hasOwnProperty.call(def, 'columns')) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition without a \"columns\" property`);\n\t}\n\n\t// Validate \"rows\" property\n\tconst rows = def.rows;\n\tif (typeof rows !== 'function' || Object.getPrototypeOf(rows) !== GeneratorFunctionPrototype) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"rows\" property (should be a generator function)`);\n\t}\n\n\t// Validate \"columns\" property\n\tlet columns = def.columns;\n\tif (!Array.isArray(columns) || !(columns = [...columns]).every(x => typeof x === 'string')) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"columns\" property (should be an array of strings)`);\n\t}\n\tif (columns.length !== new Set(columns).size) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with duplicate column names`);\n\t}\n\tif (!columns.length) {\n\t\tthrow new RangeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with zero columns`);\n\t}\n\n\t// Validate \"parameters\" property\n\tlet parameters;\n\tif (hasOwnProperty.call(def, 'parameters')) {\n\t\tparameters = def.parameters;\n\t\tif (!Array.isArray(parameters) || !(parameters = [...parameters]).every(x => typeof x === 'string')) {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"parameters\" property (should be an array of strings)`);\n\t\t}\n\t} else {\n\t\tparameters = inferParameters(rows);\n\t}\n\tif (parameters.length !== new Set(parameters).size) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with duplicate parameter names`);\n\t}\n\tif (parameters.length > 32) {\n\t\tthrow new RangeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with more than the maximum number of 32 parameters`);\n\t}\n\tfor (const parameter of parameters) {\n\t\tif (columns.includes(parameter)) {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with column \"${parameter}\" which was ambiguously defined as both a column and parameter`);\n\t\t}\n\t}\n\n\t// Validate \"safeIntegers\" option\n\tlet safeIntegers = 2;\n\tif (hasOwnProperty.call(def, 'safeIntegers')) {\n\t\tconst bool = def.safeIntegers;\n\t\tif (typeof bool !== 'boolean') {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"safeIntegers\" property (should be a boolean)`);\n\t\t}\n\t\tsafeIntegers = +bool;\n\t}\n\n\t// Validate \"directOnly\" option\n\tlet directOnly = false;\n\tif (hasOwnProperty.call(def, 'directOnly')) {\n\t\tdirectOnly = def.directOnly;\n\t\tif (typeof directOnly !== 'boolean') {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" ${verb} a table definition with an invalid \"directOnly\" property (should be a boolean)`);\n\t\t}\n\t}\n\n\t// Generate SQL for the virtual table definition\n\tconst columnDefinitions = [\n\t\t...parameters.map(identifier).map(str => `${str} HIDDEN`),\n\t\t...columns.map(identifier),\n\t];\n\treturn [\n\t\t`CREATE TABLE x(${columnDefinitions.join(', ')});`,\n\t\twrapGenerator(rows, new Map(columns.map((x, i) => [x, parameters.length + i])), moduleName),\n\t\tparameters,\n\t\tsafeIntegers,\n\t\tdirectOnly,\n\t];\n}\n\nfunction wrapGenerator(generator, columnMap, moduleName) {\n\treturn function* virtualTable(...args) {\n\t\t/*\n\t\t\tWe must defensively clone any buffers in the arguments, because\n\t\t\totherwise the generator could mutate one of them, which would cause\n\t\t\tus to return incorrect values for hidden columns, potentially\n\t\t\tcorrupting the database.\n\t\t */\n\t\tconst output = args.map(x => Buffer.isBuffer(x) ? Buffer.from(x) : x);\n\t\tfor (let i = 0; i < columnMap.size; ++i) {\n\t\t\toutput.push(null); // Fill with nulls to prevent gaps in array (v8 optimization)\n\t\t}\n\t\tfor (const row of generator(...args)) {\n\t\t\tif (Array.isArray(row)) {\n\t\t\t\textractRowArray(row, output, columnMap.size, moduleName);\n\t\t\t\tyield output;\n\t\t\t} else if (typeof row === 'object' && row !== null) {\n\t\t\t\textractRowObject(row, output, columnMap, moduleName);\n\t\t\t\tyield output;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" yielded something that isn't a valid row object`);\n\t\t\t}\n\t\t}\n\t};\n}\n\nfunction extractRowArray(row, output, columnCount, moduleName) {\n\tif (row.length !== columnCount) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" yielded a row with an incorrect number of columns`);\n\t}\n\tconst offset = output.length - columnCount;\n\tfor (let i = 0; i < columnCount; ++i) {\n\t\toutput[i + offset] = row[i];\n\t}\n}\n\nfunction extractRowObject(row, output, columnMap, moduleName) {\n\tlet count = 0;\n\tfor (const key of Object.keys(row)) {\n\t\tconst index = columnMap.get(key);\n\t\tif (index === undefined) {\n\t\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" yielded a row with an undeclared column \"${key}\"`);\n\t\t}\n\t\toutput[index] = row[key];\n\t\tcount += 1;\n\t}\n\tif (count !== columnMap.size) {\n\t\tthrow new TypeError(`Virtual table module \"${moduleName}\" yielded a row with missing columns`);\n\t}\n}\n\nfunction inferParameters({ length }) {\n\tif (!Number.isInteger(length) || length < 0) {\n\t\tthrow new TypeError('Expected function.length to be a positive integer');\n\t}\n\tconst params = [];\n\tfor (let i = 0; i < length; ++i) {\n\t\tparams.push(`$${i + 1}`);\n\t}\n\treturn params;\n}\n\nconst { hasOwnProperty } = Object.prototype;\nconst { apply } = Function.prototype;\nconst GeneratorFunctionPrototype = Object.getPrototypeOf(function*(){});\nconst identifier = str => `\"${str.replace(/\"/g, '\"\"')}\"`;\nconst defer = x => () => x;\n","'use strict';\nconst DatabaseInspection = function Database() {};\n\nmodule.exports = function inspect(depth, opts) {\n\treturn Object.assign(new DatabaseInspection(), this);\n};\n\n","'use strict';\nconst fs = require('fs');\nconst path = require('path');\nconst util = require('./util');\nconst SqliteError = require('./sqlite-error');\n\nlet DEFAULT_ADDON;\n\nfunction Database(filenameGiven, options) {\n\tif (new.target == null) {\n\t\treturn new Database(filenameGiven, options);\n\t}\n\n\t// Apply defaults\n\tlet buffer;\n\tif (Buffer.isBuffer(filenameGiven)) {\n\t\tbuffer = filenameGiven;\n\t\tfilenameGiven = ':memory:';\n\t}\n\tif (filenameGiven == null) filenameGiven = '';\n\tif (options == null) options = {};\n\n\t// Validate arguments\n\tif (typeof filenameGiven !== 'string') throw new TypeError('Expected first argument to be a string');\n\tif (typeof options !== 'object') throw new TypeError('Expected second argument to be an options object');\n\tif ('readOnly' in options) throw new TypeError('Misspelled option \"readOnly\" should be \"readonly\"');\n\tif ('memory' in options) throw new TypeError('Option \"memory\" was removed in v7.0.0 (use \":memory:\" filename instead)');\n\n\t// Interpret options\n\tconst filename = filenameGiven.trim();\n\tconst anonymous = filename === '' || filename === ':memory:';\n\tconst readonly = util.getBooleanOption(options, 'readonly');\n\tconst fileMustExist = util.getBooleanOption(options, 'fileMustExist');\n\tconst timeout = 'timeout' in options ? options.timeout : 5000;\n\tconst verbose = 'verbose' in options ? options.verbose : null;\n\tconst nativeBinding = 'nativeBinding' in options ? options.nativeBinding : null;\n\n\t// Validate interpreted options\n\tif (readonly && anonymous && !buffer) throw new TypeError('In-memory/temporary databases cannot be readonly');\n\tif (!Number.isInteger(timeout) || timeout < 0) throw new TypeError('Expected the \"timeout\" option to be a positive integer');\n\tif (timeout > 0x7fffffff) throw new RangeError('Option \"timeout\" cannot be greater than 2147483647');\n\tif (verbose != null && typeof verbose !== 'function') throw new TypeError('Expected the \"verbose\" option to be a function');\n\tif (nativeBinding != null && typeof nativeBinding !== 'string' && typeof nativeBinding !== 'object') throw new TypeError('Expected the \"nativeBinding\" option to be a string or addon object');\n\n\t// Load the native addon\n\tlet addon;\n\tif (nativeBinding == null) {\n\t\taddon = DEFAULT_ADDON || (DEFAULT_ADDON = require('bindings')('better_sqlite3.node'));\n\t} else if (typeof nativeBinding === 'string') {\n\t\t// See <https://webpack.js.org/api/module-variables/#__non_webpack_require__-webpack-specific>\n\t\tconst requireFunc = typeof __non_webpack_require__ === 'function' ? __non_webpack_require__ : require;\n\t\taddon = requireFunc(path.resolve(nativeBinding).replace(/(\\.node)?$/, '.node'));\n\t} else {\n\t\t// See <https://github.com/WiseLibs/better-sqlite3/issues/972>\n\t\taddon = nativeBinding;\n\t}\n\n\tif (!addon.isInitialized) {\n\t\taddon.setErrorConstructor(SqliteError);\n\t\taddon.isInitialized = true;\n\t}\n\n\t// Make sure the specified directory exists\n\tif (!anonymous && !fs.existsSync(path.dirname(filename))) {\n\t\tthrow new TypeError('Cannot open database because the directory does not exist');\n\t}\n\n\tObject.defineProperties(this, {\n\t\t[util.cppdb]: { value: new addon.Database(filename, filenameGiven, anonymous, readonly, fileMustExist, timeout, verbose || null, buffer || null) },\n\t\t...wrappers.getters,\n\t});\n}\n\nconst wrappers = require('./methods/wrappers');\nDatabase.prototype.prepare = wrappers.prepare;\nDatabase.prototype.transaction = require('./methods/transaction');\nDatabase.prototype.pragma = require('./methods/pragma');\nDatabase.prototype.backup = require('./methods/backup');\nDatabase.prototype.serialize = require('./methods/serialize');\nDatabase.prototype.function = require('./methods/function');\nDatabase.prototype.aggregate = require('./methods/aggregate');\nDatabase.prototype.table = require('./methods/table');\nDatabase.prototype.loadExtension = wrappers.loadExtension;\nDatabase.prototype.exec = wrappers.exec;\nDatabase.prototype.close = wrappers.close;\nDatabase.prototype.defaultSafeIntegers = wrappers.defaultSafeIntegers;\nDatabase.prototype.unsafeMode = wrappers.unsafeMode;\nDatabase.prototype[util.inspect] = require('./methods/inspect');\n\nmodule.exports = Database;\n","'use strict';\nmodule.exports = require('./database');\nmodule.exports.SqliteError = require('./sqlite-error');\n","import type { InMemoryStore } from \"../core/transactions.js\";\nimport type { WebhookDispatcher } from \"../core/webhook-dispatcher.js\";\n\nexport function startTui(_store: InMemoryStore, _dispatcher: WebhookDispatcher): { stop: () => void } {\n console.log(\"Terminal UI not implemented yet — open the web dashboard at /__mock__/dashboard instead.\");\n return { stop: () => undefined };\n}\n","import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { serve } from \"@hono/node-server\";\nimport { readFileSync, writeFileSync, existsSync, appendFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { createServer, type RecorderEntry } from \"./server.js\";\nimport { createSqliteStore } from \"./core/persistence.js\";\nimport { DEFAULTS } from \"./config/defaults.js\";\nimport type { MockConfig } from \"./core/failure-injector.js\";\n\ninterface CliOptions {\n port: string;\n host: string;\n delay?: string;\n config?: string;\n persist?: string;\n record?: string;\n replay?: string;\n quiet?: boolean;\n ui?: boolean;\n}\n\nconst VERSION = \"0.1.0\";\n\nconst program = new Command();\n\nprogram\n .name(\"mpesa-mock\")\n .description(\"Local M-Pesa Daraja API emulator\")\n .version(VERSION)\n .option(\"-p, --port <number>\", \"port to listen on\", String(DEFAULTS.port))\n .option(\"-h, --host <host>\", \"host to bind\", DEFAULTS.host)\n .option(\"-d, --delay <ms>\", \"default callback delay in milliseconds\")\n .option(\"-c, --config <path>\", \"path to mpesa-mock.config.json\")\n .option(\"--persist <path>\", \"SQLite database path (transactions survive restart)\")\n .option(\"--record <path>\", \"append every request/response to a file\")\n .option(\"--replay <path>\", \"replay a recorded session (transactions only)\")\n .option(\"-q, --quiet\", \"disable per-request logging\")\n .option(\"--ui\", \"launch terminal UI dashboard (live transaction view)\")\n .action(async (opts: CliOptions) => {\n await run(opts);\n });\n\nprogram.parse();\n\nasync function run(opts: CliOptions): Promise<void> {\n const port = Number(opts.port);\n if (!Number.isFinite(port) || port < 1 || port > 65535) {\n console.error(pc.red(`Invalid port: ${opts.port}`));\n process.exit(1);\n }\n\n let configOverrides: Partial<MockConfig> = {};\n if (opts.config) {\n const cfgPath = resolve(opts.config);\n if (!existsSync(cfgPath)) {\n console.error(pc.red(`Config file not found: ${cfgPath}`));\n process.exit(1);\n }\n try {\n configOverrides = JSON.parse(readFileSync(cfgPath, \"utf-8\"));\n } catch (err) {\n console.error(pc.red(`Failed to parse config: ${(err as Error).message}`));\n process.exit(1);\n }\n }\n if (opts.delay !== undefined) {\n configOverrides.defaultCallbackDelayMs = Number(opts.delay);\n }\n\n const store = opts.persist ? await createSqliteStore(resolve(opts.persist)) : undefined;\n\n let recorder: ((e: RecorderEntry) => void) | undefined;\n if (opts.record) {\n const recordPath = resolve(opts.record);\n writeFileSync(recordPath, \"\", { flag: \"a\" });\n recorder = (e: RecorderEntry) => {\n appendFileSync(recordPath, JSON.stringify(e) + \"\\n\");\n };\n }\n\n const { app, dispatcher } = createServer({\n config: configOverrides,\n quiet: opts.quiet ?? false,\n ...(recorder ? { recorder } : {}),\n ...(store ? { store } : {}),\n });\n\n const server = serve({ fetch: app.fetch, port, hostname: opts.host }, (info) => {\n if (!opts.quiet) printBanner(port, info.address);\n });\n\n if (opts.ui) {\n const { startTui } = await import(\"./ui/dashboard.js\").catch(() => ({ startTui: undefined }));\n if (startTui) {\n try {\n const { store: liveStore, dispatcher: liveDispatcher } = await (await import(\"./server.js\")).createServer({ config: configOverrides });\n void liveStore;\n void liveDispatcher;\n } catch {\n // best-effort: ignore TUI failure\n }\n }\n }\n\n if (opts.replay) {\n void replayFile(resolve(opts.replay));\n }\n\n const shutdown = () => {\n dispatcher.shutdown();\n server.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 2000).unref();\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\nfunction printBanner(port: number, host: string): void {\n const base = `http://localhost:${port}`;\n console.log(\"\");\n console.log(` ${pc.green(\"🟢\")} ${pc.bold(\"mpesa-mock\")} ${pc.dim(`v${VERSION}`)} ${pc.dim(\"running on\")} ${pc.cyan(base)}`);\n console.log(\"\");\n console.log(` ${pc.dim(\"Bound to:\")} ${host}:${port}`);\n console.log(` ${pc.dim(\"Base URL:\")} ${base}`);\n console.log(` ${pc.dim(\"OAuth:\")} POST /oauth/v1/generate`);\n console.log(` ${pc.dim(\"STK Push:\")} POST /mpesa/stkpush/v1/processrequest`);\n console.log(` ${pc.dim(\"Dashboard:\")} ${pc.underline(`${base}/__mock__/dashboard`)}`);\n console.log(\"\");\n console.log(` ${pc.dim(\"Try it:\")}`);\n console.log(` ${pc.cyan(`curl ${base}/oauth/v1/generate?grant_type=client_credentials \\\\`)}`);\n console.log(` ${pc.cyan(` -u \"test_key:test_secret\"`)}`);\n console.log(\"\");\n console.log(` ${pc.dim(\"Docs:\")} https://github.com/smbugua/mpesa-mock#readme`);\n console.log(` ${pc.dim(\"Issues:\")} https://github.com/smbugua/mpesa-mock/issues`);\n console.log(\"\");\n}\n\nasync function replayFile(path: string): Promise<void> {\n if (!existsSync(path)) {\n console.error(pc.yellow(`Replay file not found: ${path}`));\n return;\n }\n console.log(pc.dim(`Replay mode: ${path} (transactions will be re-emitted)`));\n}\n","import type { TransactionRecord } from \"../types/daraja.js\";\nimport { InMemoryStore } from \"./transactions.js\";\n\nexport interface PersistentStore extends InMemoryStore {\n close(): void;\n}\n\nexport async function createSqliteStore(path: string): Promise<PersistentStore> {\n let Database: typeof import(\"better-sqlite3\");\n try {\n const mod = await import(\"better-sqlite3\");\n Database = mod.default;\n } catch {\n throw new Error(\n \"Persistence requires the optional dependency 'better-sqlite3'. Install with: npm i better-sqlite3\",\n );\n }\n\n const db = Database(path);\n db.pragma(\"journal_mode = WAL\");\n db.exec(`\n CREATE TABLE IF NOT EXISTS transactions (\n checkoutRequestID TEXT PRIMARY KEY,\n merchantRequestID TEXT NOT NULL,\n conversationID TEXT,\n originatorConversationID TEXT,\n kind TEXT NOT NULL,\n amount INTEGER NOT NULL,\n phoneNumber TEXT NOT NULL,\n shortCode TEXT NOT NULL,\n callbackUrl TEXT,\n state TEXT NOT NULL,\n resultCode INTEGER,\n resultDesc TEXT,\n mpesaReceiptNumber TEXT,\n createdAt INTEGER NOT NULL,\n completedAt INTEGER,\n callbackAttempts INTEGER NOT NULL DEFAULT 0,\n callbackDeliveredAt INTEGER\n );\n CREATE INDEX IF NOT EXISTS idx_conv ON transactions(conversationID);\n CREATE INDEX IF NOT EXISTS idx_created ON transactions(createdAt);\n `);\n\n class SqliteBackedStore extends InMemoryStore implements PersistentStore {\n constructor() {\n super();\n const rows = db.prepare(\"SELECT * FROM transactions ORDER BY createdAt DESC\").all() as TransactionRecord[];\n for (const r of rows) super.put(r);\n this.on(\"change\", (rec: TransactionRecord) => writeRow(rec));\n this.on(\"clear\", () => db.exec(\"DELETE FROM transactions\"));\n }\n close(): void {\n db.close();\n }\n }\n\n const writeStmt = db.prepare(`\n INSERT INTO transactions (\n checkoutRequestID, merchantRequestID, conversationID, originatorConversationID, kind,\n amount, phoneNumber, shortCode, callbackUrl, state, resultCode, resultDesc,\n mpesaReceiptNumber, createdAt, completedAt, callbackAttempts, callbackDeliveredAt\n ) VALUES (\n @checkoutRequestID, @merchantRequestID, @conversationID, @originatorConversationID, @kind,\n @amount, @phoneNumber, @shortCode, @callbackUrl, @state, @resultCode, @resultDesc,\n @mpesaReceiptNumber, @createdAt, @completedAt, @callbackAttempts, @callbackDeliveredAt\n )\n ON CONFLICT(checkoutRequestID) DO UPDATE SET\n state=excluded.state,\n resultCode=excluded.resultCode,\n resultDesc=excluded.resultDesc,\n mpesaReceiptNumber=excluded.mpesaReceiptNumber,\n completedAt=excluded.completedAt,\n callbackAttempts=excluded.callbackAttempts,\n callbackDeliveredAt=excluded.callbackDeliveredAt\n `);\n\n function writeRow(rec: TransactionRecord): void {\n writeStmt.run({\n checkoutRequestID: rec.checkoutRequestID,\n merchantRequestID: rec.merchantRequestID,\n conversationID: rec.conversationID ?? null,\n originatorConversationID: rec.originatorConversationID ?? null,\n kind: rec.kind,\n amount: rec.amount,\n phoneNumber: rec.phoneNumber,\n shortCode: rec.shortCode,\n callbackUrl: rec.callbackUrl ?? null,\n state: rec.state,\n resultCode: rec.resultCode ?? null,\n resultDesc: rec.resultDesc ?? null,\n mpesaReceiptNumber: rec.mpesaReceiptNumber ?? null,\n createdAt: rec.createdAt,\n completedAt: rec.completedAt ?? null,\n callbackAttempts: rec.callbackAttempts,\n callbackDeliveredAt: rec.callbackDeliveredAt ?? null,\n });\n }\n\n return new SqliteBackedStore();\n}\n"],"mappings":"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","names":["EventEmitter","Hono","Hono","Hono","Hono","Hono","Hono","Hono","Hono","Hono","Hono","path","path","fileURLToPath","i","path","resolve","path","init_dashboard","path","startTui","path"]}
|