npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@byteshift/http

v0.0.1

Published

An HTTP-server micro-framework

Downloads

1

Readme

Byteshift HTTP is a tiny but complete HTTP server library designed to be used with TypeScript in a NodeJS application.

Getting started

Install @byteshift/http using NPM:

$ npm i @byteshift/http

... or yarn:

$ yarn add @byteshift/http

Setting up the server

import {Server} from '@byteshift/http';

const server = new Server({
    port: 8080,
    useHttps: false
});

server.start();

Navigate to http://localhost:8080 and you should see a "404 Not Found" message.

Using HTTPS

You can set-up an HTTPS-server by setting useHttps to true and providing SSL options using the sslOptions object. The contents of this object are directly passed to Node's https.createServer() method, allowing you to specify SSL-certificate configuration.

import {Server} from '@byteshift/http';

const server = new Server({
    port: 8080,
    useHttps: true,
    
    sslOptions: {
        cert: 'cert-file-contents-here',
        key: 'private-key-file-contents-here',
        ca: 'ca-file-contents-here'
    }
});

Please refer to https://nodejs.org/api/https.html#https_https_createserver_options_requestlistener for all available options.

Writing and registering a controller

Byteshift-HTTP uses controller classes with configured routes to invoke methods. Annotate a method using the @Route decorator to let the library know that method should be invoked if the configured route matches an incoming request.

For example: @Route("/", {method: 'GET'}) will match any 'root' route as long as the request method is 'GET'.

// HomeController.ts
import {Response, Route} from '@byteshift/http';

export class HomeController
{
    @Route("/", {method: 'GET'})
    public indexAction(): Response
    {
        return new Response('Hello World!');
    }
    
}
// app.ts
const server = new Server({
    port: 8080,
    useHttps: false
});


// Register our controller here.
server.registerController(HomeController);

// Start the server.
server.start();

Controller-as-a-Service

As you might have guessed from the previous example, when registering a controller class, you don't instantiate it with the new keyword. This is a deliberate design choice to allow the use of service containers.

A service container must implement IServiceContainer which contains a simple get(ctor: new (...args: any[]) => any): any method. You can configure the reference to a service container by passing the serviceContainer option to the options object when constructing the Server.

If you omit this configuration, the controller is re-instantiated on every request to ensure it remains stateless for a single client.

Using the @byteshift/injector package as a service container library, the configuration would look like this:

// app.ts
import {Server}      from '@byteshift/http';
import {ServiceHost} from '@byteshift/injector';

const server = new Server({
    port: 8080,
    useHttps: false,
    serviceContainer: ServiceHost
});

server.registerController(HomeController);
server.start();
// HomeController.ts
import {Service} from '@byteshift/injector';

@Service
export class HomeController
{
    @Inject private readonly someApi: SomeRandomApi;
    
    // ... methods here
    @Route("/user/:username", {method: 'GET'})
    public async userAction(username: string): Promise<JsonResponse>
    {
        const profile = await this.someApi.fetchUser(username);
        
        return new JsonResponse({ profile });
    }
    
}