Descompactando um arquivo protegido por senha no Node.js

Existe uma biblioteca que eu possa usar para descompactar um arquivo protegido por senha (o Site me faz colocar uma senha no arquivo ao fazer o download)? Existem inúmeras bibliotecas para descompactar arquivos normais, mas nenhuma que eu consiga encontrar fará isso com uma senha.

Aqui Encontrei algumas entradas úteis. Mas prefiro não recorrer ao usochild_process e usando a funcionalidade de descompactação unix integrada, mas esse pode ser meu último recurso. Eu estaria disposto a pré-executar minha própria manipulação no código criptografado, mas não consigo nem descobrir como determinar o tipo de criptografia (parece ser muito padrão, já que posso fazê-lo no terminal).

Mais uma vez, prefiro não fazer isso, mas receio que seja a minha única opção e tentei o seguinte:

var fs = require('fs')
, unzip = require('unzip')
, spawn = require('child_process').spawn
, expand = function(filepath, cb) {
     var self = this
     , unzipStream = fs.createReadStream(filepath).pipe(unzip.Parse())
     , xmlData = '';

     unzipStream.on('entry', function (entry) {
            var filename = entry.path;
           // first zip contains files and one password protected zipfile. 
           // Here I can just do pipe(unzip.Parse()) again, but then i just get a giant encoded string that I don't know how to handle, so i tried other things bellow.
           if(filename.match(/\.zip$/)){
                 entry.on('data', function (data) {
                     var funzip = spawn('funzip','-P','ThisIsATestPsswd','-');
                     var newFile = funzip.stdin.write(data);

            // more closing code...

Então eu meio que perdi o que fazer. Eu tentei escrevernewFile para um arquivo, mas isso apenas disse[object].

Então tentei fazer algo mais simples, alterando as últimas 3 linhas para

   fs.writeFile('./tmp/this.zip', data, 'binary');
   var newFile = spawn('unzip','-P','ThisIsATest','./tmp/this.zip');
   console.log('Data: ' + data);

Mas dados não são nada úteis apenas[object Object] novamente. Não consigo descobrir o que fazer a seguir para colocar esse novo arquivo descompactado em um arquivo de trabalho ou em uma sequência legível.

Eu sou super novo emNode e todos os assíncronos / ouvintes sendo demitidos por outros processos ainda são um pouco confusos, então, desculpe-me se isso não faz sentido. Muito obrigado pela ajuda!

EDITAR:

Agora eu adicionei o seguinte código:

var fs = require('fs')
  , unzip = require('unzip')
  , spawn = require('child_process').spawn
  , expand = function(filepath, cb) {
    var self = this
    , unzipStream = fs.createReadStream(filepath)
      .pipe(unzip.Parse())
    , xmlData = '';

      unzipStream.on('entry', function (entry) {
        var filename = entry.path
            , type = entry.type // 'Directory' or 'File'
            , size = entry.size;
        console.log('Filename: ' + filename);

        if(filename.match(/\.zip$/)){
            entry.on('data', function (data) {
              fs.writeFile('./lib/mocks/tmp/this.zip', data, 'binary');
              var newFile = spawn('unzip','-P','ThisIsATestPassword', '-','../tmp/this.zip');
              newFile.stdout.on('data', function(data){
                 fs.writeFile('./lib/mocks/tmp/that.txt', data); //This needs to be something different
                    //The zip file contains an archive of files, so one file name shouldn't work
              });

           });
          } else { //Not a zip so handle differently }
       )};
    };

Isso parece muito próximo do que eu preciso, mas quando o arquivo é gravado, tudo o que ele tem é a lista de opções para descompactar:

UnZip 5.52 of 28 February 2005, by Info-ZIP.  Maintained by C. Spieler.  Send
bug reports using http://www.info-zip.org/zip-bug.html; see README for details.

Usage: unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir]
  Default action is to extract files in list, except those in xlist, to exdir;
  file[.zip] may be a wildcard.  -Z => ZipInfo mode ("unzip -Z" for usage).

  -p  extract files to pipe, no messages     -l  list files (short format)
  -f  freshen existing files, create none    -t  test compressed archive data
  -u  update files, create if necessary      -z  display archive comment
  -x  exclude files that follow (in xlist)   -d  extract files into exdir

modifiers:                                   -q  quiet mode (-qq => quieter)
  -n  never overwrite existing files         -a  auto-convert any text files
  -o  overwrite files WITHOUT prompting      -aa treat ALL files as text
  -j  junk paths (do not make directories)   -v  be verbose/print version info
  -C  match filenames case-insensitively     -L  make (some) names lowercase
  -X  restore UID/GID info                   -V  retain VMS version numbers
  -K  keep setuid/setgid/tacky permissions   -M  pipe through "more" pager
Examples (see unzip.txt for more info):
  unzip data1 -x joe   => extract all files except joe from zipfile data1.zip
  unzip -p foo | more  => send contents of foo.zip via pipe into program more
  unzip -fo foo ReadMe => quietly replace existing ReadMe if archive file newer

Não tenho certeza se a entrada estava errada, pois parece o erro de descompactar. Ou se estou apenas escrevendo o conteúdo errado. Eu teria pensado que seria apenas pré-formado, como acontece normalmente no console - apenas adicionando todos os arquivos à medida que são extraídos no diretório. embora eu adorasse poder ler todo o conteúdo de um buffer, a opção - parece não fazer isso e, portanto, eu aceitaria os arquivos que estão sendo adicionados ao diretório. Muito obrigado a qualquer pessoa com sugestões!

Editar 2

Consegui fazer isso funcionar, provavelmente não da melhor maneira, mas funciona pelo menos usando esta linha:

var newFile = spawn('unzip', [ '-P','ThisIsATestPassword', '-d','./lib/tmp/foo','./lib/mocks/tmp/this.zip' ])

Isso apenas descompactará todos os arquivos no diretório e então eu pude lê-los a partir daí. Meu erro foi que o segundo parâmetro tem que ser uma matriz.

questionAnswers(1)

yourAnswerToTheQuestion