emilsoftware-utilities 2.0.0-dev.65 → 2.0.0-dev.66
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/README.MD +28 -1
- package/dist/Orm.d.ts +1 -1
- package/dist/Orm.js +4 -23
- package/dist/Orm.js.map +1 -1
- package/dist/Utilities.js +1 -0
- package/dist/Utilities.js.map +1 -1
- package/dist/emilsoftware-utilities-2.0.0-dev.66.tgz +0 -0
- package/dist/firebird-compat.d.ts +27 -0
- package/dist/firebird-compat.js +52 -2
- package/dist/firebird-compat.js.map +1 -1
- package/package.json +2 -2
- package/dist/emilsoftware-utilities-2.0.0-dev.65.tgz +0 -0
package/README.MD
CHANGED
|
@@ -115,6 +115,33 @@ La CI (`.github/workflows/ci.yml`) esegue typecheck, test con coverage e build,
|
|
|
115
115
|
integration test in matrice su Firebird 5 e 3. Il workflow di release (`publish.yml`) esegue
|
|
116
116
|
typecheck e test prima di build e pubblicazione.
|
|
117
117
|
|
|
118
|
+
## Firebird: drop-in di `es-node-firebird`
|
|
119
|
+
|
|
120
|
+
La libreria **ri-esporta l'intera API di `node-firebird`** (`export * from "node-firebird"` piu il
|
|
121
|
+
namespace `Firebird`), quindi sostituisce il fork deprecato `es-node-firebird` senza modifiche al
|
|
122
|
+
codice applicativo: basta cambiare l'import.
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
// prima
|
|
126
|
+
import * as Firebird from 'es-node-firebird';
|
|
127
|
+
// dopo
|
|
128
|
+
import { Firebird } from 'emilsoftware-utilities';
|
|
129
|
+
// oppure, con import nominati
|
|
130
|
+
import { attach, create, pool, ISOLATION_READ_COMMITTED } from 'emilsoftware-utilities';
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
I comportamenti storici del fork sono riprodotti da un **layer di compatibilita esterno**
|
|
134
|
+
(`src/firebird-compat.ts`), senza toccare il driver ufficiale:
|
|
135
|
+
|
|
136
|
+
- **Date come UTC** (`utcDates`, default `true`): `DATE`/`TIME`/`TIMESTAMP` vengono reinterpretati
|
|
137
|
+
come UTC, come faceva il fork con `setUTCMilliseconds`. Con `utcDates: false` restano in ora locale.
|
|
138
|
+
- **Trim dei campi testo** (`trimStringResults`, default `true`): le stringhe vengono trimmate come
|
|
139
|
+
il fork (`.trim()`). Con `trimStringResults: false` restano intatte.
|
|
140
|
+
- **Compatibilita wire/auth** (`wireCrypt`, `pluginName`): normalizzazione dei valori e diagnostica
|
|
141
|
+
arricchita sugli errori di connessione.
|
|
142
|
+
|
|
143
|
+
Le opzioni si passano in `databaseOptions` (vedi `FirebirdOptions` in `src/firebird-compat.ts`).
|
|
144
|
+
|
|
118
145
|
## Service token (macchina-a-macchina)
|
|
119
146
|
|
|
120
147
|
Credenziali di servizio per chiamate tecniche, **non legate a un utente** e senza login giornaliero.
|
|
@@ -177,7 +204,7 @@ Tutta la configurazione e riservata al backend: segreti JWT/SMTP/DB non devono m
|
|
|
177
204
|
|
|
178
205
|
| Campo | Tipo | Note |
|
|
179
206
|
| --- | --- | --- |
|
|
180
|
-
| `databaseOptions` | `Options` | Connessione Firebird (`DatabaseUtilities.createOption`). Supporta `logQueryParameters`, `poolSize`, `wireCrypt`, `pluginName`. |
|
|
207
|
+
| `databaseOptions` | `Options` | Connessione Firebird (`DatabaseUtilities.createOption`). Supporta `logQueryParameters`, `poolSize`, `wireCrypt`, `pluginName`, `utcDates`, `trimStringResults`. |
|
|
181
208
|
| `confirmationEmailUrl` / `confirmationEmailReturnUrl` | `string` | URL per le email di reset. |
|
|
182
209
|
| `customResetPage` / `confirmationEmailPrefix` | `string?` | Pagina di reset personalizzata. |
|
|
183
210
|
| `encryptionKey` | `string` | Solo compatibilita/migrazione password legacy cifrate. |
|
package/dist/Orm.d.ts
CHANGED
|
@@ -22,7 +22,7 @@ export declare class Orm {
|
|
|
22
22
|
private static createTimeoutError;
|
|
23
23
|
private static detachQuietly;
|
|
24
24
|
private static shouldTrimStringResults;
|
|
25
|
-
private static
|
|
25
|
+
private static shouldConvertDatesToUtc;
|
|
26
26
|
private static attachWithTimeout;
|
|
27
27
|
static testConnection(options: Options): Promise<boolean>;
|
|
28
28
|
static query<T = Row>(options: Options, query: string, parameters?: QueryParams, logQuery?: boolean): Promise<T[]>;
|
package/dist/Orm.js
CHANGED
|
@@ -144,27 +144,8 @@ class Orm {
|
|
|
144
144
|
static shouldTrimStringResults(options) {
|
|
145
145
|
return options.trimStringResults !== false;
|
|
146
146
|
}
|
|
147
|
-
static
|
|
148
|
-
|
|
149
|
-
return value;
|
|
150
|
-
}
|
|
151
|
-
if (typeof value === "string" || value instanceof String) {
|
|
152
|
-
return String(value).trimEnd();
|
|
153
|
-
}
|
|
154
|
-
if (Array.isArray(value)) {
|
|
155
|
-
return value.map((item) => this.normalizeResultValue(item, trimStringResults));
|
|
156
|
-
}
|
|
157
|
-
if (value instanceof Date || Buffer.isBuffer(value)) {
|
|
158
|
-
return value;
|
|
159
|
-
}
|
|
160
|
-
if (typeof value === "object") {
|
|
161
|
-
const source = value;
|
|
162
|
-
return Object.keys(source).reduce((normalized, key) => {
|
|
163
|
-
normalized[key] = this.normalizeResultValue(source[key], trimStringResults);
|
|
164
|
-
return normalized;
|
|
165
|
-
}, {});
|
|
166
|
-
}
|
|
167
|
-
return value;
|
|
147
|
+
static shouldConvertDatesToUtc(options) {
|
|
148
|
+
return options.utcDates !== false;
|
|
168
149
|
}
|
|
169
150
|
static attachWithTimeout(options) {
|
|
170
151
|
return new Promise((resolve, reject) => {
|
|
@@ -256,7 +237,7 @@ class Orm {
|
|
|
256
237
|
if (error) {
|
|
257
238
|
return reject((0, firebird_compat_1.enhanceFirebirdError)(error, normalizedOptions, { stage: "query", sql: query }));
|
|
258
239
|
}
|
|
259
|
-
return resolve(
|
|
240
|
+
return resolve((0, firebird_compat_1.normalizeFirebirdResult)(result, this.shouldTrimStringResults(normalizedOptions), this.shouldConvertDatesToUtc(normalizedOptions)));
|
|
260
241
|
}));
|
|
261
242
|
});
|
|
262
243
|
}
|
|
@@ -297,7 +278,7 @@ class Orm {
|
|
|
297
278
|
if (error) {
|
|
298
279
|
return reject((0, firebird_compat_1.enhanceFirebirdError)(error, normalizedOptions, { stage: "execute", sql: query }));
|
|
299
280
|
}
|
|
300
|
-
return resolve(
|
|
281
|
+
return resolve((0, firebird_compat_1.normalizeFirebirdResult)(result, this.shouldTrimStringResults(normalizedOptions), this.shouldConvertDatesToUtc(normalizedOptions)));
|
|
301
282
|
}));
|
|
302
283
|
});
|
|
303
284
|
}
|
package/dist/Orm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Orm.js","sourceRoot":"","sources":["../src/Orm.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Firebird from \"node-firebird\";\nimport { ConnectionPool, Database, Options, QueryParams, Transaction } from \"node-firebird\";\nimport { Logger } from \"./Logger\";\nimport { RestUtilities } from \"./Utilities\";\nimport {\n describeFirebirdCompatibilityOptions,\n enhanceFirebirdError,\n FirebirdOptions,\n normalizeFirebirdOptions,\n} from \"./firebird-compat\";\n\n/** Valore scalare di una colonna Firebird (riga flat). */\nexport type DbValue = string | number | boolean | Date | Buffer | null | undefined;\n\n/** Riga generica restituita da `Orm.query`/`Orm.execute` quando non si specifica un tipo. */\nexport type Row = Record<string, DbValue>;\n\nexport class Orm {\n private static logger: Logger = new Logger(Orm.name);\n private static pools: Map<string, ConnectionPool> = new Map();\n\n public static quote(value: string): string {\n return \"\\\"\" + value + \"\\\"\";\n }\n\n /** Dimensione pool: default 5 (pool attivo); `poolSize: 0` disabilita e torna all'attach per query. */\n private static getPoolSize(options: Options): number {\n const raw = (options as FirebirdOptions).poolSize;\n if (raw === 0) {\n return 0;\n }\n const size = raw === undefined ? 5 : Number(raw);\n return Number.isFinite(size) && size > 0 ? Math.trunc(size) : 0;\n }\n\n private static shouldLogQueryParameters(options: Options): boolean {\n return (options as FirebirdOptions).logQueryParameters === true;\n }\n\n private static formatQueryForLog(query: string, parameters: QueryParams, includeValues: boolean): string {\n const parameterList = Array.isArray(parameters) ? parameters : Object.values(parameters ?? {});\n if (includeValues) {\n return RestUtilities.printQueryWithParams(query, parameterList);\n }\n return `${query.replace(/\\s+/g, \" \").trim()} [params=${parameterList.length}]`;\n }\n\n private static buildPoolKey(options: Options, size: number): string {\n const normalized = normalizeFirebirdOptions(options);\n return [\n size,\n normalized.host ?? \"\",\n normalized.port ?? \"\",\n normalized.database ?? \"\",\n normalized.user ?? \"\",\n normalized.pluginName ?? \"\",\n String(normalized.wireCrypt ?? \"\"),\n ].join(\"|\");\n }\n\n /**\n * Chiude tutti i pool creati (opt-in `poolSize`). Utile a fine processo o nei test,\n * perché i pool mantengono connessioni e timer attivi.\n */\n public static async closePools(): Promise<void> {\n const pools = Array.from(this.pools.values());\n this.pools.clear();\n await Promise.all(pools.map((pool) => new Promise<void>((resolve) => {\n try {\n pool.destroy(() => resolve());\n } catch {\n resolve();\n }\n })));\n }\n\n private static getPool(options: Options, size: number): ConnectionPool {\n const normalized = normalizeFirebirdOptions(options);\n const key = this.buildPoolKey(normalized, size);\n let pool = this.pools.get(key);\n if (!pool) {\n this.logger.info(`Firebird pool created (max=${size}) using ${describeFirebirdCompatibilityOptions(normalized)}`);\n pool = Firebird.pool(size, normalized);\n pool.on(\"error\", (error: Error) => {\n this.logger.error(`Firebird pool error: ${error.message}`);\n });\n this.pools.set(key, pool);\n }\n return pool;\n }\n\n private static getTimeoutMs(options: Options): number {\n const candidate = (options as FirebirdOptions).connectTimeout ?? 15000;\n return Number.isFinite(candidate) && candidate > 0 ? Math.trunc(candidate) : 15000;\n }\n\n private static createTimeoutError(stage: string, timeoutMs: number, options: Options, query?: string): Error {\n const target = `${options.host ?? \"?\"}:${options.port ?? \"?\"} -> ${options.database ?? \"?\"}`;\n const suffix = query ? ` | sql=${query.replace(/\\s+/g, \" \").trim()}` : \"\";\n return new Error(`Timeout during Firebird ${stage} after ${timeoutMs} ms on ${target}${suffix}`);\n }\n\n private static async detachQuietly(db: Database | undefined): Promise<void> {\n if (!db) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n try {\n db.detach(() => resolve());\n } catch {\n resolve();\n }\n });\n }\n\n private static shouldTrimStringResults(options: FirebirdOptions): boolean {\n return options.trimStringResults !== false;\n }\n\n private static normalizeResultValue(value: unknown, trimStringResults: boolean): unknown {\n if (!trimStringResults || value === undefined || value === null) {\n return value;\n }\n\n if (typeof value === \"string\" || value instanceof String) {\n return String(value).trimEnd();\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => this.normalizeResultValue(item, trimStringResults));\n }\n\n if (value instanceof Date || Buffer.isBuffer(value)) {\n return value;\n }\n\n if (typeof value === \"object\") {\n const source = value as Record<string, unknown>;\n return Object.keys(source).reduce((normalized: Record<string, unknown>, key: string) => {\n normalized[key] = this.normalizeResultValue(source[key], trimStringResults);\n return normalized;\n }, {});\n }\n\n return value;\n }\n\n private static attachWithTimeout(options: Options): Promise<Database> {\n return new Promise((resolve, reject): void => {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n const poolSize = this.getPoolSize(options);\n let settled = false;\n const timeoutId = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"attach\", timeoutMs, normalizedOptions),\n normalizedOptions,\n { stage: \"attach\" },\n ),\n );\n }, timeoutMs);\n\n const handle = async (err: unknown, db: Database): Promise<void> => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n\n if (err) {\n return reject(enhanceFirebirdError(err, normalizedOptions, { stage: \"attach\" }));\n }\n\n return resolve(db);\n };\n\n try {\n if (poolSize > 0) {\n this.getPool(options, poolSize).get(handle);\n return;\n }\n\n this.logger.info(`Firebird attach using ${describeFirebirdCompatibilityOptions(normalizedOptions)}`);\n\n Firebird.attach(normalizedOptions, handle);\n } catch (error) {\n // Attach/get sincrono fallito: evita di lasciare il timer di timeout pendente.\n if (!settled) {\n settled = true;\n clearTimeout(timeoutId);\n reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"attach\" }));\n }\n }\n });\n }\n\n public static async testConnection(options: Options): Promise<boolean> {\n return new Promise((resolve): void => {\n this.attachWithTimeout(options)\n .then(async (db: Database): Promise<void> => {\n this.logger.info(\"DATABASE connesso.\");\n await this.detachQuietly(db);\n resolve(true);\n })\n .catch((err: Error): void => {\n this.logger.error(\"La connessione con il DATABASE non e andata a buon fine.\");\n this.logger.error(err);\n resolve(false);\n });\n });\n }\n\n public static async query<T = Row>(\n options: Options,\n query: string,\n parameters: QueryParams = [],\n logQuery = true,\n ): Promise<T[]> {\n try {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const db = await this.attachWithTimeout(options);\n\n return await new Promise<T[]>((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n let settled = false;\n const timeoutId = setTimeout(async () => {\n if (settled) {\n return;\n }\n\n settled = true;\n await this.detachQuietly(db);\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"query\", timeoutMs, normalizedOptions, query),\n normalizedOptions,\n { stage: \"query\", sql: query },\n ),\n );\n }, timeoutMs);\n\n if (logQuery) {\n this.logger.info(this.formatQueryForLog(query, parameters, this.shouldLogQueryParameters(options)));\n }\n\n db.query<unknown>(query, parameters, async (error: unknown, result: unknown[]) => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n await this.detachQuietly(db);\n\n if (error) {\n return reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"query\", sql: query }));\n }\n\n return resolve(this.normalizeResultValue(result, this.shouldTrimStringResults(normalizedOptions)) as T[]);\n });\n });\n } catch (error) {\n const normalizedError = enhanceFirebirdError(error, options, { stage: \"query\", sql: query });\n this.logger.error(normalizedError);\n throw normalizedError;\n }\n }\n\n public static async execute<T = Row>(\n options: Options,\n query: string,\n parameters: QueryParams = [],\n logQuery = true,\n ): Promise<T[]> {\n try {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const db = await this.attachWithTimeout(options);\n\n return await new Promise<T[]>((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n let settled = false;\n const timeoutId = setTimeout(async () => {\n if (settled) {\n return;\n }\n\n settled = true;\n await this.detachQuietly(db);\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"execute\", timeoutMs, normalizedOptions, query),\n normalizedOptions,\n { stage: \"execute\", sql: query },\n ),\n );\n }, timeoutMs);\n\n if (logQuery) {\n this.logger.info(this.formatQueryForLog(query, parameters, this.shouldLogQueryParameters(options)));\n }\n\n db.execute<unknown>(query, parameters, async (error: unknown, result: unknown[]) => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n await this.detachQuietly(db);\n\n if (error) {\n return reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"execute\", sql: query }));\n }\n\n return resolve(this.normalizeResultValue(result, this.shouldTrimStringResults(normalizedOptions)) as T[]);\n });\n });\n } catch (error) {\n const normalizedError = enhanceFirebirdError(error, options, { stage: \"execute\", sql: query });\n this.logger.error(normalizedError);\n throw normalizedError;\n }\n }\n\n public static trimParam<T>(param: T): string | T {\n if (typeof param === \"string\" || param instanceof String) {\n return String(param).trim();\n }\n return param;\n }\n\n public static async connect(options: Options): Promise<Database> {\n return this.attachWithTimeout(options);\n }\n\n /**\n * Runs `operation` inside a single Firebird transaction: commit on success,\n * rollback on failure, detach in every case. Use it to make multi-statement\n * writes atomic instead of relying on auto-commit per statement.\n */\n public static async withTransaction<T>(\n options: Options,\n operation: (transaction: Transaction) => Promise<T>,\n ): Promise<T> {\n const db = await this.connect(options);\n let transaction: Transaction | undefined;\n\n try {\n transaction = await this.startTransaction(db);\n const result = await operation(transaction);\n await this.commitTransaction(transaction);\n return result;\n } catch (error) {\n if (transaction) {\n try {\n await this.rollbackTransaction(transaction);\n } catch {\n // Se la rollback fallisce (connessione persa) l'errore originale resta quello rilevante.\n }\n }\n throw error;\n } finally {\n await this.detachQuietly(db);\n }\n }\n\n /** Esegue una query su una transazione esistente e ne restituisce il risultato. */\n public static transactionQuery<T = Row[]>(\n transaction: Transaction,\n query: string,\n parameters: QueryParams = [],\n ): Promise<T> {\n return new Promise<T>((resolve, reject): void => {\n transaction.query(query, parameters, (error: unknown, result: unknown[]): void => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve(result as T);\n });\n });\n }\n\n public static async startTransaction(db: Database): Promise<Transaction> {\n return new Promise((resolve, reject): void => {\n db.transaction(Firebird.ISOLATION_READ_COMMITTED, function (err: unknown, transaction: Transaction): void {\n if (err) {\n return reject(err);\n }\n\n return resolve(transaction);\n });\n });\n }\n\n public static async commitTransaction(transaction: Transaction): Promise<string> {\n return new Promise((resolve, reject): void => {\n transaction.commit((err: unknown): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(\"Transaction committed successfully.\");\n });\n });\n }\n\n public static async rollbackTransaction(transaction: Transaction): Promise<string> {\n return new Promise((resolve, reject): void => {\n transaction.rollback((err: unknown): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(\"Transaction rolled back successfully.\");\n });\n });\n }\n\n public static async executeMultiple(options: Options, queriesWithParams: { query: string, params: QueryParams }[]): Promise<string> {\n await Orm.withTransaction(options, async (transaction) => {\n for (const qwp of queriesWithParams) {\n await Orm.transactionQuery(transaction, qwp.query, qwp.params);\n }\n });\n\n return \"OK\";\n }\n\n public static async executeQueries(transaction: Transaction, queries: string[], params: QueryParams[]): Promise<unknown> {\n try {\n return await queries.reduce((promiseChain: Promise<unknown>, currentQuery: string, index: number) => {\n return promiseChain.then(() => new Promise((resolve, reject) => {\n transaction.query(currentQuery, params[index] ?? [], (err: unknown, result: unknown[]): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(result);\n });\n }));\n }, Promise.resolve());\n } catch (error) {\n return await new Promise((_resolve, reject) => {\n transaction.rollback((rollbackErr: unknown): void => {\n if (rollbackErr) {\n return reject(rollbackErr);\n }\n\n return reject(error);\n });\n });\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Orm.js","sourceRoot":"","sources":["../src/Orm.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Firebird from \"node-firebird\";\nimport { ConnectionPool, Database, Options, QueryParams, Transaction } from \"node-firebird\";\nimport { Logger } from \"./Logger\";\nimport { RestUtilities } from \"./Utilities\";\nimport {\n describeFirebirdCompatibilityOptions,\n enhanceFirebirdError,\n FirebirdOptions,\n normalizeFirebirdOptions,\n normalizeFirebirdResult,\n} from \"./firebird-compat\";\n\n/** Valore scalare di una colonna Firebird (riga flat). */\nexport type DbValue = string | number | boolean | Date | Buffer | null | undefined;\n\n/** Riga generica restituita da `Orm.query`/`Orm.execute` quando non si specifica un tipo. */\nexport type Row = Record<string, DbValue>;\n\nexport class Orm {\n private static logger: Logger = new Logger(Orm.name);\n private static pools: Map<string, ConnectionPool> = new Map();\n\n public static quote(value: string): string {\n return \"\\\"\" + value + \"\\\"\";\n }\n\n /** Dimensione pool: default 5 (pool attivo); `poolSize: 0` disabilita e torna all'attach per query. */\n private static getPoolSize(options: Options): number {\n const raw = (options as FirebirdOptions).poolSize;\n if (raw === 0) {\n return 0;\n }\n const size = raw === undefined ? 5 : Number(raw);\n return Number.isFinite(size) && size > 0 ? Math.trunc(size) : 0;\n }\n\n private static shouldLogQueryParameters(options: Options): boolean {\n return (options as FirebirdOptions).logQueryParameters === true;\n }\n\n private static formatQueryForLog(query: string, parameters: QueryParams, includeValues: boolean): string {\n const parameterList = Array.isArray(parameters) ? parameters : Object.values(parameters ?? {});\n if (includeValues) {\n return RestUtilities.printQueryWithParams(query, parameterList);\n }\n return `${query.replace(/\\s+/g, \" \").trim()} [params=${parameterList.length}]`;\n }\n\n private static buildPoolKey(options: Options, size: number): string {\n const normalized = normalizeFirebirdOptions(options);\n return [\n size,\n normalized.host ?? \"\",\n normalized.port ?? \"\",\n normalized.database ?? \"\",\n normalized.user ?? \"\",\n normalized.pluginName ?? \"\",\n String(normalized.wireCrypt ?? \"\"),\n ].join(\"|\");\n }\n\n /**\n * Chiude tutti i pool creati (opt-in `poolSize`). Utile a fine processo o nei test,\n * perché i pool mantengono connessioni e timer attivi.\n */\n public static async closePools(): Promise<void> {\n const pools = Array.from(this.pools.values());\n this.pools.clear();\n await Promise.all(pools.map((pool) => new Promise<void>((resolve) => {\n try {\n pool.destroy(() => resolve());\n } catch {\n resolve();\n }\n })));\n }\n\n private static getPool(options: Options, size: number): ConnectionPool {\n const normalized = normalizeFirebirdOptions(options);\n const key = this.buildPoolKey(normalized, size);\n let pool = this.pools.get(key);\n if (!pool) {\n this.logger.info(`Firebird pool created (max=${size}) using ${describeFirebirdCompatibilityOptions(normalized)}`);\n pool = Firebird.pool(size, normalized);\n pool.on(\"error\", (error: Error) => {\n this.logger.error(`Firebird pool error: ${error.message}`);\n });\n this.pools.set(key, pool);\n }\n return pool;\n }\n\n private static getTimeoutMs(options: Options): number {\n const candidate = (options as FirebirdOptions).connectTimeout ?? 15000;\n return Number.isFinite(candidate) && candidate > 0 ? Math.trunc(candidate) : 15000;\n }\n\n private static createTimeoutError(stage: string, timeoutMs: number, options: Options, query?: string): Error {\n const target = `${options.host ?? \"?\"}:${options.port ?? \"?\"} -> ${options.database ?? \"?\"}`;\n const suffix = query ? ` | sql=${query.replace(/\\s+/g, \" \").trim()}` : \"\";\n return new Error(`Timeout during Firebird ${stage} after ${timeoutMs} ms on ${target}${suffix}`);\n }\n\n private static async detachQuietly(db: Database | undefined): Promise<void> {\n if (!db) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n try {\n db.detach(() => resolve());\n } catch {\n resolve();\n }\n });\n }\n\n private static shouldTrimStringResults(options: FirebirdOptions): boolean {\n return options.trimStringResults !== false;\n }\n\n private static shouldConvertDatesToUtc(options: FirebirdOptions): boolean {\n return options.utcDates !== false;\n }\n\n private static attachWithTimeout(options: Options): Promise<Database> {\n return new Promise((resolve, reject): void => {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n const poolSize = this.getPoolSize(options);\n let settled = false;\n const timeoutId = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"attach\", timeoutMs, normalizedOptions),\n normalizedOptions,\n { stage: \"attach\" },\n ),\n );\n }, timeoutMs);\n\n const handle = async (err: unknown, db: Database): Promise<void> => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n\n if (err) {\n return reject(enhanceFirebirdError(err, normalizedOptions, { stage: \"attach\" }));\n }\n\n return resolve(db);\n };\n\n try {\n if (poolSize > 0) {\n this.getPool(options, poolSize).get(handle);\n return;\n }\n\n this.logger.info(`Firebird attach using ${describeFirebirdCompatibilityOptions(normalizedOptions)}`);\n\n Firebird.attach(normalizedOptions, handle);\n } catch (error) {\n // Attach/get sincrono fallito: evita di lasciare il timer di timeout pendente.\n if (!settled) {\n settled = true;\n clearTimeout(timeoutId);\n reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"attach\" }));\n }\n }\n });\n }\n\n public static async testConnection(options: Options): Promise<boolean> {\n return new Promise((resolve): void => {\n this.attachWithTimeout(options)\n .then(async (db: Database): Promise<void> => {\n this.logger.info(\"DATABASE connesso.\");\n await this.detachQuietly(db);\n resolve(true);\n })\n .catch((err: Error): void => {\n this.logger.error(\"La connessione con il DATABASE non e andata a buon fine.\");\n this.logger.error(err);\n resolve(false);\n });\n });\n }\n\n public static async query<T = Row>(\n options: Options,\n query: string,\n parameters: QueryParams = [],\n logQuery = true,\n ): Promise<T[]> {\n try {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const db = await this.attachWithTimeout(options);\n\n return await new Promise<T[]>((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n let settled = false;\n const timeoutId = setTimeout(async () => {\n if (settled) {\n return;\n }\n\n settled = true;\n await this.detachQuietly(db);\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"query\", timeoutMs, normalizedOptions, query),\n normalizedOptions,\n { stage: \"query\", sql: query },\n ),\n );\n }, timeoutMs);\n\n if (logQuery) {\n this.logger.info(this.formatQueryForLog(query, parameters, this.shouldLogQueryParameters(options)));\n }\n\n db.query<unknown>(query, parameters, async (error: unknown, result: unknown[]) => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n await this.detachQuietly(db);\n\n if (error) {\n return reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"query\", sql: query }));\n }\n\n return resolve(normalizeFirebirdResult(result, this.shouldTrimStringResults(normalizedOptions), this.shouldConvertDatesToUtc(normalizedOptions)) as T[]);\n });\n });\n } catch (error) {\n const normalizedError = enhanceFirebirdError(error, options, { stage: \"query\", sql: query });\n this.logger.error(normalizedError);\n throw normalizedError;\n }\n }\n\n public static async execute<T = Row>(\n options: Options,\n query: string,\n parameters: QueryParams = [],\n logQuery = true,\n ): Promise<T[]> {\n try {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const db = await this.attachWithTimeout(options);\n\n return await new Promise<T[]>((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(normalizedOptions);\n let settled = false;\n const timeoutId = setTimeout(async () => {\n if (settled) {\n return;\n }\n\n settled = true;\n await this.detachQuietly(db);\n reject(\n enhanceFirebirdError(\n this.createTimeoutError(\"execute\", timeoutMs, normalizedOptions, query),\n normalizedOptions,\n { stage: \"execute\", sql: query },\n ),\n );\n }, timeoutMs);\n\n if (logQuery) {\n this.logger.info(this.formatQueryForLog(query, parameters, this.shouldLogQueryParameters(options)));\n }\n\n db.execute<unknown>(query, parameters, async (error: unknown, result: unknown[]) => {\n if (settled) {\n await this.detachQuietly(db);\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n await this.detachQuietly(db);\n\n if (error) {\n return reject(enhanceFirebirdError(error, normalizedOptions, { stage: \"execute\", sql: query }));\n }\n\n return resolve(normalizeFirebirdResult(result, this.shouldTrimStringResults(normalizedOptions), this.shouldConvertDatesToUtc(normalizedOptions)) as T[]);\n });\n });\n } catch (error) {\n const normalizedError = enhanceFirebirdError(error, options, { stage: \"execute\", sql: query });\n this.logger.error(normalizedError);\n throw normalizedError;\n }\n }\n\n public static trimParam<T>(param: T): string | T {\n if (typeof param === \"string\" || param instanceof String) {\n return String(param).trim();\n }\n return param;\n }\n\n public static async connect(options: Options): Promise<Database> {\n return this.attachWithTimeout(options);\n }\n\n /**\n * Runs `operation` inside a single Firebird transaction: commit on success,\n * rollback on failure, detach in every case. Use it to make multi-statement\n * writes atomic instead of relying on auto-commit per statement.\n */\n public static async withTransaction<T>(\n options: Options,\n operation: (transaction: Transaction) => Promise<T>,\n ): Promise<T> {\n const db = await this.connect(options);\n let transaction: Transaction | undefined;\n\n try {\n transaction = await this.startTransaction(db);\n const result = await operation(transaction);\n await this.commitTransaction(transaction);\n return result;\n } catch (error) {\n if (transaction) {\n try {\n await this.rollbackTransaction(transaction);\n } catch {\n // Se la rollback fallisce (connessione persa) l'errore originale resta quello rilevante.\n }\n }\n throw error;\n } finally {\n await this.detachQuietly(db);\n }\n }\n\n /** Esegue una query su una transazione esistente e ne restituisce il risultato. */\n public static transactionQuery<T = Row[]>(\n transaction: Transaction,\n query: string,\n parameters: QueryParams = [],\n ): Promise<T> {\n return new Promise<T>((resolve, reject): void => {\n transaction.query(query, parameters, (error: unknown, result: unknown[]): void => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve(result as T);\n });\n });\n }\n\n public static async startTransaction(db: Database): Promise<Transaction> {\n return new Promise((resolve, reject): void => {\n db.transaction(Firebird.ISOLATION_READ_COMMITTED, function (err: unknown, transaction: Transaction): void {\n if (err) {\n return reject(err);\n }\n\n return resolve(transaction);\n });\n });\n }\n\n public static async commitTransaction(transaction: Transaction): Promise<string> {\n return new Promise((resolve, reject): void => {\n transaction.commit((err: unknown): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(\"Transaction committed successfully.\");\n });\n });\n }\n\n public static async rollbackTransaction(transaction: Transaction): Promise<string> {\n return new Promise((resolve, reject): void => {\n transaction.rollback((err: unknown): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(\"Transaction rolled back successfully.\");\n });\n });\n }\n\n public static async executeMultiple(options: Options, queriesWithParams: { query: string, params: QueryParams }[]): Promise<string> {\n await Orm.withTransaction(options, async (transaction) => {\n for (const qwp of queriesWithParams) {\n await Orm.transactionQuery(transaction, qwp.query, qwp.params);\n }\n });\n\n return \"OK\";\n }\n\n public static async executeQueries(transaction: Transaction, queries: string[], params: QueryParams[]): Promise<unknown> {\n try {\n return await queries.reduce((promiseChain: Promise<unknown>, currentQuery: string, index: number) => {\n return promiseChain.then(() => new Promise((resolve, reject) => {\n transaction.query(currentQuery, params[index] ?? [], (err: unknown, result: unknown[]): void => {\n if (err) {\n return reject(err);\n }\n\n return resolve(result);\n });\n }));\n }, Promise.resolve());\n } catch (error) {\n return await new Promise((_resolve, reject) => {\n transaction.rollback((rollbackErr: unknown): void => {\n if (rollbackErr) {\n return reject(rollbackErr);\n }\n\n return reject(error);\n });\n });\n }\n }\n}\n"]}
|
package/dist/Utilities.js
CHANGED
package/dist/Utilities.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Utilities.js","sourceRoot":"","sources":["../src/Utilities.ts"],"names":[],"mappings":"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","sourcesContent":["import { Response } from 'express';\nimport { FirebirdOptions } from \"./firebird-compat\";\nimport { Logger } from \"./Logger\";\nimport crypto from \"crypto\";\n\n\nexport enum StatusCode {\n Ok = 0,\n Warning = 1,\n Error = 2,\n}\n\nexport class DateUtilities {\n /**\n * Pads a number with leading zeros to reach a specified length.\n * @param num - The number to pad.\n * @param totalLength - The total length of the resulting string.\n * @returns The padded string.\n */\n static addStartingZeros(num: number, totalLength: number): string {\n return String(num).padStart(totalLength, '0');\n }\n\n /**\n * Formats a Date object as a Moncler-style string.\n * @param dData - The date to format.\n * @param bAddMs - Whether to include milliseconds.\n * @returns The formatted date string.\n */\n static dateToMoncler(dData: Date, bAddMs: boolean = false): string {\n const yy = dData.getFullYear();\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\n const dd = this.addStartingZeros(dData.getDate(), 2);\n const hh = this.addStartingZeros(dData.getHours(), 2);\n const nn = this.addStartingZeros(dData.getMinutes(), 2);\n const ss = this.addStartingZeros(dData.getSeconds(), 2);\n const ms = this.addStartingZeros(dData.getMilliseconds(), 3);\n return bAddMs ? `${yy}${mm}${dd}${hh}${nn}${ss}${ms}` : `${yy}${mm}${dd}${hh}${nn}${ss}`;\n }\n\n /**\n * Formats a Date object as a SQL-style string.\n * @param dData - The date to format.\n * @param bAddMs - Whether to include milliseconds.\n * @returns The formatted date string.\n */\n static dateToSql(dData: Date, bAddMs: boolean = false): string {\n const yy = dData.getFullYear();\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\n const dd = this.addStartingZeros(dData.getDate(), 2);\n const hh = this.addStartingZeros(dData.getHours(), 2);\n const nn = this.addStartingZeros(dData.getMinutes(), 2);\n const ss = this.addStartingZeros(dData.getSeconds(), 2);\n const ms = this.addStartingZeros(dData.getMilliseconds(), 3);\n return bAddMs\n ? `${yy}-${mm}-${dd} ${hh}:${nn}:${ss}.${ms}`\n : `${yy}-${mm}-${dd} ${hh}:${nn}:${ss}`;\n }\n\n /**\n * Formats a Date object as a simple string (dd-MM-yyyy).\n * @param dData - The date to format.\n * @returns The formatted date string.\n */\n static dateToSimple(dData: Date): string {\n const yy = dData.getFullYear();\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\n const dd = this.addStartingZeros(dData.getDate(), 2);\n return `${dd}-${mm}-${yy}`;\n }\n\n /**\n * Gets the current date and time as a formatted string.\n * @returns The current date and time in the format dd.MM.yyyy HH:mm:ss.\n */\n static getNowDateString(): string {\n const now: Date = new Date();\n const day = now.getDate().toString().padStart(2, \"0\");\n const month = (now.getMonth() + 1).toString().padStart(2, \"0\");\n const year = now.getFullYear();\n const hours = now.getHours().toString().padStart(2, \"0\");\n const minutes = now.getMinutes().toString().padStart(2, \"0\");\n const seconds = now.getSeconds().toString().padStart(2, \"0\");\n return `${day}.${month}.${year} ${hours}:${minutes}:${seconds}`;\n }\n\n /**\n * Parses a date string in the format dd/MM/yyyy into a Date object.\n * @param date - The date string to parse.\n * @returns A Date object.\n */\n static parseDate(date: string): Date {\n const parts: string[] = date.split(\"/\");\n return new Date(Number(parts[2]), Number(parts[1]) - 1, Number(parts[0]));\n }\n}\n\n\nexport class RestUtilities {\n /**\n * Sends an OK message as a response.\n * @param res - Express Response object.\n * @param message - The success message.\n * @param status - HTTP success status. Defaults to 200; pass 201 only after creating a resource.\n * @returns The Response object.\n */\n static sendOKMessage(res: Response, message: string, status: number = 200): Response {\n return res.status(status).send({\n severity: \"success\",\n status,\n statusCode: StatusCode.Ok,\n message,\n });\n }\n\n /**\n * Sends an error message as a response.\n * @param res - Express Response object.\n * @param error - The error to send.\n * @param tag - Optional tag for additional context.\n * @param status - HTTP status code (default: 500).\n * @returns The Response object.\n */\n static sendErrorMessage(res: Response, error: unknown, tag: string = \"[BASE ERROR]\", status: number = 500): Response {\n const rawMessage = error instanceof Error ? error.message : String(error ?? \"\");\n // Logga SEMPRE l'errore reale lato server (con stack) per la diagnosi.\n const errorStack = error instanceof Error ? error.stack : undefined;\n new Logger(tag || \"[BASE ERROR]\").error(rawMessage, ...(errorStack ? [errorStack] : []));\n const errorWithResponse = error as { getResponse?: () => unknown } | null | undefined;\n const exceptionResponse = typeof errorWithResponse?.getResponse === \"function\"\n ? errorWithResponse.getResponse()\n : undefined;\n const exceptionPayload = exceptionResponse && typeof exceptionResponse === \"object\"\n ? exceptionResponse as { code?: unknown; message?: unknown; details?: unknown }\n : undefined;\n const explicitCode = typeof exceptionPayload?.code === \"string\" ? exceptionPayload.code : undefined;\n const explicitMessage = typeof exceptionPayload?.message === \"string\" ? exceptionPayload.message : undefined;\n const explicitDetails = Array.isArray(exceptionPayload?.details)\n ? exceptionPayload.details.filter((detail): detail is string => typeof detail === \"string\")\n : undefined;\n const schemaError = this.isDatabaseSchemaError(error);\n // Per le HttpException lo status corretto e quello dell'eccezione (es. 400 di validazione),\n // anche quando il chiamante non lo passa esplicitamente. Lo status esplicito vale per gli altri errori.\n const exceptionStatus = typeof errorWithResponse?.getResponse === \"function\"\n ? Number((error as { getStatus?: () => number }).getStatus?.())\n : undefined;\n const hasExceptionStatus = Number.isInteger(exceptionStatus) && (exceptionStatus as number) >= 400;\n // Molti controller chiamano `sendErrorMessage(res, err)` anche per errori di input:\n // riconosciamo i casi di validazione per non rispondere 500.\n const looksLikeValidation = !hasExceptionStatus && !schemaError\n && /obbligatorio|obbligatoria|mancante|manca il parametro|non valido|non valida|required|missing|invalid input/i.test(rawMessage);\n const effectiveStatus = schemaError\n ? 503\n : hasExceptionStatus\n ? (exceptionStatus as number)\n : looksLikeValidation\n ? 400\n : status;\n // Codici GENERICI (questo helper non appartiene al modulo Accessi): i codici\n // ACCESSI_* restano di competenza esclusiva del modulo Accessi.\n const code = explicitCode ?? (schemaError\n ? \"DATABASE_SCHEMA_OUTDATED\"\n : effectiveStatus === 401\n ? \"UNAUTHORIZED\"\n : effectiveStatus === 403\n ? \"FORBIDDEN\"\n : effectiveStatus === 400\n ? \"VALIDATION_ERROR\"\n : effectiveStatus >= 500\n ? \"INTERNAL_ERROR\"\n : \"REQUEST_ERROR\");\n // Messaggio SEMPRE specifico: prima quello esplicito dell'eccezione, altrimenti il\n // messaggio reale dell'errore. Il generico resta solo se non c'e' alcun testo.\n const fallbackMessage = schemaError\n ? \"Schema del database non aggiornato; eseguire la migrazione e riprovare.\"\n : effectiveStatus === 401\n ? \"Autenticazione non valida o scaduta.\"\n : effectiveStatus === 403\n ? \"Operazione non autorizzata.\"\n : effectiveStatus >= 500\n ? \"Errore interno del server.\"\n : \"Richiesta non valida.\";\n const message = explicitMessage ?? (rawMessage.trim() || fallbackMessage);\n\n return res.status(effectiveStatus).send({\n severity: \"error\",\n status: effectiveStatus,\n statusCode: StatusCode.Error,\n code,\n message,\n // Compatibilita: il campo storico resta presente, ma non espone SQL, stack o dati sensibili.\n error: code,\n ...(explicitDetails?.length ? { details: explicitDetails } : {}),\n });\n }\n\n /** Riconosce errori di metadata Firebird che richiedono una migrazione. */\n static isDatabaseSchemaError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return /column unknown|table unknown|dynamic sql error|unsuccessful metadata update|invalid request blr/i.test(message);\n }\n\n\n static sendUnauthorized(res: Response): Response {\n return res.status(401).send({\n severity: \"error\",\n status: 401,\n statusCode: StatusCode.Error,\n code: \"ACCESSI_UNAUTHORIZED\",\n error: \"ACCESSI_UNAUTHORIZED\",\n message: \"Autenticazione non valida o scaduta.\",\n });\n }\n\n static sendInvalidCredentials(res: Response): Response {\n return res.status(401).send({\n severity: \"error\",\n status: 401,\n statusCode: StatusCode.Error,\n code: \"ACCESSI_INVALID_CREDENTIALS\",\n error: \"ACCESSI_INVALID_CREDENTIALS\",\n message: \"Credenziali non valide\",\n });\n }\n\n static sendPasswordExpired(res: Response): Response {\n return res.status(403).send({\n severity: \"warning\",\n status: 403,\n statusCode: StatusCode.Warning,\n code: \"PASSWORD_EXPIRED\",\n error: \"PASSWORD_EXPIRED\",\n message: \"Password scaduta. E' necessario aggiornarla\"\n })\n }\n\n /**\n * Sends a base response with a payload.\n * @param res - Express Response object.\n * @param payload - The payload to include in the response.\n * @param status - HTTP success status. Defaults to 200; pass 201 only after creating a resource.\n * @returns The Response object.\n */\n static sendBaseResponse(res: Response, payload: unknown, statusOrTag?: number | string, status: number = 200): Response {\n // Retro-compatibilita: molti controller passano un \"tag\" come terzo\n // argomento (es. sendBaseResponse(res, dati, 'clienti')). Il tag NON e uno\n // status HTTP: veniva ignorato nella firma storica e non deve rompere la risposta.\n const httpStatus = typeof statusOrTag === 'number'\n ? statusOrTag\n : (Number.isInteger(status) ? status : 200);\n const tag = typeof statusOrTag === 'string' ? statusOrTag : \"[UTILITIES]\";\n try {\n const normalizedPayload = JSON.parse(JSON.stringify(payload, (_key, value) =>\n typeof value === 'bigint' ? value.toString() : value\n ));\n const response = {\n Status: {\n errorCode: \"0\",\n errorDescription: \"\",\n },\n Result: normalizedPayload,\n Message: \"Dati recuperati con successo.\",\n };\n return res.status(httpStatus).send(response);\n } catch (error) {\n return this.sendErrorMessage(res, error, tag, 500);\n }\n }\n\n /**\n * Sends an execution message as a response.\n * @param res - Express Response object.\n * @param executionObject - The execution data.\n * @param title - The title of the response.\n * @param status - HTTP success status. Defaults to 200.\n * @returns The Response object.\n */\n static sendExecMessage(res: Response, executionObject: unknown, title: string, status: number = 200): Response {\n try {\n const response = {\n Status: {\n errorCode: \"0\",\n errorDescription: \"\",\n },\n Sql: \"\",\n ID: (executionObject as { id?: unknown } | null | undefined)?.id,\n data: executionObject,\n Title: title,\n };\n return res.status(status).send(response);\n } catch (error) {\n return this.sendErrorMessage(res, `Error sending execution message: ${error}`, title, 500);\n }\n }\n\n /**\n * Prints a SQL query with parameters replaced. Replacement is literal: values\n * containing `?` or `$&` no longer corrupt the output as in the legacy\n * `String.replace` implementation.\n * @param query - The SQL query.\n * @param params - The parameters to replace.\n * @returns The formatted query.\n */\n static printQueryWithParams(query: string = \"\", params: unknown[] = []): string {\n let index = 0;\n return query.replace(/\\?/g, () => {\n if (index >= params.length) {\n return \"?\";\n }\n const param = params[index++];\n return param === undefined || param === null ? \"NULL\" : String(param);\n });\n }\n\n\n public static convertKeysToCamelCase<T = Record<string, unknown>>(obj: unknown): T {\n if (obj !== null && typeof obj === \"object\" && obj.constructor === Object) {\n const source = obj as Record<string, unknown>;\n const converted = Object.keys(source).reduce((acc: Record<string, unknown>, key: string) => {\n const camelCaseKey = key.toLowerCase().replace(/_([a-z])/g, g => (g[1] ?? '').toUpperCase());\n acc[camelCaseKey] = source[key];\n return acc;\n }, {});\n return converted as T;\n }\n return obj as T;\n }\n}\n\n\nexport class CryptUtilities {\n private static readonly logger = new Logger(CryptUtilities.name);\n\n /**\n * Cifra un testo in chiaro usando l'algoritmo AES-128 in modalità ECB.\n * \n * @param plainText - Il testo in chiaro da cifrare.\n * @param key - La chiave di cifratura (16 byte per AES-128).\n * @param outputEncoding - Codifica del risultato cifrato (predefinito: \"base64\").\n * @returns Il testo cifrato codificato.\n * @throws Errore in caso di problemi durante la cifratura.\n */\n public static encrypt(plainData: string, key: string, outputEncoding: BufferEncoding = \"base64\"): string {\n try {\n // Crea un oggetto Cipher usando AES-128 in modalità ECB\n const cipher = crypto.createCipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\n\n // Cifra il testo in chiaro e finalizza il processo\n const encryptedBuffer = Buffer.concat([\n cipher.update(plainData, \"utf8\"),\n cipher.final(),\n ]);\n\n // Restituisce il risultato cifrato codificato\n return encryptedBuffer.toString(outputEncoding);\n } catch (error) {\n // Gestisce eventuali errori di cifratura\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Errore durante la cifratura: ${message}`);\n }\n }\n\n /**\n * Decifra un testo cifrato usando l'algoritmo AES-128 in modalità ECB.\n * \n * @param encryptedData - Il testo cifrato da decifrare.\n * @param key - La chiave di decifratura (16 byte per AES-128).\n * @returns Il testo decifrato o null in caso di errore.\n */\n public static decrypt(encryptedData: string, key: string): string | null {\n try {\n // Crea un oggetto Decipher usando AES-128 in modalità ECB\n const decipher = crypto.createDecipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\n decipher.setAutoPadding(false);\n\n // Decifra il testo cifrato\n let decoded = decipher.update(encryptedData, \"base64\", \"utf8\");\n decoded += decipher.final(\"utf8\");\n\n // Rimuove il padding manuale\n const lastChar = decoded.charCodeAt(decoded.length - 1);\n decoded = decoded.slice(0, decoded.length - lastChar);\n\n return decoded;\n } catch (error) {\n CryptUtilities.logger.error(\"Errore durante la decifratura:\", error);\n return null;\n }\n }\n}\n\nexport class PasswordUtilities {\n private static readonly HASH_PREFIX = \"scrypt\";\n private static readonly LEGACY_HASH_PREFIX = \"scrypt-legacy\";\n private static readonly SCRYPT_N = 16384;\n private static readonly SCRYPT_R = 8;\n private static readonly SCRYPT_P = 1;\n private static readonly SALT_LENGTH = 16;\n\n private static hashSecret(secretValue: string, prefix: string): string {\n if (typeof secretValue !== \"string\" || secretValue.length === 0) {\n throw new Error(\"Il valore da proteggere non puo essere vuoto.\");\n }\n const salt = crypto.randomBytes(this.SALT_LENGTH).toString(\"hex\");\n const derivedKey = crypto.scryptSync(\n secretValue,\n salt,\n 64,\n {\n N: this.SCRYPT_N,\n r: this.SCRYPT_R,\n p: this.SCRYPT_P,\n maxmem: 64 * 1024 * 1024,\n },\n );\n\n return [\n prefix,\n this.SCRYPT_N,\n this.SCRYPT_R,\n this.SCRYPT_P,\n salt,\n derivedKey.toString(\"hex\"),\n ].join(\"$\");\n }\n\n private static hasPrefix(value: string, prefix: string): boolean {\n return typeof value === \"string\" && value.startsWith(`${prefix}$`);\n }\n\n private static parseHash(\n storedPassword: string,\n expectedPrefix: string\n ): {\n salt: string;\n expectedHash: Buffer;\n N: number;\n r: number;\n p: number;\n } | null {\n if (!this.hasPrefix(storedPassword, expectedPrefix)) {\n return null;\n }\n\n const [, rawN, rawR, rawP, salt, expectedHashHex] = storedPassword.split(\"$\");\n const N = Number(rawN);\n const r = Number(rawR);\n const p = Number(rawP);\n\n if (!salt || !expectedHashHex || !Number.isFinite(N) || !Number.isFinite(r) || !Number.isFinite(p)) {\n return null;\n }\n\n const expectedHash = Buffer.from(expectedHashHex, \"hex\");\n if (expectedHash.length === 0) {\n return null;\n }\n\n return {\n salt,\n expectedHash,\n N,\n r,\n p,\n };\n }\n\n private static verifySecret(secretValue: string, storedPassword: string, expectedPrefix: string): boolean {\n if (typeof secretValue !== \"string\") {\n return false;\n }\n\n const parsedHash = this.parseHash(storedPassword, expectedPrefix);\n if (!parsedHash) {\n return false;\n }\n\n const derivedKey = crypto.scryptSync(\n secretValue,\n parsedHash.salt,\n parsedHash.expectedHash.length,\n {\n N: parsedHash.N,\n r: parsedHash.r,\n p: parsedHash.p,\n maxmem: 64 * 1024 * 1024,\n },\n );\n\n return crypto.timingSafeEqual(derivedKey, parsedHash.expectedHash);\n }\n\n public static hashPassword(plainPassword: string): string {\n return this.hashSecret(plainPassword, this.HASH_PREFIX);\n }\n\n public static hashLegacyEncryptedPassword(legacyEncryptedPassword: string): string {\n return this.hashSecret(legacyEncryptedPassword, this.LEGACY_HASH_PREFIX);\n }\n\n public static isPasswordHash(value: string): boolean {\n return this.hasPrefix(value, this.HASH_PREFIX);\n }\n\n public static isLegacyPasswordHash(value: string): boolean {\n return this.hasPrefix(value, this.LEGACY_HASH_PREFIX);\n }\n\n /** Confronto a tempo costante tra due stringhe (per dati legacy non hashati). */\n public static timingSafeStringEquals(value: string, candidate: string): boolean {\n if (typeof value !== \"string\" || typeof candidate !== \"string\") {\n return false;\n }\n\n const valueBuffer = Buffer.from(value, \"utf8\");\n const candidateBuffer = Buffer.from(candidate, \"utf8\");\n\n if (valueBuffer.length !== candidateBuffer.length) {\n // Confronta comunque per non rivelare la lunghezza tramite timing.\n crypto.timingSafeEqual(valueBuffer, valueBuffer);\n return false;\n }\n\n return crypto.timingSafeEqual(valueBuffer, candidateBuffer);\n }\n\n public static verifyPassword(plainPassword: string, storedPassword: string): boolean {\n return this.verifySecret(plainPassword, storedPassword, this.HASH_PREFIX);\n }\n\n public static verifyLegacyEncryptedPassword(\n legacyEncryptedPassword: string,\n storedPassword: string\n ): boolean {\n return this.verifySecret(legacyEncryptedPassword, storedPassword, this.LEGACY_HASH_PREFIX);\n }\n}\n\n\n\n\n\n/**\n * Utility class for managing database-related configurations and operations.\n */\nexport class DatabaseUtilities {\n /**\n * Creates a configuration object for connecting to a Firebird database.\n *\n * @param {string} host - The hostname or IP address of the database server.\n * @param {number} port - The port number on which the database server is running.\n * @param {string} database - The path or alias of the database to connect to.\n * @param {string} [username='SYSDBA'] - The username for authentication. Defaults to 'SYSDBA'.\n * @param {string} [password='masterkey'] - The password for authentication. Defaults to 'masterkey'.\n * @returns {Options} - The configuration object to use for establishing a Firebird database connection.\n *\n * @example\n * ```typescript\n * const options = DatabaseUtilities.createOption(\n * 'localhost',\n * 3050,\n * '/path/to/database.fdb',\n * 'myUsername',\n * 'myPassword'\n * );\n * ```\n */\n public static createOption(\n host: string,\n port: number,\n database: string,\n username = 'SYSDBA',\n password = 'masterkey'\n ): FirebirdOptions {\n return {\n host, // The hostname or IP address of the database server.\n port, // The port number used by the database server.\n user: username, // The username for database authentication.\n password, // The password for database authentication.\n database, // The path or alias of the target database.\n lowercase_keys: false, // Determines if the keys in query results should be in lowercase. Default: false.\n role: undefined, // The role for the database connection. Default: undefined.\n pageSize: 100000, // The page size for database transactions. Default: 100,000.\n retryConnectionInterval: 1000, // The interval (in ms) to retry a failed connection. Default: 1,000 ms.\n blobAsText: true, // Determines if BLOB fields should be treated as text. Default: true.\n connectTimeout: 15000,\n connectTimeoutMs: 15000,\n trimStringResults: true,\n };\n }\n}\n\nconst deprecationLogger = new Logger('Deprecated');\n\nexport function Deprecated(message: string) {\n return function (target: object, key?: string, descriptor?: PropertyDescriptor) {\n void target;\n void key;\n void descriptor;\n deprecationLogger.warning(`[DEPRECATED] ${message}`);\n };\n }\n"]}
|
|
1
|
+
{"version":3,"file":"Utilities.js","sourceRoot":"","sources":["../src/Utilities.ts"],"names":[],"mappings":"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","sourcesContent":["import { Response } from 'express';\nimport { FirebirdOptions } from \"./firebird-compat\";\nimport { Logger } from \"./Logger\";\nimport crypto from \"crypto\";\n\n\nexport enum StatusCode {\n Ok = 0,\n Warning = 1,\n Error = 2,\n}\n\nexport class DateUtilities {\n /**\n * Pads a number with leading zeros to reach a specified length.\n * @param num - The number to pad.\n * @param totalLength - The total length of the resulting string.\n * @returns The padded string.\n */\n static addStartingZeros(num: number, totalLength: number): string {\n return String(num).padStart(totalLength, '0');\n }\n\n /**\n * Formats a Date object as a Moncler-style string.\n * @param dData - The date to format.\n * @param bAddMs - Whether to include milliseconds.\n * @returns The formatted date string.\n */\n static dateToMoncler(dData: Date, bAddMs: boolean = false): string {\n const yy = dData.getFullYear();\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\n const dd = this.addStartingZeros(dData.getDate(), 2);\n const hh = this.addStartingZeros(dData.getHours(), 2);\n const nn = this.addStartingZeros(dData.getMinutes(), 2);\n const ss = this.addStartingZeros(dData.getSeconds(), 2);\n const ms = this.addStartingZeros(dData.getMilliseconds(), 3);\n return bAddMs ? `${yy}${mm}${dd}${hh}${nn}${ss}${ms}` : `${yy}${mm}${dd}${hh}${nn}${ss}`;\n }\n\n /**\n * Formats a Date object as a SQL-style string.\n * @param dData - The date to format.\n * @param bAddMs - Whether to include milliseconds.\n * @returns The formatted date string.\n */\n static dateToSql(dData: Date, bAddMs: boolean = false): string {\n const yy = dData.getFullYear();\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\n const dd = this.addStartingZeros(dData.getDate(), 2);\n const hh = this.addStartingZeros(dData.getHours(), 2);\n const nn = this.addStartingZeros(dData.getMinutes(), 2);\n const ss = this.addStartingZeros(dData.getSeconds(), 2);\n const ms = this.addStartingZeros(dData.getMilliseconds(), 3);\n return bAddMs\n ? `${yy}-${mm}-${dd} ${hh}:${nn}:${ss}.${ms}`\n : `${yy}-${mm}-${dd} ${hh}:${nn}:${ss}`;\n }\n\n /**\n * Formats a Date object as a simple string (dd-MM-yyyy).\n * @param dData - The date to format.\n * @returns The formatted date string.\n */\n static dateToSimple(dData: Date): string {\n const yy = dData.getFullYear();\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\n const dd = this.addStartingZeros(dData.getDate(), 2);\n return `${dd}-${mm}-${yy}`;\n }\n\n /**\n * Gets the current date and time as a formatted string.\n * @returns The current date and time in the format dd.MM.yyyy HH:mm:ss.\n */\n static getNowDateString(): string {\n const now: Date = new Date();\n const day = now.getDate().toString().padStart(2, \"0\");\n const month = (now.getMonth() + 1).toString().padStart(2, \"0\");\n const year = now.getFullYear();\n const hours = now.getHours().toString().padStart(2, \"0\");\n const minutes = now.getMinutes().toString().padStart(2, \"0\");\n const seconds = now.getSeconds().toString().padStart(2, \"0\");\n return `${day}.${month}.${year} ${hours}:${minutes}:${seconds}`;\n }\n\n /**\n * Parses a date string in the format dd/MM/yyyy into a Date object.\n * @param date - The date string to parse.\n * @returns A Date object.\n */\n static parseDate(date: string): Date {\n const parts: string[] = date.split(\"/\");\n return new Date(Number(parts[2]), Number(parts[1]) - 1, Number(parts[0]));\n }\n}\n\n\nexport class RestUtilities {\n /**\n * Sends an OK message as a response.\n * @param res - Express Response object.\n * @param message - The success message.\n * @param status - HTTP success status. Defaults to 200; pass 201 only after creating a resource.\n * @returns The Response object.\n */\n static sendOKMessage(res: Response, message: string, status: number = 200): Response {\n return res.status(status).send({\n severity: \"success\",\n status,\n statusCode: StatusCode.Ok,\n message,\n });\n }\n\n /**\n * Sends an error message as a response.\n * @param res - Express Response object.\n * @param error - The error to send.\n * @param tag - Optional tag for additional context.\n * @param status - HTTP status code (default: 500).\n * @returns The Response object.\n */\n static sendErrorMessage(res: Response, error: unknown, tag: string = \"[BASE ERROR]\", status: number = 500): Response {\n const rawMessage = error instanceof Error ? error.message : String(error ?? \"\");\n // Logga SEMPRE l'errore reale lato server (con stack) per la diagnosi.\n const errorStack = error instanceof Error ? error.stack : undefined;\n new Logger(tag || \"[BASE ERROR]\").error(rawMessage, ...(errorStack ? [errorStack] : []));\n const errorWithResponse = error as { getResponse?: () => unknown } | null | undefined;\n const exceptionResponse = typeof errorWithResponse?.getResponse === \"function\"\n ? errorWithResponse.getResponse()\n : undefined;\n const exceptionPayload = exceptionResponse && typeof exceptionResponse === \"object\"\n ? exceptionResponse as { code?: unknown; message?: unknown; details?: unknown }\n : undefined;\n const explicitCode = typeof exceptionPayload?.code === \"string\" ? exceptionPayload.code : undefined;\n const explicitMessage = typeof exceptionPayload?.message === \"string\" ? exceptionPayload.message : undefined;\n const explicitDetails = Array.isArray(exceptionPayload?.details)\n ? exceptionPayload.details.filter((detail): detail is string => typeof detail === \"string\")\n : undefined;\n const schemaError = this.isDatabaseSchemaError(error);\n // Per le HttpException lo status corretto e quello dell'eccezione (es. 400 di validazione),\n // anche quando il chiamante non lo passa esplicitamente. Lo status esplicito vale per gli altri errori.\n const exceptionStatus = typeof errorWithResponse?.getResponse === \"function\"\n ? Number((error as { getStatus?: () => number }).getStatus?.())\n : undefined;\n const hasExceptionStatus = Number.isInteger(exceptionStatus) && (exceptionStatus as number) >= 400;\n // Molti controller chiamano `sendErrorMessage(res, err)` anche per errori di input:\n // riconosciamo i casi di validazione per non rispondere 500.\n const looksLikeValidation = !hasExceptionStatus && !schemaError\n && /obbligatorio|obbligatoria|mancante|manca il parametro|non valido|non valida|required|missing|invalid input/i.test(rawMessage);\n const effectiveStatus = schemaError\n ? 503\n : hasExceptionStatus\n ? (exceptionStatus as number)\n : looksLikeValidation\n ? 400\n : status;\n // Codici GENERICI (questo helper non appartiene al modulo Accessi): i codici\n // ACCESSI_* restano di competenza esclusiva del modulo Accessi.\n const code = explicitCode ?? (schemaError\n ? \"DATABASE_SCHEMA_OUTDATED\"\n : effectiveStatus === 401\n ? \"UNAUTHORIZED\"\n : effectiveStatus === 403\n ? \"FORBIDDEN\"\n : effectiveStatus === 400\n ? \"VALIDATION_ERROR\"\n : effectiveStatus >= 500\n ? \"INTERNAL_ERROR\"\n : \"REQUEST_ERROR\");\n // Messaggio SEMPRE specifico: prima quello esplicito dell'eccezione, altrimenti il\n // messaggio reale dell'errore. Il generico resta solo se non c'e' alcun testo.\n const fallbackMessage = schemaError\n ? \"Schema del database non aggiornato; eseguire la migrazione e riprovare.\"\n : effectiveStatus === 401\n ? \"Autenticazione non valida o scaduta.\"\n : effectiveStatus === 403\n ? \"Operazione non autorizzata.\"\n : effectiveStatus >= 500\n ? \"Errore interno del server.\"\n : \"Richiesta non valida.\";\n const message = explicitMessage ?? (rawMessage.trim() || fallbackMessage);\n\n return res.status(effectiveStatus).send({\n severity: \"error\",\n status: effectiveStatus,\n statusCode: StatusCode.Error,\n code,\n message,\n // Compatibilita: il campo storico resta presente, ma non espone SQL, stack o dati sensibili.\n error: code,\n ...(explicitDetails?.length ? { details: explicitDetails } : {}),\n });\n }\n\n /** Riconosce errori di metadata Firebird che richiedono una migrazione. */\n static isDatabaseSchemaError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return /column unknown|table unknown|dynamic sql error|unsuccessful metadata update|invalid request blr/i.test(message);\n }\n\n\n static sendUnauthorized(res: Response): Response {\n return res.status(401).send({\n severity: \"error\",\n status: 401,\n statusCode: StatusCode.Error,\n code: \"ACCESSI_UNAUTHORIZED\",\n error: \"ACCESSI_UNAUTHORIZED\",\n message: \"Autenticazione non valida o scaduta.\",\n });\n }\n\n static sendInvalidCredentials(res: Response): Response {\n return res.status(401).send({\n severity: \"error\",\n status: 401,\n statusCode: StatusCode.Error,\n code: \"ACCESSI_INVALID_CREDENTIALS\",\n error: \"ACCESSI_INVALID_CREDENTIALS\",\n message: \"Credenziali non valide\",\n });\n }\n\n static sendPasswordExpired(res: Response): Response {\n return res.status(403).send({\n severity: \"warning\",\n status: 403,\n statusCode: StatusCode.Warning,\n code: \"PASSWORD_EXPIRED\",\n error: \"PASSWORD_EXPIRED\",\n message: \"Password scaduta. E' necessario aggiornarla\"\n })\n }\n\n /**\n * Sends a base response with a payload.\n * @param res - Express Response object.\n * @param payload - The payload to include in the response.\n * @param status - HTTP success status. Defaults to 200; pass 201 only after creating a resource.\n * @returns The Response object.\n */\n static sendBaseResponse(res: Response, payload: unknown, statusOrTag?: number | string, status: number = 200): Response {\n // Retro-compatibilita: molti controller passano un \"tag\" come terzo\n // argomento (es. sendBaseResponse(res, dati, 'clienti')). Il tag NON e uno\n // status HTTP: veniva ignorato nella firma storica e non deve rompere la risposta.\n const httpStatus = typeof statusOrTag === 'number'\n ? statusOrTag\n : (Number.isInteger(status) ? status : 200);\n const tag = typeof statusOrTag === 'string' ? statusOrTag : \"[UTILITIES]\";\n try {\n const normalizedPayload = JSON.parse(JSON.stringify(payload, (_key, value) =>\n typeof value === 'bigint' ? value.toString() : value\n ));\n const response = {\n Status: {\n errorCode: \"0\",\n errorDescription: \"\",\n },\n Result: normalizedPayload,\n Message: \"Dati recuperati con successo.\",\n };\n return res.status(httpStatus).send(response);\n } catch (error) {\n return this.sendErrorMessage(res, error, tag, 500);\n }\n }\n\n /**\n * Sends an execution message as a response.\n * @param res - Express Response object.\n * @param executionObject - The execution data.\n * @param title - The title of the response.\n * @param status - HTTP success status. Defaults to 200.\n * @returns The Response object.\n */\n static sendExecMessage(res: Response, executionObject: unknown, title: string, status: number = 200): Response {\n try {\n const response = {\n Status: {\n errorCode: \"0\",\n errorDescription: \"\",\n },\n Sql: \"\",\n ID: (executionObject as { id?: unknown } | null | undefined)?.id,\n data: executionObject,\n Title: title,\n };\n return res.status(status).send(response);\n } catch (error) {\n return this.sendErrorMessage(res, `Error sending execution message: ${error}`, title, 500);\n }\n }\n\n /**\n * Prints a SQL query with parameters replaced. Replacement is literal: values\n * containing `?` or `$&` no longer corrupt the output as in the legacy\n * `String.replace` implementation.\n * @param query - The SQL query.\n * @param params - The parameters to replace.\n * @returns The formatted query.\n */\n static printQueryWithParams(query: string = \"\", params: unknown[] = []): string {\n let index = 0;\n return query.replace(/\\?/g, () => {\n if (index >= params.length) {\n return \"?\";\n }\n const param = params[index++];\n return param === undefined || param === null ? \"NULL\" : String(param);\n });\n }\n\n\n public static convertKeysToCamelCase<T = Record<string, unknown>>(obj: unknown): T {\n if (obj !== null && typeof obj === \"object\" && obj.constructor === Object) {\n const source = obj as Record<string, unknown>;\n const converted = Object.keys(source).reduce((acc: Record<string, unknown>, key: string) => {\n const camelCaseKey = key.toLowerCase().replace(/_([a-z])/g, g => (g[1] ?? '').toUpperCase());\n acc[camelCaseKey] = source[key];\n return acc;\n }, {});\n return converted as T;\n }\n return obj as T;\n }\n}\n\n\nexport class CryptUtilities {\n private static readonly logger = new Logger(CryptUtilities.name);\n\n /**\n * Cifra un testo in chiaro usando l'algoritmo AES-128 in modalità ECB.\n * \n * @param plainText - Il testo in chiaro da cifrare.\n * @param key - La chiave di cifratura (16 byte per AES-128).\n * @param outputEncoding - Codifica del risultato cifrato (predefinito: \"base64\").\n * @returns Il testo cifrato codificato.\n * @throws Errore in caso di problemi durante la cifratura.\n */\n public static encrypt(plainData: string, key: string, outputEncoding: BufferEncoding = \"base64\"): string {\n try {\n // Crea un oggetto Cipher usando AES-128 in modalità ECB\n const cipher = crypto.createCipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\n\n // Cifra il testo in chiaro e finalizza il processo\n const encryptedBuffer = Buffer.concat([\n cipher.update(plainData, \"utf8\"),\n cipher.final(),\n ]);\n\n // Restituisce il risultato cifrato codificato\n return encryptedBuffer.toString(outputEncoding);\n } catch (error) {\n // Gestisce eventuali errori di cifratura\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Errore durante la cifratura: ${message}`);\n }\n }\n\n /**\n * Decifra un testo cifrato usando l'algoritmo AES-128 in modalità ECB.\n * \n * @param encryptedData - Il testo cifrato da decifrare.\n * @param key - La chiave di decifratura (16 byte per AES-128).\n * @returns Il testo decifrato o null in caso di errore.\n */\n public static decrypt(encryptedData: string, key: string): string | null {\n try {\n // Crea un oggetto Decipher usando AES-128 in modalità ECB\n const decipher = crypto.createDecipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\n decipher.setAutoPadding(false);\n\n // Decifra il testo cifrato\n let decoded = decipher.update(encryptedData, \"base64\", \"utf8\");\n decoded += decipher.final(\"utf8\");\n\n // Rimuove il padding manuale\n const lastChar = decoded.charCodeAt(decoded.length - 1);\n decoded = decoded.slice(0, decoded.length - lastChar);\n\n return decoded;\n } catch (error) {\n CryptUtilities.logger.error(\"Errore durante la decifratura:\", error);\n return null;\n }\n }\n}\n\nexport class PasswordUtilities {\n private static readonly HASH_PREFIX = \"scrypt\";\n private static readonly LEGACY_HASH_PREFIX = \"scrypt-legacy\";\n private static readonly SCRYPT_N = 16384;\n private static readonly SCRYPT_R = 8;\n private static readonly SCRYPT_P = 1;\n private static readonly SALT_LENGTH = 16;\n\n private static hashSecret(secretValue: string, prefix: string): string {\n if (typeof secretValue !== \"string\" || secretValue.length === 0) {\n throw new Error(\"Il valore da proteggere non puo essere vuoto.\");\n }\n const salt = crypto.randomBytes(this.SALT_LENGTH).toString(\"hex\");\n const derivedKey = crypto.scryptSync(\n secretValue,\n salt,\n 64,\n {\n N: this.SCRYPT_N,\n r: this.SCRYPT_R,\n p: this.SCRYPT_P,\n maxmem: 64 * 1024 * 1024,\n },\n );\n\n return [\n prefix,\n this.SCRYPT_N,\n this.SCRYPT_R,\n this.SCRYPT_P,\n salt,\n derivedKey.toString(\"hex\"),\n ].join(\"$\");\n }\n\n private static hasPrefix(value: string, prefix: string): boolean {\n return typeof value === \"string\" && value.startsWith(`${prefix}$`);\n }\n\n private static parseHash(\n storedPassword: string,\n expectedPrefix: string\n ): {\n salt: string;\n expectedHash: Buffer;\n N: number;\n r: number;\n p: number;\n } | null {\n if (!this.hasPrefix(storedPassword, expectedPrefix)) {\n return null;\n }\n\n const [, rawN, rawR, rawP, salt, expectedHashHex] = storedPassword.split(\"$\");\n const N = Number(rawN);\n const r = Number(rawR);\n const p = Number(rawP);\n\n if (!salt || !expectedHashHex || !Number.isFinite(N) || !Number.isFinite(r) || !Number.isFinite(p)) {\n return null;\n }\n\n const expectedHash = Buffer.from(expectedHashHex, \"hex\");\n if (expectedHash.length === 0) {\n return null;\n }\n\n return {\n salt,\n expectedHash,\n N,\n r,\n p,\n };\n }\n\n private static verifySecret(secretValue: string, storedPassword: string, expectedPrefix: string): boolean {\n if (typeof secretValue !== \"string\") {\n return false;\n }\n\n const parsedHash = this.parseHash(storedPassword, expectedPrefix);\n if (!parsedHash) {\n return false;\n }\n\n const derivedKey = crypto.scryptSync(\n secretValue,\n parsedHash.salt,\n parsedHash.expectedHash.length,\n {\n N: parsedHash.N,\n r: parsedHash.r,\n p: parsedHash.p,\n maxmem: 64 * 1024 * 1024,\n },\n );\n\n return crypto.timingSafeEqual(derivedKey, parsedHash.expectedHash);\n }\n\n public static hashPassword(plainPassword: string): string {\n return this.hashSecret(plainPassword, this.HASH_PREFIX);\n }\n\n public static hashLegacyEncryptedPassword(legacyEncryptedPassword: string): string {\n return this.hashSecret(legacyEncryptedPassword, this.LEGACY_HASH_PREFIX);\n }\n\n public static isPasswordHash(value: string): boolean {\n return this.hasPrefix(value, this.HASH_PREFIX);\n }\n\n public static isLegacyPasswordHash(value: string): boolean {\n return this.hasPrefix(value, this.LEGACY_HASH_PREFIX);\n }\n\n /** Confronto a tempo costante tra due stringhe (per dati legacy non hashati). */\n public static timingSafeStringEquals(value: string, candidate: string): boolean {\n if (typeof value !== \"string\" || typeof candidate !== \"string\") {\n return false;\n }\n\n const valueBuffer = Buffer.from(value, \"utf8\");\n const candidateBuffer = Buffer.from(candidate, \"utf8\");\n\n if (valueBuffer.length !== candidateBuffer.length) {\n // Confronta comunque per non rivelare la lunghezza tramite timing.\n crypto.timingSafeEqual(valueBuffer, valueBuffer);\n return false;\n }\n\n return crypto.timingSafeEqual(valueBuffer, candidateBuffer);\n }\n\n public static verifyPassword(plainPassword: string, storedPassword: string): boolean {\n return this.verifySecret(plainPassword, storedPassword, this.HASH_PREFIX);\n }\n\n public static verifyLegacyEncryptedPassword(\n legacyEncryptedPassword: string,\n storedPassword: string\n ): boolean {\n return this.verifySecret(legacyEncryptedPassword, storedPassword, this.LEGACY_HASH_PREFIX);\n }\n}\n\n\n\n\n\n/**\n * Utility class for managing database-related configurations and operations.\n */\nexport class DatabaseUtilities {\n /**\n * Creates a configuration object for connecting to a Firebird database.\n *\n * @param {string} host - The hostname or IP address of the database server.\n * @param {number} port - The port number on which the database server is running.\n * @param {string} database - The path or alias of the database to connect to.\n * @param {string} [username='SYSDBA'] - The username for authentication. Defaults to 'SYSDBA'.\n * @param {string} [password='masterkey'] - The password for authentication. Defaults to 'masterkey'.\n * @returns {Options} - The configuration object to use for establishing a Firebird database connection.\n *\n * @example\n * ```typescript\n * const options = DatabaseUtilities.createOption(\n * 'localhost',\n * 3050,\n * '/path/to/database.fdb',\n * 'myUsername',\n * 'myPassword'\n * );\n * ```\n */\n public static createOption(\n host: string,\n port: number,\n database: string,\n username = 'SYSDBA',\n password = 'masterkey'\n ): FirebirdOptions {\n return {\n host, // The hostname or IP address of the database server.\n port, // The port number used by the database server.\n user: username, // The username for database authentication.\n password, // The password for database authentication.\n database, // The path or alias of the target database.\n lowercase_keys: false, // Determines if the keys in query results should be in lowercase. Default: false.\n role: undefined, // The role for the database connection. Default: undefined.\n pageSize: 100000, // The page size for database transactions. Default: 100,000.\n retryConnectionInterval: 1000, // The interval (in ms) to retry a failed connection. Default: 1,000 ms.\n blobAsText: true, // Determines if BLOB fields should be treated as text. Default: true.\n connectTimeout: 15000,\n connectTimeoutMs: 15000,\n trimStringResults: true,\n utcDates: true,\n };\n }\n}\n\nconst deprecationLogger = new Logger('Deprecated');\n\nexport function Deprecated(message: string) {\n return function (target: object, key?: string, descriptor?: PropertyDescriptor) {\n void target;\n void key;\n void descriptor;\n deprecationLogger.warning(`[DEPRECATED] ${message}`);\n };\n }\n"]}
|
|
Binary file
|
|
@@ -11,6 +11,12 @@ export type FirebirdOptions = Options & {
|
|
|
11
11
|
compatibilityTotalTimeoutMs?: number;
|
|
12
12
|
firebirdDriver?: FirebirdDriverStrategy;
|
|
13
13
|
trimStringResults?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* When `true` (default), DATE/TIME/TIMESTAMP values are returned as UTC,
|
|
16
|
+
* reproducing the legacy `es-node-firebird` fork behaviour. When `false`,
|
|
17
|
+
* the values are left as decoded by `node-firebird` (local time).
|
|
18
|
+
*/
|
|
19
|
+
utcDates?: boolean;
|
|
14
20
|
/**
|
|
15
21
|
* When `true`, query parameters are interpolated into the logged SQL. Off by
|
|
16
22
|
* default so that secrets, credentials and personal data are not written to
|
|
@@ -29,6 +35,27 @@ type FirebirdErrorContext = {
|
|
|
29
35
|
stage: "attach" | "query" | "execute" | "transaction";
|
|
30
36
|
sql?: string;
|
|
31
37
|
};
|
|
38
|
+
/**
|
|
39
|
+
* Reinterprets a Date's local wall-clock components as UTC.
|
|
40
|
+
*
|
|
41
|
+
* `node-firebird` 2.x decodes Firebird DATE/TIME/TIMESTAMP (which are
|
|
42
|
+
* timezone-less) as *local* time via `setMilliseconds(... + getTimezoneOffset())`.
|
|
43
|
+
* The legacy `es-node-firebird` fork instead decoded them as UTC
|
|
44
|
+
* (`setUTCMilliseconds`). This helper reproduces that legacy behaviour by
|
|
45
|
+
* taking the local wall-clock fields and rebuilding the Date as if they were
|
|
46
|
+
* UTC, so existing applications keep seeing the same values.
|
|
47
|
+
*/
|
|
48
|
+
export declare function toUtcDate(date: Date): Date;
|
|
49
|
+
/**
|
|
50
|
+
* Normalizes a decoded Firebird result value to reproduce the legacy
|
|
51
|
+
* `es-node-firebird` fork behaviour:
|
|
52
|
+
*
|
|
53
|
+
* - strings are trimmed (the fork called `.trim()` on every text field);
|
|
54
|
+
* - `Date` values are reinterpreted as UTC (the fork used `setUTCMilliseconds`);
|
|
55
|
+
* - arrays and plain objects are normalized recursively;
|
|
56
|
+
* - `Buffer`, `null` and `undefined` are left untouched.
|
|
57
|
+
*/
|
|
58
|
+
export declare function normalizeFirebirdResult(value: unknown, trimStringResults: boolean, utcDates: boolean): unknown;
|
|
32
59
|
export declare function normalizeFirebirdOptions(options: Options): FirebirdOptions;
|
|
33
60
|
export declare function describeFirebirdCompatibilityOptions(options: Options): string;
|
|
34
61
|
export declare function enhanceFirebirdError(error: unknown, options: Options, context: FirebirdErrorContext): Error;
|
package/dist/firebird-compat.js
CHANGED
|
@@ -44,6 +44,8 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
44
44
|
return t;
|
|
45
45
|
};
|
|
46
46
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.toUtcDate = toUtcDate;
|
|
48
|
+
exports.normalizeFirebirdResult = normalizeFirebirdResult;
|
|
47
49
|
exports.normalizeFirebirdOptions = normalizeFirebirdOptions;
|
|
48
50
|
exports.describeFirebirdCompatibilityOptions = describeFirebirdCompatibilityOptions;
|
|
49
51
|
exports.enhanceFirebirdError = enhanceFirebirdError;
|
|
@@ -54,6 +56,53 @@ const Firebird = __importStar(require("node-firebird"));
|
|
|
54
56
|
function isBlank(value) {
|
|
55
57
|
return value === undefined || value === null || (typeof value === "string" && value.trim() === "");
|
|
56
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Reinterprets a Date's local wall-clock components as UTC.
|
|
61
|
+
*
|
|
62
|
+
* `node-firebird` 2.x decodes Firebird DATE/TIME/TIMESTAMP (which are
|
|
63
|
+
* timezone-less) as *local* time via `setMilliseconds(... + getTimezoneOffset())`.
|
|
64
|
+
* The legacy `es-node-firebird` fork instead decoded them as UTC
|
|
65
|
+
* (`setUTCMilliseconds`). This helper reproduces that legacy behaviour by
|
|
66
|
+
* taking the local wall-clock fields and rebuilding the Date as if they were
|
|
67
|
+
* UTC, so existing applications keep seeing the same values.
|
|
68
|
+
*/
|
|
69
|
+
function toUtcDate(date) {
|
|
70
|
+
return new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Normalizes a decoded Firebird result value to reproduce the legacy
|
|
74
|
+
* `es-node-firebird` fork behaviour:
|
|
75
|
+
*
|
|
76
|
+
* - strings are trimmed (the fork called `.trim()` on every text field);
|
|
77
|
+
* - `Date` values are reinterpreted as UTC (the fork used `setUTCMilliseconds`);
|
|
78
|
+
* - arrays and plain objects are normalized recursively;
|
|
79
|
+
* - `Buffer`, `null` and `undefined` are left untouched.
|
|
80
|
+
*/
|
|
81
|
+
function normalizeFirebirdResult(value, trimStringResults, utcDates) {
|
|
82
|
+
if (value === undefined || value === null) {
|
|
83
|
+
return value;
|
|
84
|
+
}
|
|
85
|
+
if (typeof value === "string" || value instanceof String) {
|
|
86
|
+
return trimStringResults ? String(value).trim() : value;
|
|
87
|
+
}
|
|
88
|
+
if (Array.isArray(value)) {
|
|
89
|
+
return value.map((item) => normalizeFirebirdResult(item, trimStringResults, utcDates));
|
|
90
|
+
}
|
|
91
|
+
if (value instanceof Date) {
|
|
92
|
+
return utcDates ? toUtcDate(value) : value;
|
|
93
|
+
}
|
|
94
|
+
if (Buffer.isBuffer(value)) {
|
|
95
|
+
return value;
|
|
96
|
+
}
|
|
97
|
+
if (typeof value === "object") {
|
|
98
|
+
const source = value;
|
|
99
|
+
return Object.keys(source).reduce((normalized, key) => {
|
|
100
|
+
normalized[key] = normalizeFirebirdResult(source[key], trimStringResults, utcDates);
|
|
101
|
+
return normalized;
|
|
102
|
+
}, {});
|
|
103
|
+
}
|
|
104
|
+
return value;
|
|
105
|
+
}
|
|
57
106
|
function normalizeWireCryptMode(value) {
|
|
58
107
|
if (isBlank(value)) {
|
|
59
108
|
return undefined;
|
|
@@ -173,8 +222,9 @@ function formatFirebirdMetadata(source) {
|
|
|
173
222
|
function normalizeFirebirdOptions(options) {
|
|
174
223
|
var _a, _b;
|
|
175
224
|
const compatibilityOptions = options;
|
|
176
|
-
const { authPlugins: _authPlugins, compatibilityProbeTimeoutMs: _compatibilityProbeTimeoutMs, compatibilityTotalTimeoutMs, connectTimeoutMs, firebirdDriver: _firebirdDriver, logQueryParameters: _logQueryParameters, poolSize: _poolSize, trimStringResults } = compatibilityOptions, baseOptions = __rest(compatibilityOptions, ["authPlugins", "compatibilityProbeTimeoutMs", "compatibilityTotalTimeoutMs", "connectTimeoutMs", "firebirdDriver", "logQueryParameters", "poolSize", "trimStringResults"]);
|
|
177
|
-
const normalizedOptions = Object.assign(Object.assign({}, baseOptions), { pluginName: normalizeAuthPlugin(compatibilityOptions.pluginName), trimStringResults,
|
|
225
|
+
const { authPlugins: _authPlugins, compatibilityProbeTimeoutMs: _compatibilityProbeTimeoutMs, compatibilityTotalTimeoutMs, connectTimeoutMs, firebirdDriver: _firebirdDriver, logQueryParameters: _logQueryParameters, poolSize: _poolSize, trimStringResults, utcDates } = compatibilityOptions, baseOptions = __rest(compatibilityOptions, ["authPlugins", "compatibilityProbeTimeoutMs", "compatibilityTotalTimeoutMs", "connectTimeoutMs", "firebirdDriver", "logQueryParameters", "poolSize", "trimStringResults", "utcDates"]);
|
|
226
|
+
const normalizedOptions = Object.assign(Object.assign({}, baseOptions), { pluginName: normalizeAuthPlugin(compatibilityOptions.pluginName), trimStringResults,
|
|
227
|
+
utcDates, wireCrypt: normalizeWireCryptMode(compatibilityOptions.wireCrypt) });
|
|
178
228
|
const timeoutCandidate = (_b = (_a = compatibilityOptions.connectTimeout) !== null && _a !== void 0 ? _a : connectTimeoutMs) !== null && _b !== void 0 ? _b : compatibilityTotalTimeoutMs;
|
|
179
229
|
if (Number.isFinite(timeoutCandidate) && Number(timeoutCandidate) > 0) {
|
|
180
230
|
normalizedOptions.connectTimeout = Math.trunc(Number(timeoutCandidate));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebird-compat.js","sourceRoot":"","sources":["../src/firebird-compat.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Firebird from \"node-firebird\";\nimport type { Options } from \"node-firebird\";\n\nexport type FirebirdWireCryptMode = \"disabled\" | \"enabled\" | \"required\";\nexport type FirebirdAuthPlugin = \"Legacy_Auth\" | \"Srp\" | \"Srp256\" | \"Srp384\" | \"Srp512\";\nexport type FirebirdDriverStrategy = \"modern\";\n\nexport type FirebirdOptions = Options & {\n wireCrypt?: FirebirdWireCryptMode | number;\n pluginName?: FirebirdAuthPlugin;\n authPlugins?: FirebirdAuthPlugin[];\n connectTimeoutMs?: number;\n compatibilityProbeTimeoutMs?: number;\n compatibilityTotalTimeoutMs?: number;\n firebirdDriver?: FirebirdDriverStrategy;\n trimStringResults?: boolean;\n /**\n * When `true`, query parameters are interpolated into the logged SQL. Off by\n * default so that secrets, credentials and personal data are not written to\n * the console or to the daily log files.\n */\n logQueryParameters?: boolean;\n /**\n * When greater than zero, enables an opt-in connection pool of the given\n * maximum size for this connection target instead of attaching/detaching a\n * physical connection for every query. Default `0` keeps the historic\n * one-connection-per-query behaviour.\n */\n poolSize?: number;\n};\n\ntype FirebirdErrorContext = {\n stage: \"attach\" | \"query\" | \"execute\" | \"transaction\";\n sql?: string;\n};\n\ntype EnhancedFirebirdError = Error & {\n cause?: unknown;\n gdscode?: number;\n gdsparams?: unknown;\n __emilsoftwareFirebirdEnhanced?: boolean;\n};\n\nfunction isBlank(value: unknown): boolean {\n return value === undefined || value === null || (typeof value === \"string\" && value.trim() === \"\");\n}\n\nfunction normalizeWireCryptMode(value: FirebirdOptions[\"wireCrypt\"]): number | undefined {\n if (isBlank(value)) {\n return undefined;\n }\n\n if (typeof value === \"number\") {\n return value;\n }\n\n const normalized = String(value).trim().toLowerCase();\n if (normalized === \"disabled\") {\n return Firebird.WIRE_CRYPT_DISABLE;\n }\n\n return Firebird.WIRE_CRYPT_ENABLE;\n}\n\nfunction normalizeAuthPlugin(value: unknown): FirebirdAuthPlugin | undefined {\n if (isBlank(value)) {\n return undefined;\n }\n\n const normalized = String(value).trim().toLowerCase();\n if (normalized === \"legacy\" || normalized === \"legacy_auth\") {\n return \"Legacy_Auth\";\n }\n\n if (normalized === \"srp256\") {\n return \"Srp256\";\n }\n\n if (normalized === \"srp384\") {\n return \"Srp384\";\n }\n\n if (normalized === \"srp512\") {\n return \"Srp512\";\n }\n\n return \"Srp\";\n}\n\nfunction formatWireCryptValue(value: FirebirdOptions[\"wireCrypt\"]): string {\n if (isBlank(value)) {\n return \"auto\";\n }\n\n if (typeof value === \"number\") {\n if (value === Firebird.WIRE_CRYPT_DISABLE) {\n return \"disabled\";\n }\n\n if (value === Firebird.WIRE_CRYPT_ENABLE) {\n return \"enabled\";\n }\n\n return String(value);\n }\n\n return String(value);\n}\n\nfunction formatTarget(options: Options): string {\n return `${options.host ?? \"?\"}:${options.port ?? \"?\"} -> ${options.database ?? \"?\"}`;\n}\n\nfunction uniqueDiagnostics(values: string[]): string[] {\n return values.filter((value, index) => values.indexOf(value) === index);\n}\n\nfunction buildDiagnostics(message: string, options: FirebirdOptions): string[] {\n const diagnostics: string[] = [];\n const pluginMismatch = message.match(/Server don't accept plugin\\s*:\\s*([^,]+),\\s*but support\\s*:\\s*(.+)$/i);\n\n if (pluginMismatch) {\n const supportedPlugins = (pluginMismatch[2] ?? \"\")\n .split(\",\")\n .map((plugin) => plugin.trim())\n .filter((plugin) => plugin.length > 0);\n const supportedMessage = supportedPlugins.length === 1\n ? `The server explicitly reported that only the \"${supportedPlugins[0]}\" authentication plugin is supported.`\n : `The server explicitly reported the supported authentication plugins: ${supportedPlugins.join(\", \")}.`;\n diagnostics.push(supportedMessage);\n }\n\n if (/Incompatible wire encryption levels requested on client and server/i.test(message)) {\n diagnostics.push(\"The server rejected the requested wire encryption mode. Keep wire encryption auto-enabled unless the server is known to allow disabled encryption.\");\n }\n\n if (/No matching plugins on server/i.test(message)) {\n diagnostics.push(\"The server did not find a common authentication plugin with the client configuration.\");\n }\n\n if (/Connection timeout after \\d+ms/i.test(message) || /Timeout during Firebird attach after \\d+ ms/i.test(message)) {\n diagnostics.push(\"The TCP connection was accepted but the Firebird wire-protocol attach did not complete in time.\");\n }\n\n if (options.pluginName) {\n diagnostics.push(`Client authentication plugin was forced to \"${options.pluginName}\". Leave pluginName empty to let the driver auto-negotiate when possible.`);\n }\n\n if (!isBlank(options.wireCrypt)) {\n diagnostics.push(`Client wire encryption was forced to \"${formatWireCryptValue(options.wireCrypt)}\".`);\n }\n\n return uniqueDiagnostics(diagnostics);\n}\n\nfunction copyFirebirdMetadata(target: EnhancedFirebirdError, source: unknown): void {\n if (!source || typeof source !== \"object\") {\n return;\n }\n\n const firebirdSource = source as Record<string, unknown>;\n if (\"gdscode\" in firebirdSource) {\n target.gdscode = firebirdSource.gdscode as number;\n }\n\n if (\"gdsparams\" in firebirdSource) {\n target.gdsparams = firebirdSource.gdsparams;\n }\n}\n\nfunction formatFirebirdMetadata(source: unknown): string {\n if (!source || typeof source !== \"object\") {\n return \"\";\n }\n\n const firebirdSource = source as Record<string, unknown>;\n const metadata: string[] = [];\n\n if (typeof firebirdSource.gdscode === \"number\") {\n metadata.push(`gdscode=${firebirdSource.gdscode}`);\n }\n\n if (firebirdSource.gdsparams !== undefined) {\n try {\n metadata.push(`gdsparams=${JSON.stringify(firebirdSource.gdsparams)}`);\n } catch {\n metadata.push(`gdsparams=${String(firebirdSource.gdsparams)}`);\n }\n }\n\n return metadata.length > 0 ? ` Metadata: ${metadata.join(\", \")}.` : \"\";\n}\n\nexport function normalizeFirebirdOptions(options: Options): FirebirdOptions {\n const compatibilityOptions = options as FirebirdOptions;\n const {\n authPlugins: _authPlugins,\n compatibilityProbeTimeoutMs: _compatibilityProbeTimeoutMs,\n compatibilityTotalTimeoutMs,\n connectTimeoutMs,\n firebirdDriver: _firebirdDriver,\n logQueryParameters: _logQueryParameters,\n poolSize: _poolSize,\n trimStringResults,\n ...baseOptions\n } = compatibilityOptions;\n\n const normalizedOptions: FirebirdOptions = {\n ...baseOptions,\n pluginName: normalizeAuthPlugin(compatibilityOptions.pluginName),\n trimStringResults,\n wireCrypt: normalizeWireCryptMode(compatibilityOptions.wireCrypt),\n };\n\n const timeoutCandidate = compatibilityOptions.connectTimeout\n ?? connectTimeoutMs\n ?? compatibilityTotalTimeoutMs;\n\n if (Number.isFinite(timeoutCandidate) && Number(timeoutCandidate) > 0) {\n normalizedOptions.connectTimeout = Math.trunc(Number(timeoutCandidate));\n }\n\n return normalizedOptions;\n}\n\nexport function describeFirebirdCompatibilityOptions(options: Options): string {\n const normalized = normalizeFirebirdOptions(options);\n return `plugin=${normalized.pluginName ?? \"auto\"}, wireCrypt=${formatWireCryptValue(normalized.wireCrypt)}, connectTimeout=${normalized.connectTimeout ?? \"default\"}`;\n}\n\nexport function enhanceFirebirdError(error: unknown, options: Options, context: FirebirdErrorContext): Error {\n if (error instanceof Error && (error as EnhancedFirebirdError).__emilsoftwareFirebirdEnhanced) {\n return error;\n }\n\n const normalizedOptions = normalizeFirebirdOptions(options);\n const target = formatTarget(normalizedOptions);\n const original = error instanceof Error ? error : new Error(String(error));\n const diagnostics = buildDiagnostics(original.message, normalizedOptions);\n const sqlSuffix = context.sql ? ` SQL: ${context.sql.replace(/\\s+/g, \" \").trim()}` : \"\";\n const diagnosticsSuffix = diagnostics.length > 0 ? ` Diagnostics: ${diagnostics.join(\" \")}` : \"\";\n const metadataSuffix = formatFirebirdMetadata(original);\n const enhanced = new Error(\n `Firebird ${context.stage} failed on ${target}: ${original.message}.${diagnosticsSuffix}${metadataSuffix}${sqlSuffix}`\n ) as EnhancedFirebirdError;\n\n enhanced.cause = original;\n enhanced.__emilsoftwareFirebirdEnhanced = true;\n copyFirebirdMetadata(enhanced, original);\n enhanced.stack = `${enhanced.name}: ${enhanced.message}\\nCaused by: ${original.stack ?? original.message}`;\n return enhanced;\n}\n\nexport function buildFirebirdCompatibilityCandidates(options: Options): FirebirdOptions[] {\n return [normalizeFirebirdOptions(options)];\n}\n\nexport function shouldRetryFirebirdCompatibility(): boolean {\n return false;\n}\n\nexport function ensureEsNodeFirebirdCompatibilityPatch(): void {\n // No-op kept for backward compatibility. The library now relies on the\n // official node-firebird driver, which handles Firebird 2.5+ protocol\n // negotiation natively.\n}\n"]}
|
|
1
|
+
{"version":3,"file":"firebird-compat.js","sourceRoot":"","sources":["../src/firebird-compat.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DA,8BAUC;AAWD,0DAkCC;AAoJD,4DAgCC;AAED,oFAGC;AAED,oDAqBC;AAED,oFAEC;AAED,4EAEC;AAED,wFAIC;AApVD,wDAA0C;AAiD1C,SAAS,OAAO,CAAC,KAAc;IAC3B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACvG,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,SAAS,CAAC,IAAU;IAChC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,WAAW,EAAE,EAClB,IAAI,CAAC,QAAQ,EAAE,EACf,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,QAAQ,EAAE,EACf,IAAI,CAAC,UAAU,EAAE,EACjB,IAAI,CAAC,UAAU,EAAE,EACjB,IAAI,CAAC,eAAe,EAAE,CACzB,CAAC,CAAC;AACP,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,uBAAuB,CACnC,KAAc,EACd,iBAA0B,EAC1B,QAAiB;IAEjB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,YAAY,MAAM,EAAE,CAAC;QACvD,OAAO,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5D,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,UAAmC,EAAE,GAAW,EAAE,EAAE;YACnF,UAAU,CAAC,GAAG,CAAC,GAAG,uBAAuB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YACpF,OAAO,UAAU,CAAC;QACtB,CAAC,EAAE,EAAE,CAAC,CAAC;IACX,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAmC;IAC/D,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtD,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QAC5B,OAAO,QAAQ,CAAC,kBAAkB,CAAC;IACvC,CAAC;IAED,OAAO,QAAQ,CAAC,iBAAiB,CAAC;AACtC,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACvC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtD,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,aAAa,EAAE,CAAC;QAC1D,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAmC;IAC7D,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,KAAK,KAAK,QAAQ,CAAC,kBAAkB,EAAE,CAAC;YACxC,OAAO,UAAU,CAAC;QACtB,CAAC;QAED,IAAI,KAAK,KAAK,QAAQ,CAAC,iBAAiB,EAAE,CAAC;YACvC,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,YAAY,CAAC,OAAgB;;IAClC,OAAO,GAAG,MAAA,OAAO,CAAC,IAAI,mCAAI,GAAG,IAAI,MAAA,OAAO,CAAC,IAAI,mCAAI,GAAG,OAAO,MAAA,OAAO,CAAC,QAAQ,mCAAI,GAAG,EAAE,CAAC;AACzF,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAgB;IACvC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,OAAwB;;IAC/D,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAE7G,IAAI,cAAc,EAAE,CAAC;QACjB,MAAM,gBAAgB,GAAG,CAAC,MAAA,cAAc,CAAC,CAAC,CAAC,mCAAI,EAAE,CAAC;aAC7C,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;aAC9B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAClD,CAAC,CAAC,iDAAiD,gBAAgB,CAAC,CAAC,CAAC,uCAAuC;YAC7G,CAAC,CAAC,wEAAwE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC7G,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,qEAAqE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACtF,WAAW,CAAC,IAAI,CAAC,oJAAoJ,CAAC,CAAC;IAC3K,CAAC;IAED,IAAI,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,WAAW,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;IAC9G,CAAC;IAED,IAAI,iCAAiC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,8CAA8C,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClH,WAAW,CAAC,IAAI,CAAC,iGAAiG,CAAC,CAAC;IACxH,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,WAAW,CAAC,IAAI,CAAC,+CAA+C,OAAO,CAAC,UAAU,2EAA2E,CAAC,CAAC;IACnK,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,WAAW,CAAC,IAAI,CAAC,yCAAyC,oBAAoB,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3G,CAAC;IAED,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,oBAAoB,CAAC,MAA6B,EAAE,MAAe;IACxE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO;IACX,CAAC;IAED,MAAM,cAAc,GAAG,MAAiC,CAAC;IACzD,IAAI,SAAS,IAAI,cAAc,EAAE,CAAC;QAC9B,MAAM,CAAC,OAAO,GAAG,cAAc,CAAC,OAAiB,CAAC;IACtD,CAAC;IAED,IAAI,WAAW,IAAI,cAAc,EAAE,CAAC;QAChC,MAAM,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC;IAChD,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAe;IAC3C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,cAAc,GAAG,MAAiC,CAAC;IACzD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,IAAI,OAAO,cAAc,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,WAAW,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,cAAc,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACzC,IAAI,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;QAAC,WAAM,CAAC;YACL,QAAQ,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED,SAAgB,wBAAwB,CAAC,OAAgB;;IACrD,MAAM,oBAAoB,GAAG,OAA0B,CAAC;IACxD,MAAM,EACF,WAAW,EAAE,YAAY,EACzB,2BAA2B,EAAE,4BAA4B,EACzD,2BAA2B,EAC3B,gBAAgB,EAChB,cAAc,EAAE,eAAe,EAC/B,kBAAkB,EAAE,mBAAmB,EACvC,QAAQ,EAAE,SAAS,EACnB,iBAAiB,EACjB,QAAQ,KAER,oBAAoB,EADjB,WAAW,UACd,oBAAoB,EAXlB,sLAWL,CAAuB,CAAC;IAEzB,MAAM,iBAAiB,mCAChB,WAAW,KACd,UAAU,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,UAAU,CAAC,EAChE,iBAAiB;QACjB,QAAQ,EACR,SAAS,EAAE,sBAAsB,CAAC,oBAAoB,CAAC,SAAS,CAAC,GACpE,CAAC;IAEF,MAAM,gBAAgB,GAAG,MAAA,MAAA,oBAAoB,CAAC,cAAc,mCACrD,gBAAgB,mCAChB,2BAA2B,CAAC;IAEnC,IAAI,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QACpE,iBAAiB,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,iBAAiB,CAAC;AAC7B,CAAC;AAED,SAAgB,oCAAoC,CAAC,OAAgB;;IACjE,MAAM,UAAU,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACrD,OAAO,UAAU,MAAA,UAAU,CAAC,UAAU,mCAAI,MAAM,eAAe,oBAAoB,CAAC,UAAU,CAAC,SAAS,CAAC,oBAAoB,MAAA,UAAU,CAAC,cAAc,mCAAI,SAAS,EAAE,CAAC;AAC1K,CAAC;AAED,SAAgB,oBAAoB,CAAC,KAAc,EAAE,OAAgB,EAAE,OAA6B;;IAChG,IAAI,KAAK,YAAY,KAAK,IAAK,KAA+B,CAAC,8BAA8B,EAAE,CAAC;QAC5F,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACjG,MAAM,cAAc,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,IAAI,KAAK,CACtB,YAAY,OAAO,CAAC,KAAK,cAAc,MAAM,KAAK,QAAQ,CAAC,OAAO,IAAI,iBAAiB,GAAG,cAAc,GAAG,SAAS,EAAE,CAChG,CAAC;IAE3B,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC;IAC1B,QAAQ,CAAC,8BAA8B,GAAG,IAAI,CAAC;IAC/C,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,KAAK,GAAG,GAAG,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,gBAAgB,MAAA,QAAQ,CAAC,KAAK,mCAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC3G,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED,SAAgB,oCAAoC,CAAC,OAAgB;IACjE,OAAO,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,gCAAgC;IAC5C,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAgB,sCAAsC;IAClD,uEAAuE;IACvE,sEAAsE;IACtE,wBAAwB;AAC5B,CAAC","sourcesContent":["import * as Firebird from \"node-firebird\";\nimport type { Options } from \"node-firebird\";\n\nexport type FirebirdWireCryptMode = \"disabled\" | \"enabled\" | \"required\";\nexport type FirebirdAuthPlugin = \"Legacy_Auth\" | \"Srp\" | \"Srp256\" | \"Srp384\" | \"Srp512\";\nexport type FirebirdDriverStrategy = \"modern\";\n\nexport type FirebirdOptions = Options & {\n wireCrypt?: FirebirdWireCryptMode | number;\n pluginName?: FirebirdAuthPlugin;\n authPlugins?: FirebirdAuthPlugin[];\n connectTimeoutMs?: number;\n compatibilityProbeTimeoutMs?: number;\n compatibilityTotalTimeoutMs?: number;\n firebirdDriver?: FirebirdDriverStrategy;\n trimStringResults?: boolean;\n /**\n * When `true` (default), DATE/TIME/TIMESTAMP values are returned as UTC,\n * reproducing the legacy `es-node-firebird` fork behaviour. When `false`,\n * the values are left as decoded by `node-firebird` (local time).\n */\n utcDates?: boolean;\n /**\n * When `true`, query parameters are interpolated into the logged SQL. Off by\n * default so that secrets, credentials and personal data are not written to\n * the console or to the daily log files.\n */\n logQueryParameters?: boolean;\n /**\n * When greater than zero, enables an opt-in connection pool of the given\n * maximum size for this connection target instead of attaching/detaching a\n * physical connection for every query. Default `0` keeps the historic\n * one-connection-per-query behaviour.\n */\n poolSize?: number;\n};\n\ntype FirebirdErrorContext = {\n stage: \"attach\" | \"query\" | \"execute\" | \"transaction\";\n sql?: string;\n};\n\ntype EnhancedFirebirdError = Error & {\n cause?: unknown;\n gdscode?: number;\n gdsparams?: unknown;\n __emilsoftwareFirebirdEnhanced?: boolean;\n};\n\nfunction isBlank(value: unknown): boolean {\n return value === undefined || value === null || (typeof value === \"string\" && value.trim() === \"\");\n}\n\n/**\n * Reinterprets a Date's local wall-clock components as UTC.\n *\n * `node-firebird` 2.x decodes Firebird DATE/TIME/TIMESTAMP (which are\n * timezone-less) as *local* time via `setMilliseconds(... + getTimezoneOffset())`.\n * The legacy `es-node-firebird` fork instead decoded them as UTC\n * (`setUTCMilliseconds`). This helper reproduces that legacy behaviour by\n * taking the local wall-clock fields and rebuilding the Date as if they were\n * UTC, so existing applications keep seeing the same values.\n */\nexport function toUtcDate(date: Date): Date {\n return new Date(Date.UTC(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n ));\n}\n\n/**\n * Normalizes a decoded Firebird result value to reproduce the legacy\n * `es-node-firebird` fork behaviour:\n *\n * - strings are trimmed (the fork called `.trim()` on every text field);\n * - `Date` values are reinterpreted as UTC (the fork used `setUTCMilliseconds`);\n * - arrays and plain objects are normalized recursively;\n * - `Buffer`, `null` and `undefined` are left untouched.\n */\nexport function normalizeFirebirdResult(\n value: unknown,\n trimStringResults: boolean,\n utcDates: boolean,\n): unknown {\n if (value === undefined || value === null) {\n return value;\n }\n\n if (typeof value === \"string\" || value instanceof String) {\n return trimStringResults ? String(value).trim() : value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => normalizeFirebirdResult(item, trimStringResults, utcDates));\n }\n\n if (value instanceof Date) {\n return utcDates ? toUtcDate(value) : value;\n }\n\n if (Buffer.isBuffer(value)) {\n return value;\n }\n\n if (typeof value === \"object\") {\n const source = value as Record<string, unknown>;\n return Object.keys(source).reduce((normalized: Record<string, unknown>, key: string) => {\n normalized[key] = normalizeFirebirdResult(source[key], trimStringResults, utcDates);\n return normalized;\n }, {});\n }\n\n return value;\n}\n\nfunction normalizeWireCryptMode(value: FirebirdOptions[\"wireCrypt\"]): number | undefined {\n if (isBlank(value)) {\n return undefined;\n }\n\n if (typeof value === \"number\") {\n return value;\n }\n\n const normalized = String(value).trim().toLowerCase();\n if (normalized === \"disabled\") {\n return Firebird.WIRE_CRYPT_DISABLE;\n }\n\n return Firebird.WIRE_CRYPT_ENABLE;\n}\n\nfunction normalizeAuthPlugin(value: unknown): FirebirdAuthPlugin | undefined {\n if (isBlank(value)) {\n return undefined;\n }\n\n const normalized = String(value).trim().toLowerCase();\n if (normalized === \"legacy\" || normalized === \"legacy_auth\") {\n return \"Legacy_Auth\";\n }\n\n if (normalized === \"srp256\") {\n return \"Srp256\";\n }\n\n if (normalized === \"srp384\") {\n return \"Srp384\";\n }\n\n if (normalized === \"srp512\") {\n return \"Srp512\";\n }\n\n return \"Srp\";\n}\n\nfunction formatWireCryptValue(value: FirebirdOptions[\"wireCrypt\"]): string {\n if (isBlank(value)) {\n return \"auto\";\n }\n\n if (typeof value === \"number\") {\n if (value === Firebird.WIRE_CRYPT_DISABLE) {\n return \"disabled\";\n }\n\n if (value === Firebird.WIRE_CRYPT_ENABLE) {\n return \"enabled\";\n }\n\n return String(value);\n }\n\n return String(value);\n}\n\nfunction formatTarget(options: Options): string {\n return `${options.host ?? \"?\"}:${options.port ?? \"?\"} -> ${options.database ?? \"?\"}`;\n}\n\nfunction uniqueDiagnostics(values: string[]): string[] {\n return values.filter((value, index) => values.indexOf(value) === index);\n}\n\nfunction buildDiagnostics(message: string, options: FirebirdOptions): string[] {\n const diagnostics: string[] = [];\n const pluginMismatch = message.match(/Server don't accept plugin\\s*:\\s*([^,]+),\\s*but support\\s*:\\s*(.+)$/i);\n\n if (pluginMismatch) {\n const supportedPlugins = (pluginMismatch[2] ?? \"\")\n .split(\",\")\n .map((plugin) => plugin.trim())\n .filter((plugin) => plugin.length > 0);\n const supportedMessage = supportedPlugins.length === 1\n ? `The server explicitly reported that only the \"${supportedPlugins[0]}\" authentication plugin is supported.`\n : `The server explicitly reported the supported authentication plugins: ${supportedPlugins.join(\", \")}.`;\n diagnostics.push(supportedMessage);\n }\n\n if (/Incompatible wire encryption levels requested on client and server/i.test(message)) {\n diagnostics.push(\"The server rejected the requested wire encryption mode. Keep wire encryption auto-enabled unless the server is known to allow disabled encryption.\");\n }\n\n if (/No matching plugins on server/i.test(message)) {\n diagnostics.push(\"The server did not find a common authentication plugin with the client configuration.\");\n }\n\n if (/Connection timeout after \\d+ms/i.test(message) || /Timeout during Firebird attach after \\d+ ms/i.test(message)) {\n diagnostics.push(\"The TCP connection was accepted but the Firebird wire-protocol attach did not complete in time.\");\n }\n\n if (options.pluginName) {\n diagnostics.push(`Client authentication plugin was forced to \"${options.pluginName}\". Leave pluginName empty to let the driver auto-negotiate when possible.`);\n }\n\n if (!isBlank(options.wireCrypt)) {\n diagnostics.push(`Client wire encryption was forced to \"${formatWireCryptValue(options.wireCrypt)}\".`);\n }\n\n return uniqueDiagnostics(diagnostics);\n}\n\nfunction copyFirebirdMetadata(target: EnhancedFirebirdError, source: unknown): void {\n if (!source || typeof source !== \"object\") {\n return;\n }\n\n const firebirdSource = source as Record<string, unknown>;\n if (\"gdscode\" in firebirdSource) {\n target.gdscode = firebirdSource.gdscode as number;\n }\n\n if (\"gdsparams\" in firebirdSource) {\n target.gdsparams = firebirdSource.gdsparams;\n }\n}\n\nfunction formatFirebirdMetadata(source: unknown): string {\n if (!source || typeof source !== \"object\") {\n return \"\";\n }\n\n const firebirdSource = source as Record<string, unknown>;\n const metadata: string[] = [];\n\n if (typeof firebirdSource.gdscode === \"number\") {\n metadata.push(`gdscode=${firebirdSource.gdscode}`);\n }\n\n if (firebirdSource.gdsparams !== undefined) {\n try {\n metadata.push(`gdsparams=${JSON.stringify(firebirdSource.gdsparams)}`);\n } catch {\n metadata.push(`gdsparams=${String(firebirdSource.gdsparams)}`);\n }\n }\n\n return metadata.length > 0 ? ` Metadata: ${metadata.join(\", \")}.` : \"\";\n}\n\nexport function normalizeFirebirdOptions(options: Options): FirebirdOptions {\n const compatibilityOptions = options as FirebirdOptions;\n const {\n authPlugins: _authPlugins,\n compatibilityProbeTimeoutMs: _compatibilityProbeTimeoutMs,\n compatibilityTotalTimeoutMs,\n connectTimeoutMs,\n firebirdDriver: _firebirdDriver,\n logQueryParameters: _logQueryParameters,\n poolSize: _poolSize,\n trimStringResults,\n utcDates,\n ...baseOptions\n } = compatibilityOptions;\n\n const normalizedOptions: FirebirdOptions = {\n ...baseOptions,\n pluginName: normalizeAuthPlugin(compatibilityOptions.pluginName),\n trimStringResults,\n utcDates,\n wireCrypt: normalizeWireCryptMode(compatibilityOptions.wireCrypt),\n };\n\n const timeoutCandidate = compatibilityOptions.connectTimeout\n ?? connectTimeoutMs\n ?? compatibilityTotalTimeoutMs;\n\n if (Number.isFinite(timeoutCandidate) && Number(timeoutCandidate) > 0) {\n normalizedOptions.connectTimeout = Math.trunc(Number(timeoutCandidate));\n }\n\n return normalizedOptions;\n}\n\nexport function describeFirebirdCompatibilityOptions(options: Options): string {\n const normalized = normalizeFirebirdOptions(options);\n return `plugin=${normalized.pluginName ?? \"auto\"}, wireCrypt=${formatWireCryptValue(normalized.wireCrypt)}, connectTimeout=${normalized.connectTimeout ?? \"default\"}`;\n}\n\nexport function enhanceFirebirdError(error: unknown, options: Options, context: FirebirdErrorContext): Error {\n if (error instanceof Error && (error as EnhancedFirebirdError).__emilsoftwareFirebirdEnhanced) {\n return error;\n }\n\n const normalizedOptions = normalizeFirebirdOptions(options);\n const target = formatTarget(normalizedOptions);\n const original = error instanceof Error ? error : new Error(String(error));\n const diagnostics = buildDiagnostics(original.message, normalizedOptions);\n const sqlSuffix = context.sql ? ` SQL: ${context.sql.replace(/\\s+/g, \" \").trim()}` : \"\";\n const diagnosticsSuffix = diagnostics.length > 0 ? ` Diagnostics: ${diagnostics.join(\" \")}` : \"\";\n const metadataSuffix = formatFirebirdMetadata(original);\n const enhanced = new Error(\n `Firebird ${context.stage} failed on ${target}: ${original.message}.${diagnosticsSuffix}${metadataSuffix}${sqlSuffix}`\n ) as EnhancedFirebirdError;\n\n enhanced.cause = original;\n enhanced.__emilsoftwareFirebirdEnhanced = true;\n copyFirebirdMetadata(enhanced, original);\n enhanced.stack = `${enhanced.name}: ${enhanced.message}\\nCaused by: ${original.stack ?? original.message}`;\n return enhanced;\n}\n\nexport function buildFirebirdCompatibilityCandidates(options: Options): FirebirdOptions[] {\n return [normalizeFirebirdOptions(options)];\n}\n\nexport function shouldRetryFirebirdCompatibility(): boolean {\n return false;\n}\n\nexport function ensureEsNodeFirebirdCompatibilityPatch(): void {\n // No-op kept for backward compatibility. The library now relies on the\n // official node-firebird driver, which handles Firebird 2.5+ protocol\n // negotiation natively.\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "emilsoftware-utilities",
|
|
3
|
-
"version": "2.0.0-dev.
|
|
3
|
+
"version": "2.0.0-dev.66",
|
|
4
4
|
"description": "Utilities for EmilSoftware",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"jspdf-autotable": "^5.0.2",
|
|
68
68
|
"multer": "^1.4.5-lts.2",
|
|
69
69
|
"node-fetch": "^3.3.2",
|
|
70
|
-
"node-firebird": "^2.
|
|
70
|
+
"node-firebird": "^2.19.1",
|
|
71
71
|
"nodemailer": "^6.10.0",
|
|
72
72
|
"reflect-metadata": "^0.2.2",
|
|
73
73
|
"swagger-jsdoc": "^6.2.8",
|
|
Binary file
|