I’m working on an API for tax issuance and using a library in .so format. The library is available here, and you can download it here. i split task with worker_threads.js
I’m starting a new worker instance and loading the .so file using napi-ffi. The code works fine during execution, but it causes a segmentation fault when I close the worker.
Here’s some additional context:
I’m using the express library to run the API.
The environment is Ubuntu.
Has anyone encountered a similar issue or can help me debug this?
Thank you in advance!
the Code index.js;
const express = require('express');//const cors = require('cors');//const fs = require('fs');const bodyParser = require('body-parser');// require('dotenv').config()const port = 5723;const { Worker } = require('node:worker_threads')// const dbConnect = require(`${__dirname}/lib/databaseConnector`);// const db = new dbConnect();const app = express()app.use(bodyParser.urlencoded({ extended: false }));app.use(bodyParser.json())const path = require("node:path")//// Evento NOTA FISCAL//app.get('/NFE', function (req, res) { var post = { body: req.body, headers: req.headers } try { const worker = new Worker(path.resolve(__dirname, 'NFE.js'), post) worker.on('message', (data) => res.status(200).send(data)); } catch (error) { console.log(error) } //worker.postMessage(post);});app.get('/', async function (req, res) { var html = "<html><body><h1>Hera</h1></body></html>" res.send(html)}),1app.listen(port, () => { console.log(`servidor rodando ${port}`)});the NFE.js code
const { parentPort, workerData } = require("node:worker_threads")parentPort.on('message', async (req) => {})async function loadAcbr(){ const ref = require("ref-napi"); const path = require("node:path"); const acbrLib = require('./interface_nfe.js'); const handle = ref.alloc('pointer'); var buflength = 256; const aloc_sResposta = Buffer.alloc(buflength); const aloc_esTamanho = ref.alloc("int"); //Diretórios usados // var ret = acbrLib.NFE_Inicializar(handle, './NFeConfig.ini', '') // var pathLog = path.resolve(__dirname) //acbrLib.NFE_ConfigGravarValor(handle, "Principal", "LogPath", './log') //acbrLib.NFE_Finalizar(handle) parentPort.postMessage({ "MESSAGE": "fim", }); parentPort.close();}loadAcbr()the interface_nfe.js code
const path = require('path');const ffi = require('ffi-napi');// inicia variável de acordo com o OSif(process.platform == 'win32'){ var pathDllACBrLibNFe = path.join(__dirname, 'ACBrNFe64.dll')}else if(process.platform == 'linux'){ var pathDllACBrLibNFe = path.join(__dirname, 'libacbrnfe64.so')}module.exports = ffi.Library(pathDllACBrLibNFe, { //Métodos da Biblioteca // NFE_Inicializar([eArqConfig, eChaveCrypt]); NFE_Inicializar: ['int', ['pointer', 'string', 'string']], // NFE_Finalizar(); NFE_Finalizar: ['int', ['pointer']], // NFE_UltimoRetorno(sMensagem, ref esTamanho); NFE_UltimoRetorno: ['int', ['pointer', 'string', 'string']], // // NFE_Nome(sNome, ref esTamanho); // NFE_Nome: ['int', [ 'string', 'string']], // // NFE_Versao(sVersao, ref esTamanho); // NFE_Versao: ['int', [ 'string', 'string']], //Métodos de Configuração // NFE_ConfigLer([eArqConfig]); NFE_ConfigLer: ['int', ['pointer', 'string']], // NFE_ConfigGravar([eArqConfig]); NFE_ConfigGravar: ['int', ['pointer', 'string']], // NFE_ConfigLerValor(eSessao, eChave, sValor, esTamanho); NFE_ConfigLerValor: ['int', ['pointer', 'string', 'string', 'string', 'string']], // NFE_ConfigGravarValor(eSessao, eChave, sValor); NFE_ConfigGravarValor: ['int', ['pointer', 'string', 'string', 'string']], // NFE_ConfigImportar([eArqConfig]); NFE_ConfigImportar: ['int', ['pointer', 'string']], // NFE_ConfigExportar(sMensagem, ref esTamanho); NFE_ConfigExportar: ['int', ['pointer', 'string', 'string']], //Métodos NFe // NFE_CarregarXML(eArquivoOuXML); NFE_CarregarXML: ['int', ['pointer', 'string']], // NFE_CarregarINI(eArquivoOuINI); NFE_CarregarINI: ['int', ['pointer', 'string']], // NFE_ObterXml(AIndex, sResposta, esTamanho); NFE_ObterXml: ['int', ['pointer', 'int', 'string', 'string']], // NFE_GravarXml(AIndex, [eNomeArquivo], [ePathArquivo]); NFE_GravarXml: ['int', ['pointer', 'int', 'string', 'string']], // NFE_ObterIni(AIndex, sResposta, esTamanho); NFE_ObterIni: ['int', ['pointer', 'int', 'string', 'string']], // NFE_GravarIni(AIndex, eNomeArquivo, [ePathArquivo]); NFE_GravarIni: ['int', ['pointer', 'int', 'string', 'string']], // NFE_CarregarEventoXML(eArquivoOuXML); NFE_CarregarEventoXML: ['int', ['pointer', 'string']], // NFE_CarregarEventoINI(eArquivoOuINI); NFE_CarregarEventoINI: ['int', ['pointer', 'string']], // NFE_LimparLista(); NFE_LimparLista: ['int', ['pointer']], // NFE_LimparListaEventos(); NFE_LimparListaEventos: ['int', ['pointer']], // NFE_Assinar(); NFE_Assinar: ['int', ['pointer']], // NFE_Validar(); NFE_Validar: ['int', ['pointer']], // NFE_ValidarRegrasdeNegocios(sResposta, esTamanho); NFE_ValidarRegrasdeNegocios: ['int', ['pointer', 'string', 'string']], // NFE_VerificarAssinatura(sResposta, esTamanho); NFE_VerificarAssinatura: ['int', ['pointer', 'string', 'string']], // NFE_GerarChave(ACodigoUF, ACodigoNumerico, AModelo, ASerie, ANumero, ATpEmi, AEmissao, ACNPJCPF, sResposta, esTamanho); NFE_GerarChave: ['int', ['pointer', 'int', 'int', 'int', 'int', 'int', 'int', 'string', 'string', 'string', 'string']], // NFE_ObterCertificados(sResposta, esTamanho); NFE_ObterCertificados: ['int', ['pointer', 'string', 'string']], // NFE_GetPath(ATipo, sResposta, esTamanho); NFE_GetPath: ['int', ['pointer', 'int', 'string', 'string']], // NFE_GetPathEvento(ACodEvento, sResposta, esTamanho); NFE_GetPathEvento: ['int', ['pointer', 'int', 'string', 'string']], // NFE_StatusServico(sResposta, esTamanho); NFE_StatusServico: ['int', ['pointer', 'string', 'string']], // NFE_Consultar( eChaveOuNFe, AExtrairEventos, sResposta, esTamanho); NFE_Consultar: ['int', ['pointer', 'string', 'bool', 'string', 'string']], // NFE_ConsultarRecibo(ARecibo, sResposta, esTamanho); NFE_ConsultarRecibo: ['int', ['pointer', 'string', 'string', 'string']], // NFE_ConsultaCadastro(cUF, nDocumento, nIE, sResposta, esTamanho); NFE_ConsultaCadastro: ['int', ['pointer', 'string', 'string', 'bool', 'string', 'string']], // NFE_Inutilizar(ACNPJ, AJustificativa, Ano, Modelo, Serie, NumeroInicial, NumeroFinal, sResposta, esTamanho); NFE_Inutilizar: ['int', ['pointer', 'string', 'string', 'int', 'int', 'int', 'int', 'int', 'string', 'string']], // NFE_Enviar( (ALote, AImprimir, ASincrono, AZipado, sResposta, esTamanho); NFE_Enviar: ['int', ['pointer', 'int', 'bool', 'bool', 'bool', 'string', 'string']], // NFE_Cancelar(eChave, eJustificativa, eCNPJ, ALote, sResposta, esTamanho); NFE_Cancelar: ['int', ['pointer', 'string', 'string', 'string', 'int', 'string', 'string']], // NFE_EnviarEvento(idLote, sResposta, esTamanho); NFE_EnviarEvento: ['int', ['pointer', 'int', 'string', 'string']], // NFE_DistribuicaoDFePorUltNSU(AcUFAutor, eCNPJCPF, eultNSU, sResposta, esTamanho); NFE_DistribuicaoDFePorUltNSU: ['int', ['pointer', 'int', 'string', 'string', 'string', 'string']], // NFE_DistribuicaoDFePorNSU(AcUFAutor, eCNPJCPF, eNSU, sResposta, esTamanho); NFE_DistribuicaoDFePorNSU: ['int', ['pointer', 'int', 'string', 'string', 'string', 'string']], // NFE_DistribuicaoDFePorChave(AcUFAutor, eCNPJCPF, eChave, sResposta, esTamanho); NFE_DistribuicaoDFePorChave: ['int', ['pointer', 'int', 'string', 'string', 'string', 'string']], // NFE_EnviarEmail(ePara, eXMLNFe, AEnviaPDF, eAssunto, eCC, eAnexos, eMensagem); NFE_EnviarEmail: ['int', ['pointer', 'string', 'string', 'bool', 'string', 'string', 'string', 'string']], // NFE_EnviarEmailEvento(ePara, eChaveEvento, eChaveNFe, AEnviaPDF, eAssunto, eCC, eAnexos, eMensagem); NFE_EnviarEmailEvento: ['int', ['pointer', 'string', 'string', 'string', 'bool', 'string', 'string', 'string', 'string']], // NFE_Imprimir([cImpressora], [nNumCopias], [cProtocolo], [bMostrarPreview], [cMarcaDagua], [bViaConsumidor], [bSimplificado]); NFE_Imprimir: ['int', ['pointer', 'string', 'int', 'string', 'string', 'string', 'string', 'string',]], // NFE_ImprimirPDF(); NFE_ImprimirPDF: ['int', ['pointer']], // NFE_SalvarPDF(sResposta, esTamanho); NFE_SalvarPDF: ['int', ['pointer', 'string', 'string']], // NFE_ImprimirEvento(eArquivoXmlNFe, eArquivoXmlEvento); NFE_ImprimirEvento: ['int', ['pointer', 'string', 'string']], // NFE_ImprimirEventoPDF(eArquivoXmlNFe, eArquivoXmlEvento); NFE_ImprimirEventoPDF: ['int', ['pointer', 'string', 'string']], // NFE_SalvarEventoPDF(eArquivoXmlNFe, eArquivoXmlEvento); NFE_SalvarEventoPDF: ['int', ['pointer', 'string', 'string']], // NFE_ImprimirInutilizacao(eArquivoXml); NFE_ImprimirInutilizacao: ['int', ['pointer', 'string']], // NFE_ImprimirInutilizacaoPDF(eArquivoXml); NFE_ImprimirInutilizacaoPDF: ['int', ['pointer', 'string']], // NFE_SalvarInutilizacaoPDF(eArquivoXml); NFE_SalvarInutilizacaoPDF: ['int', ['pointer', 'string']],});