63 lines
1.7 KiB
TypeScript
63 lines
1.7 KiB
TypeScript
import WebpWorker from 'worker-loader!./webp.worker';
|
|
import { CancellablePromise, deferredPromise } from '../../helpers/cancellablePromise';
|
|
import apiManagerProxy from '../mtproto/mtprotoworker';
|
|
|
|
export type WebpConvertTask = {
|
|
type: 'convertWebp',
|
|
payload: {
|
|
fileName: string,
|
|
bytes: Uint8Array
|
|
}
|
|
};
|
|
|
|
export class WebpWorkerController {
|
|
private worker: Worker;
|
|
private convertPromises: {[fileName: string]: CancellablePromise<Uint8Array>} = {};
|
|
|
|
init() {
|
|
this.worker = new WebpWorker();
|
|
this.worker.addEventListener('message', (e) => {
|
|
const payload = (e.data as WebpConvertTask).payload;
|
|
|
|
if(payload.fileName.indexOf('main-') === 0) {
|
|
const promise = this.convertPromises[payload.fileName];
|
|
if(promise) {
|
|
payload.bytes ? promise.resolve(payload.bytes) : promise.reject();
|
|
delete this.convertPromises[payload.fileName];
|
|
}
|
|
} else {
|
|
apiManagerProxy.postMessage(e.data);
|
|
}
|
|
});
|
|
}
|
|
|
|
postMessage(data: WebpConvertTask) {
|
|
if(this.init) {
|
|
this.init();
|
|
this.init = null;
|
|
}
|
|
|
|
this.worker.postMessage(data);
|
|
}
|
|
|
|
convert(fileName: string, bytes: Uint8Array) {
|
|
fileName = 'main-' + fileName;
|
|
|
|
if(this.convertPromises.hasOwnProperty(fileName)) {
|
|
return this.convertPromises[fileName];
|
|
}
|
|
|
|
const convertPromise = deferredPromise<Uint8Array>();
|
|
|
|
this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});
|
|
|
|
return this.convertPromises[fileName] = convertPromise;
|
|
}
|
|
}
|
|
|
|
const webpWorkerController = new WebpWorkerController();
|
|
// @ts-ignore
|
|
if(process.env.NODE_ENV != 'production') {
|
|
(window as any).webpWorkerController = webpWorkerController;
|
|
}
|
|
export default webpWorkerController; |