CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-hapi--hapi

HTTP Server framework for Node.js with built-in authentication, validation, caching, logging, and plugin architecture

Pending
Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

SecuritybySnyk

Pending

The risk profile of this skill

Overview
Eval results
Files

@hapi/hapi

@hapi/hapi is a comprehensive HTTP server framework for Node.js that enables developers to build powerful, scalable web applications and APIs with minimal overhead and full out-of-the-box functionality. It offers a rich set of features including built-in authentication, input validation, caching, logging, error handling, and plugin architecture, with extensive support for routing, request/response lifecycle management, security features like CORS and CSRF protection, and performance optimizations.

Package Information

  • Package Name: @hapi/hapi
  • Package Type: npm
  • Language: JavaScript
  • Installation: npm install @hapi/hapi

Core Imports

const Hapi = require('@hapi/hapi');

ESM (ES6 modules):

import Hapi from '@hapi/hapi';

Basic Usage

const Hapi = require('@hapi/hapi');

const init = async () => {
    // Create server instance
    const server = Hapi.server({
        port: 3000,
        host: 'localhost'
    });

    // Add a route
    server.route({
        method: 'GET',
        path: '/',
        handler: (request, h) => {
            return 'Hello World!';
        }
    });

    // Start the server
    await server.start();
    console.log('Server running on %s', server.info.uri);
};

init();

Architecture

@hapi/hapi is built around several key components:

  • Server: Central application container managing connections and lifecycle
  • Request/Response: Rich objects representing HTTP request/response with extensive properties and methods
  • Routing: Declarative route configuration with advanced path matching and parameter extraction
  • Authentication: Pluggable authentication schemes and strategies
  • Extensions: Lifecycle hooks for request processing pipeline
  • Plugins: Modular architecture for extending functionality
  • Toolkit (h): Response utility object passed to handlers and extensions
  • Caching: Built-in caching with multiple backend support
  • Validation: Input validation and schema enforcement

Capabilities

Server Management

Core server creation, configuration, and lifecycle management. Essential for setting up and controlling HTTP servers.

function server(options?: ServerOptions): Server;

interface ServerOptions {
    address?: string;
    app?: object;
    autoListen?: boolean;
    cache?: CacheOptions | CacheOptions[];
    compression?: CompressionOptions | false;
    debug?: DebugOptions | false;
    host?: string;
    info?: { remote?: boolean };
    listener?: object;
    load?: LoadOptions;
    mime?: MimeOptions;
    operations?: OperationsOptions;
    plugins?: object;
    port?: number | string;
    query?: QueryOptions;
    router?: RouterOptions;
    routes?: RouteOptions;
    state?: StateOptions;
    tls?: object | boolean;
    uri?: string;
}

Server Management

Routing

Powerful routing system with pattern matching, parameter extraction, and route-specific configuration options.

interface RouteConfiguration {
    method: string | string[];
    path: string;
    handler: RouteHandler | object;
    options?: RouteOptions;
}

type RouteHandler = (request: Request, h: ResponseToolkit) => any;

Routing

Request Processing

Rich request object with parsed headers, payload, query parameters, and extensive metadata for handling HTTP requests.

interface Request {
    app: object;
    auth: AuthInfo;
    events: Events;
    headers: { [key: string]: string };
    info: RequestInfo;
    method: string;
    params: { [key: string]: string };
    path: string;
    payload: any;
    query: { [key: string]: string };
    response: Response;
    route: RouteInfo;
    server: Server;
    state: { [key: string]: any };
}

Request Processing

Response Management

Comprehensive response object with methods for setting headers, status codes, content type, caching, and state management.

interface Response {
    statusCode: number;
    headers: { [key: string]: string };
    source: any;
    variety: string;
    app: object;
    plugins: object;
    settings: ResponseSettings;
}

Response Management

Authentication

Pluggable authentication system supporting multiple schemes and strategies with built-in session management.

interface AuthAPI {
    scheme(name: string, scheme: AuthScheme): void;
    strategy(name: string, scheme: string, options?: object): void;
    default(options: AuthOptions): void;
    test(name: string, request: Request): Promise<AuthTestResult>;
}

Authentication

Extensions

Lifecycle hooks for intercepting and modifying request processing at various stages of the pipeline.

