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)
}),
1
app.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 OS
if(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']],
});