164 lines
5.2 KiB
JavaScript
164 lines
5.2 KiB
JavaScript
/*!
|
|
* FilePondPluginFileEncode 2.1.14
|
|
* Licensed under MIT, https://opensource.org/licenses/MIT/
|
|
* Please visit https://pqina.nl/filepond/ for details.
|
|
*/
|
|
|
|
/* eslint-disable */
|
|
|
|
const DataURIWorker = function() {
|
|
// route messages
|
|
self.onmessage = e => {
|
|
convert(e.data.message, response => {
|
|
self.postMessage({ id: e.data.id, message: response });
|
|
});
|
|
};
|
|
|
|
// convert file to data uri
|
|
const convert = (options, cb) => {
|
|
const { file } = options;
|
|
|
|
const reader = new FileReader();
|
|
reader.onloadend = () => {
|
|
cb(reader.result.replace('data:', '').replace(/^.+,/, ''));
|
|
};
|
|
reader.readAsDataURL(file);
|
|
};
|
|
};
|
|
|
|
const plugin = ({ addFilter, utils }) => {
|
|
// get quick reference to Type utils
|
|
const { Type, createWorker, createRoute, isFile } = utils;
|
|
|
|
const encode = ({ name, file }) =>
|
|
new Promise(resolve => {
|
|
const worker = createWorker(DataURIWorker);
|
|
worker.post({ file }, data => {
|
|
resolve({ name, data });
|
|
worker.terminate();
|
|
});
|
|
});
|
|
|
|
// holds base64 strings till can be moved to item
|
|
const base64Cache = [];
|
|
addFilter('DID_CREATE_ITEM', (item, { query }) => {
|
|
if (!query('GET_ALLOW_FILE_ENCODE')) return;
|
|
|
|
item.extend(
|
|
'getFileEncodeBase64String',
|
|
() => base64Cache[item.id] && base64Cache[item.id].data
|
|
);
|
|
item.extend(
|
|
'getFileEncodeDataURL',
|
|
() =>
|
|
base64Cache[item.id] && `data:${item.fileType};base64,${base64Cache[item.id].data}`
|
|
);
|
|
});
|
|
|
|
addFilter(
|
|
'SHOULD_PREPARE_OUTPUT',
|
|
(shouldPrepareOutput, { query }) =>
|
|
new Promise(resolve => {
|
|
resolve(query('GET_ALLOW_FILE_ENCODE'));
|
|
})
|
|
);
|
|
|
|
addFilter(
|
|
'COMPLETE_PREPARE_OUTPUT',
|
|
(file, { item, query }) =>
|
|
new Promise(resolve => {
|
|
// if it's not a file or a list of files, continue
|
|
if (!query('GET_ALLOW_FILE_ENCODE') || (!isFile(file) && !Array.isArray(file))) {
|
|
return resolve(file);
|
|
}
|
|
|
|
// store metadata settings for this cache
|
|
base64Cache[item.id] = {
|
|
metadata: item.getMetadata(),
|
|
data: null,
|
|
};
|
|
|
|
// wait for all file items to be encoded
|
|
Promise.all(
|
|
(file instanceof Blob ? [{ name: null, file }] : file).map(encode)
|
|
).then(dataItems => {
|
|
base64Cache[item.id].data =
|
|
file instanceof Blob ? dataItems[0].data : dataItems;
|
|
resolve(file);
|
|
});
|
|
})
|
|
);
|
|
|
|
// called for each view that is created right after the 'create' method
|
|
addFilter('CREATE_VIEW', viewAPI => {
|
|
// get reference to created view
|
|
const { is, view, query } = viewAPI;
|
|
|
|
// only hook up to item view
|
|
if (!is('file-wrapper') || !query('GET_ALLOW_FILE_ENCODE')) {
|
|
return;
|
|
}
|
|
|
|
view.registerWriter(
|
|
createRoute({
|
|
DID_PREPARE_OUTPUT: ({ root, action }) => {
|
|
// only do this if is not uploading async
|
|
if (query('IS_ASYNC')) {
|
|
return;
|
|
}
|
|
|
|
const item = query('GET_ITEM', action.id);
|
|
if (!item) return;
|
|
|
|
// extract base64 string
|
|
const cache = base64Cache[item.id];
|
|
const metadata = cache.metadata;
|
|
const data = cache.data;
|
|
|
|
// create JSON string from encoded data
|
|
const value = JSON.stringify({
|
|
id: item.id,
|
|
name: item.file.name,
|
|
type: item.file.type,
|
|
size: item.file.size,
|
|
metadata: metadata,
|
|
data,
|
|
});
|
|
|
|
// for filepond < 4.13.0
|
|
if (root.ref.data) {
|
|
root.ref.data.value = value;
|
|
}
|
|
// newer versions
|
|
else {
|
|
root.dispatch('DID_DEFINE_VALUE', {
|
|
id: item.id,
|
|
value,
|
|
});
|
|
}
|
|
},
|
|
DID_REMOVE_ITEM: ({ action }) => {
|
|
const item = query('GET_ITEM', action.id);
|
|
if (!item) return;
|
|
delete base64Cache[item.id];
|
|
},
|
|
})
|
|
);
|
|
});
|
|
|
|
return {
|
|
options: {
|
|
// Enable or disable file encoding
|
|
allowFileEncode: [true, Type.BOOLEAN],
|
|
},
|
|
};
|
|
};
|
|
|
|
// fire pluginloaded event if running in browser, this allows registering the plugin when using async script tags
|
|
const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';
|
|
if (isBrowser) {
|
|
document.dispatchEvent(new CustomEvent('FilePond:pluginloaded', { detail: plugin }));
|
|
}
|
|
|
|
export default plugin;
|