Code Monkey home page Code Monkey logo

hapda's Introduction

Hapda

Define Hapi route handlers for serverless, lambda (req, res) endpoints.

Features

  • Full access to the Hapi API and ecosystem
  • Uses shot.inject rather than running a real Hapi instance, meaning no extra TCP overhead, no extra HTTP overhead
  • Clean and concise, doesn't get in your way
  • Leverage entire existing Hapi ecosystem, validation, plugins, caching, architecture
  • Build battle-tested serverless handlers instead of hacking together raw http endpoints

What is it?

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.

How do I use plugins?

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)

An example with some caching and auth

The following example does two things:

  • Sets up authentication in basic mode (with a super secure password ;))
  • Sets up a cached server-function whose value is cached for 15 seconds
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)

Troubleshooting

Caching / Plugin X doesn't work.

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)

hapda's People

Contributors

antony avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.