Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 36 additions & 18 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ async function start (opts) {

let listening = false
let stopped = false
let handler

const res = {
app: await (spinUpFastify(opts, serverWrapper, restart, true).ready()),
restart,
Expand Down Expand Up @@ -38,19 +40,35 @@ async function start (opts) {
stop
}

res.app.server.on('request', res.app.server.handler)
res.app.server.on('request', handler)

return res

async function restart (_opts = opts) {
const old = res.app
const oldHandler = serverWrapper.server.handler
const oldHandler = handler
const clientErrorListeners = old.server.listeners('clientError')
const newApp = spinUpFastify(_opts, serverWrapper, restart)
await newApp.ready()
old.server.removeListener('request', oldHandler)
try {
await newApp.ready()
} catch (err) {
const listenersNow = newApp.server.listeners('clientError')
handler = oldHandler
// Creating a new Fastify apps adds one clientError listener
// Let's remove all the new ones
for (const listener of listenersNow) {
if (clientErrorListeners.indexOf(listener) === -1) {
old.server.removeListener('clientError', listener)
}
}
await newApp.close()
throw err
}

// Remove the old handler and add the new one
// the handler variable was updated in the spinUpFastify function
old.server.removeListener('request', oldHandler)
newApp.server.on('request', newApp.server.handler)
newApp.server.on('request', handler)
for (const listener of clientErrorListeners) {
old.server.removeListener('clientError', listener)
}
Expand All @@ -72,22 +90,22 @@ async function start (opts) {
await Promise.all(toClose)
res.app.log.info('server stopped')
}
}

function spinUpFastify (opts, serverWrapper, restart, isStart = false) {
const server = serverWrapper.server
const _opts = Object.assign({}, opts)
_opts.serverFactory = function (handler) {
server.handler = handler
return server
}
const app = Fastify(_opts)
function spinUpFastify (opts, serverWrapper, restart, isStart = false) {
const server = serverWrapper.server
const _opts = Object.assign({}, opts)
_opts.serverFactory = function (_handler) {
handler = _handler
return server
}
const app = Fastify(_opts)

app.decorate('restart', restart)
app.decorate('restarted', !isStart)
app.register(opts.app, opts)
app.decorate('restart', restart)
app.decorate('restarted', !isStart)
app.register(opts.app, opts)

return app
return app
}
}

module.exports = {
Expand Down
53 changes: 53 additions & 0 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -260,3 +260,56 @@ test('no warnings', async ({ pass, teardown, plan, same, equal, fail }) => {
await restart()
}
})

test('restart fastify after a failed start', async ({ pass, teardown, plan, same, equal, rejects }) => {
plan(11)

const _opts = {
port: 0,
app: myApp
}

let count = 0

async function myApp (app, opts) {
pass('application loaded')
equal(opts, _opts)

app.register(async function () {
if (count++ % 2) {
throw new Error('kaboom')
}
})
app.get('/', async () => {
return { hello: 'world' }
})
}

const server = await start(_opts)

same(server.app.restarted, false)

const { stop, restart, listen } = server
teardown(stop)

const { port } = await listen()

{
const res = await request(`http://127.0.0.1:${port}`)
same(await res.body.json(), { hello: 'world' })
}

await rejects(restart())

{
const res = await request(`http://127.0.0.1:${port}`)
same(await res.body.json(), { hello: 'world' })
}

await restart()

{
const res = await request(`http://127.0.0.1:${port}`)
same(await res.body.json(), { hello: 'world' })
}
})