UNPKG

@js-ak/db-manager

Version:
72 lines (71 loc) 2.8 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.setStreamExecutor = setStreamExecutor; const node_crypto_1 = require("node:crypto"); const pg_query_stream_1 = __importDefault(require("pg-query-stream")); const pg_1 = __importDefault(require("pg")); async function runStreamQuery(executor, streamQuery) { if (executor instanceof pg_1.default.Pool) { const client = await executor.connect(); const stream = client.query(streamQuery); stream.once("end", () => client.release()); stream.once("error", () => client.release()); return stream; } else { return executor.query(streamQuery); } } async function streamQueryLogged(query, values, config) { const queryId = (0, node_crypto_1.randomUUID)(); const start = performance.now(); const streamQuery = new pg_query_stream_1.default(query, values, config); let stream; this.logger.info(`[${queryId}] Stream query started. QUERY: ${query} VALUES: ${JSON.stringify(values)}`); try { stream = await runStreamQuery(this.client, streamQuery); } catch (error) { const execTime = Math.round(performance.now() - start); this.logger.error(`[${queryId}] Stream query failed during start in ${execTime} ms. ERROR: ${error.message}`); throw error; } let ended = false; const finalize = (level, message) => { if (ended) return; ended = true; const execTime = Math.round(performance.now() - start); this.logger[level](`[${queryId}] ${message} in ${execTime} ms.`); }; stream.once("end", () => finalize("info", "Stream query finished")); stream.once("error", (err) => { finalize("error", `Stream query failed with error: ${err.message}`); if (!stream.destroyed) stream.destroy(err); }); return stream; } function setStreamExecutor(executor, options) { const { isLoggerEnabled, logger } = options || {}; if (isLoggerEnabled) { // eslint-disable-next-line no-console const resultLogger = logger || { error: console.error, info: console.log }; return { executeSqlStream: async (sql, config) => { return streamQueryLogged.bind({ client: executor, logger: resultLogger })(sql.query, sql.values, config); }, }; } else { return { executeSqlStream: async (sql, config) => { const streamQuery = new pg_query_stream_1.default(sql.query, sql.values, config); return runStreamQuery(executor, streamQuery); }, }; } }