@js-ak/db-manager
Version:
72 lines (71 loc) • 2.8 kB
JavaScript
;
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);
},
};
}
}