interface ExtensionPoint {
    method: ExtensionMethod;
    options?: ExtensionOptions;
}

type ExtensionMethod = (request: Request, h: ResponseToolkit) => any;

type ExtensionEvent = 'onRequest' | 'onPreAuth' | 'onCredentials' | 
    'onPostAuth' | 'onPreHandler' | 'onPostHandler' | 
    'onPreResponse' | 'onPostResponse';

Extensions

Plugin System

Modular plugin architecture for extending server functionality with dependency management and isolation.

interface PluginObject {
    name: string;
    version?: string;
    register: PluginRegister;
    requirements?: PluginRequirements;
    dependencies?: string | string[];
    once?: boolean;
}

type PluginRegister = (server: Server, options: object) => Promise<void> | void;

Plugin System

Caching

Built-in caching system with support for multiple backends and policies for server methods and general purpose caching.

interface CacheAPI {
    cache(options: CachePolicyOptions): CachePolicy;
    provision(options: CacheProvisionOptions): Promise<void>;
}

Caching

Validation

Input validation system with support for Joi and other validation libraries for request payload, query parameters, and headers.

interface ValidationOptions {
    payload?: object;
    query?: object;
    params?: object;
    headers?: object;
    state?: object;
    failAction?: ValidationFailAction;
    options?: object;
}

Validation

Server Events

Server event system providing lifecycle hooks and logging capabilities.

interface Events {
    on(event: string, listener: Function): void;
    once(event: string, listener: Function): void;
    emit(event: string, ...args: any[]): boolean;
    removeListener(event: string, listener: Function): void;
}

type ServerEvent = 'log' | 'start' | 'stop' | 'closing' | 'route' | 'cachePolicy' | 'request' | 'response';

Server Events:

  • 'log' - Server log events with tags and data
  • 'start' - Server started successfully
  • 'stop' - Server stopped completely
  • 'closing' - Server closing (before connections close)
  • 'route' - Route added to server
  • 'cachePolicy' - Cache policy created
  • 'request' - Request lifecycle events (internal/app/error channels)
  • 'response' - Response sent events

Usage Examples:

const server = Hapi.server({ port: 3000 });

// Listen to server events
server.events.on('log', (event, tags) => {
    if (tags.error) {
        console.error('Server error:', event.error);
    } else if (tags.info) {
        console.log('Server info:', event.data);
    }
});

server.events.on('start', () => {
    console.log('Server started at:', server.info.uri);
});

server.events.on('stop', () => {
    console.log('Server stopped');
});

server.events.on('request', (request, event, tags) => {
    if (tags.error) {
        console.error(`Request ${request.info.id} error:`, event.error);
    }
});

server.events.on('response', (request) => {
    console.log(`${request.method.toUpperCase()} ${request.path} -> ${request.response.statusCode}`);
});

Types

interface Server {
    // Properties
    app: object;
    auth: AuthAPI;
    cache: CacheAPI;
    decorations: Decorations;
    events: Events;
    info: ServerInfo;
    listener: object;
    load: LoadMetrics;
    methods: object;
    mime: MimeDatabase;
    plugins: object;
    registrations: object;
    settings: ServerOptions;
    states: StateManager;
    type: string;
    version: string;
    realm: Realm;

    // Methods
    bind(context: object): void;
    control(server: Server): void;
    decorate(type: string, property: string, method: any, options?: object): void;
    dependency(dependencies: string | string[], after?: Function): void;
    encoder(encoding: string, encoder: Function): void;
    decoder(encoding: string, decoder: Function): void;
    event(event: object): void;
    expose(key: string | object, value?: any, options?: object): void;
    ext(events: string | string[] | ExtensionPoint[], method?: Function, options?: object): void;
    initialize(): Promise<void>;
    inject(options: string | InjectOptions): Promise<InjectResponse>;
    log(tags: string | string[], data?: any): void;
    lookup(id: string): RoutePublic | null;
    match(method: string, path: string, host?: string): RoutePublic | null;
    method(name: string | MethodObject[], method?: Function, options?: object): void;
    path(relativeTo: string): void;
    register(plugins: PluginObject | PluginObject[], options?: object): Promise<void>;
    route(route: RouteConfiguration | RouteConfiguration[]): void;
    rules(processor: Function, options?: object): void;
    start(): Promise<void>;
    state(name: string, options?: StateDefinitionOptions): void;
    stop(options?: object): Promise<void>;
    table(host?: string): RoutePublic[];
    validator(validator: object): void;
}

