parse-async.js 863 B

123456789101112131415161718192021222324252627282930
  1. 'use strict'
  2. module.exports = parseAsync
  3. const TOMLParser = require('./lib/toml-parser.js')
  4. const prettyError = require('./parse-pretty-error.js')
  5. function parseAsync (str, opts) {
  6. if (!opts) opts = {}
  7. const index = 0
  8. const blocksize = opts.blocksize || 40960
  9. const parser = new TOMLParser()
  10. return new Promise((resolve, reject) => {
  11. setImmediate(parseAsyncNext, index, blocksize, resolve, reject)
  12. })
  13. function parseAsyncNext (index, blocksize, resolve, reject) {
  14. if (index >= str.length) {
  15. try {
  16. return resolve(parser.finish())
  17. } catch (err) {
  18. return reject(prettyError(err, str))
  19. }
  20. }
  21. try {
  22. parser.parse(str.slice(index, index + blocksize))
  23. setImmediate(parseAsyncNext, index + blocksize, blocksize, resolve, reject)
  24. } catch (err) {
  25. reject(prettyError(err, str))
  26. }
  27. }
  28. }