Skip to content

Instantly share code, notes, and snippets.

@m3g4p0p
Created September 12, 2018 17:52
Show Gist options
  • Save m3g4p0p/fa48ba3c6ea2d338b2aa922383c4d5d2 to your computer and use it in GitHub Desktop.
Save m3g4p0p/fa48ba3c6ea2d338b2aa922383c4d5d2 to your computer and use it in GitHub Desktop.
Abort requests w/o event emitter
const express = require('express')
const app = express()
const tokenTable = {}
const getMeaningOfLife = token => new Promise((resolve, reject) => {
tokenTable[token] = () => {
global.clearTimeout(handle)
reject(new Error('aborted ' + token))
}
const handle = global.setTimeout(() => {
resolve('42')
}, 7500)
})
app.post('/abort/:token', (req, res) => {
const { token } = req.params
const reject = tokenTable[token]
if (reject) {
reject()
res.end(token)
} else {
res.sendStatus(400)
res.end('Unknown token: ' + token)
}
})
app.get('/expensive-request', (req, res) => {
const token = req.get('abort-token')
if (!token || tokenTable[token]) {
res.sendStatus(400)
return res.end('Token not provided or already registered')
}
getMeaningOfLife(token)
.then(mol => res.end(mol))
.catch(err => res.end(err.message))
.finally(() => {
delete tokenTable[token]
})
})
app.listen(3000)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment