cosmemilton-acbr-node 0.1.2 → 0.2.1

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.
Files changed (66) hide show
  1. package/LICENSE +502 -502
  2. package/NOTICE +8 -8
  3. package/README.md +40 -11
  4. package/acbr.config.json +16 -16
  5. package/acbr.lock.json +0 -0
  6. package/dist/cli.js +375 -176
  7. package/dist/cli.js.map +4 -4
  8. package/dist/contract.json +0 -0
  9. package/dist/index.cjs +36 -11
  10. package/dist/index.cjs.map +2 -2
  11. package/dist/index.js +36 -11
  12. package/dist/index.js.map +2 -2
  13. package/dist/runtime.cjs +36 -11
  14. package/dist/runtime.cjs.map +2 -2
  15. package/dist/runtime.js +36 -11
  16. package/dist/runtime.js.map +2 -2
  17. package/dist/types/generated/acbr/index.d.ts +1 -0
  18. package/dist/types/generated/acbr/models.d.ts +0 -0
  19. package/dist/types/src/cli.d.ts +0 -0
  20. package/dist/types/src/config.d.ts +0 -0
  21. package/dist/types/src/contract-help.d.ts +0 -0
  22. package/dist/types/src/diagnostics.d.ts +2 -0
  23. package/dist/types/src/generator.d.ts +0 -0
  24. package/dist/types/src/index.d.ts +1 -0
  25. package/dist/types/src/native-build.d.ts +1 -0
  26. package/dist/types/src/offline-check.d.ts +0 -0
  27. package/dist/types/src/offline-fixture.d.ts +0 -0
  28. package/dist/types/src/runtime.d.ts +1 -0
  29. package/dist/types/src/source.d.ts +0 -0
  30. package/dist/types/src/types.d.ts +4 -2
  31. package/docs/API.md +116 -90
  32. package/docs/ARQUITETURA.md +19 -15
  33. package/docs/CI.md +60 -60
  34. package/docs/CLI.md +1 -1
  35. package/docs/DEPENDENCIAS-NATIVAS.md +103 -93
  36. package/docs/VALIDACAO.md +67 -67
  37. package/docs/examples/recuperar-xml.mjs +54 -0
  38. package/docs/licenses/common/Apache-2.0.txt +202 -0
  39. package/docs/licenses/common/Artistic.txt +131 -0
  40. package/docs/licenses/common/GFDL-1.2.txt +397 -0
  41. package/docs/licenses/common/GPL-1.txt +251 -0
  42. package/docs/licenses/common/GPL-2.txt +339 -0
  43. package/docs/licenses/common/GPL-3.txt +674 -0
  44. package/docs/licenses/common/GPL.txt +674 -0
  45. package/docs/licenses/common/LGPL-2.1.txt +502 -0
  46. package/docs/licenses/common/LGPL-2.txt +481 -0
  47. package/docs/licenses/common/LGPL-3.txt +165 -0
  48. package/docs/licenses/common/LGPL.txt +165 -0
  49. package/docs/licenses/common/ORIGIN.json +208 -0
  50. package/docs/licenses/fpc/COPYING.FPC +25 -25
  51. package/docs/licenses/fpc/COPYING.GPL.txt +340 -340
  52. package/docs/licenses/fpc/COPYING.LGPL.txt +504 -504
  53. package/docs/licenses/fpc/ORIGIN.json +21 -21
  54. package/docs/licenses/lazarus/COPYING.LGPL.txt +481 -481
  55. package/docs/licenses/lazarus/COPYING.modifiedLGPL.txt +26 -26
  56. package/docs/licenses/lazarus/COPYING.txt +46 -46
  57. package/docs/licenses/lazarus/ORIGIN.json +1 -1
  58. package/native/NativeMotor.pas +55 -3
  59. package/native/NativeProtocol.pas +3 -2
  60. package/native/NativeRecovery.pas +274 -0
  61. package/native/generated/AcbrModels.pas +0 -0
  62. package/package.json +6 -4
  63. package/scripts/build-native-deps.mjs +237 -237
  64. package/scripts/runtime-license-inventory.d.mts +5 -0
  65. package/scripts/runtime-license-inventory.mjs +161 -0
  66. package/tools/extract-model.lpr +119 -119
