inception.streams.multipart

1.0.1 • Public • Published

inception.streams.multipart

Creates and parses multipart form streams.

installation

Use the following command to install the library from npm:

npm install inception.streams.multipart

usage

The library exposes 2 main classes:

  • MultipartStreamer: A Readable stream used to create multipart content
  • MultipartParser: A Writable stream used to parse a multipart stream

streaming multipart content

The following code show how to create a new multipart stream that can be piped into an outgoing HTTP request.

const MultipartStreamer = require('inception.streams.multipart').MultipartStreamer;
 
const req = getAnInstanceOfHttpClientRequestSomehow();
const myJsonObject = { foo: 'bar' };
const myStream = node.fs.createReadStream('/etc/motd');
const streamer = new MultipartStreamer();
  .addFieldPart({ value: 'fieldValue', name: 'fieldName' })        // Form field
  .addObjectPart({ value: myJsonObject })                          // JSON object
  .addFilePart({ value: '/etc/hosts', contentType: 'text/plain' }) // File
  .addStreamPart({ value: myStream, contentType: 'text/html' });   // Node.js stream
 
req.headers['content-type'] = `multipart/form-data; boundary=${streamer.boundary}`;
streamer.pipe(req);

parsing multipart content

The following code show how to parse an incoming multipart stream.

const MultipartParser = require('inception.streams.multipart').MultipartParser;
 
function handleRequest(req, res) {
  const parser = new MultipartParser({ contentType: req.headers['content-type']});
  req.pipe(parser)
    .on('part', (part) => {
      switch(part.type) {
      case 'field':
        res.write(`name: ${part.name}, value: ${part.value}`);
        break;
 
      case 'object':
        res.write(JSON.stringify(part.value));
        break;
 
      case 'stream':
        res.write(`name: ${part.name}, contentType: ${part.contentType}`);
        part.pipe(node.fs.createWriteStream(`/var/tmp/${part.filename}`));
      }
      res.write(`Part: ${part}`);
    })
    .on('finish', () => res.end());
}

Alternately, one can use the .parse() helper method.

const Multipart = require('inception.streams.multipart');
 
function handleRequest(req, res) {
  Multipart.parse(req)
  .on('part', (part) => {
    switch(part.type) {
    case 'field':
      res.write(`name: ${part.name}, value: ${part.value}`);
      break;
 
    case 'object':
      res.write(JSON.stringify(part.value));
      break;
 
    case 'stream':
      res.write(`name: ${part.name}, contentType: ${part.contentType}`);
      part.pipe(node.fs.createWriteStream(`/var/tmp/${part.filename}`));
    }
    res.write(`Part: ${part}`);
  })
  .on('finish', () => res.end());
}

contact

All feedback/suggestions/criticisms can be directed to Anand Suresh

Package Sidebar

Install

npm i inception.streams.multipart

Weekly Downloads

2

Version

1.0.1

License

Apache-2.0

Last publish

Collaborators

  • anandsuresh