summaryrefslogtreecommitdiffstats
path: root/test/utils/formdata.js
blob: edd88545d15d65fad21b0889d41cddb7899f8ac7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
const Busboy = require('@fastify/busboy')

function parseFormDataString (
  body,
  contentType
) {
  const cache = {
    fileMap: new Map(),
    fields: []
  }

  const bb = new Busboy({
    headers: {
      'content-type': contentType
    }
  })

  return new Promise((resolve, reject) => {
    bb.on('file', (name, file, filename, encoding, mimeType) => {
      cache.fileMap.set(name, { data: [], info: { filename, encoding, mimeType } })

      file.on('data', (data) => {
        const old = cache.fileMap.get(name)

        cache.fileMap.set(name, {
          data: [...old.data, data],
          info: old.info
        })
      }).on('end', () => {
        const old = cache.fileMap.get(name)

        cache.fileMap.set(name, {
          data: Buffer.concat(old.data),
          info: old.info
        })
      })
    })

    bb.on('field', (key, value) => cache.fields.push({ key, value }))
    bb.on('finish', () => resolve(cache))
    bb.on('error', (e) => reject(e))

    bb.end(body)
  })
}

module.exports = {
  parseFormDataString
}