File without changes
package/dist/index.cjs CHANGED
@@ -259,6 +259,12 @@ var import_node_util = require("node:util");
259
259
  // src/diagnostics.ts
260
260
  var ETAPAS = /* @__PURE__ */ new Set(["configuracao", "documento", "runtime", "geracao", "validacao", "assinatura", "transmissao", "consulta", "cancelamento", "carta_correcao", "inutilizacao", "operacao", "limpeza"]);
261
261
  var CAMPOS = /* @__PURE__ */ new Set(["cnpj", "uf", "modelo", "ambiente", "contrato", "certificado", "certificado.senha", "certificado.pfx", "certificado.arquivo", "csc", "csc.id", "csc.valor", "timeoutMs", "limiteFila", "limiteBytes", "runtimeDirectory", "documento", "xml", "consulta", "chave", "recibo", "cancelamento", "protocolo", "justificativa", "cartaCorrecao", "correcao", "sequenciaEvento", "inutilizacao", "ano", "serie", "numeroInicial", "numeroFinal", "operacao", "signal"]);
262
+ var MAX_RECOVERED_XML_BYTES = 4 * 1024 * 1024;
263
+ function base64XmlRecuperadoValido(value) {
264
+ if (typeof value !== "string" || value.length === 0 || value.length > Math.ceil(MAX_RECOVERED_XML_BYTES / 3) * 4) return false;
265
+ const bytes = Buffer.from(value, "base64");
266
+ return bytes.length > 0 && bytes.length <= MAX_RECOVERED_XML_BYTES && bytes.toString("base64") === value;
267
+ }
262
268
  var CATALOGO = {
263
269
  CONFIGURACAO_INVALIDA: ["configuracao", "A configura\xE7\xE3o cont\xE9m um campo inv\xE1lido.", "Confira o campo indicado e seu tipo antes de continuar."],
264
270
  CONTRATO_INVALIDO: ["configuracao", "O contrato do cliente \xE9 inv\xE1lido.", "Use o contrato gerado junto com o cliente."],
@@ -274,6 +280,7 @@ var CATALOGO = {
274
280
  XML_NAO_ASSINADO: ["assinatura", "A opera\xE7\xE3o exige XML previamente assinado.", "Conclua a assinatura e a valida\xE7\xE3o antes de transmitir."],
275
281
  XML_ALTERADO: ["assinatura", "O XML assinado foi alterado.", "Use exatamente o XML assinado e persistido; n\xE3o edite seu conte\xFAdo."],
276
282
  RETORNO_INVALIDO: ["transmissao", "A identidade ou o protocolo do retorno fiscal \xE9 inv\xE1lido.", "Consulte a situa\xE7\xE3o fiscal antes de decidir repetir a opera\xE7\xE3o."],
283
+ RECUPERACAO_NAO_COMPROVADA: ["consulta", "A consulta n\xE3o comprovou a recupera\xE7\xE3o do XML autorizado.", "Preserve o XML assinado original e confira a situa\xE7\xE3o fiscal. N\xE3o transmita a nota para tentar recuperar o protocolo."],
277
284
  OPERACAO_FISCAL_FALHOU: ["operacao", "O motor n\xE3o conseguiu concluir a etapa fiscal.", "Confira a configura\xE7\xE3o da etapa, os dados do XML e as depend\xEAncias do runtime."],
278
285
  TLS_SERVIDOR_INVALIDO: ["transmissao", "A verifica\xE7\xE3o TLS do servi\xE7o fiscal falhou.", "Confira o servi\xE7o e a cadeia de confian\xE7a; mantenha a verifica\xE7\xE3o TLS habilitada."],
279
286
  CSC_INVALIDO: ["configuracao", "A configura\xE7\xE3o do CSC \xE9 inv\xE1lida.", "Confira id e valor do CSC sem registrar seu conte\xFAdo."],
@@ -282,6 +289,7 @@ var CATALOGO = {
282
289
  RUNTIME_INVALIDO: ["runtime", "O runtime fiscal \xE9 inv\xE1lido.", "Use um runtime distribu\xEDdo e compat\xEDvel com a plataforma."],
283
290
  RUNTIME_INCOMPLETO: ["runtime", "Falta um arquivo do runtime fiscal.", "Reinstale o runtime da plataforma."],
284
291
  RUNTIME_ALTERADO: ["runtime", "A integridade do runtime fiscal n\xE3o foi confirmada.", "Reinstale o runtime; n\xE3o desative a verifica\xE7\xE3o dos hashes."],
292
+ RUNTIME_SEM_CAPACIDADE: ["runtime", "O runtime instalado n\xE3o oferece esta opera\xE7\xE3o.", "Atualize o pacote principal e o runtime da plataforma para vers\xF5es compat\xEDveis com a opera\xE7\xE3o solicitada."],
285
293
  CONTRATO_DIVERGENTE: ["runtime", "Cliente e motor usam contratos diferentes.", "Use vers\xF5es compat\xEDveis ou regenere e recompile ambos."],
286
294
  DOCUMENTO_INVALIDO: ["documento", "O documento cont\xE9m dados incompat\xEDveis com o modelo.", "Valide os campos e tipos do documento antes de gerar o XML."],
287
295
  OPERACAO_INVALIDA: ["operacao", "Os par\xE2metros da opera\xE7\xE3o s\xE3o inv\xE1lidos.", "Informe um objeto com os campos exigidos pela opera\xE7\xE3o."],
@@ -308,7 +316,7 @@ var CATALOGO = {
308
316
  FALHA_LOCAL: ["operacao", "N\xE3o foi poss\xEDvel concluir a opera\xE7\xE3o local.", "Confira a etapa e os tipos dos dados; n\xE3o registre o erro bruto."]
309
317
  };
310
318
  function etapaDaOperacao(comando) {
311
- return { gerarXml: "geracao", validar: "validacao", assinar: "assinatura", transmitir: "transmissao", consultar: "consulta", cancelar: "cancelamento", cartaCorrecao: "carta_correcao", inutilizar: "inutilizacao" }[comando] ?? "operacao";
319
+ return { gerarXml: "geracao", validar: "validacao", assinar: "assinatura", transmitir: "transmissao", consultar: "consulta", recuperarXml: "consulta", cancelar: "cancelamento", cartaCorrecao: "carta_correcao", inutilizar: "inutilizacao" }[comando] ?? "operacao";
312
320
  }
313
321
  function criarDiagnosticoErro(codigo, desconhecido = false, detalhes = {}) {
314
322
  const safeCode = Object.hasOwn(CATALOGO, codigo) ? codigo : "FALHA_LOCAL";
@@ -348,18 +356,30 @@ function diagnosticarResultado(resultado, comando) {
348
356
  const protocolo = typeof resultado.protocolo === "string" && /^\d{15}$/.test(resultado.protocolo);
349
357
  const chave = typeof resultado.chave === "string" && /^\d{44}$/.test(resultado.chave);
350
358
  const autorizacao = (comando === "transmitir" || comando === "consultar") && resultado.estado === "AUTORIZADO" && [100, 150].includes(resultado.cStat) && protocolo && chave && (comando === "consultar" || resultado.envioIniciado !== false);
359
+ const xmlRecuperado = comando === "recuperarXml" && base64XmlRecuperadoValido(resultado.xmlBase64);
360
+ const recuperacao = comando === "recuperarXml" && resultado.estado === "XML_RECUPERADO" && resultado.cStat === 100 && protocolo && chave && semEvento && xmlRecuperado;
351
361
  const evento = comando === "cancelar" && resultado.estado === "CANCELADO" && [135, 136].includes(resultado.cStat) && chave || comando === "cartaCorrecao" && resultado.estado === "EVENTO_REGISTRADO" && resultado.cStat === 135 && chave || comando === "inutilizar" && resultado.estado === "INUTILIZADO" && resultado.cStat === 102;
352
362
  if (local && resultado.sucesso === true && semEvento) {
353
363
  statusEnvio = "nao_enviado";
354
364
  codigo = "ETAPA_LOCAL_CONCLUIDA";
355
365
  mensagem = "A etapa local foi conclu\xEDda; esta opera\xE7\xE3o n\xE3o transmitiu a nota.";
356
366
  acao = "Confira o resultado antes de seguir para a pr\xF3xima etapa.";
367
+ } else if (resultado.sucesso === true && recuperacao) {
368
+ statusEnvio = "autorizado";
369
+ codigo = "XML_RECUPERADO";
370
+ mensagem = "O XML autorizado foi recuperado por consulta; esta opera\xE7\xE3o n\xE3o transmitiu a nota.";
371
+ acao = "Guarde o XML recuperado com o protocolo de autoriza\xE7\xE3o.";
372
+ } else if (comando === "recuperarXml" && resultado.sucesso === false && resultado.codigo === "RECUPERACAO_NAO_COMPROVADA" && ["CONSULTADO", "ERRO"].includes(resultado.estado) && semEvento) {
373
+ statusEnvio = "nao_enviado";
374
+ codigo = "RECUPERACAO_NAO_COMPROVADA";
375
+ mensagem = CATALOGO.RECUPERACAO_NAO_COMPROVADA[1];
376
+ acao = CATALOGO.RECUPERACAO_NAO_COMPROVADA[2];
357
377
  } else if (resultado.sucesso === true && (autorizacao || evento && protocolo && resultado.envioIniciado !== false)) {
358
378
  statusEnvio = "autorizado";
359
379
  codigo = "OPERACAO_CONFIRMADA";
360
380
  mensagem = { AUTORIZADO: "A nota foi autorizada.", CANCELADO: "O cancelamento foi confirmado.", EVENTO_REGISTRADO: "O evento foi registrado.", INUTILIZADO: "A faixa foi inutilizada." }[resultado.estado];
361
381
  acao = "Guarde o resultado fiscal. N\xE3o repita esta opera\xE7\xE3o.";
362
- } else if (resultado.sucesso === false && (comando === "consultar" || resultado.envioIniciado !== false) && ["transmitir", "consultar", "cancelar", "cartaCorrecao", "inutilizar"].includes(comando) && Number.isInteger(resultado.cStat) && Number(resultado.cStat) > 0 && Number(resultado.cStat) <= 9999 && (resultado.estado === "DENEGADO" && [110, 301, 302].includes(resultado.cStat) || resultado.estado === "REJEITADO" && ![100, 150, 110, 301, 302, 101, 151, 155, 103, 104, 105, 108, 109, 204, 539, 573, 135, 136, 102, 217].includes(resultado.cStat))) {
382
+ } else if (resultado.sucesso === false && (comando === "consultar" || comando === "recuperarXml" || resultado.envioIniciado !== false) && ["transmitir", "consultar", "recuperarXml", "cancelar", "cartaCorrecao", "inutilizar"].includes(comando) && Number.isInteger(resultado.cStat) && Number(resultado.cStat) > 0 && Number(resultado.cStat) <= 9999 && (resultado.estado === "DENEGADO" && [110, 301, 302].includes(resultado.cStat) || resultado.estado === "REJEITADO" && ![100, 150, 110, 301, 302, 101, 151, 155, 103, 104, 105, 108, 109, 204, 539, 573, 135, 136, 102, 217].includes(resultado.cStat))) {
363
383
  statusEnvio = "rejeitado";
364
384
  codigo = resultado.estado === "DENEGADO" ? "NOTA_DENEGADA" : "OPERACAO_REJEITADA";
365
385
  mensagem = resultado.estado === "DENEGADO" ? "A nota foi denegada." : "A opera\xE7\xE3o foi rejeitada.";
@@ -403,7 +423,7 @@ var ErroAcbrNode = class extends Error {
403
423
 
404
424
  // src/runtime.ts
405
425
  var import_meta = {};
406
- var STATES = /* @__PURE__ */ new Set(["DENEGADO", "XML_GERADO", "VALIDADO", "ASSINADO", "AUTORIZADO", "REJEITADO", "PENDENTE", "INDETERMINADO", "CONSULTADO", "CANCELADO", "EVENTO_REGISTRADO", "INUTILIZADO", "ERRO"]);
426
+ var STATES = /* @__PURE__ */ new Set(["DENEGADO", "XML_GERADO", "VALIDADO", "ASSINADO", "XML_RECUPERADO", "AUTORIZADO", "REJEITADO", "PENDENTE", "INDETERMINADO", "CONSULTADO", "CANCELADO", "EVENTO_REGISTRADO", "INUTILIZADO", "ERRO"]);
407
427
  var UFS = new Set("AC AL AP AM BA CE DF ES GO MA MT MS MG PA PB PR PE PI RJ RN RS RO RR SC SP SE TO".split(" "));
408
428
  var MAX_BYTES = 8 * 1024 * 1024;
409
429
  var MAX_TEARDOWN_MS = 1e3;
@@ -435,6 +455,7 @@ async function resolveRuntime(directory, contract) {
435
455
  throw fail("RUNTIME_AUSENTE", "Manifesto do runtime n\xE3o encontrado.");
436
456
  }
437
457
  if (!validContract(m) || m.formatVersion !== 1 || !plain(m.files) || typeof m.executable !== "string" || m.platform !== process.platform || m.arch !== process.arch) throw fail("RUNTIME_INVALIDO", "Manifesto ou plataforma do runtime inv\xE1lidos.");
458
+ if (m.capabilities !== void 0 && (!Array.isArray(m.capabilities) || !m.capabilities.every((value) => typeof value === "string" && /^[A-Za-z][A-Za-z0-9_]{0,63}$/.test(value)))) throw fail("RUNTIME_INVALIDO", "Capacidades do runtime inv\xE1lidas.");
438
459
  if (m.sourceRevision !== contract.sourceRevision || m.contractHash !== contract.contractHash) throw fail("CONTRATO_DIVERGENTE", "Cliente e motor foram gerados de contratos diferentes; regenere e recompile.");
439
460
  for (const [name, hash] of Object.entries(m.files)) {
440
461
  if (typeof hash !== "string" || !/^[a-f0-9]{64}$/.test(hash)) throw fail("RUNTIME_INVALIDO", "Hash inv\xE1lido no runtime.");
@@ -449,7 +470,7 @@ async function resolveRuntime(directory, contract) {
449
470
  if ((0, import_node_crypto.createHash)("sha256").update(data).digest("hex") !== hash) throw fail("RUNTIME_ALTERADO", "O runtime n\xE3o corresponde ao manifesto distribu\xEDdo.");
450
471
  }
451
472
  if (!m.files[m.executable]) throw fail("RUNTIME_INVALIDO", "O execut\xE1vel n\xE3o consta no invent\xE1rio.");
452
- return { directory: root, executable: confined(root, m.executable) };
473
+ return { directory: root, executable: confined(root, m.executable), capabilities: new Set(m.capabilities ?? []) };
453
474
  }
454
475
  function criarEmissor(options) {
455
476
  const configFail = (campo) => fail("CONFIGURACAO_INVALIDA", "Informe campos e tipos v\xE1lidos na configura\xE7\xE3o.", void 0, false, { etapa: "configuracao", campo });
@@ -466,7 +487,7 @@ function criarEmissor(options) {
466
487
  if (options.validaDocumento !== void 0 && typeof options.validaDocumento !== "function" || options.criaProcesso !== void 0 && typeof options.criaProcesso !== "function") throw configFail();
467
488
  const cfg = { cnpj: options.cnpj, uf: options.uf, modelo: options.modelo, ambiente: options.ambiente, csc: options.csc ? { ...options.csc } : void 0 };
468
489
  const certificate = cert ? { ...cert, pfx: cert.pfx ? Buffer.from(cert.pfx) : void 0 } : void 0;
469
- const contract = { ...options.contrato };
490
+ const contract = { sourceRevision: options.contrato.sourceRevision, contractHash: options.contrato.contractHash };
470
491
  const timeout = options.timeoutMs ?? 12e4, capacity = options.limiteFila ?? 32, bytesLimit = options.limiteBytes ?? MAX_BYTES;
471
492
  if (!Number.isInteger(timeout) || timeout < 1 || timeout > 12e4) throw configFail("timeoutMs");
472
493
  if (!Number.isInteger(capacity) || capacity < 0 || capacity > 1e3) throw configFail("limiteFila");
@@ -489,6 +510,7 @@ function criarEmissor(options) {
489
510
  async function execute(item) {
490
511
  if (closed || item.signal?.aborted) throw fail("OPERACAO_CANCELADA", "Opera\xE7\xE3o cancelada antes da execu\xE7\xE3o.");
491
512
  const runtime = await (runtimePromise ??= resolveRuntime(options.runtimeDirectory, contract));
513
+ if (item.req.comando === "recuperarXml" && !runtime.capabilities.has("recuperarXml")) throw fail("RUNTIME_SEM_CAPACIDADE", "O runtime n\xE3o oferece recupera\xE7\xE3o de XML; atualize o pacote e o runtime compat\xEDvel.", item.req, false, { etapa: "runtime" });
492
514
  if (closed || item.signal?.aborted) throw fail("OPERACAO_CANCELADA", "Opera\xE7\xE3o cancelada antes da execu\xE7\xE3o.");
493
515
  return await new Promise((done, rejectExecution) => {
494
516
  let stopError;
@@ -611,9 +633,11 @@ function criarEmissor(options) {
611
633
  continue;
612
634
  }
613
635
  if (result || frame.versao !== 1 || frame.sourceRevision !== contract.sourceRevision || frame.contractHash !== contract.contractHash || typeof frame.sucesso !== "boolean" || !STATES.has(String(frame.estado))) throw Error();
614
- if (frame.xmlBase64 !== void 0 && (typeof frame.xmlBase64 !== "string" || !frame.xmlBase64.length || Buffer.from(frame.xmlBase64, "base64").toString("base64") !== frame.xmlBase64)) throw Error();
636
+ if (frame.xmlBase64 !== void 0 && (item.req.comando === "recuperarXml" ? !base64XmlRecuperadoValido(frame.xmlBase64) : typeof frame.xmlBase64 !== "string" || !frame.xmlBase64.length || Buffer.from(frame.xmlBase64, "base64").toString("base64") !== frame.xmlBase64)) throw Error();
615
637
  if (frame.cStat !== void 0 && (!Number.isInteger(frame.cStat) || Number(frame.cStat) < 1 || Number(frame.cStat) > 9999)) throw Error();
616
638
  if (frame.envioIniciado !== void 0 && typeof frame.envioIniciado !== "boolean" || sending && frame.envioIniciado === false) throw Error();
639
+ if (frame.estado === "XML_RECUPERADO" && item.req.comando !== "recuperarXml") throw Error();
640
+ if (item.req.comando === "recuperarXml" && (frame.sucesso === true || frame.estado === "XML_RECUPERADO") && (frame.sucesso !== true || frame.estado !== "XML_RECUPERADO" || frame.cStat !== 100 || typeof frame.chave !== "string" || !/^\d{44}$/.test(frame.chave) || typeof frame.protocolo !== "string" || !/^\d{15}$/.test(frame.protocolo) || typeof frame.xmlBase64 !== "string" || frame.envioIniciado === true || sending)) throw Error();
617
641
  const fiscal = frame;
618
642
  result = { ...fiscal, diagnostico: diagnosticarResultado(sending ? { ...fiscal, envioIniciado: true } : fiscal, item.req.comando) };
619
643
  } catch {
@@ -663,7 +687,7 @@ function criarEmissor(options) {
663
687
  if (signal !== void 0 && (!plain(signal) || typeof signal.aborted !== "boolean" || typeof signal.addEventListener !== "function" || typeof signal.removeEventListener !== "function")) throw fail("OPERACAO_INVALIDA", "Informe op\xE7\xF5es v\xE1lidas para a opera\xE7\xE3o.", void 0, false, { etapa: etapaDaOperacao(command), campo: "signal" });
664
688
  if (closed) throw closedError();
665
689
  if (operation.signal?.aborted) throw fail("OPERACAO_CANCELADA", "Opera\xE7\xE3o cancelada antes da execu\xE7\xE3o.");
666
- if (["assinar", "transmitir", "consultar", "cancelar", "cartaCorrecao", "inutilizar"].includes(command) && !certificate) throw fail("CERTIFICADO_AUSENTE", "A opera\xE7\xE3o exige um certificado A1.");
690
+ if (["assinar", "transmitir", "consultar", "recuperarXml", "cancelar", "cartaCorrecao", "inutilizar"].includes(command) && !certificate) throw fail("CERTIFICADO_AUSENTE", "A opera\xE7\xE3o exige um certificado A1.", void 0, false, { etapa: etapaDaOperacao(command) });
667
691
  if (command === "gerarXml") options.validaDocumento?.(data.documento);
668
692
  const config = { ...cfg };
669
693
  if (certificate) {
@@ -678,7 +702,7 @@ function criarEmissor(options) {
678
702
  }
679
703
  let bytes, req;
680
704
  try {
681
- bytes = Buffer.from(JSON.stringify({ versao: 1, id: (0, import_node_crypto.randomUUID)(), ...contract, comando: command, config, ...data }) + "\n", "utf8");
705
+ bytes = Buffer.from(JSON.stringify({ ...data, ...contract, versao: 1, id: (0, import_node_crypto.randomUUID)(), comando: command, config }) + "\n", "utf8");
682
706
  if (bytes.length > bytesLimit) throw Error();
683
707
  req = JSON.parse(bytes.toString("utf8"));
684
708
  } catch {
@@ -729,25 +753,26 @@ function criarEmissor(options) {
729
753
  validar: (xml, op) => request("validar", xmlData(xml), op),
730
754
  assinar: (xml, op) => request("assinar", xmlData(xml), op),
731
755
  transmitir: (xml, op) => request("transmitir", xmlData(xml), op),
756
+ recuperarXml: (xmlAssinado, opcoes) => request("recuperarXml", xmlData(xmlAssinado), opcoes),
732
757
  consultar: (consulta, op) => {
733
758
  checkObject(consulta, "consulta");
734
759
  checkKey(consulta.chave);
735
760
  if (consulta.recibo !== void 0 && (typeof consulta.recibo !== "string" || !/^\d{15}$/.test(consulta.recibo))) throw fail("RECIBO_INVALIDO", "Recibo inv\xE1lido.", void 0, false, { campo: "recibo" });
736
- return request("consultar", consulta, op);
761
+ return request("consultar", { chave: consulta.chave, ...consulta.recibo !== void 0 ? { recibo: consulta.recibo } : {} }, op);
737
762
  },
738
763
  cancelar: (data, op) => {
739
764
  checkObject(data, "cancelamento");
740
765
  checkKey(data.chave);
741
766
  reason(data.justificativa);
742
767
  if (typeof data.protocolo !== "string" || !/^\d{15}$/.test(data.protocolo)) throw fail("PROTOCOLO_INVALIDO", "Protocolo inv\xE1lido.", void 0, false, { campo: "protocolo" });
743
- return request("cancelar", data, op);
768
+ return request("cancelar", { chave: data.chave, protocolo: data.protocolo, justificativa: data.justificativa }, op);
744
769
  },
745
770
  cartaCorrecao: (data, op) => {
746
771
  checkObject(data, "cartaCorrecao");
747
772
  if (cfg.modelo !== 55) throw fail("OPERACAO_NAO_SUPORTADA", "Carta de corre\xE7\xE3o exige NF-e modelo 55.");
748
773
  checkKey(data.chave);
749
774
  if (typeof data.correcao !== "string" || data.correcao.length < 15 || data.correcao.length > 1e3 || !Number.isInteger(data.sequenciaEvento ?? 1) || (data.sequenciaEvento ?? 1) < 1 || (data.sequenciaEvento ?? 1) > 20) throw fail("CORRECAO_INVALIDA", "Dados da carta de corre\xE7\xE3o inv\xE1lidos.", void 0, false, { campo: "cartaCorrecao" });
750
- return request("cartaCorrecao", { ...data, sequenciaEvento: data.sequenciaEvento ?? 1 }, op);
775
+ return request("cartaCorrecao", { chave: data.chave, correcao: data.correcao, sequenciaEvento: data.sequenciaEvento ?? 1 }, op);
751
776
  },
752
777
  inutilizar: (data, op) => {
753
778
  checkObject(data, "inutilizacao");