Skip to content

Commit 75ea720

Browse files
committed
Add timeout to IPC client.
1 parent b839f31 commit 75ea720

3 files changed

Lines changed: 47 additions & 48 deletions

File tree

popup-app/components/IdpSelect.js

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,6 @@ import { ipcStorage } from '../../src/storage'
66

77
import './IdpSelect.css'
88

9-
const timeout = (promise, ms) =>
10-
Promise.race([
11-
promise,
12-
new Promise((resolve, reject) => setTimeout(() => resolve(null), ms))
13-
])
14-
159
class IdpSelect extends React.Component {
1610
state = {
1711
enteringCustomIdp: false,
@@ -42,20 +36,8 @@ class IdpSelect extends React.Component {
4236
return
4337
}
4438
const client = new Client(window.opener, appOrigin)
45-
let loginOptions = await timeout(client.request('getLoginOptions'), 2000)
46-
if (!loginOptions) {
47-
console.warn(
48-
'Cannot log in - have not yet received loginOptions from parent window'
49-
)
50-
this.setState({
51-
error:
52-
"Couldn't find the application window. " +
53-
'Try closing this popup window and logging in again.'
54-
})
55-
return
56-
}
57-
loginOptions = {
58-
...loginOptions,
39+
const loginOptions = {
40+
...(await client.request('getLoginOptions')),
5941
storage: ipcStorage(client)
6042
}
6143
await auth.login(idp.url, loginOptions)

popup-app/index.js

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -24,35 +24,42 @@ const defaultIdps = [
2424
}
2525
]
2626

27-
findAppOrigin().then(appOrigin => {
28-
const baseUrl = window.location.href.replace(/(\/\/[^/]*\/).*/, '$1')
29-
const host = baseUrl.replace(/^[^:]+:|\//g, '')
30-
const appName = process.env.APP_NAME.trim() || host
27+
findAppOrigin()
28+
.then(appOrigin => {
29+
const baseUrl = window.location.href.replace(/(\/\/[^/]*\/).*/, '$1')
30+
const host = baseUrl.replace(/^[^:]+:|\//g, '')
31+
const appName = process.env.APP_NAME.trim() || host
3132

32-
let element
33-
if (!appOrigin) {
34-
element = <NoParent appName={appName} />
35-
} else if (window.location.hash) {
36-
element = (
37-
<IdpCallback
38-
appOrigin={appOrigin}
39-
afterLoggedIn={() => setTimeout(window.close, 750)}
40-
/>
41-
)
42-
} else {
43-
const idps = [...defaultIdps]
44-
if (!idps.some(idp => idp.url === baseUrl)) {
45-
idps.unshift({
46-
displayName: host,
47-
url: baseUrl,
48-
iconUrl: baseUrl + 'favicon.ico'
49-
})
33+
let element
34+
if (!appOrigin) {
35+
element = <NoParent appName={appName} />
36+
} else if (window.location.hash) {
37+
element = (
38+
<IdpCallback
39+
appOrigin={appOrigin}
40+
afterLoggedIn={() => setTimeout(window.close, 750)}
41+
/>
42+
)
43+
} else {
44+
const idps = [...defaultIdps]
45+
if (!idps.some(idp => idp.url === baseUrl)) {
46+
idps.unshift({
47+
displayName: host,
48+
url: baseUrl,
49+
iconUrl: baseUrl + 'favicon.ico'
50+
})
51+
}
52+
element = (
53+
<IdpSelect idps={idps} appOrigin={appOrigin} appName={appName} />
54+
)
5055
}
51-
element = <IdpSelect idps={idps} appOrigin={appOrigin} appName={appName} />
52-
}
5356

54-
ReactDOM.render(element, document.getElementById('app-container'))
55-
})
57+
ReactDOM.render(element, document.getElementById('app-container'))
58+
})
59+
.catch(error => {
60+
window.alert(error)
61+
window.close()
62+
})
5663

5764
async function findAppOrigin() {
5865
if (!window.opener) {

src/ipc.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,25 @@ export class Client {
9393
)
9494

9595
// Create a promise that resolves to the request's return value
96-
return new Promise(resolve => {
96+
return new Promise((resolve, reject) => {
97+
// Listen for responses to the request
98+
window.addEventListener('message', responseListener)
99+
100+
// Cancel if the response takes too long
101+
const timeout = setTimeout(() => {
102+
reject(new Error('Could not connect to main window.'))
103+
window.removeEventListener('message', responseListener)
104+
}, 2000)
105+
106+
// Processes a possible response to the request
97107
function responseListener({ data }) {
98108
const resp = data && data[NAMESPACE]
99109
if (resp && resp.id === id && resp.hasOwnProperty('ret')) {
100110
resolve(resp.ret)
111+
clearTimeout(timeout)
101112
window.removeEventListener('message', responseListener)
102113
}
103114
}
104-
window.addEventListener('message', responseListener)
105115
})
106116
}
107117
}

0 commit comments

Comments
 (0)