blob: 2956cdcbc96faed8c1d72cbdf8d327a0f5b72b2a [file] [log] [blame]
import {
atob,
btoa,
arrayBufferToBinaryString as arrayBuffToBinString,
readAsArrayBuffer,
binaryStringToBlobOrBuffer as binStringToBlobOrBuffer,
arrayBufferToBase64 as arrayBuffToB64
} from 'pouchdb-binary-utils';
import { createError, BAD_ARG } from 'pouchdb-errors';
import { binaryMd5 } from 'pouchdb-md5';
function preprocessAttachments(docInfos, blobType, callback) {
if (!docInfos.length) {
return callback();
}
var docv = 0;
function parseBase64(data) {
try {
return atob(data);
} catch (e) {
var err = createError(BAD_ARG,
'Attachment is not a valid base64 string');
return {error: err};
}
}
function preprocessAttachment(att, callback) {
if (att.stub) {
return callback();
}
if (typeof att.data === 'string') {
// input is assumed to be a base64 string
var asBinary = parseBase64(att.data);
if (asBinary.error) {
return callback(asBinary.error);
}
att.length = asBinary.length;
if (blobType === 'blob') {
att.data = binStringToBlobOrBuffer(asBinary, att.content_type);
} else if (blobType === 'base64') {
att.data = btoa(asBinary);
} else { // binary
att.data = asBinary;
}
binaryMd5(asBinary, function (result) {
att.digest = 'md5-' + result;
callback();
});
} else { // input is a blob
readAsArrayBuffer(att.data, function (buff) {
if (blobType === 'binary') {
att.data = arrayBuffToBinString(buff);
} else if (blobType === 'base64') {
att.data = arrayBuffToB64(buff);
}
binaryMd5(buff, function (result) {
att.digest = 'md5-' + result;
att.length = buff.byteLength;
callback();
});
});
}
}
var overallErr;
docInfos.forEach(function (docInfo) {
var attachments = docInfo.data && docInfo.data._attachments ?
Object.keys(docInfo.data._attachments) : [];
var recv = 0;
if (!attachments.length) {
return done();
}
function processedAttachment(err) {
overallErr = err;
recv++;
if (recv === attachments.length) {
done();
}
}
for (var key in docInfo.data._attachments) {
if (docInfo.data._attachments.hasOwnProperty(key)) {
preprocessAttachment(docInfo.data._attachments[key],
processedAttachment);
}
}
});
function done() {
docv++;
if (docInfos.length === docv) {
if (overallErr) {
callback(overallErr);
} else {
callback();
}
}
}
}
export default preprocessAttachments;