| 'use strict'; |
| |
| var base64 = require('../binary/base64'); |
| var arrayBuffToBinString = require('../binary/arrayBufferToBinaryString'); |
| var readAsArrayBuffer = require('../binary/readAsArrayBuffer'); |
| var binStringToBlobOrBuffer = require('../binary/binaryStringToBlobOrBuffer'); |
| var errors = require('../errors'); |
| var md5 = require('../md5'); |
| |
| function preprocessAttachments(docInfos, blobType, callback) { |
| |
| if (!docInfos.length) { |
| return callback(); |
| } |
| |
| var docv = 0; |
| |
| function parseBase64(data) { |
| try { |
| return base64.atob(data); |
| } catch (e) { |
| var err = errors.error(errors.BAD_ARG, |
| 'Attachments need to be base64 encoded'); |
| return {error: err}; |
| } |
| } |
| |
| function preprocessAttachment(att, callback) { |
| if (att.stub) { |
| return callback(); |
| } |
| if (typeof att.data === 'string') { |
| // input is 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 = base64.btoa(asBinary); |
| } else { // binary |
| att.data = asBinary; |
| } |
| md5(asBinary).then(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 = base64.btoa(arrayBuffToBinString(buff)); |
| } |
| md5(buff).then(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(); |
| } |
| } |
| } |
| } |
| |
| module.exports = preprocessAttachments; |