interface ResponseToolkit {
    abandon: symbol;
    close: symbol;
    continue: symbol;
    context: object;
    realm: Realm;
    request: Request;

    authenticated(data: AuthCredentials): object;
    entity(options?: EntityOptions): ResponseObject | symbol;
    redirect(uri?: string): ResponseObject;
    response(value?: any): ResponseObject;
    state(name: string, value: any, options?: StateUpdateOptions): void;
    unauthenticated(error: Error, data?: AuthCredentials): object;
    unstate(name: string, options?: StateUpdateOptions): void;
}

interface LoadMetrics {
    /** Current event loop delay in milliseconds */
    eventLoopDelay: number;
    /** Current heap usage in bytes */
    heapUsed: number;
    /** Current RSS memory usage in bytes */
    rss: number;
}

interface Decorations {
    /** Server decorations */
    server: Map<string, any>;
    /** Request decorations */
    request: Map<string, any>;
    /** Response toolkit decorations */
    toolkit: Map<string, any>;
}

interface MimeDatabase {
    /** Get MIME type for file path */
    path(path: string): MimeEntry;
    /** Get MIME type for extension */
    type(type: string): MimeEntry;
}

interface MimeEntry {
    /** MIME type */
    type: string;
    /** Character set */
    charset?: string;
    /** Whether the type is compressible */
    compressible: boolean;
}

interface StateManager {
    /** Add state configuration */
    add(name: string, options?: StateDefinitionOptions): void;
    /** Format cookies for Set-Cookie header */
    format(cookies: object): string;
    /** Parse cookies from Cookie header */
    parse(header: string): object;
    /** State configurations */
    settings: object;
    /** Cookie definitions */
    cookies: object;
    /** Cookie names */
    names: string[];
}

interface InjectOptions {
    /** HTTP method */
    method?: string;
    /** Request URL */
    url: string;
    /** Request headers */
    headers?: { [key: string]: string };
    /** Request payload */
    payload?: any;
    /** Authentication credentials */
    credentials?: object;
    /** Inject into specific server */
    authority?: string;
    /** Whether to process as remote request */
    remoteAddress?: string;
    /** Simulate connection info */
    simulate?: {
        end?: boolean;
        split?: boolean;
        error?: boolean;
        close?: boolean;
    };
    /** Request validation options */
    validate?: boolean;
}

interface InjectResponse {
    /** Response status code */
    statusCode: number;
    /** Response headers */
    headers: { [key: string]: string };
    /** Response payload */
    payload: string;
    /** Raw response payload */
    rawPayload: Buffer;
    /** Raw request object */
    raw: {
        req: object;
        res: object;
    };
    /** Response result object */
    result: any;
    /** Request object */
    request: Request;
}

interface MethodObject {
    /** Method name */
    name: string;
    /** Method function */
    method: Function;
    /** Method options */
    options?: object;
}

interface StateDefinitionOptions {
    /** Cookie time-to-live in milliseconds */
    ttl?: number;
    /** Whether cookie is HTTP-only */
    isHttpOnly?: boolean;
    /** Whether cookie is secure */
    isSecure?: boolean;
    /** SameSite attribute */
    isSameSite?: 'Strict' | 'Lax' | 'None' | false;
    /** Cookie path */
    path?: string;
    /** Cookie domain */
    domain?: string;
    /** Cookie encoding type */
    encoding?: 'none' | 'base64' | 'base64json' | 'form' | 'iron';
    /** Iron password for encryption */
    password?: string | object;
    /** Default value */
    clearInvalid?: boolean;
    /** Ignore errors when parsing */
    ignoreErrors?: boolean;
    /** Whether cookie applies to same site */
    strictHeader?: boolean;
    /** Fail action for parsing errors */
    failAction?: 'error' | 'log' | 'ignore';
    /** Cookie signing options */
    sign?: {
        password: string | object;
        integrity?: object;
    };
}
Workspace
tessl
Visibility
Public
Created
Last updated
Describes
npmpkg:npm/@hapi/hapi@20.3.x
Publish Source
CLI
Badge
tessl/npm-hapi--hapi badge