{"version":3,"file":"postgres.cjs","names":["runsOnServer"],"sources":["../src/postgres.ts"],"sourcesContent":["import { runsOnServer } from \"@settlemint/sdk-utils/runtime\";\nimport pg from \"pg\";\n\n/**\n * Type definition extending the pg.Pool interface to include custom permanent-failure event\n */\ndeclare module \"pg\" {\n  interface Pool {\n    on(event: \"permanent-failure\", listener: (err: Error) => void): this;\n    emit(event: \"permanent-failure\", err: Error): boolean;\n  }\n}\n\n/**\n * Utility function to pause execution for a specified duration\n *\n * @param ms - The number of milliseconds to sleep\n * @returns A promise that resolves after the specified duration\n */\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\n/**\n * Configures error handling and recovery mechanisms for a PostgreSQL connection pool\n *\n * @param pool - The PostgreSQL connection pool to configure\n */\nfunction setupErrorHandling(pool: pg.Pool) {\n  let retryCount = 0;\n  let isRetrying = false;\n  const clientErrorHandlers = new WeakSet<pg.PoolClient>();\n\n  const handlePoolError = async (err: Error) => {\n    console.error(\"[Drizzle] Pool error occurred:\", err);\n\n    // Prevent concurrent retry attempts\n    if (isRetrying) {\n      console.log(\"[Drizzle] Recovery already in progress, skipping\");\n      return;\n    }\n\n    if (retryCount < 3) {\n      isRetrying = true;\n      retryCount++;\n      console.log(`[Drizzle] Attempting to recover - retry ${retryCount}/3`);\n\n      try {\n        const client = await pool.connect();\n        try {\n          // Test the connection with timeout\n          await Promise.race([\n            client.query(\"SELECT 1\"),\n            new Promise((_, reject) => setTimeout(() => reject(new Error(\"Query timeout\")), 5000)),\n          ]);\n          console.log(\"[Drizzle] Successfully recovered connection\");\n          retryCount = 0;\n        } finally {\n          client.release();\n        }\n      } catch (retryError) {\n        console.error(`[Drizzle] Recovery attempt ${retryCount} failed:`, retryError);\n        await sleep(5000 * 2 ** (retryCount - 1));\n      } finally {\n        isRetrying = false;\n      }\n    } else {\n      console.error(\"[Drizzle] Max retries exceeded - pool is in an error state\");\n      pool.emit(\"permanent-failure\", err);\n    }\n  };\n\n  const handleConnect = (client: pg.PoolClient) => {\n    // Only add error handler if not already added (prevent memory leaks)\n    if (!clientErrorHandlers.has(client)) {\n      clientErrorHandlers.add(client);\n      client.on(\"error\", (err: Error) => {\n        console.error(\"[Drizzle] Database client error:\", err);\n      });\n    }\n    retryCount = 0;\n    isRetrying = false;\n  };\n\n  pool.on(\"error\", handlePoolError);\n  pool.on(\"connect\", handleConnect);\n}\n\n/**\n * Creates a PostgreSQL connection pool with error handling and retry mechanisms\n *\n * @param databaseUrl - The PostgreSQL connection URL\n * @returns A configured PostgreSQL connection pool\n * @throws Will throw an error if called from browser runtime\n * @example\n * import { createPostgresPool } from '@settlemint/sdk-hasura';\n *\n * const pool = createPostgresPool(process.env.SETTLEMINT_HASURA_DATABASE_URL);\n *\n * // The pool will automatically handle connection errors and retries\n * const client = await pool.connect();\n * try {\n *   const result = await client.query('SELECT NOW()');\n *   console.log(result.rows[0]);\n * } finally {\n *   client.release();\n * }\n */\nexport function createPostgresPool(databaseUrl: string) {\n  if (!databaseUrl?.trim()) {\n    throw new Error(\"Database URL is required\");\n  }\n\n  if (!runsOnServer) {\n    throw new Error(\"Drizzle client can only be created on the server side\");\n  }\n\n  const pool = new pg.Pool({\n    connectionString: databaseUrl,\n    max: 10,\n    idleTimeoutMillis: 30000,\n    connectionTimeoutMillis: 5000,\n    maxLifetimeSeconds: 0,\n  });\n\n  setupErrorHandling(pool);\n\n  return pool;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,MAAM,SAAS,OAAe,IAAI,SAAS,YAAY,WAAW,SAAS,GAAG,CAAC;;;;;;AAO/E,SAAS,mBAAmB,MAAe;CACzC,IAAI,aAAa;CACjB,IAAI,aAAa;CACjB,MAAM,sBAAsB,IAAI,SAAwB;CAExD,MAAM,kBAAkB,OAAO,QAAe;AAC5C,UAAQ,MAAM,kCAAkC,IAAI;AAGpD,MAAI,YAAY;AACd,WAAQ,IAAI,mDAAmD;AAC/D;;AAGF,MAAI,aAAa,GAAG;AAClB,gBAAa;AACb;AACA,WAAQ,IAAI,2CAA2C,WAAW,IAAI;AAEtE,OAAI;IACF,MAAM,SAAS,MAAM,KAAK,SAAS;AACnC,QAAI;AAEF,WAAM,QAAQ,KAAK,CACjB,OAAO,MAAM,WAAW,EACxB,IAAI,SAAS,GAAG,WAAW,iBAAiB,OAAO,IAAI,MAAM,gBAAgB,CAAC,EAAE,IAAK,CAAC,CACvF,CAAC;AACF,aAAQ,IAAI,8CAA8C;AAC1D,kBAAa;cACL;AACR,YAAO,SAAS;;YAEX,YAAY;AACnB,YAAQ,MAAM,8BAA8B,WAAW,WAAW,WAAW;AAC7E,UAAM,MAAM,MAAO,MAAM,aAAa,GAAG;aACjC;AACR,iBAAa;;SAEV;AACL,WAAQ,MAAM,6DAA6D;AAC3E,QAAK,KAAK,qBAAqB,IAAI;;;CAIvC,MAAM,iBAAiB,WAA0B;AAE/C,MAAI,CAAC,oBAAoB,IAAI,OAAO,EAAE;AACpC,uBAAoB,IAAI,OAAO;AAC/B,UAAO,GAAG,UAAU,QAAe;AACjC,YAAQ,MAAM,oCAAoC,IAAI;KACtD;;AAEJ,eAAa;AACb,eAAa;;AAGf,MAAK,GAAG,SAAS,gBAAgB;AACjC,MAAK,GAAG,WAAW,cAAc;;;;;;;;;;;;;;;;;;;;;;AAuBnC,SAAgB,mBAAmB,aAAqB;AACtD,KAAI,CAAC,aAAa,MAAM,EAAE;AACxB,QAAM,IAAI,MAAM,2BAA2B;;AAG7C,KAAI,CAACA,4CAAc;AACjB,QAAM,IAAI,MAAM,wDAAwD;;CAG1E,MAAM,OAAO,IAAI,WAAG,KAAK;EACvB,kBAAkB;EAClB,KAAK;EACL,mBAAmB;EACnB,yBAAyB;EACzB,oBAAoB;EACrB,CAAC;AAEF,oBAAmB,KAAK;AAExB,QAAO"}