Load attachment data before sending message

This commit is contained in:
Daniel Gasienica 2018-03-16 17:32:43 -04:00
parent 1c8123ff1a
commit 9a540d6d18
2 changed files with 36 additions and 1 deletions

View file

@ -657,10 +657,13 @@
profileKey = storage.get('profileKey'); profileKey = storage.get('profileKey');
} }
const loadData = Attachment.loadData(migrationContext.readAttachmentData);
const attachmentsWithData =
await Promise.all(messageWithSchema.attachments.map(loadData));
message.send(sendFunction( message.send(sendFunction(
this.get('id'), this.get('id'),
body, body,
messageWithSchema.attachments, attachmentsWithData,
now, now,
this.get('expireTimer'), this.get('expireTimer'),
profileKey profileKey

View file

@ -1,3 +1,4 @@
const isFunction = require('lodash/isFunction');
const isString = require('lodash/isString'); const isString = require('lodash/isString');
const MIME = require('./mime'); const MIME = require('./mime');
@ -110,3 +111,34 @@ exports.removeSchemaVersion = (attachment) => {
}; };
exports.migrateDataToFileSystem = migrateDataToFileSystem; exports.migrateDataToFileSystem = migrateDataToFileSystem;
// hasData :: Attachment -> Boolean
exports.hasData = attachment =>
attachment.data instanceof ArrayBuffer || ArrayBuffer.isView(attachment.data);
// loadData :: (RelativePath -> IO (Promise ArrayBuffer))
// Attachment ->
// IO (Promise Attachment)
exports.loadData = (readAttachmentData) => {
if (!isFunction(readAttachmentData)) {
throw new TypeError('`readAttachmentData` must be a function');
}
return async (attachment) => {
if (!exports.isValid(attachment)) {
throw new TypeError('`attachment` is not valid');
}
const isAlreadyLoaded = exports.hasData(attachment);
if (isAlreadyLoaded) {
return attachment;
}
if (!isString(attachment.path)) {
throw new TypeError('`attachment.path` is required');
}
const data = await readAttachmentData(attachment.path);
return Object.assign({}, attachment, { data });
};
};