Skip to content

Commit

Permalink
fix: gracefully exit login and publish commands on Ctrl+C (SIGINT) in…
Browse files Browse the repository at this point in the history
… the new webAuthn flow (#5243)
  • Loading branch information
neeldani committed Aug 2, 2022
1 parent 3c024ac commit d315ead
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
9 changes: 9 additions & 0 deletions lib/utils/open-url-prompt.js
Expand Up @@ -34,6 +34,11 @@ const promptOpen = async (npm, url, title, prompt, emitter) => {
})

const tryOpen = await new Promise(resolve => {
rl.on('SIGINT', () => {
rl.close()
resolve('SIGINT')
})

rl.question(prompt, () => {
resolve(true)
})
Expand All @@ -50,6 +55,10 @@ const promptOpen = async (npm, url, title, prompt, emitter) => {
}
})

if (tryOpen === 'SIGINT') {
throw new Error('canceled')
}

if (!tryOpen) {
return
}
Expand Down
29 changes: 29 additions & 0 deletions test/lib/utils/open-url-prompt.js
Expand Up @@ -28,6 +28,8 @@ const opener = (url, opts, cb) => {
}

let questionShouldResolve = true
let openUrlPromptInterrupted = false

const readline = {
createInterface: () => ({
question: (_q, cb) => {
Expand All @@ -36,6 +38,11 @@ const readline = {
}
},
close: () => {},
on: (_signal, cb) => {
if (openUrlPromptInterrupted && _signal === 'SIGINT') {
cb()
}
},
}),
}

Expand Down Expand Up @@ -148,3 +155,25 @@ t.test('returns error when opener errors', async t => {
)
t.equal(openerUrl, 'https://www.npmjs.com', 'did not open')
})

t.test('throws "canceled" error on SIGINT', async t => {
t.teardown(() => {
openerUrl = null
openerOpts = null
OUTPUT.length = 0
questionShouldResolve = true
openUrlPromptInterrupted = false
})

questionShouldResolve = false
openUrlPromptInterrupted = true
const emitter = new EventEmitter()

const open = openUrlPrompt(npm, 'https://www.npmjs.com', 'npm home', 'prompt', emitter)

try {
await open
} catch (err) {
t.equal(err.message, 'canceled')
}
})

0 comments on commit d315ead

Please sign in to comment.