Skip to content

Commit

Permalink
fix: upnp client is destroyed #662
Browse files Browse the repository at this point in the history
  • Loading branch information
agalwood committed May 24, 2020
1 parent 6287942 commit dc28760
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 43 deletions.
3 changes: 2 additions & 1 deletion src/main/Application.js
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,8 @@ export default class Application extends EventEmitter {
if (newValue) {
this.startUPnPMapping()
} else {
this.stopUPnPMapping()
await this.stopUPnPMapping()
this.upnp.closeClient()
}
})
}
Expand Down
82 changes: 40 additions & 42 deletions src/main/core/UPnPManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import NatAPI from 'nat-api'
import logger from './Logger'

let client = null
let timer = null
const mappingStatus = {}

export default class UPnPManager {
Expand All @@ -18,11 +17,12 @@ export default class UPnPManager {
return
}

client = new NatAPI()
client = new NatAPI({
autoUpdate: true
})
}

map (port) {
this.clearCloseTimer()
this.init()

return new Promise((resolve, reject) => {
Expand All @@ -32,24 +32,25 @@ export default class UPnPManager {
return
}

client.map(port, (err) => {
if (err) {
logger.warn(`[Motrix] UPnPManager map ${port} failed, error: `, err)
reject(err.message)
return
}

mappingStatus[port] = true
logger.info(`[Motrix] UPnPManager port ${port} mapping succeeded`)
resolve()
})
}).finally(() => {
this.delayCloseClient()
try {
client.map(port, (err) => {
if (err) {
logger.warn(`[Motrix] UPnPManager map ${port} failed, error: `, err)
reject(err.message)
return
}

mappingStatus[port] = true
logger.info(`[Motrix] UPnPManager port ${port} mapping succeeded`)
resolve()
})
} catch (err) {
reject(err.message)
}
})
}

unmap (port) {
this.clearCloseTimer()
this.init()

return new Promise((resolve, reject) => {
Expand All @@ -64,38 +65,35 @@ export default class UPnPManager {
return
}

client.unmap(port, (err) => {
if (err) {
logger.warn(`[Motrix] UPnPManager unmap ${port} failed, error: `, err)
reject(err.message)
return
}

logger.info(`[Motrix] UPnPManager port ${port} unmapping succeeded`)
mappingStatus[port] = false
resolve()
})
}).finally(() => {
this.delayCloseClient()
try {
client.unmap(port, (err) => {
if (err) {
logger.warn(`[Motrix] UPnPManager unmap ${port} failed, error: `, err)
reject(err.message)
return
}

logger.info(`[Motrix] UPnPManager port ${port} unmapping succeeded`)
mappingStatus[port] = false
resolve()
})
} catch (err) {
reject(err.message)
}
})
}

delayCloseClient () {
timer = setTimeout(() => {
this.closeClient()
}, 30000)
}

clearCloseTimer () {
clearTimeout(timer)
}

closeClient () {
if (!client) {
return
}

client.destroy()
client = null
try {
client.destroy(() => {
client = null
})
} catch (err) {
logger.warn('[Motrix] close UPnP client fail', err)
}
}
}

0 comments on commit dc28760

Please sign in to comment.