1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- 'use strict'
- module.exports = parseStream
- const stream = require('stream')
- const TOMLParser = require('./lib/toml-parser.js')
- function parseStream (stm) {
- if (stm) {
- return parseReadable(stm)
- } else {
- return parseTransform(stm)
- }
- }
- function parseReadable (stm) {
- const parser = new TOMLParser()
- stm.setEncoding('utf8')
- return new Promise((resolve, reject) => {
- let readable
- let ended = false
- let errored = false
- function finish () {
- ended = true
- if (readable) return
- try {
- resolve(parser.finish())
- } catch (err) {
- reject(err)
- }
- }
- function error (err) {
- errored = true
- reject(err)
- }
- stm.once('end', finish)
- stm.once('error', error)
- readNext()
- function readNext () {
- readable = true
- let data
- while ((data = stm.read()) !== null) {
- try {
- parser.parse(data)
- } catch (err) {
- return error(err)
- }
- }
- readable = false
- /* istanbul ignore if */
- if (ended) return finish()
- /* istanbul ignore if */
- if (errored) return
- stm.once('readable', readNext)
- }
- })
- }
- function parseTransform () {
- const parser = new TOMLParser()
- return new stream.Transform({
- objectMode: true,
- transform (chunk, encoding, cb) {
- try {
- parser.parse(chunk.toString(encoding))
- } catch (err) {
- this.emit('error', err)
- }
- cb()
- },
- flush (cb) {
- try {
- this.push(parser.finish())
- } catch (err) {
- this.emit('error', err)
- }
- cb()
- }
- })
- }
|