You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-desktop/ts/data/dataUtils.ts

54 lines
1.8 KiB
TypeScript

/* eslint-disable no-param-reassign */
import _ from 'lodash';
/**
* When IPC arguments are prepared for the cross-process send, they are JSON.stringified.
* We can't send ArrayBuffers or BigNumbers (what we get from proto library for dates).
* @param data - data to be cleaned
*/
export function cleanData(data: any): any {
const keys = Object.keys(data);
for (let index = 0, max = keys.length; index < max; index += 1) {
const key = keys[index];
const value = data[key];
if (value === null || value === undefined) {
// eslint-disable-next-line no-continue
continue;
}
// eslint-disable no-param-reassign
if (_.isFunction(value.toNumber)) {
// eslint-disable-next-line no-param-reassign
data[key] = value.toNumber();
} else if (_.isFunction(value)) {
// just skip a function which has not a toNumber function. We don't want to save a function to the db.
// an attachment comes with a toJson() function
delete data[key];
} else if (Array.isArray(value)) {
data[key] = value.map(cleanData);
} else if (_.isObject(value) && value instanceof File) {
data[key] = { name: value.name, path: value.path, size: value.size, type: value.type };
} else if (_.isObject(value) && value instanceof ArrayBuffer) {
window.log.error(
'Trying to save an ArrayBuffer to the db is most likely an error. This specific field should be removed before the cleanData call'
);
/// just skip it
continue;
} else if (_.isObject(value)) {
data[key] = cleanData(value);
} else if (_.isBoolean(value)) {
data[key] = value ? 1 : 0;
} else if (
typeof value !== 'string' &&
typeof value !== 'number' &&
typeof value !== 'boolean'
) {
window?.log?.info(`cleanData: key ${key} had type ${typeof value}`);
}
}
return data;
}