Telegram Web K with changes to work inside I2P
https://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.4 KiB
53 lines
1.4 KiB
import WebpWorker from 'worker-loader!./webp.worker'; |
|
import { CancellablePromise, deferredPromise } from '../polyfill'; |
|
|
|
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) { |
|
promise.resolve(payload.bytes); |
|
delete this.convertPromises[payload.fileName]; |
|
} |
|
} else { |
|
navigator.serviceWorker.controller.postMessage(e.data); |
|
} |
|
}); |
|
} |
|
|
|
postMessage(data: WebpConvertTask) { |
|
if(this.init) { |
|
this.init(); |
|
this.init = null; |
|
} |
|
|
|
this.worker.postMessage(data); |
|
} |
|
|
|
convert(fileName: string, bytes: Uint8Array) { |
|
const convertPromise = deferredPromise<Uint8Array>(); |
|
|
|
fileName = 'main-' + fileName; |
|
|
|
this.postMessage({type: 'convertWebp', payload: {fileName, bytes}}); |
|
|
|
return this.convertPromises[fileName] = convertPromise; |
|
} |
|
} |
|
|
|
export const webpWorkerController = new WebpWorkerController(); |