{"version":3,"sources":["jsdelivr-header.js","/npm/@swang/filereader@1.0.0/FileReader.js"],"names":[],"mappings":"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","file":"/npm/@swang/filereader@1.0.0/FileReader.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@swang/filereader@1.0.0/FileReader.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","//\n// FileReader\n//\n// http://www.w3.org/TR/FileAPI/#dfn-filereader\n// https://developer.mozilla.org/en/DOM/FileReader\n(function () {\n  \"use strict\";\n\n  var fs = require(\"fs\")\n    , EventEmitter = require(\"events\").EventEmitter\n    ;\n\n  function doop(fn, args, context) {\n    if ('function' === typeof fn) {\n      fn.apply(context, args);\n    }\n  }\n\n  function toDataUrl(data, type) {\n    // var data = self.result;\n    var dataUrl = 'data:';\n\n    if (type) {\n      dataUrl += type + ';';\n    }\n\n    if (/text/i.test(type)) {\n      dataUrl += 'charset=utf-8,';\n      dataUrl += data.toString('utf8');\n    } else {\n      dataUrl += 'base64,';\n      dataUrl += data.toString('base64');\n    }\n\n    return dataUrl;\n  }\n\n  function toArrayBuffer(buffer) {\n    var ab = new ArrayBuffer(buffer.length);\n    var view = new Uint8Array(ab);\n    for (var i = 0; i < buffer.length; ++i) {\n      view[i] = buffer[i];\n    }\n    return view;\n  }\n\n  function mapDataToFormat(file, data, format, encoding) {\n    // var data = self.result;\n    switch(format) {\n      case 'buffer':\n        return toArrayBuffer(data);\n        break;\n      case 'binary':\n        return data.toString('binary');\n        break;\n      case 'dataUrl':\n        return toDataUrl(data, file.type);\n        break;\n      case 'text':\n        return data.toString(encoding || 'utf8');\n        break;\n    }\n  }\n\n  function FileReader() {\n    var self = this,\n      emitter = new EventEmitter,\n      file;\n\n    self.addEventListener = function (on, callback) {\n      emitter.on(on, callback);\n    };\n    self.removeEventListener = function (callback) {\n      emitter.removeListener(callback);\n    }\n    self.dispatchEvent = function (on) {\n      emitter.emit(on);\n    }\n\n    self.EMPTY = 0;\n    self.LOADING = 1;\n    self.DONE = 2;\n\n    self.error = undefined;         // Read only\n    self.readyState = self.EMPTY;   // Read only\n    self.result = undefined;        // Road only\n\n    // non-standard\n    self.on = function () {\n      emitter.on.apply(emitter, arguments);\n    }\n    self.nodeChunkedEncoding = false;\n    self.setNodeChunkedEncoding = function (val) {\n      self.nodeChunkedEncoding = val;\n    };\n    // end non-standard\n\n\n\n    // Whatever the file object is, turn it into a Node.JS File.Stream\n    function createFileStream() {\n      var stream = new EventEmitter(),\n        chunked = self.nodeChunkedEncoding;\n\n      // attempt to make the length computable\n      if (!file.size && chunked && file.path) {\n        fs.stat(file.path, function (err, stat) {\n          file.size = stat.size;\n          file.lastModifiedDate = stat.mtime;\n        });\n      }\n\n\n      // The stream exists, do nothing more\n      if (file.stream) {\n        return;\n      }\n\n\n      // Create a read stream from a buffer\n      if (file.buffer) {\n        process.nextTick(function () {\n          stream.emit('data', file.buffer);\n          stream.emit('end');\n        });\n        file.stream = stream;\n        return;\n      }\n\n      // Create a read stream from a blob-polyfill Blob\n      if (file.data) {\n        process.nextTick(function () {\n          stream.emit('data', Buffer.from(file.data, \"ascii\"));\n          stream.emit('end');\n        });\n        file.stream = stream;\n        return;\n      }\n\n      // Create a read stream from a file\n      if (file.path) {\n        // TODO url\n        if (!chunked) {\n          fs.readFile(file.path, function (err, data) {\n            if (err) {\n              stream.emit('error', err);\n            }\n            if (data) {\n              stream.emit('data', data);\n              stream.emit('end');\n            }\n          });\n\n          file.stream = stream;\n          return;\n        }\n\n        // TODO don't duplicate this code here,\n        // expose a method in File instead\n        file.stream = fs.createReadStream(file.path);\n      }\n    }\n\n\n\n    // before any other listeners are added\n    emitter.on('abort', function () {\n      self.readyState = self.DONE;\n    });\n\n\n\n    // Map `error`, `progress`, `load`, and `loadend`\n    function mapStreamToEmitter(format, encoding) {\n      var stream = file.stream,\n        buffers = [],\n        chunked = self.nodeChunkedEncoding;\n\n      buffers.dataLength = 0;\n\n      stream.on('error', function (err) {\n        if (self.DONE === self.readyState) {\n          return;\n        }\n\n        self.readyState = self.DONE;\n        self.error = err;\n        emitter.emit('error', err);\n      });\n\n      stream.on('data', function (data) {\n        if (self.DONE === self.readyState) {\n          return;\n        }\n\n        buffers.dataLength += data.length;\n        buffers.push(data);\n\n        emitter.emit('progress', {\n          // fs.stat will probably complete before this\n          // but possibly it will not, hence the check\n          lengthComputable: (!isNaN(file.size)) ? true : false,\n          loaded: buffers.dataLength,\n          total: file.size\n        });\n\n        emitter.emit('data', data);\n      });\n\n      stream.on('end', function () {\n        if (self.DONE === self.readyState) {\n          return;\n        }\n\n        var data;\n\n        if (buffers.length > 1 ) {\n          data = Buffer.concat(buffers);\n        } else {\n          data = buffers[0];\n        }\n\n        self.readyState = self.DONE;\n        self.result = mapDataToFormat(file, data, format, encoding);\n        emitter.emit('load', {\n          target: {\n            // non-standard\n            nodeBufferResult: data,\n            result: self.result\n          }\n        });\n\n        emitter.emit('loadend');\n      });\n    }\n\n\n    // Abort is overwritten by readAsXyz\n    self.abort = function () {\n      if (self.readState == self.DONE) {\n        return;\n      }\n      self.readyState = self.DONE;\n      emitter.emit('abort');\n    };\n\n\n\n    //\n    function mapUserEvents() {\n      emitter.on('start', function () {\n        doop(self.onloadstart, arguments);\n      });\n      emitter.on('progress', function () {\n        doop(self.onprogress, arguments);\n      });\n      emitter.on('error', function (err) {\n        // TODO translate to FileError\n        if (self.onerror) {\n          self.onerror(err);\n        } else {\n          if (!emitter.listeners.error || !emitter.listeners.error.length) {\n            throw err;\n          }\n        }\n      });\n      emitter.on('load', function () {\n        doop(self.onload, arguments);\n      });\n      emitter.on('loadend', function () {\n        doop(self.onloadend, arguments);\n      });\n      emitter.on('abort', function () {\n        doop(self.onabort, arguments);\n      });\n    }\n\n    // object type snippet from\n    // https://bonsaiden.github.io/JavaScript-Garden/#types.typeof\n    function objType(obj) {\n      return Object.prototype.toString.call(obj).slice(8, -1);\n    }\n\n    function readFile(_file, format, encoding) {\n      file = _file;\n      if (objType(file) === 'Blob') {\n        // a blob type cannot access its true data, but we're going to assume\n        // this blob is using a blob shim from node-fetch\n        let sym = Object.getOwnPropertySymbols(file).find(function(s) {\n          return String(s) === \"Symbol(buffer)\";\n        });\n\n        file.data = file[sym]\n      }\n\n      if (!file || !(file.name || file.data) || !(file.path || file.stream || file.buffer || file.data)) {\n        throw new Error(\"cannot read as File: \" + JSON.stringify(file));\n      }\n      if (0 !== self.readyState) {\n        console.log(\"already loading, request to change format ignored\");\n        return;\n      }\n\n      // 'process.nextTick' does not ensure order, (i.e. an fs.stat queued later may return faster)\n      // but `onloadstart` must come before the first `data` event and must be asynchronous.\n      // Hence we waste a single tick waiting\n      process.nextTick(function () {\n        self.readyState = self.LOADING;\n        emitter.emit('loadstart');\n        createFileStream();\n        mapStreamToEmitter(format, encoding);\n        mapUserEvents();\n      });\n    }\n\n    self.readAsArrayBuffer = function (file) {\n      readFile(file, 'buffer');\n    };\n    self.readAsBinaryString = function (file) {\n      readFile(file, 'binary');\n    };\n    self.readAsDataURL = function (file) {\n      readFile(file, 'dataUrl');\n    };\n    self.readAsText = function (file, encoding) {\n      readFile(file, 'text', encoding);\n    };\n  }\n\n  module.exports = FileReader;\n}());\n"]}