Lazy-load API

This commit is contained in:
Surma
2018-12-03 14:30:19 +00:00
parent bb3bd2d46a
commit 1507a44141
2 changed files with 39 additions and 35 deletions

View File

@@ -0,0 +1,37 @@
import App from './index';
import { expose } from 'comlink';
export function exposeAPI(app: App) {
self.parent.postMessage('READY', '*');
self.addEventListener('message', (ev: MessageEvent) => {
if (ev.data !== 'READY?') {
return;
}
ev.stopPropagation();
self.parent.postMessage('READY', '*');
});
expose(new API(app), self.parent);
}
class API {
constructor(private app: App) { }
async setFile(blob: Blob, name: string) {
await new Promise((resolve) => {
this.app.setState({ file: new File([blob], name) }, resolve);
});
await new Promise((resolve) => {
document.addEventListener('squooshingdone', resolve, { once: true });
});
}
async getBlob(side: 0 | 1) {
if (!this.app.state.file || !this.app.compressInstance) {
throw new Error('No file has been loaded');
}
await this.app.compressInstance.compressionJobs[side];
return this.app.compressInstance.state.images[side].file;
}
}

View File

@@ -36,7 +36,7 @@ export default class App extends Component<Props, State> {
file: undefined, file: undefined,
Compress: undefined, Compress: undefined,
}; };
private compressInstance?: import('../compress').default; compressInstance?: import('../compress').default;
snackbar?: SnackBarElement; snackbar?: SnackBarElement;
@@ -70,7 +70,7 @@ export default class App extends Component<Props, State> {
}); });
window.addEventListener('popstate', this.onPopState); window.addEventListener('popstate', this.onPopState);
this.exposeAPI(); import('./client-api').then(m => m.exposeAPI(this));
} }
@bind @bind
@@ -105,39 +105,6 @@ export default class App extends Component<Props, State> {
this.setState({ isEditorOpen: true }); this.setState({ isEditorOpen: true });
} }
private exposeAPI() {
const api = {
setFile: async (blob: Blob, name: string) => {
let oldCompressorState = this.compressInstance && this.compressInstance.state;
await new Promise((resolve) => {
this.setState({ file: new File([blob], name) }, resolve);
});
await new Promise((resolve) => {
document.addEventListener('squooshingdone', resolve, { once: true });
});
if (oldCompressorState) {
let newState = this.compressInstance!.state;
[0, 1].forEach((index) => {
oldCompressorState = cleanMerge(oldCompressorState!, `images.${index}`, {
loading: false,
data: undefined,
});
newState = cleanSet(newState, `images.${index}`, oldCompressorState.images[index]);
});
this.compressInstance!.setState(newState);
}
},
getBlob: async (side: 0 | 1) => {
if (!this.state.file || !this.compressInstance) {
throw new Error('No file has been loaded');
}
await this.compressInstance.compressionJobs[side];
return this.compressInstance.state.images[side].file;
},
};
expose(api, self.parent);
}
render({}: Props, { file, isEditorOpen, Compress }: State) { render({}: Props, { file, isEditorOpen, Compress }: State) {
return ( return (
<div id="app" class={style.app}> <div id="app" class={style.app}>