node-file-api / FileReader

HTML5 FileAPI `FileReader` for Node.JS.
Apache License 2.0
8 stars 12 forks source link

readAsArrayBuffer returns Uint8Array instead of ArrayBuffer #2

Open skratchdot opened 8 years ago

skratchdot commented 8 years ago

I have some browser code that does:

const reader = FileReader();
reader.addEventListener('load', (e) => {
  const arrayBuffer = e.target.result;
  const view = new DataView(arrayBuffer);
  // do some stuff with the view
});
reader.readAsArrayBuffer(file);

When I run my mocha tests in node (making node stubs using the node file-api package), I see the following error: TypeError: First argument to DataView constructor must be an ArrayBuffer

The fix for this is simple, but I don't know the ramifications for other people that use this library, so I don't know if you want me to submit a pull request or not. Anyways, the following 3 lines:

https://github.com/node-file-api/FileReader/blob/805a7b0f2db34f4d00c696068d1ce7c3c022e62a/FileReader.js#L42-L44

Can be changed to:

case 'buffer':
  return toArrayBuffer(data);
  break;

And the following function needs to be included:

toArrayBuffer(buffer) {
  const ab = new ArrayBuffer(buffer.length);
  const view = new Uint8Array(ab);
  for (let i = 0; i < buffer.length; ++i) {
    view[i] = buffer[i];
  }
  return ab;
}
skratchdot commented 8 years ago

In case anyone is reading, here's the patch I'm using in my tests:

    global.FileReader = function () {
      const reader = new FileReader();
      const originalAddEventListener = reader.addEventListener;
      reader.addEventListener = function (on, callback) {
        originalAddEventListener(on, (event) => {
          // convert Uint8Array to ArrayBuffer
          if (on === 'load' && event && event.target &&
            event.target.result && event.target.result.buffer) {
            event.target.result = toArrayBuffer(event.target.result.buffer);
          }
          callback(event);
        });
      };
      return reader;
    };

This is not a great monkey patch because it only works for people using readAsArrayBuffer() with a 'load' event listener...

@coolaj86 - Let me know if you want me to submit a PR. I have a workaround, so it's no big deal for me, but figured I'd log something in case anyone else has a similar issue...