Minimalist serverless middleware and utilities. Get started instantly with Presta.
npm i hypr
Define a stack of serverless handlers. Middleware handlers should mutate
event and context. All returned responses are deeply merged and returned
to the client.
import * as hypr from 'hypr'
import { helmet } from 'hypr/helmet'
export const route = '*'
export const handler = hypr.stack([
(event, context) => {
const user = getLoggedInUser(event) // your code here
context.user = user
},
(event, context) => {
return {
json: { message: `Hello, ${context.user.firstName}!` }
}
}
helmet(),
])To define specific HTTP methods, use hypr.main.
export const handler = hypr.stack([
hypr.main({
get(event, context) {
return {
json: { message: 'GET request' }
}
},
post(event, context) {
return {
json: { message: 'POST request' }
}
}
}),
...
])For errors, throw a HttpError.
const authMiddleware = (event, context) => {
const user = getLoggedInUser(event) // your code here
context.user = user
}
const authGuard = (event, context) => {
if (!context.user) {
throw new hypr.HttpError(401, 'You are not authorized to view this page')
}
}
export const handler = hypr.stack([
authMiddleware,
authGuard,
(event, context) => {
return {
json: { message: `You are authenticated.` },
}
},
])You can also pass JSON to HttpError.
throw new hypr.HttpError(400, {
code: `auth`,
error: `You are not authorized to view this page`,
})Hypr bundles a few useful middlewares.
Protect your APIs with common security headers. Inspired by helmet.
import { stack, main } from 'hypr'
import { helmet } from 'hypr/helmet'
export const handler = stack([
main(...),
helmet(),
])Parse and serialize cookies using
sugarcookie. thaw and bake are
just aliases for parse and serialize exports.
import { stack, main } from 'hypr'
import { thaw, bake } from 'hypr/cookies'
export const handler = stack([
thaw(), // reads from `event.headers.cookie`
main((event) => {
const { session_id } = event.cookies
const { id, expiresAt } = refreshSession(session_id)
return {
statusCode: 204,
cookies: {
// shorthand, no options
cookie_name: 'value',
// with options
session_id: [
id,
{
expires: expiresAt,
secure: true,
httpOnly: true,
},
],
},
}
}),
bake(), // serializes to response.headers['set-cookie']
])Middleware run before and/or after any main handlers. Anything running before
should attach props to event or context. Anything running after should read
values from the response and merge in new values.
For this reason, middlewares are passed a third, non-standard, parameter
response. See the available
cookie middleware
for examples.
import { createHandler } from 'hypr'
export const set204IfNoBodyMiddleware = createHandler((options) => {
return (event, context, response) => {
if (!response.body) {
return { statusCode: 204 }
// or mutate with response.statusCode = 204
}
}
})MIT License © Sure Thing