@idio/dicer

[fork] A Very Fast Streaming Multipart Parser For Node.JS Written In ES6 And Optimised With JavaScript Compiler.

Usage no npm install needed!

<script type="module">
  import idioDicer from 'https://cdn.skypack.dev/@idio/dicer';
</script>

README

@idio/dicer

npm version

@idio/dicer is a fork of A Very Fast Streaming Multipart Parser For Node.JS Written In ES6 And Optimised With JavaScript Compiler.

yarn add @idio/dicer

Table Of Contents

API

The package is available by importing its default function:

import Dicer from '@idio/dicer'

class Dicer

Dicer is a Writable stream.

import('stream').WritableOptions stream.WritableOptions

_idio.DicerConfig extends stream.WritableOptions: Options for the program.

Name Type Description Default
boundary string This is the boundary used to detect the beginning of a new part. -
headerFirst boolean If true, preamble header parsing will be performed first. false
partHwm boolean High watermark for parsing parts. -
maxHeaderPairs number The maximum number of header key=>value pairs to parse. 2000

_idio.Dicer

Name Type Description
constructor new (cfg?: !_idio.DicerConfig) => _idio.Dicer Creates a new instance.
setBoundary (boundary: string) => void Sets the boundary to use for parsing and performs some initialization needed for parsing. You should only need to use this if you set headerFirst to true in the constructor and are parsing the boundary from the preamble header.
_ignore () => void Ignores current part.
import Dicer from '@idio/dicer'
import { createServer } from 'http'
import { inspect } from 'util'

const RE_BOUNDARY = /^multipart\/.+?(?:; boundary=(?:(?:"(.+)")|(?:([^\s]+))))$/i,
  HTML = Buffer.from('<html><head></head><body>\
                        <form method="POST" enctype="multipart/form-data">\
                         <input type="text" name="textfield"><br />\
                         <input type="file" name="filefield"><br />\
                         <input type="submit">\
                        </form>\
                        </body></html>'),
  PORT = 8080

createServer(function(req, res) {
  var m
  if (req.method === 'POST'
      && req.headers['content-type']
      && (m = RE_BOUNDARY.exec(req.headers['content-type']))) {
    var d = new Dicer({ boundary: m[1] || m[2] })

    d.on('part', function(p) {
      console.log('New part!')
      p.on('header', function(header) {
        for (var h in header) {
          console.log('Part header: k: ' + inspect(h)
                      + ', v: ' + inspect(header[h]))
        }
      })
      p.on('data', function(data) {
        console.log('Part data: ' + inspect(data.toString()))
      })
      p.on('end', function() {
        console.log('End of part\n')
      })
    })
    d.on('finish', function() {
      console.log('End of parts')
      res.writeHead(200)
      res.end('Form submission successful!')
    })
    req.pipe(d)
  } else if (req.method === 'GET' && req.url === '/') {
    res.writeHead(200)
    res.end(HTML)
  } else {
    res.writeHead(404)
    res.end()
  }
}).listen(PORT, function() {
  console.log('Listening for requests on port ' + PORT)
  this.close()
})
Listening for requests on port 8080

Copyright

Original Work by Brian White aka mscdex.


Art Deco © Art Deco for Idio 2019 Idio Tech Nation Visa Tech Nation Visa Sucks