diff --git a/index.js b/index.js index 9534ed9..a6c9646 100644 --- a/index.js +++ b/index.js @@ -67,6 +67,12 @@ function base64StringToBlob(base64, type) { }); } +function binaryStringToBlob(binary, type) { + return Promise.resolve().then(function () { + return base64StringToBlob(btoa(binary), type); + }); +} + function blobToBase64String(blob) { return blobToBinaryString(blob).then(function (binary) { return btoa(binary); @@ -147,8 +153,16 @@ function imgSrcToBlob(src, type) { }); } -function plainTextToBlob(text) { - return createBlob([text], 'text/plain'); +function arrayBufferToBlob(buffer, type) { + return Promise.resolve().then(function () { + return createBlob([buffer], type); + }); +} + +function blobToArrayBuffer(blob) { + return blobToBinaryString(blob).then(function (binary) { + return binaryStringToArrayBuffer(binary); + }); } module.exports = { @@ -160,5 +174,8 @@ module.exports = { dataURLToBlob : dataURLToBlob, blobToBase64String : blobToBase64String, base64StringToBlob : base64StringToBlob, - plainTextToBlob : plainTextToBlob + binaryStringToBlob : binaryStringToBlob, + blobToBinaryString : blobToBinaryString, + arrayBufferToBlob : arrayBufferToBlob, + blobToArrayBuffer : blobToArrayBuffer }; \ No newline at end of file diff --git a/test/test.js b/test/test.js index 7014627..3662a6b 100644 --- a/test/test.js +++ b/test/test.js @@ -13,13 +13,20 @@ tests(); function tests() { + var transparent1x1Png = + 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEA' + + 'AAAASUVORK5CYII='; + var black1x1Png = + 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVR4nGNiAAAABgADNjd8qAAA' + + 'AABJRU5ErkJggg=='; + beforeEach(function () { }); afterEach(function () { }); describe('basic tests', function () { it('convert plain blobs', function () { - var blob = blobUtil.plainTextToBlob('foo'); + var blob = blobUtil.createBlob(['foo'], 'text/plain'); blob.type.should.equal('text/plain'); return blobUtil.blobToBase64String(blob).then(function (base64) { base64.should.equal('Zm9v'); @@ -63,13 +70,6 @@ function tests() { }); }); - var transparent1x1Png = - 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEA' + - 'AAAASUVORK5CYII='; - var black1x1Png = - 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVR4nGNiAAAABgADNjd8qAAA' + - 'AABJRU5ErkJggg=='; - it('convert base64 to png', function () { return blobUtil.base64StringToBlob(transparent1x1Png, 'image/png').then(function (blob) { return blobUtil.blobToBase64String(blob); @@ -116,5 +116,43 @@ function tests() { }); }); + it('convert to binary and back', function () { + var binary = atob(transparent1x1Png); + return blobUtil.binaryStringToBlob(binary, 'image/png').then(function (blob) { + blob.size.should.equal(68); + return blobUtil.blobToBase64String(blob).then(function (base64) { + base64.should.equal(transparent1x1Png); + return blobUtil.blobToBinaryString(blob); + }).then(function (bin) { + bin.should.equal(atob(transparent1x1Png)); + }); + }); + }); + + it('convert to array buffer and back', function () { + var bin = atob(transparent1x1Png); + var buffer = new ArrayBuffer(bin.length); + var arr = new Uint8Array(buffer); + for (var i = 0; i < bin.length; i++) { + arr[i] = bin.charCodeAt(i); + } + return blobUtil.arrayBufferToBlob(buffer, 'image/png').then(function (blob) { + blob.size.should.equal(68); + return blobUtil.blobToBase64String(blob).then(function (base64) { + base64.should.equal(transparent1x1Png); + return blobUtil.blobToBinaryString(blob); + }).then(function (bin) { + bin.should.equal(atob(transparent1x1Png)); + return blobUtil.blobToArrayBuffer(blob); + }).then(function (buff) { + buff.byteLength.should.equal(68); + return blobUtil.arrayBufferToBlob(buff, 'image/png'); + }).then(function (blob) { + return blobUtil.blobToBase64String(blob); + }).then(function (base64) { + base64.should.equal(transparent1x1Png); + }); + }); + }); }); }