提交 bdf55866 编写于 作者: Huan (李卓桓)'s avatar Huan (李卓桓)

add StateSwitch to bridge to resolve async race condition

上级 de67c47f
......@@ -31,12 +31,16 @@ import Profile from '../profile'
import Bridge from './bridge'
test('PuppetWebBridge', async t => {
test.only('PuppetWebBridge', async t => {
const profile = new Profile()
const bridge = new Bridge({ profile })
await bridge.init()
t.ok(bridge, 'Bridge instnace')
await bridge.quit()
try {
await bridge.init()
await bridge.quit()
t.pass('Bridge instnace')
} catch (e) {
t.fail('Bridge instance: ' + e)
}
})
test('testBlockedMessage()', async t => {
......@@ -111,7 +115,7 @@ test('clickSwitchAccount()', async t => {
const profile = new Profile()
const bridge = new Bridge({ profile} )
test('switch account', async t => {
test('switch account needed', async t => {
const browser = await launch()
const page = await browser.newPage()
......@@ -124,7 +128,7 @@ test('clickSwitchAccount()', async t => {
t.equal(clicked, true, 'should click the switch account button')
})
test('switch account', async t => {
test('switch account not needed', async t => {
const browser = await launch()
const page = await browser.newPage()
......
......@@ -28,6 +28,7 @@ import {
launch,
Page,
} from 'puppeteer'
import StateSwitch from 'state-switch'
import { parseString } from 'xml2js'
/* tslint:disable:no-var-requires */
......@@ -56,26 +57,31 @@ declare const WechatyBro
export class Bridge extends EventEmitter {
private browser : Browser
private page : Page
private state : StateSwitch
constructor(
public options: BridgeOptions,
) {
super()
log.verbose('PuppetWebBridge', 'constructor()')
this.state = new StateSwitch('PuppetWebBridge', log)
}
public async init(): Promise<void> {
log.verbose('PuppetWebBridge', 'init()')
this.state.on('pending')
try {
this.browser = await this.initBrowser()
log.verbose('PuppetWebBridge', 'init() initBrowser() done')
this.page = await this.initPage(this.browser)
log.verbose('PuppetWebBridge', 'init() initPage() done')
this.state.on(true)
log.verbose('PuppetWebBridge', 'init() initPage() done')
} catch (e) {
this.state.off(true)
log.error('PuppetWebBridge', 'init() exception: %s', e)
throw e
}
......@@ -124,11 +130,23 @@ export class Bridge extends EventEmitter {
const onLoad = async () => {
log.verbose('PuppetWebBridge', 'initPage() on(load) %s', page.url())
if (this.state.off()) {
log.verbose('PuppetWebBridge', 'initPage() onLoad() OFF state detected. NOP')
return
}
try {
await page.exposeFunction('emit', this.emit.bind(this))
} catch (e) {
if (this.state.off()) {
log.verbose('PuppetWebBridge', 'initPage() onLoad() OFF state detected. NOP')
return
}
// exposed function will stay in the browser after reload the page
log.verbose('PuppetWebBridge', 'initPage() onLoad() page.exposeFunction(emit) exception: %s', e)
log.verbose('PuppetWebBridge', 'initPage() onLoad() page.exposeFunction(emit) already exist')
log.silly('PuppetWebBridge', 'initPage() onLoad() page.exposeFunction(emit) exception: %s', e)
}
try {
......@@ -143,6 +161,11 @@ export class Bridge extends EventEmitter {
}
} catch (e) {
if (this.state.off()) {
log.verbose('PuppetWebBridge', 'initPage() onLoad() OFF state detected. NOP')
return
}
log.error('PuppetWebBridge', 'init() initPage() onLoad() exception: %s', e)
this.emit('error', e)
}
......@@ -239,6 +262,8 @@ export class Bridge extends EventEmitter {
public async quit(): Promise<void> {
log.verbose('PuppetWebBridge', 'quit()')
this.state.off('pending')
try {
await this.page.close()
log.silly('PuppetWebBridge', 'quit() page.close()-ed')
......@@ -247,6 +272,8 @@ export class Bridge extends EventEmitter {
} catch (e) {
log.warn('PuppetWebBridge', 'quit() exception: %s', e)
this.emit('error', e)
} finally {
this.state.off(true)
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册