Define Hapi route handlers for serverless endpoints on now / aws / sls / gcf
Define Hapi route handlers for serverless, lambda (req, res) endpoints.
If like me, you like the idea of serverless but dislike the lambda / node http / express / polka API format, and prefer Hapi's routing, this allows you to do the following:
const { hapda } = require('hapda')
module.exports = hapda({
method: 'GET',
path: '/foo/bar',
handler: () => {
return { baz: 'qux' }
}
})
and then publish your serverless function as normal.
You can access the entire Hapi instance by passing a method which is given the Hapi instance as a parameter.
const myMethod = async server => {
server.plugins(...) // or routes, handlers, anything you can do with Hapi at all.
}
module.exports = hapda(myRoute, myMethod)
The following example does two things:
const validate = async (request, username, password, h) => {
const isValid = username === 'admin' && password === 'admin123'
return { isValid, credentials: { id: 123, username } }
}
async function setupServer (server) {
await server.register(require('@hapi/basic'))
server.auth.strategy('simple', 'basic', { validate })
server.auth.default('simple')
server.method(
'time',
() => new Date(),
{
cache: {
expiresIn: 15000,
generateTimeout: 100
}
}
)
}
const route = {
method: 'PUT',
path: '/foo/bar',
handler: () => {
return { lastCachedTime: server.methods.time() }
}
}
module.exports = hapda(route, setupServer)
For reasons of speed, Hapda doesn't call initialize()
on bootstrap. Normally, this function would be called by server.start()
but because we don't call that, or bind to a port or listen for HTTP connections, it never gets called. If you find that you need to call initialize()
to finalize plugin registration or start caching, you can do so using the server setup method:
async function setupServer (server) {
await server.register(someComplexPlugin)
await server.initialize()
}
const route = {
method: 'GET',
path: '/foo/bar',
handler: () => {
return { foo: 'bar' }
}
}
module.exports = hapda(route, setupServer)