How can I send an "end" event to Nodejs stream

1.3k views Asked by At

Im' working with a pelias project and using package wof-admin-lookup to handle data that is read from a file.

There is a case, there is no valid data for being pushed to stream. The wof-admin-lookup will never end.

Here is my code:

const stream = recordStream.create(filePath)
        .pipe(blacklistStream())
        .pipe(adminLookup.create())
        .pipe(model.createDocumentMapperStream())
        .pipe(peliasDbclient())

  stream
        .on('data', data => {
            count++
        })
        .on('finish', () => {
            console.log(`Imported ${count} addresses`)
            resolve()
        })
        .on('error', (e) => {
            reject(e)
        })

Here is the code in wof-admin-lookup:

module.exports = function(pipResolver, config) {
  if (!pipResolver) {
    throw new Error('valid pipResolver required to be passed in as the first parameter');
  }

  // pelias 'imports.adminLookup' config section
  config = config || {};

  const pipResolverStream = createPipResolverStream(pipResolver, config);
  const end = createPipResolverEnd(pipResolver);

  const stream = parallelTransform(config.maxConcurrentReqs || 1, pipResolverStream);
  stream.on('end', end);

  return stream;
};

Although the console logged "Imported 0 addresses" but the pipResolverStream will stay forever if I do not shut down it manually by Ctrl+C.

Update, this case only happens if there is no data passed through stream.

1

There are 1 answers

1
Joel Pusanur On

"the end event will never trigger without something like < /dev/null to generate that EOF. Otherwise the program waits for the terminal to send a ^D."

node.js: How to detect an empty stdin stream?