emilsoftware-utilities 2.0.0-dev.3 → 2.0.0-dev.5

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/dist/Orm.d.ts CHANGED
@@ -1,9 +1,14 @@
1
1
  import { Database, Options, Transaction } from "es-node-firebird";
2
2
  export declare class Orm {
3
3
  private static logger;
4
+ private static compatibilityProfileCache;
4
5
  static quote(value: string): string;
5
6
  private static getTimeoutMs;
6
7
  private static createTimeoutError;
8
+ private static createCompatibilityCacheKey;
9
+ private static getProbeTimeoutMs;
10
+ private static reorderCandidatesWithCache;
11
+ private static createCompatibilitySummaryError;
7
12
  private static detachQuietly;
8
13
  private static attachOnceWithTimeout;
9
14
  private static attachWithTimeout;
package/dist/Orm.js CHANGED
@@ -53,8 +53,8 @@ class Orm {
53
53
  return "\"" + value + "\"";
54
54
  }
55
55
  static getTimeoutMs(options) {
56
- var _a, _b;
57
- const candidate = (_b = (_a = options.connectTimeoutMs) !== null && _a !== void 0 ? _a : options.connectTimeout) !== null && _b !== void 0 ? _b : 15000;
56
+ var _a, _b, _c;
57
+ const candidate = (_c = (_b = (_a = options.connectTimeoutMs) !== null && _a !== void 0 ? _a : options.compatibilityTotalTimeoutMs) !== null && _b !== void 0 ? _b : options.connectTimeout) !== null && _c !== void 0 ? _c : 15000;
58
58
  return Number.isFinite(candidate) && candidate > 0 ? Math.trunc(candidate) : 15000;
59
59
  }
60
60
  static createTimeoutError(stage, timeoutMs, options, query) {
@@ -63,6 +63,54 @@ class Orm {
63
63
  const suffix = query ? ` | sql=${query.replace(/\s+/g, " ").trim()}` : "";
64
64
  return new Error(`Timeout during Firebird ${stage} after ${timeoutMs} ms on ${target}${suffix}`);
65
65
  }
66
+ static createCompatibilityCacheKey(options) {
67
+ var _a, _b, _c, _d;
68
+ return [
69
+ (_a = options.host) !== null && _a !== void 0 ? _a : "?",
70
+ (_b = options.port) !== null && _b !== void 0 ? _b : "?",
71
+ (_c = options.database) !== null && _c !== void 0 ? _c : "?",
72
+ (_d = options.user) !== null && _d !== void 0 ? _d : "?",
73
+ ].join("|");
74
+ }
75
+ static getProbeTimeoutMs(options, candidateCount) {
76
+ const configured = options.compatibilityProbeTimeoutMs;
77
+ if (Number.isFinite(configured) && configured > 0) {
78
+ return Math.trunc(configured);
79
+ }
80
+ const totalTimeoutMs = this.getTimeoutMs(options);
81
+ if (candidateCount <= 1) {
82
+ return totalTimeoutMs;
83
+ }
84
+ return Math.max(2500, Math.min(5000, Math.trunc(totalTimeoutMs / candidateCount)));
85
+ }
86
+ static reorderCandidatesWithCache(options, candidates) {
87
+ const cacheKey = this.createCompatibilityCacheKey(options);
88
+ const cachedCandidate = this.compatibilityProfileCache.get(cacheKey);
89
+ if (!cachedCandidate) {
90
+ return candidates;
91
+ }
92
+ const ordered = [...candidates];
93
+ const cachedDescription = (0, firebird_compat_1.describeFirebirdCompatibilityOptions)(cachedCandidate);
94
+ const cachedIndex = ordered.findIndex((candidate) => (0, firebird_compat_1.describeFirebirdCompatibilityOptions)(candidate) === cachedDescription);
95
+ if (cachedIndex <= 0) {
96
+ return ordered;
97
+ }
98
+ const [matchedCandidate] = ordered.splice(cachedIndex, 1);
99
+ ordered.unshift(matchedCandidate);
100
+ return ordered;
101
+ }
102
+ static createCompatibilitySummaryError(options, attempts) {
103
+ var _a, _b, _c;
104
+ const target = `${(_a = options.host) !== null && _a !== void 0 ? _a : "?"}:${(_b = options.port) !== null && _b !== void 0 ? _b : "?"} -> ${(_c = options.database) !== null && _c !== void 0 ? _c : "?"}`;
105
+ const attemptsSummary = attempts
106
+ .map(({ candidate, error }) => {
107
+ var _a, _b;
108
+ const errorMessage = String((_b = (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : error) !== null && _b !== void 0 ? _b : "Unknown error");
109
+ return `[${(0, firebird_compat_1.describeFirebirdCompatibilityOptions)(candidate)} => ${errorMessage}]`;
110
+ })
111
+ .join("; ");
112
+ return new Error(`Unable to attach Firebird database after compatibility probing on ${target}. Attempts: ${attemptsSummary}`);
113
+ }
66
114
  static detachQuietly(db) {
67
115
  return __awaiter(this, void 0, void 0, function* () {
68
116
  if (!db) {
@@ -78,9 +126,8 @@ class Orm {
78
126
  });
79
127
  });
80
128
  }
81
- static attachOnceWithTimeout(options) {
129
+ static attachOnceWithTimeout(options, timeoutMs = this.getTimeoutMs(options)) {
82
130
  return new Promise((resolve, reject) => {
83
- const timeoutMs = this.getTimeoutMs(options);
84
131
  let settled = false;
85
132
  const timeoutId = setTimeout(() => {
86
133
  if (settled) {
@@ -107,25 +154,42 @@ class Orm {
107
154
  static attachWithTimeout(options) {
108
155
  return __awaiter(this, void 0, void 0, function* () {
109
156
  var _a;
110
- const candidates = (0, firebird_compat_1.buildFirebirdCompatibilityCandidates)(options);
111
- let lastError;
157
+ const totalTimeoutMs = this.getTimeoutMs(options);
158
+ const candidates = this.reorderCandidatesWithCache(options, (0, firebird_compat_1.buildFirebirdCompatibilityCandidates)(options));
159
+ const probeTimeoutMs = this.getProbeTimeoutMs(options, candidates.length);
160
+ const startedAt = Date.now();
161
+ const attempts = [];
162
+ const cacheKey = this.createCompatibilityCacheKey(options);
112
163
  for (let index = 0; index < candidates.length; index++) {
113
164
  const candidate = candidates[index];
165
+ const elapsedMs = Date.now() - startedAt;
166
+ const remainingMs = totalTimeoutMs - elapsedMs;
167
+ if (remainingMs <= 0) {
168
+ break;
169
+ }
170
+ const attemptTimeoutMs = index === 0 && candidates.length === 1
171
+ ? remainingMs
172
+ : Math.min(probeTimeoutMs, remainingMs);
114
173
  try {
115
- if (index > 0) {
116
- this.logger.warning(`Retry Firebird attach with compatibility fallback ${index + 1}/${candidates.length}: ${(0, firebird_compat_1.describeFirebirdCompatibilityOptions)(candidate)}`);
174
+ if (candidates.length > 1) {
175
+ this.logger.info(`Firebird compatibility probe ${index + 1}/${candidates.length}: ${(0, firebird_compat_1.describeFirebirdCompatibilityOptions)(candidate)} (timeout ${attemptTimeoutMs} ms)`);
176
+ }
177
+ const db = yield this.attachOnceWithTimeout(candidate, attemptTimeoutMs);
178
+ this.compatibilityProfileCache.set(cacheKey, candidate);
179
+ if (candidates.length > 1) {
180
+ this.logger.info(`Firebird compatibility profile selected: ${(0, firebird_compat_1.describeFirebirdCompatibilityOptions)(candidate)}`);
117
181
  }
118
- return yield this.attachOnceWithTimeout(candidate);
182
+ return db;
119
183
  }
120
184
  catch (error) {
121
- lastError = error;
185
+ attempts.push({ candidate, error });
122
186
  if (!(0, firebird_compat_1.shouldRetryFirebirdCompatibility)(error) || index === candidates.length - 1) {
123
- throw error;
187
+ throw this.createCompatibilitySummaryError(options, attempts);
124
188
  }
125
- this.logger.warning(`Firebird attach failed with ${(0, firebird_compat_1.describeFirebirdCompatibilityOptions)(candidate)}. Retrying compatibility fallback. Error: ${String((_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : error)}`);
189
+ this.logger.warning(`Firebird attach failed with ${(0, firebird_compat_1.describeFirebirdCompatibilityOptions)(candidate)}. Trying next compatibility profile. Error: ${String((_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : error)}`);
126
190
  }
127
191
  }
128
- throw lastError;
192
+ throw this.createCompatibilitySummaryError(options, attempts);
129
193
  });
130
194
  }
131
195
  static testConnection(options) {
@@ -333,4 +397,5 @@ class Orm {
333
397
  }
334
398
  exports.Orm = Orm;
335
399
  Orm.logger = new Logger_1.Logger(Orm.name);
400
+ Orm.compatibilityProfileCache = new Map();
336
401
  //# sourceMappingURL=Orm.js.map
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 \"es-node-firebird\";\nimport { Logger } from \"./Logger\";\nimport { Database, Options, Transaction } from \"es-node-firebird\";\nimport { RestUtilities } from \"./Utilities\";\nimport {\n buildFirebirdCompatibilityCandidates,\n describeFirebirdCompatibilityOptions,\n ensureEsNodeFirebirdCompatibilityPatch,\n FirebirdOptions,\n shouldRetryFirebirdCompatibility,\n} from \"./firebird-compat\";\n\nensureEsNodeFirebirdCompatibilityPatch();\n\nexport class Orm {\n private static logger: Logger = new Logger(Orm.name);\n\n public static quote(value: string): string {\n return \"\\\"\" + value + \"\\\"\";\n }\n\n private static getTimeoutMs(options: Options): number {\n const candidate = (options as FirebirdOptions).connectTimeoutMs\n ?? (options as FirebirdOptions).connectTimeout\n ?? 15000;\n\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 attachOnceWithTimeout(options: Options): Promise<Database> {\n return new Promise((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(options);\n let settled = false;\n const timeoutId = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n reject(this.createTimeoutError(\"attach\", timeoutMs, options));\n }, timeoutMs);\n\n Firebird.attach(options, async (err: any, 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 this.logger.error(err);\n return reject(err);\n }\n\n return resolve(db);\n });\n });\n }\n\n private static async attachWithTimeout(options: Options): Promise<Database> {\n const candidates = buildFirebirdCompatibilityCandidates(options);\n let lastError: unknown;\n\n for (let index = 0; index < candidates.length; index++) {\n const candidate = candidates[index];\n\n try {\n if (index > 0) {\n this.logger.warning(\n `Retry Firebird attach with compatibility fallback ${index + 1}/${candidates.length}: ${describeFirebirdCompatibilityOptions(candidate)}`\n );\n }\n\n return await this.attachOnceWithTimeout(candidate);\n } catch (error) {\n lastError = error;\n\n if (!shouldRetryFirebirdCompatibility(error) || index === candidates.length - 1) {\n throw error;\n }\n\n this.logger.warning(\n `Firebird attach failed with ${describeFirebirdCompatibilityOptions(candidate)}. Retrying compatibility fallback. Error: ${String((error as { message?: unknown })?.message ?? error)}`\n );\n }\n }\n\n throw lastError;\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(options: Options, query: string, parameters: any[] = [], logQuery = true): Promise<any> {\n try {\n const db = await this.attachWithTimeout(options);\n\n return await new Promise((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(options);\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(this.createTimeoutError(\"query\", timeoutMs, options, query));\n }, timeoutMs);\n\n if (logQuery) {\n this.logger.info(RestUtilities.printQueryWithParams(query, parameters));\n }\n\n db.query(query, parameters, async (error: any, result: any) => {\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 this.logger.error(error);\n return reject(error);\n }\n\n return resolve(result);\n });\n });\n } catch (error) {\n this.logger.error(error as object);\n throw error;\n }\n }\n\n public static async execute(options: Options, query: string, parameters: any = [], logQuery = true): Promise<any> {\n try {\n const db = await this.attachWithTimeout(options);\n\n return await new Promise((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(options);\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(this.createTimeoutError(\"execute\", timeoutMs, options, query));\n }, timeoutMs);\n\n if (logQuery) {\n this.logger.info(RestUtilities.printQueryWithParams(query, parameters));\n }\n\n db.execute(query, parameters, async (error: any, result: any) => {\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 this.logger.error(error);\n return reject(error);\n }\n\n return resolve(result);\n });\n });\n } catch (error) {\n this.logger.error(error as object);\n throw error;\n }\n }\n\n public static trimParam(param: any): string {\n if (typeof param === \"string\" || param instanceof String) {\n return 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 public static async startTransaction(db: Database): Promise<Transaction> {\n return new Promise((resolve, reject): void => {\n db.transaction(Firebird.ISOLATION_READ_COMMITTED, function (err: any, transaction: Transaction): void {\n if (err) return reject(err); else 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: any): void => {\n if (err) return reject(err); else 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: any): void => {\n if (err) return reject(err); else return resolve(\"Transaction rolled back successfully.\");\n });\n });\n }\n\n public static async executeMultiple(options: Options, queriesWithParams: { query: string, params: any[] }[]): Promise<string> {\n let db: Database | undefined;\n let transaction: Transaction | undefined;\n\n try {\n db = await Orm.connect(options);\n transaction = await Orm.startTransaction(db);\n\n for (const qwp of queriesWithParams) {\n await new Promise((resolve, reject) => {\n transaction.query(qwp.query, qwp.params, (err: any, result: any): void => {\n if (err) return reject(err);\n else return resolve(result);\n });\n });\n }\n\n await Orm.commitTransaction(transaction);\n await Orm.detachQuietly(db);\n return \"OK\";\n\n } catch (error) {\n if (transaction) {\n await Orm.rollbackTransaction(transaction);\n }\n await Orm.detachQuietly(db);\n throw error;\n }\n }\n\n public static async executeQueries(transaction: Transaction, queries: string[], params: any[]): Promise<any> {\n try {\n return await queries.reduce((promiseChain: Promise<any>, currentQuery: string, index: number) => {\n return promiseChain.then(() => new Promise((resolve, reject) => {\n transaction.query(currentQuery, params[index], (err: any, result: any): void => {\n if (err) return reject(err);\n else return resolve(result);\n });\n }));\n }, Promise.resolve());\n } catch (error) {\n return await new Promise((resolve, reject) => {\n transaction.rollback((rollbackErr: any): void => {\n if (rollbackErr) {\n return reject(rollbackErr);\n } else {\n return reject(error);\n }\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 \"es-node-firebird\";\nimport { Logger } from \"./Logger\";\nimport { Database, Options, Transaction } from \"es-node-firebird\";\nimport { RestUtilities } from \"./Utilities\";\nimport {\n buildFirebirdCompatibilityCandidates,\n describeFirebirdCompatibilityOptions,\n ensureEsNodeFirebirdCompatibilityPatch,\n FirebirdOptions,\n shouldRetryFirebirdCompatibility,\n} from \"./firebird-compat\";\n\nensureEsNodeFirebirdCompatibilityPatch();\n\nexport class Orm {\n private static logger: Logger = new Logger(Orm.name);\n private static compatibilityProfileCache: Map<string, FirebirdOptions> = new Map<string, FirebirdOptions>();\n\n public static quote(value: string): string {\n return \"\\\"\" + value + \"\\\"\";\n }\n\n private static getTimeoutMs(options: Options): number {\n const candidate = (options as FirebirdOptions).connectTimeoutMs\n ?? (options as FirebirdOptions).compatibilityTotalTimeoutMs\n ?? (options as FirebirdOptions).connectTimeout\n ?? 15000;\n\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 createCompatibilityCacheKey(options: Options): string {\n return [\n options.host ?? \"?\",\n options.port ?? \"?\",\n options.database ?? \"?\",\n options.user ?? \"?\",\n ].join(\"|\");\n }\n\n private static getProbeTimeoutMs(options: Options, candidateCount: number): number {\n const configured = (options as FirebirdOptions).compatibilityProbeTimeoutMs;\n if (Number.isFinite(configured) && configured! > 0) {\n return Math.trunc(configured!);\n }\n\n const totalTimeoutMs = this.getTimeoutMs(options);\n if (candidateCount <= 1) {\n return totalTimeoutMs;\n }\n\n return Math.max(2500, Math.min(5000, Math.trunc(totalTimeoutMs / candidateCount)));\n }\n\n private static reorderCandidatesWithCache(options: Options, candidates: FirebirdOptions[]): FirebirdOptions[] {\n const cacheKey = this.createCompatibilityCacheKey(options);\n const cachedCandidate = this.compatibilityProfileCache.get(cacheKey);\n if (!cachedCandidate) {\n return candidates;\n }\n\n const ordered = [...candidates];\n const cachedDescription = describeFirebirdCompatibilityOptions(cachedCandidate);\n const cachedIndex = ordered.findIndex((candidate) => describeFirebirdCompatibilityOptions(candidate) === cachedDescription);\n\n if (cachedIndex <= 0) {\n return ordered;\n }\n\n const [matchedCandidate] = ordered.splice(cachedIndex, 1);\n ordered.unshift(matchedCandidate);\n return ordered;\n }\n\n private static createCompatibilitySummaryError(options: Options, attempts: { candidate: FirebirdOptions, error: unknown }[]): Error {\n const target = `${options.host ?? \"?\"}:${options.port ?? \"?\"} -> ${options.database ?? \"?\"}`;\n const attemptsSummary = attempts\n .map(({ candidate, error }) => {\n const errorMessage = String((error as { message?: unknown })?.message ?? error ?? \"Unknown error\");\n return `[${describeFirebirdCompatibilityOptions(candidate)} => ${errorMessage}]`;\n })\n .join(\"; \");\n\n return new Error(`Unable to attach Firebird database after compatibility probing on ${target}. Attempts: ${attemptsSummary}`);\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 attachOnceWithTimeout(options: Options, timeoutMs = this.getTimeoutMs(options)): Promise<Database> {\n return new Promise((resolve, reject): void => {\n let settled = false;\n const timeoutId = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n reject(this.createTimeoutError(\"attach\", timeoutMs, options));\n }, timeoutMs);\n\n Firebird.attach(options, async (err: any, 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 this.logger.error(err);\n return reject(err);\n }\n\n return resolve(db);\n });\n });\n }\n\n private static async attachWithTimeout(options: Options): Promise<Database> {\n const totalTimeoutMs = this.getTimeoutMs(options);\n const candidates = this.reorderCandidatesWithCache(options, buildFirebirdCompatibilityCandidates(options));\n const probeTimeoutMs = this.getProbeTimeoutMs(options, candidates.length);\n const startedAt = Date.now();\n const attempts: { candidate: FirebirdOptions, error: unknown }[] = [];\n const cacheKey = this.createCompatibilityCacheKey(options);\n\n for (let index = 0; index < candidates.length; index++) {\n const candidate = candidates[index];\n const elapsedMs = Date.now() - startedAt;\n const remainingMs = totalTimeoutMs - elapsedMs;\n\n if (remainingMs <= 0) {\n break;\n }\n\n const attemptTimeoutMs = index === 0 && candidates.length === 1\n ? remainingMs\n : Math.min(probeTimeoutMs, remainingMs);\n\n try {\n if (candidates.length > 1) {\n this.logger.info(\n `Firebird compatibility probe ${index + 1}/${candidates.length}: ${describeFirebirdCompatibilityOptions(candidate)} (timeout ${attemptTimeoutMs} ms)`\n );\n }\n\n const db = await this.attachOnceWithTimeout(candidate, attemptTimeoutMs);\n this.compatibilityProfileCache.set(cacheKey, candidate);\n\n if (candidates.length > 1) {\n this.logger.info(\n `Firebird compatibility profile selected: ${describeFirebirdCompatibilityOptions(candidate)}`\n );\n }\n\n return db;\n } catch (error) {\n attempts.push({ candidate, error });\n\n if (!shouldRetryFirebirdCompatibility(error) || index === candidates.length - 1) {\n throw this.createCompatibilitySummaryError(options, attempts);\n }\n\n this.logger.warning(\n `Firebird attach failed with ${describeFirebirdCompatibilityOptions(candidate)}. Trying next compatibility profile. Error: ${String((error as { message?: unknown })?.message ?? error)}`\n );\n }\n }\n\n throw this.createCompatibilitySummaryError(options, attempts);\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(options: Options, query: string, parameters: any[] = [], logQuery = true): Promise<any> {\n try {\n const db = await this.attachWithTimeout(options);\n\n return await new Promise((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(options);\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(this.createTimeoutError(\"query\", timeoutMs, options, query));\n }, timeoutMs);\n\n if (logQuery) {\n this.logger.info(RestUtilities.printQueryWithParams(query, parameters));\n }\n\n db.query(query, parameters, async (error: any, result: any) => {\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 this.logger.error(error);\n return reject(error);\n }\n\n return resolve(result);\n });\n });\n } catch (error) {\n this.logger.error(error as object);\n throw error;\n }\n }\n\n public static async execute(options: Options, query: string, parameters: any = [], logQuery = true): Promise<any> {\n try {\n const db = await this.attachWithTimeout(options);\n\n return await new Promise((resolve, reject): void => {\n const timeoutMs = this.getTimeoutMs(options);\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(this.createTimeoutError(\"execute\", timeoutMs, options, query));\n }, timeoutMs);\n\n if (logQuery) {\n this.logger.info(RestUtilities.printQueryWithParams(query, parameters));\n }\n\n db.execute(query, parameters, async (error: any, result: any) => {\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 this.logger.error(error);\n return reject(error);\n }\n\n return resolve(result);\n });\n });\n } catch (error) {\n this.logger.error(error as object);\n throw error;\n }\n }\n\n public static trimParam(param: any): string {\n if (typeof param === \"string\" || param instanceof String) {\n return 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 public static async startTransaction(db: Database): Promise<Transaction> {\n return new Promise((resolve, reject): void => {\n db.transaction(Firebird.ISOLATION_READ_COMMITTED, function (err: any, transaction: Transaction): void {\n if (err) return reject(err); else 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: any): void => {\n if (err) return reject(err); else 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: any): void => {\n if (err) return reject(err); else return resolve(\"Transaction rolled back successfully.\");\n });\n });\n }\n\n public static async executeMultiple(options: Options, queriesWithParams: { query: string, params: any[] }[]): Promise<string> {\n let db: Database | undefined;\n let transaction: Transaction | undefined;\n\n try {\n db = await Orm.connect(options);\n transaction = await Orm.startTransaction(db);\n\n for (const qwp of queriesWithParams) {\n await new Promise((resolve, reject) => {\n transaction.query(qwp.query, qwp.params, (err: any, result: any): void => {\n if (err) return reject(err);\n else return resolve(result);\n });\n });\n }\n\n await Orm.commitTransaction(transaction);\n await Orm.detachQuietly(db);\n return \"OK\";\n\n } catch (error) {\n if (transaction) {\n await Orm.rollbackTransaction(transaction);\n }\n await Orm.detachQuietly(db);\n throw error;\n }\n }\n\n public static async executeQueries(transaction: Transaction, queries: string[], params: any[]): Promise<any> {\n try {\n return await queries.reduce((promiseChain: Promise<any>, currentQuery: string, index: number) => {\n return promiseChain.then(() => new Promise((resolve, reject) => {\n transaction.query(currentQuery, params[index], (err: any, result: any): void => {\n if (err) return reject(err);\n else return resolve(result);\n });\n }));\n }, Promise.resolve());\n } catch (error) {\n return await new Promise((resolve, reject) => {\n transaction.rollback((rollbackErr: any): void => {\n if (rollbackErr) {\n return reject(rollbackErr);\n } else {\n return reject(error);\n }\n });\n });\n }\n }\n}\n"]}
package/dist/Utilities.js CHANGED
@@ -403,8 +403,6 @@ class DatabaseUtilities {
403
403
  pageSize: 100000, // The page size for database transactions. Default: 100,000.
404
404
  retryConnectionInterval: 1000, // The interval (in ms) to retry a failed connection. Default: 1,000 ms.
405
405
  blobAsText: true, // Determines if BLOB fields should be treated as text. Default: true.
406
- wireCrypt: 'enabled',
407
- pluginName: 'Srp',
408
406
  authPlugins: ['Srp256', 'Srp', 'Legacy_Auth'],
409
407
  connectTimeoutMs: 15000,
410
408
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Utilities.js","sourceRoot":"","sources":["../src/Utilities.ts"],"names":[],"mappings":"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","sourcesContent":["import { Response } from 'express';\r\nimport { Options } from \"es-node-firebird\";\nimport { FirebirdOptions } from \"./firebird-compat\";\nimport crypto from \"crypto\";\r\n\r\n\r\nexport enum StatusCode {\r\n Ok = 0,\r\n Warning = 1,\r\n Error = 2,\r\n}\r\n\r\nexport class DateUtilities {\r\n /**\r\n * Pads a number with leading zeros to reach a specified length.\r\n * @param num - The number to pad.\r\n * @param totalLength - The total length of the resulting string.\r\n * @returns The padded string.\r\n */\r\n static addStartingZeros(num: number, totalLength: number): string {\r\n return String(num).padStart(totalLength, '0');\r\n }\r\n\r\n /**\r\n * Formats a Date object as a Moncler-style string.\r\n * @param dData - The date to format.\r\n * @param bAddMs - Whether to include milliseconds.\r\n * @returns The formatted date string.\r\n */\r\n static dateToMoncler(dData: Date, bAddMs: boolean = false): string {\r\n const yy = dData.getFullYear();\r\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\r\n const dd = this.addStartingZeros(dData.getDate(), 2);\r\n const hh = this.addStartingZeros(dData.getHours(), 2);\r\n const nn = this.addStartingZeros(dData.getMinutes(), 2);\r\n const ss = this.addStartingZeros(dData.getSeconds(), 2);\r\n const ms = this.addStartingZeros(dData.getMilliseconds(), 3);\r\n return bAddMs ? `${yy}${mm}${dd}${hh}${nn}${ss}${ms}` : `${yy}${mm}${dd}${hh}${nn}${ss}`;\r\n }\r\n\r\n /**\r\n * Formats a Date object as a SQL-style string.\r\n * @param dData - The date to format.\r\n * @param bAddMs - Whether to include milliseconds.\r\n * @returns The formatted date string.\r\n */\r\n static dateToSql(dData: Date, bAddMs: boolean = false): string {\r\n const yy = dData.getFullYear();\r\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\r\n const dd = this.addStartingZeros(dData.getDate(), 2);\r\n const hh = this.addStartingZeros(dData.getHours(), 2);\r\n const nn = this.addStartingZeros(dData.getMinutes(), 2);\r\n const ss = this.addStartingZeros(dData.getSeconds(), 2);\r\n const ms = this.addStartingZeros(dData.getMilliseconds(), 3);\r\n return bAddMs\r\n ? `${yy}-${mm}-${dd} ${hh}:${nn}:${ss}.${ms}`\r\n : `${yy}-${mm}-${dd} ${hh}:${nn}:${ss}`;\r\n }\r\n\r\n /**\r\n * Formats a Date object as a simple string (dd-MM-yyyy).\r\n * @param dData - The date to format.\r\n * @returns The formatted date string.\r\n */\r\n static dateToSimple(dData: Date): string {\r\n const yy = dData.getFullYear();\r\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\r\n const dd = this.addStartingZeros(dData.getDate(), 2);\r\n return `${dd}-${mm}-${yy}`;\r\n }\r\n\r\n /**\r\n * Gets the current date and time as a formatted string.\r\n * @returns The current date and time in the format dd.MM.yyyy HH:mm:ss.\r\n */\r\n static getNowDateString(): string {\r\n const now: Date = new Date();\r\n const day = now.getDate().toString().padStart(2, \"0\");\r\n const month = (now.getMonth() + 1).toString().padStart(2, \"0\");\r\n const year = now.getFullYear();\r\n const hours = now.getHours().toString().padStart(2, \"0\");\r\n const minutes = now.getMinutes().toString().padStart(2, \"0\");\r\n const seconds = now.getSeconds().toString().padStart(2, \"0\");\r\n return `${day}.${month}.${year} ${hours}:${minutes}:${seconds}`;\r\n }\r\n\r\n /**\r\n * Parses a date string in the format dd/MM/yyyy into a Date object.\r\n * @param date - The date string to parse.\r\n * @returns A Date object.\r\n */\r\n static parseDate(date: string): Date {\r\n const parts: string[] = date.split(\"/\");\r\n return new Date(Number(parts[2]), Number(parts[1]) - 1, Number(parts[0]));\r\n }\r\n}\r\n\r\n\r\nexport class RestUtilities {\r\n /**\r\n * Sends an OK message as a response.\r\n * @param res - Express Response object.\r\n * @param message - The success message.\r\n * @returns The Response object.\r\n */\r\n static sendOKMessage(res: Response, message: string): Response {\r\n return res.send({\r\n severity: \"success\",\r\n status: 200,\r\n statusCode: StatusCode.Ok,\r\n message,\r\n });\r\n }\r\n\r\n /**\r\n * Sends an error message as a response.\r\n * @param res - Express Response object.\r\n * @param error - The error to send.\r\n * @param tag - Optional tag for additional context.\r\n * @param status - HTTP status code (default: 500).\r\n * @returns The Response object.\r\n */\r\n static sendErrorMessage(res: Response, error: any, tag: string = \"[BASE ERROR]\", status: number = 500): Response {\r\n return res.status(status).send({\r\n severity: \"error\",\r\n status,\r\n statusCode: StatusCode.Error,\r\n message: \"An error occurred\",\r\n error: `${tag}: ${error}`,\r\n });\r\n }\r\n\r\n\r\n static sendUnauthorized(res: Response): Response {\r\n return res.status(401).send({\r\n severity: \"error\",\r\n statusCode: StatusCode.Error,\r\n message: \"Non sei autorizzato\",\r\n });\r\n }\r\n\r\n static sendInvalidCredentials(res: Response): Response {\r\n return res.status(401).send({\r\n severity: \"error\",\r\n statusCode: StatusCode.Error,\r\n message: \"Credenziali non valide\"\r\n });\r\n }\r\n\r\n static sendPasswordExpired(res: Response): Response {\r\n return res.status(403).send({\r\n severity: \"warning\",\r\n statusCode: StatusCode.Warning,\r\n code: \"PASSWORD_EXPIRED\",\r\n message: \"Password scaduta. E' necessario aggiornarla\"\r\n })\r\n }\r\n\r\n /**\r\n * Sends a base response with a payload.\r\n * @param res - Express Response object.\r\n * @param payload - The payload to include in the response.\r\n * @returns The Response object.\r\n */\r\n static sendBaseResponse(res: Response, payload: any): Response {\r\n try {\r\n payload = JSON.parse(JSON.stringify(payload));\r\n const response = {\r\n Status: {\r\n errorCode: \"0\",\r\n errorDescription: \"\",\r\n },\r\n Result: payload,\r\n Message: \"Dati recuperati con successo.\",\r\n };\r\n return res.send(response);\r\n } catch (error) {\r\n return this.sendErrorMessage(res, `Error sending response: ${error}`, \"[UTILITIES]\", 500);\r\n }\r\n }\r\n\r\n /**\r\n * Sends an execution message as a response.\r\n * @param res - Express Response object.\r\n * @param executionObject - The execution data.\r\n * @param title - The title of the response.\r\n * @returns The Response object.\r\n */\r\n static sendExecMessage(res: Response, executionObject: any, title: string): Response {\r\n try {\r\n const response = {\r\n Status: {\r\n errorCode: \"0\",\r\n errorDescription: \"\",\r\n },\r\n Sql: \"\",\r\n ID: executionObject?.id,\r\n data: executionObject,\r\n Title: title,\r\n };\r\n return res.send(response);\r\n } catch (error) {\r\n return this.sendErrorMessage(res, `Error sending execution message: ${error}`, title, 500);\r\n }\r\n }\r\n\r\n /**\r\n * Prints a SQL query with parameters replaced.\r\n * @param query - The SQL query.\r\n * @param params - The parameters to replace.\r\n * @returns The formatted query.\r\n */\r\n static printQueryWithParams(query: string = \"\", params: any[]): string {\r\n try {\r\n params.forEach(param => {\r\n query = query.replace(\"?\", param);\r\n });\r\n return query;\r\n } catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n\r\n public static convertKeysToCamelCase(obj: any): any {\r\n if (obj !== null && obj.constructor === Object) {\r\n return Object.keys(obj).reduce((acc: any, key: string) => {\r\n const camelCaseKey = key.toLowerCase().replace(/_([a-z])/g, g => g[1].toUpperCase());\r\n acc[camelCaseKey] = obj[key];\r\n return acc;\r\n }, {});\r\n }\r\n return obj;\r\n }\r\n}\r\n\r\n\r\nexport class CryptUtilities {\r\n\r\n /**\r\n * Cifra un testo in chiaro usando l'algoritmo AES-128 in modalità ECB.\r\n * \r\n * @param plainText - Il testo in chiaro da cifrare.\r\n * @param key - La chiave di cifratura (16 byte per AES-128).\r\n * @param outputEncoding - Codifica del risultato cifrato (predefinito: \"base64\").\r\n * @returns Il testo cifrato codificato.\r\n * @throws Errore in caso di problemi durante la cifratura.\r\n */\r\n public static encrypt(plainData: string, key: string, outputEncoding: BufferEncoding = \"base64\"): string {\r\n try {\r\n // Crea un oggetto Cipher usando AES-128 in modalità ECB\r\n const cipher = crypto.createCipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\r\n\r\n // Cifra il testo in chiaro e finalizza il processo\r\n const encryptedBuffer = Buffer.concat([\r\n cipher.update(plainData, \"utf8\"),\r\n cipher.final(),\r\n ]);\r\n\r\n // Restituisce il risultato cifrato codificato\r\n return encryptedBuffer.toString(outputEncoding);\r\n } catch (error) {\r\n // Gestisce eventuali errori di cifratura\r\n throw new Error(`Errore durante la cifratura: ${error.message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Decifra un testo cifrato usando l'algoritmo AES-128 in modalità ECB.\r\n * \r\n * @param encryptedData - Il testo cifrato da decifrare.\r\n * @param key - La chiave di decifratura (16 byte per AES-128).\r\n * @returns Il testo decifrato o null in caso di errore.\r\n */\r\n public static decrypt(encryptedData: string, key: string): string | null {\r\n try {\r\n // Crea un oggetto Decipher usando AES-128 in modalità ECB\r\n const decipher = crypto.createDecipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\r\n decipher.setAutoPadding(false);\r\n\r\n // Decifra il testo cifrato\r\n let decoded = decipher.update(encryptedData, \"base64\", \"utf8\");\r\n decoded += decipher.final(\"utf8\");\r\n\r\n // Rimuove il padding manuale\r\n const lastChar = decoded.charCodeAt(decoded.length - 1);\r\n decoded = decoded.slice(0, decoded.length - lastChar);\r\n\r\n return decoded;\r\n } catch (error) {\r\n console.error(\"Errore durante la decifratura:\", error);\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nexport class PasswordUtilities {\r\n private static readonly HASH_PREFIX = \"scrypt\";\r\n private static readonly LEGACY_HASH_PREFIX = \"scrypt-legacy\";\r\n private static readonly SCRYPT_N = 16384;\r\n private static readonly SCRYPT_R = 8;\r\n private static readonly SCRYPT_P = 1;\r\n private static readonly SALT_LENGTH = 16;\r\n\r\n private static hashSecret(secretValue: string, prefix: string): string {\r\n if (typeof secretValue !== \"string\" || secretValue.length === 0) {\r\n throw new Error(\"Il valore da proteggere non puo essere vuoto.\");\r\n }\r\n const salt = crypto.randomBytes(this.SALT_LENGTH).toString(\"hex\");\r\n const derivedKey = crypto.scryptSync(\r\n secretValue,\r\n salt,\r\n 64,\r\n {\r\n N: this.SCRYPT_N,\r\n r: this.SCRYPT_R,\r\n p: this.SCRYPT_P,\r\n maxmem: 64 * 1024 * 1024,\r\n },\r\n );\r\n\r\n return [\r\n prefix,\r\n this.SCRYPT_N,\r\n this.SCRYPT_R,\r\n this.SCRYPT_P,\r\n salt,\r\n derivedKey.toString(\"hex\"),\r\n ].join(\"$\");\r\n }\r\n\r\n private static hasPrefix(value: string, prefix: string): boolean {\r\n return typeof value === \"string\" && value.startsWith(`${prefix}$`);\r\n }\r\n\r\n private static parseHash(\r\n storedPassword: string,\r\n expectedPrefix: string\r\n ): {\r\n salt: string;\r\n expectedHash: Buffer;\r\n N: number;\r\n r: number;\r\n p: number;\r\n } | null {\r\n if (!this.hasPrefix(storedPassword, expectedPrefix)) {\r\n return null;\r\n }\r\n\r\n const [, rawN, rawR, rawP, salt, expectedHashHex] = storedPassword.split(\"$\");\r\n const N = Number(rawN);\r\n const r = Number(rawR);\r\n const p = Number(rawP);\r\n\r\n if (!salt || !expectedHashHex || !Number.isFinite(N) || !Number.isFinite(r) || !Number.isFinite(p)) {\r\n return null;\r\n }\r\n\r\n const expectedHash = Buffer.from(expectedHashHex, \"hex\");\r\n if (expectedHash.length === 0) {\r\n return null;\r\n }\r\n\r\n return {\r\n salt,\r\n expectedHash,\r\n N,\r\n r,\r\n p,\r\n };\r\n }\r\n\r\n private static verifySecret(secretValue: string, storedPassword: string, expectedPrefix: string): boolean {\r\n if (typeof secretValue !== \"string\") {\r\n return false;\r\n }\r\n\r\n const parsedHash = this.parseHash(storedPassword, expectedPrefix);\r\n if (!parsedHash) {\r\n return false;\r\n }\r\n\r\n const derivedKey = crypto.scryptSync(\r\n secretValue,\r\n parsedHash.salt,\r\n parsedHash.expectedHash.length,\r\n {\r\n N: parsedHash.N,\r\n r: parsedHash.r,\r\n p: parsedHash.p,\r\n maxmem: 64 * 1024 * 1024,\r\n },\r\n );\r\n\r\n return crypto.timingSafeEqual(derivedKey, parsedHash.expectedHash);\r\n }\r\n\r\n public static hashPassword(plainPassword: string): string {\r\n return this.hashSecret(plainPassword, this.HASH_PREFIX);\r\n }\r\n\r\n public static hashLegacyEncryptedPassword(legacyEncryptedPassword: string): string {\r\n return this.hashSecret(legacyEncryptedPassword, this.LEGACY_HASH_PREFIX);\r\n }\r\n\r\n public static isPasswordHash(value: string): boolean {\r\n return this.hasPrefix(value, this.HASH_PREFIX);\r\n }\r\n\r\n public static isLegacyPasswordHash(value: string): boolean {\r\n return this.hasPrefix(value, this.LEGACY_HASH_PREFIX);\r\n }\r\n\r\n public static verifyPassword(plainPassword: string, storedPassword: string): boolean {\r\n return this.verifySecret(plainPassword, storedPassword, this.HASH_PREFIX);\r\n }\r\n\r\n public static verifyLegacyEncryptedPassword(\r\n legacyEncryptedPassword: string,\r\n storedPassword: string\r\n ): boolean {\r\n return this.verifySecret(legacyEncryptedPassword, storedPassword, this.LEGACY_HASH_PREFIX);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * Utility class for managing database-related configurations and operations.\r\n */\r\nexport class DatabaseUtilities {\r\n /**\r\n * Creates a configuration object for connecting to a Firebird database.\r\n *\r\n * @param {string} host - The hostname or IP address of the database server.\r\n * @param {number} port - The port number on which the database server is running.\r\n * @param {string} database - The path or alias of the database to connect to.\r\n * @param {string} [username='SYSDBA'] - The username for authentication. Defaults to 'SYSDBA'.\r\n * @param {string} [password='masterkey'] - The password for authentication. Defaults to 'masterkey'.\r\n * @returns {Options} - The configuration object to use for establishing a Firebird database connection.\r\n *\r\n * @example\r\n * ```typescript\r\n * const options = DatabaseUtilities.createOption(\r\n * 'localhost',\r\n * 3050,\r\n * '/path/to/database.fdb',\r\n * 'myUsername',\r\n * 'myPassword'\r\n * );\r\n * ```\r\n */\r\n public static createOption(\r\n host: string,\r\n port: number,\r\n database: string,\r\n username = 'SYSDBA',\r\n password = 'masterkey'\r\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.\r\n password, // The password for database authentication.\r\n database, // The path or alias of the target database.\r\n lowercase_keys: false, // Determines if the keys in query results should be in lowercase. Default: false.\r\n role: undefined, // The role for the database connection. Default: undefined.\r\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 wireCrypt: 'enabled',\n pluginName: 'Srp',\n authPlugins: ['Srp256', 'Srp', 'Legacy_Auth'],\n connectTimeoutMs: 15000,\n };\n }\n}\n\r\nexport function Deprecated(message: string) {\r\n return function (target: any, key?: string, descriptor?: PropertyDescriptor) {\r\n console.warn(`[DEPRECATED] ${message}`);\r\n };\r\n }\r\n"]}
1
+ {"version":3,"file":"Utilities.js","sourceRoot":"","sources":["../src/Utilities.ts"],"names":[],"mappings":"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","sourcesContent":["import { Response } from 'express';\r\nimport { Options } from \"es-node-firebird\";\nimport { FirebirdOptions } from \"./firebird-compat\";\nimport crypto from \"crypto\";\r\n\r\n\r\nexport enum StatusCode {\r\n Ok = 0,\r\n Warning = 1,\r\n Error = 2,\r\n}\r\n\r\nexport class DateUtilities {\r\n /**\r\n * Pads a number with leading zeros to reach a specified length.\r\n * @param num - The number to pad.\r\n * @param totalLength - The total length of the resulting string.\r\n * @returns The padded string.\r\n */\r\n static addStartingZeros(num: number, totalLength: number): string {\r\n return String(num).padStart(totalLength, '0');\r\n }\r\n\r\n /**\r\n * Formats a Date object as a Moncler-style string.\r\n * @param dData - The date to format.\r\n * @param bAddMs - Whether to include milliseconds.\r\n * @returns The formatted date string.\r\n */\r\n static dateToMoncler(dData: Date, bAddMs: boolean = false): string {\r\n const yy = dData.getFullYear();\r\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\r\n const dd = this.addStartingZeros(dData.getDate(), 2);\r\n const hh = this.addStartingZeros(dData.getHours(), 2);\r\n const nn = this.addStartingZeros(dData.getMinutes(), 2);\r\n const ss = this.addStartingZeros(dData.getSeconds(), 2);\r\n const ms = this.addStartingZeros(dData.getMilliseconds(), 3);\r\n return bAddMs ? `${yy}${mm}${dd}${hh}${nn}${ss}${ms}` : `${yy}${mm}${dd}${hh}${nn}${ss}`;\r\n }\r\n\r\n /**\r\n * Formats a Date object as a SQL-style string.\r\n * @param dData - The date to format.\r\n * @param bAddMs - Whether to include milliseconds.\r\n * @returns The formatted date string.\r\n */\r\n static dateToSql(dData: Date, bAddMs: boolean = false): string {\r\n const yy = dData.getFullYear();\r\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\r\n const dd = this.addStartingZeros(dData.getDate(), 2);\r\n const hh = this.addStartingZeros(dData.getHours(), 2);\r\n const nn = this.addStartingZeros(dData.getMinutes(), 2);\r\n const ss = this.addStartingZeros(dData.getSeconds(), 2);\r\n const ms = this.addStartingZeros(dData.getMilliseconds(), 3);\r\n return bAddMs\r\n ? `${yy}-${mm}-${dd} ${hh}:${nn}:${ss}.${ms}`\r\n : `${yy}-${mm}-${dd} ${hh}:${nn}:${ss}`;\r\n }\r\n\r\n /**\r\n * Formats a Date object as a simple string (dd-MM-yyyy).\r\n * @param dData - The date to format.\r\n * @returns The formatted date string.\r\n */\r\n static dateToSimple(dData: Date): string {\r\n const yy = dData.getFullYear();\r\n const mm = this.addStartingZeros(dData.getMonth() + 1, 2);\r\n const dd = this.addStartingZeros(dData.getDate(), 2);\r\n return `${dd}-${mm}-${yy}`;\r\n }\r\n\r\n /**\r\n * Gets the current date and time as a formatted string.\r\n * @returns The current date and time in the format dd.MM.yyyy HH:mm:ss.\r\n */\r\n static getNowDateString(): string {\r\n const now: Date = new Date();\r\n const day = now.getDate().toString().padStart(2, \"0\");\r\n const month = (now.getMonth() + 1).toString().padStart(2, \"0\");\r\n const year = now.getFullYear();\r\n const hours = now.getHours().toString().padStart(2, \"0\");\r\n const minutes = now.getMinutes().toString().padStart(2, \"0\");\r\n const seconds = now.getSeconds().toString().padStart(2, \"0\");\r\n return `${day}.${month}.${year} ${hours}:${minutes}:${seconds}`;\r\n }\r\n\r\n /**\r\n * Parses a date string in the format dd/MM/yyyy into a Date object.\r\n * @param date - The date string to parse.\r\n * @returns A Date object.\r\n */\r\n static parseDate(date: string): Date {\r\n const parts: string[] = date.split(\"/\");\r\n return new Date(Number(parts[2]), Number(parts[1]) - 1, Number(parts[0]));\r\n }\r\n}\r\n\r\n\r\nexport class RestUtilities {\r\n /**\r\n * Sends an OK message as a response.\r\n * @param res - Express Response object.\r\n * @param message - The success message.\r\n * @returns The Response object.\r\n */\r\n static sendOKMessage(res: Response, message: string): Response {\r\n return res.send({\r\n severity: \"success\",\r\n status: 200,\r\n statusCode: StatusCode.Ok,\r\n message,\r\n });\r\n }\r\n\r\n /**\r\n * Sends an error message as a response.\r\n * @param res - Express Response object.\r\n * @param error - The error to send.\r\n * @param tag - Optional tag for additional context.\r\n * @param status - HTTP status code (default: 500).\r\n * @returns The Response object.\r\n */\r\n static sendErrorMessage(res: Response, error: any, tag: string = \"[BASE ERROR]\", status: number = 500): Response {\r\n return res.status(status).send({\r\n severity: \"error\",\r\n status,\r\n statusCode: StatusCode.Error,\r\n message: \"An error occurred\",\r\n error: `${tag}: ${error}`,\r\n });\r\n }\r\n\r\n\r\n static sendUnauthorized(res: Response): Response {\r\n return res.status(401).send({\r\n severity: \"error\",\r\n statusCode: StatusCode.Error,\r\n message: \"Non sei autorizzato\",\r\n });\r\n }\r\n\r\n static sendInvalidCredentials(res: Response): Response {\r\n return res.status(401).send({\r\n severity: \"error\",\r\n statusCode: StatusCode.Error,\r\n message: \"Credenziali non valide\"\r\n });\r\n }\r\n\r\n static sendPasswordExpired(res: Response): Response {\r\n return res.status(403).send({\r\n severity: \"warning\",\r\n statusCode: StatusCode.Warning,\r\n code: \"PASSWORD_EXPIRED\",\r\n message: \"Password scaduta. E' necessario aggiornarla\"\r\n })\r\n }\r\n\r\n /**\r\n * Sends a base response with a payload.\r\n * @param res - Express Response object.\r\n * @param payload - The payload to include in the response.\r\n * @returns The Response object.\r\n */\r\n static sendBaseResponse(res: Response, payload: any): Response {\r\n try {\r\n payload = JSON.parse(JSON.stringify(payload));\r\n const response = {\r\n Status: {\r\n errorCode: \"0\",\r\n errorDescription: \"\",\r\n },\r\n Result: payload,\r\n Message: \"Dati recuperati con successo.\",\r\n };\r\n return res.send(response);\r\n } catch (error) {\r\n return this.sendErrorMessage(res, `Error sending response: ${error}`, \"[UTILITIES]\", 500);\r\n }\r\n }\r\n\r\n /**\r\n * Sends an execution message as a response.\r\n * @param res - Express Response object.\r\n * @param executionObject - The execution data.\r\n * @param title - The title of the response.\r\n * @returns The Response object.\r\n */\r\n static sendExecMessage(res: Response, executionObject: any, title: string): Response {\r\n try {\r\n const response = {\r\n Status: {\r\n errorCode: \"0\",\r\n errorDescription: \"\",\r\n },\r\n Sql: \"\",\r\n ID: executionObject?.id,\r\n data: executionObject,\r\n Title: title,\r\n };\r\n return res.send(response);\r\n } catch (error) {\r\n return this.sendErrorMessage(res, `Error sending execution message: ${error}`, title, 500);\r\n }\r\n }\r\n\r\n /**\r\n * Prints a SQL query with parameters replaced.\r\n * @param query - The SQL query.\r\n * @param params - The parameters to replace.\r\n * @returns The formatted query.\r\n */\r\n static printQueryWithParams(query: string = \"\", params: any[]): string {\r\n try {\r\n params.forEach(param => {\r\n query = query.replace(\"?\", param);\r\n });\r\n return query;\r\n } catch (error) {\r\n throw error;\r\n }\r\n }\r\n\r\n\r\n public static convertKeysToCamelCase(obj: any): any {\r\n if (obj !== null && obj.constructor === Object) {\r\n return Object.keys(obj).reduce((acc: any, key: string) => {\r\n const camelCaseKey = key.toLowerCase().replace(/_([a-z])/g, g => g[1].toUpperCase());\r\n acc[camelCaseKey] = obj[key];\r\n return acc;\r\n }, {});\r\n }\r\n return obj;\r\n }\r\n}\r\n\r\n\r\nexport class CryptUtilities {\r\n\r\n /**\r\n * Cifra un testo in chiaro usando l'algoritmo AES-128 in modalità ECB.\r\n * \r\n * @param plainText - Il testo in chiaro da cifrare.\r\n * @param key - La chiave di cifratura (16 byte per AES-128).\r\n * @param outputEncoding - Codifica del risultato cifrato (predefinito: \"base64\").\r\n * @returns Il testo cifrato codificato.\r\n * @throws Errore in caso di problemi durante la cifratura.\r\n */\r\n public static encrypt(plainData: string, key: string, outputEncoding: BufferEncoding = \"base64\"): string {\r\n try {\r\n // Crea un oggetto Cipher usando AES-128 in modalità ECB\r\n const cipher = crypto.createCipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\r\n\r\n // Cifra il testo in chiaro e finalizza il processo\r\n const encryptedBuffer = Buffer.concat([\r\n cipher.update(plainData, \"utf8\"),\r\n cipher.final(),\r\n ]);\r\n\r\n // Restituisce il risultato cifrato codificato\r\n return encryptedBuffer.toString(outputEncoding);\r\n } catch (error) {\r\n // Gestisce eventuali errori di cifratura\r\n throw new Error(`Errore durante la cifratura: ${error.message}`);\r\n }\r\n }\r\n\r\n /**\r\n * Decifra un testo cifrato usando l'algoritmo AES-128 in modalità ECB.\r\n * \r\n * @param encryptedData - Il testo cifrato da decifrare.\r\n * @param key - La chiave di decifratura (16 byte per AES-128).\r\n * @returns Il testo decifrato o null in caso di errore.\r\n */\r\n public static decrypt(encryptedData: string, key: string): string | null {\r\n try {\r\n // Crea un oggetto Decipher usando AES-128 in modalità ECB\r\n const decipher = crypto.createDecipheriv(\"aes-128-ecb\", Buffer.from(key, \"utf8\"), null);\r\n decipher.setAutoPadding(false);\r\n\r\n // Decifra il testo cifrato\r\n let decoded = decipher.update(encryptedData, \"base64\", \"utf8\");\r\n decoded += decipher.final(\"utf8\");\r\n\r\n // Rimuove il padding manuale\r\n const lastChar = decoded.charCodeAt(decoded.length - 1);\r\n decoded = decoded.slice(0, decoded.length - lastChar);\r\n\r\n return decoded;\r\n } catch (error) {\r\n console.error(\"Errore durante la decifratura:\", error);\r\n return null;\r\n }\r\n }\r\n}\r\n\r\nexport class PasswordUtilities {\r\n private static readonly HASH_PREFIX = \"scrypt\";\r\n private static readonly LEGACY_HASH_PREFIX = \"scrypt-legacy\";\r\n private static readonly SCRYPT_N = 16384;\r\n private static readonly SCRYPT_R = 8;\r\n private static readonly SCRYPT_P = 1;\r\n private static readonly SALT_LENGTH = 16;\r\n\r\n private static hashSecret(secretValue: string, prefix: string): string {\r\n if (typeof secretValue !== \"string\" || secretValue.length === 0) {\r\n throw new Error(\"Il valore da proteggere non puo essere vuoto.\");\r\n }\r\n const salt = crypto.randomBytes(this.SALT_LENGTH).toString(\"hex\");\r\n const derivedKey = crypto.scryptSync(\r\n secretValue,\r\n salt,\r\n 64,\r\n {\r\n N: this.SCRYPT_N,\r\n r: this.SCRYPT_R,\r\n p: this.SCRYPT_P,\r\n maxmem: 64 * 1024 * 1024,\r\n },\r\n );\r\n\r\n return [\r\n prefix,\r\n this.SCRYPT_N,\r\n this.SCRYPT_R,\r\n this.SCRYPT_P,\r\n salt,\r\n derivedKey.toString(\"hex\"),\r\n ].join(\"$\");\r\n }\r\n\r\n private static hasPrefix(value: string, prefix: string): boolean {\r\n return typeof value === \"string\" && value.startsWith(`${prefix}$`);\r\n }\r\n\r\n private static parseHash(\r\n storedPassword: string,\r\n expectedPrefix: string\r\n ): {\r\n salt: string;\r\n expectedHash: Buffer;\r\n N: number;\r\n r: number;\r\n p: number;\r\n } | null {\r\n if (!this.hasPrefix(storedPassword, expectedPrefix)) {\r\n return null;\r\n }\r\n\r\n const [, rawN, rawR, rawP, salt, expectedHashHex] = storedPassword.split(\"$\");\r\n const N = Number(rawN);\r\n const r = Number(rawR);\r\n const p = Number(rawP);\r\n\r\n if (!salt || !expectedHashHex || !Number.isFinite(N) || !Number.isFinite(r) || !Number.isFinite(p)) {\r\n return null;\r\n }\r\n\r\n const expectedHash = Buffer.from(expectedHashHex, \"hex\");\r\n if (expectedHash.length === 0) {\r\n return null;\r\n }\r\n\r\n return {\r\n salt,\r\n expectedHash,\r\n N,\r\n r,\r\n p,\r\n };\r\n }\r\n\r\n private static verifySecret(secretValue: string, storedPassword: string, expectedPrefix: string): boolean {\r\n if (typeof secretValue !== \"string\") {\r\n return false;\r\n }\r\n\r\n const parsedHash = this.parseHash(storedPassword, expectedPrefix);\r\n if (!parsedHash) {\r\n return false;\r\n }\r\n\r\n const derivedKey = crypto.scryptSync(\r\n secretValue,\r\n parsedHash.salt,\r\n parsedHash.expectedHash.length,\r\n {\r\n N: parsedHash.N,\r\n r: parsedHash.r,\r\n p: parsedHash.p,\r\n maxmem: 64 * 1024 * 1024,\r\n },\r\n );\r\n\r\n return crypto.timingSafeEqual(derivedKey, parsedHash.expectedHash);\r\n }\r\n\r\n public static hashPassword(plainPassword: string): string {\r\n return this.hashSecret(plainPassword, this.HASH_PREFIX);\r\n }\r\n\r\n public static hashLegacyEncryptedPassword(legacyEncryptedPassword: string): string {\r\n return this.hashSecret(legacyEncryptedPassword, this.LEGACY_HASH_PREFIX);\r\n }\r\n\r\n public static isPasswordHash(value: string): boolean {\r\n return this.hasPrefix(value, this.HASH_PREFIX);\r\n }\r\n\r\n public static isLegacyPasswordHash(value: string): boolean {\r\n return this.hasPrefix(value, this.LEGACY_HASH_PREFIX);\r\n }\r\n\r\n public static verifyPassword(plainPassword: string, storedPassword: string): boolean {\r\n return this.verifySecret(plainPassword, storedPassword, this.HASH_PREFIX);\r\n }\r\n\r\n public static verifyLegacyEncryptedPassword(\r\n legacyEncryptedPassword: string,\r\n storedPassword: string\r\n ): boolean {\r\n return this.verifySecret(legacyEncryptedPassword, storedPassword, this.LEGACY_HASH_PREFIX);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n/**\r\n * Utility class for managing database-related configurations and operations.\r\n */\r\nexport class DatabaseUtilities {\r\n /**\r\n * Creates a configuration object for connecting to a Firebird database.\r\n *\r\n * @param {string} host - The hostname or IP address of the database server.\r\n * @param {number} port - The port number on which the database server is running.\r\n * @param {string} database - The path or alias of the database to connect to.\r\n * @param {string} [username='SYSDBA'] - The username for authentication. Defaults to 'SYSDBA'.\r\n * @param {string} [password='masterkey'] - The password for authentication. Defaults to 'masterkey'.\r\n * @returns {Options} - The configuration object to use for establishing a Firebird database connection.\r\n *\r\n * @example\r\n * ```typescript\r\n * const options = DatabaseUtilities.createOption(\r\n * 'localhost',\r\n * 3050,\r\n * '/path/to/database.fdb',\r\n * 'myUsername',\r\n * 'myPassword'\r\n * );\r\n * ```\r\n */\r\n public static createOption(\r\n host: string,\r\n port: number,\r\n database: string,\r\n username = 'SYSDBA',\r\n password = 'masterkey'\r\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.\r\n password, // The password for database authentication.\r\n database, // The path or alias of the target database.\r\n lowercase_keys: false, // Determines if the keys in query results should be in lowercase. Default: false.\r\n role: undefined, // The role for the database connection. Default: undefined.\r\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 authPlugins: ['Srp256', 'Srp', 'Legacy_Auth'],\n connectTimeoutMs: 15000,\n };\n }\n}\n\r\nexport function Deprecated(message: string) {\r\n return function (target: any, key?: string, descriptor?: PropertyDescriptor) {\r\n console.warn(`[DEPRECATED] ${message}`);\r\n };\r\n }\r\n"]}
@@ -7,6 +7,8 @@ export type FirebirdOptions = Options & {
7
7
  authPlugins?: FirebirdAuthPlugin[];
8
8
  connectTimeoutMs?: number;
9
9
  connectTimeout?: number;
10
+ compatibilityProbeTimeoutMs?: number;
11
+ compatibilityTotalTimeoutMs?: number;
10
12
  };
11
13
  export declare function normalizeFirebirdOptions(options: Options): FirebirdOptions;
12
14
  export declare function buildFirebirdCompatibilityCandidates(options: Options): FirebirdOptions[];
@@ -95,7 +95,8 @@ function isRetryableCompatibilityError(error) {
95
95
  return message.includes("incompatible wire encryption")
96
96
  || message.includes("no matching plugins on server")
97
97
  || message.includes("unknown auth plugin")
98
- || message.includes("unknow auth plugin");
98
+ || message.includes("unknow auth plugin")
99
+ || message.includes("timeout during firebird attach");
99
100
  }
100
101
  function pushUniqueCandidate(target, candidate) {
101
102
  var _a;
@@ -110,6 +111,11 @@ function pushUniqueCandidate(target, candidate) {
110
111
  target.push(normalized);
111
112
  }
112
113
  }
114
+ function appendPluginCandidates(target, base, pluginName, wireCryptModes) {
115
+ wireCryptModes.forEach((wireCrypt) => {
116
+ pushUniqueCandidate(target, Object.assign(Object.assign({}, base), { pluginName, wireCrypt }));
117
+ });
118
+ }
113
119
  function buildFirebirdCompatibilityCandidates(options) {
114
120
  const normalized = normalizeFirebirdOptions(options);
115
121
  const compatibilityOptions = options;
@@ -121,21 +127,21 @@ function buildFirebirdCompatibilityCandidates(options) {
121
127
  return candidates;
122
128
  }
123
129
  if (hasExplicitPlugin) {
124
- pushUniqueCandidate(candidates, Object.assign(Object.assign({}, normalized), { wireCrypt: "disabled" }));
125
- pushUniqueCandidate(candidates, Object.assign(Object.assign({}, normalized), { wireCrypt: "enabled" }));
130
+ const wireCryptModes = normalized.pluginName === "Legacy_Auth"
131
+ ? ["disabled", "enabled"]
132
+ : ["enabled", "required", "disabled"];
133
+ appendPluginCandidates(candidates, normalized, normalized.pluginName, wireCryptModes);
126
134
  return candidates;
127
135
  }
128
136
  if (hasExplicitWireCrypt) {
129
- pushUniqueCandidate(candidates, Object.assign(Object.assign({}, normalized), { pluginName: "Srp256" }));
130
- pushUniqueCandidate(candidates, Object.assign(Object.assign({}, normalized), { pluginName: "Srp" }));
131
- pushUniqueCandidate(candidates, Object.assign(Object.assign({}, normalized), { pluginName: "Legacy_Auth" }));
137
+ appendPluginCandidates(candidates, normalized, "Srp256", [normalized.wireCrypt]);
138
+ appendPluginCandidates(candidates, normalized, "Srp", [normalized.wireCrypt]);
139
+ appendPluginCandidates(candidates, normalized, "Legacy_Auth", [normalized.wireCrypt]);
132
140
  return candidates;
133
141
  }
134
- pushUniqueCandidate(candidates, Object.assign(Object.assign({}, normalized), { pluginName: "Srp256", wireCrypt: "enabled" }));
135
- pushUniqueCandidate(candidates, Object.assign(Object.assign({}, normalized), { pluginName: "Srp", wireCrypt: "enabled" }));
136
- pushUniqueCandidate(candidates, Object.assign(Object.assign({}, normalized), { pluginName: "Srp256", wireCrypt: "disabled" }));
137
- pushUniqueCandidate(candidates, Object.assign(Object.assign({}, normalized), { pluginName: "Srp", wireCrypt: "disabled" }));
138
- pushUniqueCandidate(candidates, Object.assign(Object.assign({}, normalized), { pluginName: "Legacy_Auth", wireCrypt: "disabled" }));
142
+ appendPluginCandidates(candidates, normalized, "Srp256", ["enabled", "required", "disabled"]);
143
+ appendPluginCandidates(candidates, normalized, "Srp", ["enabled", "required", "disabled"]);
144
+ appendPluginCandidates(candidates, normalized, "Legacy_Auth", ["disabled", "enabled"]);
139
145
  return candidates;
140
146
  }
141
147
  function shouldRetryFirebirdCompatibility(error) {
@@ -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 \"es-node-firebird\";\nimport { Options } from \"es-node-firebird\";\n\nexport type FirebirdWireCryptMode = \"disabled\" | \"enabled\" | \"required\";\nexport type FirebirdAuthPlugin = \"Legacy_Auth\" | \"Srp\" | \"Srp256\";\n\nexport type FirebirdOptions = Options & {\n wireCrypt?: FirebirdWireCryptMode;\n pluginName?: FirebirdAuthPlugin;\n authPlugins?: FirebirdAuthPlugin[];\n connectTimeoutMs?: number;\n connectTimeout?: number;\n};\n\nconst CNCT_PLUGIN_NAME = 8;\nconst CNCT_PLUGIN_LIST = 10;\nconst CNCT_CLIENT_CRYPT = 11;\nconst WIRE_CRYPT_DISABLE = 0;\nconst WIRE_CRYPT_ENABLE = 1;\nconst WIRE_CRYPT_REQUIRED = 2;\nconst DEFAULT_AUTH_PLUGIN_LIST: FirebirdAuthPlugin[] = [\"Srp256\", \"Srp\", \"Legacy_Auth\"];\n\ntype BlrWriterLike = {\n addBytes: (bytes: number[], ...args: unknown[]) => unknown;\n addString: (code: number, value: string, encoding?: string) => unknown;\n};\n\ntype ConnectionLike = {\n _blr?: BlrWriterLike;\n accept?: {\n protocolMinimumType?: number;\n pluginName?: string;\n };\n};\n\ntype FirebirdModuleLike = {\n Connection?: {\n prototype?: {\n connect?: (this: ConnectionLike, options: FirebirdOptions, callback: unknown) => unknown;\n __emilsoftwareWireCryptPatched?: boolean;\n };\n };\n};\n\nfunction normalizeWireCryptMode(value: unknown): FirebirdWireCryptMode {\n const normalized = String(value ?? \"\").trim().toLowerCase();\n if (normalized === \"required\") {\n return \"required\";\n }\n\n if (normalized === \"disabled\") {\n return \"disabled\";\n }\n\n return \"enabled\";\n}\n\nfunction normalizeAuthPlugin(value: unknown): FirebirdAuthPlugin {\n const normalized = String(value ?? \"\").trim().toLowerCase();\n\n if (normalized === \"legacy_auth\" || normalized === \"legacy\") {\n return \"Legacy_Auth\";\n }\n\n if (normalized === \"srp256\") {\n return \"Srp256\";\n }\n\n return \"Srp\";\n}\n\nfunction toWireCryptFlag(mode: FirebirdWireCryptMode): number {\n switch (mode) {\n case \"required\":\n return WIRE_CRYPT_REQUIRED;\n case \"disabled\":\n return WIRE_CRYPT_DISABLE;\n default:\n return WIRE_CRYPT_ENABLE;\n }\n}\n\nfunction normalizeAuthPluginList(value: unknown): FirebirdAuthPlugin[] {\n if (!Array.isArray(value) || value.length === 0) {\n return [...DEFAULT_AUTH_PLUGIN_LIST];\n }\n\n const normalized = value\n .map((entry: unknown) => normalizeAuthPlugin(entry))\n .filter((entry: FirebirdAuthPlugin, index: number, source: FirebirdAuthPlugin[]) => source.indexOf(entry) === index);\n\n return normalized.length > 0 ? normalized : [...DEFAULT_AUTH_PLUGIN_LIST];\n}\n\nexport function normalizeFirebirdOptions(options: Options): FirebirdOptions {\n const compatibilityOptions = options as FirebirdOptions;\n return {\n ...options,\n wireCrypt: normalizeWireCryptMode(compatibilityOptions.wireCrypt),\n pluginName: normalizeAuthPlugin(compatibilityOptions.pluginName),\n authPlugins: normalizeAuthPluginList(compatibilityOptions.authPlugins),\n };\n}\n\nfunction isRetryableCompatibilityError(error: unknown): boolean {\n const message = String((error as { message?: unknown })?.message ?? error ?? \"\").toLowerCase();\n return message.includes(\"incompatible wire encryption\")\n || message.includes(\"no matching plugins on server\")\n || message.includes(\"unknown auth plugin\")\n || message.includes(\"unknow auth plugin\");\n}\n\nfunction pushUniqueCandidate(target: FirebirdOptions[], candidate: FirebirdOptions): void {\n const normalized = normalizeFirebirdOptions(candidate);\n const key = `${normalized.pluginName}|${normalized.wireCrypt}|${(normalized.authPlugins ?? []).join(\",\")}`;\n const alreadyPresent = target.some((entry) => {\n const normalizedEntry = normalizeFirebirdOptions(entry);\n return `${normalizedEntry.pluginName}|${normalizedEntry.wireCrypt}|${(normalizedEntry.authPlugins ?? []).join(\",\")}` === key;\n });\n\n if (!alreadyPresent) {\n target.push(normalized);\n }\n}\n\nexport function buildFirebirdCompatibilityCandidates(options: Options): FirebirdOptions[] {\n const normalized = normalizeFirebirdOptions(options);\n const compatibilityOptions = options as FirebirdOptions;\n const hasExplicitPlugin = compatibilityOptions.pluginName !== undefined;\n const hasExplicitWireCrypt = compatibilityOptions.wireCrypt !== undefined;\n const candidates: FirebirdOptions[] = [];\n\n pushUniqueCandidate(candidates, normalized);\n\n if (hasExplicitPlugin && hasExplicitWireCrypt) {\n return candidates;\n }\n\n if (hasExplicitPlugin) {\n pushUniqueCandidate(candidates, { ...normalized, wireCrypt: \"disabled\" });\n pushUniqueCandidate(candidates, { ...normalized, wireCrypt: \"enabled\" });\n return candidates;\n }\n\n if (hasExplicitWireCrypt) {\n pushUniqueCandidate(candidates, { ...normalized, pluginName: \"Srp256\" });\n pushUniqueCandidate(candidates, { ...normalized, pluginName: \"Srp\" });\n pushUniqueCandidate(candidates, { ...normalized, pluginName: \"Legacy_Auth\" });\n return candidates;\n }\n\n pushUniqueCandidate(candidates, { ...normalized, pluginName: \"Srp256\", wireCrypt: \"enabled\" });\n pushUniqueCandidate(candidates, { ...normalized, pluginName: \"Srp\", wireCrypt: \"enabled\" });\n pushUniqueCandidate(candidates, { ...normalized, pluginName: \"Srp256\", wireCrypt: \"disabled\" });\n pushUniqueCandidate(candidates, { ...normalized, pluginName: \"Srp\", wireCrypt: \"disabled\" });\n pushUniqueCandidate(candidates, { ...normalized, pluginName: \"Legacy_Auth\", wireCrypt: \"disabled\" });\n return candidates;\n}\n\nexport function shouldRetryFirebirdCompatibility(error: unknown): boolean {\n return isRetryableCompatibilityError(error);\n}\n\nexport function describeFirebirdCompatibilityOptions(options: Options): string {\n const normalized = normalizeFirebirdOptions(options);\n return `plugin=${normalized.pluginName}, wireCrypt=${normalized.wireCrypt}, authPlugins=${(normalized.authPlugins ?? []).join(\"/\")}`;\n}\n\nexport function ensureEsNodeFirebirdCompatibilityPatch(): void {\n const firebird = Firebird as FirebirdModuleLike;\n const connectionPrototype = firebird.Connection?.prototype;\n\n if (!connectionPrototype?.connect || connectionPrototype.__emilsoftwareWireCryptPatched) {\n return;\n }\n\n const originalConnect = connectionPrototype.connect;\n\n connectionPrototype.connect = function patchedConnect(\n this: ConnectionLike,\n options: FirebirdOptions,\n callback: unknown,\n ) {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const wireCryptFlag = toWireCryptFlag(normalizedOptions.wireCrypt);\n const authPlugin = normalizedOptions.pluginName;\n const authPlugins = normalizedOptions.authPlugins ?? DEFAULT_AUTH_PLUGIN_LIST;\n\n this.accept ??= { protocolMinimumType: 0, pluginName: authPlugin };\n\n const blr = this._blr;\n const originalAddBytes = blr?.addBytes;\n const originalAddString = blr?.addString;\n\n if (!blr || !originalAddBytes || !originalAddString) {\n return originalConnect.call(this, normalizedOptions, callback);\n }\n\n const patchedOptions = authPlugin === \"Srp256\"\n ? { ...normalizedOptions, pluginName: \"Srp\" as FirebirdAuthPlugin }\n : normalizedOptions;\n\n blr.addBytes = function patchedAddBytes(bytes: number[], ...args: unknown[]) {\n if (Array.isArray(bytes) && bytes.length === 6 && bytes[0] === CNCT_CLIENT_CRYPT && bytes[1] === 4) {\n return originalAddBytes.call(this, [bytes[0], bytes[1], wireCryptFlag, 0, 0, 0], ...args);\n }\n\n return originalAddBytes.call(this, bytes, ...args);\n };\n\n blr.addString = function patchedAddString(code: number, value: string, encoding?: string) {\n if (code === CNCT_PLUGIN_NAME) {\n return originalAddString.call(this, code, authPlugin, encoding);\n }\n\n if (code === CNCT_PLUGIN_LIST) {\n return originalAddString.call(this, code, authPlugins.join(\",\"), encoding);\n }\n\n return originalAddString.call(this, code, value, encoding);\n };\n\n try {\n return originalConnect.call(this, patchedOptions, callback);\n } finally {\n blr.addBytes = originalAddBytes;\n blr.addString = originalAddString;\n }\n };\n\n connectionPrototype.__emilsoftwareWireCryptPatched = true;\n}\n\nensureEsNodeFirebirdCompatibilityPatch();\n"]}
1
+ {"version":3,"file":"firebird-compat.js","sourceRoot":"","sources":["../src/firebird-compat.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Firebird from \"es-node-firebird\";\nimport { Options } from \"es-node-firebird\";\n\nexport type FirebirdWireCryptMode = \"disabled\" | \"enabled\" | \"required\";\nexport type FirebirdAuthPlugin = \"Legacy_Auth\" | \"Srp\" | \"Srp256\";\n\nexport type FirebirdOptions = Options & {\n wireCrypt?: FirebirdWireCryptMode;\n pluginName?: FirebirdAuthPlugin;\n authPlugins?: FirebirdAuthPlugin[];\n connectTimeoutMs?: number;\n connectTimeout?: number;\n compatibilityProbeTimeoutMs?: number;\n compatibilityTotalTimeoutMs?: number;\n};\n\nconst CNCT_PLUGIN_NAME = 8;\nconst CNCT_PLUGIN_LIST = 10;\nconst CNCT_CLIENT_CRYPT = 11;\nconst WIRE_CRYPT_DISABLE = 0;\nconst WIRE_CRYPT_ENABLE = 1;\nconst WIRE_CRYPT_REQUIRED = 2;\nconst DEFAULT_AUTH_PLUGIN_LIST: FirebirdAuthPlugin[] = [\"Srp256\", \"Srp\", \"Legacy_Auth\"];\n\ntype BlrWriterLike = {\n addBytes: (bytes: number[], ...args: unknown[]) => unknown;\n addString: (code: number, value: string, encoding?: string) => unknown;\n};\n\ntype ConnectionLike = {\n _blr?: BlrWriterLike;\n accept?: {\n protocolMinimumType?: number;\n pluginName?: string;\n };\n};\n\ntype FirebirdModuleLike = {\n Connection?: {\n prototype?: {\n connect?: (this: ConnectionLike, options: FirebirdOptions, callback: unknown) => unknown;\n __emilsoftwareWireCryptPatched?: boolean;\n };\n };\n};\n\nfunction normalizeWireCryptMode(value: unknown): FirebirdWireCryptMode {\n const normalized = String(value ?? \"\").trim().toLowerCase();\n if (normalized === \"required\") {\n return \"required\";\n }\n\n if (normalized === \"disabled\") {\n return \"disabled\";\n }\n\n return \"enabled\";\n}\n\nfunction normalizeAuthPlugin(value: unknown): FirebirdAuthPlugin {\n const normalized = String(value ?? \"\").trim().toLowerCase();\n\n if (normalized === \"legacy_auth\" || normalized === \"legacy\") {\n return \"Legacy_Auth\";\n }\n\n if (normalized === \"srp256\") {\n return \"Srp256\";\n }\n\n return \"Srp\";\n}\n\nfunction toWireCryptFlag(mode: FirebirdWireCryptMode): number {\n switch (mode) {\n case \"required\":\n return WIRE_CRYPT_REQUIRED;\n case \"disabled\":\n return WIRE_CRYPT_DISABLE;\n default:\n return WIRE_CRYPT_ENABLE;\n }\n}\n\nfunction normalizeAuthPluginList(value: unknown): FirebirdAuthPlugin[] {\n if (!Array.isArray(value) || value.length === 0) {\n return [...DEFAULT_AUTH_PLUGIN_LIST];\n }\n\n const normalized = value\n .map((entry: unknown) => normalizeAuthPlugin(entry))\n .filter((entry: FirebirdAuthPlugin, index: number, source: FirebirdAuthPlugin[]) => source.indexOf(entry) === index);\n\n return normalized.length > 0 ? normalized : [...DEFAULT_AUTH_PLUGIN_LIST];\n}\n\nexport function normalizeFirebirdOptions(options: Options): FirebirdOptions {\n const compatibilityOptions = options as FirebirdOptions;\n return {\n ...options,\n wireCrypt: normalizeWireCryptMode(compatibilityOptions.wireCrypt),\n pluginName: normalizeAuthPlugin(compatibilityOptions.pluginName),\n authPlugins: normalizeAuthPluginList(compatibilityOptions.authPlugins),\n };\n}\n\nfunction isRetryableCompatibilityError(error: unknown): boolean {\n const message = String((error as { message?: unknown })?.message ?? error ?? \"\").toLowerCase();\n return message.includes(\"incompatible wire encryption\")\n || message.includes(\"no matching plugins on server\")\n || message.includes(\"unknown auth plugin\")\n || message.includes(\"unknow auth plugin\")\n || message.includes(\"timeout during firebird attach\");\n}\n\nfunction pushUniqueCandidate(target: FirebirdOptions[], candidate: FirebirdOptions): void {\n const normalized = normalizeFirebirdOptions(candidate);\n const key = `${normalized.pluginName}|${normalized.wireCrypt}|${(normalized.authPlugins ?? []).join(\",\")}`;\n const alreadyPresent = target.some((entry) => {\n const normalizedEntry = normalizeFirebirdOptions(entry);\n return `${normalizedEntry.pluginName}|${normalizedEntry.wireCrypt}|${(normalizedEntry.authPlugins ?? []).join(\",\")}` === key;\n });\n\n if (!alreadyPresent) {\n target.push(normalized);\n }\n}\n\nfunction appendPluginCandidates(\n target: FirebirdOptions[],\n base: FirebirdOptions,\n pluginName: FirebirdAuthPlugin,\n wireCryptModes: FirebirdWireCryptMode[],\n): void {\n wireCryptModes.forEach((wireCrypt) => {\n pushUniqueCandidate(target, { ...base, pluginName, wireCrypt });\n });\n}\n\nexport function buildFirebirdCompatibilityCandidates(options: Options): FirebirdOptions[] {\n const normalized = normalizeFirebirdOptions(options);\n const compatibilityOptions = options as FirebirdOptions;\n const hasExplicitPlugin = compatibilityOptions.pluginName !== undefined;\n const hasExplicitWireCrypt = compatibilityOptions.wireCrypt !== undefined;\n const candidates: FirebirdOptions[] = [];\n\n pushUniqueCandidate(candidates, normalized);\n\n if (hasExplicitPlugin && hasExplicitWireCrypt) {\n return candidates;\n }\n\n if (hasExplicitPlugin) {\n const wireCryptModes = normalized.pluginName === \"Legacy_Auth\"\n ? [\"disabled\", \"enabled\"] as FirebirdWireCryptMode[]\n : [\"enabled\", \"required\", \"disabled\"] as FirebirdWireCryptMode[];\n\n appendPluginCandidates(candidates, normalized, normalized.pluginName!, wireCryptModes);\n return candidates;\n }\n\n if (hasExplicitWireCrypt) {\n appendPluginCandidates(candidates, normalized, \"Srp256\", [normalized.wireCrypt!]);\n appendPluginCandidates(candidates, normalized, \"Srp\", [normalized.wireCrypt!]);\n appendPluginCandidates(candidates, normalized, \"Legacy_Auth\", [normalized.wireCrypt!]);\n return candidates;\n }\n\n appendPluginCandidates(candidates, normalized, \"Srp256\", [\"enabled\", \"required\", \"disabled\"]);\n appendPluginCandidates(candidates, normalized, \"Srp\", [\"enabled\", \"required\", \"disabled\"]);\n appendPluginCandidates(candidates, normalized, \"Legacy_Auth\", [\"disabled\", \"enabled\"]);\n return candidates;\n}\n\nexport function shouldRetryFirebirdCompatibility(error: unknown): boolean {\n return isRetryableCompatibilityError(error);\n}\n\nexport function describeFirebirdCompatibilityOptions(options: Options): string {\n const normalized = normalizeFirebirdOptions(options);\n return `plugin=${normalized.pluginName}, wireCrypt=${normalized.wireCrypt}, authPlugins=${(normalized.authPlugins ?? []).join(\"/\")}`;\n}\n\nexport function ensureEsNodeFirebirdCompatibilityPatch(): void {\n const firebird = Firebird as FirebirdModuleLike;\n const connectionPrototype = firebird.Connection?.prototype;\n\n if (!connectionPrototype?.connect || connectionPrototype.__emilsoftwareWireCryptPatched) {\n return;\n }\n\n const originalConnect = connectionPrototype.connect;\n\n connectionPrototype.connect = function patchedConnect(\n this: ConnectionLike,\n options: FirebirdOptions,\n callback: unknown,\n ) {\n const normalizedOptions = normalizeFirebirdOptions(options);\n const wireCryptFlag = toWireCryptFlag(normalizedOptions.wireCrypt);\n const authPlugin = normalizedOptions.pluginName;\n const authPlugins = normalizedOptions.authPlugins ?? DEFAULT_AUTH_PLUGIN_LIST;\n\n this.accept ??= { protocolMinimumType: 0, pluginName: authPlugin };\n\n const blr = this._blr;\n const originalAddBytes = blr?.addBytes;\n const originalAddString = blr?.addString;\n\n if (!blr || !originalAddBytes || !originalAddString) {\n return originalConnect.call(this, normalizedOptions, callback);\n }\n\n const patchedOptions = authPlugin === \"Srp256\"\n ? { ...normalizedOptions, pluginName: \"Srp\" as FirebirdAuthPlugin }\n : normalizedOptions;\n\n blr.addBytes = function patchedAddBytes(bytes: number[], ...args: unknown[]) {\n if (Array.isArray(bytes) && bytes.length === 6 && bytes[0] === CNCT_CLIENT_CRYPT && bytes[1] === 4) {\n return originalAddBytes.call(this, [bytes[0], bytes[1], wireCryptFlag, 0, 0, 0], ...args);\n }\n\n return originalAddBytes.call(this, bytes, ...args);\n };\n\n blr.addString = function patchedAddString(code: number, value: string, encoding?: string) {\n if (code === CNCT_PLUGIN_NAME) {\n return originalAddString.call(this, code, authPlugin, encoding);\n }\n\n if (code === CNCT_PLUGIN_LIST) {\n return originalAddString.call(this, code, authPlugins.join(\",\"), encoding);\n }\n\n return originalAddString.call(this, code, value, encoding);\n };\n\n try {\n return originalConnect.call(this, patchedOptions, callback);\n } finally {\n blr.addBytes = originalAddBytes;\n blr.addString = originalAddString;\n }\n };\n\n connectionPrototype.__emilsoftwareWireCryptPatched = true;\n}\n\nensureEsNodeFirebirdCompatibilityPatch();\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "emilsoftware-utilities",
3
- "version": "2.0.0-dev.3",
3
+ "version": "2.0.0-dev.5",
4
4
  "description": "Utilities for EmilSoftware",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",