Fix most of Terminal.api timing issues

This commit is contained in:
Daniel Imms
2019-11-09 17:29:32 -08:00
parent 17677568f9
commit 34e703e472
6 changed files with 156 additions and 125 deletions
+10 -7
View File
@@ -4,21 +4,24 @@
*/
import * as puppeteer from 'puppeteer';
import deepEqual = require('deep-equal');
export async function pollFor<T>(page: puppeteer.Page, evalOrFn: string | (() => Promise<T>), val: T, preFn?: () => Promise<void>): Promise<void> {
if (preFn) {
await preFn();
}
const result = typeof evalOrFn === 'string' ? await page.evaluate(evalOrFn) : await evalOrFn();
let equal = false;
if (typeof result === 'object') {
equal = Object.keys(result).every(e => result[e] === (val as any)[e]);
} else {
equal = result === val;
}
if (!equal) {
if (!deepEqual(result, val)) {
return new Promise<void>(r => {
setTimeout(() => r(pollFor(page, evalOrFn, val, preFn)), 10);
});
}
}
export async function writeSync(page: puppeteer.Page, data: string): Promise<void> {
await page.evaluate(`
window.ready = false;
window.term.write('${data}', () => window.ready = true);
`);
await pollFor(page, 'window.ready', true);
}