Use window.log in browser context, turn on console eslint rule

This commit is contained in:
Scott Nonnenberg
2018-07-21 12:00:08 -07:00
parent 4320b125dd
commit 5933a34a18
71 changed files with 816 additions and 559 deletions

View File

@@ -108,9 +108,9 @@ exports._replaceUnicodeOrderOverridesSync = attachment => {
exports.replaceUnicodeOrderOverrides = async attachment =>
exports._replaceUnicodeOrderOverridesSync(attachment);
exports.removeSchemaVersion = attachment => {
exports.removeSchemaVersion = ({ attachment, logger }) => {
if (!exports.isValid(attachment)) {
console.log(
logger.error(
'Attachment.removeSchemaVersion: Invalid input attachment:',
attachment
);
@@ -197,6 +197,7 @@ exports.captureDimensionsAndScreenshot = async (
getImageDimensions,
makeImageThumbnail,
makeVideoScreenshot,
logger,
}
) => {
const { contentType } = attachment;
@@ -212,13 +213,17 @@ exports.captureDimensionsAndScreenshot = async (
if (GoogleChrome.isImageTypeSupported(contentType)) {
try {
const { width, height } = await getImageDimensions(absolutePath);
const { width, height } = await getImageDimensions({
objectUrl: absolutePath,
logger,
});
const thumbnailBuffer = await blobToArrayBuffer(
await makeImageThumbnail(
THUMBNAIL_SIZE,
absolutePath,
THUMBNAIL_CONTENT_TYPE
)
await makeImageThumbnail({
size: THUMBNAIL_SIZE,
objectUrl: absolutePath,
contentType: THUMBNAIL_CONTENT_TYPE,
logger,
})
);
const thumbnailPath = await writeNewAttachmentData(thumbnailBuffer);
@@ -234,7 +239,7 @@ exports.captureDimensionsAndScreenshot = async (
},
};
} catch (error) {
console.log(
logger.error(
'captureDimensionsAndScreenshot:',
'error processing image; skipping screenshot generation',
toLogFormat(error)
@@ -246,21 +251,29 @@ exports.captureDimensionsAndScreenshot = async (
let screenshotObjectUrl;
try {
const screenshotBuffer = await blobToArrayBuffer(
await makeVideoScreenshot(absolutePath, THUMBNAIL_CONTENT_TYPE)
await makeVideoScreenshot({
objectUrl: absolutePath,
contentType: THUMBNAIL_CONTENT_TYPE,
logger,
})
);
screenshotObjectUrl = makeObjectUrl(
screenshotBuffer,
THUMBNAIL_CONTENT_TYPE
);
const { width, height } = await getImageDimensions(screenshotObjectUrl);
const { width, height } = await getImageDimensions({
objectUrl: screenshotObjectUrl,
logger,
});
const screenshotPath = await writeNewAttachmentData(screenshotBuffer);
const thumbnailBuffer = await blobToArrayBuffer(
await makeImageThumbnail(
THUMBNAIL_SIZE,
screenshotObjectUrl,
THUMBNAIL_CONTENT_TYPE
)
await makeImageThumbnail({
size: THUMBNAIL_SIZE,
objectUrl: screenshotObjectUrl,
contentType: THUMBNAIL_CONTENT_TYPE,
logger,
})
);
const thumbnailPath = await writeNewAttachmentData(thumbnailBuffer);
@@ -283,7 +296,7 @@ exports.captureDimensionsAndScreenshot = async (
height,
};
} catch (error) {
console.log(
logger.error(
'captureDimensionsAndScreenshot: error processing video; skipping screenshot generation',
toLogFormat(error)
);

View File

@@ -9,7 +9,7 @@ const { isArrayBuffer, isFunction, isUndefined, omit } = require('lodash');
// Promise Attachment
exports.migrateDataToFileSystem = async (
attachment,
{ writeNewAttachmentData } = {}
{ writeNewAttachmentData, logger } = {}
) => {
if (!isFunction(writeNewAttachmentData)) {
throw new TypeError("'writeNewAttachmentData' must be a function");
@@ -19,7 +19,7 @@ exports.migrateDataToFileSystem = async (
const hasData = !isUndefined(data);
const shouldSkipSchemaUpgrade = !hasData;
if (shouldSkipSchemaUpgrade) {
console.log('WARNING: `attachment.data` is `undefined`');
logger.warn('WARNING: `attachment.data` is `undefined`');
return attachment;
}

View File

@@ -13,7 +13,7 @@ exports.parseAndWriteAvatar = upgradeAttachment => async (
contact,
context = {}
) => {
const { message, regionCode } = context;
const { message, regionCode, logger } = context;
const { avatar } = contact;
// This is to ensure that an omit() call doesn't pull in prototype props/methods
@@ -35,7 +35,7 @@ exports.parseAndWriteAvatar = upgradeAttachment => async (
messageId: idForLogging(message),
});
if (error) {
console.log(
logger.error(
'Contact.parseAndWriteAvatar: contact was malformed.',
toLogFormat(error)
);

View File

@@ -1,4 +1,4 @@
const { isFunction, isString, omit } = require('lodash');
const { isFunction, isObject, isString, omit } = require('lodash');
const Contact = require('./contact');
const Attachment = require('./attachment');
@@ -55,7 +55,7 @@ exports.PRIVATE = PRIVATE;
exports.isValid = () => true;
// Schema
exports.initializeSchemaVersion = message => {
exports.initializeSchemaVersion = ({ message, logger }) => {
const isInitialized =
SchemaVersion.isValid(message.schemaVersion) && message.schemaVersion >= 1;
if (isInitialized) {
@@ -82,7 +82,9 @@ exports.initializeSchemaVersion = message => {
: INITIAL_SCHEMA_VERSION;
const messageWithInitialSchema = Object.assign({}, message, {
schemaVersion: inheritedSchemaVersion,
attachments: message.attachments.map(Attachment.removeSchemaVersion),
attachments: message.attachments.map(attachment =>
Attachment.removeSchemaVersion({ attachment, logger })
),
});
return messageWithInitialSchema;
@@ -92,17 +94,24 @@ exports.initializeSchemaVersion = message => {
// type UpgradeStep = (Message, Context) -> Promise Message
// SchemaVersion -> UpgradeStep -> UpgradeStep
exports._withSchemaVersion = (schemaVersion, upgrade) => {
exports._withSchemaVersion = ({ schemaVersion, upgrade }) => {
if (!SchemaVersion.isValid(schemaVersion)) {
throw new TypeError("'schemaVersion' is invalid");
throw new TypeError('_withSchemaVersion: schemaVersion is invalid');
}
if (!isFunction(upgrade)) {
throw new TypeError("'upgrade' must be a function");
throw new TypeError('_withSchemaVersion: upgrade must be a function');
}
return async (message, context) => {
if (!context || !isObject(context.logger)) {
throw new TypeError(
'_withSchemaVersion: context must have logger object'
);
}
const { logger } = context;
if (!exports.isValid(message)) {
console.log(
logger.error(
'Message._withSchemaVersion: Invalid input message:',
message
);
@@ -117,7 +126,7 @@ exports._withSchemaVersion = (schemaVersion, upgrade) => {
const expectedVersion = schemaVersion - 1;
const hasExpectedVersion = message.schemaVersion === expectedVersion;
if (!hasExpectedVersion) {
console.log(
logger.warn(
'WARNING: Message._withSchemaVersion: Unexpected version:',
`Expected message to have version ${expectedVersion},`,
`but got ${message.schemaVersion}.`,
@@ -130,7 +139,7 @@ exports._withSchemaVersion = (schemaVersion, upgrade) => {
try {
upgradedMessage = await upgrade(message, context);
} catch (error) {
console.log(
logger.error(
`Message._withSchemaVersion: error updating message ${message.id}:`,
Errors.toLogFormat(error)
);
@@ -138,7 +147,7 @@ exports._withSchemaVersion = (schemaVersion, upgrade) => {
}
if (!exports.isValid(upgradedMessage)) {
console.log(
logger.error(
'Message._withSchemaVersion: Invalid upgraded message:',
upgradedMessage
);
@@ -186,6 +195,10 @@ exports._mapQuotedAttachments = upgradeAttachment => async (
if (!message.quote) {
return message;
}
if (!context || !isObject(context.logger)) {
throw new Error('_mapQuotedAttachments: context must have logger object');
}
const { logger } = context;
const upgradeWithContext = async attachment => {
const { thumbnail } = attachment;
@@ -194,7 +207,7 @@ exports._mapQuotedAttachments = upgradeAttachment => async (
}
if (!thumbnail.data) {
console.log('Quoted attachment did not have thumbnail data; removing it');
logger.warn('Quoted attachment did not have thumbnail data; removing it');
return omit(attachment, ['thumbnail']);
}
@@ -216,39 +229,46 @@ exports._mapQuotedAttachments = upgradeAttachment => async (
});
};
const toVersion0 = async message => exports.initializeSchemaVersion(message);
const toVersion1 = exports._withSchemaVersion(
1,
exports._mapAttachments(Attachment.autoOrientJPEG)
);
const toVersion2 = exports._withSchemaVersion(
2,
exports._mapAttachments(Attachment.replaceUnicodeOrderOverrides)
);
const toVersion3 = exports._withSchemaVersion(
3,
exports._mapAttachments(Attachment.migrateDataToFileSystem)
);
const toVersion4 = exports._withSchemaVersion(
4,
exports._mapQuotedAttachments(Attachment.migrateDataToFileSystem)
);
const toVersion5 = exports._withSchemaVersion(5, initializeAttachmentMetadata);
const toVersion6 = exports._withSchemaVersion(
6,
exports._mapContact(
const toVersion0 = async (message, context) =>
exports.initializeSchemaVersion({ message, logger: context.logger });
const toVersion1 = exports._withSchemaVersion({
schemaVersion: 1,
upgrade: exports._mapAttachments(Attachment.autoOrientJPEG),
});
const toVersion2 = exports._withSchemaVersion({
schemaVersion: 2,
upgrade: exports._mapAttachments(Attachment.replaceUnicodeOrderOverrides),
});
const toVersion3 = exports._withSchemaVersion({
schemaVersion: 3,
upgrade: exports._mapAttachments(Attachment.migrateDataToFileSystem),
});
const toVersion4 = exports._withSchemaVersion({
schemaVersion: 4,
upgrade: exports._mapQuotedAttachments(Attachment.migrateDataToFileSystem),
});
const toVersion5 = exports._withSchemaVersion({
schemaVersion: 5,
upgrade: initializeAttachmentMetadata,
});
const toVersion6 = exports._withSchemaVersion({
schemaVersion: 6,
upgrade: exports._mapContact(
Contact.parseAndWriteAvatar(Attachment.migrateDataToFileSystem)
)
);
),
});
// IMPORTANT: Weve updated our definition of `initializeAttachmentMetadata`, so
// we need to run it again on existing items that have previously been incorrectly
// classified:
const toVersion7 = exports._withSchemaVersion(7, initializeAttachmentMetadata);
const toVersion7 = exports._withSchemaVersion({
schemaVersion: 7,
upgrade: initializeAttachmentMetadata,
});
const toVersion8 = exports._withSchemaVersion(
8,
exports._mapAttachments(Attachment.captureDimensionsAndScreenshot)
);
const toVersion8 = exports._withSchemaVersion({
schemaVersion: 8,
upgrade: exports._mapAttachments(Attachment.captureDimensionsAndScreenshot),
});
const VERSIONS = [
toVersion0,
@@ -275,6 +295,7 @@ exports.upgradeSchema = async (
getImageDimensions,
makeImageThumbnail,
makeVideoScreenshot,
logger,
} = {}
) => {
if (!isFunction(writeNewAttachmentData)) {
@@ -301,6 +322,9 @@ exports.upgradeSchema = async (
if (!isFunction(makeVideoScreenshot)) {
throw new TypeError('context.makeVideoScreenshot is required');
}
if (!isObject(logger)) {
throw new TypeError('context.logger is required');
}
let message = rawMessage;
// eslint-disable-next-line no-restricted-syntax
@@ -317,6 +341,7 @@ exports.upgradeSchema = async (
getImageDimensions,
makeImageThumbnail,
makeVideoScreenshot,
logger,
});
}
@@ -339,9 +364,17 @@ exports.createAttachmentLoader = loadAttachmentData => {
// createAttachmentDataWriter :: (RelativePath -> IO Unit)
// Message ->
// IO (Promise Message)
exports.createAttachmentDataWriter = writeExistingAttachmentData => {
exports.createAttachmentDataWriter = ({
writeExistingAttachmentData,
logger,
}) => {
if (!isFunction(writeExistingAttachmentData)) {
throw new TypeError("'writeExistingAttachmentData' must be a function");
throw new TypeError(
'createAttachmentDataWriter: writeExistingAttachmentData must be a function'
);
}
if (!isObject(logger)) {
throw new TypeError('createAttachmentDataWriter: logger must be an object');
}
return async rawMessage => {
@@ -349,7 +382,10 @@ exports.createAttachmentDataWriter = writeExistingAttachmentData => {
throw new TypeError("'rawMessage' is not valid");
}
const message = exports.initializeSchemaVersion(rawMessage);
const message = exports.initializeSchemaVersion({
message: rawMessage,
logger,
});
const { attachments, quote, contact } = message;
const hasFilesToWrite =
@@ -387,7 +423,7 @@ exports.createAttachmentDataWriter = writeExistingAttachmentData => {
// we want to be bulletproof to thumbnails without data
if (!data || !path) {
console.log(
logger.warn(
'Thumbnail had neither data nor path.',
'id:',
message.id,
@@ -418,7 +454,7 @@ exports.createAttachmentDataWriter = writeExistingAttachmentData => {
const messageWithoutAttachmentData = Object.assign(
{},
await writeThumbnails(message),
await writeThumbnails(message, { logger }),
{
contact: await Promise.all((contact || []).map(writeContactAvatar)),
attachments: await Promise.all(

View File

@@ -10,7 +10,7 @@ const {
exports.blobToArrayBuffer = blobToArrayBuffer;
exports.getImageDimensions = objectUrl =>
exports.getImageDimensions = ({ objectUrl, logger }) =>
new Promise((resolve, reject) => {
const image = document.createElement('img');
@@ -21,14 +21,19 @@ exports.getImageDimensions = objectUrl =>
});
});
image.addEventListener('error', error => {
console.log('getImageDimensions error', toLogFormat(error));
logger.error('getImageDimensions error', toLogFormat(error));
reject(error);
});
image.src = objectUrl;
});
exports.makeImageThumbnail = (size, objectUrl, contentType = 'image/png') =>
exports.makeImageThumbnail = ({
size,
objectUrl,
contentType = 'image/png',
logger,
}) =>
new Promise((resolve, reject) => {
const image = document.createElement('img');
@@ -61,14 +66,18 @@ exports.makeImageThumbnail = (size, objectUrl, contentType = 'image/png') =>
});
image.addEventListener('error', error => {
console.log('makeImageThumbnail error', toLogFormat(error));
logger.error('makeImageThumbnail error', toLogFormat(error));
reject(error);
});
image.src = objectUrl;
});
exports.makeVideoScreenshot = (objectUrl, contentType = 'image/png') =>
exports.makeVideoScreenshot = ({
objectUrl,
contentType = 'image/png',
logger,
}) =>
new Promise((resolve, reject) => {
const video = document.createElement('video');
@@ -89,25 +98,33 @@ exports.makeVideoScreenshot = (objectUrl, contentType = 'image/png') =>
video.addEventListener('canplay', capture);
video.addEventListener('error', error => {
console.log('makeVideoThumbnail error', toLogFormat(error));
logger.error('makeVideoThumbnail error', toLogFormat(error));
reject(error);
});
video.src = objectUrl;
});
exports.makeVideoThumbnail = async (size, videoObjectUrl) => {
exports.makeVideoThumbnail = async ({ size, videoObjectUrl, logger }) => {
let screenshotObjectUrl;
try {
const type = 'image/png';
const blob = await exports.makeVideoScreenshot(videoObjectUrl, type);
const blob = await exports.makeVideoScreenshot({
objectUrl: videoObjectUrl,
contentType: type,
logger,
});
const data = await blobToArrayBuffer(blob);
screenshotObjectUrl = arrayBufferToObjectURL({
data,
type,
});
return exports.makeImageThumbnail(size, screenshotObjectUrl);
return exports.makeImageThumbnail({
size,
objectUrl: screenshotObjectUrl,
logger,
});
} finally {
exports.revokeObjectUrl(screenshotObjectUrl);
}