better-payment
Version:
Unified payment gateway library for Turkish payment providers
1 lines • 10.8 kB
Source Map (JSON)
{"version":3,"sources":["../../src/adapters/node.ts"],"names":[],"mappings":";AAsDO,SAAS,iBAAiB,OAAA,EAA2B;AAC1D,EAAA,OAAO,OAAO,KAAc,GAAA,KAAkB;AAC5C,IAAA,IAAI;AAEF,MAAA,MAAM,QAAA,GAAW,IAAI,QAAA,IAAY,MAAA;AACjC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,IAAK,WAAA;AAChC,MAAA,MAAM,GAAA,GAAM,GAAG,QAAQ,CAAA,GAAA,EAAM,IAAI,CAAA,EAAG,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,GAAG,CAAA,CAAA;AAG9D,MAAA,MAAM,gBAAA,GAAqC;AAAA,QACzC,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,GAAA;AAAA,QACA,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,IAAA,EAAM,MAAM,gBAAA,CAAiB,GAAG;AAAA,OAClC;AAGA,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,MAAA,CAAO,gBAAgB,CAAA;AAGtD,MAAA,MAAA,CAAO,OAAA,CAAQ,SAAS,OAAO,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACzD,QAAA,GAAA,CAAI,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,MAC1B,CAAC,CAAA;AAGD,MAAA,GAAA,CAAI,OAAO,QAAA,CAAS,MAAM,CAAA,CAAE,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,IAChD,SAAS,KAAA,EAAY;AAEnB,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,QACnB,KAAA,EAAO,IAAA;AAAA,QACP,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,OAC3B,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AACF;AAQO,SAAS,kBAAkB,OAAA,EAA2B;AAC3D,EAAA,OAAO,OAAO,KAAsB,GAAA,KAAwB;AAC1D,IAAA,IAAI;AAEF,MAAA,MAAM,QAAA,GAAY,IAAY,QAAA,IAAY,MAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,CAAQ,IAAA,IAAQ,WAAA;AACjC,MAAA,MAAM,MAAM,CAAA,EAAG,QAAQ,MAAM,IAAI,CAAA,EAAG,IAAI,GAAG,CAAA,CAAA;AAG3C,MAAA,MAAM,gBAAA,GAAqC;AAAA,QACzC,MAAA,EAAQ,IAAI,MAAA,IAAU,KAAA;AAAA,QACtB,GAAA;AAAA,QACA,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,IAAA,EAAM,MAAM,iBAAA,CAAkB,GAAG;AAAA,OACnC;AAGA,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,MAAA,CAAO,gBAAgB,CAAA;AAGtD,MAAA,GAAA,CAAI,SAAA,CAAU,SAAS,MAAA,EAAQ;AAAA,QAC7B,GAAG,QAAA,CAAS,OAAA;AAAA,QACZ,cAAA,EAAgB;AAAA,OACjB,CAAA;AAGD,MAAA,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,IACvC,SAAS,KAAA,EAAY;AACnB,MAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAE,cAAA,EAAgB,oBAAoB,CAAA;AACzD,MAAA,GAAA,CAAI,GAAA;AAAA,QACF,KAAK,SAAA,CAAU;AAAA,UACb,KAAA,EAAO,IAAA;AAAA,UACP,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,SAC3B;AAAA,OACH;AAAA,IACF;AAAA,EACF,CAAA;AACF;AAKA,eAAe,iBAAiB,GAAA,EAA4B;AAE1D,EAAA,IAAI,GAAA,CAAI,WAAW,KAAA,EAAO;AACxB,IAAA,OAAO,MAAA,CAAO,KAAK,GAAA,CAAI,KAAK,EAAE,MAAA,GAAS,CAAA,GAAI,IAAI,KAAA,GAAQ,MAAA;AAAA,EACzD;AAGA,EAAA,IAAI,GAAA,CAAI,QAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AAChD,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AAGA,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAU;AACxB,MAAA,IAAA,IAAQ,MAAM,QAAA,EAAS;AAAA,IACzB,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,KAAA,CAAS,CAAA;AAAA,MAC7C,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,QAAQ,MAAS,CAAA;AAAA,MAC3B;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAKA,eAAe,kBAAkB,GAAA,EAAoC;AAEnE,EAAA,IAAI,GAAA,CAAI,WAAW,KAAA,EAAO;AACxB,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,GAAA,CAAI,GAAA,IAAO,IAAI,CAAA,OAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAC/D,IAAA,MAAM,SAA8B,EAAC;AACrC,IAAA,GAAA,CAAI,YAAA,CAAa,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAA,KAAQ;AACvC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,IAChB,CAAC,CAAA;AACD,IAAA,OAAO,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,MAAA;AAAA,EACnD;AAGA,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,GAAA,CAAI,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB;AAChC,MAAA,IAAA,IAAQ,MAAM,QAAA,EAAS;AAAA,IACzB,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,EAAA,CAAG,OAAO,MAAM;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAc,GAAA,CAAI,OAAA,CAAQ,cAAc,CAAA,IAAK,EAAA;AAEnD,QAAA,IAAI,WAAA,CAAY,QAAA,CAAS,kBAAkB,CAAA,EAAG;AAC5C,UAAA,OAAA,CAAQ,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,IAAI,KAAA,CAAS,CAAA;AAAA,QAC7C,CAAA,MAAA,IAAW,WAAA,CAAY,QAAA,CAAS,mCAAmC,CAAA,EAAG;AAEpE,UAAA,MAAM,SAA8B,EAAC;AACrC,UAAA,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,IAAA,KAAS;AAChC,YAAA,MAAM,CAAC,GAAA,EAAK,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACnC,YAAA,IAAI,GAAA,EAAK;AACP,cAAA,MAAA,CAAO,mBAAmB,GAAG,CAAC,CAAA,GAAI,kBAAA,CAAmB,SAAS,EAAE,CAAA;AAAA,YAClE;AAAA,UACF,CAAC,CAAA;AACD,UAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,QAChB,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,QAAQ,KAAA,CAAS,CAAA;AAAA,QAC3B;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,QAAQ,MAAS,CAAA;AAAA,MAC3B;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAMO,IAAM,aAAA,GAAgB","file":"node.mjs","sourcesContent":["import { BetterPayHandler, BetterPayRequest } from '../core/BetterPayHandler';\nimport type { Request, Response } from 'express';\nimport type { IncomingMessage, ServerResponse } from 'http';\n\n/**\n * Express/Node.js adapter for BetterPay\n *\n * Bu adapter, BetterPay handler'ını Express ve standart Node.js HTTP server ile uyumlu hale getirir.\n *\n * @example Express.js (v4):\n * ```typescript\n * import express from 'express';\n * import { betterPay } from './payment';\n * import { toExpressHandler } from 'better-pay/node';\n *\n * const app = express();\n *\n * // IMPORTANT: Don't use express.json() before the Better Pay handler\n * // or the client API will get stuck on \"pending\"\n * app.all('/api/pay/*', toExpressHandler(betterPay.handler));\n *\n * // Use express.json() AFTER the Better Pay handler\n * app.use(express.json());\n * ```\n *\n * @example Express.js (v5):\n * ```typescript\n * // Express v5 uses new wildcard syntax\n * app.all('/api/pay/{*any}', toExpressHandler(betterPay.handler));\n * ```\n *\n * @example Standard Node.js HTTP server:\n * ```typescript\n * import http from 'http';\n * import { betterPay } from './payment';\n * import { toNodeHttpHandler } from 'better-pay/node';\n *\n * const handler = toNodeHttpHandler(betterPay.handler);\n *\n * const server = http.createServer((req, res) => {\n * if (req.url?.startsWith('/api/pay')) {\n * return handler(req, res);\n * }\n * // Other routes...\n * });\n * ```\n */\n\n/**\n * Express middleware adapter\n *\n * @param handler - BetterPayHandler instance\n * @returns Express middleware function\n */\nexport function toExpressHandler(handler: BetterPayHandler) {\n return async (req: Request, res: Response) => {\n try {\n // Construct full URL\n const protocol = req.protocol || 'http';\n const host = req.get('host') || 'localhost';\n const url = `${protocol}://${host}${req.originalUrl || req.url}`;\n\n // Express Request'i BetterPayRequest'e dönüştür\n const betterPayRequest: BetterPayRequest = {\n method: req.method,\n url,\n headers: req.headers as Record<string, string>,\n body: await parseExpressBody(req),\n };\n\n // Handler'ı çağır\n const response = await handler.handle(betterPayRequest);\n\n // Response headers'ı set et\n Object.entries(response.headers).forEach(([key, value]) => {\n res.setHeader(key, value);\n });\n\n // Response'u gönder\n res.status(response.status).json(response.body);\n } catch (error: any) {\n // Error'u next()'e ilet veya doğrudan response gönder\n res.status(500).json({\n error: true,\n message: error.message || 'Internal server error',\n });\n }\n };\n}\n\n/**\n * Standard Node.js HTTP server adapter\n *\n * @param handler - BetterPayHandler instance\n * @returns Node.js HTTP request handler\n */\nexport function toNodeHttpHandler(handler: BetterPayHandler) {\n return async (req: IncomingMessage, res: ServerResponse) => {\n try {\n // Construct full URL\n const protocol = (req as any).protocol || 'http';\n const host = req.headers.host || 'localhost';\n const url = `${protocol}://${host}${req.url}`;\n\n // Node.js Request'i BetterPayRequest'e dönüştür\n const betterPayRequest: BetterPayRequest = {\n method: req.method || 'GET',\n url,\n headers: req.headers as Record<string, string>,\n body: await parseNodeHttpBody(req),\n };\n\n // Handler'ı çağır\n const response = await handler.handle(betterPayRequest);\n\n // Response headers'ı set et\n res.writeHead(response.status, {\n ...response.headers,\n 'Content-Type': 'application/json',\n });\n\n // Response'u gönder\n res.end(JSON.stringify(response.body));\n } catch (error: any) {\n res.writeHead(500, { 'Content-Type': 'application/json' });\n res.end(\n JSON.stringify({\n error: true,\n message: error.message || 'Internal server error',\n })\n );\n }\n };\n}\n\n/**\n * Express request body'sini parse et\n */\nasync function parseExpressBody(req: Request): Promise<any> {\n // GET request - query params\n if (req.method === 'GET') {\n return Object.keys(req.query).length > 0 ? req.query : undefined;\n }\n\n // POST request - body already parsed by express.json() if it was called before\n if (req.body && Object.keys(req.body).length > 0) {\n return req.body;\n }\n\n // If express.json() not called, manually parse the body\n return new Promise((resolve) => {\n let body = '';\n req.on('data', (chunk) => {\n body += chunk.toString();\n });\n req.on('end', () => {\n try {\n resolve(body ? JSON.parse(body) : undefined);\n } catch {\n resolve(body || undefined);\n }\n });\n });\n}\n\n/**\n * Standard Node.js HTTP request body'sini parse et\n */\nasync function parseNodeHttpBody(req: IncomingMessage): Promise<any> {\n // GET request - extract query params from URL\n if (req.method === 'GET') {\n const url = new URL(req.url || '', `http://${req.headers.host}`);\n const params: Record<string, any> = {};\n url.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n return Object.keys(params).length > 0 ? params : undefined;\n }\n\n // POST request - parse body\n return new Promise((resolve) => {\n let body = '';\n req.on('data', (chunk: Buffer) => {\n body += chunk.toString();\n });\n req.on('end', () => {\n try {\n const contentType = req.headers['content-type'] || '';\n\n if (contentType.includes('application/json')) {\n resolve(body ? JSON.parse(body) : undefined);\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n // Parse form data\n const params: Record<string, any> = {};\n body.split('&').forEach((pair) => {\n const [key, value] = pair.split('=');\n if (key) {\n params[decodeURIComponent(key)] = decodeURIComponent(value || '');\n }\n });\n resolve(params);\n } else {\n resolve(body || undefined);\n }\n } catch {\n resolve(body || undefined);\n }\n });\n });\n}\n\n/**\n * Alias for backwards compatibility\n * @deprecated Use toExpressHandler or toNodeHttpHandler instead\n */\nexport const toNodeHandler = toExpressHandler;\n"]}