#!/usr/bin/env node /** * postinstall.js - Aplica patches de compatibilidade no node-firebird * após npm install, garantindo compatibilidade com Node.js 22+. */ const fs = require('fs'); const path = require('path'); const connPath = path.resolve(__dirname, '../node_modules/node-firebird/lib/wire/connection.js'); if (!fs.existsSync(connPath)) { console.log('[patch] connection.js not found, skipping'); process.exit(0); } let content = fs.readFileSync(connPath, 'utf8'); let patched = false; // ============================================================ // Patch 1: SRP empty buffer (Firebird 3.0 Legacy_Auth) // ============================================================ const srpOld = ( ' // TODO : Fallback Srp256 to Srp ?\n' + ' /*if (!d.buffer) {\n' + ' cnx.sendOpContAuth(\n' + ' cnx.clientKeys.public.toString(16),\n' + ' DEFAULT_ENCODING,\n' + ' accept.pluginName\n' + ' );\n' + '\n' + ' return cb(new Error(\'login\'));\n' + ' }*/\n' + '\n' + ' // Check buffer contains salt\n' + ' var saltLen = d.buffer.readUInt16LE(0);' ); const srpNew = ( ' // No auth data from server - server accepted the connection\n' + ' // without requiring SRP. This happens with Firebird 3.0 when\n' + ' // the server already validated the client.\n' + ' if (!d || !d.buffer) {\n' + " accept.authData = '';\n" + " accept.sessionKey = '';\n" + ' } else {\n' + ' // Check buffer contains salt\n' + ' var saltLen = d.buffer.readUInt16LE(0);' ); if (content.includes(srpOld)) { content = content.replace(srpOld, srpNew); patched = true; console.log('[patch] Patch 1 (SRP) applied'); } // ============================================================ // Patch 2: Missing closing brace (Node.js 22+ syntax) // ============================================================ const syntaxOld = ( ' accept.authData = proof.authData.toString(16);\n' + ' accept.sessionKey = proof.clientSessionKey;\n' + ' } else if (accept.pluginName === Const.AUTH_PLUGIN_LEGACY) {' ); const syntaxNew = ( ' accept.authData = proof.authData.toString(16);\n' + ' accept.sessionKey = proof.clientSessionKey;\n' + ' } // fecha o else do if (!d || !d.buffer)\n' + ' } else if (accept.pluginName === Const.AUTH_PLUGIN_LEGACY) {' ); if (content.includes(syntaxOld)) { content = content.replace(syntaxOld, syntaxNew); patched = true; console.log('[patch] Patch 2 (syntax Node22) applied'); } if (patched) { fs.writeFileSync(connPath, content, 'utf8'); console.log('[patch] node-firebird patched successfully'); } else { console.log('[patch] node-firebird already patched or not needed'); }